python-sse-starlette-2.3.4/0000775000175000017500000000000015005737564015464 5ustar katharakatharapython-sse-starlette-2.3.4/.codecov.yml0000664000175000017500000000020315005737564017702 0ustar katharakatharacoverage: precision: 2 round: down range: "80...100" status: project: yes patch: no changes: no comment: off python-sse-starlette-2.3.4/Dockerfile0000664000175000017500000000165715005737564017467 0ustar katharakathara# Use Python 3.12 slim as base image FROM python:3.12-slim # Set working directory WORKDIR /app # Install build dependencies and cleanup in one layer to keep image size down RUN apt-get update && apt-get install -y \ build-essential \ && rm -rf /var/lib/apt/lists/* # Copy only pyproject.toml and other build files first COPY pyproject.toml ./ COPY README.md ./ COPY sse_starlette ./sse_starlette # Install package with all dependencies RUN pip install --no-cache-dir -e . # Install additional test dependencies if needed # You can also add these to pyproject.toml in [project.optional-dependencies] RUN pip install --no-cache-dir pytest pytest-asyncio httpx # Copy test files COPY tests ./tests # Expose port EXPOSE 8000 # Set Python path ENV PYTHONPATH=/app # Default command - this can be overridden by testcontainers CMD ["uvicorn", "tests.integration.main_endless_conditional:app", "--host", "0.0.0.0", "--port", "8000"] python-sse-starlette-2.3.4/.gitignore0000664000175000017500000000023315005737564017452 0ustar katharakathara.tox/ report.xml coverage.xml dist/ tags .idea/ *.pyc .coverage .pytest_cache/ .mypy_cache/ *.egg-info/ __pycache__/ venv/ Pipfile.lock .envrc .pdm-python python-sse-starlette-2.3.4/uv.lock0000664000175000017500000041722715005737564017005 0ustar katharakatharaversion = 1 requires-python = ">=3.9" [[package]] name = "annotated-types" version = "0.7.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } wheels = [ { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, ] [[package]] name = "anyio" version = "4.7.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, { name = "idna" }, { name = "sniffio" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f6/40/318e58f669b1a9e00f5c4453910682e2d9dd594334539c7b7817dabb765f/anyio-4.7.0.tar.gz", hash = "sha256:2f834749c602966b7d456a7567cafcb309f96482b5081d14ac93ccd457f9dd48", size = 177076 } wheels = [ { url = "https://files.pythonhosted.org/packages/a0/7a/4daaf3b6c08ad7ceffea4634ec206faeff697526421c20f07628c7372156/anyio-4.7.0-py3-none-any.whl", hash = "sha256:ea60c3723ab42ba6fff7e8ccb0488c898ec538ff4df1f1d5e642c3601d07e352", size = 93052 }, ] [[package]] name = "asgi-lifespan" version = "2.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sniffio" }, ] sdist = { url = "https://files.pythonhosted.org/packages/6a/da/e7908b54e0f8043725a990bf625f2041ecf6bfe8eb7b19407f1c00b630f7/asgi-lifespan-2.1.0.tar.gz", hash = "sha256:5e2effaf0bfe39829cf2d64e7ecc47c7d86d676a6599f7afba378c31f5e3a308", size = 15627 } wheels = [ { url = "https://files.pythonhosted.org/packages/2f/f5/c36551e93acba41a59939ae6a0fb77ddb3f2e8e8caa716410c65f7341f72/asgi_lifespan-2.1.0-py3-none-any.whl", hash = "sha256:ed840706680e28428c01e14afb3875d7d76d3206f3d5b2f2294e059b5c23804f", size = 10895 }, ] [[package]] name = "async-timeout" version = "5.0.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/a5/ae/136395dfbfe00dfc94da3f3e136d0b13f394cba8f4841120e34226265780/async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3", size = 9274 } wheels = [ { url = "https://files.pythonhosted.org/packages/fe/ba/e2081de779ca30d473f21f5b30e0e737c438205440784c7dfc81efc2b029/async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c", size = 6233 }, ] [[package]] name = "build" version = "1.2.2.post1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "os_name == 'nt'" }, { name = "importlib-metadata", marker = "python_full_version < '3.10.2'" }, { name = "packaging" }, { name = "pyproject-hooks" }, { name = "tomli", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/7d/46/aeab111f8e06793e4f0e421fcad593d547fb8313b50990f31681ee2fb1ad/build-1.2.2.post1.tar.gz", hash = "sha256:b36993e92ca9375a219c99e606a122ff365a760a2d4bba0caa09bd5278b608b7", size = 46701 } wheels = [ { url = "https://files.pythonhosted.org/packages/84/c2/80633736cd183ee4a62107413def345f7e6e3c01563dbca1417363cf957e/build-1.2.2.post1-py3-none-any.whl", hash = "sha256:1d61c0887fa860c01971625baae8bdd338e517b836a2f70dd1f7aa3a6b2fc5b5", size = 22950 }, ] [[package]] name = "certifi" version = "2024.12.14" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/0f/bd/1d41ee578ce09523c81a15426705dd20969f5abf006d1afe8aeff0dd776a/certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db", size = 166010 } wheels = [ { url = "https://files.pythonhosted.org/packages/a5/32/8f6669fc4798494966bf446c8c4a162e0b5d893dff088afddf76414f70e1/certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56", size = 164927 }, ] [[package]] name = "charset-normalizer" version = "3.4.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/f2/4f/e1808dc01273379acc506d18f1504eb2d299bd4131743b9fc54d7be4df1e/charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e", size = 106620 } wheels = [ { url = "https://files.pythonhosted.org/packages/69/8b/825cc84cf13a28bfbcba7c416ec22bf85a9584971be15b21dd8300c65b7f/charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6", size = 196363 }, { url = "https://files.pythonhosted.org/packages/23/81/d7eef6a99e42c77f444fdd7bc894b0ceca6c3a95c51239e74a722039521c/charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b", size = 125639 }, { url = "https://files.pythonhosted.org/packages/21/67/b4564d81f48042f520c948abac7079356e94b30cb8ffb22e747532cf469d/charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99", size = 120451 }, { url = "https://files.pythonhosted.org/packages/c2/72/12a7f0943dd71fb5b4e7b55c41327ac0a1663046a868ee4d0d8e9c369b85/charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca", size = 140041 }, { url = "https://files.pythonhosted.org/packages/67/56/fa28c2c3e31217c4c52158537a2cf5d98a6c1e89d31faf476c89391cd16b/charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d", size = 150333 }, { url = "https://files.pythonhosted.org/packages/f9/d2/466a9be1f32d89eb1554cf84073a5ed9262047acee1ab39cbaefc19635d2/charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7", size = 142921 }, { url = "https://files.pythonhosted.org/packages/f8/01/344ec40cf5d85c1da3c1f57566c59e0c9b56bcc5566c08804a95a6cc8257/charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3", size = 144785 }, { url = "https://files.pythonhosted.org/packages/73/8b/2102692cb6d7e9f03b9a33a710e0164cadfce312872e3efc7cfe22ed26b4/charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907", size = 146631 }, { url = "https://files.pythonhosted.org/packages/d8/96/cc2c1b5d994119ce9f088a9a0c3ebd489d360a2eb058e2c8049f27092847/charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b", size = 140867 }, { url = "https://files.pythonhosted.org/packages/c9/27/cde291783715b8ec30a61c810d0120411844bc4c23b50189b81188b273db/charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912", size = 149273 }, { url = "https://files.pythonhosted.org/packages/3a/a4/8633b0fc1a2d1834d5393dafecce4a1cc56727bfd82b4dc18fc92f0d3cc3/charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95", size = 152437 }, { url = "https://files.pythonhosted.org/packages/64/ea/69af161062166b5975ccbb0961fd2384853190c70786f288684490913bf5/charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e", size = 150087 }, { url = "https://files.pythonhosted.org/packages/3b/fd/e60a9d9fd967f4ad5a92810138192f825d77b4fa2a557990fd575a47695b/charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe", size = 145142 }, { url = "https://files.pythonhosted.org/packages/6d/02/8cb0988a1e49ac9ce2eed1e07b77ff118f2923e9ebd0ede41ba85f2dcb04/charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc", size = 94701 }, { url = "https://files.pythonhosted.org/packages/d6/20/f1d4670a8a723c46be695dff449d86d6092916f9e99c53051954ee33a1bc/charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749", size = 102191 }, { url = "https://files.pythonhosted.org/packages/9c/61/73589dcc7a719582bf56aae309b6103d2762b526bffe189d635a7fcfd998/charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c", size = 193339 }, { url = "https://files.pythonhosted.org/packages/77/d5/8c982d58144de49f59571f940e329ad6e8615e1e82ef84584c5eeb5e1d72/charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944", size = 124366 }, { url = "https://files.pythonhosted.org/packages/bf/19/411a64f01ee971bed3231111b69eb56f9331a769072de479eae7de52296d/charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee", size = 118874 }, { url = "https://files.pythonhosted.org/packages/4c/92/97509850f0d00e9f14a46bc751daabd0ad7765cff29cdfb66c68b6dad57f/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c", size = 138243 }, { url = "https://files.pythonhosted.org/packages/e2/29/d227805bff72ed6d6cb1ce08eec707f7cfbd9868044893617eb331f16295/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6", size = 148676 }, { url = "https://files.pythonhosted.org/packages/13/bc/87c2c9f2c144bedfa62f894c3007cd4530ba4b5351acb10dc786428a50f0/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea", size = 141289 }, { url = "https://files.pythonhosted.org/packages/eb/5b/6f10bad0f6461fa272bfbbdf5d0023b5fb9bc6217c92bf068fa5a99820f5/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc", size = 142585 }, { url = "https://files.pythonhosted.org/packages/3b/a0/a68980ab8a1f45a36d9745d35049c1af57d27255eff8c907e3add84cf68f/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5", size = 144408 }, { url = "https://files.pythonhosted.org/packages/d7/a1/493919799446464ed0299c8eef3c3fad0daf1c3cd48bff9263c731b0d9e2/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594", size = 139076 }, { url = "https://files.pythonhosted.org/packages/fb/9d/9c13753a5a6e0db4a0a6edb1cef7aee39859177b64e1a1e748a6e3ba62c2/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c", size = 146874 }, { url = "https://files.pythonhosted.org/packages/75/d2/0ab54463d3410709c09266dfb416d032a08f97fd7d60e94b8c6ef54ae14b/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365", size = 150871 }, { url = "https://files.pythonhosted.org/packages/8d/c9/27e41d481557be53d51e60750b85aa40eaf52b841946b3cdeff363105737/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129", size = 148546 }, { url = "https://files.pythonhosted.org/packages/ee/44/4f62042ca8cdc0cabf87c0fc00ae27cd8b53ab68be3605ba6d071f742ad3/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236", size = 143048 }, { url = "https://files.pythonhosted.org/packages/01/f8/38842422988b795220eb8038745d27a675ce066e2ada79516c118f291f07/charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99", size = 94389 }, { url = "https://files.pythonhosted.org/packages/0b/6e/b13bd47fa9023b3699e94abf565b5a2f0b0be6e9ddac9812182596ee62e4/charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27", size = 101752 }, { url = "https://files.pythonhosted.org/packages/d3/0b/4b7a70987abf9b8196845806198975b6aab4ce016632f817ad758a5aa056/charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6", size = 194445 }, { url = "https://files.pythonhosted.org/packages/50/89/354cc56cf4dd2449715bc9a0f54f3aef3dc700d2d62d1fa5bbea53b13426/charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf", size = 125275 }, { url = "https://files.pythonhosted.org/packages/fa/44/b730e2a2580110ced837ac083d8ad222343c96bb6b66e9e4e706e4d0b6df/charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db", size = 119020 }, { url = "https://files.pythonhosted.org/packages/9d/e4/9263b8240ed9472a2ae7ddc3e516e71ef46617fe40eaa51221ccd4ad9a27/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1", size = 139128 }, { url = "https://files.pythonhosted.org/packages/6b/e3/9f73e779315a54334240353eaea75854a9a690f3f580e4bd85d977cb2204/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03", size = 149277 }, { url = "https://files.pythonhosted.org/packages/1a/cf/f1f50c2f295312edb8a548d3fa56a5c923b146cd3f24114d5adb7e7be558/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284", size = 142174 }, { url = "https://files.pythonhosted.org/packages/16/92/92a76dc2ff3a12e69ba94e7e05168d37d0345fa08c87e1fe24d0c2a42223/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15", size = 143838 }, { url = "https://files.pythonhosted.org/packages/a4/01/2117ff2b1dfc61695daf2babe4a874bca328489afa85952440b59819e9d7/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8", size = 146149 }, { url = "https://files.pythonhosted.org/packages/f6/9b/93a332b8d25b347f6839ca0a61b7f0287b0930216994e8bf67a75d050255/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2", size = 140043 }, { url = "https://files.pythonhosted.org/packages/ab/f6/7ac4a01adcdecbc7a7587767c776d53d369b8b971382b91211489535acf0/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719", size = 148229 }, { url = "https://files.pythonhosted.org/packages/9d/be/5708ad18161dee7dc6a0f7e6cf3a88ea6279c3e8484844c0590e50e803ef/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631", size = 151556 }, { url = "https://files.pythonhosted.org/packages/5a/bb/3d8bc22bacb9eb89785e83e6723f9888265f3a0de3b9ce724d66bd49884e/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b", size = 149772 }, { url = "https://files.pythonhosted.org/packages/f7/fa/d3fc622de05a86f30beea5fc4e9ac46aead4731e73fd9055496732bcc0a4/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565", size = 144800 }, { url = "https://files.pythonhosted.org/packages/9a/65/bdb9bc496d7d190d725e96816e20e2ae3a6fa42a5cac99c3c3d6ff884118/charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7", size = 94836 }, { url = "https://files.pythonhosted.org/packages/3e/67/7b72b69d25b89c0b3cea583ee372c43aa24df15f0e0f8d3982c57804984b/charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9", size = 102187 }, { url = "https://files.pythonhosted.org/packages/f3/89/68a4c86f1a0002810a27f12e9a7b22feb198c59b2f05231349fbce5c06f4/charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114", size = 194617 }, { url = "https://files.pythonhosted.org/packages/4f/cd/8947fe425e2ab0aa57aceb7807af13a0e4162cd21eee42ef5b053447edf5/charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed", size = 125310 }, { url = "https://files.pythonhosted.org/packages/5b/f0/b5263e8668a4ee9becc2b451ed909e9c27058337fda5b8c49588183c267a/charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250", size = 119126 }, { url = "https://files.pythonhosted.org/packages/ff/6e/e445afe4f7fda27a533f3234b627b3e515a1b9429bc981c9a5e2aa5d97b6/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920", size = 139342 }, { url = "https://files.pythonhosted.org/packages/a1/b2/4af9993b532d93270538ad4926c8e37dc29f2111c36f9c629840c57cd9b3/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64", size = 149383 }, { url = "https://files.pythonhosted.org/packages/fb/6f/4e78c3b97686b871db9be6f31d64e9264e889f8c9d7ab33c771f847f79b7/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23", size = 142214 }, { url = "https://files.pythonhosted.org/packages/2b/c9/1c8fe3ce05d30c87eff498592c89015b19fade13df42850aafae09e94f35/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc", size = 144104 }, { url = "https://files.pythonhosted.org/packages/ee/68/efad5dcb306bf37db7db338338e7bb8ebd8cf38ee5bbd5ceaaaa46f257e6/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d", size = 146255 }, { url = "https://files.pythonhosted.org/packages/0c/75/1ed813c3ffd200b1f3e71121c95da3f79e6d2a96120163443b3ad1057505/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88", size = 140251 }, { url = "https://files.pythonhosted.org/packages/7d/0d/6f32255c1979653b448d3c709583557a4d24ff97ac4f3a5be156b2e6a210/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90", size = 148474 }, { url = "https://files.pythonhosted.org/packages/ac/a0/c1b5298de4670d997101fef95b97ac440e8c8d8b4efa5a4d1ef44af82f0d/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b", size = 151849 }, { url = "https://files.pythonhosted.org/packages/04/4f/b3961ba0c664989ba63e30595a3ed0875d6790ff26671e2aae2fdc28a399/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d", size = 149781 }, { url = "https://files.pythonhosted.org/packages/d8/90/6af4cd042066a4adad58ae25648a12c09c879efa4849c705719ba1b23d8c/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482", size = 144970 }, { url = "https://files.pythonhosted.org/packages/cc/67/e5e7e0cbfefc4ca79025238b43cdf8a2037854195b37d6417f3d0895c4c2/charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67", size = 94973 }, { url = "https://files.pythonhosted.org/packages/65/97/fc9bbc54ee13d33dc54a7fcf17b26368b18505500fc01e228c27b5222d80/charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b", size = 102308 }, { url = "https://files.pythonhosted.org/packages/54/2f/28659eee7f5d003e0f5a3b572765bf76d6e0fe6601ab1f1b1dd4cba7e4f1/charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa", size = 196326 }, { url = "https://files.pythonhosted.org/packages/d1/18/92869d5c0057baa973a3ee2af71573be7b084b3c3d428fe6463ce71167f8/charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a", size = 125614 }, { url = "https://files.pythonhosted.org/packages/d6/27/327904c5a54a7796bb9f36810ec4173d2df5d88b401d2b95ef53111d214e/charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0", size = 120450 }, { url = "https://files.pythonhosted.org/packages/a4/23/65af317914a0308495133b2d654cf67b11bbd6ca16637c4e8a38f80a5a69/charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a", size = 140135 }, { url = "https://files.pythonhosted.org/packages/f2/41/6190102ad521a8aa888519bb014a74251ac4586cde9b38e790901684f9ab/charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242", size = 150413 }, { url = "https://files.pythonhosted.org/packages/7b/ab/f47b0159a69eab9bd915591106859f49670c75f9a19082505ff16f50efc0/charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b", size = 142992 }, { url = "https://files.pythonhosted.org/packages/28/89/60f51ad71f63aaaa7e51a2a2ad37919985a341a1d267070f212cdf6c2d22/charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62", size = 144871 }, { url = "https://files.pythonhosted.org/packages/0c/48/0050550275fea585a6e24460b42465020b53375017d8596c96be57bfabca/charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0", size = 146756 }, { url = "https://files.pythonhosted.org/packages/dc/b5/47f8ee91455946f745e6c9ddbb0f8f50314d2416dd922b213e7d5551ad09/charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd", size = 141034 }, { url = "https://files.pythonhosted.org/packages/84/79/5c731059ebab43e80bf61fa51666b9b18167974b82004f18c76378ed31a3/charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be", size = 149434 }, { url = "https://files.pythonhosted.org/packages/ca/f3/0719cd09fc4dc42066f239cb3c48ced17fc3316afca3e2a30a4756fe49ab/charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d", size = 152443 }, { url = "https://files.pythonhosted.org/packages/f7/0e/c6357297f1157c8e8227ff337e93fd0a90e498e3d6ab96b2782204ecae48/charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3", size = 150294 }, { url = "https://files.pythonhosted.org/packages/54/9a/acfa96dc4ea8c928040b15822b59d0863d6e1757fba8bd7de3dc4f761c13/charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742", size = 145314 }, { url = "https://files.pythonhosted.org/packages/73/1c/b10a63032eaebb8d7bcb8544f12f063f41f5f463778ac61da15d9985e8b6/charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2", size = 94724 }, { url = "https://files.pythonhosted.org/packages/c5/77/3a78bf28bfaa0863f9cfef278dbeadf55efe064eafff8c7c424ae3c4c1bf/charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca", size = 102159 }, { url = "https://files.pythonhosted.org/packages/bf/9b/08c0432272d77b04803958a4598a51e2a4b51c06640af8b8f0f908c18bf2/charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079", size = 49446 }, ] [[package]] name = "click" version = "8.1.7" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "platform_system == 'Windows'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/96/d3/f04c7bfcf5c1862a2a5b845c6b2b360488cf47af55dfa79c98f6a6bf98b5/click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de", size = 336121 } wheels = [ { url = "https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", size = 97941 }, ] [[package]] name = "codecov" version = "2.1.13" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "coverage" }, { name = "requests" }, ] sdist = { url = "https://files.pythonhosted.org/packages/2c/bb/594b26d2c85616be6195a64289c578662678afa4910cef2d3ce8417cf73e/codecov-2.1.13.tar.gz", hash = "sha256:2362b685633caeaf45b9951a9b76ce359cd3581dd515b430c6c3f5dfb4d92a8c", size = 21416 } wheels = [ { url = "https://files.pythonhosted.org/packages/af/02/18785edcdf6266cdd6c6dc7635f1cbeefd9a5b4c3bb8aff8bd681e9dd095/codecov-2.1.13-py2.py3-none-any.whl", hash = "sha256:c2ca5e51bba9ebb43644c43d0690148a55086f7f5e6fd36170858fa4206744d5", size = 16512 }, ] [[package]] name = "colorama" version = "0.4.6" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } wheels = [ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, ] [[package]] name = "coverage" version = "7.6.9" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/5b/d2/c25011f4d036cf7e8acbbee07a8e09e9018390aee25ba085596c4b83d510/coverage-7.6.9.tar.gz", hash = "sha256:4a8d8977b0c6ef5aeadcb644da9e69ae0dcfe66ec7f368c89c72e058bd71164d", size = 801710 } wheels = [ { url = "https://files.pythonhosted.org/packages/49/f3/f830fb53bf7e4f1d5542756f61d9b740352a188f43854aab9409c8cdeb18/coverage-7.6.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:85d9636f72e8991a1706b2b55b06c27545448baf9f6dbf51c4004609aacd7dcb", size = 207024 }, { url = "https://files.pythonhosted.org/packages/4e/e3/ea5632a3a6efd00ab0a791adc0f3e48512097a757ee7dcbee5505f57bafa/coverage-7.6.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:608a7fd78c67bee8936378299a6cb9f5149bb80238c7a566fc3e6717a4e68710", size = 207463 }, { url = "https://files.pythonhosted.org/packages/e4/ae/18ff8b5580e27e62ebcc888082aa47694c2772782ea7011ddf58e377e98f/coverage-7.6.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96d636c77af18b5cb664ddf12dab9b15a0cfe9c0bde715da38698c8cea748bfa", size = 235902 }, { url = "https://files.pythonhosted.org/packages/6a/52/57030a8d15ab935624d298360f0a6704885578e39f7b4f68569e59f5902d/coverage-7.6.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75cded8a3cff93da9edc31446872d2997e327921d8eed86641efafd350e1df1", size = 233806 }, { url = "https://files.pythonhosted.org/packages/d0/c5/4466602195ecaced298d55af1e29abceb812addabefd5bd9116a204f7bab/coverage-7.6.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7b15f589593110ae767ce997775d645b47e5cbbf54fd322f8ebea6277466cec", size = 234966 }, { url = "https://files.pythonhosted.org/packages/b0/1c/55552c3009b7bf96732e36548596ade771c87f89cf1f5a8e3975b33539b5/coverage-7.6.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:44349150f6811b44b25574839b39ae35291f6496eb795b7366fef3bd3cf112d3", size = 234029 }, { url = "https://files.pythonhosted.org/packages/bb/7d/da3dca6878701182ea42c51df47a47c80eaef2a76f5aa3e891dc2a8cce3f/coverage-7.6.9-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d891c136b5b310d0e702e186d70cd16d1119ea8927347045124cb286b29297e5", size = 232494 }, { url = "https://files.pythonhosted.org/packages/28/cc/39de85ac1d5652bc34ff2bee39ae251b1fdcaae53fab4b44cab75a432bc0/coverage-7.6.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:db1dab894cc139f67822a92910466531de5ea6034ddfd2b11c0d4c6257168073", size = 233611 }, { url = "https://files.pythonhosted.org/packages/d1/2b/7eb011a9378911088708f121825a71134d0c15fac96972a0ae7a8f5a4049/coverage-7.6.9-cp310-cp310-win32.whl", hash = "sha256:41ff7b0da5af71a51b53f501a3bac65fb0ec311ebed1632e58fc6107f03b9198", size = 209712 }, { url = "https://files.pythonhosted.org/packages/5b/35/c3f40a2269b416db34ce1dedf682a7132c26f857e33596830fa4deebabf9/coverage-7.6.9-cp310-cp310-win_amd64.whl", hash = "sha256:35371f8438028fdccfaf3570b31d98e8d9eda8bb1d6ab9473f5a390969e98717", size = 210553 }, { url = "https://files.pythonhosted.org/packages/b1/91/b3dc2f7f38b5cca1236ab6bbb03e84046dd887707b4ec1db2baa47493b3b/coverage-7.6.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:932fc826442132dde42ee52cf66d941f581c685a6313feebed358411238f60f9", size = 207133 }, { url = "https://files.pythonhosted.org/packages/0d/2b/53fd6cb34d443429a92b3ec737f4953627e38b3bee2a67a3c03425ba8573/coverage-7.6.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:085161be5f3b30fd9b3e7b9a8c301f935c8313dcf928a07b116324abea2c1c2c", size = 207577 }, { url = "https://files.pythonhosted.org/packages/74/f2/68edb1e6826f980a124f21ea5be0d324180bf11de6fd1defcf9604f76df0/coverage-7.6.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ccc660a77e1c2bf24ddbce969af9447a9474790160cfb23de6be4fa88e3951c7", size = 239524 }, { url = "https://files.pythonhosted.org/packages/d3/83/8fec0ee68c2c4a5ab5f0f8527277f84ed6f2bd1310ae8a19d0c5532253ab/coverage-7.6.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c69e42c892c018cd3c8d90da61d845f50a8243062b19d228189b0224150018a9", size = 236925 }, { url = "https://files.pythonhosted.org/packages/8b/20/8f50e7c7ad271144afbc2c1c6ec5541a8c81773f59352f8db544cad1a0ec/coverage-7.6.9-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0824a28ec542a0be22f60c6ac36d679e0e262e5353203bea81d44ee81fe9c6d4", size = 238792 }, { url = "https://files.pythonhosted.org/packages/6f/62/4ac2e5ad9e7a5c9ec351f38947528e11541f1f00e8a0cdce56f1ba7ae301/coverage-7.6.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4401ae5fc52ad8d26d2a5d8a7428b0f0c72431683f8e63e42e70606374c311a1", size = 237682 }, { url = "https://files.pythonhosted.org/packages/58/2f/9d2203f012f3b0533c73336c74134b608742be1ce475a5c72012573cfbb4/coverage-7.6.9-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:98caba4476a6c8d59ec1eb00c7dd862ba9beca34085642d46ed503cc2d440d4b", size = 236310 }, { url = "https://files.pythonhosted.org/packages/33/6d/31f6ab0b4f0f781636075f757eb02141ea1b34466d9d1526dbc586ed7078/coverage-7.6.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ee5defd1733fd6ec08b168bd4f5387d5b322f45ca9e0e6c817ea6c4cd36313e3", size = 237096 }, { url = "https://files.pythonhosted.org/packages/7d/fb/e14c38adebbda9ed8b5f7f8e03340ac05d68d27b24397f8d47478927a333/coverage-7.6.9-cp311-cp311-win32.whl", hash = "sha256:f2d1ec60d6d256bdf298cb86b78dd715980828f50c46701abc3b0a2b3f8a0dc0", size = 209682 }, { url = "https://files.pythonhosted.org/packages/a4/11/a782af39b019066af83fdc0e8825faaccbe9d7b19a803ddb753114b429cc/coverage-7.6.9-cp311-cp311-win_amd64.whl", hash = "sha256:0d59fd927b1f04de57a2ba0137166d31c1a6dd9e764ad4af552912d70428c92b", size = 210542 }, { url = "https://files.pythonhosted.org/packages/60/52/b16af8989a2daf0f80a88522bd8e8eed90b5fcbdecf02a6888f3e80f6ba7/coverage-7.6.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:99e266ae0b5d15f1ca8d278a668df6f51cc4b854513daab5cae695ed7b721cf8", size = 207325 }, { url = "https://files.pythonhosted.org/packages/0f/79/6b7826fca8846c1216a113227b9f114ac3e6eacf168b4adcad0cb974aaca/coverage-7.6.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9901d36492009a0a9b94b20e52ebfc8453bf49bb2b27bca2c9706f8b4f5a554a", size = 207563 }, { url = "https://files.pythonhosted.org/packages/a7/07/0bc73da0ccaf45d0d64ef86d33b7d7fdeef84b4c44bf6b85fb12c215c5a6/coverage-7.6.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abd3e72dd5b97e3af4246cdada7738ef0e608168de952b837b8dd7e90341f015", size = 240580 }, { url = "https://files.pythonhosted.org/packages/71/8a/9761f409910961647d892454687cedbaccb99aae828f49486734a82ede6e/coverage-7.6.9-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff74026a461eb0660366fb01c650c1d00f833a086b336bdad7ab00cc952072b3", size = 237613 }, { url = "https://files.pythonhosted.org/packages/8b/10/ee7d696a17ac94f32f2dbda1e17e730bf798ae9931aec1fc01c1944cd4de/coverage-7.6.9-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65dad5a248823a4996724a88eb51d4b31587aa7aa428562dbe459c684e5787ae", size = 239684 }, { url = "https://files.pythonhosted.org/packages/16/60/aa1066040d3c52fff051243c2d6ccda264da72dc6d199d047624d395b2b2/coverage-7.6.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:22be16571504c9ccea919fcedb459d5ab20d41172056206eb2994e2ff06118a4", size = 239112 }, { url = "https://files.pythonhosted.org/packages/4e/e5/69f35344c6f932ba9028bf168d14a79fedb0dd4849b796d43c81ce75a3c9/coverage-7.6.9-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f957943bc718b87144ecaee70762bc2bc3f1a7a53c7b861103546d3a403f0a6", size = 237428 }, { url = "https://files.pythonhosted.org/packages/32/20/adc895523c4a28f63441b8ac645abd74f9bdd499d2d175bef5b41fc7f92d/coverage-7.6.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ae1387db4aecb1f485fb70a6c0148c6cdaebb6038f1d40089b1fc84a5db556f", size = 239098 }, { url = "https://files.pythonhosted.org/packages/a9/a6/e0e74230c9bb3549ec8ffc137cfd16ea5d56e993d6bffed2218bff6187e3/coverage-7.6.9-cp312-cp312-win32.whl", hash = "sha256:1a330812d9cc7ac2182586f6d41b4d0fadf9be9049f350e0efb275c8ee8eb692", size = 209940 }, { url = "https://files.pythonhosted.org/packages/3e/18/cb5b88349d4aa2f41ec78d65f92ea32572b30b3f55bc2b70e87578b8f434/coverage-7.6.9-cp312-cp312-win_amd64.whl", hash = "sha256:b12c6b18269ca471eedd41c1b6a1065b2f7827508edb9a7ed5555e9a56dcfc97", size = 210726 }, { url = "https://files.pythonhosted.org/packages/35/26/9abab6539d2191dbda2ce8c97b67d74cbfc966cc5b25abb880ffc7c459bc/coverage-7.6.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:899b8cd4781c400454f2f64f7776a5d87bbd7b3e7f7bda0cb18f857bb1334664", size = 207356 }, { url = "https://files.pythonhosted.org/packages/44/da/d49f19402240c93453f606e660a6676a2a1fbbaa6870cc23207790aa9697/coverage-7.6.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:61f70dc68bd36810972e55bbbe83674ea073dd1dcc121040a08cdf3416c5349c", size = 207614 }, { url = "https://files.pythonhosted.org/packages/da/e6/93bb9bf85497816082ec8da6124c25efa2052bd4c887dd3b317b91990c9e/coverage-7.6.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a289d23d4c46f1a82d5db4abeb40b9b5be91731ee19a379d15790e53031c014", size = 240129 }, { url = "https://files.pythonhosted.org/packages/df/65/6a824b9406fe066835c1274a9949e06f084d3e605eb1a602727a27ec2fe3/coverage-7.6.9-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e216d8044a356fc0337c7a2a0536d6de07888d7bcda76febcb8adc50bdbbd00", size = 237276 }, { url = "https://files.pythonhosted.org/packages/9f/79/6c7a800913a9dd23ac8c8da133ebb556771a5a3d4df36b46767b1baffd35/coverage-7.6.9-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c026eb44f744acaa2bda7493dad903aa5bf5fc4f2554293a798d5606710055d", size = 239267 }, { url = "https://files.pythonhosted.org/packages/57/e7/834d530293fdc8a63ba8ff70033d5182022e569eceb9aec7fc716b678a39/coverage-7.6.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e77363e8425325384f9d49272c54045bbed2f478e9dd698dbc65dbc37860eb0a", size = 238887 }, { url = "https://files.pythonhosted.org/packages/15/05/ec9d6080852984f7163c96984444e7cd98b338fd045b191064f943ee1c08/coverage-7.6.9-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:777abfab476cf83b5177b84d7486497e034eb9eaea0d746ce0c1268c71652077", size = 236970 }, { url = "https://files.pythonhosted.org/packages/0a/d8/775937670b93156aec29f694ce37f56214ed7597e1a75b4083ee4c32121c/coverage-7.6.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:447af20e25fdbe16f26e84eb714ba21d98868705cb138252d28bc400381f6ffb", size = 238831 }, { url = "https://files.pythonhosted.org/packages/f4/58/88551cb7fdd5ec98cb6044e8814e38583436b14040a5ece15349c44c8f7c/coverage-7.6.9-cp313-cp313-win32.whl", hash = "sha256:d872ec5aeb086cbea771c573600d47944eea2dcba8be5f3ee649bfe3cb8dc9ba", size = 210000 }, { url = "https://files.pythonhosted.org/packages/b7/12/cfbf49b95120872785ff8d56ab1c7fe3970a65e35010c311d7dd35c5fd00/coverage-7.6.9-cp313-cp313-win_amd64.whl", hash = "sha256:fd1213c86e48dfdc5a0cc676551db467495a95a662d2396ecd58e719191446e1", size = 210753 }, { url = "https://files.pythonhosted.org/packages/7c/68/c1cb31445599b04bde21cbbaa6d21b47c5823cdfef99eae470dfce49c35a/coverage-7.6.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ba9e7484d286cd5a43744e5f47b0b3fb457865baf07bafc6bee91896364e1419", size = 208091 }, { url = "https://files.pythonhosted.org/packages/11/73/84b02c6b19c4a11eb2d5b5eabe926fb26c21c080e0852f5e5a4f01165f9e/coverage-7.6.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e5ea1cf0872ee455c03e5674b5bca5e3e68e159379c1af0903e89f5eba9ccc3a", size = 208369 }, { url = "https://files.pythonhosted.org/packages/de/e0/ae5d878b72ff26df2e994a5c5b1c1f6a7507d976b23beecb1ed4c85411ef/coverage-7.6.9-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d10e07aa2b91835d6abec555ec8b2733347956991901eea6ffac295f83a30e4", size = 251089 }, { url = "https://files.pythonhosted.org/packages/ab/9c/0aaac011aef95a93ef3cb2fba3fde30bc7e68a6635199ed469b1f5ea355a/coverage-7.6.9-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:13a9e2d3ee855db3dd6ea1ba5203316a1b1fd8eaeffc37c5b54987e61e4194ae", size = 246806 }, { url = "https://files.pythonhosted.org/packages/f8/19/4d5d3ae66938a7dcb2f58cef3fa5386f838f469575b0bb568c8cc9e3a33d/coverage-7.6.9-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c38bf15a40ccf5619fa2fe8f26106c7e8e080d7760aeccb3722664c8656b030", size = 249164 }, { url = "https://files.pythonhosted.org/packages/b3/0b/4ee8a7821f682af9ad440ae3c1e379da89a998883271f088102d7ca2473d/coverage-7.6.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d5275455b3e4627c8e7154feaf7ee0743c2e7af82f6e3b561967b1cca755a0be", size = 248642 }, { url = "https://files.pythonhosted.org/packages/8a/12/36ff1d52be18a16b4700f561852e7afd8df56363a5edcfb04cf26a0e19e0/coverage-7.6.9-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8f8770dfc6e2c6a2d4569f411015c8d751c980d17a14b0530da2d7f27ffdd88e", size = 246516 }, { url = "https://files.pythonhosted.org/packages/43/d0/8e258f6c3a527c1655602f4f576215e055ac704de2d101710a71a2affac2/coverage-7.6.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8d2dfa71665a29b153a9681edb1c8d9c1ea50dfc2375fb4dac99ea7e21a0bcd9", size = 247783 }, { url = "https://files.pythonhosted.org/packages/a9/0d/1e4a48d289429d38aae3babdfcadbf35ca36bdcf3efc8f09b550a845bdb5/coverage-7.6.9-cp313-cp313t-win32.whl", hash = "sha256:5e6b86b5847a016d0fbd31ffe1001b63355ed309651851295315031ea7eb5a9b", size = 210646 }, { url = "https://files.pythonhosted.org/packages/26/74/b0729f196f328ac55e42b1e22ec2f16d8bcafe4b8158a26ec9f1cdd1d93e/coverage-7.6.9-cp313-cp313t-win_amd64.whl", hash = "sha256:97ddc94d46088304772d21b060041c97fc16bdda13c6c7f9d8fcd8d5ae0d8611", size = 211815 }, { url = "https://files.pythonhosted.org/packages/93/fe/8873d88999b8e4b0d8150df554d72d6943b3938bba328fcb5422572cfd84/coverage-7.6.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:adb697c0bd35100dc690de83154627fbab1f4f3c0386df266dded865fc50a902", size = 207022 }, { url = "https://files.pythonhosted.org/packages/23/c1/5dc48dfe3714a6ae9d2cd128a9df39570e46d3831f19a9be84011e767209/coverage-7.6.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:be57b6d56e49c2739cdf776839a92330e933dd5e5d929966fbbd380c77f060be", size = 207458 }, { url = "https://files.pythonhosted.org/packages/e8/08/5644e101c823f0b18aa5c408037c2438fad05e6eb9f9e6581459aa0bfb92/coverage-7.6.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1592791f8204ae9166de22ba7e6705fa4ebd02936c09436a1bb85aabca3e599", size = 235494 }, { url = "https://files.pythonhosted.org/packages/b2/02/995c019c0a2d70188d4d8184a0376eb28fcfb759981bb0e9961b463344fd/coverage-7.6.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e12ae8cc979cf83d258acb5e1f1cf2f3f83524d1564a49d20b8bec14b637f08", size = 233416 }, { url = "https://files.pythonhosted.org/packages/eb/d3/48ce8c9a89c7013f89ec7e01402e7a136a2e849c8f8664ea7f17b225295c/coverage-7.6.9-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb5555cff66c4d3d6213a296b360f9e1a8e323e74e0426b6c10ed7f4d021e464", size = 234546 }, { url = "https://files.pythonhosted.org/packages/20/d2/11ac147bd76cc5d8a6254c9a9b6beaab51c3532ba0abdfaf669bf48d2c67/coverage-7.6.9-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b9389a429e0e5142e69d5bf4a435dd688c14478a19bb901735cdf75e57b13845", size = 233655 }, { url = "https://files.pythonhosted.org/packages/18/cb/6e35c5766041737f14c31ad02b5404ae6ec05d4e17ccffd69f6d99431e0a/coverage-7.6.9-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:592ac539812e9b46046620341498caf09ca21023c41c893e1eb9dbda00a70cbf", size = 232145 }, { url = "https://files.pythonhosted.org/packages/ff/62/5de767f225e09ce959b71d1f3efc9e86e1c3de1fded85886bf705248905d/coverage-7.6.9-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a27801adef24cc30871da98a105f77995e13a25a505a0161911f6aafbd66e678", size = 233131 }, { url = "https://files.pythonhosted.org/packages/65/72/bacb4b4c9da226e2343aa4bfebcb2bc008eda2f28aa913474aef27bfc397/coverage-7.6.9-cp39-cp39-win32.whl", hash = "sha256:8e3c3e38930cfb729cb8137d7f055e5a473ddaf1217966aa6238c88bd9fd50e6", size = 209735 }, { url = "https://files.pythonhosted.org/packages/f4/4d/096d19dbd8998c9aaf8798078dd884f65652eb891fe7b0e657b5ac07411d/coverage-7.6.9-cp39-cp39-win_amd64.whl", hash = "sha256:e28bf44afa2b187cc9f41749138a64435bf340adfcacb5b2290c070ce99839d4", size = 210517 }, { url = "https://files.pythonhosted.org/packages/15/0e/4ac9035ee2ee08d2b703fdad2d84283ec0bad3b46eb4ad6affb150174cb6/coverage-7.6.9-pp39.pp310-none-any.whl", hash = "sha256:f3ca78518bc6bc92828cd11867b121891d75cae4ea9e908d72030609b996db1b", size = 199270 }, ] [package.optional-dependencies] toml = [ { name = "tomli", marker = "python_full_version <= '3.11'" }, ] [[package]] name = "docker" version = "7.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pywin32", marker = "sys_platform == 'win32'" }, { name = "requests" }, { name = "urllib3" }, ] sdist = { url = "https://files.pythonhosted.org/packages/91/9b/4a2ea29aeba62471211598dac5d96825bb49348fa07e906ea930394a83ce/docker-7.1.0.tar.gz", hash = "sha256:ad8c70e6e3f8926cb8a92619b832b4ea5299e2831c14284663184e200546fa6c", size = 117834 } wheels = [ { url = "https://files.pythonhosted.org/packages/e3/26/57c6fb270950d476074c087527a558ccb6f4436657314bfb6cdf484114c4/docker-7.1.0-py3-none-any.whl", hash = "sha256:c96b93b7f0a746f9e77d325bcfb87422a3d8bd4f03136ae8a85b37f1898d5fc0", size = 147774 }, ] [[package]] name = "exceptiongroup" version = "1.2.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/09/35/2495c4ac46b980e4ca1f6ad6db102322ef3ad2410b79fdde159a4b0f3b92/exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc", size = 28883 } wheels = [ { url = "https://files.pythonhosted.org/packages/02/cc/b7e31358aac6ed1ef2bb790a9746ac2c69bcb3c8588b41616914eb106eaf/exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b", size = 16453 }, ] [[package]] name = "fastapi" version = "0.115.6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, { name = "starlette" }, { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/93/72/d83b98cd106541e8f5e5bfab8ef2974ab45a62e8a6c5b5e6940f26d2ed4b/fastapi-0.115.6.tar.gz", hash = "sha256:9ec46f7addc14ea472958a96aae5b5de65f39721a46aaf5705c480d9a8b76654", size = 301336 } wheels = [ { url = "https://files.pythonhosted.org/packages/52/b3/7e4df40e585df024fac2f80d1a2d579c854ac37109675db2b0cc22c0bb9e/fastapi-0.115.6-py3-none-any.whl", hash = "sha256:e9240b29e36fa8f4bb7290316988e90c381e5092e0cbe84e7818cc3713bcf305", size = 94843 }, ] [[package]] name = "h11" version = "0.14.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 } wheels = [ { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 }, ] [[package]] name = "httpcore" version = "1.0.7" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, { name = "h11" }, ] sdist = { url = "https://files.pythonhosted.org/packages/6a/41/d7d0a89eb493922c37d343b607bc1b5da7f5be7e383740b4753ad8943e90/httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c", size = 85196 } wheels = [ { url = "https://files.pythonhosted.org/packages/87/f5/72347bc88306acb359581ac4d52f23c0ef445b57157adedb9aee0cd689d2/httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd", size = 78551 }, ] [[package]] name = "httpx" version = "0.28.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, { name = "certifi" }, { name = "httpcore" }, { name = "idna" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 } wheels = [ { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 }, ] [[package]] name = "idna" version = "3.10" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } wheels = [ { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, ] [[package]] name = "importlib-metadata" version = "8.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "zipp" }, ] sdist = { url = "https://files.pythonhosted.org/packages/cd/12/33e59336dca5be0c398a7482335911a33aa0e20776128f038019f1a95f1b/importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7", size = 55304 } wheels = [ { url = "https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b", size = 26514 }, ] [[package]] name = "iniconfig" version = "2.0.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", size = 4646 } wheels = [ { url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", size = 5892 }, ] [[package]] name = "jaraco-functools" version = "4.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "more-itertools" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ab/23/9894b3df5d0a6eb44611c36aec777823fc2e07740dabbd0b810e19594013/jaraco_functools-4.1.0.tar.gz", hash = "sha256:70f7e0e2ae076498e212562325e805204fc092d7b4c17e0e86c959e249701a9d", size = 19159 } wheels = [ { url = "https://files.pythonhosted.org/packages/9f/4f/24b319316142c44283d7540e76c7b5a6dbd5db623abd86bb7b3491c21018/jaraco.functools-4.1.0-py3-none-any.whl", hash = "sha256:ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649", size = 10187 }, ] [[package]] name = "more-itertools" version = "10.5.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/51/78/65922308c4248e0eb08ebcbe67c95d48615cc6f27854b6f2e57143e9178f/more-itertools-10.5.0.tar.gz", hash = "sha256:5482bfef7849c25dc3c6dd53a6173ae4795da2a41a80faea6700d9f5846c5da6", size = 121020 } wheels = [ { url = "https://files.pythonhosted.org/packages/48/7e/3a64597054a70f7c86eb0a7d4fc315b8c1ab932f64883a297bdffeb5f967/more_itertools-10.5.0-py3-none-any.whl", hash = "sha256:037b0d3203ce90cca8ab1defbbdac29d5f993fc20131f3664dc8d6acfa872aef", size = 60952 }, ] [[package]] name = "mypy" version = "1.14.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mypy-extensions" }, { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/8c/7b/08046ef9330735f536a09a2e31b00f42bccdb2795dcd979636ba43bb2d63/mypy-1.14.0.tar.gz", hash = "sha256:822dbd184d4a9804df5a7d5335a68cf7662930e70b8c1bc976645d1509f9a9d6", size = 3215684 } wheels = [ { url = "https://files.pythonhosted.org/packages/ef/97/f00ded038482230e0beaaa08f9c5483a54530b362ad1b0d752d5d2b2f211/mypy-1.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e971c1c667007f9f2b397ffa80fa8e1e0adccff336e5e77e74cb5f22868bee87", size = 11207956 }, { url = "https://files.pythonhosted.org/packages/68/67/8b4db0da19c9e3fa6264e948f1c135ab4dd45bede1809f4fdb613dc119f6/mypy-1.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e86aaeaa3221a278c66d3d673b297232947d873773d61ca3ee0e28b2ff027179", size = 10363681 }, { url = "https://files.pythonhosted.org/packages/f5/00/56b1619ff1f3fcad2d411eccda60d74d20e73bda39c218d5ad2769980682/mypy-1.14.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1628c5c3ce823d296e41e2984ff88c5861499041cb416a8809615d0c1f41740e", size = 12832976 }, { url = "https://files.pythonhosted.org/packages/e7/8b/9247838774b0bd865f190cc221822212091317f16310305ef924d9772532/mypy-1.14.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7fadb29b77fc14a0dd81304ed73c828c3e5cde0016c7e668a86a3e0dfc9f3af3", size = 13013704 }, { url = "https://files.pythonhosted.org/packages/b2/69/0c0868a6f3d9761d2f704d1fb6ef84d75998c27d342738a8b20f109a411f/mypy-1.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:3fa76988dc760da377c1e5069200a50d9eaaccf34f4ea18428a3337034ab5a44", size = 9782230 }, { url = "https://files.pythonhosted.org/packages/34/c1/b9dd3e955953aec1c728992545b7877c9f6fa742a623ce4c200da0f62540/mypy-1.14.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6e73c8a154eed31db3445fe28f63ad2d97b674b911c00191416cf7f6459fd49a", size = 11121032 }, { url = "https://files.pythonhosted.org/packages/ee/96/c52d5d516819ab95bf41f4a1ada828a3decc302f8c152ff4fc5feb0e4529/mypy-1.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:273e70fcb2e38c5405a188425aa60b984ffdcef65d6c746ea5813024b68c73dc", size = 10286294 }, { url = "https://files.pythonhosted.org/packages/69/2c/3dbe51877a24daa467f8d8631f9ffd1aabbf0f6d9367a01c44a59df81fe0/mypy-1.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1daca283d732943731a6a9f20fdbcaa927f160bc51602b1d4ef880a6fb252015", size = 12746528 }, { url = "https://files.pythonhosted.org/packages/a1/a8/eb20cde4ba9c4c3e20d958918a7c5d92210f4d1a0200c27de9a641f70996/mypy-1.14.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7e68047bedb04c1c25bba9901ea46ff60d5eaac2d71b1f2161f33107e2b368eb", size = 12883489 }, { url = "https://files.pythonhosted.org/packages/91/17/a1fc6c70f31d52c99299320cf81c3cb2c6b91ec7269414e0718a6d138e34/mypy-1.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:7a52f26b9c9b1664a60d87675f3bae00b5c7f2806e0c2800545a32c325920bcc", size = 9780113 }, { url = "https://files.pythonhosted.org/packages/fe/d8/0e72175ee0253217f5c44524f5e95251c02e95ba9749fb87b0e2074d203a/mypy-1.14.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d5326ab70a6db8e856d59ad4cb72741124950cbbf32e7b70e30166ba7bbf61dd", size = 11269011 }, { url = "https://files.pythonhosted.org/packages/e9/6d/4ea13839dabe5db588dc6a1b766da16f420d33cf118a7b7172cdf6c7fcb2/mypy-1.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bf4ec4980bec1e0e24e5075f449d014011527ae0055884c7e3abc6a99cd2c7f1", size = 10253076 }, { url = "https://files.pythonhosted.org/packages/3e/38/7db2c5d0f4d290e998f7a52b2e2616c7bbad96b8e04278ab09d11978a29e/mypy-1.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:390dfb898239c25289495500f12fa73aa7f24a4c6d90ccdc165762462b998d63", size = 12862786 }, { url = "https://files.pythonhosted.org/packages/bf/4b/62d59c801b34141040989949c2b5c157d0408b45357335d3ec5b2845b0f6/mypy-1.14.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7e026d55ddcd76e29e87865c08cbe2d0104e2b3153a523c529de584759379d3d", size = 12971568 }, { url = "https://files.pythonhosted.org/packages/f1/9c/e0f281b32d70c87b9e4d2939e302b1ff77ada4d7b0f2fb32890c144bc1d6/mypy-1.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:585ed36031d0b3ee362e5107ef449a8b5dfd4e9c90ccbe36414ee405ee6b32ba", size = 9879477 }, { url = "https://files.pythonhosted.org/packages/13/33/8380efd0ebdfdfac7fc0bf065f03a049800ca1e6c296ec1afc634340d992/mypy-1.14.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9f6f4c0b27401d14c483c622bc5105eff3911634d576bbdf6695b9a7c1ba741", size = 11251509 }, { url = "https://files.pythonhosted.org/packages/15/6d/4e1c21c60fee11af7d8e4f2902a29886d1387d6a836be16229eb3982a963/mypy-1.14.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56b2280cedcb312c7a79f5001ae5325582d0d339bce684e4a529069d0e7ca1e7", size = 10244282 }, { url = "https://files.pythonhosted.org/packages/8b/cf/7a8ae5c0161edae15d25c2c67c68ce8b150cbdc45aefc13a8be271ee80b2/mypy-1.14.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:342de51c48bab326bfc77ce056ba08c076d82ce4f5a86621f972ed39970f94d8", size = 12867676 }, { url = "https://files.pythonhosted.org/packages/9c/d0/71f7bbdcc7cfd0f2892db5b13b1e8857673f2cc9e0c30e3e4340523dc186/mypy-1.14.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:00df23b42e533e02a6f0055e54de9a6ed491cd8b7ea738647364fd3a39ea7efc", size = 12964189 }, { url = "https://files.pythonhosted.org/packages/a7/40/fb4ad65d6d5f8c51396ecf6305ec0269b66013a5bf02d0e9528053640b4a/mypy-1.14.0-cp313-cp313-win_amd64.whl", hash = "sha256:e8c8387e5d9dff80e7daf961df357c80e694e942d9755f3ad77d69b0957b8e3f", size = 9888247 }, { url = "https://files.pythonhosted.org/packages/aa/b7/7f04baf45d3f7fd15eb2e24ca225f93713a43fa3b7fb4ec85329e6849a50/mypy-1.14.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:14117b9da3305b39860d0aa34b8f1ff74d209a368829a584eb77524389a9c13e", size = 11202640 }, { url = "https://files.pythonhosted.org/packages/1c/03/3d27a64baaa70d8218556a08d93fc64e0d3a46b81bae0e2c93511be85264/mypy-1.14.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:af98c5a958f9c37404bd4eef2f920b94874507e146ed6ee559f185b8809c44cc", size = 10354715 }, { url = "https://files.pythonhosted.org/packages/bb/bd/a0eb1789dfeaab0ca93d00f373c002cac4734e8f902de4e7eceb9245a116/mypy-1.14.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f0b343a1d3989547024377c2ba0dca9c74a2428ad6ed24283c213af8dbb0710b", size = 12832863 }, { url = "https://files.pythonhosted.org/packages/ef/0c/d404be19b1145f9371c4d4fdfc166337a2810c2be0f19dec5965186e8fab/mypy-1.14.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cdb5563c1726c85fb201be383168f8c866032db95e1095600806625b3a648cb7", size = 13008982 }, { url = "https://files.pythonhosted.org/packages/3e/2c/f02dbde7609de72160459767bfb12490e1e30e33e3d01a6c68d5934f73df/mypy-1.14.0-cp39-cp39-win_amd64.whl", hash = "sha256:74e925649c1ee0a79aa7448baf2668d81cc287dc5782cff6a04ee93f40fb8d3f", size = 9781353 }, { url = "https://files.pythonhosted.org/packages/39/32/0214608af400cdf8f5102144bb8af10d880675c65ed0b58f7e0e77175d50/mypy-1.14.0-py3-none-any.whl", hash = "sha256:2238d7f93fc4027ed1efc944507683df3ba406445a2b6c96e79666a045aadfab", size = 2752803 }, ] [[package]] name = "mypy-extensions" version = "1.0.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/98/a4/1ab47638b92648243faf97a5aeb6ea83059cc3624972ab6b8d2316078d3f/mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782", size = 4433 } wheels = [ { url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", size = 4695 }, ] [[package]] name = "packaging" version = "24.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 } wheels = [ { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 }, ] [[package]] name = "pluggy" version = "1.5.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955 } wheels = [ { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556 }, ] [[package]] name = "portend" version = "3.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "tempora" }, ] sdist = { url = "https://files.pythonhosted.org/packages/8f/fc/bcfc768996b438d6e4bde7a6c8cfd62089847b0f5381a0e0ec2d8ee6b202/portend-3.2.0.tar.gz", hash = "sha256:5250a352c19c959d767cac878b829d93e5dc7625a5143399a2a00dc6628ffb72", size = 10514 } wheels = [ { url = "https://files.pythonhosted.org/packages/a3/c5/7041b39bcad182a37ec6ea92e7e478a460db6277c542e6d417e34246bdac/portend-3.2.0-py3-none-any.whl", hash = "sha256:8b3fe3f78779df906559a21d9eaa6e21c8fa5a7a8cc76362cbbe1e16777399cf", size = 5350 }, ] [[package]] name = "psutil" version = "6.1.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/1f/5a/07871137bb752428aa4b659f910b399ba6f291156bdea939be3e96cae7cb/psutil-6.1.1.tar.gz", hash = "sha256:cf8496728c18f2d0b45198f06895be52f36611711746b7f30c464b422b50e2f5", size = 508502 } wheels = [ { url = "https://files.pythonhosted.org/packages/61/99/ca79d302be46f7bdd8321089762dd4476ee725fce16fc2b2e1dbba8cac17/psutil-6.1.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:fc0ed7fe2231a444fc219b9c42d0376e0a9a1a72f16c5cfa0f68d19f1a0663e8", size = 247511 }, { url = "https://files.pythonhosted.org/packages/0b/6b/73dbde0dd38f3782905d4587049b9be64d76671042fdcaf60e2430c6796d/psutil-6.1.1-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0bdd4eab935276290ad3cb718e9809412895ca6b5b334f5a9111ee6d9aff9377", size = 248985 }, { url = "https://files.pythonhosted.org/packages/17/38/c319d31a1d3f88c5b79c68b3116c129e5133f1822157dd6da34043e32ed6/psutil-6.1.1-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6e06c20c05fe95a3d7302d74e7097756d4ba1247975ad6905441ae1b5b66003", size = 284488 }, { url = "https://files.pythonhosted.org/packages/9c/39/0f88a830a1c8a3aba27fededc642da37613c57cbff143412e3536f89784f/psutil-6.1.1-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97f7cb9921fbec4904f522d972f0c0e1f4fabbdd4e0287813b21215074a0f160", size = 287477 }, { url = "https://files.pythonhosted.org/packages/47/da/99f4345d4ddf2845cb5b5bd0d93d554e84542d116934fde07a0c50bd4e9f/psutil-6.1.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33431e84fee02bc84ea36d9e2c4a6d395d479c9dd9bba2376c1f6ee8f3a4e0b3", size = 289017 }, { url = "https://files.pythonhosted.org/packages/38/53/bd755c2896f4461fd4f36fa6a6dcb66a88a9e4b9fd4e5b66a77cf9d4a584/psutil-6.1.1-cp37-abi3-win32.whl", hash = "sha256:eaa912e0b11848c4d9279a93d7e2783df352b082f40111e078388701fd479e53", size = 250602 }, { url = "https://files.pythonhosted.org/packages/7b/d7/7831438e6c3ebbfa6e01a927127a6cb42ad3ab844247f3c5b96bea25d73d/psutil-6.1.1-cp37-abi3-win_amd64.whl", hash = "sha256:f35cfccb065fff93529d2afb4a2e89e363fe63ca1e4a5da22b603a85833c2649", size = 254444 }, ] [[package]] name = "pydantic" version = "2.10.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, { name = "pydantic-core" }, { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/70/7e/fb60e6fee04d0ef8f15e4e01ff187a196fa976eb0f0ab524af4599e5754c/pydantic-2.10.4.tar.gz", hash = "sha256:82f12e9723da6de4fe2ba888b5971157b3be7ad914267dea8f05f82b28254f06", size = 762094 } wheels = [ { url = "https://files.pythonhosted.org/packages/f3/26/3e1bbe954fde7ee22a6e7d31582c642aad9e84ffe4b5fb61e63b87cd326f/pydantic-2.10.4-py3-none-any.whl", hash = "sha256:597e135ea68be3a37552fb524bc7d0d66dcf93d395acd93a00682f1efcb8ee3d", size = 431765 }, ] [[package]] name = "pydantic-core" version = "2.27.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", size = 413443 } wheels = [ { url = "https://files.pythonhosted.org/packages/3a/bc/fed5f74b5d802cf9a03e83f60f18864e90e3aed7223adaca5ffb7a8d8d64/pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa", size = 1895938 }, { url = "https://files.pythonhosted.org/packages/71/2a/185aff24ce844e39abb8dd680f4e959f0006944f4a8a0ea372d9f9ae2e53/pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c", size = 1815684 }, { url = "https://files.pythonhosted.org/packages/c3/43/fafabd3d94d159d4f1ed62e383e264f146a17dd4d48453319fd782e7979e/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7969e133a6f183be60e9f6f56bfae753585680f3b7307a8e555a948d443cc05a", size = 1829169 }, { url = "https://files.pythonhosted.org/packages/a2/d1/f2dfe1a2a637ce6800b799aa086d079998959f6f1215eb4497966efd2274/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3de9961f2a346257caf0aa508a4da705467f53778e9ef6fe744c038119737ef5", size = 1867227 }, { url = "https://files.pythonhosted.org/packages/7d/39/e06fcbcc1c785daa3160ccf6c1c38fea31f5754b756e34b65f74e99780b5/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2bb4d3e5873c37bb3dd58714d4cd0b0e6238cebc4177ac8fe878f8b3aa8e74c", size = 2037695 }, { url = "https://files.pythonhosted.org/packages/7a/67/61291ee98e07f0650eb756d44998214231f50751ba7e13f4f325d95249ab/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:280d219beebb0752699480fe8f1dc61ab6615c2046d76b7ab7ee38858de0a4e7", size = 2741662 }, { url = "https://files.pythonhosted.org/packages/32/90/3b15e31b88ca39e9e626630b4c4a1f5a0dfd09076366f4219429e6786076/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47956ae78b6422cbd46f772f1746799cbb862de838fd8d1fbd34a82e05b0983a", size = 1993370 }, { url = "https://files.pythonhosted.org/packages/ff/83/c06d333ee3a67e2e13e07794995c1535565132940715931c1c43bfc85b11/pydantic_core-2.27.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:14d4a5c49d2f009d62a2a7140d3064f686d17a5d1a268bc641954ba181880236", size = 1996813 }, { url = "https://files.pythonhosted.org/packages/7c/f7/89be1c8deb6e22618a74f0ca0d933fdcb8baa254753b26b25ad3acff8f74/pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:337b443af21d488716f8d0b6164de833e788aa6bd7e3a39c005febc1284f4962", size = 2005287 }, { url = "https://files.pythonhosted.org/packages/b7/7d/8eb3e23206c00ef7feee17b83a4ffa0a623eb1a9d382e56e4aa46fd15ff2/pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:03d0f86ea3184a12f41a2d23f7ccb79cdb5a18e06993f8a45baa8dfec746f0e9", size = 2128414 }, { url = "https://files.pythonhosted.org/packages/4e/99/fe80f3ff8dd71a3ea15763878d464476e6cb0a2db95ff1c5c554133b6b83/pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7041c36f5680c6e0f08d922aed302e98b3745d97fe1589db0a3eebf6624523af", size = 2155301 }, { url = "https://files.pythonhosted.org/packages/2b/a3/e50460b9a5789ca1451b70d4f52546fa9e2b420ba3bfa6100105c0559238/pydantic_core-2.27.2-cp310-cp310-win32.whl", hash = "sha256:50a68f3e3819077be2c98110c1f9dcb3817e93f267ba80a2c05bb4f8799e2ff4", size = 1816685 }, { url = "https://files.pythonhosted.org/packages/57/4c/a8838731cb0f2c2a39d3535376466de6049034d7b239c0202a64aaa05533/pydantic_core-2.27.2-cp310-cp310-win_amd64.whl", hash = "sha256:e0fd26b16394ead34a424eecf8a31a1f5137094cabe84a1bcb10fa6ba39d3d31", size = 1982876 }, { url = "https://files.pythonhosted.org/packages/c2/89/f3450af9d09d44eea1f2c369f49e8f181d742f28220f88cc4dfaae91ea6e/pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc", size = 1893421 }, { url = "https://files.pythonhosted.org/packages/9e/e3/71fe85af2021f3f386da42d291412e5baf6ce7716bd7101ea49c810eda90/pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7", size = 1814998 }, { url = "https://files.pythonhosted.org/packages/a6/3c/724039e0d848fd69dbf5806894e26479577316c6f0f112bacaf67aa889ac/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15", size = 1826167 }, { url = "https://files.pythonhosted.org/packages/2b/5b/1b29e8c1fb5f3199a9a57c1452004ff39f494bbe9bdbe9a81e18172e40d3/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306", size = 1865071 }, { url = "https://files.pythonhosted.org/packages/89/6c/3985203863d76bb7d7266e36970d7e3b6385148c18a68cc8915fd8c84d57/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99", size = 2036244 }, { url = "https://files.pythonhosted.org/packages/0e/41/f15316858a246b5d723f7d7f599f79e37493b2e84bfc789e58d88c209f8a/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459", size = 2737470 }, { url = "https://files.pythonhosted.org/packages/a8/7c/b860618c25678bbd6d1d99dbdfdf0510ccb50790099b963ff78a124b754f/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048", size = 1992291 }, { url = "https://files.pythonhosted.org/packages/bf/73/42c3742a391eccbeab39f15213ecda3104ae8682ba3c0c28069fbcb8c10d/pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d", size = 1994613 }, { url = "https://files.pythonhosted.org/packages/94/7a/941e89096d1175d56f59340f3a8ebaf20762fef222c298ea96d36a6328c5/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b", size = 2002355 }, { url = "https://files.pythonhosted.org/packages/6e/95/2359937a73d49e336a5a19848713555605d4d8d6940c3ec6c6c0ca4dcf25/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474", size = 2126661 }, { url = "https://files.pythonhosted.org/packages/2b/4c/ca02b7bdb6012a1adef21a50625b14f43ed4d11f1fc237f9d7490aa5078c/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6", size = 2153261 }, { url = "https://files.pythonhosted.org/packages/72/9d/a241db83f973049a1092a079272ffe2e3e82e98561ef6214ab53fe53b1c7/pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c", size = 1812361 }, { url = "https://files.pythonhosted.org/packages/e8/ef/013f07248041b74abd48a385e2110aa3a9bbfef0fbd97d4e6d07d2f5b89a/pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc", size = 1982484 }, { url = "https://files.pythonhosted.org/packages/10/1c/16b3a3e3398fd29dca77cea0a1d998d6bde3902fa2706985191e2313cc76/pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4", size = 1867102 }, { url = "https://files.pythonhosted.org/packages/d6/74/51c8a5482ca447871c93e142d9d4a92ead74de6c8dc5e66733e22c9bba89/pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0", size = 1893127 }, { url = "https://files.pythonhosted.org/packages/d3/f3/c97e80721735868313c58b89d2de85fa80fe8dfeeed84dc51598b92a135e/pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef", size = 1811340 }, { url = "https://files.pythonhosted.org/packages/9e/91/840ec1375e686dbae1bd80a9e46c26a1e0083e1186abc610efa3d9a36180/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7", size = 1822900 }, { url = "https://files.pythonhosted.org/packages/f6/31/4240bc96025035500c18adc149aa6ffdf1a0062a4b525c932065ceb4d868/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934", size = 1869177 }, { url = "https://files.pythonhosted.org/packages/fa/20/02fbaadb7808be578317015c462655c317a77a7c8f0ef274bc016a784c54/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6", size = 2038046 }, { url = "https://files.pythonhosted.org/packages/06/86/7f306b904e6c9eccf0668248b3f272090e49c275bc488a7b88b0823444a4/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c", size = 2685386 }, { url = "https://files.pythonhosted.org/packages/8d/f0/49129b27c43396581a635d8710dae54a791b17dfc50c70164866bbf865e3/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2", size = 1997060 }, { url = "https://files.pythonhosted.org/packages/0d/0f/943b4af7cd416c477fd40b187036c4f89b416a33d3cc0ab7b82708a667aa/pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4", size = 2004870 }, { url = "https://files.pythonhosted.org/packages/35/40/aea70b5b1a63911c53a4c8117c0a828d6790483f858041f47bab0b779f44/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3", size = 1999822 }, { url = "https://files.pythonhosted.org/packages/f2/b3/807b94fd337d58effc5498fd1a7a4d9d59af4133e83e32ae39a96fddec9d/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4", size = 2130364 }, { url = "https://files.pythonhosted.org/packages/fc/df/791c827cd4ee6efd59248dca9369fb35e80a9484462c33c6649a8d02b565/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57", size = 2158303 }, { url = "https://files.pythonhosted.org/packages/9b/67/4e197c300976af185b7cef4c02203e175fb127e414125916bf1128b639a9/pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc", size = 1834064 }, { url = "https://files.pythonhosted.org/packages/1f/ea/cd7209a889163b8dcca139fe32b9687dd05249161a3edda62860430457a5/pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9", size = 1989046 }, { url = "https://files.pythonhosted.org/packages/bc/49/c54baab2f4658c26ac633d798dab66b4c3a9bbf47cff5284e9c182f4137a/pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b", size = 1885092 }, { url = "https://files.pythonhosted.org/packages/41/b1/9bc383f48f8002f99104e3acff6cba1231b29ef76cfa45d1506a5cad1f84/pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", size = 1892709 }, { url = "https://files.pythonhosted.org/packages/10/6c/e62b8657b834f3eb2961b49ec8e301eb99946245e70bf42c8817350cbefc/pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", size = 1811273 }, { url = "https://files.pythonhosted.org/packages/ba/15/52cfe49c8c986e081b863b102d6b859d9defc63446b642ccbbb3742bf371/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", size = 1823027 }, { url = "https://files.pythonhosted.org/packages/b1/1c/b6f402cfc18ec0024120602bdbcebc7bdd5b856528c013bd4d13865ca473/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", size = 1868888 }, { url = "https://files.pythonhosted.org/packages/bd/7b/8cb75b66ac37bc2975a3b7de99f3c6f355fcc4d89820b61dffa8f1e81677/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", size = 2037738 }, { url = "https://files.pythonhosted.org/packages/c8/f1/786d8fe78970a06f61df22cba58e365ce304bf9b9f46cc71c8c424e0c334/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", size = 2685138 }, { url = "https://files.pythonhosted.org/packages/a6/74/d12b2cd841d8724dc8ffb13fc5cef86566a53ed358103150209ecd5d1999/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", size = 1997025 }, { url = "https://files.pythonhosted.org/packages/a0/6e/940bcd631bc4d9a06c9539b51f070b66e8f370ed0933f392db6ff350d873/pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", size = 2004633 }, { url = "https://files.pythonhosted.org/packages/50/cc/a46b34f1708d82498c227d5d80ce615b2dd502ddcfd8376fc14a36655af1/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", size = 1999404 }, { url = "https://files.pythonhosted.org/packages/ca/2d/c365cfa930ed23bc58c41463bae347d1005537dc8db79e998af8ba28d35e/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", size = 2130130 }, { url = "https://files.pythonhosted.org/packages/f4/d7/eb64d015c350b7cdb371145b54d96c919d4db516817f31cd1c650cae3b21/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", size = 2157946 }, { url = "https://files.pythonhosted.org/packages/a4/99/bddde3ddde76c03b65dfd5a66ab436c4e58ffc42927d4ff1198ffbf96f5f/pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", size = 1834387 }, { url = "https://files.pythonhosted.org/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", size = 1990453 }, { url = "https://files.pythonhosted.org/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", size = 1885186 }, { url = "https://files.pythonhosted.org/packages/27/97/3aef1ddb65c5ccd6eda9050036c956ff6ecbfe66cb7eb40f280f121a5bb0/pydantic_core-2.27.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c10eb4f1659290b523af58fa7cffb452a61ad6ae5613404519aee4bfbf1df993", size = 1896475 }, { url = "https://files.pythonhosted.org/packages/ad/d3/5668da70e373c9904ed2f372cb52c0b996426f302e0dee2e65634c92007d/pydantic_core-2.27.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef592d4bad47296fb11f96cd7dc898b92e795032b4894dfb4076cfccd43a9308", size = 1772279 }, { url = "https://files.pythonhosted.org/packages/8a/9e/e44b8cb0edf04a2f0a1f6425a65ee089c1d6f9c4c2dcab0209127b6fdfc2/pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c61709a844acc6bf0b7dce7daae75195a10aac96a596ea1b776996414791ede4", size = 1829112 }, { url = "https://files.pythonhosted.org/packages/1c/90/1160d7ac700102effe11616e8119e268770f2a2aa5afb935f3ee6832987d/pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c5f762659e47fdb7b16956c71598292f60a03aa92f8b6351504359dbdba6cf", size = 1866780 }, { url = "https://files.pythonhosted.org/packages/ee/33/13983426df09a36d22c15980008f8d9c77674fc319351813b5a2739b70f3/pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c9775e339e42e79ec99c441d9730fccf07414af63eac2f0e48e08fd38a64d76", size = 2037943 }, { url = "https://files.pythonhosted.org/packages/01/d7/ced164e376f6747e9158c89988c293cd524ab8d215ae4e185e9929655d5c/pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57762139821c31847cfb2df63c12f725788bd9f04bc2fb392790959b8f70f118", size = 2740492 }, { url = "https://files.pythonhosted.org/packages/8b/1f/3dc6e769d5b7461040778816aab2b00422427bcaa4b56cc89e9c653b2605/pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d1e85068e818c73e048fe28cfc769040bb1f475524f4745a5dc621f75ac7630", size = 1995714 }, { url = "https://files.pythonhosted.org/packages/07/d7/a0bd09bc39283530b3f7c27033a814ef254ba3bd0b5cfd040b7abf1fe5da/pydantic_core-2.27.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:097830ed52fd9e427942ff3b9bc17fab52913b2f50f2880dc4a5611446606a54", size = 1997163 }, { url = "https://files.pythonhosted.org/packages/2d/bb/2db4ad1762e1c5699d9b857eeb41959191980de6feb054e70f93085e1bcd/pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:044a50963a614ecfae59bb1eaf7ea7efc4bc62f49ed594e18fa1e5d953c40e9f", size = 2005217 }, { url = "https://files.pythonhosted.org/packages/53/5f/23a5a3e7b8403f8dd8fc8a6f8b49f6b55c7d715b77dcf1f8ae919eeb5628/pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:4e0b4220ba5b40d727c7f879eac379b822eee5d8fff418e9d3381ee45b3b0362", size = 2127899 }, { url = "https://files.pythonhosted.org/packages/c2/ae/aa38bb8dd3d89c2f1d8362dd890ee8f3b967330821d03bbe08fa01ce3766/pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5e4f4bb20d75e9325cc9696c6802657b58bc1dbbe3022f32cc2b2b632c3fbb96", size = 2155726 }, { url = "https://files.pythonhosted.org/packages/98/61/4f784608cc9e98f70839187117ce840480f768fed5d386f924074bf6213c/pydantic_core-2.27.2-cp39-cp39-win32.whl", hash = "sha256:cca63613e90d001b9f2f9a9ceb276c308bfa2a43fafb75c8031c4f66039e8c6e", size = 1817219 }, { url = "https://files.pythonhosted.org/packages/57/82/bb16a68e4a1a858bb3768c2c8f1ff8d8978014e16598f001ea29a25bf1d1/pydantic_core-2.27.2-cp39-cp39-win_amd64.whl", hash = "sha256:77d1bca19b0f7021b3a982e6f903dcd5b2b06076def36a652e3907f596e29f67", size = 1985382 }, { url = "https://files.pythonhosted.org/packages/46/72/af70981a341500419e67d5cb45abe552a7c74b66326ac8877588488da1ac/pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2bf14caea37e91198329b828eae1618c068dfb8ef17bb33287a7ad4b61ac314e", size = 1891159 }, { url = "https://files.pythonhosted.org/packages/ad/3d/c5913cccdef93e0a6a95c2d057d2c2cba347815c845cda79ddd3c0f5e17d/pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b0cb791f5b45307caae8810c2023a184c74605ec3bcbb67d13846c28ff731ff8", size = 1768331 }, { url = "https://files.pythonhosted.org/packages/f6/f0/a3ae8fbee269e4934f14e2e0e00928f9346c5943174f2811193113e58252/pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:688d3fd9fcb71f41c4c015c023d12a79d1c4c0732ec9eb35d96e3388a120dcf3", size = 1822467 }, { url = "https://files.pythonhosted.org/packages/d7/7a/7bbf241a04e9f9ea24cd5874354a83526d639b02674648af3f350554276c/pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d591580c34f4d731592f0e9fe40f9cc1b430d297eecc70b962e93c5c668f15f", size = 1979797 }, { url = "https://files.pythonhosted.org/packages/4f/5f/4784c6107731f89e0005a92ecb8a2efeafdb55eb992b8e9d0a2be5199335/pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:82f986faf4e644ffc189a7f1aafc86e46ef70372bb153e7001e8afccc6e54133", size = 1987839 }, { url = "https://files.pythonhosted.org/packages/6d/a7/61246562b651dff00de86a5f01b6e4befb518df314c54dec187a78d81c84/pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:bec317a27290e2537f922639cafd54990551725fc844249e64c523301d0822fc", size = 1998861 }, { url = "https://files.pythonhosted.org/packages/86/aa/837821ecf0c022bbb74ca132e117c358321e72e7f9702d1b6a03758545e2/pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:0296abcb83a797db256b773f45773da397da75a08f5fcaef41f2044adec05f50", size = 2116582 }, { url = "https://files.pythonhosted.org/packages/81/b0/5e74656e95623cbaa0a6278d16cf15e10a51f6002e3ec126541e95c29ea3/pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0d75070718e369e452075a6017fbf187f788e17ed67a3abd47fa934d001863d9", size = 2151985 }, { url = "https://files.pythonhosted.org/packages/63/37/3e32eeb2a451fddaa3898e2163746b0cffbbdbb4740d38372db0490d67f3/pydantic_core-2.27.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7e17b560be3c98a8e3aa66ce828bdebb9e9ac6ad5466fba92eb74c4c95cb1151", size = 2004715 }, { url = "https://files.pythonhosted.org/packages/29/0e/dcaea00c9dbd0348b723cae82b0e0c122e0fa2b43fa933e1622fd237a3ee/pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c33939a82924da9ed65dab5a65d427205a73181d8098e79b6b426bdf8ad4e656", size = 1891733 }, { url = "https://files.pythonhosted.org/packages/86/d3/e797bba8860ce650272bda6383a9d8cad1d1c9a75a640c9d0e848076f85e/pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:00bad2484fa6bda1e216e7345a798bd37c68fb2d97558edd584942aa41b7d278", size = 1768375 }, { url = "https://files.pythonhosted.org/packages/41/f7/f847b15fb14978ca2b30262548f5fc4872b2724e90f116393eb69008299d/pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c817e2b40aba42bac6f457498dacabc568c3b7a986fc9ba7c8d9d260b71485fb", size = 1822307 }, { url = "https://files.pythonhosted.org/packages/9c/63/ed80ec8255b587b2f108e514dc03eed1546cd00f0af281e699797f373f38/pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:251136cdad0cb722e93732cb45ca5299fb56e1344a833640bf93b2803f8d1bfd", size = 1979971 }, { url = "https://files.pythonhosted.org/packages/a9/6d/6d18308a45454a0de0e975d70171cadaf454bc7a0bf86b9c7688e313f0bb/pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d2088237af596f0a524d3afc39ab3b036e8adb054ee57cbb1dcf8e09da5b29cc", size = 1987616 }, { url = "https://files.pythonhosted.org/packages/82/8a/05f8780f2c1081b800a7ca54c1971e291c2d07d1a50fb23c7e4aef4ed403/pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d4041c0b966a84b4ae7a09832eb691a35aec90910cd2dbe7a208de59be77965b", size = 1998943 }, { url = "https://files.pythonhosted.org/packages/5e/3e/fe5b6613d9e4c0038434396b46c5303f5ade871166900b357ada4766c5b7/pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:8083d4e875ebe0b864ffef72a4304827015cff328a1be6e22cc850753bfb122b", size = 2116654 }, { url = "https://files.pythonhosted.org/packages/db/ad/28869f58938fad8cc84739c4e592989730bfb69b7c90a8fff138dff18e1e/pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f141ee28a0ad2123b6611b6ceff018039df17f32ada8b534e6aa039545a3efb2", size = 2152292 }, { url = "https://files.pythonhosted.org/packages/a1/0c/c5c5cd3689c32ed1fe8c5d234b079c12c281c051759770c05b8bed6412b5/pydantic_core-2.27.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7d0c8399fcc1848491f00e0314bd59fb34a9c008761bcb422a057670c3f65e35", size = 2004961 }, ] [[package]] name = "pyproject-hooks" version = "1.2.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228 } wheels = [ { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216 }, ] [[package]] name = "pytest" version = "8.3.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, { name = "iniconfig" }, { name = "packaging" }, { name = "pluggy" }, { name = "tomli", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/05/35/30e0d83068951d90a01852cb1cef56e5d8a09d20c7f511634cc2f7e0372a/pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761", size = 1445919 } wheels = [ { url = "https://files.pythonhosted.org/packages/11/92/76a1c94d3afee238333bc0a42b82935dd8f9cf8ce9e336ff87ee14d9e1cf/pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6", size = 343083 }, ] [[package]] name = "pytest-asyncio" version = "0.25.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pytest" }, ] sdist = { url = "https://files.pythonhosted.org/packages/94/18/82fcb4ee47d66d99f6cd1efc0b11b2a25029f303c599a5afda7c1bca4254/pytest_asyncio-0.25.0.tar.gz", hash = "sha256:8c0610303c9e0442a5db8604505fc0f545456ba1528824842b37b4a626cbf609", size = 53298 } wheels = [ { url = "https://files.pythonhosted.org/packages/88/56/2ee0cab25c11d4e38738a2a98c645a8f002e2ecf7b5ed774c70d53b92bb1/pytest_asyncio-0.25.0-py3-none-any.whl", hash = "sha256:db5432d18eac6b7e28b46dcd9b69921b55c3b1086e85febfe04e70b18d9e81b3", size = 19245 }, ] [[package]] name = "pytest-cov" version = "6.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "coverage", extra = ["toml"] }, { name = "pytest" }, ] sdist = { url = "https://files.pythonhosted.org/packages/be/45/9b538de8cef30e17c7b45ef42f538a94889ed6a16f2387a6c89e73220651/pytest-cov-6.0.0.tar.gz", hash = "sha256:fde0b595ca248bb8e2d76f020b465f3b107c9632e6a1d1705f17834c89dcadc0", size = 66945 } wheels = [ { url = "https://files.pythonhosted.org/packages/36/3b/48e79f2cd6a61dbbd4807b4ed46cb564b4fd50a76166b1c4ea5c1d9e2371/pytest_cov-6.0.0-py3-none-any.whl", hash = "sha256:eee6f1b9e61008bd34975a4d5bab25801eb31898b032dd55addc93e96fcaaa35", size = 22949 }, ] [[package]] name = "python-dateutil" version = "2.9.0.post0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "six" }, ] sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432 } wheels = [ { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 }, ] [[package]] name = "python-dotenv" version = "1.0.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/bc/57/e84d88dfe0aec03b7a2d4327012c1627ab5f03652216c63d49846d7a6c58/python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca", size = 39115 } wheels = [ { url = "https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a", size = 19863 }, ] [[package]] name = "pywin32" version = "308" source = { registry = "https://pypi.org/simple" } wheels = [ { url = "https://files.pythonhosted.org/packages/72/a6/3e9f2c474895c1bb61b11fa9640be00067b5c5b363c501ee9c3fa53aec01/pywin32-308-cp310-cp310-win32.whl", hash = "sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e", size = 5927028 }, { url = "https://files.pythonhosted.org/packages/d9/b4/84e2463422f869b4b718f79eb7530a4c1693e96b8a4e5e968de38be4d2ba/pywin32-308-cp310-cp310-win_amd64.whl", hash = "sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e", size = 6558484 }, { url = "https://files.pythonhosted.org/packages/9f/8f/fb84ab789713f7c6feacaa08dad3ec8105b88ade8d1c4f0f0dfcaaa017d6/pywin32-308-cp310-cp310-win_arm64.whl", hash = "sha256:a5ab5381813b40f264fa3495b98af850098f814a25a63589a8e9eb12560f450c", size = 7971454 }, { url = "https://files.pythonhosted.org/packages/eb/e2/02652007469263fe1466e98439831d65d4ca80ea1a2df29abecedf7e47b7/pywin32-308-cp311-cp311-win32.whl", hash = "sha256:5d8c8015b24a7d6855b1550d8e660d8daa09983c80e5daf89a273e5c6fb5095a", size = 5928156 }, { url = "https://files.pythonhosted.org/packages/48/ef/f4fb45e2196bc7ffe09cad0542d9aff66b0e33f6c0954b43e49c33cad7bd/pywin32-308-cp311-cp311-win_amd64.whl", hash = "sha256:575621b90f0dc2695fec346b2d6302faebd4f0f45c05ea29404cefe35d89442b", size = 6559559 }, { url = "https://files.pythonhosted.org/packages/79/ef/68bb6aa865c5c9b11a35771329e95917b5559845bd75b65549407f9fc6b4/pywin32-308-cp311-cp311-win_arm64.whl", hash = "sha256:100a5442b7332070983c4cd03f2e906a5648a5104b8a7f50175f7906efd16bb6", size = 7972495 }, { url = "https://files.pythonhosted.org/packages/00/7c/d00d6bdd96de4344e06c4afbf218bc86b54436a94c01c71a8701f613aa56/pywin32-308-cp312-cp312-win32.whl", hash = "sha256:587f3e19696f4bf96fde9d8a57cec74a57021ad5f204c9e627e15c33ff568897", size = 5939729 }, { url = "https://files.pythonhosted.org/packages/21/27/0c8811fbc3ca188f93b5354e7c286eb91f80a53afa4e11007ef661afa746/pywin32-308-cp312-cp312-win_amd64.whl", hash = "sha256:00b3e11ef09ede56c6a43c71f2d31857cf7c54b0ab6e78ac659497abd2834f47", size = 6543015 }, { url = "https://files.pythonhosted.org/packages/9d/0f/d40f8373608caed2255781a3ad9a51d03a594a1248cd632d6a298daca693/pywin32-308-cp312-cp312-win_arm64.whl", hash = "sha256:9b4de86c8d909aed15b7011182c8cab38c8850de36e6afb1f0db22b8959e3091", size = 7976033 }, { url = "https://files.pythonhosted.org/packages/a9/a4/aa562d8935e3df5e49c161b427a3a2efad2ed4e9cf81c3de636f1fdddfd0/pywin32-308-cp313-cp313-win32.whl", hash = "sha256:1c44539a37a5b7b21d02ab34e6a4d314e0788f1690d65b48e9b0b89f31abbbed", size = 5938579 }, { url = "https://files.pythonhosted.org/packages/c7/50/b0efb8bb66210da67a53ab95fd7a98826a97ee21f1d22949863e6d588b22/pywin32-308-cp313-cp313-win_amd64.whl", hash = "sha256:fd380990e792eaf6827fcb7e187b2b4b1cede0585e3d0c9e84201ec27b9905e4", size = 6542056 }, { url = "https://files.pythonhosted.org/packages/26/df/2b63e3e4f2df0224f8aaf6d131f54fe4e8c96400eb9df563e2aae2e1a1f9/pywin32-308-cp313-cp313-win_arm64.whl", hash = "sha256:ef313c46d4c18dfb82a2431e3051ac8f112ccee1a34f29c263c583c568db63cd", size = 7974986 }, { url = "https://files.pythonhosted.org/packages/a8/41/ead05a7657ffdbb1edabb954ab80825c4f87a3de0285d59f8290457f9016/pywin32-308-cp39-cp39-win32.whl", hash = "sha256:7873ca4dc60ab3287919881a7d4f88baee4a6e639aa6962de25a98ba6b193341", size = 5991824 }, { url = "https://files.pythonhosted.org/packages/e4/cd/0838c9a6063bff2e9bac2388ae36524c26c50288b5d7b6aebb6cdf8d375d/pywin32-308-cp39-cp39-win_amd64.whl", hash = "sha256:71b3322d949b4cc20776436a9c9ba0eeedcbc9c650daa536df63f0ff111bb920", size = 6640327 }, ] [[package]] name = "requests" version = "2.32.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, { name = "charset-normalizer" }, { name = "idna" }, { name = "urllib3" }, ] sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } wheels = [ { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, ] [[package]] name = "ruff" version = "0.8.4" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/34/37/9c02181ef38d55b77d97c68b78e705fd14c0de0e5d085202bb2b52ce5be9/ruff-0.8.4.tar.gz", hash = "sha256:0d5f89f254836799af1615798caa5f80b7f935d7a670fad66c5007928e57ace8", size = 3402103 } wheels = [ { url = "https://files.pythonhosted.org/packages/05/67/f480bf2f2723b2e49af38ed2be75ccdb2798fca7d56279b585c8f553aaab/ruff-0.8.4-py3-none-linux_armv6l.whl", hash = "sha256:58072f0c06080276804c6a4e21a9045a706584a958e644353603d36ca1eb8a60", size = 10546415 }, { url = "https://files.pythonhosted.org/packages/eb/7a/5aba20312c73f1ce61814e520d1920edf68ca3b9c507bd84d8546a8ecaa8/ruff-0.8.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ffb60904651c00a1e0b8df594591770018a0f04587f7deeb3838344fe3adabac", size = 10346113 }, { url = "https://files.pythonhosted.org/packages/76/f4/c41de22b3728486f0aa95383a44c42657b2db4062f3234ca36fc8cf52d8b/ruff-0.8.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:6ddf5d654ac0d44389f6bf05cee4caeefc3132a64b58ea46738111d687352296", size = 9943564 }, { url = "https://files.pythonhosted.org/packages/0e/f0/afa0d2191af495ac82d4cbbfd7a94e3df6f62a04ca412033e073b871fc6d/ruff-0.8.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e248b1f0fa2749edd3350a2a342b67b43a2627434c059a063418e3d375cfe643", size = 10805522 }, { url = "https://files.pythonhosted.org/packages/12/57/5d1e9a0fd0c228e663894e8e3a8e7063e5ee90f8e8e60cf2085f362bfa1a/ruff-0.8.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bf197b98ed86e417412ee3b6c893f44c8864f816451441483253d5ff22c0e81e", size = 10306763 }, { url = "https://files.pythonhosted.org/packages/04/df/f069fdb02e408be8aac6853583572a2873f87f866fe8515de65873caf6b8/ruff-0.8.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c41319b85faa3aadd4d30cb1cffdd9ac6b89704ff79f7664b853785b48eccdf3", size = 11359574 }, { url = "https://files.pythonhosted.org/packages/d3/04/37c27494cd02e4a8315680debfc6dfabcb97e597c07cce0044db1f9dfbe2/ruff-0.8.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:9f8402b7c4f96463f135e936d9ab77b65711fcd5d72e5d67597b543bbb43cf3f", size = 12094851 }, { url = "https://files.pythonhosted.org/packages/81/b1/c5d7fb68506cab9832d208d03ea4668da9a9887a4a392f4f328b1bf734ad/ruff-0.8.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4e56b3baa9c23d324ead112a4fdf20db9a3f8f29eeabff1355114dd96014604", size = 11655539 }, { url = "https://files.pythonhosted.org/packages/ef/38/8f8f2c8898dc8a7a49bc340cf6f00226917f0f5cb489e37075bcb2ce3671/ruff-0.8.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:736272574e97157f7edbbb43b1d046125fce9e7d8d583d5d65d0c9bf2c15addf", size = 12912805 }, { url = "https://files.pythonhosted.org/packages/06/dd/fa6660c279f4eb320788876d0cff4ea18d9af7d9ed7216d7bd66877468d0/ruff-0.8.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5fe710ab6061592521f902fca7ebcb9fabd27bc7c57c764298b1c1f15fff720", size = 11205976 }, { url = "https://files.pythonhosted.org/packages/a8/d7/de94cc89833b5de455750686c17c9e10f4e1ab7ccdc5521b8fe911d1477e/ruff-0.8.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:13e9ec6d6b55f6da412d59953d65d66e760d583dd3c1c72bf1f26435b5bfdbae", size = 10792039 }, { url = "https://files.pythonhosted.org/packages/6d/15/3e4906559248bdbb74854af684314608297a05b996062c9d72e0ef7c7097/ruff-0.8.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:97d9aefef725348ad77d6db98b726cfdb075a40b936c7984088804dfd38268a7", size = 10400088 }, { url = "https://files.pythonhosted.org/packages/a2/21/9ed4c0e8133cb4a87a18d470f534ad1a8a66d7bec493bcb8bda2d1a5d5be/ruff-0.8.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:ab78e33325a6f5374e04c2ab924a3367d69a0da36f8c9cb6b894a62017506111", size = 10900814 }, { url = "https://files.pythonhosted.org/packages/0d/5d/122a65a18955bd9da2616b69bc839351f8baf23b2805b543aa2f0aed72b5/ruff-0.8.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:8ef06f66f4a05c3ddbc9121a8b0cecccd92c5bf3dd43b5472ffe40b8ca10f0f8", size = 11268828 }, { url = "https://files.pythonhosted.org/packages/43/a9/1676ee9106995381e3d34bccac5bb28df70194167337ed4854c20f27c7ba/ruff-0.8.4-py3-none-win32.whl", hash = "sha256:552fb6d861320958ca5e15f28b20a3d071aa83b93caee33a87b471f99a6c0835", size = 8805621 }, { url = "https://files.pythonhosted.org/packages/10/98/ed6b56a30ee76771c193ff7ceeaf1d2acc98d33a1a27b8479cbdb5c17a23/ruff-0.8.4-py3-none-win_amd64.whl", hash = "sha256:f21a1143776f8656d7f364bd264a9d60f01b7f52243fbe90e7670c0dfe0cf65d", size = 9660086 }, { url = "https://files.pythonhosted.org/packages/13/9f/026e18ca7d7766783d779dae5e9c656746c6ede36ef73c6d934aaf4a6dec/ruff-0.8.4-py3-none-win_arm64.whl", hash = "sha256:9183dd615d8df50defa8b1d9a074053891ba39025cf5ae88e8bcb52edcc4bf08", size = 9074500 }, ] [[package]] name = "six" version = "1.17.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 } wheels = [ { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, ] [[package]] name = "sniffio" version = "1.3.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 } wheels = [ { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 }, ] [[package]] name = "sse-starlette" version = "2.2.1" source = { editable = "." } dependencies = [ { name = "anyio" }, { name = "starlette" }, ] [package.optional-dependencies] examples = [ { name = "fastapi" }, ] uvicorn = [ { name = "uvicorn" }, ] [package.dependency-groups] dev = [ { name = "asgi-lifespan" }, { name = "async-timeout" }, { name = "build" }, { name = "codecov" }, { name = "httpx" }, { name = "mypy" }, { name = "portend" }, { name = "psutil" }, { name = "pytest" }, { name = "pytest-asyncio" }, { name = "pytest-cov" }, { name = "ruff" }, { name = "tenacity" }, { name = "testcontainers" }, ] [package.metadata] requires-dist = [ { name = "anyio", specifier = ">=4.7.0" }, { name = "fastapi", marker = "extra == 'examples'" }, { name = "starlette", specifier = ">=0.41.3" }, { name = "uvicorn", marker = "extra == 'uvicorn'", specifier = ">=0.34.0" }, ] [package.metadata.dependency-groups] dev = [ { name = "asgi-lifespan", specifier = ">=2.1.0" }, { name = "async-timeout", specifier = ">=5.0.1" }, { name = "build", specifier = ">=1.2.2.post1" }, { name = "codecov", specifier = ">=2.1.13" }, { name = "httpx", specifier = ">=0.28.1" }, { name = "mypy", specifier = ">=1.14.0" }, { name = "portend", specifier = ">=3.2.0" }, { name = "psutil", specifier = ">=6.1.1" }, { name = "pytest", specifier = ">=8.3.4" }, { name = "pytest-asyncio", specifier = ">=0.25.0" }, { name = "pytest-cov", specifier = ">=6.0.0" }, { name = "ruff", specifier = ">=0.8.4" }, { name = "tenacity", specifier = ">=9.0.0" }, { name = "testcontainers", specifier = ">=4.9.0" }, ] [[package]] name = "starlette" version = "0.41.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, { name = "typing-extensions", marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/1a/4c/9b5764bd22eec91c4039ef4c55334e9187085da2d8a2df7bd570869aae18/starlette-0.41.3.tar.gz", hash = "sha256:0e4ab3d16522a255be6b28260b938eae2482f98ce5cc934cb08dce8dc3ba5835", size = 2574159 } wheels = [ { url = "https://files.pythonhosted.org/packages/96/00/2b325970b3060c7cecebab6d295afe763365822b1306a12eeab198f74323/starlette-0.41.3-py3-none-any.whl", hash = "sha256:44cedb2b7c77a9de33a8b74b2b90e9f50d11fcf25d8270ea525ad71a25374ff7", size = 73225 }, ] [[package]] name = "tempora" version = "5.7.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jaraco-functools" }, { name = "python-dateutil" }, ] sdist = { url = "https://files.pythonhosted.org/packages/5d/52/b4ff0ca21695a4f8ac0f158d884587b5eba08b0e95356b0ea210e00446ac/tempora-5.7.0.tar.gz", hash = "sha256:888190a2dbe3255ff26dfa9fcecb25f4d38434c0f1943cd61de98bb41c410c50", size = 22239 } wheels = [ { url = "https://files.pythonhosted.org/packages/50/2d/9991dba668a8ad4d9ce0c3f02a6a2a46a5f36bcdde1a9a5cd437482d9052/tempora-5.7.0-py3-none-any.whl", hash = "sha256:93dac0d33825e66c8314d7bd206b9ecb959075c8728bb05b9b050b2726d0442a", size = 13645 }, ] [[package]] name = "tenacity" version = "9.0.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/cd/94/91fccdb4b8110642462e653d5dcb27e7b674742ad68efd146367da7bdb10/tenacity-9.0.0.tar.gz", hash = "sha256:807f37ca97d62aa361264d497b0e31e92b8027044942bfa756160d908320d73b", size = 47421 } wheels = [ { url = "https://files.pythonhosted.org/packages/b6/cb/b86984bed139586d01532a587464b5805f12e397594f19f931c4c2fbfa61/tenacity-9.0.0-py3-none-any.whl", hash = "sha256:93de0c98785b27fcf659856aa9f54bfbd399e29969b0621bc7f762bd441b4539", size = 28169 }, ] [[package]] name = "testcontainers" version = "4.9.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docker" }, { name = "python-dotenv" }, { name = "typing-extensions" }, { name = "urllib3" }, { name = "wrapt" }, ] sdist = { url = "https://files.pythonhosted.org/packages/2e/9a/e1ac5231231192b39302fcad7de2c0dbfc718c0636d7e28917c30ec57c41/testcontainers-4.9.0.tar.gz", hash = "sha256:2cd6af070109ff68c1ab5389dc89c86c2dc3ab30a21ca734b2cb8f0f80ad479e", size = 64612 } wheels = [ { url = "https://files.pythonhosted.org/packages/3e/f8/6425ff800894784160290bcb9737878d910b6da6a08633bfe7f2ed8c9ae3/testcontainers-4.9.0-py3-none-any.whl", hash = "sha256:c6fee929990972c40bf6b91b7072c94064ff3649b405a14fde0274c8b2479d32", size = 105324 }, ] [[package]] name = "tomli" version = "2.2.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175 } wheels = [ { url = "https://files.pythonhosted.org/packages/43/ca/75707e6efa2b37c77dadb324ae7d9571cb424e61ea73fad7c56c2d14527f/tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", size = 131077 }, { url = "https://files.pythonhosted.org/packages/c7/16/51ae563a8615d472fdbffc43a3f3d46588c264ac4f024f63f01283becfbb/tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", size = 123429 }, { url = "https://files.pythonhosted.org/packages/f1/dd/4f6cd1e7b160041db83c694abc78e100473c15d54620083dbd5aae7b990e/tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", size = 226067 }, { url = "https://files.pythonhosted.org/packages/a9/6b/c54ede5dc70d648cc6361eaf429304b02f2871a345bbdd51e993d6cdf550/tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", size = 236030 }, { url = "https://files.pythonhosted.org/packages/1f/47/999514fa49cfaf7a92c805a86c3c43f4215621855d151b61c602abb38091/tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", size = 240898 }, { url = "https://files.pythonhosted.org/packages/73/41/0a01279a7ae09ee1573b423318e7934674ce06eb33f50936655071d81a24/tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", size = 229894 }, { url = "https://files.pythonhosted.org/packages/55/18/5d8bc5b0a0362311ce4d18830a5d28943667599a60d20118074ea1b01bb7/tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", size = 245319 }, { url = "https://files.pythonhosted.org/packages/92/a3/7ade0576d17f3cdf5ff44d61390d4b3febb8a9fc2b480c75c47ea048c646/tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", size = 238273 }, { url = "https://files.pythonhosted.org/packages/72/6f/fa64ef058ac1446a1e51110c375339b3ec6be245af9d14c87c4a6412dd32/tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", size = 98310 }, { url = "https://files.pythonhosted.org/packages/6a/1c/4a2dcde4a51b81be3530565e92eda625d94dafb46dbeb15069df4caffc34/tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", size = 108309 }, { url = "https://files.pythonhosted.org/packages/52/e1/f8af4c2fcde17500422858155aeb0d7e93477a0d59a98e56cbfe75070fd0/tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", size = 132762 }, { url = "https://files.pythonhosted.org/packages/03/b8/152c68bb84fc00396b83e7bbddd5ec0bd3dd409db4195e2a9b3e398ad2e3/tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", size = 123453 }, { url = "https://files.pythonhosted.org/packages/c8/d6/fc9267af9166f79ac528ff7e8c55c8181ded34eb4b0e93daa767b8841573/tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", size = 233486 }, { url = "https://files.pythonhosted.org/packages/5c/51/51c3f2884d7bab89af25f678447ea7d297b53b5a3b5730a7cb2ef6069f07/tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", size = 242349 }, { url = "https://files.pythonhosted.org/packages/ab/df/bfa89627d13a5cc22402e441e8a931ef2108403db390ff3345c05253935e/tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", size = 252159 }, { url = "https://files.pythonhosted.org/packages/9e/6e/fa2b916dced65763a5168c6ccb91066f7639bdc88b48adda990db10c8c0b/tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", size = 237243 }, { url = "https://files.pythonhosted.org/packages/b4/04/885d3b1f650e1153cbb93a6a9782c58a972b94ea4483ae4ac5cedd5e4a09/tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", size = 259645 }, { url = "https://files.pythonhosted.org/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", size = 244584 }, { url = "https://files.pythonhosted.org/packages/1c/9a/47c0449b98e6e7d1be6cbac02f93dd79003234ddc4aaab6ba07a9a7482e2/tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", size = 98875 }, { url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", size = 109418 }, { url = "https://files.pythonhosted.org/packages/04/90/2ee5f2e0362cb8a0b6499dc44f4d7d48f8fff06d28ba46e6f1eaa61a1388/tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7", size = 132708 }, { url = "https://files.pythonhosted.org/packages/c0/ec/46b4108816de6b385141f082ba99e315501ccd0a2ea23db4a100dd3990ea/tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", size = 123582 }, { url = "https://files.pythonhosted.org/packages/a0/bd/b470466d0137b37b68d24556c38a0cc819e8febe392d5b199dcd7f578365/tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", size = 232543 }, { url = "https://files.pythonhosted.org/packages/d9/e5/82e80ff3b751373f7cead2815bcbe2d51c895b3c990686741a8e56ec42ab/tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", size = 241691 }, { url = "https://files.pythonhosted.org/packages/05/7e/2a110bc2713557d6a1bfb06af23dd01e7dde52b6ee7dadc589868f9abfac/tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", size = 251170 }, { url = "https://files.pythonhosted.org/packages/64/7b/22d713946efe00e0adbcdfd6d1aa119ae03fd0b60ebed51ebb3fa9f5a2e5/tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", size = 236530 }, { url = "https://files.pythonhosted.org/packages/38/31/3a76f67da4b0cf37b742ca76beaf819dca0ebef26d78fc794a576e08accf/tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", size = 258666 }, { url = "https://files.pythonhosted.org/packages/07/10/5af1293da642aded87e8a988753945d0cf7e00a9452d3911dd3bb354c9e2/tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", size = 243954 }, { url = "https://files.pythonhosted.org/packages/5b/b9/1ed31d167be802da0fc95020d04cd27b7d7065cc6fbefdd2f9186f60d7bd/tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", size = 98724 }, { url = "https://files.pythonhosted.org/packages/c7/32/b0963458706accd9afcfeb867c0f9175a741bf7b19cd424230714d722198/tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", size = 109383 }, { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257 }, ] [[package]] name = "typing-extensions" version = "4.12.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 } wheels = [ { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, ] [[package]] name = "urllib3" version = "2.2.3" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/ed/63/22ba4ebfe7430b76388e7cd448d5478814d3032121827c12a2cc287e2260/urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9", size = 300677 } wheels = [ { url = "https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", size = 126338 }, ] [[package]] name = "uvicorn" version = "0.34.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "h11" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/4b/4d/938bd85e5bf2edeec766267a5015ad969730bb91e31b44021dfe8b22df6c/uvicorn-0.34.0.tar.gz", hash = "sha256:404051050cd7e905de2c9a7e61790943440b3416f49cb409f965d9dcd0fa73e9", size = 76568 } wheels = [ { url = "https://files.pythonhosted.org/packages/61/14/33a3a1352cfa71812a3a21e8c9bfb83f60b0011f5e36f2b1399d51928209/uvicorn-0.34.0-py3-none-any.whl", hash = "sha256:023dc038422502fa28a09c7a30bf2b6991512da7dcdb8fd35fe57cfc154126f4", size = 62315 }, ] [[package]] name = "wrapt" version = "1.17.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/24/a1/fc03dca9b0432725c2e8cdbf91a349d2194cf03d8523c124faebe581de09/wrapt-1.17.0.tar.gz", hash = "sha256:16187aa2317c731170a88ef35e8937ae0f533c402872c1ee5e6d079fcf320801", size = 55542 } wheels = [ { url = "https://files.pythonhosted.org/packages/99/f9/85220321e9bb1a5f72ccce6604395ae75fcb463d87dad0014dc1010bd1f1/wrapt-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a0c23b8319848426f305f9cb0c98a6e32ee68a36264f45948ccf8e7d2b941f8", size = 38766 }, { url = "https://files.pythonhosted.org/packages/ff/71/ff624ff3bde91ceb65db6952cdf8947bc0111d91bd2359343bc2fa7c57fd/wrapt-1.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1ca5f060e205f72bec57faae5bd817a1560fcfc4af03f414b08fa29106b7e2d", size = 83262 }, { url = "https://files.pythonhosted.org/packages/9f/0a/814d4a121a643af99cfe55a43e9e6dd08f4a47cdac8e8f0912c018794715/wrapt-1.17.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e185ec6060e301a7e5f8461c86fb3640a7beb1a0f0208ffde7a65ec4074931df", size = 74990 }, { url = "https://files.pythonhosted.org/packages/cd/c7/b8c89bf5ca5c4e6a2d0565d149d549cdb4cffb8916d1d1b546b62fb79281/wrapt-1.17.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb90765dd91aed05b53cd7a87bd7f5c188fcd95960914bae0d32c5e7f899719d", size = 82712 }, { url = "https://files.pythonhosted.org/packages/19/7c/5977aefa8460906c1ff914fd42b11cf6c09ded5388e46e1cc6cea4ab15e9/wrapt-1.17.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:879591c2b5ab0a7184258274c42a126b74a2c3d5a329df16d69f9cee07bba6ea", size = 81705 }, { url = "https://files.pythonhosted.org/packages/ae/e7/233402d7bd805096bb4a8ec471f5a141421a01de3c8c957cce569772c056/wrapt-1.17.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fce6fee67c318fdfb7f285c29a82d84782ae2579c0e1b385b7f36c6e8074fffb", size = 74636 }, { url = "https://files.pythonhosted.org/packages/93/81/b6c32d8387d9cfbc0134f01585dee7583315c3b46dfd3ae64d47693cd078/wrapt-1.17.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0698d3a86f68abc894d537887b9bbf84d29bcfbc759e23f4644be27acf6da301", size = 81299 }, { url = "https://files.pythonhosted.org/packages/d1/c3/1fae15d453468c98f09519076f8d401b476d18d8d94379e839eed14c4c8b/wrapt-1.17.0-cp310-cp310-win32.whl", hash = "sha256:69d093792dc34a9c4c8a70e4973a3361c7a7578e9cd86961b2bbf38ca71e4e22", size = 36425 }, { url = "https://files.pythonhosted.org/packages/c6/f4/77e0886c95556f2b4caa8908ea8eb85f713fc68296a2113f8c63d50fe0fb/wrapt-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:f28b29dc158ca5d6ac396c8e0a2ef45c4e97bb7e65522bfc04c989e6fe814575", size = 38748 }, { url = "https://files.pythonhosted.org/packages/0e/40/def56538acddc2f764c157d565b9f989072a1d2f2a8e384324e2e104fc7d/wrapt-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:74bf625b1b4caaa7bad51d9003f8b07a468a704e0644a700e936c357c17dd45a", size = 38766 }, { url = "https://files.pythonhosted.org/packages/89/e2/8c299f384ae4364193724e2adad99f9504599d02a73ec9199bf3f406549d/wrapt-1.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f2a28eb35cf99d5f5bd12f5dd44a0f41d206db226535b37b0c60e9da162c3ed", size = 83730 }, { url = "https://files.pythonhosted.org/packages/29/ef/fcdb776b12df5ea7180d065b28fa6bb27ac785dddcd7202a0b6962bbdb47/wrapt-1.17.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81b1289e99cf4bad07c23393ab447e5e96db0ab50974a280f7954b071d41b489", size = 75470 }, { url = "https://files.pythonhosted.org/packages/55/b5/698bd0bf9fbb3ddb3a2feefbb7ad0dea1205f5d7d05b9cbab54f5db731aa/wrapt-1.17.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f2939cd4a2a52ca32bc0b359015718472d7f6de870760342e7ba295be9ebaf9", size = 83168 }, { url = "https://files.pythonhosted.org/packages/ce/07/701a5cee28cb4d5df030d4b2649319e36f3d9fdd8000ef1d84eb06b9860d/wrapt-1.17.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6a9653131bda68a1f029c52157fd81e11f07d485df55410401f745007bd6d339", size = 82307 }, { url = "https://files.pythonhosted.org/packages/42/92/c48ba92cda6f74cb914dc3c5bba9650dc80b790e121c4b987f3a46b028f5/wrapt-1.17.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4e4b4385363de9052dac1a67bfb535c376f3d19c238b5f36bddc95efae15e12d", size = 75101 }, { url = "https://files.pythonhosted.org/packages/8a/0a/9276d3269334138b88a2947efaaf6335f61d547698e50dff672ade24f2c6/wrapt-1.17.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bdf62d25234290db1837875d4dceb2151e4ea7f9fff2ed41c0fde23ed542eb5b", size = 81835 }, { url = "https://files.pythonhosted.org/packages/b9/4c/39595e692753ef656ea94b51382cc9aea662fef59d7910128f5906486f0e/wrapt-1.17.0-cp311-cp311-win32.whl", hash = "sha256:5d8fd17635b262448ab8f99230fe4dac991af1dabdbb92f7a70a6afac8a7e346", size = 36412 }, { url = "https://files.pythonhosted.org/packages/63/bb/c293a67fb765a2ada48f48cd0f2bb957da8161439da4c03ea123b9894c02/wrapt-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:92a3d214d5e53cb1db8b015f30d544bc9d3f7179a05feb8f16df713cecc2620a", size = 38744 }, { url = "https://files.pythonhosted.org/packages/85/82/518605474beafff11f1a34759f6410ab429abff9f7881858a447e0d20712/wrapt-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:89fc28495896097622c3fc238915c79365dd0ede02f9a82ce436b13bd0ab7569", size = 38904 }, { url = "https://files.pythonhosted.org/packages/80/6c/17c3b2fed28edfd96d8417c865ef0b4c955dc52c4e375d86f459f14340f1/wrapt-1.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:875d240fdbdbe9e11f9831901fb8719da0bd4e6131f83aa9f69b96d18fae7504", size = 88622 }, { url = "https://files.pythonhosted.org/packages/4a/11/60ecdf3b0fd3dca18978d89acb5d095a05f23299216e925fcd2717c81d93/wrapt-1.17.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5ed16d95fd142e9c72b6c10b06514ad30e846a0d0917ab406186541fe68b451", size = 80920 }, { url = "https://files.pythonhosted.org/packages/d2/50/dbef1a651578a3520d4534c1e434989e3620380c1ad97e309576b47f0ada/wrapt-1.17.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18b956061b8db634120b58f668592a772e87e2e78bc1f6a906cfcaa0cc7991c1", size = 89170 }, { url = "https://files.pythonhosted.org/packages/44/a2/78c5956bf39955288c9e0dd62e807b308c3aa15a0f611fbff52aa8d6b5ea/wrapt-1.17.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:daba396199399ccabafbfc509037ac635a6bc18510ad1add8fd16d4739cdd106", size = 86748 }, { url = "https://files.pythonhosted.org/packages/99/49/2ee413c78fc0bdfebe5bee590bf3becdc1fab0096a7a9c3b5c9666b2415f/wrapt-1.17.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4d63f4d446e10ad19ed01188d6c1e1bb134cde8c18b0aa2acfd973d41fcc5ada", size = 79734 }, { url = "https://files.pythonhosted.org/packages/c0/8c/4221b7b270e36be90f0930fe15a4755a6ea24093f90b510166e9ed7861ea/wrapt-1.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8a5e7cc39a45fc430af1aefc4d77ee6bad72c5bcdb1322cfde852c15192b8bd4", size = 87552 }, { url = "https://files.pythonhosted.org/packages/4c/6b/1aaccf3efe58eb95e10ce8e77c8909b7a6b0da93449a92c4e6d6d10b3a3d/wrapt-1.17.0-cp312-cp312-win32.whl", hash = "sha256:0a0a1a1ec28b641f2a3a2c35cbe86c00051c04fffcfcc577ffcdd707df3f8635", size = 36647 }, { url = "https://files.pythonhosted.org/packages/b3/4f/243f88ac49df005b9129194c6511b3642818b3e6271ddea47a15e2ee4934/wrapt-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:3c34f6896a01b84bab196f7119770fd8466c8ae3dfa73c59c0bb281e7b588ce7", size = 38830 }, { url = "https://files.pythonhosted.org/packages/67/9c/38294e1bb92b055222d1b8b6591604ca4468b77b1250f59c15256437644f/wrapt-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:714c12485aa52efbc0fc0ade1e9ab3a70343db82627f90f2ecbc898fdf0bb181", size = 38904 }, { url = "https://files.pythonhosted.org/packages/78/b6/76597fb362cbf8913a481d41b14b049a8813cd402a5d2f84e57957c813ae/wrapt-1.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da427d311782324a376cacb47c1a4adc43f99fd9d996ffc1b3e8529c4074d393", size = 88608 }, { url = "https://files.pythonhosted.org/packages/bc/69/b500884e45b3881926b5f69188dc542fb5880019d15c8a0df1ab1dfda1f7/wrapt-1.17.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba1739fb38441a27a676f4de4123d3e858e494fac05868b7a281c0a383c098f4", size = 80879 }, { url = "https://files.pythonhosted.org/packages/52/31/f4cc58afe29eab8a50ac5969963010c8b60987e719c478a5024bce39bc42/wrapt-1.17.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e711fc1acc7468463bc084d1b68561e40d1eaa135d8c509a65dd534403d83d7b", size = 89119 }, { url = "https://files.pythonhosted.org/packages/aa/9c/05ab6bf75dbae7a9d34975fb6ee577e086c1c26cde3b6cf6051726d33c7c/wrapt-1.17.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:140ea00c87fafc42739bd74a94a5a9003f8e72c27c47cd4f61d8e05e6dec8721", size = 86778 }, { url = "https://files.pythonhosted.org/packages/0e/6c/4b8d42e3db355603d35fe5c9db79c28f2472a6fd1ccf4dc25ae46739672a/wrapt-1.17.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:73a96fd11d2b2e77d623a7f26e004cc31f131a365add1ce1ce9a19e55a1eef90", size = 79793 }, { url = "https://files.pythonhosted.org/packages/69/23/90e3a2ee210c0843b2c2a49b3b97ffcf9cad1387cb18cbeef9218631ed5a/wrapt-1.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0b48554952f0f387984da81ccfa73b62e52817a4386d070c75e4db7d43a28c4a", size = 87606 }, { url = "https://files.pythonhosted.org/packages/5f/06/3683126491ca787d8d71d8d340e775d40767c5efedb35039d987203393b7/wrapt-1.17.0-cp313-cp313-win32.whl", hash = "sha256:498fec8da10e3e62edd1e7368f4b24aa362ac0ad931e678332d1b209aec93045", size = 36651 }, { url = "https://files.pythonhosted.org/packages/f1/bc/3bf6d2ca0d2c030d324ef9272bea0a8fdaff68f3d1fa7be7a61da88e51f7/wrapt-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:fd136bb85f4568fffca995bd3c8d52080b1e5b225dbf1c2b17b66b4c5fa02838", size = 38835 }, { url = "https://files.pythonhosted.org/packages/ce/b5/251165c232d87197a81cd362eeb5104d661a2dd3aa1f0b33e4bf61dda8b8/wrapt-1.17.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:17fcf043d0b4724858f25b8826c36e08f9fb2e475410bece0ec44a22d533da9b", size = 40146 }, { url = "https://files.pythonhosted.org/packages/89/33/1e1bdd3e866eeb73d8c4755db1ceb8a80d5bd51ee4648b3f2247adec4e67/wrapt-1.17.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4a557d97f12813dc5e18dad9fa765ae44ddd56a672bb5de4825527c847d6379", size = 113444 }, { url = "https://files.pythonhosted.org/packages/9f/7c/94f53b065a43f5dc1fbdd8b80fd8f41284315b543805c956619c0b8d92f0/wrapt-1.17.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0229b247b0fc7dee0d36176cbb79dbaf2a9eb7ecc50ec3121f40ef443155fb1d", size = 101246 }, { url = "https://files.pythonhosted.org/packages/62/5d/640360baac6ea6018ed5e34e6e80e33cfbae2aefde24f117587cd5efd4b7/wrapt-1.17.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8425cfce27b8b20c9b89d77fb50e368d8306a90bf2b6eef2cdf5cd5083adf83f", size = 109320 }, { url = "https://files.pythonhosted.org/packages/e3/cf/6c7a00ae86a2e9482c91170aefe93f4ccda06c1ac86c4de637c69133da59/wrapt-1.17.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9c900108df470060174108012de06d45f514aa4ec21a191e7ab42988ff42a86c", size = 110193 }, { url = "https://files.pythonhosted.org/packages/cd/cc/aa718df0d20287e8f953ce0e2f70c0af0fba1d3c367db7ee8bdc46ea7003/wrapt-1.17.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:4e547b447073fc0dbfcbff15154c1be8823d10dab4ad401bdb1575e3fdedff1b", size = 100460 }, { url = "https://files.pythonhosted.org/packages/f7/16/9f3ac99fe1f6caaa789d67b4e3c562898b532c250769f5255fa8b8b93983/wrapt-1.17.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:914f66f3b6fc7b915d46c1cc424bc2441841083de01b90f9e81109c9759e43ab", size = 106347 }, { url = "https://files.pythonhosted.org/packages/64/85/c77a331b2c06af49a687f8b926fc2d111047a51e6f0b0a4baa01ff3a673a/wrapt-1.17.0-cp313-cp313t-win32.whl", hash = "sha256:a4192b45dff127c7d69b3bdfb4d3e47b64179a0b9900b6351859f3001397dabf", size = 37971 }, { url = "https://files.pythonhosted.org/packages/05/9b/b2469f8be9efed24283fd7b9eeb8e913e9bc0715cf919ea8645e428ab7af/wrapt-1.17.0-cp313-cp313t-win_amd64.whl", hash = "sha256:4f643df3d4419ea3f856c5c3f40fec1d65ea2e89ec812c83f7767c8730f9827a", size = 40755 }, { url = "https://files.pythonhosted.org/packages/89/03/518069f0708573c02cbba3a3e452be3642dc7d984d0a03a47e0850e2fb05/wrapt-1.17.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d751300b94e35b6016d4b1e7d0e7bbc3b5e1751e2405ef908316c2a9024008a1", size = 38765 }, { url = "https://files.pythonhosted.org/packages/60/01/12dd81522f8c1c953e98e2cbf356ff44fbb06ef0f7523cd622ac06ad7f03/wrapt-1.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7264cbb4a18dc4acfd73b63e4bcfec9c9802614572025bdd44d0721983fc1d9c", size = 83012 }, { url = "https://files.pythonhosted.org/packages/c4/2d/9853fe0009271b2841f839eb0e707c6b4307d169375f26c58812ecf4fd71/wrapt-1.17.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33539c6f5b96cf0b1105a0ff4cf5db9332e773bb521cc804a90e58dc49b10578", size = 74759 }, { url = "https://files.pythonhosted.org/packages/94/5c/03c911442b01b50e364572581430e12f82c3f5ea74d302907c1449d7ba36/wrapt-1.17.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c30970bdee1cad6a8da2044febd824ef6dc4cc0b19e39af3085c763fdec7de33", size = 82540 }, { url = "https://files.pythonhosted.org/packages/52/e0/ef637448514295a6b3a01cf1dff417e081e7b8cf1eb712839962459af1f6/wrapt-1.17.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bc7f729a72b16ee21795a943f85c6244971724819819a41ddbaeb691b2dd85ad", size = 81461 }, { url = "https://files.pythonhosted.org/packages/7f/44/8b7d417c3aae3a35ccfe361375ee3e452901c91062e5462e1aeef98255e8/wrapt-1.17.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:6ff02a91c4fc9b6a94e1c9c20f62ea06a7e375f42fe57587f004d1078ac86ca9", size = 74380 }, { url = "https://files.pythonhosted.org/packages/af/a9/e65406a9c3a99162055efcb6bf5e0261924381228c0a7608066805da03df/wrapt-1.17.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2dfb7cff84e72e7bf975b06b4989477873dcf160b2fd89959c629535df53d4e0", size = 81057 }, { url = "https://files.pythonhosted.org/packages/55/0c/111d42fb658a2f9ed7024cd5e57c08521d61646a256a3946db7d500c1551/wrapt-1.17.0-cp39-cp39-win32.whl", hash = "sha256:2399408ac33ffd5b200480ee858baa58d77dd30e0dd0cab6a8a9547135f30a88", size = 36415 }, { url = "https://files.pythonhosted.org/packages/00/33/e7b14a7c06cedfaae064f34e95c95350de7cc10187ac173743e30a956b30/wrapt-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:4f763a29ee6a20c529496a20a7bcb16a73de27f5da6a843249c7047daf135977", size = 38742 }, { url = "https://files.pythonhosted.org/packages/4b/d9/a8ba5e9507a9af1917285d118388c5eb7a81834873f45df213a6fe923774/wrapt-1.17.0-py3-none-any.whl", hash = "sha256:d2c63b93548eda58abf5188e505ffed0229bf675f7c3090f8e36ad55b8cbc371", size = 23592 }, ] [[package]] name = "zipp" version = "3.21.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/3f/50/bad581df71744867e9468ebd0bcd6505de3b275e06f202c2cb016e3ff56f/zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4", size = 24545 } wheels = [ { url = "https://files.pythonhosted.org/packages/b7/1a/7e4798e9339adc931158c9d69ecc34f5e6791489d469f5e50ec15e35f458/zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931", size = 9630 }, ] python-sse-starlette-2.3.4/LICENSE0000664000175000017500000000274715005737564016503 0ustar katharakatharaCopyright © 2020, [sysid](https://sysid.github.io/). 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 the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. python-sse-starlette-2.3.4/AUTHORS0000664000175000017500000000061315005737564016534 0ustar katharakatharasysid synodriver Skyler Lewis Margret `Pax` Williams nekonoshiri justindujardin Håvard Thom <34199185+havardthom@users.noreply.github.com> Vaibhav Mule issmirnov Cyprien python-sse-starlette-2.3.4/scripts/0000775000175000017500000000000015005737564017153 5ustar katharakatharapython-sse-starlette-2.3.4/scripts/lint0000775000175000017500000000043615005737564020052 0ustar katharakathara#!/bin/sh -e export PACKAGE=sentry_asgi export PREFIX="" if [ -d 'venv' ] ; then export PREFIX="venv/bin/" fi set -x ${PREFIX}black $PACKAGE tests ${PREFIX}isort --multi-line=3 --trailing-comma --force-grid-wrap=0 --combine-as --line-width 88 --recursive --apply $PACKAGE tests python-sse-starlette-2.3.4/scripts/test0000775000175000017500000000060715005737564020063 0ustar katharakathara#!/bin/sh -e export PACKAGE="sse_starlette" export PREFIX="" if [ -d 'venv' ] ; then export PREFIX="venv/bin/" fi set -x PYTHONPATH=. ${PREFIX}pytest --ignore venv --cov=$PACKAGE --cov=tests --cov-report=term-missing ${@} ${PREFIX}black $PACKAGE tests --check ${PREFIX}isort --multi-line=3 --trailing-comma --force-grid-wrap=0 --combine-as --line-width 88 --check-only $PACKAGE tests python-sse-starlette-2.3.4/scripts/README.md0000664000175000017500000000041215005737564020427 0ustar katharakathara# Development Scripts * `scripts/test` - Run the test suite. * `scripts/lint` - Run the code linting. * `scripts/publish` - Publish the latest version to PyPI. Styled after GitHub's ["Scripts to Rule Them All"](https://github.com/github/scripts-to-rule-them-all). python-sse-starlette-2.3.4/scripts/publish0000775000175000017500000000125615005737564020553 0ustar katharakathara#!/bin/sh -e export VERSION=`cat sse_starlette/__init__.py | grep __version__ | sed "s/__version__ = //" | sed "s/'//g"` export PREFIX="" if [ -d 'venv' ] ; then export PREFIX="venv/bin/" fi if ! command -v "${PREFIX}twine" &>/dev/null ; then echo "Unable to find the 'twine' command." echo "Install from PyPI, using '${PREFIX}pip install twine'." exit 1 fi find sse_starlette -type f -name "*.py[co]" -delete find sse_starlette -type d -name __pycache__ -delete ${PREFIX}python setup.py sdist ${PREFIX}twine upload dist/* echo "You probably want to also tag the version now:" echo "git tag -a ${VERSION} -m 'version ${VERSION}'" echo "git push --tags" rm -r dist python-sse-starlette-2.3.4/Makefile0000664000175000017500000001312415005737564017125 0ustar katharakathara.DEFAULT_GOAL := help # You can set these variables from the command line, and also from the environment for the first two. SOURCEDIR = source BUILDDIR = build MAKE = make VERSION = $(shell cat VERSION) PACKAGE_NAME = sse-starlette app_root := $(if $(PROJ_DIR),$(PROJ_DIR),$(CURDIR)) pkg_src = $(app_root)/sse_starlette tests_src = $(app_root)/tests .PHONY: all all: clean build publish ## Build and publish @echo "--------------------------------------------------------------------------------" @echo "-M- building and distributing" @echo "--------------------------------------------------------------------------------" ################################################################################ # Development \ DEVELOP: ## ############################################################ build-docker: ## build docker image @echo "building docker image" docker build --platform linux/amd64 --progress=plain -t sse_starlette . #docker tag $(IMAGE_NAME) 339712820866.dkr.ecr.eu-central-1.amazonaws.com/sse-starlette/sse-starlette:latest ################################################################################ # Building, Deploying \ BUILDING: ## ############################################################ .PHONY: build build: clean format ## format and build @echo "building" python -m build .PHONY: publish publish: ## publish @echo "upload to Pypi" twine upload --verbose dist/* .PHONY: bump-major bump-major: check-github-token ## bump-major, tag and push bump-my-version bump --commit --tag major git push git push --tags @$(MAKE) create-release .PHONY: bump-minor bump-minor: check-github-token ## bump-minor, tag and push bump-my-version bump --commit --tag minor git push git push --tags @$(MAKE) create-release .PHONY: bump-patch bump-patch: check-github-token ## bump-patch, tag and push bump-my-version bump --commit --tag patch git push git push --tags @$(MAKE) create-release .PHONY: create-release create-release: check-github-token ## create a release on GitHub via the gh cli @if ! command -v gh &>/dev/null; then \ echo "You do not have the GitHub CLI (gh) installed. Please create the release manually."; \ exit 1; \ else \ echo "Creating GitHub release for v$(VERSION)"; \ gh release create "v$(VERSION)" --generate-notes; \ fi .PHONY: check-github-token check-github-token: ## Check if GITHUB_TOKEN is set @if [ -z "$$GITHUB_TOKEN" ]; then \ echo "GITHUB_TOKEN is not set. Please export your GitHub token before running this command."; \ exit 1; \ fi @echo "GITHUB_TOKEN is set" ################################################################################ # Testing \ TESTING: ## ############################################################ .PHONY: test test: test-unit test-docker ## run tests #python -m pytest -ra --junitxml=report.xml --cov-config=pyproject.toml --cov-report=xml --cov-report term --cov=$(pkg_src) tests/ #RUN_ENV=local python -m pytest -m "not (experimentation)" --cov-config=pyproject.toml --cov-report=html --cov-report=term --cov=$(pkg_src) tests : .PHONY: test-unit test-unit: ## run all tests except "integration" marked RUN_ENV=local python -m pytest -m "not (integration or experimentation)" --cov-config=pyproject.toml --cov-report=html --cov-report=term --cov=$(pkg_src) tests .PHONY: test-docker test-docker: ## test-docker (docker desktop: advanced settings) @if [ -S /var/run/docker.sock > /dev/null 2>&1 ]; then \ echo "Running docker tests because /var/run/docker.docker exists..."; \ RUN_ENV=local python -m pytest -m "integration" tests; \ else \ echo "Skipping tests: /var/run/docker.sock does not exist."; \ fi .PHONY: tox tox: ## Run tox tox ################################################################################ # Code Quality \ QUALITY: ## ############################################################ .PHONY: format format: ## perform ruff formatting @ruff format $(pkg_src) $(tests_src) .PHONY: format-check format-check: ## perform black formatting @ruff format --check $(pkg_src) $(tests_src) .PHONY: style style: sort-imports format ## perform code style format .PHONY: lint lint: ## check style with ruff ruff check $(pkg_src) $(tests_src) .PHONY: mypy mypy: ## check type hint annotations @mypy --config-file pyproject.toml --install-types --non-interactive $(pkg_src) ################################################################################ # Clean \ CLEAN: ## ############################################################ .PHONY: clean clean: clean-build clean-pyc ## remove all build, test, coverage and Python artifacts .PHONY: clean-build clean-build: ## remove build artifacts rm -fr build/ rm -fr dist/ rm -fr .eggs/ find . \( -path ./env -o -path ./venv -o -path ./.env -o -path ./.venv \) -prune -o -name '*.egg-info' -exec rm -fr {} + find . \( -path ./env -o -path ./venv -o -path ./.env -o -path ./.venv \) -prune -o -name '*.egg' -exec rm -f {} + .PHONY: clean-pyc clean-pyc: ## remove Python file artifacts find . -name '*.pyc' -exec rm -f {} + find . -name '*.pyo' -exec rm -f {} + find . -name '*~' -exec rm -f {} + find . -name '__pycache__' -exec rm -fr {} + ################################################################################ # Misc \ MISC: ## ############################################################ define PRINT_HELP_PYSCRIPT import re, sys for line in sys.stdin: match = re.match(r'^([a-zA-Z0-9_-]+):.*?## (.*)$$', line) if match: target, help = match.groups() print("\033[36m%-20s\033[0m %s" % (target, help)) endef export PRINT_HELP_PYSCRIPT .PHONY: help help: @python -c "$$PRINT_HELP_PYSCRIPT" < $(MAKEFILE_LIST) python-sse-starlette-2.3.4/output.png0000664000175000017500000010741615005737564017543 0ustar katharakatharaPNG  IHDRDGWBgAMA a cHRMz&u0`:pQ<bKGDIDATx}wE=)P(ذa((6EUE齗Z %~1[s sٳ;;3;wO=«9N=6 z9A@IRx `f|ɑ~ [G#s%_ɀ}CPŚoMDᐹASLMc6 C]qI]wDE]$"Skn#c-Fƌ5qGZ)%!H4t-M/%?ˆt*a)2Iu>No5#4/d `[p{~hvtğ}c^xl{'P$nrLkpmPӳXe 'rGCh.x 8#~2}1Qph"d7Nكyjް| hdEy -3&"&\IM~QΠ7azW &j((: 0OL f\i?Go[΋;M&%~yywׄ&-E70%R_-|7L?KL$8)l}zDL֍ 0MWq=MdFچ[_9Zϭ:P2O"El$oh7^MYț/zLhM)|p o(5QP#-jt3HHhdԈKu8Cj"b[(37,AɉѬ88U{Jkknp%N@^oJO~WoFDHu?us>FgV|Vg-6pj] Ѥ]}Ne‘ߢ1F.tG !6kh-C 6uSJڢf˘Yazy?"?ڡZ'I_S1 !ș 4Pp6N 6Cq(ٯAz}ic?(dގ"oGMM|6mx$پ aE:8E+[dߌ[h\c;HտtƺA (USHxF"+Z9*-˲,KZea !eBf.1uوP[LPFoM?Yq9b'Ey&?et8ƏC?pσ6&t^'D؁F֡iw)J)U(B%AJhH*69#O,kGXf" ZGdC]_!=: '!r_%R38`J7`"" Rk=dyx WkSJ;D%dVG5~z#PD$deٶ-? bBy400.rɏ>u:D)ip?nÏ,Zk ƴSV#F^G9%5+Ӥ ZZ%G63L3,Y?rfui{P!["y3c"Rd2Y)$3;yfd^eEjJemmw;%v~Nz lYYK)]2!r9cgRek溗odH=BA$H0eYlx=1 #Y6mMuJ)!8ZyIR+I"tl+;F1-4dPTACςOW]uϿ": 4@BH+"Uy}[ l&i ²$-ˏ"`pid"^tx:QDR@ȐA#'<?RHFΧ$cÊ;+^V{g&[F'dGs]q ,|פ&L܏|#RQkח| _pjH(| m]?)ϝ90X72/GلRZH>Ϯ^ڲ &O>O~=xm$f(fufB4 NmzHuТd]"6:mcYv@uZ@B_:=ߦf#J 5O5,>D g]dJ%4zCd} {ҝǂkO^̧jHDüXɳ ׮] ~C>*B2d04K*֭[7vض6峚>B@[+ !Pk[Ss_O?t_Ҫ,YZZ};CmpQW+WI)/SKk֬?>=a7 R#}wq!D6I$0>xe\r̘1)S.\`#Ftt 7UvRkIT1oxAC]uUdL"m*6"@x" b&0 gTO0 F3f &Cq]J"`&߉Xw9)bc7&O!hs8͛6?OOk~~:e*3{"aZ5n&F|AHK^tE .6mgGB:[O5H@CIX/ᵙ9˧}f-)gBUbRyηN9oaҖ'p>'bCPC%wWΗ+}wqNyk&F뷗ܽjceY}o^L=tHE ;_Guج60.]?o>z<LV2@jTjP2J)ׯ[gҤI_>---u$Ԝչ PHBttt瞹lZ>Cj56 .@ Y,ki>7miB^1cSN9e=p]W+O/(F?IZi˲.䒅 N8;uqǏ_p᥿TJ{SDu|>k͖mST&") ̘1_mo|k_B >ɓJE !p4ztx|ms$%  XZ\@tUY*Y*el U;iAr͒@a%.k- &@: i6XDppzu !dYAe,\DBb x3BAk=w~_~u<'lʕۄ#%윯A_}}qy* TзWg>^=?5"c[>o~\Wћ]Hr6_:>ybunꪅb_Ǭ{>@_ҍ]3>sؘW{6۪RxӟDf&xK܌^Xlz(, ="F)F袋VY=i⤳:q@^?(*(U@DwJ5ޏ=Xww==, CgJrA>foת5)eVOO"!oߙLK.yOoƍ}?#駟NR(/ ^Ll[v{Kh:sQGQKKi) 'p?z衇: )>E%ZeG'Gv-zl;A,-Z]uȝwQo%WT۷.Z?/]zM\vŃƣ[5gק;dY{~|6}h է/=N>屮Z7]3O/_~xjYEFeD."H 䝧{W<?|l%ap{3_MKz/Y`jWf/_=tVgOW?wR0I?oziS<=jW+oLyo?냟?c/W;p |^xaAG}c{@bqOf<?GO*oŽt3=Q}7?gS7ۖa[l:h`־uUV?\nݔS8B+Y+MD%RLƲ,jBd̥Rɼq]R8NKKw0aBwWc=8ΰaä<ѳ=[*?p)e૯34BJYT)訏-$R̮RK/}vi9hRo{ƌ>/Z~rÂ/ 4tD+̙358?9Q9rČ3{9\5Gb,@B[sAeKzP"* 5Kuk/.LQ;=Vk:߶aӿcZz>L{Q_ʗ?Cf,?I88n7^y+]r˧'}TKjV5Y%- \ צO.|}?߶,'zX,"LMkX uZ.X4(,"S~ŭy `lvҲRZx*c7!JE$ BP.VYۖu?CLkokXj5#1k~a0N?t$Y1?ҥK<@˲!o !.B U̘1[o,[)% ͐ZjX~GMMNUOo_:nNV[rm/[`վZI*j%PYnm%RAZ[`w1rŵr-9KC L !4rK+r h3q>{رʹ[,ʥr;@)eҏiPV'h֌vu'|g{챇mJ)#$Jߧ)^ F{{QkBT/G4Q` PLe/ dR|>EHi$74N{AU.7xG1{ŋW*`rbOOʕ+weR Ѩg#5&")v93W_kP5-K?edūDkQP3EɐȘŮQ.qؽW9r_.36[yoS-Z5r w.$\שeIe,J*+5 vjs' ucF:qø}[߉s FϜ>kstWPS :[rr,]'ʛKy&L>Hڅ{ϜX{af.wA<ỏl\\%i´I-/&+y0eáѩE֚% d@Z;e܈˝nl O|m99fQûV.ϼ@?u0nݫWV{I"呻e;Vo[֒QHbz]Bd=iӦ[G?6"G(RtgZY '[㼆wj~ {x8A Yۺ'޿s??;zE?q#>CV9O|s?Coe> [ײ?8_?w-_ߛ'~tE?Ww#wk|6z[zqLTŜCʽz>>LzcC?|t󋮼>1e,%v~ew_#]/,}ڡCgF+z`oz̺… _[ꉅ wYu88"(V"ROg*@|n&,k T-|w;qZ ?pTu33d>я:s5踴'|)䟯sbj^\.ƞKC#/˜1cN:uc=V)Z,`;BD@f](G /DhsrYdܯ}m`)1| i}7o}ݷx뮻uvx7o޼cz5)[D"7:2`IP9 akm\2'4"LH$I뾂 $4|t(RhۥgCQ:~Ȁ}g` %oO$2/4Hz31k+u]wo` o|"4Jrs$x;$C -&ҝ]=8/="&r:)q5!Aٚd|Sh !VJmyɀ2)"F)e8DȐsz`ѳJ!ddͯǩ|!)A,K&ؼeU~)&H~AM0G^0!}eY o'k^$v]&KFeS` au4L$.>4ˮa `cmiurH$m JALyW]u?q?Z2B!5JȌ4 e+kET$í\HK%dD'p,`*"oGBi(V6R  Š#4CkE1_`fB ߖ_߁A@fRk&fm̨Qn֖_ǣ"$=k Q}:Ph|3;^[BԊb[[u53dBT.l 6CJ9J)<՝7%@ Qcna,MF8h2Q}`*- _!4&yCy34L?"sh-ջ*du)dVooO`/tHd&}nXEF)΋yl_tgSU&ڢ3W= އ%AJVj%l Y]݈!kޯg WcaԞy몱x9!Q"Z4 <<đ$2Jf%٥xN8NMϲOx8q&-Hn7$Q5uf)n^ (WecC[yM@:4'\sX&rOXQ_0Ų]MRcϷ&c RP3;>į7lL-^_1c(=Ѡl{lR}$Ruxm!gJ)fmY|ݨw8yEt݊`sR3A:s_9hI)WE/⋶"&] !I{D {:{DΊԋqabUeMe8mb0AL**D~ v]oKYPC%!b{3RA޻h8n d=WBrl6Y &9b)Ԛ)mߏېuU^S ]vM|Dѻ2B'F*L`5<>uP&NzrQYGj%Mǖ AS"o })1JDn(E7)ga1oqi)!^7+-9_a(C҅v(3.:C&mu m7MtO>P"_q+fІz}[3wo@,Ȗdki]Ud+a|1N߽ \.80ޱ\rf)X _J=_K1̈"2tI\iC~Mt{#zzcJv̎ЊOE Ҭ̈́yV/-AW3!M. ωO&)&{$v{`S<0$? ^F;'?$=KGÛ9?A+$jD^"A9p2s}$h jxY;@78qVR}¤ AR haU[`Xf`p7pQ檩-Yp[zW469OHejjޏ6 'bs)[_ĸ!7;xBW3!q>+.f)֘2qĿR4σ.+2\#1,c)SC̤4zAD$8`'L#H ŰFGC0#M-R/>Khply#W)C jH7š Mk"O,(HEl 1'ZQC 4<2 ^0dH$5uD$X7Y&C$G #nDϒqaPGf/ӣW pD0gSL;_36yZP=OHX%2e m_ (]WGh3 "BJH%uD0A";̏@1d/l(3J$ACl&Etk6Hؘ8ZVRI ʁrhfb'`0~2`4:NX+f"$H̊|wZrKuIh = OKQZ4("x!F?Pe;nqr{'rheGkX}%o4X 2)t%0H $Z=`[#mmmRSIP(O/ 2>BܬfUDt=3 -h*!)`ҧj|>_sj#A:U @3N4& LMQâZ0~>0mq4f0* Hhx!E2JS+ [ E|:KP~?:Q-/XQ)S}7L:`+, v@#Rחb3Jdb&GnW>BAI̷^>4`bv ^oZQ)v]vdSEi`A@MPGNLQ9t$?/b"}RH!/MDY+EW_`ϭ--R9SL&ZhѢE xvu< msv Ԅ@7hcT@/01l#V QdyO;<@ϨoP(K67Ot]wӦM~ۅ?=fd`vK:ЬBЄD7Oݛ&=ՍaA mb}}}O<uvv>S| #4"4$ϘB`ŰKµkT@IMWڿċ{FbZ;O9&1J$mAx!8eN.0H1xM Yu,>J&M8i5 -ZVd78%tLggyH tڒF`Ҧ$5G yzIl6dɒ%K[Bf"y☮\gJ-ƶ5Q;kZɹ(3zO0eq|un=3Ϳ^~Nq;9sJ^ԓOuvuU*Oy6o^s7nlimy{:=bg@5Φ2(c0ڟ{ GX,^{O=TwwLru]˖/^{wq#F׿{S*>{;|y_֭dЇ>1qDZl;6`4xZ@7:^{H&smmm3f( Zmܸq?e˖=l/#~>j:b9f e[ouu\'|rZ`u]v\.wGvay%zr\aú+Joo_ovXG=zB!_rlRif%.aaȐSysՒFNfWEaho+.kʭ.xI3eUWD_ > `ɐvW{窥r>M RetV'^BBmldc_s?,+ݻYkm։ k#z@Z+!N4*H$X C<Ґ=r8ktV:6%Z!h }dwKlذ:s.]:w\s櫯r'=༳:{vXxѣOԧc=v~[q5k=kr1h ~$/c*zoJR|>̧RJk̢gFqI'jWՑGywww4iAf M)+rZ)Û[K/}ꩧ[]lۮT*LX 7q% pÍ(/?6^c[Rjww=ܓfg̜aÆ_|GϘ1~on o+8C?._xa;ޱf͚|gN>ZyS / b@gXvg-uU(_x~;|Z=Ɣɓֆ}m jm]p`[oݞS|!R]wK-,^ŷtшrk-"x5DD3eԨk=&vN^d b- "]ՌZV ]k_FlO$HĞZ81zJL.99wt;r:LG +;Ǟsȓy[ih0#Qs(1ZXXL` eOjt{{7ݴ{ cnw}9s,V+=f̬Y2̼y_FL1bĬYwt^6l+~rOz{{+{1c ۶IPZ Dޘ⠰2[h\ 3k8RV7 Zk4m&Le.RJ]||绌\hсhŚi_Mf&JJnM>|V3%js\\ꪫ>?Os93\qIch>`=Jq΋zN3,ZoIqcȨiTk*7xAN}ݻ{zڹsf2[n TJj֖\6nZ-K3gJ)1p]bCky3֛)B7_vSf3r9|#E)ܓE=YhcGm]¸K5_1HEhg|#yCxuh)XjKٛnLuIZ@ֺ%el&ta4ln-F4ݩGm/HA!#GM@p&Ut'ƕe5Q-&iyڬQ=|K"LDw=S.,\BE 3k"Od4cqi}+W<{~G]8Prܼy֬YcZk)e6-Zv^sj{?3<㺮RJם ;ܽ(u*2WŪZka Adͮ1BjZM1f̘޶6o\Z "ɓ'>?O_mV11U*_~9c;ݱ_kmglTͩEMuCB7Kx#+?{w/˝wIZk\|򾾾+ZZL>}K˳׮];|4'kϽ._/"*ՊOz@1)͚p]5miwLd͌h_g7gΜ&OZ]dl1 YBv,Q#scн1֑-va`RjxN 4 f2,ZOY`uRKJVz[[{[[;Y(mԆ\ʽKf(*P@VFa^#zo|yIJk@2ϵ?m7:V])I  xoEhS 6XBS|6X)F|]H?l{33z%eKM>te7*+I4t"B-7ߜfpyJ5H{,˒ F>BGJj=9r9um>_^x7}ߧNL=xdG 'C@w *,/L^* 5+FpR 3 o|_+c,Xf}{{QO? iMۮmK.\xgXaÆ{|Μ9v~WjZkkkt3W2enSlQ!] R㒠w=qƗR~eٹ\Z*eFggO>1gJk֞D.Ї9bĜ9s85pl6@D3"Ic/=j2RJu_xr\Tz/-g֖\.rʗ/?nm{]vyᇖ/_>ͺ{a|Ǎ1bK+VKeqss̩Um۶mYVD%j5/.1T*mv|~ѢE|ae; a#9;C 3)-%ٓXջ',R*nJ6nN7)jNxDco֛oC3gN,z ^M[0^=z2ȑ#~??fiӦ} _?>3wqoiӦvamvm'L/|a=e":cX5\SV:5Jo6oh1DBJYY 6Z /&N: ;kYt1, 6cW Zl'Dn?g5Nn䀞/3wm i[6n=L6(m#>Qzܘ  !۪ݕu#U|.ŗ=QmYjpERhRlQVTdm8{< 3Ta:KGU;[X[]}+u[+݊keYI,98 Ĩ$>q#vwwQ^M[i}RS(Y7FsGR&t=|ψqj]td38ejZ0bNLFi5lذsqc~_omk+9Oiu.{r|PVۋRZ*nNDhB>ȣx"1Wg$M8裎 #`o|żK{z{䲹R<\.3z{{GY.2LXlkkfrqc;oiieÇkiiϏ73"9BQnrbhgl?ښʕ1۶*mZ~Sҗמ{T*e27gf#11Ę3ή뮻cimm5)xRknL\ѷ7ֵ*YJXmsWg=.`5לl4e8a=%.mWה@MURSyY7rp fײmZvr.ňowL&3[Gr[fM]R@!Z6I(!3j;uSfEmq B122 _s7,3~`KWGGt\s8l6X"z9Vt@kc?#'x/<`.H$u5[@Cx UTz ,Hʀy!;8ea,H$֬YpUV=z{̙343(\ADB` 5*"%pّhԏ0v"Q!MDmZiwV> XvfBvHTXT =a[L$ 43xn -O.&[ l:Eu+A |˒b d3jnR9tś-JDC"ﰈ&MXI@t7' "6]Ri o&=ؔ'ΩO`,P8 @ýhl5Dtfxc=~밅 _H 7gAZ; &/ku6P;p_D"pUZK-XDּIٟufցG9B !_!Mj45fc"d/Lhx]RXl%EO2#t&*ZǺQjOAEЧY6lxH\ܢD<_b^0b:4$kw&24%7Yx?8Pĵ ʹ3"^L-(J__#c<""Hb6R+ AS6#؃ύK D !( |#p'F:SPuAվِoOA]AD6 `j#,hu4ߺaxBh`?Ie!h?6!:\upǔL@4S fTꍀ%MwCP1=@xSOM8 @ešz  7s'S0ؾ-$KwicGoXy}$֟V6O#j#k2 ,"GjaP=dv [ *|$I҄(xow ,hwQ\ĪS4aĵ*>J(d)63PE{(ԯO>i\HY`p,#uLn;-3ľoR^PH}iŠӿM;ar`ǧQn1Si{ME䥑 6DR0k63CG|9FfW{ԡ?Pk)ol<72ǎDhT 8ӰF~JX JGqkxBZd#uW}9um^(jx&ңa !IOFB6-$ɭ4֒G{]tjOLК]2+H~OS?Q>ɳdv2ǯoQ%3HnJcly[OX/MD eob/݈v<յNLfƱ߅cS5(CVS7N Kz[%%@=^jNE48$Vώ8nxIHp@_sR'yGCedDGCE*JD8^qCE`&&h+%40x.\ACXꍰVXi>M>-A1q"V}C]c7u3 QEo~ycc6*{Sj-*zf %5 9&0s]VwӁ'pyUpt0,?٣ R;H@ B;41-©c10yMhrVZO~駛w9Fwa #*8{(x ?m_f7뜷x ꀸˬ޼B]9/hzPq!;زAr٤DQ% FM"+a`)R63qܷyJF٠'%ņ3P>3VO"EPLcN2F]8j FDȯ['MAݎRV*Eu:&Fd4CRCiyԄxRHuÊ.M$ 4/])%XM,/ƃwm`j泡9c0HNf$uu8%Hmk_*b `פKMb0C{2\Pm1$:R`)^H$F# b=l"̱ZoP;ר(g (EQb4!&A_ V $`Xx{NJgDk)Re( )n$$8uYѭdo. (6 &,l cf4XKO, q$HFDȩ:ZZd[dӘ"E7dF3\P0j[;L.'6̣9{<ߊH12x~l d<)5'y)bؾϜF|tj L"śdbDRhS~nTvPNj֘jUyT-8ղFTz @? D #nF%%eD"[9Gn2C^)RlhF ;N9drv>5E?=oڈq~yC'S{Wro~;{:gz;M2mK^Fy;;KpǓ+pMw!;:5_hW 8'UH#1S(-i>^YK&{{O4@߱kW{M\|v:'+-Y?@ j{yon.;keמYkYP m"i,':M`(Em͈4k|d/~[F7e ;O5SỞ]]km#G9+Ќd51sW+|k]N񚃁QڅMP$EnխU1Jb@ӣGjl]@0qKW=Ktߖ+ Y $j\U '_q—W婣2~)^E1H`ecHٶX0צ)E|5XA0+LW DET~^XxW~{EEY^&)Uc89gէf+:.SRX @0$@+3CAkaۖ vU.[=)RxML;ҟhbeM}{J'.##Ț{a+kp]E-gyXNv3o4H"@Ѐ.G_q!{ǯ?^W|Y};~%g2 DctG9Qvs Ҩ;9 Ði lɕ)RxbQDfr-EQH)RlH&FAjYI2 (P6it(W7Kiv`S '4 d J es]4֮ ^G{~.ZE%Ә"E7dbPpɎ?=_mm,^> FO5`g/yo?sg|9wig~ys4eZF-݂g^<&J2Z8ǧ+8g8w\@eSL$ g-QZ~玺wK_yť|R w9]ٷv?>~"Е^~{0K-W kR?Ůu}~*I6{VhYasSb0[ӣvusVu~ԧ|v5.H Ap*J.Uo~+O<ﱗVv-^%vr6# P 0)&وEQ?wpO?vH91"@BN~Y;[_FU믿M]UA]ffZh,{Q{?R\Fgswf;y3V_A$Jw|mf4Pد5Kb}9qٿFjTw"Ŷ:1͏,#WÕ3\O=W +?m;gڕRCWYg9|eK0:>~Wz&]L_g?'9~QFMc5 WFa.U% VxS.^|LĂ>)R!ŦyHC)VRX4q[Z}ڪ@V5E&T'pp{%5¶*9VU$ ڠt!w=ňF^-B[Vk匝Qr艙RHvD1pY b , 0i ׂKPF&fqg`K0fQ 1xZ2[ `|g2EoI A@B1 O(^}%<U% O&7bhx,L@LAR&?ߣI[ޣgS$?VCm?vf}b[$@4J?EmuՑOD Ɏ<6 #EDoфSpjJR1 ф1SW,'OfD(nt7N)Q8uFM!2̆Gb魣,RG\Óߨ^LDJR?12\j'JL̏xCPx94Dm}y,lSB"! I,k&8O32[)Rl݈ˉ_2d:5;:)Ҵ)Rlh T~8< ( r)M ?Jf1KYs20BDRHuH Kxu!IG ҤR,`|i:gr IsRV1g4`%u#2aR)ʼQg~ϑ`Hm"57KG)3@b/_5i}l*io&"E11lph{e;fRIxf ļ8 [;,ifU bT])4BW\DфE&.DC Q[-D[ 'eJ-Em M^#t!kRX;R?FjD$EH"RG:Akh^^ X[=)RxhB5$!Lgw;c$ȗ|7A!uwfh0 *GZ5S=uIVEtUP%haY(EH3f].B}VC2P na(xQ\~=Grr >ŚMC~HCq@(aNL֊f(EQI,nT,ډV2(ovBIHȓDYC[p* ebfi!}u@?H D?")LuEɍ]7pE+$,9(H-C3 F\^qg5rA_eMQi#+Oϛ6b܄)cf_ўC?N<3g{|秇ܔӷ \&Q w}gם#B@ذS]{9S[[[o?vDo[=)Rxu:wc鷭y{udǟzk*f\=?n%hg5/w̺f-/T7?gsu/6?Oioe2]0]QkeY3k؜~YK7])R'FfY1+f\ZwڻzSQch`S㊣t")3r܅g671+ӦR캊+SZGuS.kV]fGR\!%rVj撻yo梣NJRѐv`WZ{˰ V 'v.}/VDJmd`KrR~*!O^WSo7Q,%A~1"l#ƀ/\ /;F<{;")Rl}_( Tҙ_Ԇu2B*?p/xWJ 3wN^~uNѣdΚݷXdhf 35m_p2b?{. 87._ڷr;خBFxBW萭 Vk_qS/w„=y. Mb@rG he6Sq9&Ѫ`I@c LJ Nmw)WU\8S#۪ QZulڙ)uw 03  B?Z)s|T.eȿs"E7*2 Wp% CDF#3fhf"s_+?I4ಶ@b6ḊD&̝M? M 0'7 zsSH6Hk0#F95ʌ Z a{fID11C ~ x4)?^Ȉ(09LR9-EXLPZ Efm eLHКUC!ibrUm|:3k2kSJ"6(BT ѐҜ>+1N] U#!8L Q iCCЖܲ[DM4ѿ)RxŻJaBO} m MqJtR6oP" \6֓Mn/E0HL"["C л2L)Rl m$a2`ڙF6CD<+RH"L")1J")1J")1J")1J")1J")1J" ´CQU )"µ@Z Y+ AAW@8/ۑL6)RlæW\WDƂaM=L% FC#HjdH F(SHEv#/CL}Ab 5 fLң$F!Mcf3O\lh6J@<~'2Eo H7Q¾zk Ĺ2JI I&@4 C@MġQ4"II H E)RlH&F).P19^[D'6YLG"fbէu7 f0qh)b V A ~_í$i WjS* GTG5GtRYHpзeZւu UMȬ @.V EP Ā0:#zy +IM{&2RVЌ55\Օ9Q'K- O͟0q)#=zyg͜Agߩu>g~?|w?[k -(}.;yc!0`GkOUǶZ (To4H⍢C k#K~̽;_vKfWh{{5K> ~{@W߭\=tŒ˟|YS 8#}q x2[{NJIDATdVF(f*RꑜvV"T#W,Pe&OH3ץe$ruaD$**i ƙV+YrUۻ+)څK m|l֤BpD[H@nzӔK}w^Go.òj YdL"Cs;m=ۭ2Z[Uy|vɚ5//J "P *]4T NK yWV\KS\ƒ`h> cFYo]W/sO_z1Eob=IW민nS,!vvާ~G۵咀Y=&߷ṕBYh7:z2;17ϛz{Ӂ D(}vsS@Z"C̔ FGJ+|UpU!Ә"E7d1M̊wsՙzVawm)}>7֑هϘ۹rI:l\5b/~~O|FO5mfP5 C7`.D" mfb)9P[Ȧ)bӂO Z4q۲ U ډbږ' JE)24Tm Z/t k[SO"`a@4o)R ,{$[{R4GMŪA S~'E3G_Ox yc )RlkhBXCFDc}:='~XN2e)R[0iGlqCFeDpgol7nT7t$E[=o 2)f[ Lb^MO"ŶF15Ъ(Y Ǐ74SJRVX6c @r#}%(HaHHL}5E $1KS[;ĴWM,$B=Ӗ;J"֏!9x´4ʎqGCgRHD1J 'hS3@!]QbdWd!a^CxA*)RhMKzhZmSӟnhIS걝"ŶD1-C:0r$tTE& 4SFuH )gSF0fHk.lYFb $Z#  oZ@JRؖ,6" Vd舀Kpp7p!- ,˨S6iIG`H2tCF @i(r.\E)z$#P<@\`X YSVZ+UheĆH.?^#O&R $aC43C P:P+5OBK3j 6Zm[Y1)?5Z#J"ֆdbDR0u:ݨlUDU+"4ʝR11 $ PvIbh N`(kR4@@/!Eh(X9B]ߓنvɋrom!RHF3bAZ (C&gG3n[SZ|7q/ogy'0{K׷}k߻A>kuwi\ni;ˆv$Z{wv]~DDC_DD lB o$H#1S(-i>^YK&{{O4@߱kȳ?>ww奋9e:'+-Y?@ j{yonx!!Xtuxel" e"ي|յ%˪?:eƔ{~O,Z 8 eV+OfK9ŚX츚]"3t"唙Y3vMf֚bQ\2ksS.kv44\v֬k\-0Z+W^=^O:q)RڑKrC.SVZOC_OͥVɫ_oɎڄ,Pۂ\AfPr?qw/|yU=fI%AulrY{"O8WԎz&NbG3կ+<vYsȵ ]~(}nS^;pr :O:WWt.}߽ɱLC01xYjnZemqU2Ti"68IX#o6*Y9'ϑ}=2Bg ]Yh`fg]ofsk_t\@jwᬧJg@)s_o_aS}ѣ$4y1Eob$}?񔃯6cwiqו#EםvN7%g:{vb1yNHM?Ow#>'yGN7sfvsظ|iʵJC6 iJ\Oy}73*j;Jb+Gryk PM*N-g[]m 4VcD1*@@f T6J]pZ![V<tm8@VLjHMlAC * `Aw*@fhPRHE21ȑv$ F=mafxT`,CPP mDOD(>w#^GE.AE]l)RlhPDD%d QLhkB"/>A+C?V@P_ iOCv6 ,!u+BIRF0@ E!ifW>Za\ȒuJP tFEO" '5c6.˟/*Sړ"6@SJ"Ŷ&(ө#8[Dx25?R)q4׽!!D)RlH⌨/bRKH0HC 7I*7KCj(EG01 R54 ӐK"ŶZGүy/](Ŧ0p7S*Ei])R-)R-)R-)R-)R-)R-)R-O=RئrF)Rx[ %F)Rx[ %F)Rx[ %F)Rx[@@i)R%Yѡ|%tEXtdate:create2020-02-21T15:09:03+01:00e%tEXtdate:modify2020-02-21T15:09:03+01:00@ݾIENDB`python-sse-starlette-2.3.4/tox.ini0000664000175000017500000000146315005737564017003 0ustar katharakathara# tox (https://tox.readthedocs.io/) is a tool for running tests # in multiple virtualenvs. This configuration file will run the # test suite on all supported python versions. To use it, "pip install tox" # and then run "tox" from this directory. # can be included into setup.cfg [tox] minversion = 3.8.0 isolated_build = true envlist = py38,py39,py310,py311,py312 [gh-actions] python = 3.8: py38 3.9: py39 3.10: py310 3.11: py311 3.12: py312 [testenv] allowlist_externals = pdm deps = sse-starlette pytest pytest-asyncio black coverage requests httpx asgi_lifespan psutil uvicorn starlette fastapi commands = #pytest --cov=sse_starlette --cov-report=xml coverage erase coverage run -m pytest -ra coverage report -m coverage xml python-sse-starlette-2.3.4/.run/0000775000175000017500000000000015005737564016346 5ustar katharakatharapython-sse-starlette-2.3.4/.run/example.run.xml0000664000175000017500000000216115005737564021326 0ustar katharakathara python-sse-starlette-2.3.4/.run/example_fastapi.run.xml0000664000175000017500000000220115005737564023030 0ustar katharakathara python-sse-starlette-2.3.4/tests/0000775000175000017500000000000015005737564016626 5ustar katharakatharapython-sse-starlette-2.3.4/tests/conftest.py0000664000175000017500000000531615005737564021032 0ustar katharakatharaimport asyncio import logging import httpx import pytest from asgi_lifespan import LifespanManager from httpx import ASGITransport from starlette.applications import Starlette from starlette.requests import Request from starlette.responses import PlainTextResponse from starlette.routing import Route from starlette.testclient import TestClient from sse_starlette import EventSourceResponse from sse_starlette.sse import AppStatus _log = logging.getLogger(__name__) log_fmt = r"%(asctime)-15s %(levelname)s %(name)s %(funcName)s:%(lineno)d %(message)s" datefmt = "%Y-%m-%d %H:%M:%S" logging.basicConfig(format=log_fmt, level=logging.DEBUG, datefmt=datefmt) logging.getLogger("httpx").setLevel(logging.INFO) logging.getLogger("httpcore").setLevel(logging.INFO) logging.getLogger("urllib3").setLevel(logging.INFO) logging.getLogger("docker").setLevel(logging.INFO) @pytest.fixture def anyio_backend(): """Exclude trio from tests""" return "asyncio" @pytest.fixture async def app(): async def startup(): _log.debug("Starting up") async def shutdown(): _log.debug("Shutting down") async def home(): return PlainTextResponse("Hello, world!") async def endless(req: Request): async def event_publisher(): i = 0 try: while True: # i <= 20: # yield dict(id=..., event=..., data=...) i += 1 print(f"Sending {i}") yield dict(data=i) await asyncio.sleep(0.3) except asyncio.CancelledError as e: _log.info(f"Disconnected from client (via refresh/close) {req.client}") # Do any other cleanup, if any raise e return EventSourceResponse(event_publisher()) app = Starlette( routes=[Route("/", home), Route("/endless", endpoint=endless)], on_startup=[startup], on_shutdown=[shutdown], ) async with LifespanManager(app): _log.info("We're in!") yield app _log.info("We're out!") @pytest.fixture def reset_appstatus_event(): # avoid: RuntimeError: is bound to a different event loop AppStatus.should_exit_event = None @pytest.fixture async def httpx_client(reset_appstatus_event, app): transport = ASGITransport(app=app) async with httpx.AsyncClient( transport=transport, base_url="http://localhost:8000" ) as client: _log.info("Yielding Client") yield client @pytest.fixture def client(reset_appstatus_event, app): with TestClient(app=app, base_url="http://localhost:8000") as client: print("Yielding Client") yield client python-sse-starlette-2.3.4/tests/test_sse.py0000664000175000017500000003033615005737564021036 0ustar katharakatharaimport asyncio import logging import math from functools import partial import anyio import anyio.lowlevel import pytest from starlette.background import BackgroundTask from starlette.testclient import TestClient from sse_starlette.event import ServerSentEvent from sse_starlette.sse import EventSourceResponse from sse_starlette.sse import SendTimeoutError from tests.anyio_compat import collapse_excgroups _log = logging.getLogger(__name__) # Test fixtures and helpers @pytest.fixture def mock_generator(): async def numbers(minimum, maximum): for i in range(minimum, maximum + 1): await asyncio.sleep(0.1) yield i return numbers @pytest.fixture def mock_memory_channels(): async def setup(): send_chan, recv_chan = anyio.create_memory_object_stream(math.inf) return send_chan, recv_chan return setup class TestEventSourceResponse: @pytest.mark.parametrize( "input_type,separator,expected_output", [ ("integer", "\r\n", b"data: 1\r\n\r\n"), ("dict_simple", "\r\n", b"data: 1\r\n\r\n"), ("dict_with_event", "\r\n", b"event: message\r\ndata: 1\r\n\r\n"), ("dict_with_event", "\r", b"event: message\rdata: 1\r\r"), ], ) async def test_response_send_whenValidInput_thenGeneratesExpectedOutput( self, reset_appstatus_event, mock_generator, input_type, separator, expected_output, ): # Arrange async def app(scope, receive, send): async def format_output(value): if input_type == "integer": return value elif input_type == "dict_simple": return dict(data=value) else: return dict(data=value, event="message") async def generate(): generator = mock_generator(1, 5) async for value in generator: yield await format_output(value) response = EventSourceResponse(generate(), ping=0.2, sep=separator) await response(scope, receive, send) # Act client = TestClient(app) response = client.get("/") # Assert assert expected_output in response.content assert response.content.decode().count("ping") == 2 @pytest.mark.parametrize( "producer_output,expected_sse_response", [ # Test raw integers being converted to SSE format ("raw_integer", b"data: 1\r\n\r\n"), # Test dict with just data field ("simple_dict", b"data: 1\r\n\r\n"), # Test dict with both event and data fields ("event_dict", b"event: message\r\ndata: 1\r\n\r\n"), ], ) def test_eventSourceResponse_whenUsingMemoryChannel_thenHandlesAsyncQueueCorrectly( self, reset_appstatus_event, producer_output, expected_sse_response ): """Tests that EventSourceResponse can properly consume data from an async memory channel. This test verifies the producer-consumer pattern where: 1. Producer (stream_numbers) puts data into a memory channel 2. Consumer (EventSourceResponse) reads from that channel and formats as SSE This differs from direct generator tests by: - Using separate producer/consumer components - Testing async queue-based communication - Verifying SSE works with buffered async data sources """ # Arrange async def app(scope, receive, send): # Create bounded memory channel for producer-consumer communication send_chan, recv_chan = anyio.create_memory_object_stream( max_buffer_size=math.inf ) # Producer function that writes to the channel async def stream_numbers(producer_channel, start, end): async with producer_channel: for i in range(start, end + 1): await anyio.sleep(0.1) # Simulate async data production # Format data based on test case if producer_output == "raw_integer": data = i elif producer_output == "simple_dict": data = dict(data=i) else: # event_dict data = dict(data=i, event="message") # Send to channel for consumption await producer_channel.send(data) # Create SSE response that consumes from channel response = EventSourceResponse( recv_chan, # Consumer reads from receive channel data_sender_callable=partial( stream_numbers, send_chan, 1, 5 ), # Producer writes to send channel ping=0.2, ) await response(scope, receive, send) # Act client = TestClient(app) response = client.get("/") # Assert assert response.content.decode().count("ping") == 2 assert expected_sse_response in response.content @pytest.mark.anyio async def test_disconnect_whenClientDisconnects_thenHandlesGracefully( self, httpx_client, caplog ): # Arrange caplog.set_level(logging.DEBUG) # Act & Assert with pytest.raises(TimeoutError): with anyio.fail_after(1) as scope: try: async with anyio.create_task_group() as tg: # https://www.python-httpx.org/async/#streaming-responses tg.start_soon(httpx_client.get, "/endless") finally: assert scope.cancel_called is True assert "chunk: b'data: 4\\r\\n\\r\\n'" in caplog.text assert "Disconnected from client" in caplog.text @pytest.mark.anyio async def test_send_whenTimeoutOccurs_thenRaisesSendTimeoutError( self, reset_appstatus_event ): # Arrange # Send timeout is set to 0.5s, but `send` will take 1s. Expect SendTimeoutError. cleanup_executed = False async def event_publisher(): try: yield {"event": "test", "data": "data"} pytest.fail("Should not reach this point") finally: nonlocal cleanup_executed cleanup_executed = True async def mock_send(*args, **kwargs): await anyio.sleep(1.0) async def mock_receive(): await anyio.lowlevel.checkpoint() return {"type": "message"} response = EventSourceResponse(event_publisher(), send_timeout=0.5) # Act & Assert with pytest.raises(SendTimeoutError): with collapse_excgroups(): await response({}, mock_receive, mock_send) assert cleanup_executed, "Cleanup should be executed on timeout" def test_headers_whenCustomHeadersProvided_thenMergesCorrectly(self): # Arrange custom_headers = { "cache-control": "no-cache", "x-accel-buffering": "yes", # Should not override "connection": "close", # Should not override "x-custom-header": "custom-value", } # Act response = EventSourceResponse(range(1, 5), headers=custom_headers, ping=0.2) headers = dict((h.decode(), v.decode()) for h, v in response.raw_headers) # Assert assert headers["cache-control"] == "no-cache" assert headers["x-accel-buffering"] == "no" # Should keep default assert headers["connection"] == "keep-alive" # Should keep default assert headers["x-custom-header"] == "custom-value" assert headers["content-type"] == "text/event-stream; charset=utf-8" def test_headers_whenCreated_thenHasCorrectCharset( self, reset_appstatus_event, mock_generator ): # Arrange generator = mock_generator(1, 5) # Act response = EventSourceResponse(generator, ping=0.2) content_type_headers = [ (h.decode(), v.decode()) for h, v in response.raw_headers if h.decode() == "content-type" ] # Assert assert len(content_type_headers) == 1 header_name, header_value = content_type_headers[0] assert header_value == "text/event-stream; charset=utf-8" @pytest.mark.anyio async def test_ping_whenConcurrentWithEvents_thenRespectsLocking( self, reset_appstatus_event ): # Sequencing here is as follows to reproduce race condition: # t=0.5s - event_publisher sends the first response item, # claiming the lock and going to sleep for 1 second so until t=1.5s. # t=1.0s - ping task wakes up and tries to call send while we know # that event_publisher is still blocked inside it and holding the lock # Arrange lock = anyio.Lock() async def event_publisher(): for i in range(2): await anyio.sleep(0.5) yield i async def send(*args, **kwargs): # Raises WouldBlock if called while someone else already holds the lock lock.acquire_nowait() await anyio.sleep(1.0) lock.release() async def receive(): await anyio.lowlevel.checkpoint() return {"type": "message"} response = EventSourceResponse(event_publisher(), ping=1) # Act & Assert with pytest.raises(anyio.WouldBlock): with collapse_excgroups(): await response({}, receive, send) def test_pingInterval_whenCreated_thenUsesDefaultValue(self): # Arrange & Act response = EventSourceResponse(0) # Assert assert response.ping_interval == response.DEFAULT_PING_INTERVAL def test_pingInterval_whenValidValueSet_thenUpdatesInterval(self): # Arrange response = EventSourceResponse(0) new_interval = 25 # Act response.ping_interval = new_interval # Assert assert response.ping_interval == new_interval def test_pingInterval_whenStringProvided_thenRaisesTypeError(self): # Arrange response = EventSourceResponse(0) invalid_interval = "ten" # Act & Assert with pytest.raises(TypeError, match="ping interval must be int"): response.ping_interval = invalid_interval def test_pingInterval_whenNegativeValue_thenRaisesValueError(self): # Arrange response = EventSourceResponse(0) negative_interval = -42 # Act & Assert with pytest.raises(ValueError, match="ping interval must be greater than 0"): response.ping_interval = negative_interval def test_compression_whenEnabled_thenRaisesNotImplemented(self): # Arrange response = EventSourceResponse(range(1, 5)) # Act & Assert with pytest.raises(NotImplementedError): response.enable_compression() @pytest.mark.parametrize("separator", ["\n", "\r", "\r\n"]) def test_customSeparator_whenProvided_thenUsesCorrectSeparator(self, separator): # Arrange test_data = "test_data" test_event = "test_event" # Act response = ServerSentEvent(test_data, event=test_event, sep=separator) result = response.encode() # Assert expected = ( f"event: {test_event}{separator}data: {test_data}{separator}{separator}" ) assert result == expected.encode() @pytest.mark.anyio async def test_backgroundTask_whenProvided_thenExecutesAfterResponse( self, reset_appstatus_event ): # Arrange task_executed = False async def background_task(): nonlocal task_executed task_executed = True async def mock_send(*args, **kwargs): pass async def mock_receive(): await anyio.lowlevel.checkpoint() return {"type": "http.disconnect"} response = EventSourceResponse([], background=BackgroundTask(background_task)) # Act await response({}, mock_receive, mock_send) # Assert assert task_executed, "Background task should be executed" python-sse-starlette-2.3.4/tests/test_event.py0000664000175000017500000000555015005737564021365 0ustar katharakatharaimport pytest from sse_starlette.event import ServerSentEvent, ensure_bytes @pytest.mark.parametrize( "input, expected", [ ("foo", b"data: foo\r\n\r\n"), (dict(data="foo", event="bar"), b"event: bar\r\ndata: foo\r\n\r\n"), ( dict(data="foo", event="bar", id="xyz"), b"id: xyz\r\nevent: bar\r\ndata: foo\r\n\r\n", ), ( dict(data="foo", event="bar", id="xyz", retry=1), b"id: xyz\r\nevent: bar\r\ndata: foo\r\nretry: 1\r\n\r\n", ), ( dict(data="foo", event="bar", id="xyz", retry=1, sep="\n"), b"id: xyz\nevent: bar\ndata: foo\nretry: 1\n\n", ), ( dict(comment="a comment"), b": a comment\r\n\r\n", ), ( dict(data="foo", comment="a comment"), b": a comment\r\ndata: foo\r\n\r\n", ), ], ) def test_server_sent_event(input, expected): print(input, expected) if isinstance(input, str): assert ServerSentEvent(input).encode() == expected else: assert ServerSentEvent(**input).encode() == expected @pytest.mark.parametrize( "input, expected", [ (b"data: foo\r\n\r\n", b"data: foo\r\n\r\n"), ("foo", b"data: foo\n\n"), (dict(data="foo", event="bar"), b"event: bar\ndata: foo\n\n"), ], ) def test_ensure_bytes(input, expected): print(input, expected) assert ensure_bytes(input, sep="\n") == expected @pytest.mark.parametrize( "stream_sep,line_sep", [ ("\n", "\n"), ("\n", "\r"), ("\n", "\r\n"), ("\r", "\n"), ("\r", "\r"), ("\r", "\r\n"), ("\r\n", "\n"), ("\r\n", "\r"), ("\r\n", "\r\n"), ], ids=( "stream-LF:line-LF", "stream-LF:line-CR", "stream-LF:line-CR+LF", "stream-CR:line-LF", "stream-CR:line-CR", "stream-CR:line-CR+LF", "stream-CR+LF:line-LF", "stream-CR+LF:line-CR", "stream-CR+LF:line-CR+LF", ), ) def test_multiline_data(stream_sep, line_sep): lines = line_sep.join(["foo", "bar", "xyz"]) result = ServerSentEvent(lines, event="event", sep=stream_sep).encode() assert ( result == "event: event{0}data: foo{0}data: bar{0}data: xyz{0}{0}".format( stream_sep ).encode() ) @pytest.mark.parametrize("sep", ["\n", "\r", "\r\n"], ids=("LF", "CR", "CR+LF")) def test_custom_sep(sep): result = ServerSentEvent("foo", event="event", sep=sep).encode() assert result == "event: event{0}data: foo{0}{0}".format(sep).encode() def test_retry_is_int(): response = ServerSentEvent(0, retry=1) assert response.retry == 1 with pytest.raises(TypeError) as ctx: _ = ServerSentEvent(0, retry="ten").encode() # type: ignore assert str(ctx.value) == "retry argument must be int" python-sse-starlette-2.3.4/tests/experimentation/0000775000175000017500000000000015005737564022041 5ustar katharakatharapython-sse-starlette-2.3.4/tests/experimentation/test_multiple_consumers_threads.py0000664000175000017500000001555015005737564031123 0ustar katharakatharaimport asyncio import logging import os import subprocess import threading import time from functools import partial from pathlib import Path import httpcore import httpx import psutil import pytest import requests _log = logging.getLogger(__name__) ROOT_PATH = Path(__file__).parent.parent.parent URL = "http://localhost" PORT = 8001 LOG_LEVEL = "info" SERVER_READY_TIMEOUT = 5 # Max seconds to wait for the server to be ready server_process = None # Global variable to hold the server process server_ready_event = threading.Event() # Event to signal when the server is ready def check_server_is_ready(port: int): """Check if the server is ready by making a GET request to the URL.""" for _ in range(SERVER_READY_TIMEOUT): try: response = requests.get(f"{URL}:{port}/health") if response.status_code == 200: _log.info("Server is ready.") return True except requests.ConnectionError: _log.debug("Server not ready yet...") time.sleep(1) return False def get_available_port() -> int: import socket with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind(("", 0)) return s.getsockname()[1] def run_server(server_command: str, port: int): global server_process env = os.environ.copy() env["PYTHONPATH"] = str(ROOT_PATH) # Set PYTHONPATH to include the project root server_process = subprocess.Popen( server_command, shell=True, cwd=ROOT_PATH, env=env ) if check_server_is_ready(port): server_ready_event.set() # Signal that the server is ready else: _log.debug("Server did not become ready in time, terminating server process.") terminate_server() server_ready_event.set() # allow pytest to fail after passing the Event barrier raise Exception("Server did not become ready in time.") def terminate_server(): if server_process: try: _log.debug("Attempting to terminate the server process.") assert isinstance(server_process, subprocess.Popen) # please mypy parent = psutil.Process(server_process.pid) for child in parent.children(recursive=True): child.terminate() parent.terminate() try: # fix uvicorn breaking change: https://github.com/encode/uvicorn/compare/0.28.1...0.29.0 parent.wait(timeout=1) except psutil.TimeoutExpired: _log.info( "Server process did not terminate after 1 second, killing it." ) parent.kill() parent.wait() server_process.wait() _log.debug("Server process terminated.") except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess): _log.warning("Server process could not be terminated.") except subprocess.TimeoutExpired: _log.warning( "Timeout waiting for server process to terminate. Forcing kill." ) server_process.kill() # Force kill if not terminated after timeout server_process.wait() # Wait for the kill to take effect finally: server_ready_event.clear() async def make_arequest(url, expected_lines=2): """Simulate Client: Stream the SSE endpoint, and count the number of lines received. """ _log.info(f"{threading.current_thread().ident}: Starting making requests to {url=}") i = 0 async with httpx.AsyncClient() as client: try: # stream client for line-by-line output async with client.stream("GET", url) as response: async for line in response.aiter_lines(): print( f"{threading.current_thread().ident}: Streaming response {i=}, {line=}" ) i += 1 except httpx.RemoteProtocolError as e: _log.error(e) except httpcore.RemoteProtocolError as e: _log.error(e) finally: assert ( i == expected_lines ), ( f"Expected {expected_lines} lines" ) # not part of test runner, failure is not reported _log.info( f"{threading.current_thread().ident}: Stopping making requests to {url=}, finished after {i=} responses." ) # expected output lines: # i=0, line='data: 1' # i=1, line='' # ... assert ( i == expected_lines ), ( f"Expected {expected_lines} lines" ) # not part of test runner, failure is not reported @pytest.mark.skipif(os.name == "nt", reason="Skip on Windows") @pytest.mark.experimentation @pytest.mark.parametrize( ("server_command", "expected_lines"), [ ( "uvicorn tests.integration.main_endless:app --host localhost --port {port} --log-level {log_level}", 14, ), ( "uvicorn tests.integration.main_endless_conditional:app --host localhost --port {port} --log-level {log_level}", 2, ), ], ) def test_stop_server_with_many_consumers(caplog, server_command, expected_lines): # Given caplog.set_level(logging.DEBUG) N_CONSUMER = 3 port = get_available_port() # Start server server_command = server_command.format(port=port, log_level=LOG_LEVEL) _log.info(f"Starting server with command: {server_command}") server_to_run = partial(run_server, server_command, port) server_thread = threading.Thread(target=server_to_run) server_thread.start() server_ready_event.wait() # Wait for the server to become ready if server_process is None or server_process.poll() is not None: pytest.fail("Server did not start.") # Initialize threads threads = [] for _ in range(N_CONSUMER): thread = threading.Thread( target=lambda: asyncio.run( make_arequest(f"{URL}:{port}/endless", expected_lines=expected_lines) ) ) threads.append(thread) for thread in threads: thread.start() # Wait and then stop server time.sleep(1) # Simulate some operation time # When: the server is stopped unexpectedly terminate_server() # Wait for all threads to finish for thread in threads: thread.join() server_thread.join() # Ensure server thread is cleaned up # Then: Consumers report errors time.sleep(0.5) errors = [r.message for r in caplog.records if r.levelname == "ERROR"] assert len(errors) == N_CONSUMER, f"Expected {N_CONSUMER} errors, got {len(errors)}" # consumers: 'peer closed connection without sending complete message body (incomplete chunked read)' assert ( "peer closed connection without sending complete message body (incomplete chunked read)" in errors ) time.sleep(0.2) python-sse-starlette-2.3.4/tests/experimentation/test_multiple_consumers_asyncio.py0000664000175000017500000001700415005737564031132 0ustar katharakatharaimport asyncio import logging import os from contextlib import asynccontextmanager from typing import AsyncIterator, List import pytest import httpx import uvicorn from async_timeout import timeout import portend from tenacity import retry, stop_after_attempt, wait_exponential logger = logging.getLogger(__name__) class ServerManager: """Manages the lifecycle of a test server instance""" def __init__(self, app_path: str, host: str = "localhost", port: int = None): self.app_path = app_path self.host = host self.port = port or portend.find_available_local_port() self.server = None self._startup_complete = asyncio.Event() self._shutdown_complete = asyncio.Event() async def startup(self) -> None: """Start the server in a separate task""" config = uvicorn.Config( app=self.app_path, host=self.host, port=self.port, log_level="error", loop="asyncio", ) self.server = uvicorn.Server(config=config) # Store the original startup handler original_startup = self.server.startup # Create a wrapper that preserves the original signature async def startup_wrapper(*args, **kwargs): await original_startup(*args, **kwargs) self._startup_complete.set() self.server.startup = startup_wrapper # Start the server self._server_task = asyncio.create_task(self.server.serve()) try: async with timeout(10) as timeout_ctx: # 10 second timeout for startup await self._startup_complete.wait() # Additional health check retry_count = 0 while retry_count < 5: # Try 5 times with exponential backoff if await self.health_check(): break retry_count += 1 await asyncio.sleep(0.2 * (2**retry_count)) else: raise RuntimeError("Server health check failed after retries") except Exception as e: # If startup fails, ensure we clean up await self.shutdown() if isinstance(e, asyncio.TimeoutError): raise RuntimeError("Server failed to start within timeout") from e raise async def shutdown(self) -> None: """Shutdown the server gracefully""" if self.server and not self._shutdown_complete.is_set(): try: self.server.should_exit = True if hasattr(self, "_server_task"): try: async with timeout(5): # 5 second timeout for shutdown await self._server_task except asyncio.TimeoutError: # Force cancel if graceful shutdown fails self._server_task.cancel() try: await self._server_task except asyncio.CancelledError: pass finally: self._shutdown_complete.set() self.server = None self._startup_complete.clear() @property def url(self) -> str: return f"http://{self.host}:{self.port}" async def health_check(self) -> bool: """Check if server is responding""" try: async with httpx.AsyncClient() as client: async with timeout(1): # 1 second timeout for health check response = await client.get(f"{self.url}/health") return response.status_code == 200 except Exception: return False @asynccontextmanager async def server_context(app_path: str) -> AsyncIterator[ServerManager]: """Context manager for server lifecycle""" server = ServerManager(app_path) try: await server.startup() yield server finally: await server.shutdown() class SSEClient: """Client for consuming SSE streams""" def __init__(self, url: str, expected_lines: int): self.url = url self.expected_lines = expected_lines self.received_lines = 0 self.errors: List[Exception] = [] @retry( stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10) ) async def connect_and_consume(self) -> None: """Connect to SSE stream and consume messages""" try: async with httpx.AsyncClient() as client: async with timeout(20): # 20 second timeout for stream consumption async with client.stream("GET", self.url) as response: async for line in response.aiter_lines(): if line.strip(): # Only count non-empty lines self.received_lines += 1 if self.received_lines >= self.expected_lines: break except Exception as e: self.errors.append(e) raise @pytest.mark.asyncio @pytest.mark.experimentation @pytest.mark.parametrize( "app_path,expected_lines", [ ("tests.integration.main_endless:app", 14), ("tests.integration.main_endless_conditional:app", 2), ], ) async def test_sse_multiple_consumers( app_path: str, expected_lines: int, num_consumers: int = 3 ): """Test multiple consumers connecting to SSE endpoint""" async with server_context(app_path) as server: # Create and start consumers clients = [ SSEClient(f"{server.url}/endless", expected_lines) for _ in range(num_consumers) ] # Run consumers concurrently with timeout async with timeout(30): # 30 second timeout for entire test try: # Create tasks for all consumers consumer_tasks = [ asyncio.create_task(client.connect_and_consume()) for client in clients ] # Wait for all consumers or first error done, pending = await asyncio.wait( consumer_tasks, return_when=asyncio.FIRST_EXCEPTION ) # Cancel any pending tasks for task in pending: task.cancel() try: await task except asyncio.CancelledError: pass # Check results and gather errors errors = [] for task in done: try: await task except Exception as e: errors.append(e) # Verify expectations for i, client in enumerate(clients): assert ( client.received_lines == expected_lines ), f"Client {i} received {client.received_lines} lines, expected {expected_lines}" assert not errors, f"Consumers encountered errors: {errors}" except asyncio.TimeoutError: raise RuntimeError("Test timed out waiting for consumers") finally: # Ensure all tasks are properly cleaned up for task in consumer_tasks: if not task.done(): task.cancel() try: await task except asyncio.CancelledError: pass python-sse-starlette-2.3.4/tests/experimentation/container.py0000664000175000017500000000246015005737564024377 0ustar katharakatharafrom time import sleep from testcontainers.core.container import DockerContainer from testcontainers.core.waiting_utils import wait_for_logs # Define a simple container class BasicContainer(DockerContainer): def __init__(self): # super().__init__("python:3.12-slim") super().__init__("sse_starlette:latest") self.app_path = "tests.integration.main_endless:app" self.with_volume_mapping( host="/Users/Q187392/dev/s/public/sse-starlette", container="/app" ) self.with_name("sse_starlette") self.with_exposed_ports(8000) # Set a basic command to keep the container running # self.with_command("tail -f /dev/null") self.with_command( f"uvicorn {self.app_path} --host 0.0.0.0 --port 8000 --log-level debug" ) if __name__ == "__main__": # Start the container container = BasicContainer() with container: wait_for_logs(container, "Application startup complete", timeout=10) print(f"Container is running. ID: {container._container.id}") print( f"Exec into the container using: docker exec -it {container._container.id} sh" ) print(f"http://localhost:{container.get_exposed_port(8000)}/endless") sleep(100000) # Keep the container running python-sse-starlette-2.3.4/tests/anyio_compat.py0000664000175000017500000000174015005737564021664 0ustar katharakatharaimport sys from contextlib import contextmanager from typing import Generator # AnyIO v4 introduces a breaking change that groups all exceptions in a task # group into an exception group. # This file allows to be compatible with AnyIO <4 and >=4 by unwrapping groups # if they only contain a single exception. It also supports python <3.11 (before # exception groups support) and >=3.11. # Solution as proposed in https://anyio.readthedocs.io/en/stable/migration.html has_exceptiongroups = True if sys.version_info < (3, 11): try: from exceptiongroup import BaseExceptionGroup except ImportError: has_exceptiongroups = False @contextmanager def collapse_excgroups() -> Generator[None, None, None]: try: yield except BaseException as exc: if has_exceptiongroups: while isinstance(exc, BaseExceptionGroup) and len(exc.exceptions) == 1: exc = exc.exceptions[0] raise exc __all__ = ["collapse_excgroups"] python-sse-starlette-2.3.4/tests/integration/0000775000175000017500000000000015005737564021151 5ustar katharakatharapython-sse-starlette-2.3.4/tests/integration/test_multiple_consumers.py0000664000175000017500000000710115005737564026512 0ustar katharakatharaimport asyncio import logging import httpx import pytest from testcontainers.core.container import DockerContainer from testcontainers.core.waiting_utils import wait_for_logs _log = logging.getLogger(__name__) class SSEServerContainer(DockerContainer): def __init__(self, app_path: str): super().__init__("sse_starlette:latest") self.app_path = app_path # Mount the current directory into the container self.with_volume_mapping( host="/Users/Q187392/dev/s/public/sse-starlette", container="/app" ) self.with_name("sse_starlette_test") self.with_command( f"uvicorn {self.app_path} --host 0.0.0.0 --port 8000 --log-level info" ) # Expose the port self.with_exposed_ports(8000) async def consume_events(url: str, expected_lines: int = 2): """Simulate Client: Stream the SSE endpoint and count received lines.""" i = 0 async with httpx.AsyncClient() as client: try: async with client.stream("GET", url) as response: async for line in response.aiter_lines(): if line.strip(): _log.info(f"Received line: {line}") i += 1 except (httpx.RemoteProtocolError, httpx.ReadError) as e: _log.error(f"Error during streaming: {str(e)}") return i, str(e) return i, None @pytest.mark.integration @pytest.mark.parametrize( ("app_path", "expected_lines"), [ ("tests.integration.main_endless:app", 14), ("tests.integration.main_endless_conditional:app", 2), ], ) async def test_sse_server_termination(caplog, app_path, expected_lines): caplog.set_level(logging.DEBUG) N_CONSUMERS = 3 # Start server in container container = SSEServerContainer(app_path) container.start() try: # Wait for server to be ready wait_for_logs(container, "Application startup complete", timeout=10) port = container.get_exposed_port(8000) url = f"http://localhost:{port}/endless" # Create background tasks for consumers tasks = [ asyncio.create_task(consume_events(url, expected_lines)) for _ in range(N_CONSUMERS) ] # Wait a bit then kill the server await asyncio.sleep(1) container.stop(force=True) # Now wait for all tasks to complete results = await asyncio.gather(*tasks) # Check error count: one connection error per client error_count = sum(1 for _, error in results if error is not None) assert ( error_count == N_CONSUMERS ), f"Expected {N_CONSUMERS} errors, got {error_count}" # Verify error messages for _, error in results: assert ( error and "peer closed connection without sending complete message body (incomplete chunked read)" in error.lower() ), "Expected peer closed connection error" # Check message counts message_counts = [count for count, _ in results] _log.info(f"Message counts received: {message_counts}") # Since we're killing the server early, we expect incomplete message counts assert all( count < expected_lines for count in message_counts ), f"Expected all counts to be less than {expected_lines}, got {message_counts}" finally: # Cleanup container if it's still around try: container.stop(force=True) except Exception as e: _log.debug(f"Error during cleanup: {e}") python-sse-starlette-2.3.4/tests/integration/frozen_client.py0000664000175000017500000000216015005737564024363 0ustar katharakathara""" https://github.com/sysid/sse-starlette/issues/89 Server Simulation: Run with: uvicorn tests.integration.frozen_client:app Client Simulation: % curl -s -N localhost:8000/events > /dev/null ^Z (suspend process -> no consumption of messages but connection alive) Measure resource consumption: connections: lsof -i :8000 buffers: netstat -m """ import anyio import uvicorn from starlette.applications import Starlette from starlette.routing import Route from sse_starlette import EventSourceResponse async def events(request): async def _event_generator(): try: i = 0 while True: i += 1 if i % 100 == 0: print(i) yield dict(data={i: " " * 4096}) await anyio.sleep(0.001) finally: print("disconnected") return EventSourceResponse(_event_generator(), send_timeout=10) app = Starlette( debug=True, routes=[ Route("/events", events), ], ) if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8000, log_level="trace", log_config=None) # type: ignore python-sse-starlette-2.3.4/tests/integration/main_endless_conditional.py0000664000175000017500000000424115005737564026550 0ustar katharakathara# main.py import asyncio import logging import uvicorn from starlette.applications import Starlette from starlette.requests import Request from starlette.responses import JSONResponse from starlette.routing import Route from sse_starlette import EventSourceResponse """ example by: justindujardin 4efaffc2365a85f132ab8fc405110120c9c9e36a, https://github.com/sysid/sse-starlette/pull/13 tests proper shutdown in case no messages are yielded: - in a streaming endpoint that reports only on "new" data, it is possible to get into a state where no no yields are expected to happen in the near future. e.g. there are no new chat messages to emit. - add a third task to taskgroup that checks the uvicorn exit status at a regular interval. """ _log = logging.getLogger(__name__) async def endless(req: Request): """Simulates an endless stream but only yields one item In case of server shutdown the running task has to be stopped via signal handler in order to enable proper server shutdown. Otherwise, there will be dangling tasks preventing proper shutdown. (deadlock) """ async def event_publisher(): has_data = True # The event publisher only conditionally emits items try: while True: disconnected = await req.is_disconnected() if disconnected: _log.info(f"Disconnecting client {req.client}") break # Simulate only sending one response if has_data: yield dict(data="u can haz the data") has_data = False await asyncio.sleep(0.9) except asyncio.CancelledError as e: _log.info(f"Disconnected from client (via refresh/close) {req.client}") # Do any other cleanup, if any raise e return EventSourceResponse(event_publisher()) async def healthcheck(req: Request): return JSONResponse({"status": "ok"}) app = Starlette( routes=[ Route("/endless", endpoint=endless), Route("/health", endpoint=healthcheck), ], ) if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8000, log_level="trace") python-sse-starlette-2.3.4/tests/integration/main_endless.py0000664000175000017500000000243415005737564024167 0ustar katharakathara# main.py import asyncio import logging from starlette.applications import Starlette from starlette.requests import Request from starlette.responses import JSONResponse from starlette.routing import Route from sse_starlette import EventSourceResponse _log = logging.getLogger(__name__) async def endless(req: Request): """Simulates an endless stream, events sent every 0.3 seconds""" async def event_publisher(): i = 0 try: while True: # i <= 20: # yield dict(id=..., event=..., data=...) i += 1 # print(f"Sending {i}") yield dict(data=i) await asyncio.sleep(0.3) except asyncio.CancelledError as e: _log.info( f"Disconnected from client (via refresh/close) {req.client} after {i} events" ) # Do any other cleanup, if any raise e return EventSourceResponse(event_publisher()) async def healthcheck(req: Request): return JSONResponse({"status": "ok"}) app = Starlette( routes=[ Route("/endless", endpoint=endless), Route("/health", endpoint=healthcheck), ], ) if __name__ == "__main__": import uvicorn uvicorn.run(app, host="localhost", port=8001, log_level="trace") python-sse-starlette-2.3.4/tests/integration/README.md0000664000175000017500000000154115005737564022431 0ustar katharakathara# Smoke and Integration tests ## Test for lost client connection: 1. start example.py with log_level='trace' 2. curl http://localhost:8000/endless 3. kill curl ### expected outcome: all streaming stops, including pings (log output) ## Test for uvicorn shutdown (Ctrl-C) with long running task and multiple clients: - see also: `test_multiple_consumers.py` 1. start example.py with log_level='trace' 2. curl http://localhost:8000/endless from multiple clients/terminals 3. CTRL-C: stop server ### expected outcome: 1. server shut down gracefully, no pending tasks 2. all clients stop (transfer closed with outstanding read data remaining) ## Test for stream_generator.py 1. start stream_generator.py with log_level='trace' 2. Run http calls in integration_testing.http ### expected outcome: 1. every post from one client should be seen on consuming client python-sse-starlette-2.3.4/tests/integration/integration_testing.http0000664000175000017500000000153515005737564026136 0ustar katharakathara### ################################################################################ # subscribe to ./main_endless_conditional.py ################################################################################ GET http://localhost:8000/endless Accept: application/json ### ################################################################################ # Test examples/stream_generator.py ################################################################################ # Push messages for stream_generator.py # curl -X 'POST' # 'http://127.0.0.1:8000/message?message=xxx' # -H 'accept: application/json' # -d '' POST http://127.0.0.1:8000/message?message=xxx accept: application/json Content-Type: application/x-www-form-urlencoded ### # subscribe to sse endpoint to view the sent messages GET http://localhost:8000/sse Accept: application/json ### python-sse-starlette-2.3.4/sse_starlette/0000775000175000017500000000000015005737564020345 5ustar katharakatharapython-sse-starlette-2.3.4/sse_starlette/__init__.py0000664000175000017500000000025615005737564022461 0ustar katharakatharafrom sse_starlette.event import ServerSentEvent from sse_starlette.sse import EventSourceResponse __all__ = ["EventSourceResponse", "ServerSentEvent"] __version__ = "2.3.4" python-sse-starlette-2.3.4/sse_starlette/event.py0000664000175000017500000000422115005737564022037 0ustar katharakatharaimport io import re from typing import Optional, Any, Union class ServerSentEvent: """ Helper class to format data for Server-Sent Events (SSE). """ _LINE_SEP_EXPR = re.compile(r"\r\n|\r|\n") DEFAULT_SEPARATOR = "\r\n" def __init__( self, data: Optional[Any] = None, *, event: Optional[str] = None, id: Optional[str] = None, retry: Optional[int] = None, comment: Optional[str] = None, sep: Optional[str] = None, ) -> None: self.data = data self.event = event self.id = id self.retry = retry self.comment = comment self._sep = sep if sep is not None else self.DEFAULT_SEPARATOR def encode(self) -> bytes: buffer = io.StringIO() if self.comment is not None: for chunk in self._LINE_SEP_EXPR.split(str(self.comment)): buffer.write(f": {chunk}{self._sep}") if self.id is not None: # Clean newlines in the event id buffer.write("id: " + self._LINE_SEP_EXPR.sub("", self.id) + self._sep) if self.event is not None: # Clean newlines in the event name buffer.write( "event: " + self._LINE_SEP_EXPR.sub("", self.event) + self._sep ) if self.data is not None: # Break multi-line data into multiple data: lines for chunk in self._LINE_SEP_EXPR.split(str(self.data)): buffer.write(f"data: {chunk}{self._sep}") if self.retry is not None: if not isinstance(self.retry, int): raise TypeError("retry argument must be int") buffer.write(f"retry: {self.retry}{self._sep}") buffer.write(self._sep) return buffer.getvalue().encode("utf-8") def ensure_bytes(data: Union[bytes, dict, ServerSentEvent, Any], sep: str) -> bytes: if isinstance(data, bytes): return data if isinstance(data, ServerSentEvent): return data.encode() if isinstance(data, dict): data["sep"] = sep return ServerSentEvent(**data).encode() return ServerSentEvent(str(data), sep=sep).encode() python-sse-starlette-2.3.4/sse_starlette/py.typed0000664000175000017500000000000015005737564022032 0ustar katharakatharapython-sse-starlette-2.3.4/sse_starlette/sse.py0000664000175000017500000002233515005737564021516 0ustar katharakatharaimport logging from datetime import datetime, timezone from typing import ( Any, AsyncIterable, Awaitable, Callable, Coroutine, Iterator, Mapping, Optional, Union, ) import anyio from starlette.background import BackgroundTask from starlette.concurrency import iterate_in_threadpool from starlette.datastructures import MutableHeaders from starlette.responses import Response from starlette.types import Receive, Scope, Send, Message from sse_starlette.event import ServerSentEvent, ensure_bytes logger = logging.getLogger(__name__) class SendTimeoutError(TimeoutError): pass class AppStatus: """Helper to capture a shutdown signal from Uvicorn so we can gracefully terminate SSE streams.""" should_exit = False should_exit_event: Union[anyio.Event, None] = None original_handler = None @staticmethod def handle_exit(*args, **kwargs): # Mark that the app should exit, and signal all waiters. AppStatus.should_exit = True if AppStatus.should_exit_event is not None: AppStatus.should_exit_event.set() if AppStatus.original_handler is not None: AppStatus.original_handler(*args, **kwargs) try: from uvicorn.main import Server AppStatus.original_handler = Server.handle_exit Server.handle_exit = AppStatus.handle_exit # type: ignore except ImportError: logger.debug( "Uvicorn not installed. Graceful shutdown on server termination disabled." ) Content = Union[str, bytes, dict, ServerSentEvent, Any] SyncContentStream = Iterator[Content] AsyncContentStream = AsyncIterable[Content] ContentStream = Union[AsyncContentStream, SyncContentStream] class EventSourceResponse(Response): """ Streaming response that sends data conforming to the SSE (Server-Sent Events) specification. """ DEFAULT_PING_INTERVAL = 15 DEFAULT_SEPARATOR = "\r\n" def __init__( self, content: ContentStream, status_code: int = 200, headers: Optional[Mapping[str, str]] = None, media_type: str = "text/event-stream", background: Optional[BackgroundTask] = None, ping: Optional[int] = None, sep: Optional[str] = None, ping_message_factory: Optional[Callable[[], ServerSentEvent]] = None, data_sender_callable: Optional[ Callable[[], Coroutine[None, None, None]] ] = None, send_timeout: Optional[float] = None, client_close_handler_callable: Optional[Callable[[Message], Awaitable[None]]] = None, ) -> None: # Validate separator if sep not in (None, "\r\n", "\r", "\n"): raise ValueError(f"sep must be one of: \\r\\n, \\r, \\n, got: {sep}") self.sep = sep or self.DEFAULT_SEPARATOR # If content is sync, wrap it for async iteration if isinstance(content, AsyncIterable): self.body_iterator = content else: self.body_iterator = iterate_in_threadpool(content) self.status_code = status_code self.media_type = self.media_type if media_type is None else media_type self.background = background self.data_sender_callable = data_sender_callable self.send_timeout = send_timeout # Build SSE-specific headers. _headers = MutableHeaders() if headers is not None: # pragma: no cover _headers.update(headers) # "The no-store response directive indicates that any caches of any kind (private or shared) # should not store this response." # -- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control # allow cache control header to be set by user to support fan out proxies # https://www.fastly.com/blog/server-sent-events-fastly _headers.setdefault("Cache-Control", "no-store") # mandatory for servers-sent events headers _headers["Connection"] = "keep-alive" _headers["X-Accel-Buffering"] = "no" self.init_headers(_headers) self.ping_interval = self.DEFAULT_PING_INTERVAL if ping is None else ping self.ping_message_factory = ping_message_factory self.client_close_handler_callable = client_close_handler_callable self.active = True # https://github.com/sysid/sse-starlette/pull/55#issuecomment-1732374113 self._send_lock = anyio.Lock() @property def ping_interval(self) -> Union[int, float]: return self._ping_interval @ping_interval.setter def ping_interval(self, value: Union[int, float]) -> None: if not isinstance(value, (int, float)): raise TypeError("ping interval must be int") if value < 0: raise ValueError("ping interval must be greater than 0") self._ping_interval = value def enable_compression(self, force: bool = False) -> None: raise NotImplementedError("Compression is not supported for SSE streams.") async def _stream_response(self, send: Send) -> None: """Send out SSE data to the client as it becomes available in the iterator.""" await send( { "type": "http.response.start", "status": self.status_code, "headers": self.raw_headers, } ) async for data in self.body_iterator: chunk = ensure_bytes(data, self.sep) logger.debug("chunk: %s", chunk) with anyio.move_on_after(self.send_timeout) as cancel_scope: await send( {"type": "http.response.body", "body": chunk, "more_body": True} ) if cancel_scope and cancel_scope.cancel_called: if hasattr(self.body_iterator, "aclose"): await self.body_iterator.aclose() raise SendTimeoutError() async with self._send_lock: self.active = False await send({"type": "http.response.body", "body": b"", "more_body": False}) async def _listen_for_disconnect(self, receive: Receive) -> None: """Watch for a disconnect message from the client.""" while self.active: message = await receive() if message["type"] == "http.disconnect": self.active = False logger.debug("Got event: http.disconnect. Stop streaming.") if self.client_close_handler_callable: await self.client_close_handler_callable(message) break @staticmethod async def _listen_for_exit_signal() -> None: """Watch for shutdown signals (e.g. SIGINT, SIGTERM) so we can break the event loop.""" # Check if should_exit was set before anybody started waiting if AppStatus.should_exit: return if AppStatus.should_exit_event is None: AppStatus.should_exit_event = anyio.Event() # Check if should_exit got set while we set up the event if AppStatus.should_exit: return await AppStatus.should_exit_event.wait() async def _ping(self, send: Send) -> None: """Periodically send ping messages to keep the connection alive on proxies. - frequenccy ca every 15 seconds. - Alternatively one can send periodically a comment line (one starting with a ':' character) """ while self.active: await anyio.sleep(self._ping_interval) sse_ping = ( self.ping_message_factory() if self.ping_message_factory else ServerSentEvent( comment=f"ping - {datetime.now(timezone.utc)}", sep=self.sep ) ) ping_bytes = ensure_bytes(sse_ping, self.sep) logger.debug("ping: %s", ping_bytes) async with self._send_lock: if self.active: await send( { "type": "http.response.body", "body": ping_bytes, "more_body": True, } ) async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None: """Entrypoint for Starlette's ASGI contract. We spin up tasks: - _stream_response to push events - _ping to keep the connection alive - _listen_for_exit_signal to respond to server shutdown - _listen_for_disconnect to respond to client disconnect """ async with anyio.create_task_group() as task_group: # https://trio.readthedocs.io/en/latest/reference-core.html#custom-supervisors async def cancel_on_finish(coro: Callable[[], Awaitable[None]]): await coro() task_group.cancel_scope.cancel() task_group.start_soon(cancel_on_finish, lambda: self._stream_response(send)) task_group.start_soon(cancel_on_finish, lambda: self._ping(send)) task_group.start_soon(cancel_on_finish, self._listen_for_exit_signal) if self.data_sender_callable: task_group.start_soon(self.data_sender_callable) # Wait for the client to disconnect last await cancel_on_finish(lambda: self._listen_for_disconnect(receive)) if self.background is not None: await self.background() python-sse-starlette-2.3.4/VERSION0000664000175000017500000000000615005737564016530 0ustar katharakathara2.3.4 python-sse-starlette-2.3.4/.github/0000775000175000017500000000000015005737564017024 5ustar katharakatharapython-sse-starlette-2.3.4/.github/workflows/0000775000175000017500000000000015005737564021061 5ustar katharakatharapython-sse-starlette-2.3.4/.github/workflows/build.yml0000664000175000017500000000262715005737564022712 0ustar katharakathara--- # https://github.com/nalgeon/podsearch-py/tree/main/.github/workflows name: build on: push: branches: [main] pull_request: branches: [main] workflow_dispatch: jobs: build: runs-on: ubuntu-latest strategy: matrix: python-version: [3.9, '3.10', '3.11', '3.12'] env: USING_COVERAGE: '3.10' steps: - name: Checkout sources uses: actions/checkout@main - name: Set up Python uses: actions/setup-python@v3 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | python -m pip install --upgrade pip pip install tox tox-gh-actions \ pytest \ pytest-cov \ pytest-asyncio \ coverage \ ruff \ requests \ httpx \ asgi_lifespan \ psutil \ uvicorn \ starlette \ fastapi \ tenacity \ portend \ testcontainers \ async-timeout - name: Run tests run: | make test-unit - name: Upload coverage to Codecov uses: codecov/codecov-action@v5 if: contains(env.USING_COVERAGE, matrix.python-version) with: token: ${{ secrets.CODECOV_TOKEN }} fail_ci_if_error: true verbose: true # optional (default = false) python-sse-starlette-2.3.4/.github/dependabot.yml0000664000175000017500000000077515005737564021665 0ustar katharakathara# Configuration: https://dependabot.com/docs/config-file/ # Docs: https://docs.github.com/en/github/administering-a-repository/keeping-your-dependencies-updated-automatically version: 2 updates: - package-ecosystem: "pip" directory: "/" schedule: interval: "daily" allow: - dependency-type: "all" commit-message: prefix: ":arrow_up:" open-pull-requests-limit: 5 - package-ecosystem: "github-actions" directory: "/" schedule: interval: "monthly" python-sse-starlette-2.3.4/README.md0000664000175000017500000001516315005737564016751 0ustar katharakathara# Server Sent Events for [Starlette](https://github.com/encode/starlette) and [FastAPI](https://fastapi.tiangolo.com/) [![Downloads](https://static.pepy.tech/badge/sse-starlette/week)](https://pepy.tech/project/sse-starlette) [![PyPI Version][pypi-image]][pypi-url] [![Build Status][build-image]][build-url] [![Code Coverage][coverage-image]][coverage-url] > Implements the [Server-Sent Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events) specification. Background: https://sysid.github.io/server-sent-events/ Installation: ```shell pip install sse-starlette ``` Usage: ```python import asyncio import uvicorn from starlette.applications import Starlette from starlette.routing import Route from sse_starlette.sse import EventSourceResponse async def numbers(minimum, maximum): for i in range(minimum, maximum + 1): await asyncio.sleep(0.9) yield dict(data=i) async def sse(request): generator = numbers(1, 5) return EventSourceResponse(generator) routes = [ Route("/", endpoint=sse) ] app = Starlette(debug=True, routes=routes) if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8000, log_level='info') ``` Output: ![output](output.png) **Caveat:** SSE streaming does not work in combination with [GZipMiddleware](https://github.com/encode/starlette/issues/20#issuecomment-704106436). Be aware that for proper server shutdown your application must stop all running tasks (generators). Otherwise you might experience the following warnings at shutdown: `Waiting for background tasks to complete. (CTRL+C to force quit)`. Client disconnects need to be handled in your Request handler (see example.py): ```python async def endless(req: Request): async def event_publisher(): i = 0 try: while True: i += 1 yield dict(data=i) await asyncio.sleep(0.2) except asyncio.CancelledError as e: _log.info(f"Disconnected from client (via refresh/close) {req.client}") # Do any other cleanup, if any raise e return EventSourceResponse(event_publisher()) ``` # Thread Safety with SQLAlchemy Sessions and Similar Objects The streaming portion of this package is accomplished via anyio TaskGroups. Care needs to be taken to avoid passing objects that are not thread-safe to generators you use to yield streaming data. For example, if you are using SQLAlchemy, you should not use/pass an `AsyncSession` object to your generator: ```python # ❌ This can result in "The garbage collector is trying to clean up non-checked-in connection..." errors async def bad_route(): async with AsyncSession() as session: async def generator(): async for row in session.execute(select(User)): yield dict(data=row) return EventSourceResponse(generator) ``` Instead, ensure you create sessions within the generator itself ```python # ✅ This is safe async def good_route(): async def generator(): async with AsyncSession() as session: async for row in session.execute(select(User)): yield dict(data=row) return EventSourceResponse(generator) ``` ## Special use cases ### Customize Ping By default, the server sends a ping every 15 seconds. You can customize this by: 1. setting the `ping` parameter 2. by changing the `ping` event to a comment event so that it is not visible to the client ```python @router.get("") async def handle(): generator = numbers(1, 100) return EventSourceResponse( generator, headers={"Server": "nini"}, ping=5, ping_message_factory=lambda: ServerSentEvent(**{"comment": "You can't see\r\nthis ping"}), ) ``` ### SSE Send Timeout To avoid 'hanging' connections in case HTTP connection from a certain client was kept open, but the client stopped reading from the connection you can specifiy a send timeout (see [#89](https://github.com/sysid/sse-starlette/issues/89)). ```python EventSourceResponse(..., send_timeout=5) # terminate hanging send call after 5s ``` ### Fan out Proxies Fan out proxies usually rely on response being cacheable. To support that, you can set the value of `Cache-Control`. For example: ```python return EventSourceResponse( generator(), headers={"Cache-Control": "public, max-age=29"} ) ``` ### Error Handling See example: `examples/error_handling.py` ### Sending Responses without Async Generators Async generators can expose tricky error and cleanup behavior especially when they are interrupted. [Background: Cleanup in async generators](https://vorpus.org/blog/some-thoughts-on-asynchronous-api-design-in-a-post-asyncawait-world/#cleanup-in-generators-and-async-generators). Example [`no_async_generators.py`](https://github.com/sysid/sse-starlette/pull/56#issue-1704495339) shows an alternative implementation that does not rely on async generators but instead uses memory channels (`examples/no_async_generators.py`). ### Using pytest to test SSE Endpoints When testing more than a single SSE endpoint via pytest, one may encounter the following error: `RuntimeError: is bound to a different event loop`. A workaround to fix this error is to use the following fixture on all tests that use SSE: ```python @pytest.fixture def reset_sse_starlette_appstatus_event(): """ Fixture that resets the appstatus event in the sse_starlette app. Should be used on any test that uses sse_starlette to stream events. """ # See https://github.com/sysid/sse-starlette/issues/59 from sse_starlette.sse import AppStatus AppStatus.should_exit_event = None ``` For details, see [Issue#59](https://github.com/sysid/sse-starlette/issues/59#issuecomment-1961678665). ## Development, Contributing 1. install pdm: `pip install pdm` 2. install dependencies using pipenv: `pdm install -d`. 3. To run tests: ### Makefile - make sure your virtualenv is active - check `Makefile` for available commands and development support, e.g. run the unit tests: ```shell make test make tox ``` For integration testing you can use the provided examples in `tests` and `examples`. If you are using Postman, please see: https://github.com/sysid/sse-starlette/issues/47#issuecomment-1445953826 [pypi-image]: https://badge.fury.io/py/sse-starlette.svg [pypi-url]: https://pypi.org/project/sse-starlette/ [build-image]: https://github.com/sysid/sse-starlette/actions/workflows/build.yml/badge.svg [build-url]: https://github.com/sysid/sse-starlette/actions/workflows/build.yml [coverage-image]: https://codecov.io/gh/sysid/sse-starlette/branch/master/graph/badge.svg [coverage-url]: https://codecov.io/gh/sysid/sse-starlette python-sse-starlette-2.3.4/Manifest.in0000664000175000017500000000014715005737564017564 0ustar katharakatharainclude CHANGELOG.md include LICENSE include README.md global-include *.typed prune .tox prune .venv python-sse-starlette-2.3.4/CHANGELOG.md0000664000175000017500000000354415005737564017303 0ustar katharakathara # 1.3.3 — 2023-03-11 removal of requirements.txt python 3.11 added to tox # 1.3.0 — 2023-02-09 - replace anyio.sleep() with anyio.Event # 1.2.1 — 2022-11-15 - add support for custom async iterable objects https://github.com/sysid/sse-starlette/pull/43 # 1.1.6 — 2022-07-31 - replace `asyncio.sleep()` with `anyio.sleep` # 1.1.4 — 2022-07-31 - introduced scriv for changelog management # 1.1.3 (2022-07-26) - fix: py.typed was missing in PyPi distribution # 1.1.0 (2022-07-25) - allow user to set cache-control header for fan-out use-case: Ref: https://www.fastly.com/blog/server-sent-events-fastly # 1.0.0 (2022-07-24) - drop support for python 3.6 and 3.7 - removed unused private attribute `_loop` from class `EventSourceResponse` - updated example in README.md # 0.10.3 (2022-01-25) - fix: use starlette's code to set proper content-type and charset - fix: update examples # 0.10.0 (2021-12-14) - base EventSourceResponse on latest starlette StreamingResponse (0.17.1) and use anyio - breaking change: `response.wait()` and `response.stop_streaming()` removed # 0.9.0 (2021-10-09) - add sse comment support # 0.8.1 (2021-09-30) - minimum required python version relaxed to python 3.6 # 0.8.0 (2021-08-26) - using module-based logger instead of uvicorn logger # 0.7.2 (2021-04-18) - refactoring: Github Actions introduced into build pipeline # 0.6.2 (2020-12-19) - fix: correct shutdown signal handling in case of an endpoint which only yields sporadic messages # 0.6.1 (2020-10-24) - updated example with proper error handling # 0.6.0 (2020-10-24) - In case [uvicorn](https://www.uvicorn.org/) is used: monkeypatch uvicorn signal-handler, in order to gracefully shutdown long-running handlers/generators. python-sse-starlette-2.3.4/readme_uvicorn.md0000664000175000017500000000011415005737564021004 0ustar katharakathara# Fix Breaking: https://github.com/encode/uvicorn/compare/0.28.1...0.29.0 python-sse-starlette-2.3.4/pyproject.toml0000664000175000017500000000652115005737564020404 0ustar katharakathara[project] name = "sse-starlette" version = "2.3.4" description = "SSE plugin for Starlette" readme = "README.md" license = {text = "BSD-3-Clause"} requires-python = ">=3.9" authors = [ { name = "sysid", email = "sysid@gmx.de" }, ] classifiers = [ "Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Topic :: Internet :: WWW/HTTP", ] dependencies = [ "anyio>=4.7.0", "starlette>=0.41.3", ] [project.optional-dependencies] examples = [ "fastapi", ] uvicorn = [ "uvicorn>=0.34.0", ] [dependency-groups] # new standard, included by default dev = [ "asgi-lifespan>=2.1.0", "async-timeout>=5.0.1", "codecov>=2.1.13", "httpx>=0.28.1", "mypy>=1.14.0", "portend>=3.2.0", "psutil>=6.1.1", "pytest>=8.3.4", "pytest-asyncio>=0.25.0", "pytest-cov>=6.0.0", "ruff>=0.8.4", "tenacity>=9.0.0", "testcontainers>=4.9.0", "build>=1.2.2.post1", ] [project.urls] Source = "https://github.com/sysid/sse-starlette" [build-system] requires = ["setuptools"] build-backend = "setuptools.build_meta" [tool.bumpversion] current_version = "2.3.4" commit = true tag = false message = "Bump version to {new_version}" [tool.bumpversion.file_patterns] "sse_starlette/__init__.py" = [ {search = "__version__ = '{current_version}'", replace = "__version__ = '{new_version}'"}, ] "VERSION" = [ {search = "{current_version}", replace = "{new_version}"}, ] "pyproject.toml" = [ {search = "version = {current_version}", replace = "version = {new_version}"}, ] [[tool.bumpversion.files]] filename = "VERSION" [[tool.bumpversion.files]] filename = "pyproject.toml" [[tool.bumpversion.files]] filename = "sse_starlette/__init__.py" [tool.pytest.ini_options] markers = [ "integration: marks tests as integration tests", "experimentation: marks tests as experimental tests, not to be run in CICD" ] asyncio_mode = "auto" #addopts = "--cov=my_package --cov-report=term-missing" [tool.mypy] ignore_missing_imports = false namespace_packages = true [tool.coverage.run] source = ["sse_starlette"] omit = [ "tests/*", "**/__main__.py", "**/.venv/*", "**/site-packages/*", ] branch = true [tool.coverage.report] show_missing = true skip_covered = true fail_under = 85 [tool.ruff] exclude = [ ".bzr", ".direnv", ".eggs", ".git", ".git-rewrite", ".hg", ".ipynb_checkpoints", ".mypy_cache", ".nox", ".pants.d", ".pyenv", ".pytest_cache", ".pytype", ".ruff_cache", ".svn", ".tox", ".venv", ".vscode", "__pypackages__", "_build", "buck-out", "build", "dist", "node_modules", "site-packages", "venv", ] line-length = 88 indent-width = 4 target-version = "py312" [tool.ruff.lint] select = ["E4", "E7", "E9", "F"] ignore = [] fixable = ["ALL"] unfixable = [] dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" [tool.ruff.format] quote-style = "double" indent-style = "space" skip-magic-trailing-comma = false line-ending = "auto" python-sse-starlette-2.3.4/examples/0000775000175000017500000000000015005737564017302 5ustar katharakatharapython-sse-starlette-2.3.4/examples/example_fastapi_sqlalchemy.py0000664000175000017500000000246615005737564025250 0ustar katharakatharaimport typing as T import sqlalchemy as sa from fastapi import Depends, FastAPI from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine from sse_starlette.sse import EventSourceResponse # Database db_bind = create_async_engine("sqlite+aiosqlite://:memory:") AsyncSessionLocal = async_sessionmaker(bind=db_bind, expire_on_commit=False) async def async_db_session(): async with AsyncSessionLocal() as session: yield session AsyncDbSessionDependency = T.Annotated[AsyncSession, Depends(async_db_session)] TODOS_CTE_SQL = """ WITH todo AS ( SELECT 1 AS id, 'Task 1' AS title, 'Description 1' AS description, 0 AS completed UNION ALL SELECT 2, 'Task 2', 'Description 2', 1 UNION ALL SELECT 3, 'Task 3', 'Description 3', 0 ) SELECT * FROM todo """ # App app = FastAPI() @app.route("/things") async def things(db_session: AsyncDbSessionDependency): # Safe to use db_session here to do auth or something else. async def thing_streamer(): # Do *NOT* reuse db_session here within the AsyncGenerator, create a # new session instead. async with AsyncSessionLocal() as session: async for row in session.execute(sa.text(TODOS_CTE_SQL)): yield {"data": dict(row)} return EventSourceResponse(thing_streamer) python-sse-starlette-2.3.4/examples/no_async_generators.py0000664000175000017500000000552315005737564023723 0ustar katharakatharaimport logging from functools import partial import anyio import trio import uvicorn from anyio.streams.memory import MemoryObjectSendStream from fastapi import FastAPI from starlette.requests import Request from sse_starlette.sse import EventSourceResponse _log = logging.getLogger(__name__) log_fmt = r"%(asctime)-15s %(levelname)s %(name)s %(funcName)s:%(lineno)d %(message)s" datefmt = "%Y-%m-%d %H:%M:%S" logging.basicConfig(format=log_fmt, level=logging.DEBUG, datefmt=datefmt) app = FastAPI() @app.get("/endless") async def endless(req: Request): """Simulates an endless stream In case of server shutdown the running task has to be stopped via signal handler in order to enable proper server shutdown. Otherwise, there will be dangling tasks preventing proper shutdown. """ send_chan, recv_chan = anyio.create_memory_object_stream(10) async def event_publisher(inner_send_chan: MemoryObjectSendStream): async with inner_send_chan: try: i = 0 while True: i += 1 await inner_send_chan.send(dict(data=i)) await anyio.sleep(1.0) except anyio.get_cancelled_exc_class() as e: _log.info(f"Disconnected from client (via refresh/close) {req.client}") with anyio.move_on_after(1, shield=True): await inner_send_chan.send(dict(closing=True)) raise e return EventSourceResponse(recv_chan, data_sender_callable=partial(event_publisher, send_chan)) @app.get("/endless-trio") async def endless_trio(req: Request): """Simulates an endless stream In case of server shutdown the running task has to be stopped via signal handler in order to enable proper server shutdown. Otherwise, there will be dangling tasks preventing proper shutdown. """ raise Exception("Trio is not compatible with uvicorn, this code is for example purposes") send_chan, recv_chan = trio.open_memory_channel(10) async def event_publisher(inner_send_chan: trio.MemorySendChannel): async with inner_send_chan: try: i = 0 while True: i += 1 await inner_send_chan.send(dict(data=i)) await trio.sleep(1.0) except trio.Cancelled as e: _log.info(f"Disconnected from client (via refresh/close) {req.client}") with anyio.move_on_after(1, shield=True): # This may not make it await inner_send_chan.send(dict(closing=True)) raise e return EventSourceResponse(recv_chan, data_sender_callable=partial(event_publisher, send_chan)) if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8080, log_level="trace", log_config=None) # type: ignore python-sse-starlette-2.3.4/examples/load_test.py0000664000175000017500000000313115005737564021630 0ustar katharakathara################################################################################ # Load test # e.g. test for lock contention: https://github.com/sysid/sse-starlette/issues/77 # # to run it: # PYTHONPATH=. uvicorn examples.load_test:app # curl http://localhost:8000/stream | pv --line-mode --average-rate > /dev/null ################################################################################ import json import uvicorn from fastapi import FastAPI, Request from sse_starlette.sse import EventSourceResponse position = ( json.dumps( { "position_timestamp": "2023-09-19T11:25:35.286Z", "x": 0, "y": 0, "z": 0, "a": 0, "b": 0, "c": 0, # some more fields } ) + "\n" ) positions = [position] * 500 sse_clients = 0 app = FastAPI() @app.get("/stream") async def message_stream(request: Request): async def event_generator(): global sse_clients sse_clients += 1 print(f"{sse_clients} sse clients connected", flush=True) while True: # If client closes connection, stop sending events if await request.is_disconnected(): break for p in positions: # fixes socket.send() raised exception, but makes it very slow!! if await request.is_disconnected(): break yield p return EventSourceResponse(event_generator()) if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8000, log_level="error", log_config=None) # type: ignore python-sse-starlette-2.3.4/examples/example.py0000664000175000017500000000543015005737564021311 0ustar katharakatharaimport asyncio import logging import uvicorn from starlette.applications import Starlette from starlette.requests import Request from starlette.responses import HTMLResponse from starlette.routing import Route from sse_starlette.sse import EventSourceResponse from starlette.types import Message logger = logging.getLogger(__name__) # unpatch_uvicorn_signal_handler() # if you want to rollback monkeypatching of uvcorn signal-handler _log = logging.getLogger(__name__) log_fmt = r"%(asctime)-15s %(levelname)s %(name)s %(funcName)s:%(lineno)d %(message)s" datefmt = "%Y-%m-%d %H:%M:%S" logging.basicConfig(format=log_fmt, level=logging.DEBUG, datefmt=datefmt) html_sse = """

Response from server:

""" async def numbers(minimum, maximum): """Simulates and limited stream""" for i in range(minimum, maximum + 1): await asyncio.sleep(0.9) yield dict(data=i) async def client_close_handle(message: Message): logger.debug(f"client_close_handle: {message}") async def endless(req: Request): """Simulates and endless stream In case of server shutdown the running task has to be stopped via signal handler in order to enable proper server shutdown. Otherwise, there will be dangling tasks preventing proper shutdown. """ async def event_publisher(): i = 0 try: while True: # yield dict(id=..., event=..., data=...) i += 1 yield dict(data=i) await asyncio.sleep(0.9) except asyncio.CancelledError as e: _log.info(f"Disconnected from client (via refresh/close) {req.client}") # Do any other cleanup, if any raise e return EventSourceResponse(content=event_publisher(), client_close_handler_callable=client_close_handle) async def sse(request): generator = numbers(1, 25) return EventSourceResponse(generator) async def home(req: Request): return HTMLResponse(html_sse) routes = [ Route("/", endpoint=home), Route("/numbers", endpoint=sse), Route("/endless", endpoint=endless), ] app = Starlette(debug=True, routes=routes) if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8000, log_level="trace", log_config=None) # type: ignore python-sse-starlette-2.3.4/examples/__init__.py0000664000175000017500000000000015005737564021401 0ustar katharakatharapython-sse-starlette-2.3.4/examples/stream_generator.py0000664000175000017500000000442215005737564023217 0ustar katharakatharaimport asyncio from typing import Optional from fastapi import Depends, FastAPI from starlette import status from sse_starlette import EventSourceResponse, ServerSentEvent """ This example shows how to use a stream to push messages to a single client Remark: Lazy initialization of the queue for safe handling of initializing asyncio.Queue() outside of an async context (it calls asyncio.get_event_loop() internally). This is not an issue for python > 3.9 any more. Example Client Usage: # This command will stay connected and display all incoming messages curl -N http://127.0.0.1:8000/sse # In a separate terminal, send a message curl -X POST "http://127.0.0.1:8000/message?message=Hello%20World" -H "accept: application/json" # Send a message with quotes and spaces curl -X POST "http://127.0.0.1:8000/message?message=This%20is%20a%20test%20message" -H "accept: application/json" # Send a message with special characters curl -X POST "http://127.0.0.1:8000/message?message=Special%20chars:%20%21%40%23%24%25%5E%26%2A%28%29" -H "accept: application/json" # Send multiple messages in quick succession for i in {1..5}; do curl -X POST "http://127.0.0.1:8000/message?message=Message%20number%20$i" -H "accept: application/json" sleep 0.5 done """ class Stream: def __init__(self) -> None: self._queue: Optional[asyncio.Queue[ServerSentEvent]] = None @property def queue(self) -> asyncio.Queue[ServerSentEvent]: if self._queue is None: self._queue = asyncio.Queue[ServerSentEvent]() return self._queue def __aiter__(self) -> "Stream": return self async def __anext__(self) -> ServerSentEvent: return await self.queue.get() async def asend(self, value: ServerSentEvent) -> None: await self.queue.put(value) app = FastAPI() _stream = Stream() @app.get("/sse") async def sse(stream: Stream = Depends(lambda: _stream)) -> EventSourceResponse: return EventSourceResponse(stream) @app.post("/message", status_code=status.HTTP_201_CREATED) async def send_message(message: str, stream: Stream = Depends(lambda: _stream)) -> None: await stream.asend( ServerSentEvent(data=message) ) if __name__ == "__main__": import uvicorn uvicorn.run(app, host="127.0.0.1", port=8000, log_level="trace") python-sse-starlette-2.3.4/examples/error_handling.html0000664000175000017500000000106515005737564023167 0ustar katharakathara Title

look at the console

python-sse-starlette-2.3.4/examples/error_handling.py0000664000175000017500000000247515005737564022661 0ustar katharakatharaimport asyncio from typing import Any from fastapi import APIRouter, FastAPI, HTTPException from starlette.staticfiles import StaticFiles from sse_starlette import EventSourceResponse, ServerSentEvent """ This example shows how to handle errors in the generator function. The error message can be processed on the client-side to handle the error gracefully. Note the use of return after yielding the error message. This will stop the generator from continuing after an error occurs. """ app = FastAPI(title=__name__) router = APIRouter(prefix="/sse") async def numbers(minimum: int, maximum: int) -> Any: for i in range(minimum, maximum + 1): try: if i == 3: raise HTTPException(400) except HTTPException as e: yield ServerSentEvent(**{"data": str(e)}) return else: await asyncio.sleep(0.9) yield dict(data=i) @router.get("") async def handle(): generator = numbers(1, 100) return EventSourceResponse( generator, headers={"Server": "nini"}, ping=5, ping_message_factory=lambda: ServerSentEvent(**{"comment": "You can't see\r\nthis ping"}), ) app.include_router(router) app.mount("/", StaticFiles(directory="./")) if __name__ == "__main__": import uvicorn uvicorn.run(app) python-sse-starlette-2.3.4/examples/example_fastapi.py0000664000175000017500000000245315005737564023022 0ustar katharakatharaimport asyncio import logging import uvicorn from fastapi import FastAPI from starlette.requests import Request from sse_starlette.sse import EventSourceResponse _log = logging.getLogger(__name__) log_fmt = r"%(asctime)-15s %(levelname)s %(name)s %(funcName)s:%(lineno)d %(message)s" datefmt = "%Y-%m-%d %H:%M:%S" logging.basicConfig(format=log_fmt, level=logging.DEBUG, datefmt=datefmt) app = FastAPI() @app.get("/endless") async def endless(req: Request): """Simulates and endless stream In case of server shutdown the running task has to be stopped via signal handler in order to enable proper server shutdown. Otherwise, there will be dangling tasks preventing proper shutdown. """ async def event_publisher(): i = 0 try: while True: # yield dict(id=..., event=..., data=...) i += 1 yield dict(data=i) await asyncio.sleep(0.9) except asyncio.CancelledError as e: _log.info(f"Disconnected from client (via refresh/close) {req.client}") # Do any other cleanup, if any raise e return EventSourceResponse(event_publisher()) if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8000, log_level="trace", log_config=None) # type: ignore python-sse-starlette-2.3.4/examples/stream_generator_multiple.py0000664000175000017500000000240015005737564025124 0ustar katharakatharaimport asyncio from typing import List from fastapi import Depends, FastAPI from starlette import status from sse_starlette import EventSourceResponse, ServerSentEvent """ This example shows how to use multiple streams. """ class Stream: def __init__(self) -> None: self._queue = None @property def queue(self): if self._queue is None: self._queue = asyncio.Queue[ServerSentEvent]() return self._queue def __aiter__(self) -> "Stream": return self async def __anext__(self) -> ServerSentEvent: return await self.queue.get() async def asend(self, value: ServerSentEvent) -> None: await self.queue.put(value) app = FastAPI() _streams: List[Stream] = [] @app.get("/sse") async def sse(stream: Stream = Depends()) -> EventSourceResponse: stream = Stream() _streams.append(stream) return EventSourceResponse(stream) @app.post("/message", status_code=status.HTTP_201_CREATED) async def send_message(message: str, stream: Stream = Depends()) -> None: for stream in _streams: await stream.asend( ServerSentEvent(data=message) ) if __name__ == "__main__": import uvicorn uvicorn.run(app, host="127.0.0.1", port=8000, log_level="trace") python-sse-starlette-2.3.4/examples/comment_as_ping.html0000664000175000017500000000053515005737564023335 0ustar katharakathara Title

look at the console

python-sse-starlette-2.3.4/examples/comment_as_ping.py0000664000175000017500000000167515005737564023027 0ustar katharakatharaimport asyncio from fastapi import APIRouter, FastAPI from fastapi.staticfiles import StaticFiles from sse_starlette.sse import EventSourceResponse from sse_starlette import ServerSentEvent """ This examples demonstrates how to use a comment as a ping instead of sending a dedicated event type 'ping'. """ app = FastAPI(title=__name__) router = APIRouter(prefix="/sse") async def numbers(minimum, maximum): for i in range(minimum, maximum + 1): await asyncio.sleep(1) yield f"You\r\ncan see me and I'm the {i}" @router.get("") async def handle(): generator = numbers(1, 100) return EventSourceResponse( generator, headers={"Server": "nini"}, ping=5, ping_message_factory=lambda: ServerSentEvent(**{"comment": "You can't see\r\nthis ping"}), ) app.include_router(router) app.mount("/", StaticFiles(directory="./")) if __name__ == "__main__": import uvicorn uvicorn.run(app) python-sse-starlette-2.3.4/example.png0000664000175000017500000161627415005737564017646 0ustar katharakatharaPNG  IHDRڕYgAMA a cHRMz&u0`:pQ<bKGDIDATxwő8\=EP$E@䜓g396ۀ|$I"AEP/nޙ = BHtWWWwWn5P h@>~o@m1vY"""΍383LXt^ 7ί3:Kt7%bX*ɤB6d4#" `wON?\.9g)[{kNWԖ)3H=k[(|O RXf5ُAG(* u77Q0k)^N}vWSP*/F6\k֢RɷA>ԟ+66 >^3l]T /f`bZ+ h@APAc1FRJIRJ"h{! 5f RJccѥhq{#K'T6Q:a(AQ;CuWڍ#/E)Z?|4V1bX_!tSDD3\ !s"=^bѶQt )n3^> C}=LՃfu6f$ s$a|'n ?_b*X.>O'N2xvВ )4r<P] !ߛ |ЗG:9XׇFk4 P#)I$h=CWuFn@0cc7O*É*YA-Sϣ@(w<t !jeBV.BQ}/!x2RjR<ߧ1ݹW7*> )zX͐_02\1W$y5G0}6vt oeaK6$RGu*!DOg W=iC>Sf)&&и{o|)0LVA^>F55s>'(jOJa1+6Ikqf7 .6pR2#ҨOЀ+ԊRdDk'^k!I=LW^D4㹑ByMHh"6ס_PXY@$}6SM6Zxr.m"DԯF fl _heDg$`fkf* Gw!F;}]xx6ԣ(#:{MD 8 )2NqUz6w+ B _?OSm<(Q(m2}28LT4ỔF<9"|S<ݠ#9,-ik h@PHN]۽N'hR CBWrܙ>S(p@&E"眤$"DU-Cx_oUBԛT>c+ AԃSPpI mĭf_1o:&Q^z"QAF@y":7 h&q :L]oi ەA t*IPڤbcGMտ|J "!28R0 c y~_o^Ч h@Ѐ4Pmq, ۶ RrPJQz`u`ZBAZN00Dw:rwic 뀕džoF}UPD 9>"DXzhX%:kL3> ]--TT 978q>^ZqΪ7d܂FceaUZ?5,)SzZ3PЀ-;tOU\ B297Y<gʥrE*>gv³W90x) ?Vk(-\YO#h/U ;AШ"}Y=]J LEvsC#8*)i*_|6yDE>SLd(7"BP"US_٩n# q87LܟD0TFDx<^oGAU4#G7 !ȊCj_aO,8W*k" xo|18y=@X69K I@Mq0yF 4 ›XQu \6a:VA ;"(cX,KR1 gMPtڳ_KӬ2\Gp]o>Ds;B+1 *܀6[0Ijj 3d )1dLݔhC9R5+E~w' UVB2z2Du*[e˲-۶ma0 Pd1 CKH\*[/SF&%2WUo ?"~g6B Kٛ/MͫD; IJd22)$J[4@Mn>b ""㜈@JP,p]u" naps`Z/ )ԙ9+ T+%yֽyE;Sk^{XwTOu_wԴ(Z 1ȹw UFڸnaG;toX€!aѻ h@>*s8[F: [B ]ZJ97 n$pƐ QRJsD@R=WZGC˯Nဗ $I',$9iQ${JnM"siRrdș[*^ 0\+UBDPHI\l˲m۶.R- -KH$ܶ-V?z2#BJ* ADe(*ǴCdAf\q9T_;]yʈ.*InM-9J}:HK ~QLn10lGtCFJ2Q*8a0u-R@B,c\80O@ `7:"l'Jx<2WA+CBE*__(xDZ$F٭CM"8ЀuZ4 +"BUۜOG`fQ7+i#"ղRHiH촥_P>T*U.x<&B(]Q*LWEL ˆ"a賣@Z}qHJe7f~eXdzYṼCzT+X!֘*zZpOFRrS\%ǎm> qWQugAD -9D5߄/TR%Ro[F |LayeF +_v"[T>i UU9Hȍ﩯B?}Xt̢퍡W܀w2چ ۀ4 h@y,˲ 0Mʤ?0L,JQ3z:QS~ΎN/JI"XS3 0 }@KRXH s9/JDR*nU[V˲%o  Aye͖-̝J&Kc1\=-ʝ#U*]vԩZZ+X -3IlY[nݳgm#F1­y.(J喖&@$艼}3~02p[6tLZ (N?([.,YrYE;5RJI2of.?la--|NI!Thw>jW~6:eԼcg{ysÛ^SSӠO饗){?|DƸ 784믿go+d\-'Fұ {Qh^Gd,FUKgڹskiӦwy'O2eɋ-J&~fw~%:,7:H8$I*(y,N"TG$ $9 sW蚭* C@!Rl)92[ "~>JWD; @ @"Ȥ` I}K BI$=o!I`34$`|& $S9# %tm ]@WlVQgn@Ѐ4ף~6M7(|p@ N$Rk"/ݽBdX*bkkFRp2X*! IǏ%Dt|LkC$mݲēNJH$wd6c'J)ն-minA8'IRyo7`Ŋ8e4|.k!)G'saO6+-˲㒤e,R;~IJŶnݲ~34cϯT*Ad$+~-,d3N߅_D2DJ "dN!e[gРAB9u{*I [RLDk^Y3g*3ʼn>(XbDf/ߞe-Jҽ=BaǎW_gyg1ΤÑO:qDX,v 7~yq s> mIo;!cBP<M6%fDRh͚5wrԩK,1 cO>s=wr!MRœ8j&`hT@-}k~#;N^iRg$W;POnQ90 $WPI){*` "R Tm!@-P)(2cI% `HBɸ0^iBE,JP+M]`ʆEeSi 1Ł$% s(- `sϑ(!a_4 h@Ѐ4P)%l>j۶3GEJ$%rGJ(0L3JX,[M={L0iͽ$H`)/cEb 0t*,l'xbX|wf͞=]Jѱ᭷ |X4|Etxy1۶MOz߶l˶v5p@ιkf ӝ Ƹbh;wbq5] |w tfeeabٗ(6U{{::Iէ :3WQ!sTCHI֯>` ]G" 8455͟?|_7o^KKKPT@`-+V|͙l%G|C iiiy뭷V\r!gsYB=(?lRH4o^xa谡77_~n+8p79`e +̥jE~x'q`X,^wu<@kkq㚛e+޲c^h;SO_¾&gdx1ōwyW/7'"1pTHO#`yAآN>ϽI?x`m]O<)}/3$-dO?}3[$w_KF|r'glltxO??HvUJ_>ՒmO7?5aJr(R,5|ѧ^~hpi緮n),h*Td34\ h@Ѐ4Bz@}D"o(I  ,KXvъ^ WYD2wttܹsʔ)\v붭L6LJ)MיBG~ `eVٲma箼rÆM_גdGǞA?_e}v[ rRO<ڶobXP(˛>tAرi2؉SF5ͤE˲lvK#cܶE>_mۭpD^.m۱X%_?tN$? 0駟"hv<8)WvwϞ=;=1bؼ͘Y(VZۋn~\< "۶{zzN!ėW\y1cd\0a'?)Spfv+!CS3a&tjq?C ~Ncf?#{oQ In.^OBB4.(r>|?|_ʪ7v<@R,Mh!,y3+dbO` Iy X؞p[ $AR]$ $P~ "0`PiIJs`mqÿ]T/G_8>s.&18k/ʶo^1_x| 'B _|=e]?}v3ɒ3˾W÷߃;1>l)P .]wۋϺ_/hzˮoC9zy#v'.8ѥgon ,ѳmo! :rL9ݾⷿz33h1Qx +-)ڵk{zz4k,*Q;%ɝXǽ^KQJ!m8yL[ҪR/tA---|&^έjKcez3 ,8C i!ĚzX\F5{58b1H׿Zjȑ#rcx/g?[f 7pW(3Mv5FLf?SR/<555U_oZjѢEe:f~ΝK8Ār`pUf]xcɘ%s7|{ymYġdw|{߼3cO~r`,?]|Y@>OwÇ~M{16^&no>&|}r[6/U' ܾ=ٳlxD-H!f7է?W}ϯۃ}oLI1g~w郒">? E @` ۇWܑqտyWwN7 @fK=?+JJٍ{vg~}4Kٶ8flE:w_w{q>GOZ|q3٩͇'/?r߅G7gf/?Kj#fK_\2_UZPЀ4 h?*rt:sΞt:믿rJ*{ 4qD%Ï5vSڊ ґSHint/ 2dm#Fx,ٙnj*^v'^#*RY$XVrAq)L4iɒ%rݻm[Rz8U1l.J3|۶m#G4c1)I0`myOO_L[[)CV[-%H+7缥eС~gmmm^機̶x"SJ??O;4uQHпЩLF՜q.vmWWנAΛH5]R/ ) p^X(y^T.+swLӤX_期p *#Z!bfmˎts YHp /Z5|}{JgVaÇ}s>y)3^%pj!ׯ_?z趶6뮻λΝK/uf 2瓖\2oWώףD?uu0̿#y῝:mm'\cd>R$pSwfO^a&uVpkGp]2?[vܯ=!2C8vf*ĠiŨ9]Şpe眆Rjhwweݏs7tlKuy͞/xdmy H&۠>d|p096&y#X,ceo=a18-<b9v,\ĩ;w{{{q`dw':J6|΀f{;sVz6o l?6L[e%9(Ty MOnۛqch&4?ݻJooaSE+eO[fXCUn@Ѐ4 ~{nO6775JE7G4rO|*o1n@Xˀt0A c677+FfN9,=ݝuB[o'LR;@6ӌ755[M>,"~_V#b`ᲚP.mۦ<B|+_a'?>9r䫯Zٓ[y `IhJw?<;iΘ\|y#O? o?~cF@#>rp$!DXg\8ph=Chb B\ELF"ޘ}) }w5maV_a0+Lфoo*6vgg S `fi\Ě*t"<eYTSKB`Lv֕qH7gS@iGo?ؾ{L%083ö]b>c 9!t/X5.u!sB$MЀ4 h?|3s'.^X}nY'?Iزe˞y\veT)ϣP5U N&Ç|d2HpABgWgKRGGGww 7lxS+n,qRݛP(,^SO]f3{9) r *;V]Sem"@TwSooѣ&Mf%I0DPN5ҩqS.m;N>Fbe[r׉AwUBu;\lqwy1{p87֯vҩ4I9/JPUW)-!3MP,@qK[ZBsJfōDXTT+J͜s!%`K"p$gLid2x,x3n ;H-1SuϝZ{;;>6nX,ɤ4lY$ekk+Lw߭[fx X#*O9Y.#dVܖeHr/%ftƟ?KY#,ak1~>m@GLoxݩ}1" qU @69أ~2'vV{>(7|%r+vȾYjL@`0$EE@"`IatlroDLDrF2d X}*x_U}#rdJw5MsSOKMMJg>Z.2"|>o۶^, >(fe)[&M%m B0J咺ڲ,0fKLPG.E ۶pLӖeuvv.*>|pι;LƙZU sV?xgfo⯠,*:!߉~k[[۶m۾v͚l67M\ɥTZO];\- dx۶^~d2y衇& ,Fͦ#̜1\.?e1T27o~7}=-Fz870եj # Fƣt:韺 8>ƾW1cF%J'$I=Xr@bPk7)Awgw96|K0VmW @*:Đ4tK~٣־I[C<cl`AYB0lOb#uq ^ޒhЁ#G 0z$ 6.9ܽc42w{cjp7|wcM_̶Now" ?:}6JVՍZcG{>x6bw}97`}@ ٕkH@ IY+4b0+laKYr{[ ɡc0hpeHArsrШaػk>j:1j7 h@Ѐc *xРA---xwݲeK<Ozpe.|§[[,Y3,[L)Jy.[ea+VXfφ*ĉpF:"rB$i15Rڲ;R)1vyme U\瞦&/*ggo ,۶X:mbsGM;iw!o?^}{7 p8Xm}۱jzHX֎^]چ6nn9 j?1ŭkWy7K ӏS]m{[E6m`7sH6$M N[Н\[{u|S(KfV^F>M`JG]pɛVSELbex-a~k>y7yO9`=#N,5f=Oߴ-{{ʥL5,]gvi8q?ɲyce'LdO~p3irڷ|xoTSk|c ܶj'JY z|{Q'7^c93 z_>ֶ-՝O>{,k  h@Ѐ}_q-]oAܹӓk92Uk=SJ~[B/˶[{3r7^Ud,677)/R)0TYi"RN怚■`1ښH$vY,8 J\.L&eۜT:dPu0 TJΝ;׭[꟫z/Y|~˖-;wTzR$PH.a?h3jqʸb!jժR+̛7όZkT13+7 8Kj1""! Ӱm{ݺu=fw㨽E( 0sιm۶yԑ&N*Kgygm?ڊf3M1kp^mΘ7c 4#IeD(JxvD"q'}7p_L=`u]q+2NWHK"BXa|~g631h\r|n~\ѓc95]^O]/Wl87rۖ?tggdt'083_8۞~2-M=S d~[uzL21zd駞{wͫ5~(0,@I&@OiwYu#ETgq$DhKǶCN՗OifȌvnLw\<8aT ؎R-9N#g}-7WO񫧵Rt(viʤO}˙k_EgIrA$iɻZ \|c2sy-׿2 Νa1/秞t |İ .:gy4 7 ?Y&zi3mbUZl@Ѐ4 GjAr[R 2ƞy[,U\zQum:U]Q=d@g!CWn"W)z_IDcRʃ>K_Ҹ=_I5:۶=ˊt͒(˦ҩb߱Í1lYw2 M3zW؍6MDDZH􋗽zjLT*%I˲E]%+2>`\g}&N6lH)?OM:Uҩ^,ScaPX{O'RY&+T1ۙ0!R  $bHJLH@)iL'ȧxJ-mD`X]P"+f,򸓆SXP$r[ =Z})cIQmH6S!^zP ^(乙6@ʤXIS6,E8Y(I f e)/ d `{F @z!^8B9f90rr:#d.e Y)@VBstMp(dm{ƍv۾dɒ#F0:::|wy窫6lׂUP$ɑ`M\V< ڲeim9i۷ 6lǎlvĉ|>f{:d9!ZBL2 @rlh!ԚBJɀ6 #` !pgnWX\`{n>%dX\Q^tzSN95}D.(H#)yp apI@6 QFc -E0$H "8B\vWڽ % .XB85/ h b\pnxI@&nHι;` Ӕ $:wVЀ4 h@O%ض+iӦy !86lrSuf"),˶mKKtfιRJm63srY*JE0U&nL&kpP>|x\Vٞ8mݺm~V[i 眳^}!x  B0z3~eLI:Ne\UG@@Oamڴi Txֽ*ry4 ؾ}[oEK@J!lo0a„#G{DhnnRsQݜcs{guYj ; >uft M9ox: \gVMMMl64!&s}]#$l7ϵ4b]38sj'2 q\*ɤU=@tU9*ky뗈.\x%qEC"ncά0RX7 *GMZAr*aRD DۓLHR5U'զ7F *?!.ses.\ UUB!ˏ; @AZMB8U8 I$H d8rId@ % Ua`j,N7 5H0&%I"dʝS^1I(WA+($1JɓJI"tVQΠxn@Ѐ4CBzmimm F( ʛE+骞N]{zWPW`1)cJmooUc߼Cn7fɉ(&L˖Fh=K) YbX,rlUHy<WᷱX̌Ťjz.h5qgͪ(EʼnȲ,uRWggWW3tSSS:=h y&1 #Jq-޶>QC5vwL:НbB(e _gvOFׂ|\^%^:wݯ| 5wZ;IUjwx nDz: C$aE)bCZ6{CDB{u /w:4k꟒WKJ%c% 49YQšZI  iAGo$bΨ([`:s3UOʲSѽ hB:? 4$]d$M RBptAm|4M4H]aFՎ#Aa:-ʛuíJ_>eVyU wj 5;}aU!fK PЀ4 h?0D:jk:u1$B^):V`U MyȝA D-G !? kJ/_\WotB> =RE㌗UfN,oP`QᣪkHɉ$#"2һ)DJ"Q-G{V+g~+ݟэNFO! jw:W6 _s/s=5H]n-`Th٫ jVhMVȻ^?'Z}`?FϨ9FGW5:>;: ଧui"7 h@Ѐb(ś5岔B+W0zZs p "R"2@v0Dd.{@ڕ}(^ɳtcZI'b1x,fZVLEk|l4M3ux>d7 } ŋV֬(^Y wڋ(Ji2BK<`3*QwVlaQԏ{ZA+F9%@:U!Ѐ4 h@oI"iY"v[w:|n34Y%ӓ[htTi=pe#/ 9A URh=? DR4 4M/.1W* "eAY./]o]0`{V:Z ♚Q Pvڽs;@~grUD'"(i+|G4R3¦N#5ŐE_|QqH}^S&&V׳kwS%HOaFR5ܑEEW#t+Lh4e7HЀ4 h?3l'ޔRT&rk;8?p{h֯;+(=+W﨡\Tk2yכ jõ܂QdUY9T+*Oծk쨿ɟ7nSX NL@Iz)Z="ԶTQ #sa*9WHހ/\H yC)V6*`'L?'}R$:kHQc^UЀ4 h@){<ʶ Ķmۚ`SH9}ɖ`!7қjF3k;\<)HV}kl|Ps.jNSJD xlu4ri~X^V# Q[Tё v{2׾}ǟ–90GJ}Vs: W7ڀea(r8o507sYh{( }[ nl FtЦ\-RoԵZ]{>~CWkqamzq_=^_>B: joN#}xn/:{BMߋHk_N?.Ρzً[_9riG7I6$>T#{³ꎪ6F}q4D&?1P:v>..Ɓ%W#{dlv0]HީS]Ozr^: DX^{w3Y|@JZ뼗_RV8tc~Gm=@*P"BRm >35FM*k@Qw2ls׾uc@}$|Q>t}ǃmUST0TRXnWB;zFXܫ#1 >: A53^5StFڨ~ ZUُq~BxĤs.ὠ$\溦 j<_H#p}vWoy?R_o (x T/xK-2BReQu[ո_.b#m<r7ٝ蚑/(BqĊo uѥw tx 4ť~DI%F=n'NMoOޫw >U 9#` mUMVar!=MKz"R{,{^wGN+^L@Sg7a?3XNj Kiލo7z1jYu$"nŏ.*ہ:8JgB|N'O0Uo@IɃN^g?~YTWo=Jw|=/+:@Z99#C{L#Gp\sE = 5+){a9X,+1+>0w]zV]ՖPU8H[4_vȿ4jCG;sT6(O w@ǟJR{?M ÊQ.byﱈp;K΢*(]{zL\k/CZG!%P( o=RE#_=8PZ(G]pJYy"):봂>8p:m5WWxiNJɴ6#[?K4o8(XZiUI\1ԛwgO\xaQCTxKԓ}ҁ@gvj㊄zŚ\8;~&r_-`# Cn`\4zs#'S<$UrfDVшԴa XEՠm0m؁#uA{=ZpUhT]9 jQERX"4Ǒ@)ܓ/ En<TfתC%ϏZԩ#<,ʇH} zé1G#6~, (T6ޝрD>HA|hO7|7+*^/_HD#__l٢}X_CI}g5[!&/OJI>BٗN59߽ϣ_])D=ܗ\uJnkIM#on:QvF^5FKx~!RD/3.^C)TVcqՅ'gr]T^c BMU_-;G!⽊rlqE@s鬉a2x."c1v纎GV!Dh E"j-a=~}\!m3;*YkU]Q?1҆۷5FY% #.wx,*TsJ-m .} 'Tm u6/FTlG$n q 5 ҎİPEy9X4U`[(+}JbyUYr^ f\1jjUAu^ҿ>kxI7tQp'XBwƽ^9[q:VBhHF%wPuLj"`Pua_(rOY,43ԓ V.!=бoo(F}Yjˡ5Y (n'{gyO'?f׾>`m?I]We51{Ie3C%0\kQh59H \GlDPcW*25vAW?WAeogh6ݰWGo1[h4ψR *`bHY7U{ ilM>X*bUP(_2B'=ihTN5Ruh}x)JN}!͉oy0v*Ui9!Iд?& m!n U3Prr{mjFV`@OGY tpjGr%uMf[(pcN݇8< c,j|ˍ SGϙHckc5Crq6AI'4Z6@\5倂P ٥G umk?tjQrUUqUhRl3ưIzF88!B-9ԗ<]DV`RL-Pl%?UhoR%%a̷QVfWN<#~㨯ZHQ9{T_ >}KaY$ntN|*!rc#*UL&$UJߎ=>hIc۷GՓ9߆4U($e5$!!h|ّj6-η J~#O֯:Ht4!D-Hϩm}W)@p/?9et@ЩI*.e)vUsEM; U#rXz:Owђ$(k\W+Lzysa0lHpMxl1?4ϑzE~8O:4F6Xcz56amGIQ`*:C &)}Q2V]U[>Z6)A;JShbȼOH&W芷k,HIISGt}aIhK+vSeߎ3dªxgzؙ`:3pP뢧Rł L>^੪0/~l-9jTR(cB*Nū$쵹"VX@%YHAm;)+FѢ3PdP I@,IĐ$JH;m#HS&\ݠʨ4faGgv^w'g V-8Z}=BBWxp#jA `>ȣm,W#+YB!x>V{KU$*lb:*z ҵD_O J D_D1sQJ)L!t?wi]e׮X>ǡsh z0a=<`ܽ gC*s]z]x@)HN-v1Ñ1_v$1\gT*qqUae{o_Exn넔V:&y5ŕ:껕G_ nDX7!cHni# DʤL5T,GK^+7/!2dK3c ĮRި`#OGryY\z~mn-]4ͅ5MqtAП8fIgN6:H7R'u蠒.((JY(TF+sI(#p!<mD1H q9Tr~ wm\.Y,2 8TJ51֝U )sIRT~s@OGtM{&hs_ByOZUssy#ImK)`A1*}pY'DJ B ÐBڶS>Ms-ΌqQJY(fb&"˥$pq dF(/`RܺɶIJ0 ?׺eO L<"O9\$B$Z}#%[HWgz; `%; 5)Hj::bINj?4C SAmֵN1u-px(HJT*S;'"£S!4P.M4l>@ߟS#:I@eB,Hͣ3 MIos?3ߩJ=I䰨s$'2w&0r}fekI4+XܙY RMU=.> D9j ɖP;@x<nGwTl"B>o TX,b|!֗&D&{הOOYSyqq1RCund8S˓/童qcdj{ga* | Z$ii}BVY5=I; pJsuH*+|X]MJm _wjSA7'#MVҩjx[|fAy3PH$$ve d'Y؏<ď>6m?=iZ&0N ׋$,1d1oaȼOvqX!0>O~D{;8I)dq sBn tA:<`?C,Y|!cjmsl)^IjS0 T2 1dq 4!0.IBFȘ6s*ף$sF Ϟݒя{tKƤ'IJb,rEF*G:n7xq_=={ 9g@%xmx≶m;cṈMH*]K 1 ! ;2 B=1^$y&E`I"&<$To4xQGV(㜹Ru2 "̻5@7ZϳQ򨔒1 δ΃?j}="CWReQ}&R Cۓ[DD$BxG"*] }'sVT]%X88p GVPPg>Cd-$bxnٲ%Qkk!Cb1"=JS68*^dd e_xTĩi$m gB"a=*F^\0`ۥ{[^}-HڗZ[[|%Wx+"iWu&ܝ !jpH#Hg[+ί|>Ay!F=*)b~Eud$+w!mSww/\(=XAF)R~xR!sd_tDfWJӷv<(gNCJ@pO%0%qRJ1.Z+$ ݕJR2y)]$Gc!wSW$DcK!/e0;;!I'd g Fwx*7.GCw/Ɂkd#c 6Eֳd'$!JDD$wօ+b[Hu L 8ND!{D"lٲd2y!s)2BuuK5ɯlc+F 89D-S;~pM "rƽu$`#C Iu%C&8G:,&!IG$IHqD)}1 [npq6[J!#Z L>jp`I<+ 1I,ܕcjWc Y׹Cn Z5YrRƄ7%H0F !'$@0P<7)W!iJ%I;}8veͽ_YsoL&N)J3w 7*xu^,cw$J RhוzZ LrhM\BDtчGڷmĒ%K [S-M]NASPs3:+[$"\nm-̓TS[*D>uO1 CR4N,Yd@n\TҌA=yC=JoƒBcd2wnjn}iN[nŊj^Իӧpa U1e< .p—w: 9rgT09&KMG|qF0&Mr*\K%۬3H!~[ ;R*_}%pWX7a0|V&GLc'@$I8ʆ#HͽeSw@72@D:DDs"2 Ϸ<裓'O>Ca7K.UJj椔W]uՌ3/"!%R5l!TX(th=NӂAt1Kިݸq6ydaՎ /7|yOGpLp"LurҌf\z*NP0gs,e gq$I ^4 APܶm[kk됡C")R;RWYze)S3]2uang#")"J'BI H$12$Fɤ UOW~xd!2d׷>ZfȀy IRٕU B-sS3\f0`cY19" zC*:sh*g-j&i_'t4vPAP,ziT%E5N}gd9"R(XZN@o %8c<K0WP*ՁVNCsZN#bbLQTLR[^:Bcz*bcmme%I)UU($;{nm39LEǨЍS cVQ )p֠.Z8nx/!X9jh.""|O/vFgGݩoA[vK}S65nV,#W,p|6@ݶ~GqgЋA yR*vjKDDsnp!$ >,z8D:m{`geR=fԣA]q+͟~ 1b<'J"a~@44\.GD֯;TEٲҩTPcB1HBT,&I)e<MRif3bX([Z |KKKWWW,Su+;-|C$*tS8gB~rE-(eRX,V.`WZZZZZZT*)JD2Q,xTJR UN%S\Y!aUH5eNփ3锊衇IO}lob1 ! P~W۶ P^;۶9r,13`RT*U*Jr</ȘU*s3 C)@T,D,+|lP<" NŘ+»}OU6'Q'XwAԧr\7{߽:ԟm"Iu@&ӓfDWWFBiJ)iDwOwKss>ojjmT*%ɲUS%j@D*Z|f͚uy{%-X`ܹs+8 1ͦi0r\kkkXfE---\Ό B<O&=jVJ$jtDX(j"Aкuyfw=:zX̿{?鴢\>C9ѩ>$ˏ>sϵmwk:lutt̟7#޽[1~rSLmkimkʗf??4 C1UL.( /vuu%_|q޼ya&HQ-SF3XU*~bxu :Tqw]sL$͝(enNH idax2NL5vh)8׼O!m5_$7xU/Q"Vhx6n/EfsHL&oC9)U"N_yeͫ-"NV$mj0 Bzx7֖xD3 .]tGd2U.JL$RsCT*BLTS45eκH$Jv%L7rR=YX*ZJriMMM\.ͦՂƠv^iY;*5vg}sc E` !0,}Xq8֮V6MhPHCtI?tA@DdÚ5k:::hq'rf(cC=K/uvv )'Lpᄅt_-[4#<餓ѳL{3U sfL)dss/ֿh"!l?j?`['x?ޟd8GuYg3dDo'#Gܽ{ Hz˭k_}3>,Zhʕ7={e] T֑Ů[؎ά[X !gM$^}uE^z3vѢE/Zo')S\ūв~i⢋.:K3ܜ9s91]! ι3'k1vڬ3{_|ŻkذatЙg_vmgW'vizm޶~R4|s9JWeq#:pӌI)m)d"x-Z(pǥUyTjS[СCooܸqx#{裏N$Ry^{{{&BL06opK,9SJR"DSO=UJ?c]]]cƎ9gϞ_~ywܞg͚}9|~{vvtAts=W\@UH<Ͳa(bΞlD|Ԟ{]#"IW_}q.D"q?\..s=cR~^zT.#FyY3 n/X˗r뭿q}K9s҉'~\=SfΜnJq/Ν;c~h'韮M0{1cr~g1W^ye[JΑy.RYHREYc>i{>r Z2-m?$ 3=5oxkC>;#ꪷ~{ƌ|>˭_~ذa\pAX|饗~~K_:CryժUg>{+VG?ڿ3r7x1|_>c$ NPv QBŤnkPMɾSM{Wy{1eӦx8SA `vOw?O|\>ԥTh,[Ƚ.=rɒ}ۯ\*M8sʙ  զZJrЍPH\NGmii>Și`ҥK?-Y~x?}h#/>`t!o۝;wX}מtIsP΁8G6XrLJ>|sy7v忺W\sCƏ~6Jmܸ{?~A^{Ç_xRiqRyÆ |>bŊ_W&M2th!3P1xuqvj!z":U2rdI&)Ivww0p|;LyfYG,ٱ}{XDa:7<ꨣ_>=? '@ĉŶЬ0N׮]{7vttڶeFPlkkf|}KMMM===Çg&KfܐZfl!ml'[sky[7oKz׋,V6tTAs !@˶9L&N ~6ewݔNK)?pS}kt)A~")騣Zr\67jԨd2lٲn/:uʕ+_uU.Xd/[dɒs9wWyUW0pO"r_^c>ST>7c1,yN}{OK@N޾|ÆV\Q(Tc>ts;gq˖-Yf=cBAxw 2rHI;c:(VIJG馛.)S\?U_‚ ҥK-_%sի~[ߜ4/%iGp4Rqc 7 t,U1D1c=_ꢋ.0/ tpTZzA>{O>W_կ|ulG}+/0ddrvaM0M{}ᇏ'__|%3ف#Z% )EE3E1WUp ~~_'MZnpRiÆ F,ˌy=#{~|%WH #`4˲o'9z!8q"gZz}^p/_~s!C1ϟp Dw޹w7b  & Fy<]T*!+/k9%́k)a@{+`zEgoy9-fk2fFb-[>ƎlٲoՏ3.0`;o}]wM<BG]%K.;w=T*y/Xy@{srͪ=- t|F ds gt=d6W`WasIĜ ip׏=f??WϚ5'رcѣsƍ'M$G}QGeY[ /;ne~__}|W vrѣG3έr9,՚|_jI\}x'Lx'z{{?ώ;nŊ̕W\J*ZA~MuJQаlJ $zb]dwkOn#I-I63DUU#OR3fxGL54#ö3fxW3gdR'3a}9CyӧM0MsƌǏObQNl@q6`BN e~>_7lذaÆ |}\~ٲegyO&3g|wF3fT*ZZ[LbpX,p .l0`Μ9֭۰aifYjݕLKsrQ@`}()4t}gIB_׋.joo9s~m/ޏyvhWim'JO>mTJe zeҤ$a=… /21IMT\s}·UK 9F'J`U\*?_zPEs Pd m۶,kٲe-'.Ӧwwus=ӦM#)yd١zE]*d0aB",9mUv 2TR;X?EcwE7i}u7X,uݗ\rŋpʔ)^xW^9#Ǎ_,Mw}xjni挵ժ7M}ڴiOfk/Z Z=2T&Vdo=wSO韊;osB?g 8W_}u…/mۿoۺYSSԩS|MdV3{voooy;gmHO хL&;y/| ?u]]]$(n$I :8qe[ * Catww8/iYI&};IR^{/8vvt7SwV"!CAfujXlc]FBL Ehf y F$z<1? x&^w iZIR_{/7 酺uX<G4 ˌ$essQsΥ-=O9شuwu{sS.Gqą^(>}=3::;9pDX *WU[Գς{rpJp\"P3N?ŋlذ!QT{=ܣ:&MtY樣jnnyO:bjժ Z%Ir[[[ZN;ScӦM^tyO<{oWv-K[!IJU cSDZWQ5PT*s=zI'96mZOw}K9c&7t:=hР O8wswÐp'Lc|A9{zzۧO^,s m[L>K_}}KO;O> 'OgxY3fg6>}ܡß ڶO~7XvE`yG,Y@rHggC9Dyխ#_+i+J8 &$|E#ր߆wДn"3fѝwu%\'O_y#8b1F&)LaÆ_|x衇z^rGO6P,zףbĨ0HQ7ɑI,kn,:2w u*h"^MasRIRյFlnnVO6ϟWs=3gΜ5kVssU mܸqy13FD---FR{x/_x1 L2 /\vͱKDmmmfRce#w̮% bs_UxKO?5\s5<}5+ `ԍ$,*`0:Nن \٠twK=5Fw lGqId vP,475oݺ_tP8㮿Ύ!0rJe2LΜ9o'q͙37͌3/^*̈́AX~]j{@k[p0 k.Ֆ {RŶذC>\E-Zhԩ(sWggoOYsw5y?OhTM 33v_ BX|oX,vQG9RuV&MFe3fzm$䞎=tQc9bĈC=ڟda-\PQïVsOY6vs LITLƶtmۖe۶nM%VZ|m۲,|{)ToinI&{tX>N]6SLKX,[n4ͣ>ZfŎ?ᄥݷ{ 0ƒԮ -g}V^sN۶?gٯ|+]]BI&yݐL`}߸7o D"ɶ֯|cFfdBRJ0;;.bl:>O<.tq۷o9snEW2^e5-R3HJ`LkX[<2ea"7OZ.Y1Ƿ?_{4Z*ZZV{~lh)8PjR ''^~e}3fwc_g߉^hUGdo"* sVDgϾ;vc[ĉ6H$Nz]wyW)˄ Ν__3g\hь3JY>7kSOXRgJ^]njI¶U?1՝~?8wqg0OktI{lڴi޼yGnQ}V97ٳ㎮=w[5q$ӧvmcBgKdZ;P%jU:RparM92k,.fΜywVe1LC J&gϚ} ̙ͬ-^_ϟի=؎Ύ[gMз|Pp pԢ.»iߺ-^ֆ/^bœn8k֬7x㬳F|>oM[os.M6#:N6{-[A^b@Tz+%}54͑#Gr!^ ;찅NШ͑{DJy)~MD!sq2I)_rR%m޼%Lҋ.:x Dd2s}j *|fhG[{Ơ+՜e !M0  js Q%T*u~eqѱyO3ad %ItM7r뭪Tb-^0-tBPvf0[ 8P 1HH)-˒Rz6zwu\^3@`2l\Lt-°a%+ؓ4sg@7ζl6]]Ii3YfyM&B'c׾59LB /r),G7(`xaTz JwofOk-ZtWeǽM,T߮=Lj 큧vC=\jˌRdYҭ@@` NemqUZ1&Lӻv"IaV.8i Ţf~0>c"6 ( `V<d2B"S;8:"H|]pazK,bLc۶MaV0s554Pd8?DNղB <0B߾n۶m{w]2!3b\*(I)[K?2N_yŕ-8졇~pG\z̽*.¯ Am(Swg,ؖ~fߩ*?;蠃κlD[^_] $Ķl"J&¶Օ9(eu֌VsMWY_RVgZǧLR*ӷmOs1RL6;zX,v?ׯg>NSdW䜹snwygǎ&MrÇ#cj  -I׾"X*E2JSKHQ\nz3wqǠ;lqOĥ7xGc0T5T[&JbMKn3Me,cf̈)$XG/e^v`[agcFt"\1ㆺ͙ "f8+hݦ$QIcQQюaÆ]r%>U%c\*kdj^IUYerFv Y]̚؄RIKk"zΐP\$*ITB *It:htpM6:NW\Ѫu+Y%Yei`ů!k+ k6P~ ;z嗿nݺ]s5/E:w<)VP#+$rUr4G$q*PR*ץ^WKT, u`@T n9_/_r{Ͻ߆:vaÐe9!/Ҵix<0U@ڠa*QQn^{gxC3lhl0ɺABs!Pڳw"{M4iѢE:=nӆq?ʊB(,>-01n=&Зgˑi7na0)!Ĵq".^$*iZ~u&.ED"!dsNrYg5Qՠ!Z V4= 0ֹ ;GU.qbR(cmӒek0TYQiJ|~_"}TJ$EQZhl͑Hc֭ߠ$ɭ[&\JĢ RJu'N:z-g}_~L&5]a+޵{7!%T$2Cd2պuH$۪֟֫e6oּmRǷo߾iӦ@)< aM0N5d;7ˏ`Gbae":ijn  d:NӁL$Ts}6SNW>/Zx)++۰a…  $оW^_?ܡC4/ʲ bJQuJ@Iv-ˊ7+aF0,6n$r1]f "WTE״YfR M3vy%TQ^% Pe (4@XS Jb" V4#jD0fs_B&ZH`\v DX4n?JWY%)J͜9SK۴n8A9lsz}GOqqC+Nk^PP0JaӦM7H$-[dLEɮ]QF>*4RTJeIk<ŋ:t(b9u|K1E01ZjǟY$)@yM%JW^ZխWq>tҠAo_1BXX(ܿoD%N۷kO\2 R)ܴiSD-6oD(5l@QM%EH:Vdr:P= ֭[#kתJdY޲eKƍ#H2|yU,F%It˖- WK2x5׌;} FtJ$$c-t]駟¡rΘ~ Hܮ]HuT՗L& J4B%IRUӴN:eZ HSb_dD"n':~GDOL׷nڤIQ}Ȑ!͛7;w?пp`>x6%J[5Ar.߿i?ڵ٫׊+aC݄]UV~`떭 4l׮]MKJJ1KS[lW~8bp5:[@TUU״D<ީS[o8{RɔiChne, sawڝ|PZ[6jԨueeM6-.*ޱs'"}:vhڤIIq8c-Z ?AUt*- 犢\W9E9<NI7 0'Y]$~ͧHeEf D|cq?ܴIMBP}ŹذaCc, ?p@Q#DTEݲeKZjUZiӦŲ$B8P DB{Q dA#gٳg](w8p7\\\,I#`wFN}zo 9r@Th#߻pozJLF5OQ vQ}SOE"JbH@\.  jڴeC.]?u 7l8gMXᄑiMHDgzUU5k^\VVrʕ+V^uU~76oޜsw^YgY3FObq/ k?OgXtЦMh[QQ?_YpbaY2MhVa-_|??(Jݑ{5e@wy TF+UE%xE%| XKٳ,`nuExW3JA1***oߞֵ?Mtb8d2SU\UO8!Lp ؛竬dfi'pևOi$VpΏ?֭Z7nX^9sf k>2qbjKE-ʡwK? Mr%bO(R4 t xYHȔD9P3NϤ:f27FiD >qI$* k8c~Y3gBSfs;TT._\lXעe 6.ZHώ;y3gά[eVk֬Ydɴi|>?"^|/Y;wbŊk^"ӾNU+W8ఢnܰ曲\TT$ #:MdG&&@rHεO8l}=&<-6'6ixٲ/:bc|Сs̩Up VYs*晧SgIe_$zue?@Q /Ν;wק2jԨ9s.]ҡ#O)Cnݺ5?w!nU8%ۏ9:1~QF;+** vt$uN<ljEk9lOQB4a9?S̙v}njӤqcD| *Jyy,"zs;vLP(Թs:|wZ B`sN(;,[RL3bOSJeI[F+[]vcQC",Yn7^lo馩PX4]ׇWUU](Jƍ~X~YQo߾'|s~n]7f#ɔs! m›O{T %X݊x{ǺK&f.m5m'F5pc)c83"Qd#@JQ&ҀH@ GN .mԫW%wh_RR_n՚P*Q:^oo~`KJJ>}{֭[wҤI#Gb۶m[IIIznh4 #G91d:>!AAUz`*?~JiYݺW\q̙3YHU`08pРȡƍWZZ.ZHu6l0hX,VUUQRk+DRәJ}͢{!4J O<Y.(+"Ln@VT:cXlرx믿~D:%Hd۶mΚ%nl޼'#"LX,JUU .( G>9s֩3b.]BOaTHz]1]TS3"]p#PE.]\5eʰaCNyO={w 7|)?p֬-Z|M]tԪh9 ΝZ&MEP(_g͚%mѢUW]E)F\=sNkH$;Kw$ QBH0;v3O\u^ JKKnjݨQ+<{Wu{İ` r#O"p8\ې!"D2 x:Ik`0Ҫ:9BĢ͛7u]pRکsL>lXR`>WTT4m /úGQQ<#)*ʰ{QFZn={laCNEaQr0eߺuk(;fرc~yM>espQ@:a„W_}5 VTT٫gϞ›Gg~0hܸqbf\r3 @ H*Mƨ {8G]Ѫ"̉_~Hc 7ek]@"`j:`L&LxW`eeE^z)"fϞ3ؑ8i`ER9BH<b pPR 3yխ[d"te!f=zǩ .xg-Xks!̟?_͟:ujn]:S͜5E7rK13fƌ|Ʌ\(;1݀ %'n NH$i޼y_|E:7xcϞ=B"OWZV6I#F|޼۷שSnݺzk4 B\0~=o6r<:u4j(I>Y>l޼ٵ^ۥKǏ?R2os-..馛ڶm+"4#GyK)!Jcs"A˖- ȭ[g;P XUX`|=DLN!QjeEuP: /ϟ_T\Ttэ7}Ieeeݻ?? ͟?ѢET&#Fܹw[o1O:N;f̚d2|A"t(JkALFR)!#GVVD,Xs"H-|>רQ/O~}zp$R4xO?T@yyE^󙧟 cF޽E_T:cƌF {Mjцn%:t6fꪲߗC+YUƈBdGJZ r"C޻pFQoIWe4e# :y(M @tKSi3*0 v[m&M$8}c!{E^z)PJ$T;wƘtJkE֯_9VӘjƌ#R<D%Ag\֬g\5~gX,sgV;2+JX˕+Wھ>dV)=Iڴisg*J߲UU"rlS7n;@ \tnu1c$#ҲSRJ +W$wِM)Ͷ^G %q&7;qLUCI$QIי~/Hk]Ļ'N)}:mH LdSJT#‡(2w[hP\!bR݆be:$N]-I$hJo"E@%k9p0pX|GikX9mrѢE`n8/bEi߾>&+2 @3q[)˲Ȍqn$IF :ōbD2cBKoE5vi'Rt3:b 3f4xRu9Λ'0E9sLg"Wh4H&>?j(,s.Mta"'@LuE:M lgKJX3 0ڎ &N̟Gaɒs>}r,..VF㉸O]xcƌ}^f8V9E4˷tmȐ!ƭh ,<}> :),˲:Su:=|1F(9%&gCھ}ѣh<GEc%Gl~,s#j&s5]5MV|LSeYVf ts$6wrYĈ|ɖ-[D#P2"nݺ :b]bDYMi˰(]wռys#QVP3$0G|bs7bOaڕ$Y͝zqyBʲ,87EQΝyfM, &on݆ b7ym۶duǸƴ{a')I};&ٽ{!CP[lj!* \r9C3֒?_JBF{!Ku!)0yCԈSO%*] zK83$IT9\SrڝLYKWݻ 5hqˠ6 (,˖bv4hGψsu0a3ν.6ǐio[3Ƹm/#X4!f3f%8ixoݻτK.1)8DutYVDwٲex5ss t'*dAQ.'m` [q`f<-lrlӤ{ԺLlcX2 5%4hkX1̌.JW\pJWU4F?ץuRÿNcoOlkM:\,ι_IVF. RΖmvY>b ֋1<ϖ+>UHiP]x7t( ذXnuә Ƞ9V[*agV-ZK&TVV3fD<){mM[4OǞZIhe4(K8ъv޿YG>

n3!н[wVsjϩS*Z8lCD⸠π?VU}u+$ϚS'W`(TYY {v8`$b/nLrRB SJdوWtN#RnP%0| x~{!Gdž)?(cAtM(uDEX2 +A_tۂ !Trkgՙn THY:æA2304r Dm6ጡ7:Ygb̘ÇZθu!'L =9xСCdrѷD1˛J lȒR<ş&!6(]K$Py džme;7<@("2; CK>#hZ: UVVZ('3Bȼ?߶ .A"jϼ[Gs0UɃhn&4;6ے[@{v+g"/N7"EB4Nq$ȡ iJīa-6`ǭ t"2f9 kzBTp]6k|l>GW07},5.&ii: đo!v9ahZ5G-5h+BAiԲ4T; uSaB 7,zBoNtES[C!8+pS]h*q,&̹sLXo0t6k àH-~ωi0$5-[-[N6M(,ӲiB$ָ %L`0(.p2ο BfUsQʠh!h- 6Ѝ<ݦ`^`c-jL sF uG#jT]hZ: :qŒ d vT1<v6V1>om3WvX#u0  DkcL~!$^,"EiӦ rFÉSs%峥:ABPѴ}LT\NSJ=T!CgFڇKM=ݧ/rHs^RR>U`\id3iuciԄs !ZO I)Td笂921/$!!Eo6,<7mpY+M"%JE-Iku0;wB1ڴA--$Hk3,tZD +ךqU@ ⒞-hH/HDr*E"Ƨ: f5G˲D,Ix F21SMq"y]EoHy"",33$'A{@L޺s9cMe$喗yqªjɇMݤ$Jӻw΍8Ab #n0 $pŒ5GFLeBڦ8 yLÝLEBdb7vԸgQUULXfkN`\У{n. Eufj"DC6o;D≄D% hCd@ qifO7ˊ8 9j4l98q(>@"E p@BtBP@P%(CPӄ^ 侎H$"JڂkA)%ZZ Bx\='kr̖,'V|'va0[9"-aʇPF>;*U4#e|,dwXNcԙmsU=3'2tf(/ɸ~!즃s[g  ɔO&6.G5vClI4+lc1qFENs0zS8`kql똏{H6$Ϲ0 0c~U)zsf3}#5 Pqr9G38MInjWVmM6l9Dna\@ƁIX,K8PIsb)3l,oٖ m!b%紟-jϩeDOIѱ ȹp"yUXo;.۪mG6Uce׻ sꂆ sM1,\Bzyq.ab8LٴW: (]:؉tDM"|c = 3.s8Kpm_Zѹ3V3SƷa2 i:1D.dUUdNѡCTUr͜Hڈ %V;Opp/ac/rsr! 3C>UuQjt9|yw u ]G s*)d#[5әx,KxWs bEΦ4#|G eH$raor':"e]sG3lS`v7:dEUбrYН%f" PHAGDlX SqΤ/+2MQd2(k8JXs(&T~'5^!rO36?\uXi ^\Q?N JL9:̱ *7q`*ĆI(k _jh&G٫#&~Z c*qu]<'!F\Lዡ u) 'UsI}GasN'ܞRX\`ҥ;rm}Ft P}5_ŠiqWsİt4\/8#6'"! VUEѼP|J5M$ɸXva̓tZ]ϵXoLy {7mp #? lPjxM ̐Yڂ|ʉ' QкDk:"U?$"[:s:׶Vj[mBn-kmնVj|#߀ZPG\p#N`Vj[mmնVj[mm\g]%rdD?f],׶V7#AjIhmmնVj(c';VABNg첔!%A@3;nqufV0׶Vo6 !sQĖLS<dc5jGz]K?V y"#+ R_՚ź>q-A?y$Y&g CY y?i$$lĜzȿm|aͩvY9RbX/)a$V=(q U{rx3(U'k$Qҥ$7wcQmm3)% WVCRhLzάVp>bzi VW8C$nz\kt꨹gIA2磼blbk.lDC7oS6<&0<;2a[$jQ RH@sŵh{&}t%wߞK^'M3S6@!pO'3qj[!.uX~+ /=9&I lGM؛v=1RUQEEY9V%r5fY\j[m?Ӓd8t:-˒$`޴WcYFDx9zD5,W$8{7̏}NXl7JIFaϿ:< Txz-W/xQ"RԦbo0ܫیM̾_]9ǭ)LjvRP6s%W&d練U%*Ӏ$oWus$^\V5CgJ&eұ^̳co11^d(PF^rB&974ko9b!toWykc ]3wzz_HεlU$."yAc&˔ib`NQ j??z@!%mB^ܨQsy~e%wg`c@Kc! &F8r[e!VGCg,+gteQ >+9e0n[ mn5xGbAW[TucԨcϿV}#sD u肛d4倡zȅ9˦&RBpG#VmC 'd0, 2Mkl0tvT9aܟSx7sΈ?Y8:TseSʑze e@5ڤںBn))0E]@ntE,V-<;"u V̍I3Ymjy Egҍ$۷|@tke,éBKnt+`paCShB$$ȂEv$+ 8l-xcَzC*B$*pdjF-d࡛Ca̋ycSJ .#!&^:,(NpիUO4]E?otVJ'tʕ+uuY55bτsnM16z{5%qNyeoo O95!gڂw2BY>78"WϪ[ 8Y6{B+ySqcibP&Hh+CD$,Di(F-4D `U7SX2=7RBp@8p%WY/AEHv=3ΑSkfzY _^AoIq9ǛSS8¾KsIrsn qGf_0N9'IAs׈2I3\>D=r,8tsB J)cszˑŪ{rMDXuK1Qdž3qOCXuZ " = DVGXqNz%9BuG Dgu;C+T!A]vؾ qX]Yijw?xݰȅDB!"wY !d=z4_JJsi$I1Y@*2 β D) yɘe%DXOPJȵsN[HETal" A2 Ibڸr~Grhj[me7<#2 J jfRU}H 2 W,_ȣ0ƄSHf13*QInvaⴴ&7]`PX׾i֒8e}ΑsF$IθWhn]A7Cm)g߫g2Z"&9\ $!8%6݉6b8"cy7cݜa~'K3fD.vPJA*rUu. S&yl[@2|NB3K)y'\RBdX|<$=-saf'Dk([˖ULԛ`Ȑ#Ht);΅˨rX/)F &G(di`X bn//T #A2t4b^]d2&cCRB%I3dp6baYfZDh[,Oēsa@,Mɣ1# 4%FÐMy5C@XDayv>Є-srι}RRh v+!L!Bq'rx≊ Nn0.+da%$W!LX")1 =3hDBB(A"TJ1K6K6#v,vLC@ĩdz{TrI\:('Sɀ?`/kd%! &d3d])qR2K%] ( AU o[Ƭz6G>zfƭ~NB #YAHH$A7{ !pcpiMΉX K7mT7pti,}F!@HdYc~0 C@In,m"H:~qEݽ{L}>(Ys6{K$_~9'|!C8g0zp߄C᪪P8BrDJ*`x gip'Z.ٳo(ԔyMAoAlb㘹c>+맶`2bID_6,N. cwy#hvuIEg$#rJ%$ 0 $|W`svD 9u3æ) Ӏ9T+RRRr9Ee=T`>eRr+#`a2mŎgNbY"1v5<Ӳ8d(,Mok"X+3&G+vҎb֬OCNN%2aj,PQ庮v%FMR-"Yx93N?Ou֔HAҹ[phį8;D1"%Dh³v$>+W|뭷!{/& RlClǭz dY;"q'͌:unt\6'.&HBq!p?#^,= uUTVL6瞳hI+إ S1YӺ2&UId#y9g3HþTqLn jȹu/&JK>3gǎ]zX{ͷ|Meee"Ş&>:fi SN'm91*%[!q1g5/A4 H sD"Φmݺ?qΌ fޣիB1cм}&a6~¯ʊx!Cnen1 ٲe˧|:vq䚦i֛o|-]]5Y̖Œownpn&i}sLc[1r<5 )\6TPꇩ:i/d,!̬̚dhl澴h)HC2[CkeQ ǯZ:3LNT* W"/')ƘBYg,jUl_h"MļÑ#<"KB"ϒЊbL99` ̈)[Idƍ9=cЎ p&N͡1߀3^f֬kV xꩧ&IJ yBM KoKXS$" -Y~lKB@ 駟~@ߪUѣ4iIމ#< }q3VdFL> 1!q ,:\|`欙N;/RUUƙH@3vkݺuFrINJqhǢJ9!T1ƙYh)`-e.\"9Wg:~/D2QRR'ܸqH$[H%z~R' 8p옱ᨱN!= E%*Fw5 י?+H3`ShnVdʪotΝB?jժW^yEؕqVʳmA~΅GJlysrYbYG,ibʗ_~G B3?ܨƱ1wPZjժ%KKp`,kCE{maÇ!⧟~ Neg?37NΌO p&@I^|-[D޽{3: BaA[ZA'mYTdO>#<ŋ۶mӨQcJ ڸmpR(Ik q8~78? #@2J?*ˊ2D(EDI6<#eIԹXX?`싁{# u881 DPdC1s75k>dȐp8SOlbaEEʼnDܢ5ן,D;B~+W$e˖"UUɤ[jJmݻwz]%#F,YݐC$%ឪ7o[n׿5~x]ᰮ?͛wŗꜛkrB)p[ dWkg6u&97:qn S9Bamo@=dS9&mXxV,Z>b/Y]]5^+ؿXx~dknAţ\2^T cLe|8猃 @). ˗eYﺛ#/++iM踱bؐl:ۯyQ,}0a49g"T̛P‘7;S 3E(r9dyG87nݻj"<25@&v>sN:u߾}/bqqQϞ= 'Dr oXoʂ3IҜsa;fKR~O81Lٳ_lԨQ߾}eYq~hGD $zΝ;Lw@h-|;3]&2i5h1j!' 8 >.9cR#R1n5eysv߾}7neI(3ˍ';zIS])d۷o+c@0L}ޡC#i9S}F:z(#5l%@γ_˺q_x[6?&N8\~7سwOz Əm[ ~ /j2QӮfSA< Kqwyٽc-c!NB'ɂlxmS `{IMڻck@ \ 2(J]ze]:wΜ9%K$I;f)x饗vѺu뮽V$YP(N۹s?8< O عsG^J駟knIԊ{=M:w|e!?g} (_|p{ڴie˖NF3fΝ;_tEp>oRzŕWl*}G} 8S &+ Y5|$@$t嫅 GӴiDuH{n ۵k-7=Ç'L_=>X/++֟5k6ywyǟ~JRU.J-_wq? ۵k7qĒ/bѢE$M⊖-Z(Z`ytwqqQ}> /ִFdM>]wVZZHZaa;[tK`[n}@ PQYY/1|:*!{KFhfFY3΄R C^wF.\{C{ho6_~i۶e]&Q1;9 ,GW=}NVyQ1S lбl0dmUS˃b}]v饣F:.|9G>k֬[zϽlٲeժUl^f+,ڽxK1{ Ahevt]Ç?`ٲe[nyn9yfJi ؼy}7a„3fB+VlݺgΜYQY3O|gtC,Ii/O2w޹z?7-."zUVTg矯Y8W^!IҾ}}ݫ{I~(u !:cTJQBIEeE =w9>ӥe#_Ղ+糺[n>|Hr2cې1֤i38G-**(xHQ䣏>:{1cLmZ]_}VZC_~lٲoee֭eee79s֭[_z'|r̙|3 CNF(<tzԩt%Ѡɰ6@ rboZl{~c=ֻwW^~YQR t7p g}vpW\cUUU͚9+R{&L$i]gqC{Z^z)S<Û6mZ|}z~'oqq'|}o|>ٳ?PNoiӦ[nÆ t۶m{=Lӧ۷Ouƙbٳg:ֿ<[YFgKXլYFq6jo["$_ ݻ`M9O Bwl?yڵk׮[ӏ=^ϖ͞=h9R>/N3wS},Kwo֭.Çwmɒ%6аaH8" 42e.&wB!d"SB+?kT-[N{y@6pW׿&N@`}w?ߋcۿ\{2>!r.N=  ?q{g՝={6|ٲeWy睵VVT"q0dgnrkY*3ѫr 5'N8鏓&O?XȲdɒs=G8p Z Zjبa ڵoשSu떕nIӿ˘ѣ)#Fطw_ZKWŪ ڬYeuC}R HTb:SdEw_1yrϞ="JFzd6Kk-5ܹSUU!> Oxo5jTJO9WR)D<餓$Iݧwr׮][vmMK 7n\*w^Q@Ug+޸I:uJtR@FhۜrT17YD?&|74wߩVqοClѲN駟rhU mKBQhPx 4ҥicǎmۦm(Zd 'P\\ܦu-[nܴFUUU{G‘@,B[cٜ9c}ٜYf!fL_xф ĉlٲ{]oƍkӦM=7nاO3gΥN|͚5;3d2!ʙgYT$ κukP((8VxMĦv#P׮];iҤS{Db^x$I ܷo_EE 7m4 vN{^Vl׮]&P$)JZjuJopg>YMֶm[YvZYYiPl3SH~M?xEݺu[b$I$;VU՞={ر]5 ڽHӔ<$dg}/L6ުUC~=hР͛?͛Zf͚vѝ16v-ZPBzSdIUfg4 c^=q,XvdD+Vݻխ;`UUlZlٲezE@Q`EeicOek˵w>yPxicW\FED)A>d*YQQq.謳~QKJ۴iӪU6& 3v:ٮ5a'@9 4H& !RUU%Q\HV|nKK){(4VH$Ҳ$LE%@ZKSt0tGHI'{  .'[l,''XxJ%隢(p(N)@ģԬ!{V.|[@@N@\eJKM[2kԲ5gc~|YsHng :T:bΜi!t@jЅ9#)xFz5 rQVsՇĚkl2nܸ{Q0.r)9Tdq"Krj!=z^z٥b\do;}~ߵ\2ZJ@*Ҩ*OVdM(۷СC~폄#$Y Bi--xHVT |W|b*ՊffqZuDM4c~u)J:بQx<.Q`#Y$-QJUڻwCk 4SN(++SEDX<ׯ[?y~?L Eh̪B̋<(b@0СC.]WϞ=_k:ԩs'ahРCeI6/2scX8$)k&˲_uMO&3fx~2ջ!CO?'p'8-;Xm v"DE1`Pk뮻u&Zn*ĉc,麞L&J_~_}]tiݺW_}uaÆ`UUN:x\D&X˜Hy Bi gCEDz^zM44];\~X)WOe39OXUU,$ٳgϞt𗔔߷qJ$YRT≸*PQPdd*I)..޻gO>yaJBO&H'$YE8hUÆ UQ߽[wD7aũtҫW/q<WWŢJ v۴RԒKN_ݺu@$1.$Q NA]:Ӆ"s2dc8ݧw^=:4sg~[onw ^dJ֫W9*"+aC8 9ˊ fĖ PҴnݦu*:|5Lbk M49UKBQ8uݻ֫JTUtRJJJ@<d) k&.d?`Pg,B4C͛5g1խwAqf p 7|gcF |cM$={|ʛP07X7ߘ|CΟ?O4_~ 7ps%1ǹ'l3Ζ-_6yHcM4a:s`ڵkt(9>=y=N >߷mۖP܈X/09T@T:Jxmk_~9X& +әmFHDD,O)c:Pp,H2p4 O=WBQᾫ#kEc <.j`Y[s7| ]vrso;^ZS٥:\kU@Ҹm9h{_fձ{l-xv'g|`ŽଙZ#bmW| Gg"Pm۶HD\{u`0K]Y4{ 趮M5HOlSnYU3TE$矋F@PWmܸPB% 9Dh ?أ¡D"|~PC͖N~ʮW^~eW 9x,)8d^k9"`qImD>sEbɒ% KJJӬYX,FK+;9 (?q|ʮ]{ƍׯW~`:x2lР$:cƎ9b%h~$BWT#JNI'^~D" >!d]P8 ii gxB$D%T^z֭}T*K۷uֈx۷o/R{=`Ç?C-Z4oذ﷔,dhТd@p8ԣG>}zˉD"+(\UU 5]۽{k3߳ggyFӴB^zGP(TQQF={ʪEv$B|C=tm)e'u5F%rm]r#xD)>l4 tN:N+x#'߷ĪbuJXV$I14K:7h=#7Nu֛7o~:vLcLL, ݷ{Xl~q12 9ywLH.:JiΝe/[+rIqI]&Oɤ篨@@YtJh:C`yFo>v:w\Y֭9rvdҝ֯[ZZ@fӏ:tRT0L&Ch4*Iי?l0I && y*JҔ{nnҴe$lF&°>\TTJhiR]j茇uTګwy4f]uU^zcƌ9D}DŊۺuk뺮J,Ŵ8".EXeY;d'͛ 5wvRٱ8!DX7nd1,ˆ ֪&I*t8hƋQI\[R\0m KEzm"WRBx<^z>9s?E"\|IvmTUp8 \ܓXH3^ӵ+V[]tСC7|K.9餓8f-rB5S6Xj G{4n o.d'3X|q9)Lo;G%T@HBf̘m۶Z~'zs=3.B (  1.AЯ~I)D2((!2JY6{<1wr3zQ}lmq5f=M d0mF 6"@7Ǐ<럛XSNM/U^* i!|[G'&cr(f} 919̷m%}pt-K,I9&IGB2nݺZ%I*.)2xF78slyܒJ#`$Oֵ2̚Dڴi;(m{Rb(6߂]TTԼE3gJ~w}1L&EM D%ǒoO˲,|k"=y px0"zk֬/,XСC8͛C͟?W^U;Gd-_Jkp$(ڷ۾}U+q%%%BguA{x]vI˖-ѬǓc@,15NEeE2\paqq2d7|sh4駟<(ZmҴɚ5kc;۹}X,F+@vvرi&UU~2wW pa|IUUiCϟ?c Ji0,**5]UUbhN0+MJL(h47xU+~_:jذA^~X=,I@@tx"/.).*=ztiu 1cOi}Ob;˗o۾MVgثW/q,GEZ;x5v8F֭jKUf:|h>lee,Xpx<_[N5γLa0`ٳ5n԰QC4^б֭[׭[J~Ͽ<2ń:$ v_r%~GEEu-Ĩݺu[jU鴑V-ٷ(7zӧ?sÆ [t7o`Et"K2Ɩ.]oMʲ,D{^pC|>߫vhUT$Im۶qF94MV4h޼g}Jvر~>}:f4, jz5s欙;w#HݺuhѢ;wB 6tuΝׯWO?Y`m۶֭u}ܹEEET.g((u%E9rz\ZqQļJg:!I&\dI*ZhɘQu# 9///D0` w?쳁&ɦ͚[N_fiOcYbU~|^,KSâ4yEL,c,?ӄ  9_/[DoU'Tm6vc?Ӭ\f?S<:`1@@0nﱵuf0eW#E2>}vl/.--|rK7l[oARv;fNsZ_zޏ1( 8~dTrO2womxvOx?@dIb1!)xy͚5K&\pHf:tsH$w/>SW_}ȑ#~hѢŐ!C=NZEy )DƆ N<>xWZn}) 4(L0 Lu]pw} ˪z*b5_Rȑ#toW_}^5-jj̘1>-ZڵK,@Sb*YH$&M;s=s饗f͚s9?c;v<)'p+r 7hѢYf¿!Zpp /({9 'Jn@ 0lذ`08~^{+..ճW|>_24r O̲]^p>JTJ&( G"S\O*ִ JEQt*Ig=x_Ѩ֥K-ZH8|YgݷIt] & DV pa딖tM=X~TE5~C0~G3KB(CiKf"2e85Æ t͵S7o~Yg+z aO$,cUUU`0qt/~gq᪪8HDLJ(}7y-Zus}'t]ڵk~č_57JIbȾ>鴢(񲲲+O?}."BWTUUT*$ZQQѸq;㥗^>}zv?| "K$PO>Z޽UU;bg|!;w֭"dfذaOm۶v#<2dСCs{o:u:u$,J͛77/0B.첏?o 'Onذ Ԋߏ93mtk%.ĉgΜ)5ognzر=(͚5޽{8馛{>}2zw}w޼y$IX "&NSJ oR!Cg:u_#lHVXde &k~cǎsϗJ#42 ?^{/rIIkҤySOq;tpg b=w~wF"{WU{H\vN>}ԩEEE#F(..\e]TC~6.2a9JRw9N~ڙ&޽+**z~u։J вem۶թSUV~_X5=dr…K.= dj#F ĉ'Db~SO95 ǫhRDLP@p[#:M:C H@®lYrM @d;qqETBMΞ5JDm#.,T2tP9FGP(cȹ.ITlo6w9r@TBBdp CkE,|캆DD0" L -l$zbȫʨs$@r%o3]$chN)p]zsܕ[ϽIgQ.Dr*Yuj~8en hL'TB{0A*K>Q]*#{O 8Ygd#R+[8GYQsɴ˘i6SIU'#3$r` (D83U]@8'I$+NЦu]%üD$ 2 SiU]uNnM(8_~2YVdY~/QTeɒ%|m/vܹ={<3]ytG>WB??VdfnڴcǎBlM%ɸ1:ĥb E[azxҒP-sS<[zT^lZ$IB1"HZ#ߌ1qg9,H4ψ~cl@~zR<,uő; Yei5 nOYEqFk-9sY=X9=-FIN<$K̘LXFj!@8""WUQ]5]7NJJ %Mէ2T9{V9rI%Y[Sهh]@lg`b1[ ǬEVL|0=FYwΐK'p~k ;1݉0o֪YII`Q',`JikQ)Mx{^9hx4j 0uKOns=סC#F*<7tM7Tn] 88an}8`gb[Z^&E>:Ϋ4JkׄS<;.lكVԕiNr#`+vRiӦ={4-nGknNNdXq@!'Bpѡu<}wmea&QKr\`;'s\g=/ϋ~G!udM=cwyx+v뭷|>?m4 a:qRٸ;i37̖ (PFx905F7r/>nIhKxfLO DԽHCyrGJ[C24jbpBuxExH&$K2x(ujwtu}ˀH,wӝjU(;6nڗ0," ~\=І1*8]zQJ21" :DD{Y6gEF!Fip3KAw@׼ H@r(`P+D M\*zKsX'! Qr^lEjX&7@k4~+؋)"~weeF38S}>ߚ5k.ns(c]A- :\Ik)Ѩk*GѺM!)zGHִ=Ҫ%B6y${)^9eKqaNEh`8"#@ٹ#Y 4s\0q)5aTfDA7 Z]8(8G̅.]R)u.,;w֩;ϑg߳epwkԜ+02'e$՚2nuRlM# 5lذy֩@ O$Ç_tq(;Lg42D[K#{~EI+$)PT {k΀Nds!\@B7@Ą1GԸ~VX ǯg  ͛=\d lǛ P.dh9xHFr )@@JB`phW?a%MEI攕!dw޽{v)dEEEu]~\fgÌH V縡 9s Ĵx]$qr)N{os-.e.9+Ϊ*8=9 ĩux-뿖\]|lק716v-wZG.τI]ãlBD55H=nWIu%SvW9g΄r(ILVQj 4E,J~;adl"rpNk5&;3ΐe0fi ·69v}'6 m-u2uWG,{);5 ']43zfKtSOi&f=LT;UgSY{֡3<7k mc,d-9)L|lg,뀈ZO=T*+E@g-^"BTUӧ}9ܹرc4 xT#fz8=Of撧ene.{WwX-0IF8K[7bpΣW^7F|SO=uԨQh+]LE8dL0üAET()E 敻w3=@B$ `JO2R5JZEx*Q$Rd:9G*J5(HZ'@0|qT A@4Rd.0;P8/4PגH%@˲U@9 @PŸC2aQ$VPQsB5 t*(4U!$&A =24IQH|#׮ *k(@ Xң%A J@Y'\mB Hs y}Et>P)KeAPW"\>z ~8L@!E$?K$$H*@H3ʉdVR@ sdN !ZJZZ }iS@a+Ep @cRNRcBJ*"#@ia4ܵRZظ΃JR^@@?#!9%@$`K ; 44LT)%zʠ1EQ~@ _g`h>rbH0@H: 1B:U8s ]g< Ռ,%Ra{",yFA|+!*~VL[i "r2ѣ1ceSDKDVK vvhM2A3z߲ L#X qp)Q##TB?7D]Q'Rj\C#Ftl}$5S_m|$/zσ6 _/ :Nݼ,P5 oʳl[Bf}OpdTԆ4 J,J굼 :S2)*kլif%EQO赻'н^PIV}t(*, 70::;y4oQ/@~˖}UoRN0zstnZeB97=F$_qet*SR'? ~w'mS8r޿Nn]L!ZN&@qH"B%'GSUU M*goװ̧׺s|uQ\xǻ )r{ ?#Z4z?jA_9kx`ٰ+ՀpԈV=Vpb>wPK'W@DQx3;t7?UVV~ŊE<}Ӷ#D1kMR\ 99.ej;<<;~ZKmFeKMxt2BFdbĀ8Cb crEG8xmsy1WV$p ÛM!*{99d~[V5B<8dRb3ߕϬGw:7[:sfy:hD.~4Mz.j |><=] sѬj{+dk Ą{+bL:. b1Q'B/W3wuYY?%Wsg)̖ڜk, 4gfm̘yt\Y28q\H** h?V@q w85  ww?wHR’_|Su ӾZvwʩ'ML#}/v7|ts_[Vao5glN_:uT+%]>hu/??v{*ssBii`|ϢLrDs7} NiTk}%|wDJ+S,Yӆzm&IW947\R.3:p#ė7-z]@ġG7-\ضbٟŒN*A?cŧw7J_ޗG 0ϢaI[SM?^q @yb w{/?]3V2D*tmDP>k @W?7 (QM۝kV (@F@^Ot?o5}#Wyg6QkJybgsgu{ /~쏦tU/ZˏÖ_i?C_q q {/O43ӯ]:BV\Nzg5\Ƈi觠%Wܓiehnc9kK~ǡyӿy*e_嵹r @⦹l_8'i}n]rHοn)/j Rw\W1N9 [mնk׶j`Xj01 ZS\'8],?e ib0)yҟr 8⎜FyXoL/f_Ctٙ^?ϸN:f.g3k+y\,z:( zk!>Z?N?ƘY'3\?d|#N,AyL5]{v{uadžHyE9"ʒ 0l10Z:|tJAnݴH €8ϙ}o#}0*rhٞtb^azOj;ͯS:?θf=M\@YbKg[s|<|y匉-ddLݯ  )Д_^ρ[-ñ/Ǚ <%Bjշ8NvcqJU^sKkI,:Lj *¡lzG r m73tR1OzwT[M?<Э? 'qi !h(i5݇<gƉD3L>ѯ+~~17$ /v|݋{kCx̿69 EWrkWD]O nqwpP0~Ddۇ7^tۢ z٤8g} *-RwǻR s';ȝo^b U}k€ 'Ti-rja)oozM}(ns[@B&Bg켙c`4H,GSK~~uT 4InƸbRZ_֬9|KIY+>[)tvҬkHLi \zثr(y Wn?"YW'HMoX3TRO{g>:sAmݺu-["IP-Hsd8I= vfx^WWA)9{qkљ&& DRMk&CtEhA:АCv,ʉ!kIEeZ @Drn3ysw+qCѱMJH ;{|!=˭@!p8TKUzo0sG0}A )|Ve|&m?bK\RhQyF]ҐYʺ s}4κf$5 Z})FhP&]>{`">~U_ٌrbՃwϋS}\34u٧zhNA(uo- uΝzO_B B Q )-! ԫuviLs| ԿC8$Af'R*P coCUiH%=|n9 JA@;ntW|lNL$] (Up6hԚ~z@+.=uҗ(€.ox鮗w H4tzPv=w8@{M36E0Ү(#]umJeu8,?j]q_#>oOϪ$Q\=uϟpR$#~sOڳ5ࠬ}oMyf$8c͠9urA1&Ӟk{ǂo12xgqvE[Y&r )_8+ ۲.+x KF\%N;kƯtJO>딦>7r@ػ@+3op. TP֧bwb]<T P|؅p콾?̜9q wL{onhdrd ÷Qr-FVkt舑''Ή O~q&L=V>|Xǿ+O$_/l`Ȅ.y' .G hr8?چ!׷e ƙ&dWb%6lhք[?d pgCh EqNBGMEjW.xz\鲑J!){#|J U>-̢Fx5*ǫOڍd{T]["(׹'󒛝–Wgی2gY5\(x&BB -Q{z#d"0b\9IflҒ"9,d(j?qj#B῜vp8f3c|-κToh=ј9n5/)Qbi@(eηF=GG";:V=@*`av2o٦Q @h`߳Ԡ>`K_mFc @۞-I7)`%Cˊů-vk7XG8Bc(Ff1Bp3$]"F)M!@F4 lvCw_ϣL0 2W.A t}t_P$Z;5 mt"$X< zꌳH& sftd bדN&),cf-}`I%´_J>3EQ+Qw"jں̯u$3.vSZ"U. /^h'<c5Bzd~e~є֤c| tg_ļ ^z9w^үH÷ߗeBU{@?C ͯ&{5oz굃$tS(W~㺅H]۷bVиk )f쇕[ 4Idd0hco]wrVwxLRJ. k7@Pṱ!IPɠ8^wJ- aݺueٙlQjNt~H9ll$VXUE唜ѢZi)VF$:uoHXG5~E a)mPej?TSZGZI&B"Hs`y4XbYdڅ{FHgܱvzC2C2g<].K[om"VsjjPpBuj|޳f~'1sڳc:5ɕ|P 1VpԺϩldi 2{{PIX#2 g?Ws$qim8,K0%7*%mBBb[{i2┮[h`$i*qId %1@k1e0 +Ī v!NxΒB ;/Y (+$U@@ (TJ ::4m&kzN>e)kڬ@SI-u@W辂Yqkd i9ݨ_HQ!"sRIIq$)_b|7\Xڢ  ^ԤF+WH@*oתp8He" ,H d'~_ %02` -@)HHߧ>c$߲q eZ :־޻QOq#tfB40VL`%pc |탅d۱iGYǶ4,@-:];ËJ iz۟}c;ʔWa?3=$f^3{gFmvcզ ޏ&%dqDD  pKS"Ē2'+~ N[`t2!h)# 4j-{0Ul6_7]aصup@ 'THeV,jҼfAP0kÊHWt$C ĄiQD bժmh@QD @nLp@.%,rꨓn8~%"[xu{[wc 3Yr3ھ5ApĢ쐽6vmIp4)KkL?*yZׯZe] 45i=a.Utɶ$`^L$ZD)|@Ѓ|-'9Z"!ɒB04;+!z~ib"J6v`]Fp9\='PnŪg^?*𖑹sf\0{H7-K/+A$T.*z~` !R J`2y,()n--U]`Pl zz]ٜ׳(Q+wE-KcDMcdvfV5_q Ż0 XW?3Upwؤ6WJ=f_c7[k/5!iuwH!u P<'樗~a .h|p2Trv 8a!tF:J szs,z_/囕")# ]n?a7>M׌1!$Ԙp $@Mnǎ3` k@G@qMTXd`ܦV&R{^x+E2$(@0{ 8ki-[rqD8xMd )K:U`% d ?\1oWb6p'O%'{z,Xʼn }Ƽw}6d"24̌~܍)EI+ %"!w| dҮN@̔Di#R "$dÌW?3fP\Jb/ryjgY6K)K):! $CȥL ƕ|q(s-ߩ HIҧ+<'YS3l&،L11 $, DlᏵ~}- ~w~`­οؽS~EF:H<'$L`>@n4KteUYS`"45XRhkI֫>JRMwmR }|yv@@d@(˹="gar1d5,R=ݎb64H`XΈR~J^ ]}ݷT~bkz 8̺[W;!lR(>A-05X:o#FlS.hnI"aMN=.<~ҷ*-; XH% B^4 }M3ᘫG^Y="7B٬Bx_y'iDB}R,d*@!AR6" 4Vi'(tٯin *C* FZ6͒sFUݨϹg'RОЇ?/wJhn/Yu @.(L4d,_EĜ n\7-W)9LL ZHK"mN1J^D{t4$#pZi=NvS99zfW7펯#CHXqD_y[WڬX3%pѮ]3)-e40`4%C`~\H!A*ѧ J< &IIosXm"Rr"D L9n6޼AFf싺Z(>A "ZNPpJI;vP Fö]ktҸ#Omټ)E!cî{KJm|nf`qAA;\$kֶǿv.޷4M* <_YX|ad8(Jw@{:a ݶ{$3H]Q*+mϲ$dЪ9p`ƶU ,0BCǎL!I٘6RNah!c0$~*Bh t>맿j OPuɯq'A~ f?!#<kd$&$J@ >>` |EYqW.ʈ5א,\b"b*@~.W=I ֖;]Am)4:SQO2a)2oLmX[an ^eH ==&KeL@ `*{41,}hς}"{|`t12J֬^J CdȐ$HBK0Ig̠ѫj^괴v6N#k*ݔUxn Z5QC愩~_Yǎ[oSUǚye]{B*+GDzy%CLƼ ջRJ &%01 hJ:i7^<ہpӴ;ug謁0rL$,`H0 0$1kӯ/VJc5ZA$.t.KZ K DN)Г:+4Y4s/?A001k/"~6CN8mfG +TjGrdq;H }0ߛVTyS8b m7k ;%@r4-R" @0x_H@z{"|@},A 8Z&DO;ZҔ`,fcP>=yHCS4TgBS|,{R`@HBQ:HIce9K낱 tefau}v-0јDL_2 Io464IԐ ٬$ 4)^A c$E Qowy#[ua8v_h2R$MDLApI" KZ&@ȁ8S|R?|s7$|d̺'Mi^zy=.+DEF<.U[ڭzsKrmt' #IbTœP(K&DcirCfU5]iC:BIdI @΀PGpC3"= R\ =)@D4(  5s D"ADeH$pq|5π#vemҲ,erq].8Ʊ/ r҉yQG7F䎞s);xS4"J&rnin:C.plT{ 5-_mMipX񗐏7|82^k}z3Շ$$` ;LJ1,#P*.p Ov'8O'TЮٓ>CҤGA4\1c9p0r RQIv!1 L `1u?s{m}2qo[-lHi HT\-e,H Lݐ'uIi-FSr~Ct0uI?'1Wz` k8w(Y}U>[% )5L$0b(fie ,eN˖XN<`4A@9GK[m׎kx NLюrY,]g}fΙ[@c 0{y,HIe^1i[oݼymZlٴi^zm=jÆL~xYf' t KDRUd@T>@C$`MrRRZ/صkΝ;۴iӵknݺWMT"ʁRxʔ)k׮֮i{6ldbo` !#6U{wUTl09@=T;vFH)]ðyϚI&I)WXaYn6mN;40\[;,P9.I 1dhw1BJ!CEKm&k,Pfoo%0@c1M,RQHrA11)!c)Pkقdtق GlTtJ8\sG>w<[I,SV.y׼+L޺"tZ}]"ݻw B)н>sy^B5wnUPQ5Bz%"^z,]t5" RR!%|ڵ2<&<7-_JSݐ`q6ԫ}?T6>ߏ t@L̼dguo\8o?fUswZ`'գ)S95&WW6!lRF>CzA#bo=bM? )%`Gp֍*6\4gul!>zcHl-=u=_AmgH};:˷zN#帟Zr~]¡xlsZʈ>5]9Wr=E/z%K#ZI ,䍏zu d _ @f L?3D?#`3mWolZ0+5ˢM;vޫ$Y}< Cj~ҹ{[j->i3i9}?m:Р]~pkJ ĝVH`&x@ts%$IIJ9_o:gI+7oeS#  ! ` ϣaI:${Ȏo0`@b/>ye~,{﹋0V,i?e`;P̀+ äW,鑰os?hUkfI]z5.A1~syWڌgNBm+ˢ#~'}cdWF&0v鬫Z mD0AE 5ZյQaJ\K߽e-8lYfr$0?Q:鈌(UTlر7^0@_''&CW <Q_ ,\T!3f/3R͛7oٲ>C TVVEyY4uhJ$$RL,!DH@ Q~;j *S:xn7[hQTTԺum۶?9(T!EOJ9eʔ&MqY/ZiG}4us=7y!I0|>n̺aG. cɣsvesΝ_\wuRH.r @v:@J$y[j5`%z>2eСC !4MS=Ƙ"WVVT*ETȟ%*1Ƃ;ᄈq;~^Jqq# ! tבk\hH)M{ `;3d2YVVأw2 2[V*KIM6""Pl']m5.,' +++pEEE(]˗/?@ ֤;Yx]JRQKL`9ue=\W]?ŋO61VRR>%8Dzg݇Wz\Wof=TC5CԩSʺuEұ6Ms̙mZ^rUGqDH$0d)TWgx+)@MIpXroWiE-};ú6}GϘc_\>Fbߛzo6ְ{vcG=WW_~{W/ZfX26GuyW ٷi׶;詵:B`}›ZiW*.k^ǝv. 8Q2eO}x.[Wf tr.>#- kնsFa1 6bҀ喹Rj ~U [`5k6nZijޢ;^ؤQzt=#صlpԔ$A Cd!H+y^ҁm&΋mbL#Qtg -mIDX+|,^fؠ^|ȀF^pZ~3Ȿo]f60 Q" 1\/ԫOokZ5ʁr];Z`AcD@BNĶ-rVeK6TJI Glެ-f-e]p[L2_|xT8s̑R:[noܸqٲe1"q{l*j/!\d>:w)G ɉ#@v'~D+LIF!,c+4K)Xkt k׮GywիW?|Ϟ=u]_r=CMvgB& 3+; :t0)_@ZίnG4a8J4J`BR@Ţh:k^<4nYIMӓu$(@$i/ʮgl((ceE!ï:xUZ9& ?b<(8p*Z' _h :%AcKĀ0L+EWJFKT_3|uZQRr`@wPD';IîR~/%1)z,^ b *QX|H"~d+oQ6&S` Ufq0s@ @MɗEn=Mr#/TUH Eх@ `|歽Ͼ7`_Ӏ,`XhZʊJZL'a*,ّU/EEAP:gO."sQHX§qa x2 1QI (j$ W!JR8d~gҐ2b]?|D A%㩷g7T*W@` Qڪ]JS|#Co]+`FWtih4d4"/G^T?/ W5NACGZi]PPoɀ?@f̘yɥrTfig)oO"`Tq@T%L;W0$4@? 9z@- }Z 4~(M_P#?М0#'XydTi~`HHa"c,P@`t\ XH $ @:SpbfPH xaA^ I +`RaRQ:u%2Itd끎@PefTiF@V~6=% ,'P*M@5 2lQ l$@"à(d025]-X0 ~3 `@' 4Fqdt2%rIg~0լFhP>L0ֳW-t_ND$!l~A)^RLDQHX -8p4` (0œ(P@]خԈiJP{rN8`Yd dH;i0$L˭HUw}믛7o~:,5k֣GÇwcUge.& d Xȥۇ??51lޱ K8|2)qj4\nD3V"h[} @Qiiiqq];ŠPزm۶5hڮEr H$K}FUJW0=>c4y"Zf͉'x!SN5 c9c?8}t)eϞ=O9!DEE2;oԨyרQ6l0dȐw}w̘1D믿9oyGWX*vI4{x߲}{g*(8a„cǎB7 #όI)WJ)LBYJ?W޲e1c\wu R曧zjn>쳷~[qAzdrÆ o+6lxnZ?˗ط˾{.IBqͲӧ0zi\4}!:jD"|ɓ'=W^ӧOᇹ|)ԓ"w}> B\rgM8駟~$O5j}s΅jSïef{Z2B"nݺx3%%%?sYYY~ J=܂ ڵkw@8}ы/| PˆjY~ &r5M3 oܸ^:E 8~cޛ7o/ZAk{#GoB/Zn=/xYٕJ.͚'SC=_㚦ٳG KqȬRU/r0={_pC)&._E'n[&Y ϲLۡL+[tFd9r~)9-vx ΄N6*sׁ1'&@hvb4r ہi 4`>D\K`@cC#pXhȑ@z;^w}=c 8G`:*5@Fgbk%w͡ctfث5:UX:@1cL۶Ȁi@+=*FTyR FN-?W Va}í 8y.#r~ΔJf[ HP NR4 6nТJ[R}QFd%Rnٲ:;`a6oTC1.`N%NwU&.Xqgfx?ẻ=yψ&t3º1 H,jRZ͔JeM6;vo勖5сò $X֧rWH$-Z(gX,vwcٲeoƭzw~gWVqq[l x뭷#<ҭ['XDo?;v'XVV5뿚rV* lrJeׯ;c|M"x{SNN,C򲲡C{G*|wm^DO>)-5v /^ݹce(װhѢٳgu]w1vÆs)++{g?c !}p(4cv;v_om۶JK }}wߕR~7W.3^4MS5)ES~:y_ )h:Ν;۵k4ܹS'=؇zRIDAT^{_ ퟔrW\qŘ1ch4jYԩSKJJc„ E9w7i֠A>}J}-..V{F}R>hڵ*Tj{ӦMN<wy-D4bĈmۚzQ!:u4lذb꩞TN >}4nԘks޸qnݻX,6x={|e!^4fNe1dе%r,ҡ:aw9 H###!Z fYFҎilt{fdD>J`N6Jn6 pME CLC"m- '@Br+8F* x#Gkϥ=3Ŷ(EH}6?G+i 6Ic*)q$5NL#LY:Sq;qNw4TYefcf۲ 9"ڐ5rQLfd+q4۞Jg2>@f5U,%%kwyz{^v`7o޼]v\ܨ?طoߒ{wƍ7n E$>CP'|rQQQ0۴i]RR^{hѢc9AӦMO?t"}Ѿ[VVF$?O 3ECvmC Q/S5 H=e˖nP(ԦM!CpΕay=lzRbcD5]SqH$Աiz,seٶٶa{= }1Նm@f@$J@'d"n` t8jӀL`er2߹7=9e~nJܽy)Oin]qJ4lo㺼ծyO?UW]վ}5kո"RʛYObuU;;bNj]n梠ڝ WoclPB,(J'fݒ@]_a@a}DFPXĔ?-_)m:C?_| /Fmݺ_E>}d%L} .2r!4hqZ$ zfwDRp42dذa֭?3Ϝٯ_?vV|G}4JieRd27(wp8UVV~{キJߥKYfb1d{۶m~_~eEEEeektm۶Yo>o<"J%SpLv3ϨI{DTQQo. m۶Hdڴi[l)++{g9昪<Ƴ|8֠A-}]KKK_xˬuxa\u+OݓKIuM5MT3UuʥH$Ҿ}SN9eذaM4qG[I1j<.3w׷o,A'{ʤ^YQlٲ "2y<g%S"5"nhw(rmcME%@d) 5^Z^Do]Y'1VBvme=IW1/+e B;Y53dl1koD"AiehM6{7[w}irp-`Q 5˲s!C<ioaÆ%c9_;vlv튊$ ܳg͚5p\P(D^ &K*.cjtҧOH$2rȗ_~ɤi믿r.]x p#MkѢa]v߿7D9^zixiӦGN}k7F ѴY7 cD>|InWH.W_} {>k2kz;N.9 "@`Y2., :4{?=59:^luU=Pf2 BĐs=l+hǚzz׵Э.D eZ __fdD:[ڷoڷolٲ^e8uPSD UA$ V2]hʃ3 zuA \Y @")ru·[T\>e͜s9⪬) ڳ\M&婊jUJm(u%5Qs;ǁ9^'<"̣ٮNlgfNy`:J-2J+c ? }tI׆ [5joԘ…ĀBz#b</,,9sW_}&[ z|yyy0{\r=T<Œ#cȔh(QqF f,*=ЎrFȥ;N9Y ߬|Jg̘_{Ȑ!eeenީ.-[^{e)cq ӧOB/u1"VVVxxi\*o[/CT>/͉DHe-//Cx< |"ҝHIJh4"xLoV!2TWMauw߭SWUinv" u}JSqQ$`?&WY}?\Z|yǎݳ.KZc&`0hM7dd(((EcYqA |K0,:4`PrܫJ3A.oG> sB^Y6FU %Ur*''t UcQR\[\z?@6]̌H$,,*J(r#rD HPPaIT+X:\Ru]v…k׮ݼys&M:vxnڍ@!hYֺuw~LG%蔯qN]$Rv \|xRHIChKU_,RϪr}UeǦi%KtY wƪ7u¢8\UHϭj[\A˲ Vʶu79-H Rd ! pز3ƥR*\e0`%KoY%εV-zgw\cf7(T^V"P֍JSוz˕P#irv]3|{fKxvtsz _w}<%K]Ϫm-W*ڴg iwmn[)Et]kvݛy>BeU[uWZKyMiz^M67"38{'7oڜH۴i{# "J!I4#ҲM^g)Lw[{e{5skV7>,8eܪ:jK1QD*.E1 N\-pVY3uU ο2$UiR LE1 BP=DK~/mETΨg6mڴlRh4O(Ѩ2 b15I[)[!%XۑKd zyG4 Hf_2.dB"RΑHW^p8z{m2TZYW-9ˢk֛զ\ʬ罾W\pn&E@"ᝣ\|RHH ݪUkl3!aO>EÇ/))4M;owYy NF):z")pJp-n{r1Tq"r~R&X/*HnZ-;Yz"rH:m_ZTAVs̹S. "*++s媼,Mnݕ:efgfsn(S[D$s~BҎGc1-nGVԎ BF6fHRN8>զ 9nh˗WUr?3ƊW+aZ*Ww=xuVNwj3 (_wOq4o1YJwr@5ز1<מ)߂)Uu*[$Ri^ܽt;O~꩞?P߬$TZU"zf|*;@e}C;Ezǐʐh=Yż%mA|y1-:Tɔi CTm.T%#=\s@<$= A<~YعV񼃐{7byTAvlzϬ̓ުƼ-bU+ʣЙ]T)Y#9oY??YSS=SBT-",ð&G9PZ6d7wֲy۱̞tVGXQY$'꩞i…:tp%ʱnT=DDXF_*EB@"IXGp`vY?3+qPm֣=zXF[es;㰶7 *oH v_Ie]SY"ZʆAQ*DPʻll;=0n{꩞꩞7IDSHMׂyy/ !ܰo!a!.A!CHsvNL6~1RI_De r6#"!$1T$U\oΑ#2D !vJI mv2l^.HΟ??)ī«q,˪7oU/X Ic~ME6F _$>9Zjx挗OSxr%BjzcTYZ]J;;Û]"#o\V@R e;q>MTPxqZ.7@*&5֬X9 [Uf(8 ugFjNJ#{,YwFTHܦ-!ӸBH)uei =3*2pOn@H) U{yK=w8KC@}r2 j6y{$:YQiGbL8"1Dȸ] [9$jx쑪X/ ]EYgN Ozz&7A>C0klE \D"!u]Ӵ,mYV(FxkH>\#$)D L7+!Wg=9e'A#DfHJ:!pcp["_nǎi8hZra#Liz7J[NeMJs+kr<?s]w#/yhc.R?=]6pm:Wr 2}F( %f=B/%PӮfS,Ly 4y ;'6i6̧ΐeSQ.|O68lGHD.ʌٲJv׉WswT׳4-ʄ<Җ1Wt#@n(x<g 1iBD"aTʈE I%Mqθw9{{ eh vdtxR(Y+)wr]k J/<ˈٽpAO^p9l"$'wć wgl 7kz^ik@'멞꩞?W_`U=EEE'Ob6l{9'||+( rZ2'FD҅ >STL-2R"I豦#DJMv9!#;8)$""G(I)V 3d҆0[83g`$d mn sI!d2~{;931N61:M/P&c[үp '%*A eb-tf(z.E{2lk4Usd1HRY. CיGNmwګRtJʚ{O~kՋtV+ Ao̚kσARzs./N+p^@*: 3!L7 }6(# I5-UAYH+œKVl7]@yIzxMe+x^/J֬Y&1dU˖pxQi$":ˆqHw>m]=Z.zFDDlX DHSS -) rɀ]rg.ۓ9rYfQ摲0sZmcHx< ߐy΍dK^:"zכ5k6pW~믿~yE++"9$Cpye#a"2P}e@ 5'xp=:6T*iI $)Ҩ1|q:5r @5h4h T 92:Wm%@0eZpT* % +>R*0XEO2e 2 iYEEEeee*,_2, e6I@v`2qd PV@1D9CDIJ"CbH@0D@FD7|tH9Z`s#eq]dT x-]oD/'Be,)`%\':uW@´|慅tm4FS'CI azũDs ]!!"S!zprZiI dGS^6gh{UQXڨ\mXPJvd J RgJ:C$*LM[8"JaVcLBƀ1dXІi4IǓ1ϟHHڶgQW'Ѣ \_bE?+TGt]Oy$[׮, Ϸz$⋭Z8pig=9kG>eذ)j8RP~_@ 2h4k1 :$%䖭[n{ ڭGxA\JĕzqԬ!ck!?7tW0:gIRJ{$XnUW_3镗#;1[un~hDURNf|MNd tu!J@) 33fUBUuQI1]OTOT9kACЌ3%x  KzshW9v 0 "4(JŢQ8G@T^Qymns\{ǞxP^x PJ (DqX2 j QS@0Ǒ1&$ !3,K^XBb -qKI'nz8kܟulg1{O<=8I2 أWhvbeٷ LD[߿EE2n3<3K@Ȕj\H$I  , *$$* Ugma1ő2beݚ^*q2e2 8_PR 2t:x)4KĤhBcyvYEj^WWҙ `)I$e+;;'R AOwI2'UR INvDD$IRJ7@2-uOvT 5I)%&4q=XC"H-7 T(,Ixr@FHJfc\S%BK$&$`@HWYJ A$cز+8묳FN&" lvTf]1b6sW; >5hsFgۊK7dUh4H$a9,ᾫJ8pm#|ttysn;$g˯J0H$ =v  IDip!H AEPդē +J[DJlGΖd@h(J0+,,1@ȥ- I A@(-$ I0:dR {ðNc@HY\R-3id71@멞꩞{رw}w/[lկ,۷ϟ?/j[=(k9T6֭_2 @ @*$2@' 0X@&$!ӂ0rRHb啕\㩔-!`(\' C Sr',) KL<ْPV$`)!O ) q8G)Xg$H뵉|٧>'Oz(2 $x")#E!ƕmtaCEaZuGwڕs; R4DbeySY'k ^x(B(`}7 #|7/$-X_9?'Oy Ӥ2eSԲߖs$Cwߟ9lه{oy#)ȉ^m2j H${A'6 o}k7me 6uǧ]|aGW.^TIcϿ\uC;QgϘ1󹣐 #8%IcBJЕH$ 2Sheaq _z壎v:)Ҷ%o}АiPIB08ƿ 8R"na@ ߻N[NZ94'pRc~ŶWj="Rr @2`z3g*'T#CK)kOzP2n4, Am=8iOmѴnIUhsɘ1!ݿqKiN~ /NH aloAv5׌:,5[)| \h!(]8d30Mp=&LJGdqB]n3 4ђߖ^qGuԙgŗ_ |e)3}~!%I!RsB:9fAe{ b*Z~iȉ'yK#0%o̴d /O ԃqChh"#aJDIq&LgpB@4RB$.HR0 ) ?I+Ɓq h *,*J} M$-B G -KBYB穀5=Lc)dL\ MB ,J1L+jPldd(;Aq-[)IF*E5DVEz9`jLAf/M]S=S=Յ1yUWzwqǵ^>4k쨣|` 3{~ю zHa悂kt PyCE@Laf D$KHZ"e=g}ȄwuDh̒dXViyO>9hs;om)D,)篺:)m.s< W^bQgug^n%i8㜣; h%kGlDqFsdRmcu/dȁ1D$w8cOe+V_yթD~X< +**'I]=3>M~9}8Yal=!`00RIaC/_yo 4`CoܴIrKt#$zlK>1c {4wI?O8Ꭻ/ь 7nLyG~1GsҤWg))3(~^XX(D$#YEJ=8cLD23XZ/\D"OcI`IIR&xF2L$c]|qnݒ2 i?s2aYY?fNyyTBJt I 32dk֮P [r[I2-8a#7xFR)mm-@BE"͖4 SX?_~Iߖ/uT4ytϼ+W>s^$ۀû<Sd1۹?L1FȤ =iI"I9EE^{M8شuk.]D !ie;wvݺ< L*--;gsO<9whԴ_O)9Bڳ1aȸUydsDe [P(9uݱݻ "%^PTpd#i -![νSG1WK, 5j:EpE^cW9HLa'M|ҩG <~wCD*}1W]#.s֝6f2H_p֬?|А =eҔ78oi~%%qT6 2 N|u#F8t'2իGqq]xEwLY0a_tʲ Ƙ̉`GXjuyelW!- ȳ=zࠗ'|ժSO?}؈Q_{CY4\d*\b,>I=tz`Μ9{O?/!.\8a„~x6F7!Q}57<q]eg_ںmoO ,^,t{ٳدK'O'Oz2WyL{}i 3?pXd V\1iGW-YG\&D"(iPt钍7mV=YTNB\pZEe'\xHrI!hĔ$iQ9䐵*^o@t$R([fΝ۶iG;b萡[6of!$[heŬOk k玕˗_SN{)r!N:i ۶me ?nڝ{۶mw J= a O%G:?3uqϼʹNLSؙCN;';aBN;A]{D_M0>˒k7l:_WzwO&5_"涻>knm6D!ߖ,onEcr7Oɔ{=qtv6X%.:1ǟzʕ\afܺmiG;{9Zn{.\8bi`1x6 oh,?ē;xG| #-[]~Ctŗ.XʌF@ ,:k_[}Wonъ2Zr;{5kyԑEEEP:)2g3 u:˄aX$Sv゚a$:|7G{ѧ+oD6x|oi{3?Xӵ]c5rdYicL~5MחXy9acMfX,u/<攳oM7py#G Pq 9Xͷ:CN:$ ~!]W_{mʕgyeYsŸ֊i\AOZ Lv:zW۰ Po{IO9sa!gѵe߲m#6C Ri%@‘[nO>3C{xߓO>cx<|9R̐]:=嵉=wg#i\1ASO_dė^|'M9xk3=p}e"Xf<Wp3 bŊ{‹.lۮm  dA,[?x=<_|s9rgװ_$s!8Zf˴R獀eKf꩞꩞W(HB~D<蠃=ئM^r%D4իW_wur̙3-2 c׮]Æ ;~=fP5WbKױ/1PLؼ~Yg8G)SޠEK}FusσzRYOO?tM' [|];A"?/Xr{^$B^}uz2 [a9CF"*,]v>PQ$TXkBU ) 1&l̬L">O8!Cuh?!#DT 4v{N )ܧw~ҥ/nڴ)J w’B 8F_y͵HcBi-"BR\)jsNRYf?t6[nܶ]HRlذM*+XqqioG`&O)-- s΁=lѼy»Ǝݰ~y1#GrQ<GDƂ `0a]x9>GlcW7u3 +oU%k7KW.XٶM h4#%qK+ѣ>JX)Sވ&'OFtO\xΨ;#I+Ҳk5e.R_Arl-؞B{nSϜƴztϽ`YEtێ|֫=副{7tt+ʽ՝1$D` ` ST={_ cO6, >+.;Yn qw?`S|_f~t}m?>_q?BjˢOVjp  9FfۄoXGT#:A+lغk%ĭz Zr0E++vhѢ[oY}>"b@*Fw0mڴ>]67=~sskϞ=zFBG?$IKXq l߱uQAkiܤgֲeA!|;KK׮_7߶lb1GiN=yhE\fu2{i#GDd Y>c[6oҾMc'yiw& B>{15H&Kʚ7k3x,۵msϽKC=}V۶m#sόiҔ󮺵II>AՒ4D;*-6pNt<ݻ)SSѲ~!;ᇭXIA@,Q([(,}>v];ܣCgwMHa>񩧞.<(.ٯP1Mk֬[h9;A׬K&S, }G|{i\ضqmm9=w泯ro;_ø+kظI2k۱m |I*DR4dH10iΝ;Y<2R'8>{I# vW^s w4 nƙm2d2U^QѬY32[Ҳ a(!C5h߱k׮mݲٷtMC=D":~`xj8\ Бq7B8`m^0QU0ӤAD"%٭7TZVH$蠞YOT|d4NH AR"͛WXSsWi˖͑Ha?㝥6kƘ S. "-& K*+I˯d畱dAPmM7!a;!mֱSX,سqBfB`宝paMׯXVVްyS&-)5jh-i}7 1o&m.0͝J|ՌOM&ɯO}YŐ{]0~OlRMvjɾHp$J9[ zz)mR2ꪫ E/ge%5 VGeY]vUzSf G΍jGcԐ>r{{M5--+M%0P}@͉/,_0„䒄bEx0R(){n]~m570A 'Nzu҅V_躛H$ST?J2Tx49r~s'0n50TfD[ln֬3=PVk]w?Ӆe{Eq=~U@: ("bo$j%=&ݘb/*RK-{Dc ޻ \ݝy?fwwGn>1~;vvf޼7 >XmZx!CZZZ.]:t?0rn4@!c%]{o?}sy"gozuuu~~2? OXhӂ["XX)ZZ|sf6߳\73(HFh'ƆKbp:9`1| s7_}'L>O=EsM=vSGrR}{#(JrM P%XɈaDԯR ?X@HC$ʃ ןq2?;8fS6!!~՛[߶bxC3oO~gf*_ti-d3$Dm}W˗Z@fd+o0  *1Ux$B_SL9;QcUљ!)|ƍv( NN:?bnRR2>psk֗_Y ?vͯ暜V5^zYutk;4{45jm[5! jkn-{ NgHL{{=8_zwkRI?s,>{e_ßGo2bАm+t-j-+hxʊ`=w8L4~' 8Ĭԫ-Ιr G@'.,F`“ҕd.ȿZڳp[N5;릛o]ՖY{w=jll]wgwcd21|ѣF=y̙3[~be{N}߂E,b-7x3HgbF%.;}G]4kon'>}]xwmV)M6PW7dQ8zҤӧM[ {c ڳI:%jE,g$xsTϬcx 6a}ˋw?vy:kC慳So{s?;{3^rݔTλ`0qJ{؛*:ĉ.\ގ>`.Kӡow5,X`AMMMx03?C555\1G"б|Gsr?r1ƛnvܸ֖?ሔJʣ&9nq'|'_,bZϓ߶g??іZ=~Luot>崃ABHbr_'|o3SZP_[,b!XH,%3dL*y,?d3>`cF!D< 0#m[*9;wnc6<m;]ctx[f?]M߼[(d<sp{͵xl * Dn3q}i{WrvH2@BOW(Jz=фLoW]՚k_[3bPmmHI;|^]nCC#<RԂ ʏeیd ֙]g]|đxatnQǂ瓏9}s[ F5oGקu+?l1=<<3^^dox-?}es^6J?T"q 7vQ'~9?:b3{qM|֙gΞ=?=-)fF%{uq?mmH.wᇿ/%gκ|;hsg+t:;DdՂf_oo۳u#`'C3w83 Dt]WJA{:R0.iӦ㎙Lo[kkH$,f }Rk8뮻^BDc/~񋖖˲y `C}/3%YgN95mm,gJ[ktryM͉d*8+XM;笚ڶvu8N~-"qNh۳&.w-t魶|w?sض֚Eb\W[油lV*lx@mHK@H%m#UigF<#7! iiJnƓ~{ wK渙Gusʬj8أNzS3/l ?ɓ'+A9SP]%kb'-f%ReRI'dѓNfljw挍Ս:R,rdv"lhikR|@+YkfIÆpj%j&t;Y.Qݨv~NEm3En4@DU&,4 "H%_`$šS?^}ty BJzL.}[F؁?;-U3rG:a=vt|` ҝq޹S_tЏܿ1)gϟ}=xȐsM^E;{[--=/? l3jMSGy~Y$"RO!2>nL&gmm6l#byСC iooRix}',KJݡ\SJ }MR<=wG'd-zR@QgLW|fPQ@~kB?5B$YIPḞb`O2Hz3 T6 +y oƍ7x駧c<_$KCA\u=O_ wy!4~r`&u"M@ rʼn>EP@D0[HꥴC_DB-94d0XD"%TLV)eY(P> 'vap)FY=xe˖r9DL$SrZNmmmņnfUD~K[ΔzuPJ?3$=#与fpwۇm~-˲PVAg`_)й l2J-RZAB$))˲+J*i xQl6J/+V no9jC'M>Q~so1vHSXc 82 ^? x̞+- E.3rf$ǕbJY{`gkN6.!PKs\Y7xc3HG .J. o'D$T%@ҺT8 PUJP놼,I0[#`I\eVB($tz'e I,!9_>%ЏFk xk'=۲-˷s!$Dw\r` \Ue-y}WJ? "B)%RғB ADR +%RڧF?IݡESJ a K(): AIϓJI-5f 'ڒBB@*)>r)=+?5};*%q(>bW#kGAJPlm)%`ww aOY=GR`QT!iXQT_*걾|Y~1KQ|*_rjGUR fmCI?[៑o m0eFNaz"EI >} TsAk}[jz#ub@"m̡D4EbR'[l_|re ٕ߬m۶=rЇRK+5ҒA@]h#|(0+G1 V&O*,کU> s{GK_dnzܱǜv꩖tdLIA" a#X`@0?!N7Rs, RȪ66 ZD`U-)"bRG݋|#(w$,#enE6!lz[e`-).|eA7rY Eɗ)tͫEm5dA;䟯"!DMHvHPP ]Kp3M{ HH`gR8tw_ 7pG?@v ÀH a{FB`mqP77!r`K&b[@*Xҟ**PEߵ0ZaچEDg̿J%=e_{0Rwr-CAV|٬I`0q8 bx~“YX;e'ӂ@sRplq:ShK\ۆ ߹.,gН/X/3L fZ;-0j8ϩ8E 4βy{w,KGse@$ :oq ETU|eE&wa^ziŊ\:b~^"CCY/`I)!_f}P12XjreE[ܺCH,uf AUe oS0?.(ɴiZ2#"[e`c.;"a*.5,y9+"{[ $ j$v.Gk@-r~&}1F;jovk1F.(zao_Ж8DVYM(#~r[oFA nznB"*BZ%gH~ l(X I4 tؿ˜zC#sD$] ^v;=jTpI4H JeV'#Yߕ»7 )ABK^*_4hvFwCЫ"Rk7V{`?5"3D;аTa=`h`X)'_qtvu8ͨd<9ݬ;~Iꭸ̽+5^ML*Ꙭ >9U ܡ̄op flU.p/-FUj*ȡw_&Q`#q9sO6=M AC+Eٛz1 MkeW^j ˽wWXyyꚚځnuuu:B[txKE H Ӆ"׉RY`,:״ J]@/Y|'?jh[ KmbasB } X؍7 yM\0y1E@ۍȠlW>$,~J]v~\Ky.`X*`y0X+%թ2%+E—l1 Sι:+A(8"F^끿TY\\ "7hG~':(`n3MbC42Cy^Vd4sF7=6*[`݈=w8yMnK)ƚ~} [)ē!1V]:0M[);i[nikkϥaYDtM|"?Vd w&k3@~K4V3PF.HD:ʢoUd bZUV:(L[}M}8 !B \ѵ}ت^1,tU#zubMZ@û@ 0V>M+GQ_6D#LbIcn0 =JK|m 2(qX,vm{lkk+ w>D²D{{eWI<1D:iGkRPBϚ[5yr.Uz/4F:o*ON=oV_<㸱D X!l=A)bPJ*)s38P{e#"+Ff`߈M+U{KK]MJ_H 9`OPuNa6\:u5=XԼ%cda60-tJg5]M—W P+p@4eYpW]uU[[hk"۹UX6s ^6R:&`E Q(V̌-'9!R ˜d *:Ž׳o)g >|G!0X!Y(#$P12BP (CQČB|ARI%Q1+@i]ƿ0q4xFb hP׈a A0`0)Kǣ3ܣ~q]qs=耉 P2+=@'S <;wTHո-RPqWzmRV,)ՖNgd2床A.2ڞB&xy?6iwy{N)5+J֠w+fO)b~Z-$vT@"˂e9v*BRcqSv-Q.QS/>{P5 B8>142gInފis8` ! ,יˎّ#hzo ^VWWWj uf۶TJӁ Jm!t6ر[}gDH M7r}}t6|劓m}plO*ʕjEsYΞwς!eb|hSkk,x~vQxu7(,;ͼ?>?ّgs[~p=]~?䳟sF''vʦH}Tg0lz}r5b[<`X rkW3s?:uC! 0N+0N,%%z^Z." lR;|o{YcpKf{9{ϛ7d ?GyM>~ gosI"0"z :%2J_>0->u~{knNgk={Ȳa1s2%y~K5W?f /|=xcn?5jWB™Gg>@co X!0!P?`0<\o곘2.c%`06 ̥GD ~&$ 1c,ĝwd䦀Hl6x䱅'\~ vSO=5aV՗}!eRz|OϜ&H>#G9)O7v;> Xb1cvyd|oȿ$=%%s'/;p=sΙ2mĉ=c]CN8E/~¯~:dFĴq$ͮP,V͵==co{avIծ\rժtk HC]m-\m*eV8[t,nB}h'`0 >9UcyMu 0}-eg`0l(q޷"J Jf_ifһ20ϸ;=zKNW65 1Y2=rU!CR̰`9DӏfV,;nGVrB"b&#۟`|Ա6(.[O?')' _˖-m-pR);+Iڠ!\]% :6lt5rH!3H3 8|~?M̬${wm7ߜN/_~]w瞍n;vnMxg D 8?n&F{vֿeV458qO?7ފ%~YABJW!+i [z!;ӎ|g~_J{xO{e ^W3b_xaʦx"<{vO|霼+RzG}kZSJU{:][[ҜdW9W^{#US[SSt.n T1bAl} Q1W c!gP !V輝1 KRJJ)X`A* O{G]N QM>jo~7ؿOSfRaLb̘N8O;XX{΢W߽ۦOuPs?ȿ^YGtРaG#9cƆd2yg̚3?;M$RR,bV(a~7`iO#o嶭ކu/jR\M7#jo/O;&O>j+-ʋnr~+ry^}U|s/Va !9T*O*Hdd<O$[Z<ϫMv,J[[rl~[ɔRɤHX1Gֺ˲ҭ-u 홬m[b;OL 1LjjI%'y=mT*ڞɤuuYAD r!"!M$d5׺\%:dܥX?4z$GKVt ʭOɧ[VDU8Տm(Ty:l?=dgs̈ 觙ֹ'V`0)Z sϑR_EsL/BGWTPa DYReV~R+ߤ$9 ]S\!"rP'u<3K)Z<ЅR&I8v:bf$$$}KCR*TѺGj39@@7(%R-5ʛ;FuGWfQ-HJ[ S_tX"gw >\SjPgK[2XК :"ԙG( D UN߅K+Wڥ|i Kע#vf4`0-|߰gjcb~Q̌kN&o'fZ-!BӫPZbPZA`# T z}# #*f̈@53(5xB9̯0%ɷLBKA FD;k3 ϡH "ɵϮhl ?VPr.RXq(? zX3WTfZY[LLQ^Evn\S(o酰v@3Njc6#sTl"*L{BL"l1&NjWvOz\-Jߊ/Q]tI[UԹH8Z2VUSJZB*˿;%*b(ɝX~)$1y^ a:GmFQ r~@xf.QJq.B}b1^,b0 }12,3V2L(O`VU^DEf` DBK"p&"ECDV*\#PJ*$(zRN'*rNAS*I@\_g[Xz{ʉUϏXQIV_(}Vk"J+hY %.ohpz_1zf=!Xs頨U47mJۨ\e|;dCr?F5@D@@4Âeei+v͹sD‰T!|"S@?_'v\йgI3=p5R/=y_'g{RJAbĉ]Нd2d2ͮ4g՟_Zȟ1q9':rᗃ[W02UlZp uoU4P+ ;s9o͟슾@tЎbJ$V:97-u?.[&.`Qp:u5'R_Em{f@JPYwͣT> "wPg T+|ΎH,W$9UyErcF-gV"BoU儙D0M/Px2:`PJ;|w6Eztb8l1np' ~+D0WktOZed\ޱU)"}b̈uŨX2 ^6 %Ko- !JO+52C0Y~JЉδd)vK\x1]r"Bǒõ]̕D9^'PXͪWC+tfX!18sg̯-~eu"9Q0/ry9 ByyeY߬ʰ'pWZ+24 b P2/h{KdE#]K DLf-\y%DEa:ݓD.#"*NX`z C_Ae}#.q9GA@=\1SCf>VY-xti%30ב\Q8pO}jT5VXs.{^WU^u[P h?D3 \ti4qPއn=6JR*9y}g03"魗!a.J;x֣|tgPsH"*ޯ%g/|_dV&6}4~P}/HA=`FЋ{ 䵟徫~EWǗaDۏRX ֏,a~4%APU`7]*TVG>K/T[)D= J2\<QJ!RkD 2pYd?G`[0~Y%P戢(UAGۧpZ*D:c[ 8y]FlaXTd+%uT?(V30wnnC,]I(SR{HdCmdjK"Q=X9' 鍤`fVak3^ enZ4J uu,mJ)Xzwqr^䶵Na'PaVJIm䗖 PR J*f,\[0 g* m)`_-O: JIsɑwYF.rqKMȚE)*WӐ ˅JБ zF -Cѫ'Hёɯ#BwztJ>ÈzR *,E!hX}#ނ9ROf_W939Lj̡9x5 !37 Ei93>)BJK "uoBȗܟj7N Ufaa:,H3 zxp@f#EGfmAhLւ{EVvQlmPG~0A@7D*~Be)z鈍.É6ɚvʏb)|_*XPV>a>1, m_Uy|'B`'yJ_b >BM;: BIB\מ9DDi!K(\'/c_щL É>|y_L$mX.D(_~.f$,r}X&v0tm;qNUgzh"q8,PER)!|؅xwv+6s_8&:^,Z'P Eߒ  װ|! SicT_ G> DI< QF)$Ԟ+ pAƸhu@?MS2j{nLVXֱ (4jz^ipr(_tZ dpv5XvMR*k3 bF3f| Wm"Tz=ofCRY/+~JJ !pΈH)1})aդ]~Ѻzz뗬ͬB ?Գq`%}?X"IRwƕDzT8*Z9&^'5PmTۑ|c\u(.#%Η121kRʷT$/"D BSAd [ FK3Bw0 Jn{ОIDPB(@Ж?=#.I \x Rhޤͺ7t!Wo@t@Ǖ H 6 !W%@Q0g@ Y6i/@g!@k:6L&HH9WAŠEπh=QPa\f ǀHa-3N8d$,E|L>RZ% 0ƣ݈O*PEt^{ B% 8HȌ$ T,%[+I.Uz r $@k[Z1 mQ=ڳBYtd 30#> !%sBR%\@C @sBDD*`G\8V*gM"FJ]_lE$XwH9<)<5VO"Yv&\Al<'9Pw%K0)r{: rVVR AX+_r`08_^4T*sg̘P#.?_g2g=eӍG,y_{!h9j 0{˖.eM:b@ޢ!O0b·~3Ny(`˿ZM=wİ!}%̯͸c=F̝eם6m&"Po,fFVJ1(o%,1#]pgV%otGozOR3f^ޞI57w11nvG9ɲ9-qϛ6bجc@Lǭ!9G eWDTkMbmmmLO$Ss/]ǝ:u&C6ZՉ㏜4YgrafoˇIkk=_?AΛ+V5Ϻh%‹q{K.]Iדּ8xǟ~zc[lʼn's_癜sΔGn/F Xb *v2պPQPu]">b$xzL67iL=&Ό4̙;o闟gsdĒ7޿t|Gϛ|R'=i# /.61# ^}>tϛ=9_xq0k˗;3eʔMF O͟W[[;nܶ{ \|K-wwi {tIwR )wZY7ϒW_#=m6f̘O8;/2͜7m?\R[[;nܸ9VX>DEwQ+#ؚ]ү;Ï3Lmm\83csΛՊW{Cl\لۍ0iQ-.=W_iS760-Sa @+PDÂXU a],P ιh6c|bFK[L|7?ϿYt^^9=m'P@SYP@-J#B{&kVclj TW\:'p k4}^zW_˥/y啗;z7\C-s1 1i$Lt/pyNI-_ZT[[{es>z7LWOqW-_\:%sg;7r[8#"$+$,Ārd~9?_(9VGÂw.⁃?-zUW^:o#zsWˌtwqW:?MK/lɫ~җ^^ڴK5n>(`\WCq Ї0R= Yڬwr֭mm_|-_:mK<+lnyGuuX]qg\p^xɫ_~ezF^W#o7΁HD\gdL_{߅_M9k"r L9zfkk6e'L}?|x7_ecǎM'̼YsҙL&u~UMf̘n֬ٳx69cFƆ>ƞerpOl=~/;o9zӍm&k䇟/d|͕+av, 㷽+<,{Ɯ٭M-ޞizK͝;+N&Րɴ͙{Qc*Ư3LH3f\X~ވ#s'NnWOX6hP`0q;gmTamf]͚ҙtv]v~7W1}͞=;Hdٙӧk|MXU6W~U6Dc64v:&oCn7~ܜOX:pfķ}>-/sәl[:۞.oFӪ3ObfNl=nLxrֻ<$~Rjܶ> #Fxv㶹??]С `Ǽ[_z'(&L+ۖ. 󚚚mw|wjܹs)秒L95; ӱp~D2q'އ/ sfC}w'";̹j'8XMn[o_n5vl28a /N(͞ڞΤtf]w{Vj1}m۳gNcLf鍍@~gyk~Sd=/rxwGƌ!>[&37{7W| A:OLj]6M=;o/[l܋ k jR_|pU_圳\ƻ=t,czXX)SׯN}jl"fo?a…A}M6ɴY3m5Y_دH~P-xNxKں--)K3{N~"08qˮχ '}gl=6w˯ LpѬhf'۳gN$Lf?+t++зQѢ%ګK^ ۲ B`eO*ו)|03>\ym9e.~~ 2gI&}W~(`UNAK-{ v?p.wp-ٌ= 6:n@<@$q%l*5vء͛=|0`d̃{w+5jμG=?)tZFhM[2dC?d]F^Q)ul&KE`"g}l[oɤ/7ko'{ 4h'M~|pιDx?;w}o=$X=KQuuUz3s/o{5I'} *0̖el۶f\3IJsSH%d1A#λZ򢑣FΙw'|t6?J_@|퍷{we B>$uT~6c55W\r%s>C̞s񑓎\Wtp FZR_ q+>%Q)] bqQK@FuP&Axa\1aÀY3{ЁwuעElYs.>-[֞&"rmY IlٗƍYl2dcnglż|>|0ϛQ\xq-]-u/Cug=QѡJo??t̻キ{ ez _RH]]eJI" (л?v}[ɴ_:w7 5{ɓ/_8X\Rљ PVTgK.Hғ',(K cqT/klt$mH0榦vqȐ!g}?>|ю 7A+(_﯇zh@$c:2 U1;"b*UC$ ˲]#D'`𡍍9kjR1wo8zQ#Gy^P]M[oUm\n^y%HjkY\α@z: '"| PA̡t{{~Y TrM<75 :saÆ<=TW,;뮿~=wbaiAI!<¢d<-- ޯ_cFB*0ss;0pРϙOl]*2QJIJ۶{Rj#x<P:|֙3V\8. 㱘 vF}c9N J$P穀mG-Rn?˯y_J%<rz3Ѳ5XߎLmuuF ojjq r9S.||Ӻ$]/DC( CJP: `IHl6:O8 >m{}</2thmM Xe)Ŗ\.6cvۍb1;N.IXY+L6 ر|F X g3u ZS VOYɌ"ԙos]{w ˺ԹV2m[KJ766f|ذ dS3 CO&$bٲ;gʔ]mͫ&xWf+ {萁K}K//7ofw0 `YAga{.|||~.}n2IIq~gO=,-3sQm[oeW]5|'}xlѣ7{EꫯMn|{&t `bO=w‹F裏DA]I;ʢ>ѣ77n/Dm1l_lůr1c6uɫY]՝&Z$AGGe p&l%sw]wiTz4Hwg>`  him=z^z^}Ə6te_}e +j1yuɫٜעBQIQ{ o#x\2A$"ЏhКqbG}^?~#1q8jĐO>Q{j-njY"XxmiOg;$+)=̳{dАGW(zZ#W̽sL4h#a-\hX[o6tвMc637r_}m |K>m> >>a/dv~wq%M@`%XK3Orn[z٣G~󍷤wy6aQÇ|gT|[m5z^ZvmoR~GcO=̞;zsF p²=Aa.1+ݫKpr?U<SΝ8sϙ"A_θTfmsSLLę^vC >t#3r2SSc"@&l1ε /;oʹzK$K->.ux55D29eʹrR5ێ?xC: &373kX")so^#Wy9(D4'3J 8Sfϝ{m>A_駟8ԩS%_ꤙ3/]wm >s\;o@JBn9'μ?f#͜>B8<,W8_ϊc0 kŋ⋞wq_PH7:OђpL_VԞnIbnkkʘ.ݞI$@)fTB*lF;F*m}QFuFAٝ`Mg2ޞIJ)"\ϲ\M2 &㮧lN2Ať1K|&ʏ^t)ZR %|Qdx<&"lϤk)}f[[qj13^2igY|&l벓nRŜ+m[( AݏPȹel.V1$~Ag*)$OwJ-Sd?םb>^7 UP 8@d%dbVkjSZtmmڤ]7gz8fҙd* դRɸɤ Je @O7<bPb"B+"jRl.;@T'Þ=T acDrIf?+)eLo:rdXrVkxx-u?\W":9@FB A 8\΋ǂZRV֕q[0@[{_V 뺶m2'ٞnM\Oږݞ%Sq'c ~#7 >4 `0z0AmR(H@5 ":bG 3R41$ ŠCq@ =jD0hR 2 zX2ne!,a}[R00" A` IBK0oDgB ~{Rɤ^G_af`!3(ײcRɸ@M<:9bP!Pb)Q &q?'B*n{LTL) 33':-bPgYjݹBORY x-D*T BY)H Ahc KON uHhQB =q[0C,f) t~f1/{HlfVJiu  0 3c:~CPI@WYnJ@2"Bm<2H@M*Jv,_pl0 `0 !뭁9`0z?ڃkۖwԛu]⤈a @b jsiږQ`@De`fHh##+V8R o YX@Bcb(*bPBcQT̤Mbp Se ֆæ+@3@bTѷ m"QDhc?sXжZzajMU^>rE@  ̧d(3UU2|:>{Bh\do s Pitaa*fݵ?GR$5g /7J\ԫ݉:RȋDr!n3aTd2_ fAP^zZP`~)_țZfR:P-JdRd$ \Uq |#*`N·0Ӊ|꨽W$ja `,2Cw@I٠4BK<@SFa6 } d8WTRJYT#S:ӹ z0" &^c: rHL~pwia@,eDVz3ỲV 30TxLL ٫ }U>}صI#|k׿[ыFeSPOgN0jm@`Fҷg@[|?{o p-E Xh+:J.1pWc #j,Ne ̕#'[u*= #<%Jw;u. d@FP]] @TY3ʽZ,՛ ?_?z#=Q C tj]4x/"izh`5"`@b@T8WUV`Ĉ: b)9=J}0*ps_a7 |92"vr>ُ,khA*컻K~dEt@#`{X?7h{Q3=6`0#tPhĺv?ƷB+zSɨAddEL @)xt ~&9tV\$Pt]z3(8cdR?^nww;~5f@0+e~1 =OHP'UٻAv$zW 3#+, |b|À%UJw_– {PϼP0҆Q3 @ (%vɃKv Cy`?JK1%0PH^?Hy @`$3r$*',dl,o؂uTlPHhwOiC_]#0VJ\# ,%6n, BN ,csO3VTS&v@A!U,-3E ;Q`0Q%Ey, trR rK+ ZZT}} +*"XVfjǮH#%vυ+f`AU׵H%TʋOfR5566 7dMEQKؘ2ݥ&I)MM WzyrMa(҇œ+Z[d]]'=}4F8%w;mZf |]GWY nr³A ڙx4\$tt@\4f2;`hؑ09Fr=\Utf rc9\uq|+B,%NՋeR "Gt_&9;Q޿i0!r+[➫Vs`6ME`09B75^֖YJIT Ȍ#`43`uz;وwK j{xD@8A.V 2`uk~^O% ~ּ=LwP bq]S,N_\rDVJr? U&ԙMlW+._;A@u&b:N9UB#bbުC+ XLXD1*M R3j}/P~JgS9G(T KSZ}|^a;L_a&NCd[h1ٌr̀tؙ C_Drvl mP",ܿw-cnQ.?Q+K'\q(2 H[ Np܃2T_žTTh**ͅU6|JUmxCO( 9\MtvYPA>rDqوsJ%!%A)/B@Z IP=feI @ ,)\p s"?ܽI 0F u`;HiFTUr{G_55^e`QҠt ʧVi }R@4֤OԘKo6p Zq"ܣ_R4 }Ol2֙IČ  cZpFAډyF/EU W02ۏbX]mR&0*9\y 7>sU| ,ͅoAFWSlP:*ܧU(y@@iwffH ]l!M*IWb,rcx= :ip*+Aͩ} SE!1.:sK=@p033Q1bDچEl 9fQ!G =C/)r R̬Og "m"ͦ>F~./#֡H0R%pMY* 6`0A\PBN yΪvX-@zZ}PSD@SYe1T6%k=xKD,%+V #,ܹ $y (ffŊYARJ*DDJ*)%""!"bͰx!| Bb3&.&wS]J%:Oa b5Ӛ{}+"ka97%‘_e`H? X)fI#:r^Fg6 }=ڬzQS_|8d[8^&H[!]&9! ńD%bN4YB2hko(CJD*d yը3e&% [ٶʜBC{1:cΌABP(:^} ):3Tl/V8"wLH`gӹ!P>D8ϟ_u$Ef@`W}E:/={c|P ; W9R:LY`0z= b9A.d$@#ٴl2d:,z )N GkdELb # E'*˚™}G{X̱Ƞs0mb.XYiHRL7kX FF(1KGʎ*Gn0 nj5`0 }3 >H"`0`0t+ 3 KQ> a'sn9ltfa1Pbcc0 M[l0 yLRúŴ-+`0_D6 }.dX]" v1ӵ!ؙ CzJf.{`0 l0: ?jf`0 émtf`0 `0ctf`0 `0ctf`0 `0ctf`0 `0ctf`0 `0ctf`0 `0ctf`0 `0ctf`0 `0ctf`0 `0ctf`0 `0ctf`0 `0ctf`0 `0ctf`0 `0ctf`0 `0ctf`0 `0ctf`0 `0ctfGy.d0 s9_ 4*Q~ش5fL1 CIC C"\.IoTW+@3:9b1DaCl?U0CF6b|  fY} ki?5w 㫸 T,i9kљ a%{}Ci~7tHh?_1z9Fg6 `0z&naMM5oSjƔ5onQ*. o㭰M7eCP0tc00.p?r:+Oy֬E'ٙpt ^~љ CF9f&ѭBx1f)(489jTdQb+7IPqJt3W;kKo]J]:s*tx*b~~%ٮ#:Q^.U|-֥"Em3:er btfGADGa(s-js`6 /AeQuDJmUbqNsvUE)w؆WBg_5ٗUtNx}]RpIK%1{ zjHZ!D$р!2 U! S9:ڪsÆKY?8ӏg`=T6CmHQJPhruR.Ş-;/ޡx;PjHx`F`0U?c)99\<"DzvH")fݥ )G:s\dqC!Abғ_;8c-۪mii8#GjCN7x#̜dL2gΜT*`:pxGZ86"?"?բ~',˪ֶ6`/if}|pFW^yk]xnz644~mnȑыۅ*kW)q]~e?ϒ%KN>ί?N.?0"tA_}՛o{ !MvqǍ1غ=wPw.Z)Wr(x3liiIR\.ׯ?GR)HF#[_|ǷEvtŤKzDǺd3 >" !PwA?9?OdHؿ-N<8nm`( @JЖ-`F@@CȠ}  2Oz =!K)T,|WzکmmmZ[[x\}/1Gbe566e2)e,,u]˲/:jweYZBQmXhb_64655z衧vZŵRIIAKYt="$3(+8lL&3e9g}%\Μ9s6u]~ 3U~5 H@\5vk Avz=IGDqqX,5#+ꨣ6xcuC`KfԺqh=nkkSJu]/СC9g2nw߭rg}tg뭷\.x{'|c=);?3g}v:>q?lZZZŃ-Qi4]f[@[n_;o^.;^{9gsr҉'N:Nj˭'Gq1}|s=3ƶc{WmM[lqǯX?QSs9s'L8S0᭷޼{[|'N6y޼y/9ٻ@+3n `]؁]nQ;~>|DfZ?̜9q/ |?sL3gV|kYf~i[o /jwy>Ї~8bĈ3òik[QQ/Μ9~޽{{L_իWuu3<8%x{6hƌO=̙3w=JxhN;Xcg}wމD"{ѣc=Դx⫯vp)ʲ˿'|;3mڴl6;}wygsslp[:u[r^{-|=z,OkkkXct:}1ǔ6Ҥ0(ГFfP,PҀAk?\b{/C?j|QXsgx.Ǿ'[P:9Nyx}gӦކP0%8BΝ;x {~\  Bo@QYY裏&믿~ȑ?/2"^y{O<4u=㪫liiAEM:SOK_^7ػwSwygΝ_yU_t,w L@nOP'|777uY~O=D:5wy{`䧟zjSL9gv4xPUU _?h$ۏ7G۷g@SS&o#f .ȣ|Dž>`KKC?lG">쩧zuYhhlXwu_aÆ{̱v7T[K/y.$zЦ<6y0sKKK,vK/T)uqƌs!tE]DD"l'\gun_ʔ) ?N5XW^駟&Nx>s_|EUUU6u].B!EdJ\.gYOrĉ3mv)\uU3f\.@kkk$FꫯVVV~~驧:a„f\\aˏk| LDR٣?2#}ݎryhs=g'|fO=Q=c>>uj}>tO<9w't5׺3L{yyn1X>,s\TDRRW_M---AjH'|~qǝ~LFB}ѾkYȑ#gΜfm{o˲6h#uMj̼WTTd2n-dMV;vBs%Kd2=cLFת;~-b-fm>#˶ W_岹iӧm_unݶjwދD"^{Y}~ 8pڴi $&!Ľ&UVVp'to:NMu@aI,ԩ;lIѽرc+++:>q{9!tu-d7xС#Gd6l@J wf`@633Bxunm>|kHmـB)%@rNCCe2F!xԆZYQ`Y͝:~t[s5SG=eʔEiefy|[d2̬)wRUUfs: ˲N=TMMMh^뮻;6L2L&98>xg8 Bn(H Wo!oͶSLرЭ[!CvmdR) <( Gd2E_yչ=#vm;kjeY\.iw=wqG*RD;bY_k=\`c-KY+ⱮB7)|PH UHL{nݭe !t8y{t[oUtڲ%K߿SNTHzox"#cD{z~=pgΝd&mYp֌)%&`U32 7Cv7fϙӚJ \{j{p~uʘ:T0ٖB(")qE"Q[SsU/?K/|2/JܲAguv]׍b]v0aB~9D5gzZs5Nj̙3NDZZZ9}lXcsmךMmfoV]]]*zw;qBx5̝;7q!DkkV$[num-]vmo_}SO=iYRS(@]I F#dk2ɬ޻>{ﵴ̝7?k岶m54g2Yq<6?Ϛ"W_~{(2_&q׏@/J)G(WcF_Iu] hz/mۙLu]"&F}5?T*93"j5M67Xti}}[oD"Q{ 6a`oZ/@Y1TYKjK)_~{uuu_> h``g>Oed󝁁_ ~x<6vǟ1dP6fܒ/eK )ň:=2);\xy2<2uvZw@0_yVDlwbh4=A~\nllRbT*Rx\3 &vm{nmm^{=#/k꫷vNjC7x믿FieYLv„ &MrsGyD׮]S*G"P>3O?cGx<_xE'` cxn]sz/믿K/]sРO8٬mGPHRJّlsw-;o\zez o~wuwssȍFl6zE]t?q%Z'|rsK˄ nƇ~xm^sР TWW#f%jjkA!9.fu$X,d2BT*D9RAٶ}p UUUz}f[ov#3n{g_p;c6 +**F5z薖)eP<vyfjmd2`Εڶ",+JjTJ١o5YDbРAu]WYY9p;600񛤛-Sʿr| GpSsW% Jaʹெ2 :TH),:9ɎiKҊ3G3a̦x܄On7o0w#<"w9S~8fY}у>v-7Y_y>W^ْl}`ʔ{y<Բ@w.PifeᅬF `f ./R I^5`DDf4g9&egY S_4A~l}PfR.jbJ)˒e !J);[:Ơ9mB"-.43+EDJ|qaQ螰"""n޳v&KiYTH)!p[BH}u_kՆIyu9m\Z_]j;ry=]m{՘ njG},}s[9X*8Nɤ 9S-z- g[X? zz56`_~ 2"WĪUѶ#JeG\ELSm풺h$NыSl.#T*^Y͹R*eYeGt:XsSVTRm0xof~Zj83Q Z yffD-`Jˆ߇9IxIx.%jfݬeh%Elpuͫ/n@ *ޏ@"ܷsywaz(wG,C Vf89ۺan ~ ~#t^Մږ-E7;'ֆ[>pk5lSSӛo{qxaà]xa Di9sh1rfA28IDATǃ&tyX(9*,UYҒh*Z#)7j@,`c- QFp2)'+XTyYE nK`GǍ!O5 X `\i@ 嚡졈K\z wD  " ~E&D23 e6MB e x= 6}< gBS9[@]9ކh6<w\^\RKXt˝Jty0]k*Zq㎁_4A 랧2d zst0"?Tj0NOlX 乃(T<KCog`EXFb1eօrE{RsB楇 b]A~H{. sl;_7|W,3w<(V/ (5,W z(;== ȼmAl.hY>q?z3ffPz!)o3"df.j]8βP?s_ȋJ,2>BǞvQIo,s}Z|5V"V^LB͔-'G}K@rHuLԉ7¡Xp2!maY-7n9 ,q|,m- J5!J\OiG٫1e \v]-oAGdARI[2ƒh`WEQRWFl#+_U bjM15RT[x_|GKAAVYagE:0”HXkϚ5+u'EDT* łʼ\f9aP9 RGd G.$=C>G? ꇳ02 'ȡcKPf0{ܩ(+uEQ珠7M߷9_[lYl@3^Xw,VȽ&SAkS6|$S~?m :>f6$cSs૫Om3%_|E4[F*&uvP-Ne[+e]sl6j_(es8ڨռ̣"LHt"HՖ=*y/lixG)25-ge.g9A0C/0셒yPp,3@DdkkUeeK2YYQȁz V;W{s!@@yXb{Yshs;t24o;Ef !ݭ@3` ;<>.2D393X$􌹵5(.g.K.B U~܃eeoM|EY.Bs!*|6;cɁ7PeZ ,!,AJRn5 ėy[ pvQnRŗ^7nRJ+p |n6@.22#D/`#}̋ m Vč3﫯V*[-#%>8n[jMW01kMn4000CdΔGxZ=N,@D/p8O /|ח3" Cڰ2ܤ8ƻg@[5}S !\E’-D(@] (y\]-0ǜ(*"عn,<PkO{8] Bʀd@D DF,hïĿ!cse-p Yf6֐9$ "ʏ0 ^Ol6000XuPJAD{u)!`"E,Vfd=3_t 1R4OVJfKfp a_Ƭa6bBgœY6X.sIra5ÃlDieR^2sFڶ ߋ min_"¼޻=Y.↹̤ +ϻw:y˜3-l $A5W> Ufc.b6;tIn;UY+ЀҸ>?KT{XÔECJ/z;+l.?X=+LYfUaT8@iӦql=C^5 >*BJⶉY^>Z .@(ss~JÙW&lgL` 0O fE|3R\~ *|oP'r5[֫Plsd~ksWr#3ύu@>0dQ0emLpKaRT Jĺ!$`$ nH(|,cr8C`&^.MmWVV ϸ'8̙L&PY""fs P3H,"Ѹ.ăv4UN+p#xfE4cl.gٶeٶe К8 hUhūcU5+ ²,O )J!$1\lM}:ߊV*H$",#GeǎPHS @@&d (P1(b :?)"_67sG"DKRxuU"Q Q @ i B@\йL~tø הBX%ONFι,lVQYX"&"2#BSD "#anl```h4u]7Λ7/cܹ:X)c, tgx?떮9x3:{xO"Niu]tk >bQMmǦ>>e}jv8ǣx$ꀣW>ԇzȲvxߏeF앎v|5aF!%-]!C^{X,F\UY]C@b gd83t&,.U>X$EFdE:A`J11),u ķa p4^7W^&ZB dFv-.w~G3)R;(i0! `?IKZd:igdr%D]<)~n0l!0!GfB &Vyf^B COg600XEQ$Ǫh~z)ׯ_߾}{ݯ_C^&0eE=su;jni)-y9/v4ޜL1h*F.c$_B϶A a60I:J)&F"7pK?|_~'&bI7bP!LuAFU$ͩi˹Tk*Mv$*h2P邥bGl```sfR*J-X HdL&Zk-Y$N!Cx鋁ӧ}qul40'~va{m=`}8渊Jr3 _~޽{D^{ڛo^na od{fǮ/@Gf1Ȉ RJ-Xʉ_حYq]&bd&Y4*@`/G,rMhN9ޭO|ݏW\z!rKꛇ3v\wɒ%k tYgDYM~7|3QYyoiu 43~fpH$׽{>}н{:ף"帮8;wnꚚt:-b:NMu uSVa :uDeUWW3 @@LePYYf$OG,x%Cfȑ<8e 2 xU 91Q8V<&AЬ^WMCƌg$Ii[o룭I6_yeMlG쩏?Kk3f|`}tWMt9\&*CTB̛+msA W^ mgmnXwx`wqSO=1}qzمu[#NH$.GmO;b[o-H@(0Yքc|k/SUNyGÇ}wnW_~[= K/}g>g~u7/YEؔZ8s'd6`2RYf͟?u3fϟ?o} /ےLJieYVJe2 ---̜f555붦RVvsS3\&Dt]ŀUUl(>P-YZo-ƌŢ,5yE~[peSk٧~ܹ-i`XFߪ a?T_wj+7xkCDX`"(8ZlmExO-|f-'hmMVWUvmnW_sm4ѭæM^]QJEQ[`Ks˩߾@[m_677#@՟+9300004 /ٳDB,RNK6x(gf Φ#7daKK|9MFm8x!?Θf}Ƕ UJߚlU<6Hߟ}D"fWۯ dUe"XT)B`uu a6lYV"]WQΝYGI***1IΝ:e۶ hiI&**tg?) %ƀ t()$zna,j#W|fYE9ťw@[[KZvk)5,eћ1+ W@:8K f˲t %4=C' Sٳ[ ὴ1z2DP D! (fμ[29+VknbQe`'d\g```~_s~-.av}}8QҒxBF"&WҢ939Yb&xbނ\NXTYY¶uDbެٮR1jni$3@QB!:@A`62BA}?j`bˆ"o>SNKf7HJK̪nzds{:` X.&&|=`mP1+\*_$]z?QZۏ_ӫvԩӦM*b\zr,Е"rE]~y3>-i!A)xJ͢Ǚ!oZF$&+E*n{~3fsDi  &$ b e600X>h4ڿD4`>} )@)ELma7^glM7qsٖwf[ot:oĘ1c\WN6H ?o{vQ*8X46dy 7?܋m6&ih(- Q0#QuT]Zs'|˼͙2˿oH!$d`"Wh$گ_ݺ~7`x<ޚNOSS2qyS635VSҚilIv=?͚C*i%aӎT ̹%|vh"_x-6mڷ~+\EXܘ.klMehҦOT**h)l``#;'%% !L.1 1L"(H))DIJ\W".?yi]ݢK~po٬*/7J VQ ;pB"b޽{/^wDd۶^A)%!(ܜ3oIw޾G3s;CuU5e' V1Z3}̾+!P\"fR1)YsfM`d )LʕB;oףG|R;lka@Y̕P6{_}U.:t()":Oy(\.jz=/ꌈ(HKk2wrيd2JTiweGt,dUUT*N%k\ET:xd2\<eIl.KbL&sxEe2υF"\.k1m@oMVUU'*)˵R5"`&fһjZ3XEx㍝v sVEU>Hds9;qLO${O>⧟52͵5 DBdbh,ijI;lE<@SX}4xuRb$|Ǎ̱DEcKJ0 x<عS\6㸮%ʊdU)e۶*mDdv$L&QS믿w5B8ǀ)J !DZK5*QWiRz#iL ߚzDQxeDA$f&Bk0vu?Et03Ԝ<;kCk=f:#Xz7|CyQU/ vNfﵫY)>||PY A =3 nu3TrUlkvzmR !e&bL:>^aiUmöb7000_G;3O7;Pg;RH`> L" %EDT"m hE㯯ڍ(PGtҾJDG=>jrsss>vw"b"2rq #2d#AK6Ϣd?ns a&QJE"T*u+aMAHT-t[/뮻wɳs:W٫^yl}A=1"9m:΍}B^v[X,.7">cx_ˋc@w:3{PbPв-Rl9 GyEd:KgeooghG^7neO'B?E|W٧]Ύ pd\&Ȟݓe-dd77mxoa0fᕋK$ O?f; . RJ)x`bgJ *{xmzyo^}.nj6޵7(ɧ>䣓oΙ(qbQ_yˮ<.oljVĤ)E}ALk=u R\6 vKʹTExfκlXw'A777iIX}pD&&fғ;RAܟ (/yoi ӌ ~,nP3Y Hd=ukRzMfDB h\W@)"OQpJJ13 uPOKgy?8) s`a8t1sד* Bݻo;vl̖n:뭳X[ns8Ck |w:޺6csSto3fLĖgsλ#ny|vuյ-ȥ౧<#jA1b?pf/C:r 2J@ Jfq] /2Dѣ{tru~va±믻I3gi0eHg2]pA]]]sUPuMPj@QCk%\zv5-ƌ2WLOf RJJ#Ȳ \Nf@Qs򉇝pWCS?LniʆiiPb$W@WAmzO]v+ |'UT$䇧ֻ]k>쐑#<[}yCKw.8Fl 9L&z-):HPiE!ly{umM]~#=voolj+z?ϺFms&tj:ֳGkŲcTʶ#T%. YKDlo;$Jz3醆=f#!Deum>(ab````+΋swz浤Ku8;̎GO9=vg %a o?̳>3f,^Z٦Dv1Y*aI&nI&+*b6FRJ@x"dƏřƏX,=!+ (TfqCK5?2iQ?̳s\(HRkY;c+E4/nqΙ=rM>ٜoӴ㎹7!+:Ygw؅Po~sσ.g.dRRJfnRJ'M|҆Ɔ{sE?͘q '4%bKJ;˯&pҒh4v%ܒB45SrV4&y39/ѨKN?޺ƥKuuRH\JJg^Q{h̎F/?J;tlc'i1X"$[*DZhd@~-DMX.7ʉI2/'nڈeUX6#NKs3"rM{۩[׮{}ݎ>ō :~]WǸ ǟyoOԙ|k74~ȁQ"Fx=MHB퐃o}ߎH;;wiq[!Dq&tr'9M-C Kc-p(/--sϻ[t}\z%%Okk zM7Jw~/۞(a'[hؤ:}ACknp>W]ra~U'>6[nec7O4ɲ$J!cntPa 1!+rI#rU:1!,@ qE"J45ҒR^-o$.xbX&b-D"!Eĝ:u9yofG~"PA`4CAۯ@$p ~bFqۮ @Ėr駜 C=пlC:_9޻8`;0㨨-:+ [lhiY~9op`+YJ~5G'Z2*qav!6 p9Oy;`p)}n}hRH);J/ BX(XY <,:S^ 2 H$jQkqCcQb%Qxe{_SN:;oʊxSMu1G1j䆭H$ /!"R-]ҵ[醛n~w_Ԓ`&%Іr@KHy1rA p76?{}\xa%+r`ŶD~\31) md EB|0 G:r"""!nog ~:!@HGnd:93gʤ 8ˆD/fgX__3z V[lO66-I&MQH͞= /Xp~uukGk103"b.&^ݵB~J[LU"5v>=~-pP:U:(eנљRE^. dfJNK*?aVvi,mRrBH)ǁA$wGwČ̊(("Gc]g;m !2@Q:G !?gi+3k'3 k{{ ؎m`Ʋf˅7 ٬_$3hU'a6WBwb@PJYv~M|Mu#]r9<r]m' h[.ٯէ! WѷX FS{y9!@ng[}10"O^ԃ:wĒi8* L i8qpU32e Bq=/pV cx?xT0 BmNVm>׮XV""%" 4BJ)MK7 mP.f4cP7TjbU)p9۬kQ"\m```!R--i4^ 1 oĊH ~P>bsML:wuwl6`7"t9̄|,zc@*]{AHm(sod/Эr>Lin9̙Q &f'AemמDH!ZB 2@!-`כxQ9,]җ*`]KY3L~2I> j,ҟ k#r5wp~f```?"5/JCJ@3ADLPR~r0iBHDf (upQ8CC?3rבj0k*Z;.WBaLGV\P^1`%w`n7b?7{jE{&E D|"kv-ҳ=? ͽ /! xHLٽP:vb:p *pO?-[-/Nz=)S&?tꫯ&f3m (Ba,,+mzHu]Mkkj]}'NcƏd&q^pE}=s㥄^zZtlx[UUY*g4`C;Z# w'(LJuX ,PvL[P 2LF 0N?W H)8:81zf xiz,%D$Rp2t` "{p2Kv!C,Yb.@&}q!TKB'7ðgIQSj=]}էv&o|]w]{u\;>|WRvmWKO?ҺSN=SFbRCɷGnAr.\`_F vE-\ev 7C zpyI)<1l6ôiݺuj-x}p챹n֕Dλ;onݺC8,)hn]p {~xT0\{me VjF&ŚJJ=vO98Ls0,E M뭷˯:pGuqƛ55?㸏>s.ollj^ZW)W\yO<3zٿ,<+'oN*87_wnFb/xoIfΚJ+<̟g~ǝW\uՍ78.1ueW;S*׼W m!@nMu sY{y~^tq:ХKRth.^v]qeձvnyugC> hy/̏cc^e^*X)+NBǛm-uܜfRV)EEEvڵvmmN ^s͵;uR$-[{w>n,)[ZZ~78q:J[3hl<([<`^~6^t=G[n3l&C` `̘1̝+߾ݺu[sР!C}BJWQsKs$۶;u14DoiM7"'t;$6̩ww޹_{u&DEk{o]vC|ŗ9DZ,KHYEFsG_0POGVg%{Ȋŋ~Mf.Ĝ=PBA^^ d~e_÷2A/H"9A+sb]~[+.s&u˼k^!\OCIzC@DJ5__hs^l6 (ߥk"B)r;s޽;"$SK.x]v?oǷ&1FJm```P"Ml&jck),T@Έ9C4fGcL6'eGUJZϳf]qUl.粹ct /Is6y䑽W}%Ot_~nm>t:G̗\zY}}]*B![sԼV^ %X,s"={/WM:Nb1qF>,s۲.bUsW_}Jw? Ù `AW2] bBP!$ߜ/QY&(,m\Q-5]A bտhľ+[wh6ǹSQ?oq߾}o'>xPݯT*uW?Gqĩrz .묛nuÇpxR~"nK  P. F}+SK2`.\oqsq 䢻,*zEɼ1N lEa /c {\yoȶmI);no8`E]$Z{^{mذaw~[MMuSs?߭[9[pGESԈ#nsNk.n _駟>|nI&I!MIUPv/[d' gAa~+pd/}GH}E oSWwa@ WZ:/ DDE HLD^# 2l<#￿I& E-skEQ(Y@ĬыqԈBs2wjy6KX:tQ:ޛ`w 1WLplo(j:43uX\`w &\Xw>sB {yAףQ"BTPO_}w}魰HԏR )05hD$Bw\=p! )t,$h>l`````B(||2H9/LCz\~~* 5>#pP7{Dfbb(t0b>7F@ֳ̊HJ))666}=zj*~NK޷ބ bQ`!}eNO%,ʚ.@_SNZ^9ƻۖ-r_`>70q ep/]g=kآ(=E!cVJ?l><2 /Ҋ+Ù ~<^RX9͈9Yf 5̐ gW V, M$Hn|\d90 (Za[P> Nr^TZ k:#0칄WDXcjwPA{б\B'$ƅ넮vt9̌ ßLTq7Y"y֩|({ !I2jdE' HD@L,b~M{ IX4(o/&F@ɂdO/˕g\Ù ~0"luK!L P$mL૏erG^w>ЅIX$eYDȒdX./' Iyj-X.}! (BK!<@AuTkB'@F\)Ȉ%54.;Qe!jaH:,[3-IXϳÒv >q +.5Y/0oEywn4|5DQtśtABHS;05ϹL ~FA( 0@9,% @ < LȒCϢ(Y` cޢ@A1CSt.@6ۇ%cpgb y=#{Aa_% pu%)\ =X0`Y|,rY…CG@֡q l{C33@tv-',B2'k0|F@̅2\J."~+—?R.{PZv~ZxC;  ~l':? $0h&l`{ 0a pl޶IŸ2zD8,s, N h!ۅ:%U8o? @92 l:eOa ia|(t$"̈PPs85{B,*fT@Bۯ\">E\0+D M$1G` g!Z(X хz*#!Y^GyJ 3ʖk*"UƠ^bgX@p/Y. 9'@u.lI2DmHg**vSwFȀS8RV@ ,a!X 6- LIpG9?b9 @L.(KEyN^̬WYKD 9+wiPn@A )-$[BV.bB0" @EL Yj_90bT- S<} 5^!p^+jDb@bFV|DX$\ |  `DFgׁ)R*PH> B@P2@`]BP") W@DE $X \  BW %X%:v-$$X da$T,1(@d-&l.frA)X bEZMg37` %TH%BrJeVEB@X mZG%# d]K2Z`(1!A2+ "*e+£; eA`?MY`%`-e~ m W*QȮZœEBP+ìB!H^A2#Cx|0000000ukAH- -^<ɻAh(|2$KX1! lHĮKQ*`X4Lp\uА9"A__(Pk`Fʻ)H`Y*I8@F.R"Y $[ Y""J!2(hp& ,@)Y!)EZ$Y,KD,B@dDFBpP K DR( # A]IbA$0X $KDRH Hݼ(b"vs1;] HO]&@0`JaN"IA* R$vr@$E76 "$A,]-I X %30`312J[T[ V|y b߀,H!,lR;@%Y8\b I! , l!EBeJRB xK8W!l``````+-|ӟBk(nm*kazuJ3HLvcdɕ hFkHI  @dዕO(԰\S 宠cnP*DfOnfvZuZB|Ct+hq[w;stM˙]cOV-ŢS u-~lvy Koo}t<'#Kw}y]O?^ҥNʭTs=^Pd-`R YkToΧSK5͗2=n4*Xl uv ZJAf5:aHD iGn|q#(靇VܹG'>޽Ư eTv.|ψUE-T*&}SlhlP;m]yh{Jx1/7:Yńl8wS_HYe.{+?]fcQ ^Q ȥ}'%mbix_- єy)VHPXj˸ p2R(B/b@{5o?d8k6bkvI7Ӛng%ꊷ#Ri!ؾb!bN6q݇/m!wyݲ>&ucͱթu!>FX(`P`@DjΌhlDe#Đg _n婍"ƇUr{ܘ- FBJ fAOM(A蔽T3fZC/}~xI㾟.nܧ^:_ҒTk|͎t;tǸ*K,8bRӵ;UݷJ-pY_:&4[H)P 3.9rvC5.䛵)+M%n82v@D0W[z^`v]F~51weӀfP{ "oFmzwgvR}u?kވ-V>ab`w}9z4{emkRzE]eV""bEZMuZ*WΒt`.?vM) Gb6vbO^[߻j{Tn6ѸmuMߖ..jr괗~-Dw]8g+Co\I^gMl%nS9|͈8֦ ?p"2b+300Xaw~x~ePgƄBa7y?6eFfrK~W&U%"#;Beص 9⥇ߟfkD垺 .\&8knd~1#'ͬTyKa %@D)>M@m*X.̅<] ]pnyxg鈪9WL=fqӡxʾ5[E[wnOSےsc9{ĠgϨ~Q%sy;eA"MW4G}ܨ'e_u# Rh1D7ϦJ;>snnnZ59GKXgu5y+d#ϟ=[= e"A5U n⧿d9fX8YdDsWB` {6HgNm:+ڤ:w0{|'D}ےRQ́/۴hAnlbZYlR.4VYy Dg}Ig\r̍mًDU7UMrznik.zh/ *6$,"*f蛟?jnxuaUK\\$~nSޟFU(3$v8`3Zzt&]4ZI؞\=mNH.޳7ZmP01(UX5>Pg~Gpdgk&!5l>s =^z~u5n5DߩoND:yëh 4-68wM?-r5cnmKU5\G/48Yfmxt,cS3F MҎu B/s+Umդ{&j"TLepYqtUccKO;s]jGlf$pZk2s@/鞃*J W1C5-t#"&A"+ŬϢ2/^{wک+xJ v"ՕVW*9EgD<.?YO: nOW?)'݃JkHgWu֟>[yVHuEž߶5I_fȷpVĄ|sLLJD9000000+C^g]Eer%2s[kT2 dH ?CV,V?zE警JJk46.+q˹\,bE!PhJ -0~_eQKS.Ӥ(avlUX"b:ţ$>޴5o|N*XZ<2L Y2+]/}LDڱ2"$`N0[d# ,"P !6稔#_Y#556*3v+S;KHךZ5(O`.T&߷.N-.Hc?s2v̗37]i'*NܲsL[jA]k=nT!ө{~MS2S/qlth"2}܆QWDrPk׍|HtPixd0^yyJq?$H8,fA( U~}7wpGoZmW s-#]{VIras*"D绋;׽s$&lJgBDd2/||OWC400000XuzdDx+2VB?1TR% 2a!t4ZiUMk(!%`@% p*8dwr"M=3 4;)k1ō c ohΫ5j{y'G?dMy^Z" ԼvNSH&. H r?֐vd} $Fv,wރZ]@Xb[SPɞj=;/y㜵'UX +#l§t^S'?'rȶ6 tFF`bK8L ٢7@aL*Ifw13Ӡ{>ܼVխ**8rY}>;kVΊTH"v 5qDA@C>w7O۩<(jG<2ƃVK3?YX/̪X5E}4'u\Ŗ½׫ѹ:+"NkMcħVѼ&٩/ػƷ$d[ge+*Bhz,!* , Pbdg?8Ԙ$g8%[2" {նڪ5fEL O˶*B$OCU:\.}C#\lY)-BـenRS!dc_92\klHSUd DCRB抦ʥ5QXִK &dB] uKxֿ/Aqp`Wf1D UZ²8"??DW: 49:93ݘZQw Cn_] s%-uy@|V+ N]nU8}i 1j 5wqrkwҵKbKTea~\eE,n ׎w4$4-۳#JH@BFWY% VMԪd^49l}Q8GH$gJ@wܒ̶X0>`N-JAg/&@ 8&UCSKIL^C*Es:M0nMNV^޸QY͔˹ઌGa";okYotZҍdfҧK6ꩺVWP8 JfsRb&uE/o:Kы%;.V&y hh g3CN׮⓷izlpA9ń UV6n1-Q{Ѹ=*%ZJ0 ];7Εsv1Gv/Hfm̶ Cih eMάu68 %Sv&ydM\b;HNϦ/[-v]K۲r*z|ݫvLOd̽圣Fw91Gt/Vuiw21y V:E;UGz؛nwBTCmX`!7s!xX!`eBwy)mĥצ{|Y9&,iCZVŠDy],::jO|O&g`Cf-G -{."{ۅ]Gz2cёDۚXT߅Oλ䀺o\wO~T{ݫf\Yy,z.),=v[5'{ҋ- #*UM_4bjuj] z+oLsAʪؑ  +Xe$v)Z1kڇmU#,ӟm<%ߣ"z7s/ۭf|MW7Љu5/tMskH}6޲Ӻ7,%[2?w/7vcQ+~)IɖЇ-Q6,rI;ފl̞v;lXP0DEnbDĂJ,, P Jy?fwΜ= Hyw9gݝ'lu ?o.RemfF7>tԣ-,a! Ɯp< 'gX7M,,,~}\s]y_yxyST߱p8 ?߻[F,-I-ixSܷN5=3M[?eWzj~2K4 k007|f:ZN`g O?zM9ZeAAFһ柫Oh@>»wq;p` 8l#|l5 1/(1HH !Dd\|s&]5%(O0ϡ( /70W- $A0vێ_^)H2BF` w $J@ @đ80B0@IjC4(v2Ƒ1!K% 0!0& #)ˁq@@u)%ㄪB 3bA+" !1D $J.,9!!0P"2$ d9@Lw HdqF%L 8#ǐCd($Rrd$Uo$ĉ1HGdDdޓ~'BׯCoՋ  kBTq4!#!  K$0HR2Fș$&X0 !C)ȹgIDATX6U!9s&Q@猈ΚT ߤK6~\.3kyiEM=64 S HDD D  2$t#2D<}O+ WHESuZq2bf%OL(YA$ d(#HLf1ˀ!pcw{%!.$ws$$Uf$ME's˔\)I#rIBDqDH b!qI2JB ""=y H"IvC=C)@d3Be꾩r0r 6H$.\$A8.Е $$PMCL3_OD0" ) I !HFHIcUjfc=Wu93*7]z P*+ $HF@Hȑ9@D p3DIR  CBr!p&y뀒k#" ̪7nŊAY{9w7w*ڸٷ:G""$JE3aƀ8g1FQ#D(%L<.bHeNGh\6̅bމ"\e mvn҅ A "A!Ը$$R60D"$RY# A !I)ɉ0ޢ& (]Hb% !0bxH I aYDd1 ar*]QG0`LrV9c@W7c(Id$f0fyJs8C\&]eK(C $003Hi!I<@@%.nI@""đ$@v(ફ P띉H1\Cde _ @& .cȑ0(Pf@GEB',+e3t@<#tQr!B2)COg&h= -$PxEjG#9~r T`A|kJ )֊$Id_c@"˳wxz3RT""9ǠuLz!H=! %`1(vH1L! 1$`ےyzk%`3"In%Ƃb Ae1UNRQ'@JɁ!T I2K$E<,t7}r1 ql(ptADe)p@`$ADR"1?f~ԑ`($LɄG rDf$pey 'HC/7Ě\D"`! Aʀ[r1[XXN7|MDLR8!J".!2$eih5[P cA2 H @ 2N!H S'@DTsJHYm|c4T5f[XXXXX|-) qK Z@}s0SG,8ZD#&丕#sP .2|5I"@b@=+H$1n/ qATMB !S2a`B*`e k!0t9#xzx<8"*{bD6[nw#Q*A 1N^r!r@<+e  ` @(2B깗M{Ri=1P]&r8(N 롧AU2* |9SCMY`̳T ʽlT Հg4,=ƤK3FVQda+# _͊! R 2_ 22%/T!"  @8sXWKA$cQJflaa0҃E(Kj&_T+)$%g~!o$Z:maBnsrqExo#Hה$ѢK }q}^5ܭ#0&]jh53nbuɞt@HDkaѝxBߺ|n8LK ~,OKYf!;zp;SM>΢7F55e0wݤhh̕'0,6ٱoʣ Š/W_\Ut4X|#wPad$ߚI*$ʰџ!*˙-,,,,,V[rdiԏ"pN^^J,AbYRV9ΡJE5Lf +0 p_'%q<@*]G$8tzZٟc!HYFŨSSuS:ŝd)74ٹ@xSnQf- yh1iPa4?b[jOA28jwC22Ncэ˻C4ڸB`nrI[Xh %8OsFfG˷ s$:IŒEr5⚲KԤhP8~Ug8EHKh*˙-,,,]._0:NLcrȍ%I@ izf@˓Ad w1U~|3`?t?&+֕Aa@ )U(,.gF+d $?S:2$ 4 ]e&m)\A $0Cva5y-5sjmm2>w]M:jG4TA(?3nE7΍atI)=wfX0WHUDH IC\z ܀U2a}6̻L!BEa9E6[VX9z|4$/S)5J!,Ju|#X PfTe)TGƙY} 1oO]l~_ЎsJG@ $1D΀3# ?Dm̷=s".hC6ͧrDF&ht2z+r Ú!_qg2e,P .y?W8K4lؙ>d FnLKEWDYL )HH1 %v ~jyhF.D'fD[¢Z3Lv)_z/] *z68/  U|zż^0@eA'\a*\1Ιv#[% ZtmKad0Im+C!=29I$ :U+{7I{+)!'YBP54sx9O?ؠ[aF|CYʥ D]ldٮgT˟caa AEi"-o5^gDyD$U?[T0[> "c1*1JF66am,Vl~h](̧ޝja5q_EqRsD߿U_u$D L@$Xm[<n͚U~mPAÊb#- ԿL*ͱ2ڳM]6[8|^jn`s_!'# h$̹8F,z8KE}caah-'3&Tᒿ)2PZHHyKBJƐD*22)N2X:6a#t$=Q<{g_)e^>N65Jq9cDƀ@z:g˘C%IR&#gtsnJ>I7 ʳ+iMs0tlYٳ~c=w]2K>99M4+k|sܗ7*W^]:WraxKy>EE:1[X6g2JF/ۆ!3f̸{{UWf]z'ñ!|FX:U1 +ʊC9G98?>eKv /08UՈR[,ib}C)l*S) @d<ׯv?T@s0t&)_0!@鏉Hzѭ=dDd9͵oL^U^^uDcʫ#QRJ9@(_ntiySt]y¸q[n/,q"wܡ:/,^)v"-s?v:X*CkA1WFRs"\q>| E^ϜE.Sm6tM7#F{n[n/? -]x[ 0 vu7TLw-mUMM?;ݻM7CDOw:#ȀypMbQ)m_*b⑴R&ޯE* :w޵ϾriW{e]! #:7+&=[os]=wܨ\IHO:CO?,$ #xЁ~oF)twyQGqԛo;];=P%Vp㰉>x7q%!c|kG`-QE]ל3|9w՞oaa6 6,.5yItj֬ݺvu]CaYt/s=+++7wxp$|w<裌榓O:s޿ޛl/?:k6_}U4x(-?<7 v=oӨ4tn9uzW-1JShD躢& ͺ]Jz޵6lMŸx; X=[U◴V9we8+_'۟uw@d3#b&'"pڵksKK*㌱"tҵ<{o-ҹSgykkO?[}{;imiyv3#v!rc: Hr53[XXPRJ5S)5vupM6~Ztsz M2dL 5%=U۰?x!S.ʊTAD=zuqȑ v`vY;?#֭[r˙bB657#ѿvC[ZÑ1rd$9sG?{ݢcGF0bDEEe"yw<]vӧ[l駳21%о)*zHJ)1vɷF` ƌ93y`ͣ*h9׶mmy."iገ)lvW~eɢ{W4 ۧK.RH ?>v UW]yӏѭ#U[ 8ZXXX桶1!:A-RyMЌoڥKtP+^:W$A"&hԉD+ҙ,qxV ~w7d2X"In;w_q}{I'F^yU?ާzj2W]}M}}}"`3Լy͐֔Dl6-Zt7Rh$dvN1 ):J,}P+lIhT AFH[4S6+㈄~ еjso ~^ ڵL""b+ )8gg3j]WWT؜;RJds/K/!8W]y+{oku`A/Q0nml RJHai΋K\z*brGۿaO,waEEE$"fAvn.rS! M$ΐ!Q$\wuÆn@& ޛl|miixc9Gzs2ѓN:λ+ /wyDk.xlimÉd2X,v5Wy2!VUEL8R(SXvX=w" NHdgDg&>D~4P@}m\Xmmmjm;k1fݻh$캢 YguʩTVU}9#GX:-P8&[nR0ƾuSS9nj93cQښfnCcC]mm8'55D=tq]'x 2L~RJ2sM36/YH8:<4gqd8!5,ӂu<ˍF3# ~Ԗ*g%qc&UW]ED>a`;nK.h$/nֻK.X8䤒FD?/#vn{˭뮵uu/宝$R4j'_.xǏ8Ν:TS֯XT/f$@J!CA31NDOEDT[H#=`M ?JLT5~mmmom;8s;=3dJex`#Gt]Zpaeez?c7pCUUU$d]Nno&M6lذTJәO>dZ,o`S\:J`')o X,ַo_3$3=} H A)ge+ |.+˙d^ַ{*KD ,D(g{1Ku᥯%*"f5UUUr)*Cass=N885jTΝ6ܠ缹;x<>xȐ#+r8Sjre`NBH n p*9gq)J??L+gujτ^fN=X)i^k_=*pƔjf!,'(Em6lmmm~MFr"9*}/g̨Rb̓rJ)!AuUz|W|uTcNů@6p*s7>3SI=vњ@5m^!JS2_yhOvv'/BE rAXd3+uN0`Ɨ<2>ՉI[$G%0DƘ" 3Θ+\!\8cIW΄RHsB $BTWGݻp p!N}ad6Oh:h}!ȍv+{?3@3.B Azr0nE k=wN$tlRr$b.52gHD$%"&n)"pK H1d"s|1cLII6h oM@¿_̪x _dP2 0 φPUuݷ7]9gX9IRd20h@@*B*.nOu—2DD!(k5B) DR P]VtVDRH b@$\) cEN938"ԚT"LQhTx@r7G^@(! 򂦩QP(k ~~u:~fB>TJ*z8HYTZeLjBh+mB[ !ZXXXfh=!EY(9gu4-W裏6|eJhOEJSA_m( W(>*C|X,6k֬b~e_QircY՞&5ڻ"c8T,h؅I ӀD^;QdHR Ê#fIpN$[@E"H$5^0~qMi o8}CƸHiM}j ʗXsfWQ"IBHaTa!.Ha@mx0qOV!Lp!.OnSAL.x;A{.+m/\jwN98cI, 3xJgP1nmmm:~H9+c+/Bh}TR񜫵^JH> >!b8ZXXXX[裏5[o]tEO>dkk*)0?~ƌk_k bép̙?|ccc>}ƍשS'䜷VTTdt:]QQO$P($l6JQp"PfA+2VTT$H$tH$JbL&8gϞnFfBx<^UU庮ER3X&b;ӷow]5LMR|kt~|=zHRږp88N:bl(9cu]WUrbСCU(PHBJYYYn"D"p8LZp<WN]~o:3LFX,NըBV#LDT\J)+**ܬH%:&R AU|M>B&Y! T _UYPx+3` sxPΓ<͋VF5̈ˢ,YH/f:!^`!D*-D^㉐/~9 JO)Wmmm<IaeA1sT)/"cvzIȀ1R1ƀqeEXXpe/Lje`Gbicdɒ~N?~|=&NERt: tuuuP(Lbu;w ts8j8fBT*ftZ1t:F18bDzEe2#LVUUiLw4L7`XUUL R}Yt?qu]ݻw2eJSS 9hTDP7xw~m}r2o[)e&mJjjjihhy(BTWW !9:uR8***q%KmjiiiwUcu]uJ f:R*]QQŔ8R,:vtb1TP%|~|Q`smW?18tXp\C#Vh w1  0FȀ#!!c#@ H Pi Ȃ[BE?+8-[XXXhXؒ%KcM7T;<È4UUUSN5kVSSlpg;/b<{Gd|e˖m喟}م^f'Lp50>ɓ'_~NR ïګJDÆ ;_~yᇗ,Y2f̘SN:UJ9dȐ?^{ʐ="7rҤIHd>!6liӦ)Kϟ/VVJ zٿ%KhM?'O:;oذa~_~駟Nӛl 'ХKK.}YCC.rGpg͚c)-ܒH$.N8aРAO=̙3ƍ6lزenƍ6hgumֻwUm?nv~xUUU6}> 6 *sj(mV; !$c|^$/9ZLcT݆F- H JhBɋd(G&Ix$mshȐDKщE@$ɏ᥄.2=/z2\Uy |"tX4OX(F7|>Xowޚ+*9s7N7oޤI<̫zCx`7+.-cM=-˖-_2nܸx1??wW_p©S^s5;vѣ_%Kx y Tyhsh4ZWW8kc}ilKKʮJt]Bl6|7{p8Bŋϙ3gϞqn!":s 7ti„ rW\{7`…9{''x[{ꫯv媫r;2dȫxksι2Jm\s"L:K/ Bc;CJ9mڴT*k555]y啣Gnjjjmm5Jk?^X E~)u2E3ɧDեੱTz<oΩ1}x*~v9}:koʶYXXXX~\w}G1gsN}C#!f<ȓt{”09v*/Wy{~+gϞ#F(TqDs=#"/xkkk7t˗WVVa6lnݺ͟??J)G}衇:Rgg}***z馛~B~wVht]wD"q.]F '|F?w߽nӧOUUI@mڼ61,bٳo_Ku`ȨD66AdA9h\_H(Î<H4Ni{~="߮p-yjaaaNBϟBBF5]Imnwޟ)=Cی+{XeO}_|9w»vM^9:WGxʊ62W@ [6:LkJBDžǏ?{w !cTjٲe3g|cV[md1B!E竊*$˗Bq+**.O=sΝ;N/I&=S[n{ٵkע})uD7ӊ!SO=O|{qi9Buug}8N2tG5N:?cSN{uIJή<j$飌Q*f='|^ӧ!(e*mҥ=Pss, :tM6ѝUCZR__hѢs9' )d2Y__F!nϞe/vNY5jܯϺ}w`K.{wj} w吏ڹg~:nk]tY3iNj~wygFBEmg~lxxǞ~6aߍȤS󟢑糓֥g>"PP;E*$bG~s.2N"9sޤ&HÈ./1,,,,,:?A:9ݺvm]Wǝ~V68gjՇ~+N?u7ԫWO8!h3CnڷzhСKml}<&sQ$ɕ@Cti[XXXx0Ic(;G5x`R*n >g:sOU[R)̀՜sM:ԜuY{Vk+++/L&s}}V'ɊK.$Ho?]E $!0cDs~Ǧ!C0vyoFV҄~{챷r[oݫW/ej2w}mywԘ 0fue3\z=zxΝT +vy6M&gyg}cz;h"}uujjj?9NP[[lٲݻ35/|BڴV3bȦo2xigs_8?;+ũ9?<ٟ+]NS;z_v= kG{_vTs޹gQk{{{_ǏY~2O?6|GK.Y#L._1vwǹO?z{}0ӷO];.Dx';":pC dt:8-Ǜ 3d3ga8"Vq=7bN$\+./M<5'0̝}7޵0`o:.HÀsGe`O>4\uŕ!DreyC7tM^QXoȠ8uH$ЃacccHD555P ],,,~[5kV&b-*d2+Sl6RT*UWW纮vUy[ZZ***Duu >s9_}4D"555D"WUU)[x< ZZZv/M$H$JEQV!UdR TYY>ϝ;_~f Ϊr***U1d2YWWةS'e =NWTTdYD\UleeeSSS,7U*p8\__ߥKT*U[[N5WwAQp8,t,kmmVOOR*Y6U#;&=H)a0㖅E O>:ɸ_?i /pڙNy;!ak"w{@ W^~X1v޼%K9-S_YodȒT,U)PÏƟ~l6˼T>y: GZ)`Ǭ"(ͱXu]82"i~sS:JUWW; El6f]U1T`M2U9*?a3 HZєHRxEʹWknU&*EST8v]7HhD٬礒o)UU`,?Y&QdU㜧iEkUD"8Nuu*M ȭXt$BB!{LG ÙLF5*b>rΫUuPu_ AT ޶ZCLa 1@s/@J&\0D@Ipze M 瞟~y>묆H3"|gtyc8C桊LSSs!omn$&ҡpw; vҿ&;KHH>xgeg/O(M/`@P(e?`?hɴ߷ݶj0RR^)mߤ|sg`d$K3o;d2bJJwu%B .[No>*#oo嗷bT:NgfϚMDK,Yocf EVwunڧO;Ǐ!bd^/܄!f mAt(K9Kז(`ȢŠ3X.ʤ+t|D6X T4?6lXBoʂz9g5ɷF/UF${% DH2&IJI:P:rB,ziϗRp%q$D 1~'xg;08)H̍, $ ZXXXXG<ҧI"TzUх;$UGAJBD43=Hc!#$c#`sMYXX_(DZ43 = l ly;`*-ߪڡhUxTwnwugdD` sf˪H"r ''\"W_% ͙UW]O-e+/w#DD bU>Gr7#꫒)7% %Q8YbTZAF:*|19GI 1`ԍt^JHT#0֙ $kz -,,,V+ -m/WL3fuD=_t:⢗X|Vfp2,m>&xUa2!nrDҒC,ЈD~F7oR!bzÏ"`t$92 Hkk~PP#p#C0*[XXX)4VLZ$"IR_"B"C˕Z!h mTNfj,5B`TFbZz4R_x0ܥ tͬw\~(Vf(E(zr1G KK͆_i;)I@D bxܒXV3 =,HgD*C$ ]j*usl1_}zZ( )B^yXR[Xd\Ufa0fcr+ovkz-,,,Vtve3(WQqm-sfKOPK6J][fP= =/VJ^HE !ϟyo{F튊 NZe-ӵb1@[*3.<,ϝP"Њu($ds&yvx~_68ϱXLYLO2&*[XXX0ݵѨsdYE\btd rԜ81TGo $$1$Dθ{*3P)hUXe;Ec/=][mwkyB řWlvU7"E8?PryP$d~n% +] Z{3/ _[K-,,,Ve^ܯvi9T{Z,%Y&ĉƢ@F&OoMYqX$Qee9cIJ.uCB=XSY%Q_Ujlt~.3==*z n4u V ?#bD9V .5*n ̺VyĢVc? ˥-,,,ʣ,RpΡ>`v-b s.k檨/XlaaAzRQLM]!e-3r-t( [^`Fq߷Ms=2 szT8hEsPJ!YĐ^b{\rN^@'nφwY;v O (~-W6imXj"qt5=dn G#;|ڱo'/ky7c+Iӻ"6e+܅R̀~ %sa:lP&6-fPsVjYXXXXQQŗZ\-\-gX`[4^-0ߎHR2D˛Ci@T+vTJos@мo4|-b{SHEebyQQ¿x^ͺsj"򅲰Lb=GmP5ԖI˲̏;Fȁ_ 0n3%lq PTi|;=_ H+>^=aE2ClGD$'wzDRUUDdsssΝ$I*T_XPLoPYcA@Q&:N UûLc:u@*jO*BG_Xr8/coL˫²)qHO$Ss_P~mhX&(##¾W?亯B "0_i& 0J##TUU=_~o{"  Z21 -Iy2TX31uq0͹@ MbWsQFas] Tد-[6sp($SDž<stEELF2lUUcUJ*+5eOe+2pKIB՗Dϋwm*R^s|z\gYUQ6T*%Tzx" /_N(n5B5tnf6N]\H$BP*fXld!a.T'J>- ϋx=XuMŚnKVXT;TxѺ,Xfl&QL&M\xۀN 9laaa~Iͪ0+b6rȮ]:4Hxw42~d2~q8C9^"H33Ti V_ t DDQ׌XzY) $K <ɜyx?~oID͟|LFaR^h jř~mqRTEE?>餓MV]]H$bؤI~a]R M*_=BSnd\n(,,,,,,"z7/?a„t& J;r}S16[lY-,,,:#7L3kfD(9T֊͛7Ot/'~D"4R8a4I$P(&*DJch:fUW0TRlΝh4"0Ri0p]n u]X>}[Df ,5k< -XO>DF8dR'P(Np6U~x"J)=Jk) 1!UUUjG"l6ȹR+ y.`U-̥p -WbzD<7p <#˗/O>w-0`GO$!gGVlaaaa"W͕X[[+hmmduuuRU0XfQ_;p衇B6ls?3H$| A8i3=yԑ=رǎ3f/\SS-:1cFO~ar,MR}wI'm\pAKKNgçNqǍo}~X4J8!$H)۷y`޼yl/"?~޽ N^x%\@MMK/t5לvi&MB>~{饗nFG}4|ڴir8}}9NpN:&Lsimm2e߯h9uʋ-,,,,,#YJy{{'xr޼y}=bXMu5Ck6XXXXcqMx㍫wޑR܁ 4:ٳ 8l6{ر_|rνG{玃c=zw}D˟xnXxq*ӟtGm݅^(D9su]r˽[o͘1C'Ծ$T0%M7t…D4gΜA 8pܹ~-HRp~ˎ?':_N>.k>㯿zȑG}t~Zq~_|W^?;PH!Lq_W_}UYY J$xw-Z2xTݺu;x_\UUJS[n?eƘrZnmm>}￯Xfm8NΝŋp W]u… w~\"X99Kal U3y\)pɧ\`m woyN:3AY! Iqf*ogaaaBqfc=k秜 D*NWnٳgᄀP(?|?*e``9sʫ={Bݻ~ׯ_7/~ǓN:v]Wqf`K.r {ッguGq-ܲ0s>z1cƨHo߾n=Bl0cƌbT*ϫW|z[laaaaa:4xww}׷O?^H裏.Z?O;=H&EV5! 5Bd}|?S_2=zO>dɒe˖=8[V4/;7pC:qyĈK.}y+bni,#Ds=}ŋRɓ'S_LƚP/rr6`o~3p@Dt]w7㏷bԪ9ϟ?/ *W"PgΝ;oW3 "Ԁ﷬n/X H8[{-"^{O?4ho[~B{FyE>OG-,,,,,,ڏ iǾ_o~i2N>=/]ORz&R6)RS-"jd,{oS!b=?Wo z:g :,vgp$|"R:#駣>Z1f#wL^{mvݵ 2[naSiHnz%.YdǑ#c5/"b3<3|fmKqcs5Ri̙s9lfÇt^zwމnŋox<>dȐvۭsʥw_}}[n;A1 DD[mO?=`uǁUL qSc?Los뽅E)eZ7*O608?}7ݛ|74"\U:č]-,,~[5k֦nR&\uD\třtW^s$SjCc ?7bѦX,N;ujljd2;unnifUWU[_]]Dž!'FjkjD4mmmUzh4\hmmU9---ՉD" !jjjD:R zٱ֪XOʭa:ƢRJTYU82(+++3L:bD"WWW]h4L&"H477WTTHJwUe9<Bx< Bf2hv$Q`1 1U̷/!J˝R+ 2 2 WWVUj4t,#DRo(|ΌU3[XXO(řkzs=ŗ_n?|+\lq0V#""SfΌ]^*gq&%IeȄBHB̰ͭddX"c1d1()}`4y!cs.R g1]ITjAԯjh&T>KYM)l*;%e ԄyezT"keBe~Y9O myak֋#+IzX-D$c RJ)U~䨨$I)s|BvE"rγl_jn#:b6bipH|s y)"0?9YE\ *4d Q~ZQwomm= xFE!S xDdj˻tH)91f*~q,sN!mKk]~(ŜRP pc&1Y.PV.=.]bǗB#'9)Lc r "")%c1Fy|FR2`1Ol|0]3ȼyUĢ2ڡb}8[ "d'<C 3@ĐpƑ)9,xhC9(>ȳڈƺzgJ_؝Z76 "Z72T S)˝zιpE$q8.Mq31mm!SFoέ˖ik^Rʅ}׷O_Msj|ML!W֚c+ä\rJj mQe^^Nf2@9șd;7vBN|%߰Uvh9xO f: 7od )LW0'w$A.xE‹(ds&Cl]#IT%JSV4c.7qm:6l낅_ڊRJI$\ 9"+a4d2&R1,,,,pNƙ=,:o+sQ<5z"˥oT-^!Jnd3 $qΕ&$0_Cna0sX|IAS-E nԼ"h(5>%9TšA)tl;ʣ@] eXpyKʗ9w2d2LEe73TdRR. ǍJ%Xse=bNeN|5$! od_uk__ ~j<ɼǐs\˒y;w RJk/w7Κ^{^1ΘhXadUAw?$ 1}$H1'5L 9FtCXLZzi5XAC É<ː !Lyiiiጧ3銊 lmw}#ሎcg s~7C`B+Sf $A/0ogXrx$t]7 3Ƅ$ix/BGqzkkjyaYI/G=!E/NnQL{rPT&>e,ڗ\YJZPu%D9stQeUg۴_f9(|g:s̊ʊ8t] 9baaa~MJkkk$!CyQ>PGӧMxaϿ6w}1;b{|*ݧ=q[lѫW/܏iȐj !pFSZW603fQ9oJbX6bx*b%H, 8s*T`$h2'O,L$}ٳgMu_|QP{}0ビO9W^s`099M{l& qsc-Xk h$DJyEyԑ+D:}Ph#f hoL~4 !PiI2R W0Μ\YY tq9ݚbߵQOӧGl6;`@qeH&q =6kccv!!s߭9ۿxW_U!(>ɖ[mU]]=ҽn]{}=C #HT8q;tT׭[714CI`%6y̹XlĉBat'p 'P#.$I3hpDmW_=ʥꤓN0`@8}>4i<z[oi[!! JYO(&?vXu?c=6&Iq#G['( ;!O>e]U8~5T 2yݽ$83NqɏBs}mV[m5vX]kyY9x|&9?Snmچ x:y7Y R)SL& jjk  L&F(ʫmpXXXXX /3Qmm/4w<: i?Dc{ro GH }n:؁Ovĉ~DPYYٿv>x饗E.z.d2sرo'|3ϸ;h'xb4:oj'trF+@mtQFM0U ^EEŨQZ[[?ýqg ^t_/-_|ʔ)555[negϞѮ:dȐmv̙d7ӧpFDLe/!c(O,dȑlqd":H$?Y`eʔ_~^ܹs:F ӦMSQŗY^R)[`&MRg}'Onll;cB~;͛Df̘cw}o*$b}~l駟~n 2cƌ<ۖSOuo1bĄ zd2g :1Λ7ꫯ>Sg3Y%3J}y?'\l9f@J٣G#FDQB1G C-OJ***jnݻ)3ݻ2q;;8qfE0te]7٤wmm݁gH$ңGNjkve>\uk͏=B= sDRnDTQQvۙcѡC/BR677777WVV*\<wGj;`R2~Yh4lVQb)a 2䠃ѣy'裏~38㨣zgiԨQGVf_K-1ZUU[{uuuxc3f |v[xq2nf͚NA) ѣv@M79sd2rXCcc]]7ݴFt kjjvqǺD"QWW;؇bE#jzI$Vu+ԪfH8H$C)eEE^ӭ¢8L#Dk#UB vywfhtȐ!P(*tA*_Dx!ok۞|I9_(]4B>hFo<RDիl`t zf !z~i…W_siDliiimm/;gϞ ?6l#\| N9唋/oIp$lć馛f|뺦R}#^YY?遴Xq"nyi̙SLr{.[L-?̙3D(za |IsK^[?Eqy1FmفF!OK)G8po/~{ʪT*u) ,8qb,A[ ҬmV=)1溂[ZZB!O:ur]7& !DUUҥK+ GV6lD"n FX}Ȑ!sy׫͛xG6SNx>pG;߿2Xn+\gfPPC;%LR&Mbd2+lu&O?-Zhĉ|O~t2eʔ: R~Z|p8km6kz%⍇~8c,J)-􊕬rKzBK.?~;g2z7Pn{ïLP|s0dJtquM6sL4,L(}'|6ۜqtf͚5iҤ>@|zώ3|ǎH$ kTo+}}ݷqt:3}~SNuO5cݫFqXX1zx@}Vb Hڌ18L:s3i8sp9nDb% ӧn6}'` ~].\PҧOUډ'מ|M7TYY9`>X&N8!C~kzt-po6?x"裏f̘H$"8qӧ| 6_<c=Yx뭷N:$9J 6矟3g /c%L>}7omm=znq=[pg8qUW]EDj^ @<{l.{^0AmMm>}38bѩGPHk"H&qGe@Q'"Ba6l~],p$)wep(/t7_FST*EF9rn2%b Z+IE)pȑ;IDRvQ_J&ápMugt}t:CG)y:&%emYU9r@jR e36d/xٲe}sss(rw޽{&#ZWDIDҢѨ.A2L,c׏nK/tĈD⮻F[lE$R7BkE4uv3. ?Br-WzudDtGoѠrs1 p ?򥔑Ho߾L 8#8B6p7qӑX?f\TnIW/Z ujR4TȂ_U<Fֻw/"N#؁C U Z-X'Vz?I/2 N:TRb%6l馛~s6h6lذa:ujk'hnJ+fZrnVSs^uU 1TÀDqx4Ƣݻw==ls?;5$Ha@k]p׷o_8@кvXQQQYYp*Of[*eҟICY)h֮2tnc; BH)8R R~sD1us>vPw nmfv*Ҭwy)\]TڢP 菦XWY@Xn4)Ǡ"Ж\' ]MRtz P_F_B%nT蟄|\X\hyо9 JT~v`evŪ+SK{FuNܗvT4Bn_,_,DDT3NsPfV|YIH*@'VlgaaìY6tSmK됵5&C.TSK] /4JR*OKH$ʘL-EF~<.ӌSj.U`{*jRQM x"IcR`!icHxt[[[J)kjj:RϪ}G'8#ú"*h_/z0*zy}.O j <X++3BĖc!j3bdrݼ$99_E" @EbOG,嗙V,ْ2 P@VjigvA/`rWUXW`˴=4Ѯp{VN\j9/S\UUU @jDlZ2dR ⾮[XXX(\&Muh C`X*\>N`ծPb1݉*h}I)PTJ!tܥ6: /-*z~ᖴC{ͨk+Ty@$JP(N Ds@3g$@3P=DAcWmDbBMDQP/Tl]3&G07lE`oWe*W*w~ gzuYZQP5*Rw`- zonةf02Ii^t7g+*To<3k79i-Q\ 5Wt2ŒZ1$evaIP!#œAI CBA.VH/)PoRd D!_O!rHP%a+6R(~b"ؙ-v꿮G]{t!z^5Qk>IR QaaF A0p9p%EHB !DaaF,ca JH gLkB\ #I@L 8ci$%ADBAV"c$LldAH&E ^fDȉd$"z9$(':04EG`|JVȓKI%skFD*o~LOƘ8*égK4`ʉ*裦aIܼWͅLmQq]{^[Z=E^Tiʬ8CMACT@bU{އ5= 0eflد5=@PTTҡA˗{\9@,X@uf萡~XXXXP+B%*(kRi3pD Zq+H WJT9]%km 6`Q)ccW 1@ }#!ҵz:Uա)fyn6I'3}A?W{mR14JsfgA5KRJ)%BH@bTA2-^}*$DjI)\Á0$RH2.$H̥$ $I+& A )WA!H.oPÑ#I=B@) ID27~I !}g+CkR0H#aNn`p2DTa (ti擦iC3gaKߢ391s#-MlÔTwt!ffֽ"X_ECr\kQ5DuGŜvL"5\kr~)S?!E0ՠ#X_̾Y'kP{-.k٬ny0!sJ z9 BӧOjKdaaa[K,IRBXt} в7Z5nF@{XLEy`sȪ!\kk^.0@;5_s3W󸾶APU|@P(T D"r8 HĴ'0_IĈIb#A "AA"ޗ=9G,}ensnnI ;U֧G.4gB@<\M WB#j'șy~# ,PDAƑ \@ȸd\2̺:81 $LOv 9̑%EqdɑqN$%I1DHC` !pIRDI(GJePŶ!DDL1:K$CnJTH")> HDs< A F(%cqHJb!@Ȁq"B"FD@{@ ?"II$!"om_?~aUuq;_{5>{ʼnDb޼y]vO<ɓt:Vnd2D[oug?#> >l)wQ2:NyHg__xIt2&m?i Y""N:In_7mS_љ}k?ẇ/:7%ڵ/Z謳R 3f?~<L6;O<{L<}j |߮K./ˊ`HdwS; {ZBX7BO&")eSSرc/?\o}|㡇z9L_|Uguŋ .`ϞRYڳO9Dرh)ehܹE_ 5|ǾY_VLGwv#hu,m(^HJ$e֕%ʨ? ASMDxwom2}م-]>=2􋛖RH"DY͟nC|oaswK$N5i"Sן}fɴs/:{Mnߓ>>_|sɇ?C$ A2%?8yܲuS\LD^oṗyKN]:w|Ko{nk=s[tK{w/g㣨ϝٖF:Bw*TD}ĆAE@ 4"bE,J)JeK=ww2[<{~wgrttO>dɒ%sYxbA_|q͚5?(Nrɍ7Ux… W\)--5 6 Nj2^}UD˛6mږ-[>쳝;w>Sꩧb{W_}߳:e.ayyO?m6ŋsrrZ (xoߞͺeֽ>!v3f(.\3gW^yE9W>}_0iiioj$g9|X|VVV۟駍7VUUK̙l٢<[333mbk }Q̺@)JZh``4Fh0 * !E:+aS^1s2AzN:RByqtڵPR͜9) 6l0eʔ穧 !?yM>N:uڵ=zHNN~75͉'FgϮY9;DEEqڵkW[[{x@hRBCC7mk׮bL>ر={,))1 SJjY1ٳ}J&g5Mrr wnjӡC'O;+Wlٲ%Igdd))))O<C>6M-ZHtپ}@hh￟rСyw322uV7Zjj#CBBv (Ν4i(V0>>cYLe!<8D1#\:$8s=nmC(i3[:]5Z"3;% С' j\1fHcbb)((xu:ʕ+>===11QV3^x?5kV6m~ᇊ 歗ps@@@85 4cLH<4n'; 9--sl999LĈg̘1Zca^z5>>5MJJJ=gff:PjuZZ]wh4 ТE Bȹsz!G҃R.jA9qamTR<[{kBH)'Ȁ-QHGO& R(hcBysvbzіGvcɈ5K@(J@C$"8)wuJ9W_oʰ-5NdvkMu[& M'>FHp"|EӶKklʥ[Ak x /^7=`[$WH8(\Lgg|RVs x#&/n\yPŷP}LD~T[Nx=짹r{' +SrR9`pG;boiLg>b6@ fE`NjEd0E +#$Iݻwg;w>s[޷o_II ;;~ԃ^pW^糳۴i#… :uld2mڴ駟cСl 0@$%%LJ˗~zfffefښݱcGϝ;7ydJj-**b{DQTnuklNQۗƍСCVVʕ+|gee5 RRRnF{w#KڶmhxpB޽Qa(ٯ_?yI@VVVnFVewqZkyȂ  ͛@AAAll,"}R$^ߴiSFfUV0 |Ux$G_e |b v~t@jr һwo6/?ӧ+**SSS޽{GDDVٽE$&&;wwUT<ϫ3fl۶ȑ#ؾ}_~9;;ZrJz>wy˩S&MhdW=>TӽK>y虉.DQ8^Oܓ  !Aizݠ-ԩ|qazNNNDDDTTTdddDDӧn3ݻwbbbΝjl=zL2%22M6ym{aaa ? ]v8nC a^ "ٳcǎڦM={;66qǎݻ70M839~/A>}ׯgϞҐ:h &%% 2=//k׮,b6mڨT*Wq.]FV+oGaiegKR1PӅ2f022|vڱy9r!CAqq1 #h7oӾ}(ǻ(+'+~gg"%pa]gG6%GU*P"ӓj:pܦu}D9꠶{ :C5kӧ9.i:TRxѸ~v3F!&k.$J.Zt g-^l뫯뮻xw8/_ܹ3q,jՊ]h4$Gi!6-==[nl^p!11Qx322xw]eC{;ڪ-*s}58$cmFAHDN$ WFtnWbR*=sk@o:q6(^z㍊fnvz CL%/\!p8 -֯?ѽOBZPWYʭ՟lk1shN!W_*U̹8MvsᅅoĽF)yty)Ӆd huv -iԲ_/$!u¦XndSurB8'mtV/=:Vn݂JQy +%\9TnR9Fש#7*3C˭[v:$nj Ys^a[,ƭ+ IyoƓn$BIR 7n,?FѦM/{l2dȐ!C8cŋqqqR KOO۷wݻwiӦSNr8]vm֬!$++W^՚V+\z]rt!#r8KKh޽ׯ|2~tE'\+יjνBDZcǎ`̧ngN<ɆS^^$VС;F333 [,$zqqq۷o֬[(YYYǽor mۖZVK5kPRR¸k / L&Е+W-[f4嬐;w\felٲtю;z1# o7QA7n\ZZ``?u]/޲e{[opܹSVaÆ=||^y啹sZjСve˖-Znݚ5k^~eܹZZNLL\z5YVQnZR1cvO6oܿvӐ}Vz"cy-!A!뒲+ЦN:x`o*Bӧ.7tȑ{.66vܸqCرh3gΰaݻqƸٳgGDDĉ5FYnZn۶ǟ}Yp8r <#?۴i3`D9s棏>W[[{w<ΝKNN߿?paÆ<~o&$$ڷow5]vկJO:5h HNN裏0;tlٲϙ3gرʱ˸ADf׭[(;;w~G;O?o߾d„ 5Q СC$#+,,I&K.4LL=gΜ͛p֬Yr:wuVN`cǮ^СC#44_[neٲe͚53Cep8˥Kę'(P~xehRwtգRqDE/ڱs936A߷OZjtm!6\_eZv-%Դ?k޼vѨ|HCBBz?._\Ն0mvڵ-ZjM4b Zv޼y7ԩW_}u־}{߿ŋt+&?pvK}c<9tw=3CD% iD>}7a4ݻlHt:QϜ9sJպdɒѣG5jҤIׯ?sL- !%%%1+V=.\`W=f/,Zўl>nz& SH\"Rm}4| ^[Ӽ->@v2W{T{oJbO_k?}O DbWz/2l:]3tI3 j_}-"OQ]ӕM|(5Q;h U{T&͈JCeM$6n6'ISB~%b"&w;|^4GP# t_.N^z>J[頏HT/U7(B ݞ3VwLy .(cmv>'*?}7~{6Igg Um#T :CP D7o޲dwu&ܴioFEE%$$|ΝTT=zs2nR:k,Az޽۪U <^ZZ2? 6j۴isĉu1`߾}<`Ng.\s(%%%L>V-[t:7n۷j:uСCoJ2dȲe˚6mZ[[.;wLHHC_vb']D믿~: &hm۶5ogϞ111kٲeii1cLff&X(7nʕ/&w?ϟϰh"09s_]dk˗۷oώ|ۗ*B\\ NHHطo߱cEEEBju֭{=zR9rda9rرI&ݻ۾}Ù.7ʕ+/$oy' CF~JӦ%9GDg @=Jy=3 L6A<2t|lVkhh̙3hn\\"'|F_S]S]qA !"|c](:- ) 3!AZQQQXX|[$zn/--c-"(O?}v{II$I_HBD2;rͬWVFEVy(=wرce7rAfUVVz&.yAz<"JYYödbvU|,ϣ܄G$IbxcM(@y){}GNMMhN9 Z)((2d|ߔ9'OyVQRc+np}^oz`2L&Smmd4F_8FZo!AO^zA?~E}Vn0Tvy!+B_gh4j+WTzU)K,w#,2&jl{g{g?~QQ+ljO:uH@pӓ _/ Jl(kq"w""E*s@oHr@ 0u p H9Tsr&$!#r*xV ҖO?y8tX;u 'QҪ<9*{;] o1J AЁcgZ!JZyӦMc8Ef+WAA2=( f[w,̋/(z|.+5Φ\6pD;PxЩI uA@NL_~6=y\"O@ *ACJ6d3.Әr]xxz>WJDEeOGIgw)#$+kV8" aX;B8\-qWer:D$Il٥G7vo$֬Y3u1ct=wJzV[3ZvB!OgO܂k(߁QtM4 &csZksJR7԰}&3!A<3^MǹKn<˙噕>}ʕ+zҥ9&|GJnD {zЃqm ,8>i)(SĭBW$B" p ,D DXfBKH("FD!283%$8@@(G81G%v({,O@"(X6V˹}Q?9i'=e"uЉ nRkz1FJ'Op*5~ jZV(ABk'yby ׿jLJ||`WM&<* @2ax,r}aM.Y6<.54}MxZY%_GTk܃& .xX[͍iޛBM9dUzAFå >F1s͛gW==g9rx3rD-eGJP陑 !A<nT_Sm]U%ѿ5 D[_&{1عk#^<@}GI3+u 3GorYx?f=/-t#{3Cuc@@@JRW[4fy4gP&,7$I9χZyQ;e$IxSOmҼQJ?.+{08^$?t+(k~]0lx`50! QBQ*eߊ9$ lLAD%k*Y+~=ҪT*x]i(8"!H5Ttj ԉ17!@ '(0Rvɣ D c|ب #Tr GUtPf]*8pH6g2eSO@$.]+ gX%b:\ED`?3 '*"HH7LTWtzIpn'$zi8ozQR~]}E oD( 8I9f7B)"ؔeʵ!=MRͦ*XVLzi؂$^f?diŲsν{I۶m;ubT*Uee?se˗/+/p'x_dl6_tmQz\xfduXS-€#^֞9s&0V=~R҈N$""P dƎQ ح% ZX"(c-0/(^믿꽗 pZF >fd+c(ljp>D(4*RE%)+ԃmFv,K (D MPQtI 킵VK(%7nbaCE%!$F4TºHNH"d1@EI_c.]j0K%w`%V̵H,"(R]=1,_ϟ?o߾dQٚRy+J݌ڟp%IrrY$-g.)EA(:.R@J!IAY>נϵǯ>߽$Avv'''! $dff&%%UWW{p}@ċ/>|d2]G뭜#JV3f d29PI19rdFFFmmm}3yfOͱk&0j 7}5nS{~bY`AϞ="whJoOq~l624ɓ?bĈ#G5j9/g}O>dvv6uo)ð'%I:C0$RJv{XX_|QQQ̇rgvwDiQ[ہP'Ty@8RgH#Hx QVu{{iMA@K.0@ZqaK<=z`֥< ;C@-rsػ&ޟ7jk;p3  HP&ǟ}cLG~OSB * 8˘s(<8S&k8t%Gpۧؔ;GO rV!oᢴGHv sS dNo;I~999<+ryd"a42Arr)S^z'x_?d]"_ٴZ+TTAPR;q{IOOÅ zg}vڴi?c fV˫Tȹ~Had$j-KK[y:zfQ'&är3vޱ=^WxǮ-";w h4IGxx}>Z_먡!ϣFbxFq .LIIO8oYnݼy󊊊pܹW^YlpZQQaÆ9s,\Ν{UAݻi&y.=Unn_~n ҥKzz|QIXP"@3 q%B \(׆ )?x̙ΎWT BmmPUUURRQFz^{(vJiuu LCb2ӏ;?_K ΋XYY)e8J%eee{޽{ĉfjݺpر'OVk ,Xtƍ_~۶m]tFQ)u2/IRuun%AVGVY(puM(¥X?t (X%ZYc2[,]/x 9^&͝av]bf96_=zPRR"IRZZfcbq\mm^BG9sYXl2ubksp F J@«u3{/Dl~`G'J(gFD(Hȉ쟥nOdznBzռFn? -G!J ԩATDqG˿Ϧع$J J9z}nۺ}ߘ>aP佚gO˾Ky,=u뫞{7J9rcVf@?mh<.Q}3I<"MQv{bbӊh*++vr0 FΟ?!SKJJʔ)SO?>;T*7XIޢ(MII`2l6A8uTӦMv;㱻u't+Vl޼9<<v8ŋs̙7ӣ)R 'c&;x@_*(RC,RB{ZO\;vgP(ت4 EpN:oߥ͑uk`0(O@Il6bwa>@(VZ1#DDDh~u0lذo=$$2:0tȅ :`08LHH5k֠A{˗+ń?xРA… kD6mںu.\p\)ٳgZZW{e=j111gϞeTVVVUURy H\4V!AB ˍl.((Xzӻt"`^WYY3227nܸo߾M^t \hbaDwv8'O裏juQQђ%KFp8&O*dT*ϟVsss=J9}uZmffG}4xӧO80$$D(cƌٵkWxxxhh?=O?ݵkWLL̅ o}G۷nٲ;F3~0fXRRRfΜ'Oܷo_~~MT*ӢV1o&{ŋ#GݼysN l6۪UΟ?ԩg}VR[BBBVV֧~ڶmۼ{_~N?Һv횒2vءC~gb̘1'N4ͧO?YvzbZ׭[ץk׉n8p/[L;cwwմgsG7U%F!g_$z[zDe7Ca%}v9.'Ie_MC\~lbHdZg͚GbbbJKK'Lpm8q]tIJJ;vsssnںu˜_~1))飏>裏Z "PcFtLWz?Zξ=0G뢛ƢӦ!E"-GNx,"6ЁZUiz>_xVD0ő(YYY}YDDDqqŋ۴iq\~~ڵkw^\\\RRrJ:^z1aʡCۧZx뭷!+W5jԩSٺ޵kh4LC{Z-ڵK.pnѪzJMrNszKtEW6nT]Ȼt?{czҘ*L{Dmju檋W7mu䰑}b/jwWpSnuhBAZSSi|6].`.Iݻ1B*0bC"&gWG63 '! ~bٻCIj .2 @$P"o3m"JдqZRu(̚H+S;tit#8uW\wmn H/5{Q@&9];dPZS^M*J-"B.j W_8vbS fZ%QVyNޔ'ZpAw >v :Tw(YYYgϖnڴ(444??ѢEmڴQ}ݹs""".]GYn^Z%KpҥS*Y+W1b/LGy|۶m$M;0 .۷o~~~YYoݴiݻw}駢(꫌M&SUUUll,䰰O?ҥKUV;wfr[+xbF "KlާhR؝:TMSz>8cm(KuQAfrRSSwѮ]K.=S={l8z(q!!! , رsÇGę3gaaa3f5*;;|Μ9]tIIIOڶm[\\*,//O$I*//3f̝w$I?cjjҥKտ Svn]v…ԩS(B JV\\ܻw{x`hhk:sA***'/^Z>`ƍm6Fɉcj߸q+4i´1$ «dQ\pq} u]***>?44t֭'OT*UjjZ:ujXX(:N 47i aWlPzBDƦ"cevH/..y͆!}K5!窴ЮR`i>Pk2F`.-.^آE &.a0upV駟?>66ԩSo6̝;>kݺرc6h/]<ȑ#GѲeR:j*Ųrgy&!!lժU{oJJF:uV7olnҤwСٳg+y={w^o'xbʔ)XNNΑG/^,"㢝h`XH8[4 N@nnig)~wA 1aÆ˗Ā+کSyZ=gΜ޽{77oxK.ӧK$bFFƏ?f͚ VZ3Ǘ\r„ R㏘IEwߘ}7ooUWWN 8mDZR :JP>:;v8m۶{ҥj:%%e̘1**))xAT*UMMdfvS(Κ5h<+/Ŏ ;w۷CJHHҥKƍܹs5MFFFǎcxǎ]v7ns {n:uJ'O={yk׮ &4nܘY1;grIPU gtlk;y"q*V@\ѧ󎐎rQEu@e%En1j aT3.%IaԴ f3es#@́5_/׾.ҫKv}NM(jٚf:ɔ~ﭿrh}Žk1^A$UI}z5*&=U?;x7)lCDٽ{wp(EرcV'FSQQwmذaEsdUպulP6mZ^^nZ)SRzӧOˁssso6fh]SS˖=X2)IүvZDTT!!!qqqIҥKzFMZN.nJ}3f|ݻw ߎ9cǎG~F_vmnݒϝ;7dv9}]wE)=vتUZV;vl۶mF &N(_Aղe˲>h͛7/**EQVDu]UUUՌuܿػIII^9<Ͽk?L3y{~]wu-))iŊVbP:{15͂ nsrr:vNu֝9s?HJJb~3sw…aÆۗ#"" 77cz]vRM;gu:- M8|pql!1" RvNmt+s\00I)%#A<~bȢ(=[ H2!^4u̓ef<<|FF_EEE=XhhҥK<3ŋ~ٳ[l?zYni\T"x+zFC ^$0]Դn޺ ~~H9쐫2("48V5bZDBfb׸^z+_tK.̩S""_eaD,--beHIIڵkxx8ҥKǏg.2 +n 'seTu˶O$T=G 9p]oԳ;$=94$NpjVo.^gFq %D FkrrƵ&ڽ3p1AtCTU@eK6'.b(),1 <"!@%Wtpk% ,h|9Z4*;.j(*z =CBd}zKc %YY1Cԍ#Z]xI^@tJ-(yDpe qPH{_ffζ5֬YӷoT'|O>ЬYkצ|;ZIZn-+3CJ%^ӦMsss/\`6 $IRnn#oܸq$9sfnr[=6ެ'|9EEE322%Ibx2U %"% JqsQNovڴ?#==}ܹݻwgւ k!\paL99n89 㱇 Ϙo0%g3jIJJJR._ܴiSys=JcC4i҄i`U2t(NɴǏڵqh[=z3gwd^_Mrʕ+U*Ռ3֮]b &Ͽە=,--?g̘!?ٸqcYYN9sfxx$IVzA9ABxV5>>Gach.999M4a%Ϝ93x`DZC aVNիW6m6mڰWwq^OOOǎKHHڵ+WǗ_r$CcEkGյ^X_ӸNkE)EhFs;tC{68>**rl,ؼ6 ze|; !=5i=4<2|cONI6C+ xi6k,: k^oC7:v`#Qm f#-` kz@FQb.nډoihO-*|vmKg2m ձ7+"}7SDy/BbjL'|-Z`橈ؼyqƥ2Q3'VEQx)SoO6k֬/|W62z}MMMV 33[nK4̫V ɉv;ӬZ,N:ԹoloIndF~((#С;μO3h_Fh6/_L1͡/FVsrrs9sjvҥN:#]QQѢE f6RXU2ʽpB 䊢Ym2ѤE144T$ΆPYY){fN;vbhp"":f0sϖ-[6l_|Ō3:wt n`5F?WWW7mƌ3bfM\;If{yb%**Ivؾ ֭cڵkիWv^j2,`ѣm„wyG8(Gt<4B_ e)SR1yٳ#G$\G}bccǍ7tX/6_⪪^~eN8iӦjZVmڴ9qp8 ? /׏h9s?`ZǍ3Ϝ={ܹs}ef|A߾}Zm˖-?qڵ?~1cڷo_]]={֭[?~"3ւ9t@6m/_oKL$\mw}ov||>zIu{aR9we9,944I&%%%˗/oԨ``'Y5k=yfiQFG^v#G$I DQ.}GZk*|̄vC&AW7O' ӓ(E+ݻ?tRfTm۶]f slܸAߺuN?~tttN꫔Pڮ];&XٿVV. WO "[vArq͛C;vt|ѽ,oKA@@)!n>?ެY3A8q7nܶmڴi,¶1{fsIIIUUopBD뮻>mj4]j?… eee/={vtttzzqv{iiitt4[;wdz˺#$ P}R̐s`8y28'md0'nޛоo|EG|= )ɍzu/wJM|]c@9e~j^@}󖟏T CJ#kpU%-\m6nqZ_رekr #J]|^6`FTVw hIˮ݋¬;qh-@mFcR2.t!%U.ޑ凩ݣrT-Ēiuwր4!`Hꚁ;6:aXćKBU?fxhwO=3-I m$)R}-Zq xggegÏ>,!JT9e,cz]9A$$$pWXXlٲN:9fR3/0`17n57odD }*"N0a,#tddK/&Q̼#ѨQΝ;/XiӦe20ynYf5ZbETTTmm-RDIJ:w믿ΠHڤ,"8⋝*2S^_Ν;jDZ5k3oq&MZbERRfkҤ+–_|gJEe˖lݻMӵmOLLdRFӶmۃ_~=z`qDȈ]ح*vie$3y/쫯2L3fOs9ÏTV?SC -}3@oг?g*4AB %%E̶z,s?Y΢P!"-IRqq1ܰJKKB.SPPleY1n:ى}']2Xքa&#bU)GWSSSPPRJV+{K.2y "GYU!))iܸq? KKH1,<f%?C%Z5"zDD fD4cTW%(V[rrر*+DQr=Qh4*םLfI(?vA^|ŚogqDQd8} nSncnC@.]BDQ@# C2Kev#""V% HXy1B-FSu~ѽTu+QDDV_EjgDU D+j*K%H)""J(X,PcsvD$wsCBRi\iD"huXyȂyZфHZGqTᨪv6kC բ!PQ@,MU(٪Q(:;(H(ɄL~7#*J$*'T9FqqǚbOmX$Y,{ʔ)e sAهϷn VJC^aŔ+1 QIDFz` z^o`dZoAF.ᒒve gAjj*أW$  / Jh)c)b֤(eK @R7g'NEn>{d AOo[W._eg ~x\58#;}) SM+"X}ű(nP]W( aNjϟ?zh퓓Yb%*zCf$+[f$"((qf+@$N )s?IDAT9&H}/R" O8ǞKE^"tE%GN$/ 3؜$>0I<c޸d0ӧOgDKv-'_8۲fw묢8NξN:9g:xJ[Ν;uD;LW7Ně|"(A[ɸeu*I<<駟*#ZARjڗ_~{uqpj(_Tns|5VZu#uBB8Ad y !xfPlJNߋo'^>SǛ\Rix h(oBzocu|Dﻥ++H \.).H pNv,AT5, {]^uJXyjNrߋ1;v3F9W&B~y~o xDĪbJպuk!^^EƌO9򢄮`%Rp(׀,0g&csN'z,Gx|nW!vA~3q< P,p KF*Q"NY C  ea}"JeB8b@K@kOdD ,e5ze;G%O 5ﱋzG_U*TGRgkP$ED3l=wڐáE+3P*eyH:<ޒ[7'V+륮rfef' z@wyp+@aEpG.ǵ[cS^?=Z(NH`;[ݪDf5=?GK)}|iӦ,΍7~[Hn r%2.(pq DsWj"STgޫECs\*|T>^W)B*94:}w=!Ww e9;\ixx-d>Ʌן4p^ZYߧ r` 1ACZ J| 53@|!ͥk=OI:07x ˸)#vGUA9A/?۽B !A4|1ݙgI6dw cf7Ә뒪9;a7qE>MV7oiȖ$:ޕK6Į_ 66g3Wt_Ayr\ nC 3uɁ-; jpn큢 NrpHpNCm?y !p۴+9'sM4$:W&t%OL8gaW W]DpJկY<D Y P '!ˣAC:&!xu pE_@}^ЉC<X*:Ct voL*"M;QTz/3p4c]p.:6@)i݊ @ypB7j` -B"p) UF$ r1T܉y/RWugnUar[ i]٢2>P(T\|B|]+L$(Ĭn&.d|+Ahޕ=_$6f䮺MRNdY$HʺeaYON_e<4R'>33PIr&zg^dHGPB]͘:  *"-8rG^,SLo/*r_&f;.WidVm!Q5bݗ/zotುj5Y`<{ඁWI<ΠkUyP|Jm! %?>FoB̛0RA9ABnT-%H<@WP!p=Tʱ? + }oS U6.~ :5{y.Ww\ֳE94!J9=qiK|^˼L#u@G σN9W3rBH.M+QLJ$籔T*nJexCയ'g &DDg1'KY&oϗApH)ƂsL'KRs<$ʬ AKq3Oɠ<3u0J$"3.xgW/C]xQRmmmnn JXȸU|UoUV5//ʻ;6RR!Ro!݊,KRRꑿn^C I@(PM !HSNm"ytQ9r[ŋ&!s?L+YjlE,t0Ҭ#"D2'8Et >A䨣ƀ%`JrAnߩ$00JJ'PV68<jfCH@u3 ,Y3AvfSGP* *@䁪d J(P,jI@%@8?{n$IRJJʯMiI[s1` 3g={p` q@ H?>{X/&lEW^c0233Ϟ=[]] "iVgPRRRRRҷo_yF4͘1cƌ3G-b80om2rȌZeOvO>GɹwXQ@ygB2(:$8{G1ͯz^V++p8$IBf c7@yRzY{l621evN8F3fѣmˡK~.?d}`_]js=//NII qxر e4T!dҥ/SO=5}Yf͘1Rd7$VҺ~M(n $ !$$ퟗ69zZݜ p AI$u::N)Px \=ESA(/^I{PWw >SIGJ>2T"R/̝r}= ʍyuG7Q[70=w5Vplf>@ 6EDxzDDz$B(@2;l6(%2Iyۯ~Gl&|0Tu…/peeMHHHOOL8y !A~@ϟ~zvY.&¹sZnm0.]ӥKF(FI(֝55W !XQQaXv ^/@X$iq%I9cǎ;vÇgmqQJkjjWp8jfeFt.qSڵkҤIgnӦ (cǎbZYY)oƍ[nҥ J- +SiUUUrV,--f)9v36MH;v=/?K. Tȼ3H):< A r)*$-כMV@@ؤHR˪N}:*{їbPΞvAҺw0,Beeh KtyiLS]]f܇Ҝp!'R=ڛfm yvX;2g 4{G_¢2Rx=ѾHZÔ.>A*i6ِ !!!!͛7<%IZf_$f4U0Ph ⏞ޛ Zb=}頡:RVNZJaˆCh1Q+E " (9p u"6kTDsIQ7:~8}Ɇ4O?غCSN* IK?{jfzxN%[iOه}~:`Hha0 T1k@dA OMR=!{~#_@ $44|[qÌh~NՔSO+8~=?k\]n,.~FGOW~5QC&؎xP?A$/Eɶ=ZŮ]ʓN)ZUUU$d{,[QQ!)))SN]~?WʍRJ%J)u82RJ r6MQJnݪVXy戈V?crrr?B#;9Ԩ Q$Nb;=Oj%M\xf`2dickjj<ὥg4R(E ʝߣ@%evłm=!!!ݺuaWT-[ oժWsS 8lذoo}v @ta ]Ξ={ǎKΞ=d֭C y_;wRJOaÆ .9rdƌr=zHIM8WhDĂ~jZjuYfggWVVhq Af6 VZ5}]*B*++7nح[HDܸq}4i{%JdXvN:ꢢE3Fɓ'h2~Ju_=<|JbhݼysN vʕ+SSSO:K ۶mkӦM~~>}:uiii Ν;nzKYYٶmvGYyٸ&MdΝ="~ĝ'7o޺qXօ.}cJ'~Y;u&ooBLw!n[d2hfϞ wSZZz7ɓ ]tIJJۆm۶VZiW^astܹ?pӦZ!ϣP}x3'Z#B-]fǦԤ};KZ1&J" ʌɩ}&-Ɋ;?ݺvadVV#""x㍶m@AAڵkuVRRRZZj*2޽{3?tZV᭷UVz=`0 aÆ}݌'ٵkWzz·F؛5x4T+.qBgZmTׂߩN@U#մ]כ*3W_OӖ2hDT|웯ܚ>Yoxj͙bhP FֻD.hguXQd`ArʐX@0݄kDP# Qf]%o7hҴHQA/HКGT FI/P$47ՉqmLsZ5H3p5I絃4D-b&MQl98 W~"SHJ֝ lBt@AfwO ?Lp@*@y|=EEE!!! ,jvJJJjԨŋ7nf͚RͶj*[o9/>#VVZ5jԨA!={M&ӣ--)O)cƌ;L 7??lŊ͛7ߵkWjjj~~;AxWt:N:t`g]|Y׷l2>>IV+O=Lh, O焌WzL Cx8mTNzۜK>PNa)?'2ه۷n:77gի8pÇ9 ]`!dǎÇ'ٻwm۶ wwT*J?ֻ\<6vA_{衇:ljv ;3gp7d())iժW( )ɉѹQZ~PTTԲeKZm*//ZݱcGhԨQ^^dggۗYuAl믿 zնmv޽O>K.]nR"ٮ];&g !c6ф# A.\7 7>  !7 a7mԷoI&EDDaÆm۶3~Ǭ~IVϟ??u:ݺuTj@ռݻwi ؽ{Z &w^ضm[||o:˗/ߺuk֭ٳk׮}>}ʕ+ӦMc;t:]xxxiii^qܘ1cvy̙{kɓ*ݻp_=+SF_SGuz)Lvf1P@ Tf 7)TvM8ǏtO,;p? ^]v⟲p[l^nGuر7mۖRگ_[oRzɿ{ܸq sΕ1[~O?M\9idspYHye#@;9: u-3*PAաq@ -Z BUak}f|uֳg29--￟IZ-tO>dbb"˗wyG,X`ذa^իWwޝ} KIIovfAPl׮/ ǐȔ|8s6ՀVE]qRi5{SB(mqclt$ocF;RjDq&eTfaxпdh$ЂW- PCQg5]u 91\ ϵŴK^6W0r(6翴׋Sz<:CYUPG}Kі/ZtjM؞mk gRD[ 7޼k  ٺ+f--\$R}h⯾m))Ν-A,xP (P`^ڄK.5o\NʌooߞPpIFTҎΛ7o111cƌak_}Jy~ȑ#FiS^^N)/+?|Uk~鄄ҕ+WN0!;;[L6MR͝;l6#ɓ;vx9sµYކ/&iٲe3f`R!:r[o%"'Ouy.M`QDh7ig gߨ\ ZPw6lX|y-d;SN?~ŊjzΜ9ٽzɹ;!999-Z`+WlnݺM6ddd|V AQWZOǗ;wpwm;G̵Rh  ʗx߿;/BHRR҄ 6P#iӦv]]垃c6ٯ58Z!!!QQQ6M$o293Yg=oܸqQQQ-VU*(!8*5zڴG=(l޺9Ю  !70X$Ngl6,e;ٳgǏ_SS_ϟ?3fȑ#{j*Vv>ힻzԩ 6 rji.;P6lh4YYY[駟lǎ ~ahh7|c322z3g̙ӣGJRv{HHHVm6|c'kٲe&55u̘1*ܹsk׮eڵ+;_kkޕ/XTTfv4ի+_|E߾}u&-i|&McO>=oh4>#!:*4mZQ^nھ)SRkTԩSgNDx pc2ED&… J)ݷoߚ5kbt:ubY׮]'Ri \ G4o넄QFS.KUUŰ';; 84hP߾}wSLaNFh/ANx/^ZE 0`ɒ%3gμ;W Bȵf{˘.//g;b eV#!0%_l>}Q]gnI!!@轈DDQQ"*GT@@QˣPH!u7o17w[߳q)g̜>m۶뮻;yK>:tzaAaJw>%P_wo#<"oee+*[of!ABp_Ct:゙={3x!&Mڵs(v[XX rLM{Av=m۶ر߹s皷X3f꫽{>rH]]]֭=:tPJ`8tе^E+Vpb:uX,EEE7xPYYnݺnM6,vmTkRRRjjjjkky?<|pN(CC(A#S;B @,X0c Jɓ'G}5+##^Xr%gK933{Ul6Kģ:w=|Co ,jefBHNNe]6h J)%4<< nTbL:0qC PK4 \=( 8\?bX0P((.0hI2q>Z5z@2 s*lߑM[JCv@k&vjGP/DBvvCA 83fDDDI@ 6f8!//o<SNNΣ>( =gLUɓ|Veڴi`XjkktcMbcccbb[YYYݺuS&N]Kx >wC?!Xye0̹b$ YQ𮆰p) b21mS#-w`2 `qvp \xJb@Vdlyu*aAD+m7yUo E732kgg| 1"===<<\Q &pj*zR1wIʄvpLa !Onٲb8u?Tjٲedd$|L>>2:(Zc{7tfcƌ9x`޽ ""⧟~:p@ee%~2eʔ}j3DrT>B(+hۊ70!Cfݖs@[n]t)tǎO>,G)..NIIH(--2d}׮]cǎMJJ:u/Op4??ݺuR7j[P{Z[l'b.Φ@9ttb:mIMnNJ^:Jc}/^>Eo:x`lllz}QQQ֭}n`FqƹgGdYm۶7|rF#";v{<^L$?wܙװe˖s2%57h}KMuN `_{"(GeVuoo[4FɬuDW}2c: DY}y5@P)kc΍萊:"NBx+U"XOYIr@P".UgCeg⻴emͭkQNЪ–mAU`_ (8]bXnO?Bf6< p#s |1$E 6{.V."EyYܨQĺy5T fHnzcrF9Dֵ*T o< Bip::h9Sej~Ć : %td=3\s.&(ZRR2|^k`0p &;v,22ﱥ۷m9uСCyztӧ=rFK۵og1[۵kyyy={5444%$$+TQIy2]$fW]v_N矿!3M~&w?w{Ϟ%Kx].Wll!CVSZb'|2zhNWXXu񌌌sر#WL<[z5'O?ڵ+?.: {~upW7N _l#F'c{u8Fψn?>V@)֭믿ΗO^^}UөΝ;gYT Ȁ1vŘ+FM"@)ŗ^`2۪? !9!A.fڴiÆ S3#GL={~Ν;O0/OII'Fm۶k֦t111@olmohl߾}|Ap\<w#ر}AGy;ڵj8qC=c(W.oj9rmڴie(C wUaЖ8۶p;WmDf>+n X^Z(h|q'=sdUc:;?@%A1 *""o>|yeaaas;v\re||^X׮]7l1ץK>,+++""Bs3 }Q&`Lp֝?zێ?*8)rup>nz$ɝTA|w\O<"RRRn˗/w8eee?ŋ !^{[oŇf47mTXXXYYhѢsj*//oҤI$iϟ|Ijj*l'O&\6((kI}qH:;U B:}l|;[?P)իj.S[Jv ﷆ-~ڨgmDI*_zô[ EL" giz;:tpd':#|#UAfӾ?Z` a?>zQhg](;l-lѳJXHc&.X]۫o8$漻ת3$oҴku'o@0PŤ1q6O͓)mxGs‘\H,CHq݉ Ϯ{ؾCuo!dH=PD~jB߾}_{֭[/[WZ%IhLOOVTT<3;ve9))C C|||MMܹs 2m4~kH~O8y7n݊SΔ)/]43,-[=牼7|۴i /Y֞={E?>4MŞD5{>`VZt:DMǷo~ ʝ;w^n]AAA\\\޽z([;u:M7vd2-^Rz 7GEe˖s[_$qxk-$I ĵSDsm۶Rm"O7h[SSS3"""ׄ `0taǎk׮5jT>}'k>u=S[nر-[*>/JLͼuYO8">sLֲe˛nd, LU \%y=_|b;C$t_@RYQ (F:t?&d6& ȴ0!A?G^TM-DYWD[dY.//X,zd\!"BDTdAMB.Bm>۶mSs\<-/$";5UWWW\\?veC^-vHOAD8fbʈvD%?n|mmcbhɀAv|9?裵Zt'N9Ar6I>Tͫ> ʈ2TEѪpԘ[ CeDKBt"]ï=Պp[b D "3_f=[yxLPI!*)""ku(QibdGt e.J"ʨn*W*YY9N].W): ](:DVW9U[BQf8*N#*VَVDdXVjmpW!JN3Ò+P(/Fk="ETz/ҽyo^k{P^^C @D;uUh"2QAd(:%D,=[jصMj749mEQ.ıǃWEZ?8W%"?8{]II ?,3]")(:DD]2%$9%-Jc|QO%tF}Yf!b'0Gbw1m4 \]E-OE;YzR>Njvc2 f 憆s`&&+&bbb2"]B#deeiN͔jb*+Ws-,wB ^y=GPEA :̙̽3dȐON(~Ϋ|nڧ@{ _F뤠Ȋ j&Liamiii]t( 9./m`G_Dwr#sY|홁)HS_y&nC|OԎc@;9sdo>S)xVSt<~N k򳘟i\R @EQ@0m3*%L諵{,B2sBN2Y=P铞siwZY}E{F:,sy̠ijGնv)  W 'Epg5%#E+(D@ a𑩺@@T> p{VK"}kZPptKϞKk|鰁@)A !AB ֛+5K7QcwO@Ր_U$`@Z|*4.{8*(ǬFVK7GA@5;Izn' 7i{@guhWoԁmh7'/TܣhVEo'GW+ƦF)e F1aX&K~%C B^\ Ec$ __|IĕOI7u(g#"Z, n:i9!AC[7kɥ@C_ 0QMP>7b_ߵaBw %^<PZ(Ԅd  nx] Ր|7.O% raFͭl?BC6xo]!?8 5Nhh|&HZig Tz4/7 Kj3Q^Ğ9kAA뛧S+בEՙ͕co6 y`/I&U^A)~@ʒ$ɲNtS%8JW^7576Hu;>mjڐ@};l/`B2sBRB$DD_DNN土W_O4!pk ?ѣsuWq' 4o{_Э YJ8oˋ'b'+$3 !A-{$4bdrEܳRbkMU832P7{%k MғnHRZY@o\@wIvx3-jV۝oYB5 !9!A.hsU94.:]LrxI[ ,J^bFt;^z?^ۋt --?m%xfRd`Y]cxD,Gh}@ゎ~U?Uo? S{$@M@DA\[TbOp/8vomK= ݷ>Aa\>W*^:5Ep O*8  my؎8]G{Jjyi{x=iN[Mpq/3zvɟ?*+`ż2/"}1R *G6 5.8=͡$P1~_PmG~Vxѻ@> "2Dߴt ai_^REpOe (( ?HP S U<׀ːFrC$ʀ@Ys\Yϟvٹhy=oXTx9>l~-[S-"nذv=`ڇ|O&.?|F\d !h.4zLHe[?s^׿'Lr9OR p~w}9[y^_]]gϞSNcZN򑢛4L5ba5hQy톯}7##wxP5qyPQTPd@1&sXWپit56l=WLzs,gfffee,LÇ61~ĉ;wZ,U̔ 0@= رcnjD |^V('?z蜜8PPP믿g~~AECHfAB `; Y}k(<Ȁf-XO>pAeYo#*XmtB_A:uAF9jԨ+Q*^>5Lŋ79s~H}}բqҥ?}7}ٳgϜ9@1&s:N5h;vl>{,!cLO?ƃPM~anSﶽ^ %lXh B(T^N= 4PfSN:ο@NN۵oTSA;;H@wQ_.cg@WUVKƝh/\p8srr|lV>&eDt6lWqQW K=oy@L;kk3 nу;l(J+s["3٩eC:@(܉cW}.IO?q@Quǫo{ء= BoCeN|;9ɿ~jNC1(C#6x\w x.*i2q][gD (@ ԘQLv2x0s8˟A # mx?wO˚4tuH<}Mٗ_W)t`$wW( DJKV>]G+?zN}9mڴ{5k֯P^W_t|J]ڔ~"?~衇GyDEYr`"Jl ͧ]W@x/O<đ#C4z@yQ=WO86' 7-s]]$)""ȑ#`0 (۷ooѢŅ6(JiMMg}pB߱99|W^y%"byW/^|Q__/))3'<˖-#8իWϞ={ɒ%LzT-[;j7vޭ7mgMŪAqOnrrr|g $3 !@;vx7j<%I:tPbbj=ydAAAZZxdYl߭-//r󌱺:ժCCCl$X,Аw={;w9:IyYkkk%IҚEQl$I on{,11Qmt„ SNվt:f_tڵkx77nLOOWmfYUTc _wEQ8+ɑ##GNp8֘#˲($у?l_*u 2aonؕہFTUW[ t8kmhh$8--/OϜn8Z%9W? ըk]@pw` UJգGUerlꪫ,͡6;;;::Z-siӦ|ڵkjNڥ(t:J,0媟ǻ\.={ܸqcXX}]ueO81h@0F31&M5Nٻ@=ѧG+0`L=Yɪk6-_k>&tmܓVX,ڝW#˲p8v{q7>_qL4%ѣ.11GmFGGmV-tApO0!<<>2 Z=xqqqNx/\{v:t(t;lٲ'|dݺuC}/^@\\ܝwo?~|3fPzٳgl[4IIIs_[[7/BwM !ŃlΝ{WO޽{w_ʢRSSkjjz>}h׮]}֭[8q_~YdnGDݾyfQo%K;VSFFFJdXnJ)=v؂ u:]QQݻ)|7~Ccd0̇~X}۷_^nEyW?Py^j=ZehN8~.]={rǎ;p?o[n7nLNN>sw=pG?~#?Iǎ{ 7lCoz^Qt믧p GL(|>>Xhɹ뺻nb_^k*ct>M3{'E֬8Ǘ¤ _S)L#I3'N_tv]vNLL2eʸq믿tȑ#ƍ9rdQQ{wxܹĹsr6%33sݺu֭9?.CkPQ{pOmYԽ @lil?}FFK$WJ;d(T@='ם Y9wF"8LdYKKK~:BW\٫W/m/\>(++k}Ν;mf4EQ\t)X̙3W\qmƩX,/kF#|YYYK.Eƴo5TeI8Ui~ PKk kΜv>%k+g3 ڧ~v]iEZm;:/YXϾ- ֢| >ա.,֓oՓ* k!YQ`q}fʞ<}lj;s+QP !k7? h il @KCJg_ڥ$ [[E¡#&JUn߮s'x V R9R!C[fP'N} ?6|h }ع?~@%͍:dMti)vO7Da`SŪ\G)D֑0t5u8jPtTO&y_={|%%%gϞ]xqRR^/>sɷ~;<<|ʕ.W^egu\'O۴;ˣF6l;ڸq(|S8qj]xϜ9SYY/999O޸q,O>$jZ[[۹sgNQQQ7n}TUUU;vҤI<Ʒ~Wn@2ovl6={nҥZjŋ].Ac \OV\\Ѯ%l=zwq8>>)Q`0tڕRã :u2 plݺU𒒒޽{ҥohTq\UU a7nW\! 2dӧ/^  }q@&gd !n###_w1rHѸaÆwsw}WPP l۶mԩ\B{w¸`0̝;wm(~t裏[gϞ/h4:u^xڷo?|W;|O?D)]`9yݻwXke˖|رc׮]4v3gZޮ]wy!oEDD(I^_RJ( CԠ_#9Mi-qCGV hHY"Gdocebᣆ:|[׳(̽a1)l*XԥdEd'?}:gO/cA# ߙ]{01X^vku#:Cb7y3:ء;# ZˊNvi_R_| m!$4?( ~xÜݫ7knfdɻ$v?ѱ{ JP)aS.$B:;%sV{)Hf01=--L5a:UZb|fՄ$! ?=Mi@GCDq DM^ :\Bڶm˷)zktt`:utܹ,_\׫r޼y|ARRCQO:_t:AF=jԨ JiUUΝ;WXp8VXUUUX+**2 zh?>׮tM;w|'Avvi?X˗744{キr /VXP>Yt:gG#JLJ@%&.kC6o?֣=ш\ލW~ڵkj~饗zٳ [TT4aD,((h۶-N|8vdɒɓ'O<'0LoFqqqXXXnnnv6od/4wM;_'O馛Zj-7ohҥz ݻw0aN@vvvnc -kvAhyްN)J@@Be+̮?{ί1LPX<3s3\Dߺu7M:h4rHaaĉcbbT߮];t:n:uT5S̙3:u9N5rH(--ҥJo^眥@m q3Vd'5 L[[tMp8jfnF8J VNd1h}( tQl6 H@PЅ = G @*b{?'Xn_':@>u@W]K{JC svnDz*Gvtb)@ SiQR۫K];3KgLQl&SsjC"oky d ?+tv~UُW-,vgNs 8y-k؟97OyP?K]{ێ^H]nfD1ewm[OZ#JD>ٳ)wLY__='~ثW/\u0>|*0󪒒f̘S֭[WWW;M6M6M|S:xƍc}}}N.-LEQnݺj*ѵkWYuz]nsrs$IRcj9@-MԜ2DUjtyzzW\n,$EGG[֚;2Ǝ?޳gOw1bРA|h:o[###1,,,,,gz`0p9iU\\ܵk׸8BH}}}>}(%%%\f[?!ΝG \2e ?.TT֠[!C/^CM<6BZjU]]{IU0WЄҩS;vtM$111iii۶m2e 4'''%%%<|8g:4ydDܳgϊ+;tpo|+Zv~S\ӦMkjkk8?2Wٗ&Jg̘f>SkV=&M/+=rȌ3m6,IIIܹ3?xC믙 ,@)=~ȑ#yPf̘X,&COqJ2B?D@ތQdz!.m"#&+dIwwcK:d9_7wt߮{QA!QoxBFTJ999#ILL$رdQQQ=\zz:@NNOEQٳg'$$|w3t5jUKjU#Fܹֈĉ"6tP}ԨQ6~xEQ:sAp͚5KLϟ9s&'R3/榧+f䂴;368x @)A]nWn@I +W12ͳZŽzEp|ر޽{[I̬΅ŋo驩VyUWq j haef ryy9L>w܈#̙3[V]Ν;-\'BMMMVՍDٷo߫7&Z3fLFFF>}xLgϞ#GSN߿Vf._|1<<80uK :tSOڵ_3g\r˹̙3'Nv~{U ]2,,V%b;_AHfABmLKK;8SYTT۪U+y1n !g}i߾~ 'NEqϞ=ݺuKOOW^>|8yϏ?ݒc;v4uuu111۷oݻi(mۖw 3t$GFF۷1Ʋ#ĉݺun8$''i=ro9saaa)));h8x9sTFٳFQMlcJJJbccyy뭷raxxQ[?dȐ! gyiӦMJJ(*rA$LNNjt:{q Li#c0RbaCDnآ4"7:nVd^Ý Ӏ-t.ҪؖYfM>}!?#p8j6e˖!;̙cՆvN111III'N2E^8~b(EQ5k7^}-: `HnzWNzd1V{mYS\訮 o-)sΖNM#bF W)"='> )G7EEEqYj={|I۶m)҄m^uUYYYɩ˱\GYZZd2L&gѣ!xTJ䓙3gk$IʕW^ֶnƎ;rH x./c6mȑ*3p}sn[h)HKK{78+())X,Z3(cƌ(rװ+V /vIǫ$CozL6mРA<PsReݏ>hN&L eܹ#F駟֮]۵k9spnuz^?e$~t~>ؿ?|mup\uU<@FFÇ׮ k׮0``HHHXfg}:\}cǎرc]]ٳ2cdžʑо}e˖O=7~FJնi2^}U>˗u]Y***$$cǎcǎ 6L٪U^x!&&l6sc=֦Mn~'tw _hQLL̘1cVZ{nYz)EQ lٲ֭[laÆq3nߴi Dd Hhm{"E_ݶ ){֛Ȍ@(!HR{F>6+?i@Iۄ%}ZX:^$!=;.\(ޠeye˖qĤ$DLNN^jlժjAMKK{,XТE>,+++""tvЁg۷o/((P=~ =+ܚ67ܖ:y< l'm?l3.t";[? b_`iQ&Y8aF{kqR(_1[8i)V*/PcGݞ]Z@KU;XIK"4΄oE/0]dXܔ++o8RzwL!(1;=W dD}83G^1,[;jM?^(0~Ȳ_=-y5*ļ#F0ظV!ђZ͘\wތl߶@ϚJ^|C>@O̽{^UViii ,[K.$%&&rlN_]]=gΜ|6ĉk׮EDЦMgy?~->SLYlѣG%I}dz˛2e pLLLjj… [nSO9spӇz覛n;vl|||LL[haZ(Jff_|1g 6p3$fI 'p靟wRFc78|^ߵkot;Ջ 32sLInvҠf/w{hnT`0]vYXXl2MfɝM=OC3ʺuʲ7z-8N_O"" *RVVƙ^C]]]EE((rYɤVrGEEʓjܶmzNU^^ADB$I<] zPŴ5{Px~ԫ233*^ U$IE[i8xMmmjCVZj٬bX; v{(JCCC}}O9r8шyT :)"NdDDcOwX6DT"(1Ćj,>] gߊ.B #l6LZTGj9nhhRkW3śYSC 6V Qj4{f5lff?~|mm,KyѤ:X 3S>͚5_C Nzg nJ8v~ɓ.?Հvt>}C`/#~Ԕ.) 7΋1G٤6MDŭϖ|iB|ٳg|W49Z#F~ <#?B2sBNRϡf>Qh#Ϝ9ӿT.Z/i 4P`<_sD w;noCmUU@HP$@J@!@*.#GVRyR&˲NoIny4h|T&yMuhUL,)Ux=_})`TH0d1'/lλx2AFPi{_/J@@PK-3{dH쎓'U PP# 0=AmV7Xsl6 %nʳh3#T^d0TU O0㹵'z~d|La!;3qc<* #T4{яj$4?mb֝?-. `.ic>rH4/hXO3!k$E :̉0s{Z@Dz[{^Y>]?%ܜeE~eݦquq'+X Q9hY{4 ތv 6z٣ܟ{OW:[&2dd &0TN+`}>Ois#T%ހm{Ӿc;ED_(DkՈ"pcH5 P4&ﻣȈ 'H4rbɟVǏVPʀ @a tBd|iPJ5sZjů( X҇y~hOGS՛aDÇ1֜ @ݹDGvVf 0BhcDĭq=sgD)z*!\A~b56Ƶ (qۢۋܹ (%0@.C0'Z- cH]PP2`޼'**RH{>;j[:ŇjԶ-|D(=Kw^NSD|k١r  RBG{s< D[VlviSצ=7yM.0;`|Wz^Q`Gs ysq\&nzƷ!$3 !I CS9NDڂI87|yKÀ)Obv4qPD["6Xkr紊^^$AE<%B:DKD[R4k,Mc>u[~f:J\J aׂۡ0 IЂ5~¨gp~.PB}Dx25[g_S mrt5RRvg=+@kҨRrҹHO੓P{'0Gys ڙ|c@R0Lua8 kݑ hhDZJ7WDQmqI&־ۄXty@sg*2[##^|37l4j2uѡB2sBjhԴC/Ph__6|to}Z hoy3 5D 1uޒ>nA[( =S;$*(x4lWK;&G@㨼:_Q h&S|s B!2iEA?tV;= E?1P< a5JFD,D1-a^'\@~S~x#a{pot{e#AHܜvW BJ81̚ K`U$^tλ~/4==܃Sw.㿫DM"Y@twtZuv^W⟚P iOZqVoϤ4_Xkx4hOpZ-$3 !rԯMșiLZ88oy^܋qki0X%Aϱ*6cFxjxP-$oB״ҤyoM3D5Q kL.h(EsQM7W9j$Goy D&jqѴxۃۺ5]"#;n{z5ԠɸГ>]i(W4=(|@2IlAGy C8sr0OnP dRjnNDoӪGD՜n7lIw$ -C@&ro8o %K3+ gI uBjͲ @$\F?1%!9!3;l{ !AB4ld !APؤ\*Ш_!%?KV' '%_M7pxo3pA1 !LW`#WPy8Ã%֐.Uܣ?'sE{iCݚ9P_&l]L!bS<-u) |&i2P > hX}(4g!_b jq/j@/`tu^yC#My'+hso#xGzE3kk>CA@͍}Gw1A/5qn,iV++efy֨/5MH5wiFj/IĐ Tidi9j/t{oI7ϵ~ehQA෋y物j:8Fny=s("jqK~(hԖQ%HYPe?|uM ~D :.'l^=d !p4!D{ab5!@pٟIjB~h0e$IdYֶ¿Ro LGoEtC6?$nGF'3X4n PeX1jEaȄ ~t HEJR OPTdn ̩W9ՎHNzgfN*6d DPE"EP'x'V;B2sB\2rN>U*eU9-ܴ>84)g)y&ϫx5KzjΝ'OTl'NO|d{ %ŝ<(..m㍇/"2(4vѓH~~mi!#G(rAv`Փ p2BA.0 Pt"9Mb}(a]lAҚ^/9Rek׮+I҉'/Cd VVԖ54*M!Sd8+BD z: nz3׀ RJE&\vRQVh([F=apg*" u[ (3YM&kC=GC` 8+lf tTʲdilJmgC GTYYY۶m;vs\s!X&03[|m2e ̰ ;^3YAQȁ0GWoذ!22R]żZQίDGҧ6mwƛT/}-SB\Nk2(z R G&L!H(2Tn";HcC(p+1--3H.k[QY܊7fxņWg 'MR;ʟ2uI-b !PJn̙#Ūbp=V3@ hruryyV T#jL'Q8ϽvtVVL5ɴg0puǦLϝqIcՔ̢%ywrlĔo@ :88]&=%E?7f+***((Ю ^?E(~:N6Ҭ[ousϬY~gUc賜y+>+S#I^>}>jEQ|e+3VbsQl(<ݗuQ'yXMM E1Lǎ۳g޽{w5\z̢(X[[+dUVVs6_p O?nrF凞{5k 4o~{ݻ&ds9v]iegg;N6bhuEQ\.:sL۸/c)(,ɕVCy'fV 0YZx@RёLna\.Irrrz1,IRMMMCCZXQcǎq hfZ}J>̗ǐHa}:Z;Z%U ;ut7O!|h]0B#gz'> ͱl{BQg֦MGyħ_PQ+WjQeDj-{M5hSc9D7+rT_Y6C s'۝s-G{ bgaAJODY@rNd]@M*Avξ7@U+]l֗@/~{_q E{[{Jr kÊrTb`'ʪ"0DKn϶qăvf+X0Mz/;Eciw[HX_4|ywۙR-e穷VJN砟~ʏ+@}nf{~o9d{$ ZW\q$I}p鬭U#|rss}>++n{7?õkN8QťrNa.2cl6kzIt:F#"vw5˗/_~}tt4,vp=DZi 8HBu];Y7r3'D3FlX6J}֓ZcX,VUE,[VF\r\v=!$""GuuuIIIRƘNKHHj׮]'/^Bh?sL$I".Z/7*BZh޽{;vL#rرc7n_o߾kٲ?~Ν;&$$|G iiillm6hР'|Rk*ъV533_䯿ڶmٳgׯ_A@W_}cRϫ.**9rjW)**Z~}JJٳg].׊+8墥KN:{6lh߾}qq=3`999ݺu;|ĉ/첪 6\O:pdddzУGޮnzq7z|xܸqF***ڸqcvΞ=8w\>^v;c4 !D|"T@eñcn~pLD@gLddO?xjQ#jz/Fi-T9ei޶f$V$?t+IRAA~URRvΝ;rʞ={VTTXB?ѣ ,ׯaΝ۷o7FQ$Ni+V(..3f̴i8~ ffȑ^{-×_~lٲ  2"Od]APUl,/= S%ҾE9/3wL׳ߩ>W|e{ZMs,޴IKx]dv>i8T՛:qܷgWƈ=x$rZ̲N/^gs~fʞB@$-[( z_FE@:yW?@_Z5вU[3b\1RyR40%.* 򽂰?gѵ-wJÉ-gI6k>f&pQgZ펋Xc[bѮEJ{vNG[_;~ȫGLQ=%`T6m|>ח/Z(11h4~WG)**ZvmxxZQQp88.];~0W\qСC`˖-V;ccǎ8qbYh+**^z*++>eyܹF1,,d2tԉSL&SvxNcܹ{AW}(tX 5(Oޓ{+x**;;?LJJ***zr~~l-\RG5 |W_}5**=zt~~~UU՜9swwܹs3gׯ_uu yر'Ot͛7gee=]~SJ׬YөS'T\\|뭷vUUV͟?_CQJ/2DHLLT\'J0*FٳK%%% zߋJNҥ Ĝ9s   :u s\Ǐw8[nE1""499w_lo2NСC !Ǐ+znf8pV{ɡ1oNB2sB\@DXr; )aǎ#F0 6l7n?cƌoo ,ؾ}M7ᅦzkߍFO>ydd'Eqx2eJNNNJJʬY6lؐ/2N: /{III?͛ pСӧOu]ohl۶-[(cǎO:eA,Xs뮻鯼JeeW_M)mٲ͛'LvԀWzÇ? 6m۶nXXo?䓠<矫{2 'Np8ӦMkݺ0 Ǐ֭Ϝ={6--MիW pСzz'y~NbŊGySNfy…SNݲe˒%K-ZԣGޮ`";jۖoRD4.cdF\٣hB`_)” *>P18oɱVu Æ+۷vZN3 +q;v?~СC{9o޼~s{/ru+Gvv("PJBMf;~)E #i()̄87€|e_:JWMIG`Mo@75:dE즒q k{:tǎᦛn+HQ ̜9 ԩS?ˍF… Gk^p!רG^uUW]u޽{k -`x̀߾#GKFG[jQKY+%؞r0l?nh06u;)2Drm E)Lj8"b:sw[eJ bDZsyuZoF`ؖϽҔ2A1jl1m>`<#S(&BCvIJ}"VqwHdE_Xo'/})=YERf5yI8@Ѓų_ET;L{.+:y\CmAxZǟ[Xa.m ؿ_cRhr%i f'Ns.~mq?0++sD}7!Ǎ6'OAaѣFj׮]ee%?|WNUxʗ_~k-((0wuN7ofkݺԩSt{ٳgk^ze /X,k /?K^J&?C5]ӏ!@k!{:p31֑Xzec|?xcǖ/_gϞ]XXاOǏO8RPPЦMӧNgϞ=.͛7X"22R$QeY~xnݺSL_&smZm6СC[jm6n.**֭ch4={v۵kǵj}<aff)Sz?+Vu.KemKfQeWAGxxx\\4s\=O=g϶lٲm۶*%GEEi|z0 wywnӻwH]!9!A. pϺ0t:4322j_,X_;vѣb xرkG#8p`՗]vСC`XxW_=yd.L7|`0'%%}NII`ڵ_|ӧ ={v^t:Ns: Ns͚5}ڸqc~-[f4=:fNw+WlNOO.]mj(>hII zU)yyy}QżO?t iiiZ\`p8xu:]nnnΝ|ݻw8qZ[vv67gQ$$$_~y5F{ N3,,l޽:N}霧QrF¯gvs a^C4W`I=uZ/Jr`ab!0LKYdDQܺuԩS !:N?~|ҤI-[f%^>///!!`09.SG܆t:O>2Bw)]v]?0xd裒[!::JQ\ 4hi8榻E@DX{XnŔD "JCIFD+F?E<4c/j$un3}6~RG-xiYjuߏ"A8ܥ Щo_:dO2@CVnTz/]}~ #P&#@)Z~RۻkLʩ}AKBxm7\)i{T (J_Aӟ_|SUET*ܾp믞ڳK=^t(㮚 L!@} rM PeYYYv{PUUG[ m-;;;11{(..Zn]UUp8>iӦt;v(rN:5n8a6dArssR=?΍|o۶:.,,,%%f=ӳs ^DNǯsPPPA}N%Ѣ|}ݺu+жo~mq1IhV[[۾}{D,((kyС P_}-p`0 ;veEQ+FyMF8,..ԩS\\ &OgΜԩ<cN U$eܹs]w3U?Qg_*e3<Ó&M$UA]%˖-[VUUn54o@ΝwqM7/"""55u۶m^{-;vk׮|MxxҥK:nݚ3*wo{!bYYYRRRYYپ}z"_| p!ABp xnDp83gٳ'9S ddd}pU=}Rt Θ1cF7yd~&MիWFFƲeVZkj~̼{U$fQc\fC57̄Ç4KӧOgY,ԡCQݗDN(uKϷH$DRH2U' w!-JO[%9[ (PucujԇQ&hvv6~PPPy;vTTT}ݜ_ի#uN:_̳f3™0Bɓ'ӉΰiӦB,KmmmΝyXIѣݺu_O>.^<@jw} ȑVS@8詳zZb$ (GZ/HAoWq?;0b{?3w[* = Bw"XQO"͊"((EE RN( n{ݛMH=/wΝr̜9u*:fTpYMd B8@5@i"H?cxhdvshC N ;/pkĔ6Geo-uLKڜܹGPǎ={顧ZLYg0D`Lǰ7oX=uKvIc9j@Y3 h;f\^1ʅ*F@Ds.}:DV+ i?-aM+6VTcخSnt-L!1FÄ ͭƳϿ90\23? J}NfZZڄ 8 |~-XR:s>}@VV\y̙m۶UVVN4g?E122RY)))CKf͚eff={n4t={vȑqqq\5[?} m۶Е6fmʚ5kߊ/_xLlZZZΝEQiuhKݛ|=QICF 3Q+N""n+ۗZ,ݻ1$''у)S*ʔEmYYYÆ ҥK@@,Ǐw:\ 7Pes^\\U999^pYf /\0yduM6 L-'+LUߔN崴#G۷k98ԞޣG>qW ڵgΜ9rȭګW/Q=dȐ^{M*D`?p#22rɒ%Zb?ʕ+/_ N4Im/**ڷoߌ3CԺu ã>O엙?ZsAֹsgE3fE!!!M6jBB Azذaj@ tJ : 򋚆5~H(!(lՈpL]v-[R狢ã ??A8xرc.\/̙3@322>wy.|R%eONk >p KsJ(]zz_pEnCĝ;w={vW3+~s.U mڂ4\ @;]d U, KТmW P~-P) ׯj>sjcgb ldmg`h1mҰ,X[ht 0Sn䨴6!-;D 7Yۑg`cfkZ6# 5^|5@GpHhY W^cƗ5hӚ8oAϐ6D M"kQZ?*W2^OLjpX4#V#I3C†jU /F ?zz1ƛ(ile>i8\>wenVZeu:]^^jٳ'ק=zԨQ|p-˕gN$W=+@2;\8m4V[xǎ1bA>ON0a۷7s5jԞ={֬YӡC9s愆 ps3+::ȑ#=8CO߿M6 O>gZo'x"!!!11[#)z}V}ݯ*((cbb&M4vؘsFGG_m#j׮ݫo߾9sL0?`\_^\\wCX|yǎᆪG~m۶-..۸+++%Ij׮8Ϝ93x`Eb jݺuQQ/ܤI}#gϞݢE F#ٳ^uiӦM:kڴĉWXq!ߛ5dȐW^yyeĈ!i۶miE({88|3a~ĖzT}S;RInf>oXZD={"cKKmK.JRRժ7@ W۷o_UYЦMBHLLʕ+[hjù#,;vܸq^_paxxxmۖď}QQQ|wެ,An'Cxirm%{7^Ҷh"V6}ⱘQ1uPB(@O[Gvgi8'Na.*̙3ۅR|rZPPPVV?/]r7[.**J [feedee͛7y'OE ,,KMe˖;*Xd"  L?3RۆW„ict\ q湅ƃ6VmJ:ݤ{)3y25eǰdsl<|A&阆bw OA  &Izaq7ZZ53FhP6my6>Yi:!?0,#=z$ڲG'2YP j˩$ܱ 14om9iwpЪ oX6a@0 cݡ,[9 Q il-_j"7|w]V7L=zbJbjns_mTt?0P@&By7>~ѢE-r8 ,{nm۶ݹs'W% }uL*EQϟ?K/!W_}#X֦My| U$|'K{a)Jw))_}b5kcS.S pY}$wz  +f4&dtv!S?$sksD'}61Ə/Zb "7VUU)/vDoI\n)v^GݳgҜn/((i9x';ɟKS+++/]?˲{AVz8V+jxU$tf(q4JUJ%JsII w[PP1̿*hxdRjPVV&I cl6+(%WQFDiwʈh8P@U*3"(e(쮁U[gz9kl/&I}%^EEZly>!C?_]@(3tXM(ۭ{X ϧ\(yO.RIL0n\eY2z4y7] M?-B(>S Miu塲kC̘!"*Dt"S2ˈ"웝h:%D%DӉhCWeX{N.+da #ŌXh҄).ڑ|&kեSc{&S>SJDDS6>"C V$J: j[* J9X3DD%JE,Us":VNCE4"" R%D hmUiH 2hCD "2Y,(V8eذܔ+!l_F !I eʓɌ&ǟod=ϿJ0f6|@DnDD$n=6U^S 7y4&QUt_w|s^>9`mq@'j*(KLL?a|EeQUۺpႲ+=1|]+(R<Ϗc/| Egmj)[n-T)'ȃK~O?4"VUU)Gك7Lf?M0k"DYfJzIqK=ك,zũo՟'L9}W*s\i{whcOVE*WqZ׺S`2 ^~>16o|}w]c sk׎NVfU9}#?ǿ.{[lc9 ܱ&3ex;$/?KZdfTrՃZܛo8C(ON8q^zuʻzP5(K9_=zsiQ^}QJU j<ɧ]Kl&!\g !@1LUs@&,J+C*^(jtZaUꊄZ֥_x <[u0*wdHeJD Q"dd55P̈@13xV¼LEEE~~ QQQA8+gtWPBWTe^C (uu1N 1(#t_L$U ? .u AFFddh2eRe"dDP`2 U;ׂ D1 Nܗ `@2H H # ;r0NJZ TPCȵ( \HP5-VkPPa.eQϝG]@MuigI })5o՜wB4.AԖU*pM}>);GiK]K'QڪG|V2}\]uIZ-o]5x[]Y}NJpjnWYp9߹h2u,5~Իw>~Ñu^O%jِ\].֐7pxUՂG;ju5UT] K<;Ƹ8g1'%-⪏53QCH1.y_Cr4VJz cZPT f?-ס OWtU-Vʔ\8cƯ==ZsԐK=DRy#`e(˄iuobU?ջ\BC6CD(7~xJ.j{2x+TSOcƂǟ@OCN6`ШCf6)um2?5\Ŷ[+u15XW%*4/b#sEW-x~$>鐂 9?H^4| ĉo >KMꤶ㳥 *뢾_="];~w݊ZҟR}PS݃q?6jց hTy'l| Wy5\N l};n x;1NTӖXk[gZGP.(~~A $dHSQA%5+h{96Z tMGW?+Rsj_ ܆9 xu>:A~~ÿx&Lk=1E< 3ӣ|=]WĵԱ;zǻby|^OV|nWA cMW. DD#e݄-WTAEo+mDL-_א=L5oJyU7[FY)O~߇ƭs'NKxfkD.vǎUQo8aXzUn' rFD@jlM8A*qW( sܒZ}TW%wqT$@OP{,*[_kfГ, |G#*:/⺆P?#P}DO@·*]:2\U50ʛ'֏sVţ 퐬Xo'k QCwEy@<+~`0x^ ?򳫎nl&iVK" ׻.3ND΀A{pRTBSЌOd5>[rv W첛YuВkjQ(zͩPS-}OzVE'n=qe/H꣙+KQ7 JDm 쟷(`m{k7RCd% *rx  L]F:_uVZ[\eR4J !. _f:7,{7Կ_Ѧ糞P9_60*ǃ4{_B'BuYmOq%BU.s]ѺSN*eP1*pn@-?4WߴW}f5OetUT"B"iyHu"Vh؁X=7l|`2übYuїBjak>(%K?ݨ!TrB1*cjY,Ab*8xS3pC%{s *4_tEĀHZSuP#U^qvOֿ*b:Ǯzˍ(A_I-ے\_'j'LACXGz&!U݇TjNuEN}p;:r6jmVn_^rz2)4<ϻ[mzp߰[94@p}DCxVa(/jEvHK R =(%NϏF@ݔՃfי .qՖk: 'HM[AP#>7+LiI f=+5MV)>ψ:Q>ThqS_t؉UEBUyjU޹*5Fܽ`]e= nOXDeBGxElVDЇCC]0 6l|tV#({_e䎏vy8P'jiyXLQ>dHF@\^DP\"NjcV/0eu\<%TV\@-eH$ | Ƚ$#1 15+mCW0A 1nƵOƮJ=w%r}Yy`P}'OqXbpC4 DU0ޭYQcԮ)/UyͲI!`smExo~0V[͈ϛ? . V]cTϵs"rO/V+¸KtWJU7 )p^gU6DE{pԟTGaK% up(e(#!5*@=A޵ )J<(> (vZ:(7sSw^9@XjB|,s'`{AH_ ^/s_&u-=PY.UH[b=yƘͣ5!AO=Ǘ~p̀"v< s'ᓊ6{gή]pCX$IAj(lU6yxVA(ψ>|o5`*NӨǏ2vAUE+N|]&*jayo""2 2Cd%`2ȼ#k!7R!J ҆$I0z(j1ǀ@f0;TڀdN%28j dnUD`,Y!iVed&ITnj#d @ Ps2! $H)j 6ME( J v'E=Wp\e D@@ +J2qD@+Cd]**&V$e(t:I{G{u"],js5SXf~vBr(rcb":{;Tp@BC^LXxiԡװw@l6-#")[uQ%+@>D@uu֭[wِN"ƍ?^]]3!DBȁ6mj&ip}ٳs}vγ?#@C2)\ 1&Ij}ê?.5=їSUe,Sʡ[\}&=@є>|… [CxT덊so<+@uW Vs%%%JUWKfBc"xM Qʝ&Jj]H1cXN<>o>(3d%Hp_@_̫d@Fd 3` !M_]9"o?9wbƉgS2 07{A P;PdddL%2?sD6,3%ڐ"DSV&Tr 2E{++Q5^yca@a|F+5cd3̻,1 N{e Ld@I6Vˋ@ɅUTBo\m@ƕ\2.,a-\2eHNN޻wobb$I;R]8cO,3LY=jdYV}c%LPI5e&蔙̭ ,`W: W›<zGeV#0du6,>}:999//EQ$2==ԩSP~ՠϝ;VUU'JO)(((((ӧaV;vرc6YNg``&OԨQii*K]"±c222ywyQfLm?߯>+O>d~j.ZgϞ0!D$J'T8&\[S?G;?bĈQFp F&e`PxFqҥoɹ{N>pVBѣGSSS^lٳ~|g}G233\dYNII_< f:Πo-+-SpH9By!˪ g@ T1o \Sv%AB$WF$wVP9}᎔];BHHQ~!k2-nJxtV҈܊E5G6e(3eOqYnM{>>Kwݒ0đM~A .oܜ|ۃ3i,IK_L3o޻P ZR|hH4Ǻ @( Jkjfee={V'9ȲT[~i>[bbiӞy晇~駟dIB@VU*h4NFSbI)SSS !={v֬Y=؃>j.Iʕ+z=bSy h>8]0^^|:a}s+DypLnE$U;'Jq X-~P#00ԩSCeNs8{ UR^^_.YobAdBȏ?x 7Fl^rҥK~W_}z ܺuy^}UN6ߟ;wҥK=Fqyyy(ܹs,:tH5f>mȐR*:%%%ZN:?剫=?~j;VIN< ;v'Q- T7UUIܒP*S&h4z0vG?c(r-lNII9rÇ(\Ȕ$Ut:,IN8Q\\L /l߾o駣Ǐ:u vɤ觗-[v~}ݫW޴iSΝølVAe|/rEEMӧOvkmv&L$JNStyvf.81oI :%Wb@Q1,;̬()CIMfb?|ciii=zf)GR.3v+>Rj4=tG<< P @t}vGRzM(fstX|-# @)"P-Va={6iӖh`f@#g,kWNꃈހbp cLӵjꩧReY- +UV)n"NhtҊcG # G  cǛ VRV` dڌe˞CGm9V-Rtʌgepdw) LTwgum׬G ;}ݺ?ůuڴoR@" /#D]+J *&BJ@ /͜}çkص %Є22 )]釦_m9cfS,}\+LNV>r~Q,:m=w>˅9%uD_zb&N.#8 3cF55jڵr^$nqyIIZZZ%[pϜ9PfRRҴi}͛7Yo4KКXrIvͮFlj2>~xNCnݺmڴ`0}QHHpTWW;w_~2Ap ф3`ܝ~Rq}2H"P}8)W}'+f%d2UWW+!$\E[^^2+e^ܢbZh69@vͦx$qj[]!]vh4|iݺuHHHV|ĉdsss۵kk04idɒÇFoM4ԩٳ ta8sLjjk6o޼BH@@~8xwygҥ_~%ٳg:C){i=RRS]t;w3"#"N&01eff+ RW9?AVKz|s BBB֭[׳gϰ0D\f޽{7o~_500W۪zDرc|V{ǎt:N(IRUUݻ5MJJʢEBBBZ-L'N^`0[n'N8p`@@CIƎnjiӦo6**ٳ?Sxxݻ?Ø֭[oٲl6?2󑼼{キjKLL|[cٓ~zFí(Nuu5z_~eΝ5j?}.]+V8sqF+y睝:uؼystttNNΌ3wĉ~-%%K.:*IDATIIIƍ6lXQQ'?Et옱q[ɓ{եK޴f[zu.]n6#|/Rg^c؍Ԥ4l*Է ic&q,ڷ}eNe7\huӧm@uh-[ vw߭ef͞=<7DFFr-Ǐ?vؾ}RSS;uꔘ8nܸ#Fdggoذ!22QQQsD<}~tzdjW1E(}}.c̲lMJyQ3@"[E?yT\IS4Bay_}ݞ̲yE^+<$IOBBB ^xhBHnnUuVXXXXXo-[$''/ZW^\?٣z\l!7ɹNu|MUUUUUUYYٰanf^~mJJʲejn5xdQk*7 :AV_ (YF8[sX#;#ú_zMݠ)}ئWV۞Xq.h֑%%_n/ YΖvj$(VyN1P lam)Swiӱ.  3퟼w$]@AڼLp kDFA$yw<2k t i0o0so|;m&IyӖ' 1m@P"0Vw"jmdM/h =+h瘶rуd95!Di;nV!5N-_BU) Nfegq; ]Hs уPM't䁲;H+^̙|]~}^^^``K.]ڦMV7ߜ:u*$$|A@@ʕ+ [o%/t:ϟ?=9Ȋ7W9rs*s}WR\ifYKKKǎ{7Z-K,۷onnnQQ믿ޢE.555''g͒$͟?`0XX,7o>d44̙͝5w!U Y>t DA-Ԥw&} #@;h9gΜٲeKtt}=z8{:tRxbBȖ-[:v8bD|~`B̙3GY\\۷w}z~ƍƍz~!33t-ڳgԩS7Vz!Π7oۣ@L}vVK222:t?֭o:… ƍvwɓ/^y?sFTPPлw;w 0f̘m۶:uj׮]E8p`ʔ)ر[oURR2ydA¶>v5ktر6f=U]]3h nݺ ?% ,ڞ{ܸݵkWslᄏiӦv]eeeK.k4k._Yf#Az`^zWUezcO=T\Evm_j$lҥ]tIZ]{EHH)1c3b(?{2KMݲfCXU E䂱KBuzUѾFĞy1폣n tH2w^b{ 2n8vڵk۵k}9r$Iǎ;r ԣG Ky(**j< r֬Y>bdq ZC?$6@ 2S2G1{/s٠ h4> 8 B KKK׬Ynذرc $''k{7((HŀY/^?.vnNCkJ<~F &6,H+!BNa˵P#l34Da 0XK6w hcߑSքDC110piKE󶖑=t I0 h2d6}rq se$^Fr/b?ܵ"| A(j(Fx"wޛu-nv4ǟEv/:6MӪ>?3gZIMM&~_7?ix (i s]37Yw!@O>Ӣ$ȐP{ZDDcǎKMM}7Z>ٻwgN0222Zj ϟZ]tyncǎz+00p8NQWXcz+"RJר(f=<9XfyРA-ZؽkOyyyv2338ct9b/_ܺuk< 0@-^׹|w4oiӦ%((Ek䩺c,44 INN l(:_~Y+|ǾtRӦM9Ɣ˃@:"h`送V>ڶmOzhef?~> nyɓ''Ol2{W_3f̨QzrJV|aw8y6lСCfu^xaSL Ѹz\}vIEQǍk׮ 믝Ngjjj)'NxgwhZn7 %%%v}͚5[lq:7nիײe˴Z-7j4ӧOZJرcGQ5Mee1n8VX!b#QҶnڷo_ѩS'PO:YfOO<`N־}{nU-[te„ J0cz -Ń#KGrHbbn|@ӕ~gݺu>|`|).qHKKz衇͛7/))WۿiӦi?1v'O=n8.:r2FRRRu!B({&wؽ{Ux~```\\$IsΩsA >BCP:,F)3^u=h4_}UΝG_{jt:CBB,Kyyy۶mcgϞ֭lzzaKfǎӧOzj`0~wSL35)B6mZVVcl6DEQQ+p_wU!y睢(8qgϞ{!iii:t0 ۷o˖-[lYv8̬v퐻,Bdgױ{~Qm ?x?~~ .U6m̙ ʓ'O.[R:ydn{wFսk7`0}=|̙3nݻ޳[l9t{kVWUU=CV޽{bbbyyyxxSO'N|+VpC!YvN>=c u(QQQվ}{W^}~[2 JٳgGѷO_ @v3bVUUU11(˧Ray#:$ #P``rf%<ڡebWrᨾmd@I+&y6ux6%s#8sLߟ7cƌW^yd*/2Ʋgy&""bǎJ%y ( 5b8S;k#FhZ={6zgxi~'\pK.3~{x0|yyyxxHJJҥKpp0^;i$^+ȕֈ j _Cydq>uzn4Bttt@@.s3h8{lǎ9bѻM6S%'OΝ;W˗ Chh(jZ4iN>G@@ȑ#m6[NNz^^ހ8lҖ-[vt8 ?O3@%QL@˗wU f&F40q&t@"%dA"А$˄-4D=5D7ثz6 0hy&BCC۴iC)=w\˖-߇rfs JNEe˖;vܹ,9s;NVڥKntRx?SvvyAW9Jk`L{ƿ5< <]ܩ,iV;(@ki , ?Z9@d *N/vHt8njuxSI:m[;̪,e\˺-a=k "Hۿ (o+YZ,kQh9S &yLI/ RdoWa\l#LPћ_A'y ̞m !ķ6LNkڏ:ut3D4kj56$3X #w^k]`r @1k~~@7jZҾԲ!n`G|WnC{PQQU'Rrҥ{N~-[k[j5a„ nrϏ"p~~ٴiAPvТEҭ[Ο?asjyMFSee%k֭l6( ۝NgaaaΝyzgV6 }w;/|m 4`WH~OǑG>|]w 8pjZ@Qu:>j(VպukKHHxgZ8|8Zj]Z-kxy1o}ΝgϞ?~>gZZڰ ֭ZiAvfI2N>ye9 @$p8+ey˖-?bLBx)S|>߾>Gycǎ\cnAlV=z?P^^ޢE 7nȑ#y>98oaY#F{جYx9^fqW3եKzKEJi^^^UUUn\4$,F=(HIрo,2AC2_X~P3VN6K\pSBBωC=S۷8qСCccc- k׮5ku7wnpH"~-7jZ'hӦͱcǞx ~g]wSO=DFFۗh}'Ν; &< O^ Yo߾zuk֬ٶm7DL4iܸq111siӦѣGy[$%''.hӦͫgg̙tӍ2*""sUVX|yǎxǏc<[U6m@;qfy̙+_5kVXXk5id2Ξ=h5b{L3cF^jաC$I Yp_]j-,VN/xk"!s_g/Ah*뇏'jJ(6L @$-xә]z爬{߶:Ah<#/5ߧehӒ~ŋEɩ3 w;vXl,؋^jUVz}f j||.\ޡCm۶%%%l~ٻwofF";牍'yseb%G? D<'k*RYG@j|?-[JLۊ ۾&LذaC6m$I={6?q!j-(((++۽{?'O^fMttVҥ`ϲJJJBBBΝ;7gΜ &8p%-[kdqOdر>d5&ܭweӷSsK6rV[6%ѵֻ3{⦌D-Etj,7?ea?'A\V,[htG9]qMf!}׭S@+KO=# Ko}Q4mbh dx C'3/f;@pB Cs͉Iϸ51 nr&M$DT_U "h.0hIӂ;3WTl C-l, mIcNb3Dm2QjДs/.)V=mJ PWrsH;qU,8"nٲeAZJeV۩S'J˗_}:8H.j4-[͝;wwyguuuvv5kr!$8\v]wբe n}ד:{3gz(vm4iҤcǎ-j޼s=gϟM;s-[ ]|yXXjP\򫯞}Ypl# [?֭\ѪɄx^ [`AykEQQQ-!..c~GgϞ ޽;yBMy pw::ƌÅvI}˗Cm9Y,Xk׮v\:yO>ɵJkajfIΟ?/Bn:sL~wх<5ܮ/I [jt缆m۶Y,Gf>"=zBT=Sr{lȐ!5MFh2]Csw?$%%)'d2)ׂ^^iĻ$M j%DʲJDDƭIh2+Rf\׶Ȉ"+eh%;cXd^$3b"^8kXQfcRm hV=2k?po!hn̸P,Z/Jm*z2ad71:fDwcL-U3YfC QB;u +*x3?I)4`2L:_~p8DQ|%:?U~8r8V8UED3]VYЁ@DhG#Z$c֐ rYcK тX'n8#k*/%%=:&DN.Rto-hA+K2"e2VhX%N͒YT rT):E«m|EE6K(3I:Q("QBDY"UFD#$[vKBMoG3("JbD&#ee>@>cvI1 UzVPP@ d2fwyDː賂O|d(ED,+Yl(9$> zPwjz+BIѤ<yWxLL<5aʊ:kq3/7d[̱/"VVVzp.*--˗yZZD I х|ɇ*:$&!\*HS3P[qPnƍg:8w$믮n^{eS苖Pvó{ Q\507__MflRl2Mfl2Lf1\=+G\~+."Z곭'NKI*0üGִv>^]ُ%I~9\5ynrON} Q)]4dFHmN{=e{|yzeUV[{L1J3 Qal&0Ye`>p6f5V~W1*7~ÿ RRR:u3_wO$?~?NK q5?_(JI=9NJc\l_O%ww"qZ)vE>S/x<3];9_34!xEBU|]u/vmx^xP zӂ|Vj5؇bjv>UXFʏ֕WWy22\ilTbFubj,Zzs 7vP5HͰ+zW~AAAY;s2uv+\uNiu%{Ǡ.<\U+%:CpkP[ƭ/9S܇=U\܈*ǛXoOŊg+\/z*stWZWFW/H˞7-#3' >]JJ8~W?iF+#WsT"V_8 y57Q]@ʕ;:}AR+iQO 4.yм]A:rCC,^5 c]i}6w=5{ iyS }DUt]6"7櫁rԍ}C p_lZpm_Qm#)+SץW=ﳓV=n3M^DFvZuNJ7Gx8h\::mjAϧYK~B _ IKSwQR#0oR sǫ:q!szX}.WQP5QjDuGESEoԢ~ 5r} q4o_a~.ZyN(EOPe]}xץkAk9o Cn,.X}? `6orՍ#GK6.(ZШwpv[ % Gg.5~7+V|):ewiRWY+ӈw|s#ĉXV׵ \23!uuY&JCsޓ9Ɣ9m,2=P(a@͛t_. }s j^o2C {ݶiw˛Ԭ)7ވrk+}\i;+;H-ˌ /.C]ρ(#R BPd2  07 5Q#]q"t3@ rdQSKк+6&~}[RҺ:s}Y?,퓹sQ]껑<}1y}~~TS6Sy7~/j,;~ÿ1ɖOF{yMT4-PqM{W\BIP+ ̮#\~u6-,׍{^Su)*[-p_he@಍w_ڪ \ZpTx#C_7z~廯iB u7q~VWɰf˾Ԣ .0ȪW[*|6J P8eEZEv+ @wm ˀ wJ+ v/aL5 ;} ӃիhMݤq+! u{H,eY*Uy?WU||Q1{:j~p!<"r65aExjS]Jſz{zC_ztU9#{WK 2ԖUsq>mVJ !\Ng$DJ7(@d sZR\D]$n2DQv(AR<EhqKR# 5D \M*,ԃwW1$|P);ﮀH)A5@nqO}m4\1qrA dDsR.ôSUAį֌p_8p$IΝoԍ1_a]RٖW`I@'A5,"c_ D!\DX]s)+MXP.$*!>͒n2EjCIFBN1m d%h$FTk?$gQTſ %b.H0Jd d.1U+\lYFYDT5HC1k׮d+Jq>Uv0e+6Iոg=dt:uP@J2"u1À7n+R״`IN8b2O:5F bVVa2lE}UFjǎ;fgJiuu PR{t[qԨQEzE5r񌌌wyw9p@VVŀB^QWogos(x1 D>'TWW/^W^6v:\&xE5j1[nW(TN;߿ 70vѣG ^ <ǟ:yH@XtiCP{&%%+<ȑ#tꫯΙ3g֬Y<ٳgΜ,r⭶u*R_~CeY%%I2 }Yqqϊ(RnD,C(S޻Tޮ`tE1o>J)ǹc_U?^A?] l%o; o9tVx񗆏'dʜ{l˿^۶8&:]av]` ]n[.((HIIxWM|f5͆ Im6Fzj&M[=| h14!v;q;" O=7!"!TƼ>I(0$ AQb6D@(91.2(*)*N; :Ejܹ܌^|%ӟk쐢 Q!YYᶏߘqmnV -a"!2!J=mάG%\2U[(đ;}YNc> ۩@@e(g}衇~_~EqmPo]5܌SEzNȘ9sc=>SV7_Eqʕ60G5TFxsϿh=e 2 u8[=\w1R+xҊ~Ma ]oYO>t:9O$f/aaau~W ~ȑn7LoҥK$~|ի{|5غuܹs_y啲2l%%%ޜ9s.]zQD4 ,|(?ӆ 4v +Gm۶(..߿?_;;wNMMWiy]i8\C=#{~?/{=E^QO>e2Ο?Ν;t:$l6{ب+**7$biih86oYXii$IÕgΜ9rȑ#G:t}vit:+**ojQO:U\\\ٓ÷~{?3mڴQ?~]wݥvЪ.++Sz/Yfwu;SaÆΝ;~ʲl4x@yyyuuZJIIjqUUZep8ΜΝ;P 0\Ar,F_ J $TBd$%*S'E+MneT\n貇q!S{odp8DQLMM޽;(eeefY]899n{X,KeeeAUHhgpZqUgu: ˺jgAǏ901͈-hSyL$P掭`Z !e˖O>GI'+WQ$~T >>\H#ჅɁ#zˢ؎h6xXYy"HVXN\-rX %) E% cLr"*ģH2 WG/֢U/Pc{(i붸͟nJl$L,}s8z8/=5lK㖃H.O}xOWSV?dNٕ!tF0κC;?!{K!Yu1DQ ^4ٝz|_\.$Xrm=o-/KV:m~Ɋ>f aetP?>a @dLV}Y3F.]ꊊ RS#鮴4===$$D&%%M>}՟}ڵk'Mh<萃l\XɤV:ΣGlX||  ?#::33_~cTmj*brQ$ L5CYcGL!2"]rz&b(\jiYTn(0|OSpeXPO ͐ح[H.`k4֭[GFFBd'N bk/pg04idɒÇL&]v3g΀> )))˖-{g1 `Æ C Yz%Kn {׬YsكΜ9SiGjUKvſȄ6f78tag.1+9~ ]j^tiŊ>`.]!AAA:t(++[vmnݚ4ik׮ݳgOf͸I0((^Zdcquiڼ_|q̘1(N:5((HE?k43g,Y$88Xќ={&!!w|O81hР@pvࠠ'|rڴicƌٴi۴i?ܹ>j׮]VVVDDħ~j6y{ͫ\]]Wyrرݻw_t?h4o[VnYlsFGocŊ'Nx'AXlԩS;wq蜜?}=vؾ}RSS;utԩ'6xƍdSNlNAEk׮|\6֭wQۙ=6oK+8$ӏ<] 6LQtXLV}?rwjm\-ӂ/?o> o<LUjD\zbEnϙ3rСo&**[n0aΝ;:ujܸq#F޴iS֭sssϟϫ=u*auׯPAe# @!ΜsYg3"eGppH~/,q?:}4cGldxTO@2MLJ_N=xCѠょ$I~ippp~~K/1/_^ren |MhѢ޽{c?ܻw^(+bŊѣGO>,w}g6M&SyyçLb0c~mjjk9V6M-Oi: dZ*PajMri?S(ϽA-taY~Vo?ܼuqwťWW֒])'3]i1g-нDHt6 h |f7ԧ;_% XӱoW$jr|~CYˌ+?B :~t!/-@ C&bHA͌_}[hptB-L:D}0@@qy-fY D8_y]׵Ci:^ 9;H>KmU7; ̥N `mPjhAjsR7#&-ATQTM 41':.}>==R6>(??? 77wɒ%zo=}thhs֮]rbͶb +8s{⦆Yb 70h DܹsgUU_XXyf;v7hX.]گ_˗loMNNݲe(3 h4k׎s͛7_xh4n:>>7m͛sk*CJQyaLC'Co"LC1x!y+" B&gEFFfgg?zr8)K,!lٲcǎ㏯Z*889rdFFFIIܹs;wiӦ3gݻlÆ \H?~Yfv]ӝ={6>> .]/7o\ <{ ,xA O>dlldZdԩSwܹt%K(Nk׮>};@3aX#v8@xd$Ze&|Pa%U%p\5fphF!n%D4Emoi@J< {C 5jѣG׬Y}cǎ?&L0hРnݺ1mڴy%I$GU𜒒j2TaRB!ZG؋q}.$@1|+C&Zq:AnIJJ=v'*VpO?422rر|q/Aь5jȑ%%%Xf\窟[n%33S=fVN{g}T(fpp0_}ժ3gN6qСW^yE[T*yih~aZ WZ52+@-4 ׬YꫯjJ:~xJJ˵Z>٫WoղeKnkpn޽;b,}woVPPEQ7|G{7nVmڴwbXA5klݕݩS'Dt/_0`"##*[ANN]BTR>}[oUB_7?BZhaۃ\ۗx-QJwCXXwr8/GxJiNNNӦMZj࿢+aN?|(#\w{fp<*J×tUUn~EӲ,s%n,MBB¤IF_~hѢ˗;vԨQzZb^?s̔)Sf?~2dȐ!C^tқniʔ)PYY{rr6mtAEQǏ֭ /Gzzz=A8y>ۣGnu8v}ڵ[lq87nݻk钓ԩS+WإKIA(//o߾=RzcO=T^^zUҌ^zt}֭r&̌W< !/^6mZf!p{NѤrVMٺukΝ'N'%%K׼#G8ο+!!u_tM={n7 GV,\JP1tp$DA )&'?@4}KF&ʧt՛_]xjFv "7g锒?s1п>uTVVVQQQ^^ވ#xwZZZNJdYP*ZSrq!Dmp] Qg!= :Ξv-d{wn]-ˀȈPl78ݻwO:O='f޷gtMM6A iNOOj<2eYڵ+p(6"~lÇ'r>@y)=w'rRRă!4$HfvsUpxN{9Lg|GEC:DH 0U9(YBz pBs eh\bMW}+'~38s県J[m*FGO!"23i] Pm33?(,,1cF``+&l'_}ٳ[u PA`[ J#B-y {%Z;"Ȳl!vЀAȀ2 q*RNKOO5jϻSOIjϞ=OQΟ?ߥKUѤM>RUUU^^U %%%M4QD׋/r ̍,.} N<}iA6zRh K2KJ $Ys!LJN7$H(( ]X4'y,MǪ,~tT"lq-SFϿfǷ5 0't=;-ܬ O%ɠ8ѼC,z k@ )Td2‶`ȪKˁ#G!E>\2YFrrA"|j]Qpo)e={j#vjmPn~)Ġ3R#g0ab ke/~Y D Ӂ{cRB}&L oF߾}ϟ/?[lr3g|&M(Is :+rj֬Yffٳgm6۠ANgvvȑ#;vȕA'Ne911瞓e9++]v ;jCYYYf˗/z.UvEEn3[=>4999$$Dc:&2S2̪-퍅IIIL]VVD bb&M"K.)/BHEEEӦM stU7Wޙ)G]jURRSI[v۩Sw'OVTT=ztɽzyfUVW_}O?ݿhժՂ -9{'K<|aa ؐ٠_Vڵk O?A!P1Lm2l0z%’jժC 'r۷iF,]K.SL=3F43#;jG³ǽ âh@ qX+ ӆ:JJD7c8Ňzh*2#j"Rq\}}Ν;z-+RXXؾ}{VqqMC=:>>ҥKǬY4;;O?]r|Shlkryf I9i8͠ CڷRRP舁K8-!8v έTX,fx騨֭[kMɒ/a1cưUWWWhܹ`瓓}˗X ۷opœ9syfz.s!-hAC4AZnHNhS h-_|b6]DZn5b~As @sݹy/&Ι 4oFXsxd: "H1aj3>F;jpv@mQQ _-4)Ai0gv8ԋ_mjHt GDT:9媯I\&@Bh3jgּ!7[4QVeZ\yh^{&qfĦ`iF[xо|ؐ$荄7P)Lg2'?80؛pzf:hXh$4Rg/Joqw u0H3LWk:nqqqZ954o|ܸqiiiaaal)..flc\UB͛WUU}Wng9FӣGpkkkcccUzRڱ5mq 搐[zqfSLa{'%@T_83oOLQ\A]p̙3gf+7??6۩Zh:nt:%Xk^^ޜ9s<$O+Wnh4(2^vFF)egᨮ V/ ɳ~)Ș4izjVW_}SOuЁIEn_5k&L;v^8ñuVJd:t|xX,QQQcӪjyܹʕ+Yݺu[bnyl6=QJo6Yʤ&s9ň@&;u@47 !A{N6 -'N6l:rs=4~aÆk׮v֬Y#FصkիF_ L2I&죏> ǎ{g>?}ZnݿD||;L &|,a/^y&iذa'v믿^x'D\hB A_:{aۺ-[ 3UӁfK V˓#~qIUto/pܹ]Ӻ[={m%KzNc76mڬXyZI&L@)ر zܹs۵k7ߜ;w9nݚvޝ+ˀhlFAeKkg(>z==6lʞ9f,Շ$/uRo3+|J籱^zRN^tRh~[h!dҤIk׮j:ut|MNNNyyyHH̙ӴiSf!BIIITTle˖;8Vopu|b['tzq䀷Ӵwxukӳgh3-'g<٣[Ӳmf?;kyaMC|/v-ji@5"B-&~3C%t\=JCFJ8T@b9{N)B4$"$r−)Ӌ-&ʹ( bL響cj@:j@քiۛ*M7N;FO~J$m~ǽ MAj9ܞ~.#}LHE} _S}|bOֲKN#Dygz6k&h4+Vt䓹sܹ311q.]̙33gΔ>=بA7o}'fsLL=ܣj}bbVoYܻb#n644{\$"CafY?%?_DDɤ|].yv-˾}M ,_I7 (1"fي%t.Xg78x`8xS,-TxF*ZU҉.yAA 9y"  "\9$RBN$& RhDp^9iXXl < G qO(Rp2%SDQ"-EA"5 P@Ѐ^#i!K`'T$ 8=f D@^BQPy !px"p@8 Dr:)$ D Zg2*J@%  @m?0+Q7)e{2*b;)wT+~Vw^]M*'[:8vٱSv1 o+ےʖ]*MVjϳ@YjYӠHjnM6=C,Lj>ה}Y^?{lں{} aIj{wѿr.go\+R&xBRSS"3ڂ88±gA9AngkvPr,s(@gX1AW^ɪ(_m  d+յ@OgYFٖ [/2r&נ:˝ua %9JH8z(prtAi:ۗ#E弫pn L2g( (XqP"(A NHfVnB (oZʛwuuuqqFr!%=Y{k0=^N_Q $@ Em&KG./eΉy18%PH<=!%<%i\$9 2JF%$ G9<i0B A'.gvgp9QpH@ A 㰩CB.s~pfQEz(g)@ HFw"G19 |L0"t^G bGo:Q>go^10 ~8U{Z:@<>luD9ם Kʡ)94M{Juziy3r>(ɠ/᣿"#lLwVL›7 xDE|2@sSy+{yTlWy3QvU>}5/fcp$53` AB ́)%/k]5QOA7='@u9.ǛφCI#e *y8C;#!yvΥoDYi/dxx +V3{ u@y@Žczߴ~Ky,j=ʧLwd4ݙ2(;<9*PW8VGY2=M^r.ioD0]L4=vVY)@8r!~,@ѽ0g/qۦMFEGtEYCJ~UK u_5> <<(2ڻf +Y#(,z~S輱j#{sޯHJJ*RtU7W'sUgˢ~8\E}qihq_>T,˨b}-V}Ű uX`P3$<\DU] Rh_̐KɫW# ~*HW7fЈ2z7y{݅g-_"G~䫜[rAPVٳ^ ` z w̛#)P{ç= f;+ `q陃 z7nwnVonZ: Q}%A+woF7$7χJ_&ik/7-PlN^4ޱA`3NA֔_4__!AO`a0Zw9kgUQT|ґϟ5p]s nAq1utjcYiuy<8U߀?ܺmRKi-Z/[i,miI l\,0l|U>N;BTF*t)_s !+|Pe.{}rE! tR;=ǀ9T[QG51?duGnE*1HB)I\]ww=6c[߳[@.{s'P̓#@A:>">e\Y?$h*Zkzx9\ܗP Weu%98FsƔԮ.Y5 $&ECNQz41ϽM9M_uQ&9:=wTV薧G& z}V~|{<]%K#T=zo,u>Tw^Rr?]e\>$W~٤j4c.,Nkʪw1_d"j ABR7&}]7Fl̕":zfkJ7FXoM e<{C@([Qas1`JϾԥ RG.OOwsܵ紪f1W'4=/|P*+S%k`)f1fVt׌(N:(rĻ"Uױujc xu@S'Y!r]7/ͳs.k \T [jJNg ? -PϘ'39:yI| }V]za9C9u;.QG%&]U&*S/WI2m6Ǝ' e:N<B<#Z08 Sv7 쁇{}2)OY!iʾ䮯FڹPU)<=˃ ܘ[J Xe>opJ`F'JR{Fؾ̨p8fIs&/ڟ坙UUP $IRfH)lDo{oi97f _d&Rj٘CKywySrU w ey*++9r%y /^Tqс95qHلC|Ŋ g=H/ۜn J .2_o>&ԩS*OED "RD)>$D+DZGU)H" H(I$Oe,Ϧs=*A< Ж'E 82 X$ i9 .+O%&.J !g3{4L)" uR ԤTAIR2]Q?TTJG\S jZ]N_*"JQRbbj@ GAKH: pAP+~Qj5 ltHAu52gh9)sbA ADQD,D)NP8iiiv:w;YdRQ0nl((PIjfr}^>_Tk̙3>`팢$P" Y@A!IX]o[kn(=FcH7VTT$OAmmmvvvJJJuu5ܯ?x`CC +-----ӧ|hѣG51Hp8BCC!U nĈl8{ĉ~~xo$˦>Eb`}av`e4=[!qZ4f(/^w^Kݻr'J9F!޳C88W[՟-zΒ l?7q<85Ws]|__Q5{էwOS2Q2^"y)IH0Z LAnذ!$$D"͡ =@pWxSּU@puC;;g.֛@: aWf,|y@U"JGs3/T@q\ͯLp9Qpء{ fʬ;=j@<Q!],ӌqqw?%p8[=c~Rߡbe (:[YPxijO=ynx*D2Mx4oSc&g<2{:Գ熏m8;R=A<贴AC9克2'}˫VpD=WZ|jpgǻ9 r~p;ly^9۲!z|'555OӦM5k?>s?C%;N![\믌r…zg}fV5$I￯d7QިHp_:(xe'_[=RerZ;CcTJj[P`o,fs'BhhhJJnjZJߵkWtt44Z-qRUU7̟?z;MqN_F…ΝV\9wܢ"6_}՜9s,Y(fUVVZ_^hh4kł l߾}ݺuSNR… _}5A*++wܙMsaSpP} ABp=M2}}*V>EQUctn(繦aJTDfBE 1`&-w8=zȚf5'$##nFl\&QK3u0g껵9cp @v/pfÈd6>b~jr+ovGN<y!;u TW4V\n<ERS`2ؒt-ZŖ.D}vwgY:$?2VhVĩAC**+BLN?9fVw"qmC"\,PhC$ !f㒙q6@{+%f@Pj^)^MU[tDlΛ6A,$R@9h:ߺ9؉܌ dXt9G~/l8$0J@+ʿM s""PjaWc[ukK{W|8 iiiK,yWJJJ!O?4hʕ+-Zw@LL?_pÏ=jz왞Օ+W~7^?{,[VVVUUbx/v 1 /|X,W^]|#< #"":tPUUvڞ={FEE5kvլY?#,,rѢEVRjZmfO<'hڢE=ZS аsNΟ??o޼pVwaN:G O>dO0`S΋8z~!<<<44}7jԨM6.\_w'$&&n޼'zjLL+P(fܹs>ĉw.,,\nFaZ>aozL&S^^ވ#dN&//>k׮ݕ+WveN:j4z{ܹsvvƍ }Ѿ}K.2 ы*`뎫N?S7mՏ<y]5D|ouƹ,dշl-nxr=b³s{:￸ސ"Of.&Of裏f3b̚5r>..ǘ1cN8gϞ䔔1c 6,//oqqqW^3g~駟~)*+(.J2-l!1/kQFTن֣FyIVmHjҔv}fxbqG +e*M6EFF X{%%%fۼysZZܹs{qtwn/^{1 L~rС&M2 ?/^](X$l"6=IzK@/_^F[Uqݯz.T<:~IMqeǚe6OҢ5n;.Zp&sJ" '_ӽlxb;! C'M э*U4Zz1iǕ h4ڨf"+,9H8B8Buv%+/ZBz4: h?o)\7k$( S2hVޭ7.3J1M.vȥs]@)?rؤwZ%eDe)z퓤 1hDGyƯ:V\pC+MRsl$jhtr`譲_~eu늋CBB\pxVߟ={6""ҥKk׮ YbEiin_|$Iot߯4x>h ؾ}{CCC=T^^i&Iئt744,\o߾ovͷnݚQPPi&Q̙jjjqƋ/׷jժSNϳMc93f<ѧo_eD5YMLp䆎SylENS zN=g 2x AID<͛.^On޽<χ̟?y: 6 y?0<<2cƌ#G䔗]t9wƍz꩞={VVVnܸQQFql꧟~JKKc]5UV%%%x]vv}Ŋ .t8'Oy[ojՊȵ2+A";wGL:\ryR#ku:]8bU} $^oZsssVΝ;A )**JHH޽-ܲx>HˣNHH`2&n̘1#Gyf _|yзo_!$y !AK uZ8gʔ)aaa:t^߰aرc{짟~駟t:ݼyv=u={t?`00 ^3gζmevp8n)Sdggk^OutRzK~o߾~۷S._C͛5MxxxIII޽7Gߞ={}7oށCuqwq111۶m=z5k:vKV^Ȟ4(66>c|tϞ=(ln)t"6ViӚ4ibt:]nnnʕ+LzK6mڔicDQ4hP^^}_nhhxw_x744̟?ʔ)?ӛopBdEQܹwr'"p om~8ڥL3GO4 fRYN.וui=wLEQ:ll{n gyB\(|4n;~5kڴi}>|('N8~1cأG^{7ސ/IK.e.yO=sLuuurRB8&@+h_$|5 ;87|h'|j۵K=?XahM~H';.XWCCCׯ_VZi44V0RHH$Iꩧvl v޽l2Ν;dvG?ロP2a„'=zرclat?-IU$$ t}p! RNbZ_ U"K zkv(6 ~0vlOnm.!"ݖ& :5ԙ1aZ .]<3MHZBWf{PBN/@f5M'vKl2gF!p鲭Eg;: \TOm Q.z=qΜs}u'r׮w +|K\rW[v~vpR@-jlg~טܬYϷo' )싸.K/'Ęr mVH\+2O({9%w&w[J:p dDHx-Q9fx-[*ͤNm۶zɓ'y%+|cǎ/~۶my~ȑÆ -++8bYl3<ӹse˖u]yyy:se{oǎ8K/)٪=z0 _M&ҥKxiӦb99|E j2klХ'^I`75mNli5 +ADWsT&`Vz[jy涚jڗ_~9''W^.\`xnٲ%fs׮]yIDQ駟P,-[Owԩwߝ}w?s}G5bĈ޽{3I&n?uի 2x`X,:nѢE&M4i QWWG VZm۶mɌ-3f ]6,,￷ݻwg_~{ZVv^QaVZyfñ~޽{/^X՞;wn<ϧXyةS'AZm]]d03Μ9h̆ \w bG!33s˖-}m ;;sΠRx۴iS`h9s+233۵kԉyq1_AHOOܹ3ԩS$8qٳ͛7[u]111o;tsOFBD_zl$ vFؾsDH)7sdsOwaՆ=<;-XJp:22ˋ uEEE/^|$Ij}!X,ӧO䔕vmKOOԩ\(2vE ᣏ>c%yCgdbg' ; q)]YU^_pDzCF_Lɾ֠ѡi"i3; sλ[3Q;af!ۜgeejՊɶl6ێ;N xݺu#RGdZvСC]vr֮]ˮtsĕ_ݏP*jMXmU>c<ڬYJ_O6M8pRzӧO1/ƌXGɻh׮]U,Yvvl$IΝ;WX:j;wNA0]6jN [1тa=h.]ӧOg, DDDL6mPJ/\Э[7weee 2_~?N6-,, `ػw$I {*kt:f }l篭ѣ!ի۷gyǞw]:c'O,t7*-t.\N4鿤mnҤIUUU||<lW? dLJJڷo=\zѩS]vM<پ}{?ŋ/^m۶͛7gu02Ǖ}ӧ3k8Ddꢢ'O>#_c}9|3~ݻرСC7o>tի}Qf}ZUU2x`&8?}I(GYl>;vlbbb}}}nnw-{屿ZONڢE"QeEwѩSꚚ:޽LIIaחrt͛c9-,Gzzw)-&NإKԥK._<..=a<۔{LnbO)MJJbG}t?355u޼y<Y8p°a䐡///Geakkkiqv]oR {30e8zj8"Gk3o  ؏+7A"DtHOVo}Νh|޽{@-oh4N8L&$IrBcڶm͛7|:0رc%I:}4nr9sr7 dgg?LW\\WٵkWI4Z- z2wxI}hY ^""EFB￟&{j:w]ޢ'N(cǎePheee-\5;2&|L+k/e{c3]ŒX(**b˗/7o\f#^z]wMᣕgV`UJ,?s  ٳgѣGRRR7uTv>qXzNHHH\\knݺ}!bbb⫯}С{O>+V`p?^9={09PJW^]^^n0{Ʊ7޸@gB6SN> (cxEEE5k֌<}Aj2(ĺf9<1Clֲ>=C ;@iqEhd@_|G׿?(Av8Ѹ{%K ޽{̙#IRjjիW(JJJy!ÇGժU]v͜9Ygee}+W~B+7i#2.FNi 5^6sl(Q@yg !>rxѢEF- gFEEsߢE U]I=ўVE?c.]v`$L5'󙙙]t!X+Woߞռ}9s(;nBdɁ._1&NcbڥK˗իWdE=ѣo6XyFÈYW]ݴ䙃 M9Ji' a*̙3r>'I> /$%%7nȐ!III g:t;֬YӡCٳg3)S4kLjZ<#!!="vvי>} />}0f{:wlZǏO9sٳ}e&mW۷NkٲU&&&N0a̘1/R֭eY4jݺ%Kv/qJpU^^.6>Jn_tiǎ~'Nceeewuc1AhӦ|<AaaaM6---}###F#;_|-ZsW="b֭[:nmŊE1""W_$iРAK,i֬lfmny*p]z`rK-slB帣!Dr^ݥeVǑJ2l_NJi Bƹs{?ophuFZ!!!{޶mے%Kz}HH%&&Xe˖ziӦL ;w^~`7o^ttt更P͖gwq_QwA [ް}XQl=v~]~c+4cǎݰaC֭EQ|%d^^^N~m\ZZZ]]cƇqk֬iݺNKNN6 _~ ***_z饘q&MDFF2oٲsr_[?̼\j/^luk? g E'FW_;D "@bN.4:gZy\jTnĺS8i 8(1g_2Kp8蕒[zZ@HmVξRpM1R,ݸ4Ϛu6NgJWź3vtٳ'[GK,a4b ѹsgJKK,YnqqqCj4͛WVVΙ3_~{/Yf٢E7xٶ\pc!0y%K;wNYfՋ5ydٱc7mtܹVuΜ9瞛:uѣ7othČ(ロ={soXɄBžyWP85ݼy󸸸sj:L>֭[w…ݻ3$""y^+ԩS.\رcGs۶ng!lyKo4F#LJIlC*oWJ$* eA7)QJjqgF+ҥK P[[6pZ6^y,CJjEEEalͦ[t. 3> R0fΜKU6m+ 9& TFſش JVMb3BMXk78p`8x8KL9b$x%uI4J !wg:g5jc,u`:7Ϟ={z~ҥ,V!@ZLj{`Q>WYp̛7lÆ ƿ 5_we<+mx@AT|  <HyF@E\RK)R% x]]utTvP>R)*11 8?qkʜ:u[nر#uU 5{%ׯ:#9m=F?dߝ1 p PC#לAfmmg*9p C[8w Dr2.^z\`+'@<4tŪi$|͔bοJeq9;BRS̾SM#!Dy#wy)))y>>>^zo#-d<9t@K ]<$G,֋2hN\¤1r\cQJrDM#].4%ν,:Xvtͦ QE Hμh֦9Ő e'gMEBt ]QEeRYu'N H +c1Laa#]yNO&i viYSvlN)S!hޛc!JTnL& A]s{ĪS6XnZuU8Tuo0uV}~2xn`\o_ ]76b!4BRSS]NgBEy' ^(gj<d!Nd;yƾ0@v0>YnM`Uz]RjpeR,)>9^m=e J)UNey= oQjwB]ER$QD@]t&Rn%"" %<g&HUr}bɛV}Яga%6r)"P ND%դ}Uί[*hڴ)KQ泤z.UHOgՓ(DqSrBk且'$3.Ap~CpP%'G@8!m5}&@@BtPI8º铊"SBD < DŽ29LN Ŀ,<tPq'2KxY[ liEv$HDx9.;2(*Ӄ~;˺'iU5,*")GA$'s+vyߛS֯1YA\~V썀"G8A/gfogxT?;gRMU]޶26YM0ts Y+V+I?]Gcyϕ8:^z;TՖ7y !SPq>/41"Rk.nc>-e}*}BS*OlvVTҘ\u%b}bJq.q"IĕY'(8VQZF%0}-FpĭJgx#Q'pr&٘@ xBR=_)#KԤ^f6TgQxAI y \G'־-w:̊ }' xDITvf#O=6 A|^Ɖw[,_U|uBj?3^Nn A#AB`0  !AB?5 a7n=3!AB&f%V}^>7NO*M_x׆\u;j6X+WJ 83!A[{b$|cf^a 7[#՘0k {oJ|)t}-hi>K7un08Mz`jf_ kfX篟Y>61 ;m=iePbV]I`n?wq7xzzx3+ kE~՗Eo^1o>({%^#.nw9E.hbXJ@Q7uQkw/8 H,HwsFjoǐGA}ădve7p~]mQ{{#{ō/k~}<@0_ A2 "_+e>;K"Pț%OW:b+ѹxsŐ@uM=@@T>Eρ{o ,O55d'R.U+ߵ\}rb!"Rq_R)Fob^Ok !AafGJ?9#YPan4AKEH#ڒ?|c;U%!m}ػ-(2*W䫂hUjgB.DH %PD*)HY :TW- @]iVCyyUrJPM7zl#c(),!چ)8º@Y&Y gyr+Ye 8Ag1ܬA 3JBݚx:9 Z%O$1r"@#R 8C&PH@TJk2^UxzcDP "Z0y{D@/~kUsT)9R߅Au_Iq\>x${R~I9 g=n"UlV^C ɈA9ABn\i!D$7jf tI~RP]>|Q | WDQg6{c ޣs),g]Y[>m:%u)EEiWyeA*fB<^q8+F<+_+Og_r9ByGy9-!2Κ$AQ H8D-Q`?rSxh4;5Tz=W4Yn7C`pp<GN8d,]L ky !Q絔C99(MnQ4Mtu\ "E 6v-#rx\RA`uxƨ;IkDPDBIli!@Pz@#)&qJ4wUf)k-lU*J+"R98pD tG)ecKĀˆ,7aR]m6ç\jej1-lja^ME)ORSSQX,_U6/"q6m:ulVYm%rjoܰљ[ qgۿ˗fҬ~ג@y !Ai ߄F3O)ܪ213f֏QE-u,I(^|-D}ghڊfs~~  l­"4zAYNqZXPX]Yj)E@fChC1k J]{,KJJ5s~fwO} P*1CEs ƒҵǢғB:twAϯw|ؑ5d+*1fHTTD(+)PYC/95M@9aa% XZ@pd $2{a2=% DESP@D QrZB9(8L5(l ku Hhkh $ԛ+"zK}_H)H*[sEĴ]vö\aGOTR4FDIfOev{iAK뱵8y-EQB,|UZ*so EԩSeee={<m}ݿh `q'!C{iiiiii>}YtG=z?>~eb0@VF-w#p䩜윕\ʃz_mOgBwuٳ>CByNp7s̾}l^`A޽m6+p8JLHpSkPeu8qêbVe[Xлᄏ_~#G=zQg|*\zrYN^`!O˗/O>ܹsr?=23knųfz'z衙3gΘ12O)ejթfddyA$ƄD$C /˝T>ٔ)uBGp:R"PNa n=8#!"$,O1pRgE6kzz•O1J&vtM1Nyb+`fvWaxfV ޿ۮ=Nvi5A [ѾoXTsS9nVUy +qVT2Dj6l W1p(%' i^g?~@h?[SBʊ:釦acax(s(A%`HxM<GJr3G P 'i@nȝJ/=lbЕJ"}.cɓ/y-W#H@"O8p;..TrZS@_Ui/|`ҙgJv.ΗJtW 3ϥ X{@G&?GVpH f?x_л.~pXrddӜѕp!"8%tϙb sM)5L.\ʍ[V'|RSS#^z{a - .=-Hpsp8T?ț 3fxgy^xl6;?44TѸeO>h4^x… :DQ7Kt驭-)*R\tZ溺:3|U;tEQd;ѣG=zUaew3;^SS^ADARΦTTTxhKuy~Fغuw=k֬xp Ǝ{=(ع+u|իW{ׯ_,kkkkfPu'=6$rtAC**BmH@bɞ,9 y Z(aH `:F<=@0]-Yv>X:MݦMHGeeTGP7+2f4򋵽ӘҸ yDDOݭ[%rMeٓ MΟ1=leJOO{l?7Dv GˏQ7~ϟL._n".y_翗}fDzxO}X)@QRxF\vm $''+Z]]4aX]]\/rڵn<t(!J(8fZH)5ʭ^cǎEFFl6^:uZ~`Xtg}$be2\ޅӽ풑O^9T8/@I %^b?=|4qDpN&Rj`Z3 4-ZӖ444L&OFEDQ4{!EJ asf*<ڭ[8&@h4ZC R~`hAAAbb lZ`СCF.]̚5G%KK Y~޺r |W^://СC3f̐ѳpʕ;vZUlӧ$QIɩ.WFaGx'7;ABnd$D4L#<ҥKe()) СCUU՚5kuk֬ٵkWӦM.ٳ',<0̒$Z,m?ms؄'O]VG%w&d4,Xhrss:3gV\i0?:uj>mǎu𰰰=zƍnݚ/l߾}ݺum۶mժ՗_~Y__ԓOGGGO>o~29x:{&Kjj / ĉ;wrg}jR?4LL[o95goʕ+v}ٲeiii'O|y_x=ӹs眜 6nݺӧω'ٓѹs3g~zkEEv{yyرcnv̙?xAv,V|حk׻ޭo*&#d뮫<]78/5?ud=Kמ?NC"[niē$,;vղKr n//u46 ŠqQn裏L&c^z%8r_VVvw7a ===999%%e̘1Æ ۸qcV q3g֮dݺOz=!@x734Jϧr[;W@0C[x#Cl #'H#zj4P5scFZ˥d!''//**׿W^}uVVVVZZl2_;wn޼y{f58p`z^ (mٲeF6m[FX]]=lذ;SB%K(N1֣^&B|˯JK.Psɸ#%Fw2ڴ<&t擪 n9ȑ},_obα=r!ZS|."!Ik@UMvKWfR!HQ(++Z/^p8O$e-1b䠁L><|ӦMѣG~&K… SPPP^^6o|֭iii7oaΜ9z`0ƪm2J ۴i˗bcc;uYgϙ1㉾1ͶRԜ oӑw p5C1d_+O;5nݟ7'ӿg}W^?tq!!!'l޼cǎÆ #<3+V`G]QQ1{ԍ7&&&͘1[nܰa=zҤI|ٶm[ZZ[otYm6uuu@NEbŊ_ԩSzPZZ'/_BsySSSu&ǧ XVa.hڵkӧOf5d0v{nnbٱc -..NHHѣ-ܲx>mXUU%l3n̨Q!:~ ![~Fcxh."3!A_ʋ֭ӧԩSecطoߐ!Ct:݆ ƌ???cvv?j͝{Lݻg`裏4:`Agнʫ۶mk(Z-tڵ9s :v;PJ ŋ,YaÆ~m۶m}9}˗~avnٲEGDDlr<Ϗ=믿>s5ܹs8p]w8qK.˗////0aq111[m?~5kwh'+M&˃ 4E``Oc0^yPXϕݻwOʼ<:mڴf͚YVNw…Ν;3-իW;v;4kLV4{onc{˟Iuuu /{UU۷o_paXx t̳t:ݎrKo//n_}τqCsO'R@ФfX$\sWXh7J(/f8z}p7|]dνW8Rvrk #NM7IG4hȑǎ[f !;rHD]ʶ%EWUU^? [~ӧxϟ?=z^y=]ta_tiǎK.2d Z ;wܸqƏرcǎt:Ʊٳ'!!ro6E!gOys 97e a Ts)[V"[d~- @IN}CW|^.aQI[64, pV17r[bkC0 =GH辴+YǓ~/q (Ek7~HsԳڤ. m;S"q:54^6^/yoS+DE ZHCu} ^Z0{^q= m#(n-|slyۃS_Mkݙo @@٧ g[sktD6JZ~u_ڽ4//"j}US۪_7,X$ҺNJ*-թ= :@h==,ky׼ys s<@tt4|iiiIII'Nxwu:j!s?zhAx~" >|Z('<(-?xmg:uX^V{uם9)9:h4ln֬ԩS۵kwa&#𥧧+)y&iɒ% 3f`R!>|ޒD#g.1f @,J6ZZ+io5ygCZjɒ%Rg>yyN/+77o8.;;Eaaa˗/lnݺSḼ[._<44T!{3tԩޛKHH0׀  !70X$`l6 9s̄ ;F1bD޽-[ϧyHj%%e]tEښښvyp˞H$|ᅢ+Vp:,(BVVW_}էO]ʧcvvvN !1N;wFj۶-3#|WǏ4;v.Ǐ?sLuuMll, 'qGdL$ӳgO ` ѣGyGɄq;=gj hu8?@t GʇiM3u/< m<ݥwyo d]4&aHu֝$YTTt$&fXΜ9[^^^TTt뭷[Qff&/JsС:֢E yyGyD#?v:I4p: .򼹃^MhxG,rWqPNعsԩSCBB!8͝8qb&M4 38.++iQ$uڕk٘5g,СC9+--m߾k;RRJ=!I)}g>|{ @W]֗6@88ICښ#'ׯBEJؠSDžDt0qpRp45־F_rh/^2p0׎-8u]ϾVc.ؑc` eeOˊHAmc 6TaR !W6tkߩNڌuҥ&}z T*>zĮ…r<5=P{l\do[#LD=qogkGO'ґm"Dž=dD^y&-QP5fM k2KvwL2XI>|y\]]N/z1x`3gΌ;VN=c̥3&:5mV^QaXi}QJO, a2[n 9998y>33s}֭[pDd#{EĉgΜq8ʔk׮eǓIII1113z|Pqʕxqݻ;w*JyEի'OffXR "[D~x{nĉ>uf+_ycoҤIEEE˖-z^n9#s=ɓ{ СΝ;N߱c144ZxqBBBHsss۵oDYYG>}!)I/))kݪɂtxƓOCBCvڵwލ7߿>ihhxVXѣGM;wntSNM4 ={zN7nܸm644\paʔ)rVZUTT|SNmѢEqq(ӦMc'vСG}ԩS={$aC)r,<7o޼{; ФIduĉݺu;{o|xvEرre(0 IIIPO>2\gfJV[zFq#< =(Phh0@z=ftֈn:EӵC@N9rMq-Q"g=Z6xjگG);h8'iա^kܶH222 srr]s%%%>hHHȒ%KwLY$]x{n*q5-+KϾ?9I3JhxB0fg5m(D'.[PA.YE>D$uuŗhȻr\6l8R ,.JsM^i-P3^,ե} y#LWʍU=wIIɑ]ҵ3&R}qZ2YaRxƍc, ^>}^}Uf̘ [h?o0a"FQYpER\E^j0KNfffrr : !5DAllL Qq10Le΋iv˗/ڳgONNٳ iAHHH8|ݙ.4'';`Ueee5Jr9|477wС!!!$7NfZJ.q$%%:(‚B.]ԴiS94Ki+#iӦJv]'"O[& 9fVVѣGWZծ];&mg 2gQF>} ٱcɓ'ϟ?)SKٸqoVc꫟~޽{G\\܂ >l2wesaa =,++۳g#> h|Iee`x#""qvABX̃ENNN>}:(C[GDD4i҄=9{l6:Rjڬ6AoZ]w۲eKBBqȘo:##CGv)99lٲ3ND)ݾ}{QQU mݺuBBV5ѿ{^eh4#66رc SG;?;>b{̽HH A4<+OT>AD)>PPQX H!$!=$@n6[s~ݒ%~vΝrc̭R6gyJ^zmvVc1Yɹ_ibcuL <3\Y,;:t1%.}ܹT*Kӱd2UTT0WII;v]Ӎ9l6'kYYdX4mTTTBBgIf6yA[ni߆5o٫=:yot 9W9eqO4(!ǟH=4c.Qq!Yi_n*'G&j4 0VzΝ# 쳀62n+bvvw;Lk׮9stܙX7g="3)SL0E |wR4|A15kfcYT.]}fiJvqFVU^~mʼM&hF cG38mSk^"r*]GDe2?\7ˁg̘tSgΜ5j|Ν8q駟ԩӄ ޥK_|qԨQ߲eKBy燄6mZ6mMZmNӧ[]]=mڴh tؑL ==1y "##+**VZj0XW_|6mڨT*Yď?e cu֝8~n-[2 v۪UڶmX6"ŗ_^!0s2_4H* _bz_?)<<;mK/duPD~*6*dT[ey1>B?-Yn4.vdbd@@`߾}~믿< 9..nݺu۷j.]l۶MվKaaa:uꫯocbb7\diZK :2ZMتOw|yQȓU %0w0|m۵Dpxx19;裏1oxbDDD^Zjd:hpZ;U*W\Ne˖BMol yΝ]taIfT|XD(ՒT]_|*,GĀط~W^wq &66ȑ#|ȑ#{<^Z6,Z_~߻w/S%>;wW7K-pVJ(k_?&)""bL#=T{nPڱߠ> 7466Ι3RC;.@FЭZBU*՜9s &k\>t#]H~AZZYֳ!?a~xjb v# F*QDDZ[SWzf#тETxH_GQfX,eK دO?݀bZ+**̷Jn#"W kkk ًL.#f! 85HOBDLIN8f}f&uQ> FFsWSS)qJ@R(?TKS  F}hVVX_G]{*@*!JÒSբ#V;ED%*1YolDDю(5)YEE&sFO?O?kEJgӎG cMP[[P-Z$DQlej+Qzp1x*QuUA(Rj4""h08M?iJJ %Eş=y e})YIKYܹss!?arh呀AQDD43F"22AhA"6 n/"T!5v^BR4e;qY@)M`R|{o*eCQvDDC hc$h4ƑRJ͍u%( X",}$\,evDEd},UERɀM*/jmu(Q((ڜ)R'mH͈hDDK*-ZֱlXg(Ƣ6!\UDGDyT'<7 tM^W{0J`"^ohhhhh@DFf=;>P=6%U@ҫeFrn]rR1);,ba\\u4IlK)"MiMh`kJT%IDAs,&zz%A2XI%•cA>8q( -%Z H_a Tɔ:L&taPq"G}4w\t\J.x宲j͑G>}:[,5(lZs`oH٢`w҆ϕȰߍ7#ÑG>|G=rȑ#G9ra2!d1z$ȑK?… La-=g2fu_8wZ*(Ȯd}}Pv/%7RG`_3K%9 QJK%ϸ;ئHʽ@,cRQDSqDb:P>͌EJ3*c}GUDܾ}?ʔrͨ s=S,|."S`nI9/ues*rr|c+qJGIA>|Sgd:wau')80F~BBBf͚e0ƎnOf᭷ )Eq?<_7ܸ}Ի.X5jݿg;v3ff;vb7q} $_ka.O>,Ωfiꛮ466>73~饥LL[?I&$?~mpZ~<`04ٙ~~mt;?$6\s~f]_~tF 7~?~̓_pÀTgM\7"3~jrD5,9ü>lyD{}]W>RiI< _׌77WZ䛑me\Nq@T9CΩo5QMx1*̠}E*fQr5\I'nkޑ&P\hRjҔ cNVE 2*;\х rTp9DD.@[8 JzL{iTmș\Qt[J%>F VNw[R|9-'i.4|ʛ ]g]H{[gnL} |ujam9>ͭ?7Ϲck%ͦ4%W .y2^t:+Y~3_%C[]:yW\^SWىVkP\vpnB>ˡprbgXm-O!u]vy7dc2JҬ}9HYxoCUs-|ޑHq6H\PtVuڦIzrǒ&%KXd;3qJM y<=OD.; .fQt>wpi]FNصJᣃNz|B;H-@01gF!#>$b7P9MQ:_P ʙĒcDb}oВHЛo\KcD.~k t8I['}(М/WߥѭK-5S|[vEy4C7JQcҕoj7La@ϵV?ˁQ鴹_rNVOMؾϱܤ 皣K3tm0a)R#҈ 4$$.xܜE-Ǟ&նJݓ9G.)^eIjta-齛T"0yowtI!Wzh-6UCDz߳n|G̙8Ѥׅ@B;fC.r9*i80D81EyCCx}8ZXRPTO]KB!MԩhXiQ~Mx=sׇ9(<]F^y-[.u+uhqשA-o[nT%D 㗙?W#9۳Mx>qn]wQ#j+7"okEw;3N:zH4ɡi&nfsco{c[@Rx$NIfTYWTH:;A9n_}m[h| 5l q7Og.0&MȒ*]uwd&4+i:LLwVԞ%*Mr{M8&45D^dGB%7yn*:C]<22hU칶z)~-1kNzb5(Ͼ)>E]_f_ >Drkhym7#+BC䦔BB:]{cnI bBD$سzvZ0eRʅ{xeW ]Q!$*emYSFC2\G.됏IEË 9xTB˞ij.> ,NjPs8 )+мTk+PDsh DXWeԄ.tGX,^ٍuqxmR}U~E^߸n ܀Jۦ N$I<+fVʺ~C94iӚqk5? X g I~Q$OײdfIx6絟ʒnmy6f7x1@$[Ss8 }`ƷCf(\.MHr IT ?"#zN D H(uΐFx PĐb4Xf}P(z5k"PD3T6BmV4F ( Jr\7q>RQ~REBe#DBd(RA)!PQ^EE#[j QrdsSjQP*)QZ& B p-"1:l8*M"ma56skJI?nefEy^ "[nYe A?%%Edڹs?Bm߾=))l6_f ~~@DOWsWLfvcc˼Iϕ'<[ U%Z>q˗766^tɍ*\M P.kM9eAW.<e.dU=MNNEQnZv㡄@* IXٻksWݱW-^ܤJ$IJIIIKK+))Q%INII:녂Gƛ/WV7nܸq׬h4@=:++Q~={677wƍ7npAaNJn<1/jZݚureMu9rѣnjʫT*9:8$I{ qrz˕6‡z(%%%((HSNeff6 V;wٳ{?䓹yʘYTd6+qX7$33BPPΝ;epDW&P7Q C\:9HS.@Bp"e絋A}> .]:xI8N6M+TU7p}֚>^:ٞ>G9ʾtɗ_\xwƴ ^og>ĥ 7cK 3Yeeeʨ9J)U*8?%3 D _}~ʪWWnIZ8T! &pA:fC2sI5o8opH2TXK |dz{/6#Z(;{[WN M<:#@ccc^^^~~>ϕa:yjj3^|ſ/DAV!V/T*VReόrx9syG}3Lr@kZ#ANt ԁr3=h}wZ%?NepExMSrnހ4L8}?[1YV>ܰaLlEv^23't#qt LgB 8ER_7l54+,fC%`E !R?q(R=z˖Pj HvSҍt|S[;;5Dh۷Un-I< #JDBNU|k?-[Lb{Q[[ju탃###%&`ȑwqG@@_u;sSӅ-_|z^Ihhh׮]_|!C0A7===33s .,++#|C ٸq˿K {Gy睋/?~'铑Uqq޽{YZ6:::9999960?~qP27fxݺu=XnCYYYHHH.]jjj{>}"-[ߦM?#00fŊfI{gΜyjuIIɫ:vX~2{߾}KǏB6mڤ鲲C&%% <8 @(ƍ۽{wppp``s=;O>ٽ{wttŋ駈}qqqQQQ;v0 O>dIIIxxC=4pE! &)55ٳg_TTuVJŬ(obaʕ+YƂѣG˦>SNVuڵ.\HJJzgT*ʕ+O޵kלO>$..ʕ+f߿RRѽ{ & >O?zرӦM3LIII'UYO,˦Mw~yV k]g;Z~W3C-$KCUz>߲ôʿJXg]^~ S}Ӥjݸql$b̝;;FGGWTT}Ǐ?s٭[ &92??۶m111111 ,`s)RB"!@ʠ*;Kr?Y1"5\ݪ]~QЩ+stkͩYkRsj=T/$x`Iξ'*͊"*qC5i.=3駟jժW^СqEEE6lիWyyyyy[oeZwq…^zo߾:ru:VVk3f̙b[h4kjj~]wiZؽ{wzzU"GB>`K4Bluo(ybMO][ _}Gt!J-Ϯ-(9:2&{:r{ Ft'h_{&(: 20Z_f}zr@iHTl 3nJ8#mS-gNB9귇Ѫ 0pD5sNGmŷ%hޮ΅Z:P 3ԟGZ6{M(G_ֈg*{-3nNRcv?եfj UkJBRdH%] ◯0Zc0oEuw%9MHh";4u(UX:i,, ̛7Ou֒+VtAVϟ t~rݾn:I^}UA.]4sL([o5jСwƇ~r$UWW7nҤI&i/**|7ڴigϞO>DE1nhhg駟 .J6 ~bdu$C`Vh0&ѿ)c9*iZ{I\0Cw6Yw{9sfoǏ8. _&رK.#Gg}vÆ 9s3&77jݺuKKK۾}{\\\ii9sS]]KTUU5v;3}zzʕ+&dO}x^_\\:4rHVO05k֏??K߿?jG}L.ZhϞ=taϞ=jMөS{n֭={|7G˗W^8ps\#!dΝ**(([oݻw/cǎꫯΟ?/ptңGu]ǎKLL\vmuu)SxǍe˖.]M l6 "sCܺuNc<dPZ 4ۣGIAAl~"""VFxbBB33c-[֬YӺukf$iȐ!}Yx?O 7|ܹh\tiӪ^{-44tLfEQV}$'w[~#g ( Ugf9 ;޻+ n4qUpE_=fp΃[i5~;8$:ç t%xw 6f̘3gl޼m5j(gΜ9y һw%Kꫲc֬Ys533`3k" ]%}%  8[5Vḧ1 Bڎ_{=l3ƾ4/V0"@_ @DfuD ,0U]]y7n۶̙3{/iiijz̙AAA(t:JҥKz=z0Sҕ+W8n:BҥK ,/o)RSS'OʼWb.I54;њ9䣝1zX/uM@ "hCI6-|KMv޶_.t04TtBb+t-vjЭRiǾR`nҬj=N`i${]AAA홺̙3Z'|ճgϾLbxO?4&&fĉft7|}zBB‘#G͛y222rPP޽{FoO̘1;v+" J-q  e\)"$VӺO@O?WS ' RtMX~.WfAijgfddjzzk~~>[nnnv혵ѣc=&I(?Nx뭷***z{8?%Ir󨗡aȐ!ڵ۷o_]]]|||^^;4MqqFtH5&CQQyc2Bw BFDD0 Sc(2lFy&<r ϋ/h4YYY:u;wvmĉr>ݻ˫9)X@sd$fK.-Y8E;w.77d̘1LLLLߕ$)77zfmVYN:B!~@<άg ho `6wLl;dTǟX? #Ui:ր+͗3D,pwFaZD&M*8.''Y}1܌"{jl#F@IIIΝe |cGQcr+ΧG>:5T4՛;xjS/|H^U)o$#)p(jsџȇHA**NճZP-u^uW=a}oJ|ԀwRP!ڌs X4bgN5Q<c4!3#wwt?j0 0)PTXY^b:L "C~2Ik5}⾠ꣂ,rﺏw7 IZɪà3i??LsN٭յQANw ~}[>=kI<`1.*'s$M:^z9C('OLMMX,O<h4?gϞ#Fϟ??aeU111fb2#6mTWW/bƌjÔ3g$%%63ѱ>>>Q Vrϔ$i߾}ׯg (Tnݺefe^V"/'U f˩1T*_ݭ[o3z,$[n^xgϞl1byϞ=3f BDN<ȶt=eƐ-[h49xի;wf/--e3{.UロtO%?+`q7hР˗?3SNh^,Ba1S%00i2|A ̩cǎ>}: @ӧOV=B:w{NjժUVuؑ\!qegg>}bpPZZSZZzG}f?@>9V'`Q`sέZStܹة IҨQz쉈fׯ߉'fϞw+00p߾}ǎ۱c7o0k֬ 63556<<Æ cLORRҝwI)=yڵkZV0aBlllCCŋM&G젊|vڕ("ں:&8p`РAݔ&)y2_t[n3g"he0"VTT1vҺwL)tɓYLiX N8vȩ=tۉ$T'@ 9M,,jէ$-qX6Su֊"{]UtBUrrxN!!"i%ڊsyl>E IƬWFAP8qFM`Vo qODЫGPbnYχ5E8"I#ymbu7_M"`.*@6  <̜U^\S0jAJ '$-]m$(irBh߶OƬFOmدYnj' 0D<)RWʫё;I#]ۈ!;;;ׯ_߿KT'|_~жm 6}Waʔ)(IRLL5|;m۶-((7LC $)??ԨQ 7qDIΝ;tRe7y9~noNNΓO>䜒ZtYYY=z$.07A(DvfZA%Nb)8 5Ѥ ۰aCFFYxqcccQQQ^v;pKOOgJ.^8ydfΞ8q"'C`vve/^8bĈD&q=כ݀jZrf-))a˗/iF^W^뮻yJiݺ59eհrn]e8PNzWǎ{ܹ^z1O8QZZrС￟f`JBóW^zK/mݺȑ#ҸE;v쭷RTgްaÚ5k";P?={d˖-:g f'?ǁgX~aأ撗ںukVܹsCED2l0JjX,:1$$o߾:t/:t\N4Igffl'Ovڵ{<ϯ[nС,$˃?3d[t:]]]]V8лwo4%cڬVkddٳg~'fd5:uQJәiRPPl6]5>B۵kdݞBgcbb<(3Ҥ CqqVe-466BDQx_[㩭Rڐj )h RفAՏ'ǻdvt>rĉWߔ!h󡡡,]vGl}&fWWWm֭fj$3lCٽ{wf...ܹ3p޽ ,nvd`|E_ xVCG"PRʂu2Bc# UZsrt*~X5}Go}b>Q/޲pa-n p?KϿr„w(J- &45C7Oێlwa9+ccvL.,鱓Vly!W^ׄE[`pPMkRq8 'Y ) zqu]ta檶A,XF88Re11仈hS h 0KPH5ڐrSYT`g_:/AƒGaC8qa:oM̎}ge =?>C=ԵkW2qħ~:99gn7o߿VܼyW_}$޸ɓ'7[n7o^LL̩S L`]СCիW۷_dOUUUmS׿L4}7y3gΰcwuy;,Ӈ*900uWnժ``'ܹs۶me#"&$$|,LVƎaÆcǎIdQ믷md2b|o" "aJuX v@őIN, F Bn~T߻-Zk<#w誫7_2Sϗ.;(e+[UV1Dfr]~= Ō-۶mtK. ܹ_~hXb99fYm6^P)TN?m{K.՗Զ:2 a׫}mڵDyob_?Сgrr~~~׮]Y6Voa2kkk۷|rD;7ohwj?/VVV+ ̜8qfgKk׮DƬ798pVRҥaG̙An81P2qzL^@['f.^a\)˗cKD-[FE]\Q36rT*U[ Uyם<"DvUd?AWojmhHI]AI gt}[O=y31go] "$M@C'?}]xiM~Y55hz|DBEQj=.+蝠nr<3"993O?C(y'^nݻ7[GWfaѵkW^wnGGG3lJń  4ol.((زe l׮ݫ<YEĻ{F_|1##CN}2AUV]ty۴idh4#?~|۶m[jf͚F&rW_}%k-[H%&+P`yvŢUrJŋ١qkm۶/Jҥ? :uںuŋzns,//#/~}-_taG*~AZZY77=?RnϭV/"4T2cKTVVƘVCmmmEE3YefYJNvbvz}`L,5!wXURޒ <գ*Ր2qDVRj2sAUhX***On 10Ln2UƎ2X?Y rymm-CjEQ3"ʳN"%h#VhF QDTB/_fD("mQ 5XXXjh1??sҡ``PBL9EnjAerܱ6uM450DS(h]ښR[T/B%D*5:aZA%ɥ!' u'S YF6M^xޓm6 [e8 lLcn蘞RMD" hC4i,.*l (("X-R$l@hšw^g`+*Iۗe4*+ED4Uh7P6F4Q3Y)ZZ_S^&cjDPr[X&jmVAJ""#"ڤ2V_(2@ZVP֚ҊBDH-hDRf9pKJQ(\YZu(Q6 %)n#*J$*'T9FYYۚbOmhR(e-^z-*74ϯlk1AV\fSv1DO155uĉz\JXpd׳K~iKZ'ՒDy^^ʦCZM͡5Đ)fD!Wy rq#>hܹ<< cJd6>ٷ@N:#-u5BIr&y~[n%55e-VBi'Q>kvC\;ȮSpJ'k;-a@8dMc ljnׯ-붬&(}dpq{JץKΝ;'_TM>-Gdܲ:$Dn}OetB)}gZ X7ρ0`3>N ^Ylzeo!F544pp\Vζp?̬=+M_) 7L+BZ*18{lQQQ~tҒ+w3Z|%ejABj&7'}sJD//1 ᜸[8g %+M(,?6yz VkXQNK^9NKy((8.q@Prh,ϒX[[[VVRbbbXk*2f깔:B`VDthU1( Tv `6_*8ٹD`B0D Aā#v]>WLf=a6)Os ]*Q"@G!&iǵe D-"`S1 HEΩYKL'wHi% rS)0(#*grL.v~݇TRJo< kԡ QN_w+ǝs*`Y(C: 2$xJnoɭ_ٛE64O[,&o_Sm1;gг=-۷L5 .23۱2?~)(-z]`l:_@n\Yq+O}y* Du]DK8W&*29,x!LDTni.C5P92kqdKюTC$q@"Pg$+""PRpoDV'ᝤ/pe p.J8^ pVxP <I@(mrk(A rh2u]9-x>/^u 4nEitgp8^B\un":{M@1 Fs|YOcGO #%brrm:ݔ9&xe'x(dcVy4* 7>W8pl$B\ {S7`'%t q cVˀ99 Γ#k&#KOd;'D@@Iƙ8C5#r][#;>sT3A::y[=Q4@p]5+.9uyJ>s͟>!WʒU!B!:Brd:ux]7{i>J\5@YflԳT\?=+oCʇj$^j ef?NuA-䢮Yuc;ћ?yK܏Vs9S|\|*0{ HnܤSCs  Hؔy9:]x`re1T|'Q-Q\)9˭㫜wU 5#c:\o)<@F%h[|hU3aL\[$ /NV.~hZ:dq$;GJ:P$MRP0hUXsp+css2Eގ*>pf{߯ef?@l,[ok%>G{ݍQޣ%f9lYՒHӷȄٳFI3?*_vfaeo]חmCST z6*Vi$!_ QJdHnq*0&˳ea2CBK|d$RѳYRq<&A9r IuSAܨOtk*.zP-,Ora:>'DVi9>c7Zdg-|xU(ꧏyBKdſ*r.ђ'GsyAyENKy-] ):cjqGG7bK\\97{*rƯ΋\7Rpv LM9:'Eq Y].d+S47o>iɖҜK +l_qs5\Q7D@8;uzoЛz!_-92'̿7yn-vk7@j< r`/m_f7M˲|{\v$1-;uISn,w}{9>R]xc qf*4nr;K8"Wڂ~X5u+!"Drx!!AJ)p!C@ F|.P :i>5Ue]%$"a#qRٓ!`ݘH6(FQ ьKt#({@3ItE%b ;eڴ"%@FKP5 -KJ9R "PS@r RTW5O`^dnfYNV[}KZW}w.uܬM _E@{dohXf`Q^Tn7WymMg-KK0[mD[ʈ33'e\9^7]7q{rlq3~['7 )chf 7$u ,Ӝ)̴;e9En^^XrG.mNx&4O[bU6LPE@@ )|CJq 8l9y+9jd|XsxemȂt!  @(O]suD@$e۲W۰l~nOS^e24R>gp|%d@i $#&:@(HINGN;3SS@G :+" E +¨bA(6fL 7*r_.f m+.WdVD3QR@eSLNњA೅j7o<ᶅ,$InguUQ|J hnSK~y6O7y*1zef?~Y,!D$>y|ӜC9v  ,ƾzmJ5͡- |3IsID8O4啸n-7HsvmWS;]G88yU?8P_õW9FqM4HMMk6ͻv矕<_ww<駟;wd2)v4^juȑ۷7w7f}gsΝ;w._5p}旙?Tc%ź=gؙPeW nJ$"|z<7wMPUUUG)((ؘ/R$V<2nYb),,, :MdSqFz>m|s\lNIIQR5/ާ۳9 # q@8xʢTDMZ,5`$)$ *q(+h;[h4c.5we'kgm̔v&3NoD*re)/O3y#GzW (Ar7(جFـQrJbTQ tx"Bd J P:ƩʣD( ƆZ@䁪h+(P0W uP P"=]?r$)--_p'&EO;ٌ_y6@rrnG_. ;0" RBk;A8(&QRSSKKK 人:h b^^Ç ÿò*OAyyyyyyh4ƍ7n;= lۃ<|keYYYʞ`&%%nܸqƍǎk1B~pOC9{ @1L˖-[- +lەO֕kA{YVp1ebi8f̘qƍ;VYE@Lfɬ[l5L(PXXC8H=~7zk=CXg&(q& Ю]{έ,I(IjmhhWٵmΞן91?q!pT_IKRR!kjtl ,}-99ڵH3Bȑb4#@((R30c_[?i;Dph()Λ/3 Ge'VMC*G?>y4;38"Y'lKkp 2#x ܧz~)쉇ψ$E)>׮=}c9rnB͙1kO?D7"S5|e>ǟWJW.GHւۭ~ɺQ>;5lF ")BıcNJؽ{wbXjkkHjdVZjZZ̙3y?ޛc={fHJ 7 l#F;d_nmf ve˖1`0޽y| \ry^pm۶aÆmܸqٲev=c7oxcfϞ-޻wﴴ4߲۷hټco9f~ÍRAn2׮]cu]YRVVPSSe˖^z"-[ߺuս+&I$l{OVXbܸq AAA 466/**==}ٲe**//رc<'''oܸQeggC IJJ2d31sf0aw}s=ƍ۾}w}?FDDݻw֭yyyQQQ}`3gNiiiXX̙3hѢ0f6SSSyϜ9>HR16L(rj*݂QFT*?SNW^lk׮pBRRҳ>UO޵k܏?CEEEf߿3g<ٵkqÇm6[UUՄ ~Œ݉\ͤoD3!qj]8(?i}}AdU" иbn[V 7lm|"paK(Ԃ뇽Bhab5pCߴ..!hݦ]6A"Y7Bâ IaWy{(%pk;xk 5~Wү&= vb")]-_1 Ykv%5D6xAK-5Tj#5%sҚeIvv?//?$ hٲeZv)))Z*((ؼys@@o]QQaZ׮]kVZe ~a%]v̘1C AĽ{GyO>VWW7nҤIFq/**\fMvv}…;vpBN CMMMǎ '\rEGFF&&&:bYpٳ !2.Pq\|FǍO?srr~GZtt6mRLj-Zgfev={v=dffv߾}{.]x JN|իmwIIIW\yGѸsNV\YYپ}qڵ+99y޽}:LiZI.]O2;!"^r_}75Ͳeˆj^lٺuz Ҡ;cҤI5C1NB0 {@hjc K6F ^*4dpx-O[CVI/[B{ l7o"Ft{?6L~g'83d liv#.&t1-AZ+GR™3x(&L%N' 8uɿ6t! aszRCyM|@("990T\_DŔㅄ7VBC% H<  _\岼ޏL+999Ǐ_r$I,%ݠS}h3MY*Fr ݕB37o믷oߞ9ٳg׬YVϟ۷o߼I&BڵklW\Zzb$IYYY{Yn]PPnAŵk>So=æСCsq&d2 :4""b߾},,.RFS\\*ܹsݻ7ZրJպy;vl۷3VpرcyOIIY~=@=ZWWWWWשS'eSRϗ0W}S;w߿Ϟ=e"772ί\2cƌ֭[@@@$%%K**;;cǎ&ڵ[nwqܟ 6D}>p PXSbZKԀ4ΩyW]hU!]{HMs&NvQzg8#;)pw)S̢4 _~(IR=ظV+W- 3s'$${i4;)-5UHD DHv!5 x V{EWD%ԝ<HD"PӅ4$$GpP#m޺}gц1?G0ZܹV#:<@!ȃ Y!z`Vwjs#(pD'HyqwB }AH@`?|Clp1S*^'AV! Aok㆗fI[=1=suump[[k;G<1n&g%5uQ@Sɿx@@=2gG@eeeZ3F3Ǐpd}'@TUU}g{6l_~eyȈwкu몪*W_͘1CV>|Rz٤$B._>ӧO7LgϞ۷oPPP.]wwB.\ХK>00pժU+Wk۶-E^^^N䍚ɓ'~aFPVV]^^~ԩ{^`?kHVٳ{B-99^8nʔ) W^%ȑ#[lill5kֆ zZWWצM!CNrk[8qbǎFc~~}80QQQUUU|۷o_RR"I҃>*;;w\[[[[[BdaÆ1pRRR>}*n^d-]t֬Y,=2uvvԩSY1D2eJ^W^~z0@NNSզ>rADɉg%ys/+ !vxQ#hqqqR6_<۬6N++pxmh *&¢M PAz}5$;{%p?r6 <ìFU$ih4٣Gf󙙙?<5//^,(.]ԭ[76M**++$xnUUUXX$<\.N&0_ȑn}vOMY Jh׫R-[$8F#TUhWtF%*9u IA8@@Byya@j5f~[بNÉ/+jX>g[$` Bvp!aǟk;.V %(J!'M8)<"vm;?h[I;q(+:ƗF5Bu:3,@cccEEs$ѣ3g$^9b\|YlȐ!ybȏJHH`80ݻ7..Nf}֬Yӽ{iӦApa@, H#`Q'G8DE8f87 8~JPZ`TGa}a#<2x@+!bA6㸆}ZC-ZHŔΝ;JKK8;6nܸ˗//"c@srr>7wiHgnZjȼ|׈@VW6ڵ 2lqZme;J'*>u#UT,BCC;tV ڴi@)?~<{yֶkOLLL~HOO֭c3\/rJ||4t8QuPj[ChP5/M"H@Pa 2к)?|엀Ls. *K6뗟|@cPTpib#),<^gF_k۩ '46ttrsx:h5y#p`ٵv}opj  r+5_5֘p/.L UhycET`gi^wxIڍ[zu"~833sԩ}͛Y]v͙3iOথDtڻ)jmW8qދtŊ vEEDDDEłů P&vmf#(,#l&d~7|+ؿa.q}󒒒ݻn9QTXqܸqbXm6(M4yWDU-[6mHxv+R

8qn;vlJ /\R.]L4)--G%~>4iR8Da 'SG=%/P*g΍CR d:6n|}6HwezKjK8H˺ nڼK;Vv[rn/ szQV-Ji:uMf*U$ Fcر)))7m$kժ%gK,ٽ{ɩFV$!Lp` ,gه<~/~Y˹:VɧEΖ3BjR(fLplxWOsέ^:!z{ål"Tnnw}OBkl6?޵kɓ'].njSr;v 4HǏWX4ԟ?~F"sE},fѵ ((A Nj~n fӥᣏpN֛>Vˊ*]k 7mЪˆV憗 Jpn;'̊3ZȁxhֹSZM{p@["tq& JK:}PS9yōG*Ad\;XVU[dm.ߜIHEPO[y pTҀ 3>Fm]1ѶmӧWR#:m40GfE9vĉԩzZvs83fLN x<8{li_z'|w I&mܸQJ*=zBMٱcW_-f` 7n;xšɴ2qr0^w}wΝ\W,_|[3* 6m:LL fd^z"%IDaEO"Tff}%9rЬ|'NTc쮻ZdY?~\04M|??r,XˈՊ~ţ%\bzf +]z^SDJ\Ox*=uTAAIǏ 5XG0hNN H)&3q#rθ#cQۧG}:G`dax`oI:"+A::))q_}H@y&]TT E֙H y4.pD.DDQCDt~ƊwȽY^oh"o4q~i"!rX17+-\wa<yyy͗œxGb8SSC @ukBqO:G4D/bxWK` i#HXŜ?rez }x'"banqIԽb!2,"@@qy'y1?4<#L'1,*̏Ŭ<'5D40cQOIn7̓h@9:uD,FD3E''Mana&f斠EC 3/( 1?-1gz{>>-%؉'"&.flg: *qZ_g,f_"va^N R߸ac~/T4O4_I%b3v!-:+~egg[kO˸暫JDWcFA">Od4@u8Ν"bIIvbvm>,[lذaѫйͰ.~_DJO)oeW,_ˊ_~Yˊ+Vb/+ !{x o l޼YhU;Xe!LXQow6OACPT`~.pe3%K6hP^= Afۛu 1f #ѪSںu믿ZN 6ٳgϞ!3&<ZiԚ&q Į%1@+ h`7Gp'd`T#AT@(@ʉAXrPs&sDC#8 s@Pj >b@e?e # `* UF9#)`c "("ՁRB@ J 6 Ç4ߚp*e 6xut@uD  %9S˅_|̈́PBIiXK_h΢R83ZwEJeW Q:!Z qxFׯ__hu,iyaл8ªd̽5m5_Ϙ{Ub0R")UUS8o޼nIGTȑ#ѣ֭+."<@pޚzls7R 1h>c HVͳi#`QQ!!tƍȑ@0JYBB1ZzXˈ ~s*1 զMMF4zi[ QDvb=Ieϊ8+(`o{V4Ed)^snjlm}Ib%KߣF)D"n;GM5wA^lM'@Y~|Py}{bhIIT~0QMTNaٝ ĴmSVbiro ;3#.ZZcnZY8xSw1_R^" tAUy^4 4G*H`5 #B=q'48bϰ6iDp1`5#b(YĐCY/t$nĻSB,Xs8fe@c6эKrsQ=.%Y&}z++3̧ExFe}gcV-EHxƜstv[~Nyywro9[yF<&!!qkyJL{9|iu)S'ҹQJV qF$PF>-6A)vX$]& D̞ Q: $CЗs1V = V֎ j#DX?ߢ:Sy]ߩ6ǂ캣`v04utƲr[6d}8E}ѐUnZ< +50;:pF!m'N_q ͧ֩R~/cgX!!$!R`9v;t'X>`цV6cW9dGjS(9 Aj(-S zB!ztH0hRǶ0\],|XB Er3s).c\J3bY`F\-ِ|P.vOc-i3Db{},+54G[՚}!?JGrĢ *Q4 "[Q#ϑ&PiPt*gfPhFP'ř^"NKbXbC7,pY,CĶa 7,b!(Oh"uBBGX؜Y#62ٞ(e4@^%96&Nr,UœڱJ5HYBB⼆_[Nn$2pT HI%VP`1q,@m6Xy-b4(+k-jbPI,M{S`=xT cMHOl!}"E6Lұ6 $<;ʸ[3zn;W8c%4 $lt@Zso*'E "WG/yH s-T?]FZ) yo,G*zWF:mf ?K,^{@c{#J9/cs6D\mjr} :R@.~2BPRQbdL9caKSZ&&뺊@;ABʀ9aC(*h&S= 4xη<7[@Z||^@ CИQ(UGd F` e.G(~|>_ -Qc O?s]QCm5G<\KQZ2Ƭ[CnĢFBG9XX$xl9)Wj`6Ĺ~a x a6ҺǠUl//Nj ̋?oYofmݑg PJUU%XwމT_޻=?h9S0Y`Ub#7 #o{sXxQl[|Yxg)J!zo++cln^r8`eTv+TD \سSYف!F&Z xaN[>.DE ȃ֫a1?bdڵ_g3t)t~xf3>v$/,^O㠹1X~su{-))Ig5mҷ !8Ze~{C Js`r.f'&ga9^XA93j\s5qBG~@8 XCc$̑l` Zb"_-.e |y'/rYA+"Dh hpS#rnmiyN9-[,ZhӦM1ϲyiBPVN,ZjUS6*.F/u֙}A0\Ԅih2q`4xWO j&޵r5bNi/SiAp]DDD06nܸiӦcǎaaرc}.'q߾}Kqqq6GhEd'O8qַۛo߾}B1.Ś%&&FoeիmKK`͚5vzW^y+Vڵbc^HHHH8K#v/]n ]DįRJ۾}{x<ǏoժiaPB#Rj2^!=gDk}>_D/|>_ 0^}\pAϞ={ٻwoQf c0ϤnU]_0 Vx8x_aÆuVTL}ҤI=Ј#>jԨ;s`}c #4*B-.2ƶl?D p$/04=19?1f1y-Yym~( 1:Gbe)LLղ_#bt]G/]TU՘%c[nRJUN µg{x`U7?U$r>[M=]S0'k-'soh}ExYg=qĶm۬&ܜs]1ISyq$Z7"ZLP>5f=@wnb1cy$ҬFb0j-m E`ۗe`TyknfyY۷s[T@>LjHO?.sՇ.r"!@.P߆_^l^^xW_}uO<ի;v옮~oi#7ZrUCwޏT%:}9GαI&b+  yf 3Ulٲ3g+h 躾vښ5k۷oΝ7']KJJ(b񛗓u1nJ/CZ;>xO4i:tkg̘o7mԔ`_sss4A4M۰az=^zHAai8ټe3q1xh&07UIth5Dd}䗸}a"(ٹn b~QB}6[liZy<H۶m[)v@Z H.uz@7:q/ms&~r6lجEя[ }myblMk{]x<"TjժVAX',5m4cD$K| 4oo]?;/ k֤\T)'>7?\\l۩0f_R \g 9 :C^D0J@~A6̚,  `xOԛ=@?|1Ayo|kJgFDdR],Ysֻ5iy?Vߵ-qI`"-B"pAG<Sajſ.Gΐd`5/Jt% A8R`nHUZݏ,_Ux*g"a'Xm{ݏ?fl6M-S?x[?E;W9Ҕv4C6."߼ys_̊<ONNUəudʦM +̛7oY DQk'Фd:{5E6*bs+5kTm6"6owq:?oi>{<}u0 Y  WѳԎ CN eoaa5tRRx,bꐋ\(,,4pA++=k@@DθY{=x!$!!yyyy5jPE3իWOJJ^zDdͻw>`U.}_2Ç׫WOt:)))&L֭X+VؤI|sοlٲe۶m=ܘ1c?Nq\z.]OO|'zM7͜9sϞ=+W[:[neV+ȑoN_^Pfǎa2Y!{<#GL:uM6pǓ6lkn:%%gϞx*ۿJHH}'|O_zkf233D߾}5M꫓t]/..^h([n;vlrrfۻwʕ+)k֬1cܱcǜ9s:wvN:\.aoIII wߵ^ۧOy-X ==}|MjjE̙SN]vըQ/**1bDoydL@>oƍsYfɒ%~7TUZ_~䂞yQ7ˬ{߾}sέWޑ#G|>ߋ/e˖k׎9RUgykiܸΝ;yڵk:t[om߾5k~駭[6klӦM֭[։w}W>}\yՕϪa3cƌf͚ 2D(0$"G~uu~s]ɗlncmq_g75omU#5iצ}Y{b EUM'3bME$/y͚5~Zjҥ۶mkҤߣG{[GIOO=z8lذ_}vHD!+gmo||;19 msB]isMwPHRF>U]6P !;oۚV?g9cnA @K9őa;w|w;OfddPJ>fY>lE**q<{w6PQ;a8v9j(oq1uȑ &l?|3g|饗~ԩS xꩧ4Mۿ_o=‹={raoo9y1ݷoK.]㏷oçNzҾm۶y睭Z?ï(?~hذa={y !#Fݻ]N<9j(ϛ7/##رcwyg֭O:;0N:շoK/TQW_}yfq_-Wg׭[ȑ#pCuu1mڴifEQv9?~x5Ě`&38Nvg7nlժU9p>\JѶB"РAJiŊwСǮ[xnŋ_}?a9ce؝Gy/Uh /v; 2dǎ 4{x-ZLĶֻ2!D[lbDgΜٵk^zZj֬Yu0իW^_~;wnݺرc'NhNZjM_8}zbbܹs׬Y#=6ml_}bbaN0u]bp[ߝ*4v ý)Iw:e=!qvjچ>1ɁQΫfkԭ*d}eA;k5S '8eP@!{瞳#Њh (<3Ԋ>>dG=sS9lb A ]oOo̻co& pjϏPsx u^V@~MNߓQؑœ]zuO=4>qg:j6(icQp|icoOg cQCǘvV` *lym޼nݺG]fɓm65 as dj=4U$@y L5̙3yիWoݺ^lFڵkW6mӿDܵkWjo~ݼyÇ ۷WSNMHH4/}ݍ7ʚ2e_ͭY&c, @IQIQQQΝҪ-Z87'^ݺwj԰!#GtI,DG^z7{С;BbrHJ^&&&**F4pBm6pP 7ps̩]_Jx<Ĺ`;N'7?8p`aa>vg}O>={l۶ԩSvM >oݺuΚյk׮];O<䥗^:x(((xW9p8o^F/SNM44M~ٳ?3/,uy-Zv]4^FSN|Yf[m۶4iشiS>}TUݰaôiE)((hҤ`r󊋋5j"GTO|033sԩ† 牭[طm6:4oܬRqCV\"R֭{vׯ/,q͛7M[6iDIq5`Wڰ~}^^^ժU )#lt]w:dZ3G#m^g|}Ǖ'zu5̣ojաW8;컬_5 'ZG۷oر1UU;t@q֭۵kWVVVfff߾}aH(Mzrw믿|>A [̾QH "?<%P.,`E+vE5RN0{sDh`(KN/ꪫ!f9ag{K.bŊ;vQ`f|>/ΠBFТE Qz_ݻwL;C?g1#|Y/'u[4H' w+6hj(n\[$@9l?QB4~ӑr]W9IL/tRBJڪ]XQ/0T7#J@ T^_ܭkoϵO{eU^)ܺ=U b$֯on]A~JS%9.p"paRي8 ?!KHnQA(m\P 8+v#dL(^1S~3/YfS34_vN VArwlpoS)h"g..'PL(qgeرC7oxnv8|[hѭ[7_|۷zb *Ur>|ݰa6brի׭]kOw~ CzꙫX-LΝ;M'آE^z%DTUr5lP,M6ݺuk Cԛfa3[@%6PV:FLHdAUՏ?Yf]tx~nfp .))ͭ]6|Ϟ=Dݺu DͶpaÆ]p81zk.P-qÇ7j05%$/7UV@hff=رc59rHVu0Ǝ=zWY(1Xv VxJiǎ{G/@Jh$&& /-sgab֭[wW_}[fM֭+Tиqŋ_q۷7ht.\tN4iҤIu5ݻw׭W9;wZju_r9Y5k8yb7|_2!yf ~I4;bĈ-ZGs[nĉUUczLBm&Z+_z͚5۸q??utΝ;gbÆ zI䢢"Mӄ={ի':8cƌ/]tӦMcǎe˖ƍ6Pٽ{wu%&&޽{ovdPTXWV-ݧ }8;`/!BN۟=`Agƾ=FU8P[9WZ``ncG #k2e5n`'~9qp˖-;vgm۶լYlٲÇ'%%=-Zd1yf`߿>{衇WW_#B)uAgK$@?*"!APs~s}_j@;|Uvդ8#otidpA7{#:A)u8;vѣf4m۶m>8ڵ롇%UUٿfSeǎ(77~b2deeVXQ7nؼys߿60ֈPVbn.]x޻٩u+6oT :١#ɭ[ UKEb'dg78f_ڤAbjP  ;#cV 4 4m}U]T{Y+k\߯l#?Q(CqN mKhոA#c2:y@)z˂alٛ֠V3yw^y@pi % C-:] ۏ9޸gO&EJ?o^Йs8^yT9zM8{'J 'WIVkafr;{t 77'?#p ()_1رcSQɓ'_pƍ~m۶iӦm޼O>),,K0tuݺu3mwJZ*۷w㹠L{ѳgF#?cٳGXB>ڵk׈#iq͛75pִ8[4M bJL) 5k mQiC d&^ 4_"^z>j9t:W}ĉatnATسgOϷo߾`0++cǎBl膪iii5b`@u5N87šv>,"/>9rN:ά`U({]zŋ?>tٳgΜ9ӧORPh qJW΄4%]K)}vjh8SXtŚ5kƉP3k֬Xpf6faRj\r*L'OZ 5k&f#%x<˵k.!$*))9zhEm_={}G!@<jg\[=pxb:PʓsV&h't=3h@Td2:?̙VvXBQxTZ K#5PŘhvǵ^$L;g>A~t´=F,΅SɫOosXB4vm;u'NW զ}R)iڂ D{٥KA;ClܢBǓ㏋KiӦ3f,w-NUU=v^.( -hРANNUW].B|u늊E(/U3TR%77W=UVn|&Mx㍄J*{gWZM !0w6qĴ4ݳgOl}G},L@CvV3z7L'nA @iѼl*O9fةzU{!Vݚ=ݹfu|;w\tk(Jx)v}O?tjjU"֫W綾^JOOOLLTРB6m'%%M0!))N:~͛sxzz8"W >N<J~ݸ{ {etjqд75Q'lnx[>5B'db)a{թSBPBbu}KJJRe̘14ibqʔ)ݻ￟0ai_~̙3ׯ9oӦsI5nܸVZ;wn+Wfׯ_M8ތn] 1Zr#@4JIdwVށ>T'80⃚-m?>5v5Z7μ|"=/۳u龍Gl6\?o^H5;؅)|9:$_ oaiZ~l6Cɉ Q=Cznݺzj6G#uu*V3aUk˻@<[gMl􂵛kOOAGp.uu'+[t pLշ~6'(/9躤;7 4ieN]ysv2zH5x\۾9GT-d]~s춰ڼe˂ F RM3J( hvMVj{NQUU_z%Yf=zgmРnԨQ=8vjժ999<\p5׈ճf 9DPJ8¥M:uƍa5O={ 0@4OD3~jժ裏nEđ#G:o߾UTIJJz۪0u}Æ }ٸqNs -?ȑ#T~*t];V0feURVZƍclR6n^ڻwoZZZV`ĉIII(vaÆ=S5k4m„ 6/:u 4MKMM}ᇅi4hXtͯvQVVV5EQmjRR{wV=-''CnUӛ5k6p@q%##cٲegѣGVI`ƌ=6W33֜9sƎhѢ:u|7֭{7Cݻ駟&|g#G|xUWe"aL])1~[Am!1 B,gqk^p:.#ucX5{̴XMb,_\̛޽zCs0d%$$$Uؼys6mIUQ&Xb`"ygee9΄@Iܜ\XZZ@8!p+VXĬDY裏{РAG߿?##Chm6*nWF'&&)~y^Gj^y}jSmA1:"_aܸq?-QQUUL)]RRR\\l]D P ̓Sg%ʘ:0M Mp\.an^^@M Au* aQHL Yx$sy`@UNbC꼂ɀL0 "d 䎻٣7$bv_p^r\.1Č1*Wl]}i)g&#">~)2(TEGE oPđ/!4P܊(5aQ`F~3Eppcj۶l3f #xfs @ '`G6L4i̘1iiia&;q.,,4}=n@a-HwC() *@|^uh@9ZEةWnK;*V  ͓`'60k/%Ԯ:=a^enj@UD6prrDL5VA4*u +()iVKnTwQBbAR rXF58<ANC;׬\G`<(T%pש{y*YIrUH(CX# dF QmE%tOQQ/qْ0PMVB'}gؽwݻw g>rcEEE*UHZp8N8&TUu݉b7yC@3󜜜Sf]|>nxP,b5xa3Bbϼuѣ|@j+ 2KSfffrr)fgg ZY{D6!UX쑈 . 9b;:{{bmj5{!  ^z ۅ0T|nʿԩS,X RЉ},&yͬWMyyfvTaBqFhʈ$%,!!qA[l9W<ZAAQ.-[0ƦO./k'駟>p/xxy0+ϛ7ԓ9_dI&MLstm۶+VTVmΝ={ٳgd֙ ?(1X^{9 b,ow֜ϰrh%%% .>|8HL-^I&$f̉qPü/;UU0a0?hB<3'g8`|V`phL{!'$ybe"NFpRSSEwvFQ+V#ꈦc'ur?o!0 a>snL5i=k iokoM?/ιPM[=ӵMס2[U9.G/A+@)E9BJ4o0G u-+JO!ooyoʬVZ9]yKv2qrCZe&M3W)yf h_˞C93l):6Q gX{h+]bȭ$,!!!!!qqq%$ʁ(e @ XLel TV(1etnHKqFa\X_4*֚?oD<6qCeC1 ьxӵZNt:8)Wopӵ9̽=Gcm R 4>}I=}Z/O% Wxem%$$SCX˨EH3B(ȑs Ts8ù~#ҨʄZh`KaXXBCF}AH8AB%?<q)s"rNQ$Nls$B@$,ƒ ^(<ZAq!j8ABxle;6Xf&D nDN9g@, *fTY,3EBBBD4gkf)"+dLW5X#ETdXnmXDΐ1ij+dg] Nrns.TE0E?GeQ1ޒ&!a. %'0+UHCbRRsrG'jn'$vBP4$ۑs>G؇BM%9Ԓ$Y> FUEvr-'Nz^X{Gº 3 e M_|w\;;ǟ>)nzlEQ(5Ҷ9@Jt!"-A757tO׽~mĽ_s}<~ +ڄ7[}ၜaY!BvRBȽ޿nOWQ Yr0u%dU0sQ8C ~i"!dժUӧOԲˇ󥂵\E~Qֻ̋?-=_}w6l߾}f{;=A"qX3KHH8K΁8+3f&;_~{}5 vm#}l$B/ʗ#0p7]:hjjޛ K[@/7@RX2[66Z^ d!kdߙa@%B9ƍVz„؈G f &`§ƏZ49AKxB ^9G@SiC^)/{oҤ)~1!7jլ +芠PĴ!a r@ x*P'pJ9rdrpF5="#IlDg T5KHHq.x7 Ln6m9/%G p8BrGhMA}'ڶm;eʔjժ1̋7n\II?̿?¯%?dwӦ4jPUn:D9|ԩ/1trww%O|]b*IΜ^p7߬R3EظQ3M |DQecsk7nKPw#G /r_5kM\79/>8jLjZu#;n;n;nۺeW5o)_%n[S?Iuj]۩RNu-;\*~]wgzwcHiլ{k+ke8TXKJL\J'Wvp:߷];e0%pQ{#H=Zw_~8is<%Ź}gYoՐA\ڟXշ?,]^P˨O@>[Tg}bPa]2)@O%/]b3]:O}Un6˅+C!BO.;:]vŕ_.XVsO3)E[nx%׬t%s?xz7o js$:=pjUOfmh;s>珞<4{vX-gIIHHHćE 7o#?W_{㏕)qn){5M <)V-Z}7}gw6o^z ?\2A w6g(w_~ w> Osr:-UGB+%9zL}ծ; 9֫*C+W/~ ||f^رs(o;kÆ 6E_b@/qu\XR2ggn݌ޫf?3auoa.bF)`p )s5*W$ƌ~tu{t ~<7Vͪvj5s櫏Em_^9]A?z3{YvUy@*|]]*Wcؽ寧5ٵjEO܂¢yo+o ~-!11ïPPՕЯmZ>tŗ^z'~XqIqzZ{y={L|晏{7B?7< } toRu?s֭.17;7bK+P{HHH7onڴK^1R6Ͷm۞Եڡc'Cԯ)8UWUWҥȽ1@B:uꄀNVWȅ˕[A9:)P*9'@B@QU0[6gg1~WREIA5)ᢋm@ƒ\Qk/~)) %i5ޚ3v<1)1 Tܴy (\l|=SNqΘX%rq~aJdu]w8.iFđxБ#'N7zݑP.t{_ 99nx4U 鹹Jܹs:Nu`orJ LĊmY%,!!!qZ V_5o޼]XXVEѨ9 JJ4N8S 3YAC[ؾ\s͵}qZ@d*BsBK(6q8g^BjٜD\E P nmv9l\7CfpWUGÎ@ UWPHHp R%%~6+/%WHimڷQ(@Sͯ: 91T(j0LYbbOTEA4@Q+ pB^/ T =R  |kL<ϯ) DG((xuD֭G\&ϑS\X)5Ug̦(J!}Ql9?p`Ι]z r#dzZ4it28&%&2 9[4swԤSjp);3TUJiyEQ~P) AÆϙ N%%k n*l͹ooڴ郏>Yj͸#0pB4B@VoAwZ$dlW62"!P\\lf{"8NDt8'%%\.Ji׮] f٬O9rHj8лwokͧNP0qh@ǟ~ճ[ _~ղ8r|ͪ?/nBJL8N۷o{MKԤq]!hm:[_}mΐa7rW\~yuzs?wsƞ|≴4@Juà @çpCW ;c sBrSO>Y;%{ioխ[n3oĄ;ScǶS|ȱܬ~6n{i)Ǐͯ'8:CRfΑR(Rs5-08W)ή6%Rza9v\6EcܮP fSOs:@3]*u!{hǗ?CBgܡx6 ݴ f0PAi: 082CT 7@,ljfv w>nQjL"Ԯ~Mwm\aW(%NЩb )9X2W~Z)Ebua!Gj@`6n7)9P_ggLhP4i N2Cm!*IHHHHGW_lAY5Ʉɴ&yaNLLt:bbw6n|{cǎ:tpc¨[SE3,H`IxZ3B7n܈E΀B暒(e9(@]w   frFbOtڀ[D]EvUET ! vc;7 ؂"Pɵ^dÛOv$8h@0RVB)E#B)"0fp8lsBnMBDIUU b* }E  4 RbS)U]U$9m`6;<,I@j+*%b4N's ֭i,LUDqj N @48 LGƒaq33jP.HDlCI |u(: (h-( DL t!0#rNH {a1 ? !W\q(x"ږp!ښ6m\s5Պf\ڄ]:81ڣ%+%$$$3(JvFg(OҟmU|Ji#$,!!q-!-VAqUMZ8Z:EA^?P9A VUp aQga1#%x_ n-Ѽ}h`1eLB+m#d qѻq"{LIkXӸ2?,$,!!!Byfgk0Bĕ8lmVe-yf 3 LU} \bjI(_O7۱[>NWIJa9JRkd $鍥C D&O 7-sW.7$[J+"cGy`f("r$U֑(rl~= tǠ=f*xSa):ȗeͧu;q˙/f eN>,sa0,JkJBBC XKUPKGP{c;ld$$$$$$$N0/$,!!q։QǏɡnA4c$J&|ϷJHHHHHHD 1^<ú=~cz:] @M~R 3)N! "**IM]aߥY? y<3-@JιRZmY(V%$JYBB|H!ZPr1s4#tSOBBHjlfF!?½zU0t(zl'!!qDV>DA7@gp;[m5F{C)WM ^"-,l_آVc@ H S0xf A[$֥ò2a9%$$$$$$$;L <DKFPPf!7KHHHHHHH1GT  !aH* r PP "^ ,{HixTՖ8_Ab_ hf PE@DW0%$$/٧"~IYBBBBBBB?+d,>2U8aFBBBBBBBB DDR~'@a` ڵC@붿O#P$mw*#bfNIIIZLBB|d%$$$$$$$ 0ʄҨQ$Yx2 =yН㓐8O@HK n9BINN paMVY%$$GĒ;J CBazy:QE;KHHwANHHHHHHHHHw Y}~ɧЁ0*Jࢄ5!\%$$$$$$$$=؂Iv e>u5C5Mqex0 =+@\$$$$$$$$G;9pO>Q)cRq@YNAoi(!!oղc]6ǖ6.d !Cu8B(q3;[XZ y|w>+OK,=  ӯ򊯿tx}+R%(Ta! $311JHE 07>,= 8NOA!