From 82067544bd03cc1358af1ea7131addbfc9bac706 Mon Sep 17 00:00:00 2001 From: Alex Nimmo Smith Date: Thu, 30 Jul 2026 16:09:27 +0100 Subject: [PATCH 01/29] Streamline test suite: shared fixtures, markers, and per-notebook tests Addresses #403 and folds in #237. - Add pytest markers (`slow`, `training`) registered in pyproject.toml, so `pytest -m "not slow"` gives a fast local loop and `pytest -m "not training"` (now used in CI) excludes tests that train a model from scratch. - Consolidate real-data download fixtures (example image, classifier model, training database, hologram) into session-scoped fixtures in pyopia/tests/conftest.py, shared across test_pipeline.py, test_classify.py, and test_cli.py instead of each downloading its own copy. The CLI-specific fixture copies into its own directory before duplicating a file for its chunking-minimum workaround, so it can't leak that duplicate into the fixtures other test files share. - Standardize on pytest's tmp_path/tmp_path_factory instead of manual tempfile.TemporaryDirectory() throughout. - Remove a flaky hardcoded wall-clock timing assertion in test_classify.py, and a stray `model/` directory it was leaving in the repo root. - Rewrite test_notebooks.py: each notebook is now its own parametrized test (test_notebook[.ipynb]) instead of one monolithic function covering all of them, with markers reflecting real cost: - `slow`: real network/pipeline notebooks (existing + newly added docs/notebooks coverage per #237: montaging, stats, exploring_pipeline_data, pipeline_step_by_step, background_correction) - unmarked: cli.ipynb (no network dependency) and markdown-only notebooks (toml_config, processing_raw_data, big_datasets) - `slow` + `training`: the DINOv2 classifier training notebook, which runs 30 real training epochs with no CI-mode shortcut and is now excluded from routine CI entirely (`-m "not training"`) - docs/notebooks/STATSnc.ipynb intentionally not included: it loads a pre-existing stats file no notebook produces at that path in isolation Found and fixed two real, pre-existing bugs this new coverage caught: docs/notebooks/config.toml referenced a non-existent 'keras_model.h5', and pipeline_step_by_step.ipynb referenced stale 'imc'/default segment_source and roi_source keys that no longer match the current pipeline/ImagePrep implementation. - Add a Testing section to README.md documenting the markers, shared fixtures, and notebook CI policy. Co-Authored-By: Claude Sonnet 5 --- .github/workflows/build-and-test.yml | 6 +- .gitignore | 2 +- README.md | 25 +- docs/notebooks/config.toml | 2 +- docs/notebooks/pipeline_step_by_step.ipynb | 132 +------- pyopia/tests/conftest.py | 79 ++++- pyopia/tests/test_classify.py | 355 +++++++++---------- pyopia/tests/test_cli.py | 6 + pyopia/tests/test_notebooks.py | 89 ++++- pyopia/tests/test_pipeline.py | 376 ++++++++++----------- pyproject.toml | 8 + 11 files changed, 531 insertions(+), 549 deletions(-) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index e2570c70..d9ceb7c1 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -20,7 +20,7 @@ jobs: run: uv sync --all-extras --dev - name: Run the automated tests - run: uv run pytest -v + run: uv run pytest -v -m "not training" Ubuntu_uv: runs-on: ubuntu-latest @@ -39,7 +39,7 @@ jobs: run: uv sync --all-extras --dev - name: Run the automated tests - run: uv run pytest -v + run: uv run pytest -v -m "not training" MacOS_uv: runs-on: macos-latest @@ -58,4 +58,4 @@ jobs: run: uv sync --all-extras --dev - name: Run the automated tests - run: uv run pytest -v + run: uv run pytest -v -m "not training" diff --git a/.gitignore b/.gitignore index b1fcf40a..3127f601 100644 --- a/.gitignore +++ b/.gitignore @@ -267,7 +267,7 @@ poetry.lock /notebooks/oil_silcam_images header.tfl.txt *.tiff -notebooks/__MACOSX/* +**/__MACOSX/* notebooks/silcam240822.keras model/* notebooks/model/* diff --git a/README.md b/README.md index 55c970de..0f986fdb 100644 --- a/README.md +++ b/README.md @@ -144,6 +144,29 @@ We welcome additions and improvements to the code! We request that you follow a Use the NumPy style in docstrings. See style guide [here](https://numpydoc.readthedocs.io/en/latest/format.html#documenting-classes) +## Testing + +PyOPIA's test suite lives in `pyopia/tests/` and runs via `pytest` (see `uv run pytest` below). A few things are useful to know before running or adding to it: + +**Markers**: some tests are tagged with pytest markers to indicate how expensive they are. + +- `@pytest.mark.slow` - tests that do real network downloads and/or real model inference (e.g. downloading the example classifier model and running real predictions on it). These run in routine CI, but you can skip them for a fast local feedback loop: + ```bash + uv run pytest -m "not slow" + ``` +- `@pytest.mark.training` - tests that train a model from scratch (currently, a notebook that trains a DINOv2-based classifier). These never run in routine CI - only manually, or on a schedule - since they involve a real, uncapped multi-epoch training run rather than a check of PyOPIA's own correctness: + ```bash + uv run pytest -m training + ``` + +Unmarked tests are fast and have no external dependencies; they always run. + +**Shared fixtures**: tests that need real example data (an example image, the trained classifier model, the classifier training database, an example hologram) get it from session-scoped fixtures defined in `pyopia/tests/conftest.py`, rather than each downloading their own copy. The download happens once per test run and is shared across every test file that needs it. + +**Notebooks**: `pyopia/tests/test_notebooks.py` executes the notebooks in `notebooks/` and `docs/notebooks/` to check they still run against the current codebase. Each notebook is its own parametrized test (`test_notebook[.ipynb]`), tagged `slow`/`training` as above where relevant. Not every notebook is included - a couple depend on state produced by another notebook, or by a user's own prior processing run, and would fail if executed standalone; see the comments in `test_notebooks.py` for which ones and why. + +Please do not disable or remove tests just to make a pull request pass - see Contributions guideline 3 above. + # Installing ## For users @@ -173,7 +196,7 @@ For the next steps, you need to be located in the PyOPIA root directory that con uv sync --all-extras ``` -3. (optional) Run local tests: +3. (optional) Run local tests (see the Testing section above for markers and how to run a fast subset): ```bash uv run pytest diff --git a/docs/notebooks/config.toml b/docs/notebooks/config.toml index 4dc0c2a0..9bb0a29d 100644 --- a/docs/notebooks/config.toml +++ b/docs/notebooks/config.toml @@ -6,7 +6,7 @@ pixel_size = 24 # pixel size of imaging system in microns [steps.classifier] pipeline_class = 'pyopia.classify.Classify' - model_path = 'keras_model.h5' # path to trained nn model + model_path = 'pyopia-default-classifier-20250409.keras' # path to trained nn model [steps.load] pipeline_class = 'pyopia.instrument.silcam.SilCamLoad' diff --git a/docs/notebooks/pipeline_step_by_step.ipynb b/docs/notebooks/pipeline_step_by_step.ipynb index b0ab5259..2dcfba3f 100644 --- a/docs/notebooks/pipeline_step_by_step.ipynb +++ b/docs/notebooks/pipeline_step_by_step.ipynb @@ -213,53 +213,11 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "46f303b7", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ImagePrep ready with: {'image_level': 'imraw'} and data dict_keys(['cl', 'settings', 'raw_files', 'filename', 'timestamp', 'imraw'])\n" - ] - }, - { - "data": { - "text/plain": [ - "Text(0.5, 1.0, 'imc')" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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/ig4n8Ww5ufnde3aNT377LM6fvy4isWiVq1apYceekjr1q0LjgGnEZcMisViouPZnbhnxvEfKCxAwvT0dMgKi8WiPvShDymVWnzjGrK+du2ampubwzYkLz+4wQGK+D9OAMbFmRDu7Rmjy5rPkxl68MTYpXLd2w94cQASgz/k51upPJOiHo3zoOnQ16KycvHQnmeffValUkkbNmyQlDxMxx0d+s380B/PYhkvWcby5cv1yCOPaPXq1XruuedUV1enbdu2ad26derr61Mmk1GxWLzllktAjAc412nWB1kBSgkoXj7JZrP6/ve/ry984QsaHh5WoVDQ66+/rs997nPasWNHkBv6h0y5rl69qhMnTqi1tTWcyoazZRwATs+6XYdiHaOsRZ+FZ5C+K8Ipd+yFzJQg5WC3omLx/eurVq3SypUrlc1mNTExEdapubk5PBMbnJ2dTbyqloDsjBljQb6eEbuPYSwxPQ0A9FMKAa74N/QanXc/x1nwPMvX3jNkxon/zGazunHjRhgHzAafQ1/xZ4zLx8jf/kzGiB54lu864cDAM/SYHUPnx8fHVVNTo5qamuDvp6enE2/7BICypgsLCxobG9OxY8fU3t6unp6ehDx+1HXHB3qp3PHKArgjRGEmJiZ06NAhnTlzRvl8Xu3t7XrnO9+ptra2RE3JDRIjcprFAUBMheJQGQOBwjPymDLiZzheMk6njLgvlDMOEMfg23XIIubm5tTU1JRAmM5GYLDXrl3TX/zFX+jVV19VNptVOp3WW2+9pYsXL+pnfuZntG7duoSs4wDL+Nz4JSWcPMjYZUlA4J40Q46NjenUqVO6ePGient7lclk1NPTo5GREX3961/X+vXrde+99waaju12DnpYw6qqxWNRh4eHNTAwoKVLlwaqNs7ckTHZ6RtvvKH29natWLHiJoNj3H76GP/3dWAsTvnh2AneMT3nmZ3T+P597lcsFrV8+XL9zM/8TOKMc99256CPQEowc0qWMXs2JCm8Za+np0crVqxQfX19eCET93GWIWbGFhYW1NjYqGw2m5ivywnnTBbpDB2/m5ub08svv6zJyckw94GBAb388svasmVLYJnQMQeANTU16ujoCKW67u5uzczMqL29PXTfe2BBhj+soS8uB7q+8VxYFHpAfDcBwDOfz+vs2bM6c+ZMYGQIkoCiurq6xFs23UfRm+A26SASHQPke8aMbFy3uMfs7GxIfhzgTE9Pq6KiIrFX3+cFYF62bFnCttAHZOcAwJ/rJR++g/7Tnc9z+b2XDJzN8TIR93GWzNkIPseYnOXj+w6E8dk8189VmJiY0MGDB9XT06O1a9equrpavb29+tCHPnQTuPKT+nhz58MPPxxeTPRPzXh2eaY5NzensbExHTlyRDMzM9qwYYNWrVqlyspK1dXVqbOzUy0tLcrn8+FQBqcYuWLqhfu78sQ1L28+8uYXd9Z8xxccI4ypJamM+qi/uyJ73Tju8MUgnKpnPLwqlnkeOXJEhw8fTqDN+fl5nTlzRs8991ygzh0AeSCK65f8HloNZ4LiUs91xyqVg0yhUNCVK1d06NAhDQ8Pq6WlJdTo3/GOd6i7uzsEDBpeCBawCF4rlhadCU6KzNzH6zVsHPDVq1fDkZoe+GB1CCiMuaKifC4660bTV6lUriETrB008gcZu254hsY4nU5OpVJatWpV+AwX4/IsEd3we7oc+LnXypFrQ0OD1q9fnwBn7pzJYAEUBCGCJgE8dqKMwbM67MV1C4DogJr18Mt1HR2gCRJdaWtrS3ye58aZGr9nvi5jPut1Zi9RAPL5jsuL+01MTOhrX/uaTp8+rZUrV+pTn/qUenp6EqUl5uznX6B76Ig3iDrd7J91QA6Y8JIQfhRdRcb+LN5giFxSqVRi7Xg292HN0ammpqagA87CuZzjjJvEqLm5+aaeCC8HOXviSdPp06c1PT2trVu3JnTNu/OdXXO58nzG75l9sVjUxMSE6uvrw+FWlDsbGxvDGzv5LL4Qv8BbDfkuL1ADOMf2/KOuOz7QI8z5+XldvnxZX/jCF3Ts2DFls1mtWbNGn/jEJ7Ru3TpVV1frXe96l1auXKlSqaR169aFt0NJ5a07jpIJTFKZ7oZq5TuTk5Oqq6sLzgNHxmcIOo4I3TliyB74PECDGD2AesbjgcJrRzgusgqnG5nXzMyMLl++fNO7j0HQ58+f19TUVNjShmF77U66+ZzzWwUcN2zm4srMHBoaGtTd3a0NGzaovb1dHR0dqq6uDpSxByEHSs4qUKcnoHZ2dqquri7QzN5UFQdR0P4jjzySWCN3Zh6webbT6742vsbeHOUMBxc7GvgewIz1Zv1hZWjk8SCOs0XerLUHMGrWnq3Fa1MoLJ7VkM1mNTs7q9bWVrW2tqqiokJTU1MJ8MrLfzy7db0tFhePKMaJxf0THixdHgSkYrGopqYmbdu2TefPn9fMzIyqq6vV1NSkrVu3hs+g+8wfWeDY0V/v4UEeDuB8hwlrHrOE3jvAfN12kT1yhEr3HhkH59PT08Gu8B0OMlhf5kcZiTX38qJnnl6W8cDG//mM9zZhD84e8Szk5wESXceHApDjeS5btkyZTEZTU1MJMMsc+RxzRLYcBoRd8x1kCdMJc4VdFwoF9fX1aXp6OoAX77z3ZlkH6ARj9wfOQsYgg7FUVVWpvb1dd999d/Ax6fTi6anoGc+CBWDbMPPysocDth913T7J//9e3//+9/W+971PfX19SqVS+tKXvpT4/ac+9anEIqVSKT322GOJz4yOjuoTn/iEmpqa1NLSos985jM3HdB/5MgR3XvvvaqtrdXSpUv1O7/zO293qJKSr0L89re/rVdffVXXr19XLpfTyZMndfjw4TDO3t5e3XvvvXrooYe0dOnS4JhYFEe6nmE7+nMUOjU1pePHj2twcDAsmO89RTmguqSk8ZLRuIJxxVSWB09Hz65wKObMzIyy2WyYNxQqn8U5OzXIs90B+hG4XqrAyeFM+YzXvd0ZYQQYGduecMDOnjQ0NIS3zO3Zs0ddXV0hO0BuksLuBdbfTz/kGTy/trZWbW1tiTl6rdC7rgF5dXV1gQ6mXo3M+Wx9fX3QHQ9WXiYBFMQOwdkQ9DCm6/k3TqpUKoUyha+51yM9eBCYbvXyGc6O4Geu71yAp+np6QBw/SVNPM/pau6DbS4sLO6p5uUhvKMAuVDWitcXWXmAfde73qX3ve992rBhg7Zv364nn3xSd911V0K/YufobAuA19kY9MUZMHS8srIycRql6w3jQ04EPQ/UhUJBg4OD+vKXv6yvfvWrGh0dTQTVTCajhx9+WA8++KDe/e53q6enJ+iSy9HtjGfxf/TPmYxbsYUui1sBKy9fuV9iXbE1BzbM1VnPWzFTZLpr1qwJDKsDdQ90znpUVCy+aGnTpk1qb28P88ZevfmuUCiEsqezYfX19erv7w+B1W0U/Z6ZmQn+jHs6AHVQ5AwqvtMpfklh9xTjqKmpCfvjeT5xgnWk0dJt9R81o8/lctq+fbs+/elP68Mf/vAtP/PYY4/pf/7P/xn+Hx9g8YlPfEIDAwN6+umnlc/n9c/+2T/TZz/7Wf3lX/6lpMWzpt/1rnfp4Ycf1h/90R/p6NGj+vSnP62WlhZ99rOffVvjxanOzc1pamoqQeFI5a1U3iHt1BwK43SQI3mUyx0v32tqatLatWvDW9r8BDenYLwTngCIIgEQvC5PcHbH4Y6aMYKuUXafF8EXY8UwMWC28a1Zs0YtLS3hZDkQfWtrq3bv3q1MJhOM0MfNeDAy5sda0GjnmShj99pbnNlXVlaqs7NTmUwmBFo3GG9e4ZmSQmbL/z2T4+UVrL07AqncSe1OxwMB2TPsCFlQHDBA4XFm5WUcp0tx0C4jAkw6nQ6ZIMeusr7+Uh+e6cALQIUtxOUiZ1GcmozlXVtbGyhFyi0xQImZDNc3gh/PZvxxR7FTqh7oY6Db1tamj370o3rkkUdUVVWlpqamoAMuc6dX42Yq5s3/nSb38aBHXl5AT521YF0I+ugYY79w4YJeeOEFFYtF9ff3a9++fSHrTafTWrdunVatWhVebOLMHnqMzuBX3OY8I3XZYWNkp84iSQpME36GQONAkfGQUHhwGhoaUi6XC+8RQe8ZWwx8FxYW1NzcrMcff1znz5/X4OBggmZ3cMoYqG8/8MADgd3yObCG+AK+6++NQJcdFNxqjb1nxn0Hvs4ZG5ImEkP6ixwwMg56HRYWFsKa4zsYhyda+HUSldu93nagf/zxx/X444//g5+pqalRT0/PLX934sQJPfXUU3r11Ve1Z88eSdJ//a//Ve9+97v1n//zf1ZfX58+//nPa35+Xn/yJ3+i6upqbd68WYcPH9bv/u7vvu1AjwKm04vb0958802Nj49Lkvr6+rRjx44E7c53WDAW3ptWHFH5PmupnAFygt3SpUvDonnzHoHB6UucM5+NFY8/ZB904nttnjHiWDzAch+MwWlbR/XemLNhwwbdd999+ta3vqWxsTGlUosHpTzyyCO66667EhmKVM5eCCYopjcveR3MsxAHGowF+XhWkk6nw8FCnhHDAmCMUvm0QQdj3kCDnPkZz3PA5kHJ5xlnfARCPwbTywU8w7fq8DeORCqfyx0HJ//b9c5LJDAxZBIEeXd2sB1+wIiXTrzTnL/RK+QCAMDJA5SRM2vOvRkHoMSzy6qqKmWz2ZCh+ZZE35nhlDfzBTAvLCwEgOClJNd1QKYfmAWIdl1x/eBymjl27HzXyzt+P/zHrcp03d3d6uvr0/z8vJqbmxMOvrJycSsduu++DF2IkwRnyDxgxNQ7eoAcnfnxxIDmU+TioA3dd4DLduLx8XGNjo6qt7c3gFN8KrLncv3dvHmzPvShD+nv/u7vNDo6elMiwNwrKhaPiv3whz+s1atXh9+h16wHQd1P6ou3+brvYTwOmlkvxowOpdPp8PIh1sKZV9bfm6Hj9XCW13XOEzcHp1L5cDHs93auf5Qa/bPPPquuri61trbqwQcf1H/6T/9J7e3tkqQXX3xRLS0tIchL0sMPP6x0Oq2XX35ZH/rQh/Tiiy/qvvvuS0zk0Ucf1W//9m9rbGxMra2tNz2TgzK46L7NZrPKZDKqrKzUvn37VFVVpWPHjqm2tlY7duzQ1q1bEzVNULmjU5TDqT+U3ClG0DHfHx0dVVXV4juUvdYFsHBjIQB6YPd6MuPDaXsWKSXPdHYqmWd4tuVH+mJ40F3IgG1gra2t+sAHPqDVq1fr4sWLqqxc7JrduHGjMplMopELihUl5vk4QGr93l/AXFlDKdkoFmddyIltbjjbdDod3rbHumAsPh8YE+9rcBnjDHzvNwHUWRvWk8960M/n84mgncvlNDMzEw4tQeZ8x50A/3ZHRLDkZ8gLxufq1atavnx50FfWwjMV/o0j8m2gyJTPxrrnxwJ7EHDakvF5/Zh18/33yFRaZAcJSswfkOhOGVvx/eYOHl1uHpBx/FLy6GsHNB7cPLA788AcGR/zcl/h7JGP2f84Q8V4li9frk9/+tPK5/Ohm9rX2vXBT/zj3/QMYXfIl0zcWYZbsXcOuJgfcmSuXiKRyqAll8slGCxPMJYsWRLKu6wt/oXPzc/Phx4mdKympkaPPvqourq69NRTT+nUqVOhMQ1f29jYqLVr1+qxxx7Tli1bQhKGnADd/h4JP4AKUOOJBZ9FDsjPfQxrSl+FB2DW3LfYIm/0wv0weszFv/2cCH7OWGm6Ztz/qNT9j7oee+wxffjDH9bKlSt19uxZ/bt/9+/0+OOP68UXX1RFRYUGBwfV1dWVHERlpdra2jQ4OChJGhwc1MqVKxOf6e7uDr+7VaD/zd/8Tf36r//6TT/HUYOO77//ft13333h3cZx3dHpWYwZgyLA8hmCNs6RRZ6ZmdEzzzyjr33ta2ppadHHP/5xrV27NuGo3bF4Q4sbIdm1gwKMDyfM5zxzQsFQRhSV33tTH8bFmPicd8Q3NDTo7rvvvuVbvEDLGC9b2rzE4eUNdzyOVskSJiYm9NZbb6miokJ9fX1hv6iXSZAR43PazZ/FesIqsK5818eB4WGEZI2MF2TPs2PmhedKSlDcoH/mitEvLCSP4+Q7Xuf0cbq+uNyqq6vDTgMCkjfweOBDN4rFYqBinRFwWTjlzf3ikgy1RWcWnFVyR8pnoKAppVVUVKijoyPRSEUmGgMFDyRxcHd62oMsMnU2I2a70Hmnkz2j8vq3N5o5WwbDxJkRAB1f75mZGU1PT6ujoyP8vra2Vj09PSFrJrB6oPYzEjyr9ZMmkQVBCxtArwFFAF3fAYLc/DuSEqU4twunnv113QRVgBjjZU29sxxfyphZaxKVXbt2afXq1Tpz5ozeeustjYyMKJVKqaWlRatXr9bKlSvV0tISSoDopPv9+Lhb70FAxs62kvj42nspEl/gsmbc2Ww27DrgD7rGGjAW/J2XEj2bhyGJZe+MojMit3P9Hw/0H/vYx8K/t27dqm3btmn16tV69tln9dBDD/2ffly4fvmXf1m/+Iu/GP4/OTmppUuXJhw7Ss7paY5kHXk63RujeqfopHJDiCNCzmC+fPmyBgYGwmlG7iSddvajW6Wyw/U9qLGi4cjIzPkcY/MaHApFzc0DIcZHI9Xg4KCKxWJ4z3JM7fszkSHHrmLw7vxhEfxMcYIkKB7a+uTJk/rCF76g48ePq1AoaO3atfrYxz6mzZs3h/GCkD2T9wwIx+gygdIlILBNBZk7cJDKJ/p5YPUMiHVnnZyKZ768eGVhYfEcg0wmk6gz8yw/AMmZiEKhoOHh4ZvO156fnw/bH5k3B6H4GLinAyP0l8+gVz5f10HvCYhZEWeM+EMQ5B7M0bcr+uf6+/tD0KUZj+/GzIbT3TzPX/DkoBL62O+B3nEfdJFgRu+Cb4vjeQ424pKCl6aYC37E67mwJgA6AiZvQnRg5j6He7v/4f/0aHgwRVc8c3cdjs/dj/XO5e9MDuPnws/gvwis2Cbzdj1wuyXINjc3h3nPz8+Hd9KnUovbHPfs2aPdu3cHH8l6+rkI+LFbvdTIM2cSGhID932pVCqRLXNvgm3c2Aewc6DuvsDX0JMS76eQlHhhDrJEj7z8hW4zPpjC273+0bfXrVq1Sh0dHTpz5oweeugh9fT06Pr164nPLCwsaHR0NNT1e3p6NDQ0lPgM//9htX9OGoovFsBRPUrrAQJH6lSklOycBXXzf0fKTqfU1dVp/fr1YZ/36tWrg2Ki7AQs3z/N8+OsASflWR2KwuJT+8Q5O3vgh0A4nYRjQw4TExM6evSoUqnFOnx3d/dNNBHf9yNvMQYPFh4AoBb5bkNDw011ssnJST311FN65ZVXNDc3p/n5eY2Pj6u9vT0cZOMByx0Z98BhYxxuKM5kAFQwHu7ngR2n5fS+ZyCe/ToQjF+BzGf4uddxnWVxWlxa3E518eJFtba2JjKVuKTgWWacwfv8CIypVErHjh1TJpPRypUrw738NEZ0DV135skbvAg66J0HFYJSKpU8J5zPMXbv05Bu7iTm/55x828HIzhjxgugQzb+Hof4VDpnATjkCIBGQJCSB94AgG+1HWt6ejpkd1DIfN+ZCRgAt//p6emwxxr/wvyd+sYfYW9xg5gHLQC+M1v4F77vrBk6gHy8XOQZLYwVP8MfOCB2xojnM3/P+LFhD7KsK5S125wncB4c0REfP/f08qsDQ7cRZzpZ90KhoFwuF/xxXV1d6LfgufHphx6gvbfEAVWptLhLBl+Uz+fDceJxGcXZRy+J3u71jx7oeeEF7w7ft2+fxsfH9frrr2v37t2SpO9+97sqFovau3dv+Myv/MqvhCAqSU8//bTWr19/S9r+H7o4GY0aPgvtdROMxpvEcOyO1H3x44zMa6LpdFof/vCHtX//fjU1Nam1tTVBq7NIBAAUlp+Nj4/r+vXrSqVSYUuNo0IcCIpx8OBBDQwMaOPGjeHVuHyGPcUYIUrmwRjlrqurC69eBGFiuF5/AhQ5MpXK3bOHDh1SW1ubVqxYIakcIGJDdYp2bGxMg4ODIYBIi47h/PnzwXFiMO4w/c15rAv/dwrMndX09HQiy8M5Ig/kR70//j7OE7bEDdy3SsIueAaGw4rLMaB0GKdUKqXt27cnWBGcQnzxvJja5nuevaTT6cDWoL/I1d8Kx1oR+HzuXn7huwRfB6UOkllrnhtTzIwXnfN6s7Mt6J6ksDPEg6ADF9ZW0k1NfsjDAbj7BHe0DkI8W+Nnbk88G1ubmppKjJO5Iy8P6IVCQXV1dQlGTEq+aMWzSvTFAWJFRfmteWSeDrrwax5wAI9OFbuPIngyZ9bSaWpJiaDv5REHZzFII0jDEBLcvdcA+eEX2OHBWDz5wv5ju0c3AHzuq7m3szjoAT6F4O7+h/IoL+Tp6elRc3NzWC9P1rAj1shLT9wP8Dg3N6eGhoagLx7gncF8O/T9295Hn81mdfjwYR0+fFiSdP78eR0+fFiXLl1SNpvVv/k3/0YvvfSSLly4oO985zv6wAc+oDVr1ujRRx+VJG3cuFGPPfaYfvqnf1qvvPKKnn/+ef38z/+8Pvaxj6mvr0+S9PGPf1zV1dX6zGc+o2PHjumv//qv9Xu/93sJav7tXGTiThVLZTpLKjeAxc0OdXV1IcD6YhBoQP5XrlzR0aNHQ4NRU1OTVqxYoc7OzgTCy+fzCdrYg8L8/LxyuZzefPNNfetb39LTTz+t48ePa3JyMmFcAJBCoRDetHfw4EFdvHgxBCGnSJk/hoCCu5OqqqpSbW2tVq1apSVLlqhUKmloaEgDAwOBBqdO7XQZR/h6Z+7Fixc1MjKSoC4HBgYSbIbTkSguQZtgkkql1NzcnDiTm8zUGxgdbLnye33Mnb4bFGPA8Tu1xh5xz2xxwoCnOEtyGpvvcOIXa+C0J81M3O9W2RDrBGuDHnng4PvcIx6nZzZtbW1qamoK45ybmwtOTCofneqAxJ2jZ5ReTvJyFJns7OxsABC+NgQUP4zJSxteO/eAzPrF4/KsFXn52vtOCAcL7g8Abp4lNzU1BYfN/Zw2pnTARZDhxU9cbIci0HiW5/7AWQvkhTyRs5cwkBsB1GvWlFu8pMZ9HVQBAtLpxS5ymt+QP7/3rD3W1WKxGM5tZx6UA51tcp/nTIr7Cg+mPk7PhNE1Tzg8iXF2Fl31o5gJwA5CsDEHdF6KYn6urzU1NRoYGNC3vvUtnTp1KtDwfp4F+uu27LL1co7HIv6N38P3OdNzu9fbzuhfe+01HThwIPyf4PvJT35Sf/iHf6gjR47oz/7szzQ+Pq6+vj69613v0m/8xm8kaPXPf/7z+vmf/3k99NBDSqfTeuKJJ/T7v//74ffNzc361re+pc997nPavXu3Ojo69Ku/+qtve2udpITB+bu3vfmpVCqFrAVkKy06FL6DM3WESx32woUL+h//439obm5On/zkJ8MJbVC4LFahUNC1a9dC3VUqZ8Eo2tTUlC5duqRjx46prq5OS5Ys0apVq9TQ0KCFhYWAZjHympoarVu3Ti0tLeGQHxTcFcepWFAzmRaG4H8PDw/r1KlTSqfT2rFjR+J4S6dpuS+OqL6+Xh/84AcTIGphYfFdAn7euoOndDqtjo4O3X333bp27ZomJiZUVVWlnp4ePfDAA+FwGrJdAgdzIyhUV1cnaDzP0PmM02dxM5Y7WhwOICOmyhyRsxYeKAAKOAYAibMNjIcs2DucpXLTncvJA40jfr+PU7juWOLykTNEXr93St4dJQGPzwOwPHuJswxsxoMLn8OZO+uAY/Tz7bFL5Mb6wrx5YxcghfVhXsjbO9G91OPzB5SnUinlcjlls9mw9Q0/4SwXDtsDFTrC/L0PB/13Z866VVdXa2pqKhxpzVhgtdgx4kHT14DPoxde5iFAeamFz7qeoe8AYZc/ZQHm5/rEenhvEbIGpDJfbBUd9e/BQvpaeq9D3FNAoPfmSOblNDd2SIIGYGDOcdnTg7yXHACWrHVfX58eeuihm5pKGxsbEyBJUogvcS3fx+t6xO9YA+5Pbf92r7cd6B944IEwqFtd3/zmN3/kPdra2sLhOD/s2rZtm37wgx+83eHddNG85I5EStKcTkFzZC4LgyKx+FLy1DpQs6TQheyUDc4d6rC3tzcRkOLaVG1trTo7O7Vy5Uo1NjaGw2HcKPk3yrRt2zYNDAzoxo0bunDhQjgOkj+O/rymyrz8wBWO6sWx+9i8scuNxGm9ioqKAEZchhs3bkxkoVL5JSU4xPe85z3q7u7W0aNHVVtbq507d2rt2rWhQadYLCaCPEGHhjHuyXj4u7KyMgE0cWqeBfn9GA9OxQ3caWSv67uz4PI+gpgO5C1ssEhke4yPz8eBVCo7HXeungHikKEM+Znrr58Sxjq6M3JnydpLZeoe3XHQBCuDzvFCGOSKPLmXMxxk49C0nnV7KcGDqpdsPIB6oHHa0+/HXMhe4x4Nf5439k1PTwe5xZcDSsAvbIKfhObZJ01kjF2S6uvrQxCnRs2hTpR1HKjE9WZ03gOIr3H8OcYdz9WDDPdAn73Hxhm1OLPm3u4LXbe9lJDL5fTiiy/q3Llzuuuuu7Rly5YECOV+Xu5xpow5MOY4YHqJIwbUzjY6KHV9cADpjArveYh7Dhw0kVwiA+RJ2YIx+TrG/sSTiPr6+kSD4o+67viz7gnUOId8Pp94yxLCc3pYKmcLTrugcF4HlRYbDv/5P//nqqurU3t7e/ge25KcGZCUUBpXYALr9u3bw7GM3d3dIZt25ea7GObVq1f18ssva/369Wprawu11/n5+TAXN0hH32RuDnyam5u1c+dOVVZWqqWlJUHTMXeU2DMLV0ynO712zWfiA27q6+v1wAMP6B3veEcCzLhzd+rQ5ealABA3WSeshVN1HhjcgeE0kDVUJIBISh4o4/U2dyipVOqmdwjwczI8Mllq1TgOP6lMKjuamEFwZ8aYneoju3OH40yEg1iXHd/hYtyewREc/WI8jMNLNOi/Z8u+X575snb+WmZ3fr5P2SldQCBjcDCEXfnnkK3vwcYB+5zxDfTSeCD0w5Di4O5jw8/wc18HZyM8kMT2NjQ0pJmZGfX29gYwdKtdOW6HDlxdhiQA2BXfj5tzHVA7iwcgcPqbebGWzlBhR3GDHPPHhrLZrN544w2dOnVKlZWVWrFihVpbWxOAEN33gA7T4TV57su/PdNGBm4vztSybtwfOaFD+G9odPRnZmZGo6Ojqq6uDmeneEnNQaD7ce6LvnnJiR1dXlokHv2jZvT/f7uuXLmi+fl5NTY2qqOjQ/l8Xq+++qo2bdoUmpLcMTmdxr9RbKejMRTq1mvXrg0B3ZEiiwJt6hkM93G0mclkVFtbq46OjkBx8TscGAHCKduWlhb19fWptbVVtbW1CSfKjgSnpN1QvXknnV6sG2cymdDpzn1mZmbC1jTPJIvFxXOdMRCpvE8cOeDocdxQT+fPn9emTZuCE/BmR5w2dUMyHWQOE+Nsh88DYODo20GaZwZcGDEXYGRoaEhf/epX1dfXp8ceeyxRk3bnQ4DxWi9nwUvlvbc4P+TPmKCRAQMuQ18/D5T+PIIpz3C6G0fiDaauq+gnesw9fI5O9SID1zVq/R6AvL7qzIBnomQ9ngEBcHG47hwBUgRgykOTk5NqaWkJvTFxXZl1d6DijF2hUEi8VYy5YqeeISLvGPiwNl7ukMrJg7MRDq5dpqwN69LY2KgrV67oxo0b2rhxY6LZLS6H8F1sA7n7fF3Pnab2HQmsnQd96HyYKOTgJcAYkPMMgJJnrK5Xzc3NWrdunVKplNavX58ASHze+6tcp2i08zeOeqMevtqpfWfQaN7zgM+FL3M7Z62Y//T0tF544QW99tprqq+v10MPPRTOTomZBe7vfmtmZiaMHT/B/LwxD1txBup2rjs+0D/33HMaHh7WsmXLtHfvXnV0dGjLli1qb2+/iU5DeCyAZ3IsgAcw/u9UGBQxdab4rGgpaVheW+R+ZAmeFUjJbV1Ou0mLrEJnZ6eqq6vDPmsMF6cao0EMzx0xWQLZP3N5/fXXNTk5qf379weU6sGE+7vyE1C8KQ5jxTmzIwHF9i5uQBHUO/dCToyd+RE8GY93bfM87uuONj5lD1kjQ4LI1atXA9DxDNEzDXd4UvLAFdbe63tOI+NoUqlUCPIeKONA5+dnuwwdgDEH7uM1wEKhkHglMLovJY9gjmlyBxxxWcudGrV+KEvWjTk7Pe+0P59HVsjR5++2WllZqWw2G/5gdzTSwqx59uVOm8uDH2chxHV0DzbesOhbWGkW9UzaA7LvrED3HGDxf3fofX19qq6u1uXLl4O/IGHwDBl7cEDFmqGLgEN+j5ydFfAMmYCLvrBm6Fk2m1WxWAwnPzoj5P7LM2P3r55gPPDAA9q3b58aGhrCWmNTPJfvsv7IgETAfazbGQ2Z3psDQ+NyoPmZ5jsHcNw/tpNcLqfTp08HNqKjo0Nr164Na8h3iCd+n4qKirA9D/t10Mu4HHjy7Nu97vhAz3vLJycntWrVKvX19YWmNQ+0khJIFCUnwOCc+Z5TXhgNi+fOj4WsqalRLpcL6IxA4UczxoHdKVmv4ZHV8uxUarFW79tQ+B7OFGXHaGprazU9PZ0IVARmp/claXh4WF/4wheUSqW0devWcLKho14cC/dyZIxcS6XFBp+6urqA/Mm8nIryDMSDkyu+G7AHolKpfK41ToAsJZ0uH5PrwdDRuVOcUplGX7FihT75yU+GDnocKHPHeAGCMa2Mc3e5OVhgvL4fF6fgOucZPs/GOcD0IHOez1ydovfMADkQyOM6Kk5ndnY2lGBYTwJ7XP8kw8rlcmptbQ27URhbfNobjpo1YGw+Xn/m9evXlclk1NTUFDKy5uZm1dXVhbMHPDA4jSwlX0aDLnmmR5nPbdppV2lxBxLb45An+uu6LCkBBHi+B474cqoX0N/d3R0avvgMvyPYMV9skbEid29GRbedqua+6Fyc3fq9YJ28JOHAEP/j22gJWoCjOEuvr68PRwG7Lrtfwy7xq9iPA4xisRiy5LgsG9uf28PQ0JBef/11DQ4Oqru7W9u3b9eSJUvC8ymJegMn+tff36/z58+rVCqpsbExAeS9+c7LPw6e+RsfxLr6ensceDud93d8oK+urk68YcudqyMoBMwCumPxRcCBUINyRXQk7AFoZmZGNTU1IcOQyotE9uzOxo3FA1V1dXVoBgJxOh3Kz1EwR6rusLgPKJp6sQfUXC4XAkNTU5Mef/xxVVZWhm1ZyITMiysGCzF1CwLmchl78HQnyxpJCopPdpDL5bSwsBDWN5VKaWJiQhcuXFBzc7M6OjoklV9uRLAlGOEcqLm5Q3CHl06nQ5Mja8pZ/1NTUwFcEPi83g1g9PIFQZm5OoPiVKHTo1LyQBmvr7v+oQ/MEz13ypr/+6lsOCHuw/fc2SB3P6LTSwUeSNkT7sCromJx//zo6KhyuZyqq6vV0NAQgrzTyd5Rz/cKhYLeeustffvb39bSpUv1wQ9+MIDcuro6TU9P3/T2Ow/Gbtesux+EhRzRO+ZCYPOg4NS9M22eGRMMABBQ3lwOHByQe/9KHMTcfgAxrm/u31x/YVi8Xu0lA+zEaWKXgTNOXGTyTks7WPMeJObr4BN5ACRdpk5tOzOCPAC9DlAYB2Px/iieHScI+MxcLqdDhw7pqaee0vj4uJqamjQ3N6e2trZwjof7KuREf9E999yjzs5OpdPpUHrwUqGXMhg3cYTtqPg0SpUO2tyfuH+8neuOD/T79u1TPp/X0qVL1d/ff5MxEOi8hsnlgiTA88cVh/tJZePwbNSzcrJxMmYMUCrvBPAGK3cwbhTevSktGlA2m5VUfkENRs29naZiLPEBLJ5BplKpwBLcd999IQDdav7Mx0sOzHtsbEzV1dXhXtL/095/B8l1nWf++NM9eXpyHgwwwCBnggQTmESKlEBSpBVoSyvRtGzJsizT3pLktV0q79extiTbZbu8XjmUgyhXrUxJK0uyEiWSEgNIMEcEIgODNBgMJvb05L6/P+b3Of3cC0gEvQrWbJ+qKWCmb997zpvf533PuYWDNOADv2N4k9mh1xxRmtHRUZ05c0azs7MB2pyZmdHDDz+sr3/961q8eLHuueceLV26NETUHv1L59eKHa3x4IN6K9F7cttYcg3w1o2iv8qVtTEwTt4zAR0xSET43kjG3L350GUlCQH6vxhSDGIul1M2m42VhJABr9Xm84XjcJF57oGseuYPbZjn4cOHtXv3bp09e1aZTEbLly/X2rVr1djYGBwA9/VAEtkdHx9Xf3+/qqurQxCd1A900vXAg2zWjmw5+oH+SoUmLfju8Kk7RUd5HBV0OXPn5wGHo24e+BIokEHyXD/wCZlwOjs0zz2RD69Vc3+3W+iyl3c8YfCyDE4ZuXcEC/lKrsmzej4DaUwmCK5DyCn0Tx5ChOPmb8hnsl8FOkFPD2bz+bzOnTun0dFR5XI5zc7O6ujRozH59h4EL6VWVFRo8eLF6ujoiAX3IFvoCutwVIMy78jIiM6ePav+/n4NDw+HvquWlpZw5C7PhocXOxa8o7/66qsDfOOvfCR7x7jixGCKN4UhfL5/1d+Uh0BJ88Yb4+PQi0fZOANHEnDc/OCYysrmXxKDEqCQPheiQMoMDvs5vOMQLQqE0lIXxWFj3N3puRJKhUwUweW5KBfwmlQ4otjhWhTYnYrv++UZGHzP7vg76/Paam9vr06fPq0oijQ4OKjm5mbV1NTEEBtOn8IgIAcMaE2mD589i+b/7hySxk5SqBd7VkTG5vVKeIacUA/1stGFAlGcAvPDubszYn7Od4ymB5sEak4P/17ynd/Irht2mqKy2WzIXpHjwcFB7d27V0899ZROnjypmpoaZbNZNTU1BYTEEQ3W7NtC165dq0wmE/SZOSadkvdZuLGGZklHDE9BNpBbymt850J1fZwiiYAjfvCGQAz5cifvgawUd2SedZaUFF6gg3xiZ5I8TfZW8FzO8kDHPFOFTtCFa1gf902iXy4Prs9RFGlsbExVVVWx/o0kuuL2DpQpiQ64XhHUecBCcADfHLkhqGCuXtqKoijYgsWLF6upqSmghIsWLVJVVZUqKyvDGyw96EraPA/YsWXMjWsdSeEslsnJSR0+fFhPP/20Dhw4EMq8K1eu1PXXXx+27zlSlSyp/KCx4B291/EQeHcwHimiOBDUz6j2s5adqThlmEi3sKTYZ65IUvxELnfYOA3Pnh02RSGAo7gfMI8rEffxbNYdYj6fD/AqAuwCicA6VIbTvVAQ4M1cKEN5eXl4YxmBAWv2QMMRE77L+QeOQsCb6upqpVKp8O4Dz1K2bdumubk5dXZ2avny5cFoXgie9AjbM0cp3neAAXSjCYKAc+PzJPKAwcU45XI5PfPMM1qyZImWLl0ay4QJRJibVHDoGFl/57xnRRgVd2BJGbhQlouT8bfseZ0+ue5koIjhxCFRCvIejcHBQQ0MDGhyclJnzpzR2bNnw0mIJ06c0ODgoFauXKnKysrQ/JrP52MIBs+uq6sLnecgUp6RptPpcPYCDhcH7bI2MTGhubn5dy84ckDmDuLlDtufg055fRyUxQ/g8tIcc0Xu+JsHt9AUeXZZ5T7upPzvSWfAd5FVylqVlZWqq6sLgTq66fRyeZEUthk6DWleq6mpCet02mBH/TjpZBJB4gTt3A6yTg84sAeOpmGXPaAjQMZWun6UlZWFd24gp9XV1dq4caNKSkrU29urhoYGbdmyJfYM7xdAZ103mCO2FruY5C38Jkg4ceKEnn32WT333HMaGBgI6+7v71cURWpsbAxvcEVf38hY8I4+2cTlcKI7EnfACDeHmiAcKIBnC56pHzhwQLOzs1q7dm0QLLLIJIOBCb1RMAl/JufmEalnk240HJ5loHi+DoQWtMCjTa+RkcF5QxfQmDTv0LmGufFOAUk6ePCgstmsNmzYEIywZ/rQw2FBgi2yFIcR3dD5MZPepb1+/XotX75cUqE+yxvNPKBC4TEI7lhZHzzxWje8cYjTT4nDiBEgcvyp91B0d3fHmsYcHXHEhoHzZU7IFnLAq4HhlQcMXr5x54sck3k4VOrZJXxOpVKhkZJrmAvoGL0oHsROTEzo/vvv1549e/S2t71N1dXVoamptLQ0IG5RFAXHDSwvxc+IhxYehMIzRz5chnzLIuuenJzUV7/6VY2Njemuu+4K7+KATs5vR4GQYc9gGThMnxO0888dfXGjzTPhmTs4DxyxTQ61Mxfk3GmEvkRRpKamJjU3N8dQBnSMuTny5LV07ATzSqfTGhoa0oMPPqgNGzZo7dq1sRJJaWmp9u/fr2PHjumGG24IsukIi6M1HmA7KuV9Ix6kJ8t/6XThHQeSYghi0r7AV/QqiuabQTs7O9XW1hbo5T0m0DiJ0BJYolfopWf38Il7oZPQf3x8XKdPn9bQ0FBIOqIo0ujoqPbu3Rur/7tNuNix4B19EiLmx4VRKiil7yP1OhhKjkH3LF2Sjh07pn/4h39QeXm5fvVXf1U9PT1BkXEODlEB6Tc0NKihoSEoGgZTKhh0fnCwCKxnfu6AMKCu9L5G/u+QrFTYa5qE6aEf9CRypg7rQQZGg/X43l+UFAX3gMHX67/TgIXBYr2ehXItz6cXAcUjGCEL5nrPPBxWdAcOrx1q9O0+ZOkYK+QCWpERgppgeOgpgB7JznjPmlxO/ShY5JN1OWQMLTFYJ06cUEVFRXBonnl5QxDBAJAichFFUeic99MjXU6QBWjhsHFdXZ3q6urU1tYWdqD09fUpk8mEMy28N4ByB7rIeqX48cOuA15qYF7OL0dGJIW+EUfBHJ1wR0JQzbM86HJH6pk/jgnEx4NhnuOIyIV0DWSPzI/5O0KAfCDz3gDn9/J1pFKpWBLjw4OXZLMeaAV2oqKiIhxsc6G1JdFBdBeZhY5eEvEkxfWeADYJu8Nn5jo6Oqrp6Wk1NTWFZ3pZib9BF+QJOfGEK9nczOB33moHaugIjKPEyAgvOXL0guu8V8gDGN4X4XLOdy92LHhHj5C5cnjm5hkoMI+k8zJlBA7iukATAGC82YJF5OZd1V6Lw+EREEjzikRGRK3THRIGnCYibzbxrBfB5hn8TrSMg6EGCU047amkpCS859whNo+e/UQ3vuNZRHl5ubZt2xYz+L73PZfLaWBgQGfPnlU6PX/efUdHR6whi6AB5YeeyfMKkkiJK04qlVJDQ0NYs5dQvITgGTLr4nqMNmt1Y0iAlIQTuQ88d+gP+fImJOaCI3TnhMFJbs1JZuWshXsSPI6OjgZj7GvFcLsT9WyeYMZryazdsySCHUc6oE1FRYXe9a536R3veIfS6fn3OTQ0NGhsbEwlJSXq6ekJh+OgN3Nzc7H9xugGn3lG6hk0fOVvSb4B6VdVVektb3mLZmZmVFtbG77vQW8+XzhPgm1kSbvgPEe+pAJUjk6RgeOQ0Hsv7fHjtPbMPonUed3eExmHk13+sFNOExwmw/+WLCHlcrmgFwSB9fX12rZtW5iXz3Vubk7Lly/X0qVLgyN02eHfZIDoc/BgizVCX38mcjg9Pa3R0dFQ6+dMEXQEuic79n39rC8ZqDBXtyuOSvB99N5pTMIxMDAQ+iM8YGlsbFRLS4vq6upiwQWn7HGAmgdvyQDtB40F7+gRoqShcqcrFd5VTIOHZzpSofGCrnReWwgzu7q69OEPfzjAajzbs3icJMMjMoelcF4OBSLYDp+RteMw6MalR4C/M1BO6qCgBxhIGqYwXDgPhzK5zpUdg+DZp9fgcFA4giiK1N/fry996Ut6+umnw8EvHR0duvnmm/WWt7wlGF8UhOf4QTQnT57UZz/7WV177bW69tprY9uGvIThzsAzQ6BODtrwDJ6AKJvNBifk2bc7cy8NJNEVRxrgpxtQdxAOg/sa3ClgiAg6kWnu55khz89kMlq3bl2gmzsnR1H8+/DTHSbIE4Gxn7XNYTfoGfeD/8jkzMyMmpqaVF9fHxw3RpfGRy9f+I6Y71cTZQ1sPfV7wccLOeaamprAH+7tgS00HBwc1OzsrBoaGoJ8pNPpsD2QkQzmoSf9M75zAx7yelZHV6DJheTWeeUokAcK7szcOeFUCOawc9A0ic7wu6N8Dlt7OQraz80VavA4d9brTtV/d+fOXCmpuf3iXlwjxd9ZAt87Oztj90r2o/A9ZNV1D/nzIGxyclKjo6MhgYMHyKH3ALj8T0xMBD6BUHV2dgab4brc2tqqzZs3a2xsLCRBBABXX3212tvbY9C/FEdoX28seEePsJHhIYyecbmzB8J0GNUjdd4ih5JQR5QUc07J2pEUj/Jx2jQeeW3eDZlnkMk6llTo+H/ppZf07LPPqra2Vtddd526u7uDwc/lcrEGIyAusmXuE0WF7lMU37NS32vuNWWpAFM7rOxZudcjR0dH9Q//8A967LHHJEmtra2anJzUnj17dOLECc3MzOgd73hHQDPgB3SCfnTO+4lYHkx5rc/r4zgyPvcIHsMH7f1ADnfW8NOdAjLBnCXFaMCz2dVA0MTcvexChuwQJQbLEZakDPu1rMHlz7MAnCnr46ho5uKBB4bdt4S6I2D41jWCyUwmE3uLHyUZ5MrLUsico1PJgNT/Za6e0TqtkBWHnuF/0qGxXu4F4nHw4EENDQ3puuuuC7yWFHa5IPPwK/k8twfJ53pwcKFAy5EyZKG8vDy2Ldahekeb8vnCGxS9O59khm2JHuh4kIr8ItPJI2mBro8ePaq+vj5NT0+rsbFRixYtUkNDQ5gf8+df7I07XdYOT93+umNHhnzO2HUOyJEKJ9ZxHb0lSRQFmfVg3OntQStIosuMZ+/QynXeUdcoisLJmjybZ5aVlWn9+vVKp+fP6xgcHFRpaalWr16tLVu2qLa2NrZup9/FjAXv6N3wINw0oXmHuzsRPyBEKhhpar3exe7wLsx3AZQKxsUzLYfb/TlSISBwKNazOIwvgj0wMKDvfOc7evnll1VdXR22hXjwwH1xkC6cKJhnzrwqtqamJha0+D29DOLNa54tTE5OhpOupHkFf+KJJ/Tkk0+GeZw9ezaUKs6dO6dvfOMbuvTSS7Vy5crYfnUPItLptJYsWaIPfvCD4bhMom94yymEHvGjuMgEJQAMTDIQ9CyJ9aGo8BVZoOTicLsbFFdq/xvGjEyZ7zEIHNzB4cgwghy4QSkGA8RWT5yHf9ezN+gK7aAV6/Htn8glDtGzM4f+X3zxRfX39+vNb35zWIM3btLFTSDmZ8OD5CQzTkdq0En44tuZyIr8/eh+LbRHR30dvraysjKtXLky5hgdqQAu5l/gfu7ngQnyBQ+SjgJbwXw8E2cuDG8U9gydoIvvO/Ts0L7Pze0gc+N651mS3hMTEzpy5Igef/zx8C72RYsWacuWLdqwYYPKy8vV39+vJUuWhATJG0MdnUCmpqengy3xkgp8J1hB3qDb3Nxc2InjjXDIxb59+3TmzBlFUaSlS5eqs7NTNTU1Ya2e7Xtggd40NTWFecB37JIfhuW2QiokE6xzZmZGk5OToUnXS5rNzc3avHmzuru7QxJVVVUVAmXm5/7mYseCd/QIMs6V6ApHS7YJ4/jMa5HudP0YUwTVs0nfB8r1wEfAtkR3wDpu3DAW3DcJ8bgBkArCMzY2FjPErggeyTu07HUyLzHwN+bsnaQ4KjdUPAe4XirUoL0EQSb34osvBmfjJQCee+bMGR08eFDr1q2LGRzW6utDuek7IPPwTJV1Qy+v0ROlO2zpZQw3hNAgmZ373BlJ5Xbnwf2hLcYGOeUazwykwp5qGsjc2Xu2jfx67wlrdcdOxsd6vK7I/b1xyVEwrmGNUjwzm5ub0+LFi5XL5fTlL39ZjY2NuvXWW2MG1eugGC53VPDJX17j17qzmJ2d1dNPP610Oq0rr7wyyB2641CuO3iHVjG6rs+pVCoYeS89eQDBQD+8bwVauz2BRk63ZEDIfFzX+exCgZVD6siZo29+ngGJjF/n62UwJ9ZEQInuT01N6fDhw9qzZ496e3uVz+fV39+vsrIydXV1qaGhQc3NzcFJeRkUB+wJBGVIZIutyo7+uLND97xvwMsVZWVlGhsb044dO/T000/r3LlziqJInZ2duummm3TZZZfF9tv7AVMO6zNneMhnlKo8kYOX2Fd2/Xg5jpd00StCACkpvNSstLQ01p/lvRTIvycwrzcWvKNHODCoKL9n+YykEXSjxL3cwOPcMLYO21EH9wjPnQWOAOiODIt7IiRA75Jia6BzM51Oq62tTTfccIMymYwaGhq0devW2KlpwEXecYqgJBVwenpaIyMjqqmpCQ7Ss5KkofHsDseOwPuaMIKcfw786NAYY3Z2VtlsNjhVaOY1eEcVPMtgvp7581pieOcNSg6rYvzIOlgLcuI1Uebm83FH6LVVKR4YIpO+tc8zCIeHMeQeGHoTnaMnySDUgwUvaUAnDyySTpvMlGfzVrry8vLQQ+LwpcsCf1u0aFE4IIfTxvxlJdA/l8spiqJwqAoIG/OGv+7YPRtmvoODg5IKAQS8dlp6kyV8dWTDy1vYCebrAcD4+HjIuPhebW1tcDgOAxOEMh/kEp74s5OQdTKQ8ADL+zZcpsh4eZYHMuiNN7xCG086oJE3tnpQyvOnpqbCKXKsfWxsTKWlpaEBljIf83QnicNDtghC2PVBzxA88KZo5z1zBpEiw963b58ee+wxnT59OuxYOnfunGZmZtTY2Ki1a9fGZCyZ2aMTBNjooQfk8Ih7cB28dznq7e3Vt771LS1ZskSLFi1SJpOJnaXvdsoTMfSCgXxc7Fjwjl5SLDNFeBxec0Pn0W1SySC2O0YEGIjNG7W8ASQJD50+fVozMzNatGiRampqYhkLDU8IL1uj2tvbg3N3R1pWVqZbbrlF11xzjUpKSsIBNcyReyJA3vyDkEOLXC6nXbt2ac2aNWpra4tBol6r96Nw3TDTlJZ04NC3tHT+vHwp/m4ArkGom5qaYgbYnbPzzR2C1+X4DhmLK28yqybA4e9klcCTlHt4DhCpIwP833sRuJfXF50eQHjIGnNB4TFuoDEMUAoPNpKQInJPlu4IDrxgnsl6drI0w/U4Ck75g55eO/bAJpVKacmSJdqwYYNqa2vDeeFu0Dz49Dkin17Ocj1y2SJYfetb3xoCHmjh2Ty7WNxIcx/fOufITjII8KYrSeft9U9medCNf1l7crcFz2VuyDGBhNslLzH6/bkuicowd296GxsbO69s5VmjVCg5JtEQZLukpEStra3q6upSNpsNGSpHtjrfsCM1NTUBni8rKwvy6egB9tgDZs/qSXb8OrJ5D7Ly+bx6e3vV19en8fHxGH+PHTum48ePq7OzM5zjwJqcJ6w1Wc71smc+P9+MS7nTA0wPEOEFZ0h4sAytfE0eYHoAmHT6FzMWvKN3QUqn0xodHdW3vvUtlZSU6O1vf/sF32yE48ZYoWxEim6oOPUJRfKAQlJsn65U2JtP7dudjkN7bgwaGxtVWhp/b7zDxDTJZDKZMGfm407RM3GpkBV5vaeqqkqbN28O85MKr9D1MoQrA849Wcf2phcUorKyUps2bdILL7wQMnqvS5aWlqqnpyfsu8cZIuTQAIHHALoiYGS8ocizOuaDASfaTqVSIejCIPj7rR2icycPzzwI8QAIAws/uQ+QpiNEnuVBE2TI1+HGzK93Q4XMegbiTtLhXj+q2ZEuHAbP83vxmddJ3Smk02nV1dXpTW9603lIGLrCWvi+O/K5uTmNj4+HUoyv2w0d60JPKbkQSGIoPTCGdwR4zJmgiPt6IIecME9vJoRPyddRIxfu1IG92Y/uQXeywQ/H5ggk5xk4GgVdQA+gBeuARheSYe7jPOW+HKjlTo77lpaWavny5eFkvLGxMTU1Nenyyy9XfX197DW/yANJFjRgzdAp2QPDtZ4ouC2VCpk0ATDrcFtOsMG1IJwuB/AIh+sHJHkSgV11R11ePv9yJs4W8UAB/1NeXq6uri69613vCugnPPUgl3XNzs4GRIPglVIAz7jYseAdvaQQxdMIMTk5GTu9y7P0yclJ7d+/Xzt37tTp06dVVVWl7u5ubdu2TcuXLw9K5A6DbNwdq1QQSoeWYVJnZ2c4O9kdbrL5JZVKqb6+PpbZJZ0K2QoZklQ4Ec4jcgyUG2g3VJKCs+NvKJkrTNIROTriwQ5C7M4inU7rmmuu0e7du/XEE0/EXvhQVlamxYsX6+6771ZnZ2dw2qwXA8SaveaMgnKAhaMxjrpIitGOqBwY3A0/WbdUyJ78DHapkHkS6NCH4IgM8oCDQtZYBzC805a5ekc7gSWyxX0xxp6teh3csx/PUjwAxvBBB2TD9cODDX73miaO0ueLc0wiBP6v08dltaRk/lx35ukZOOuEX54VJ4N7PoMGBJeTk5Pat2+fqqurwy4V5pHcVeLPhQ7w3GFaZMvLVtDbHas7CUcMWL9DxH58rPOdQNiRn6RcOx+9JwQZ9GAcWSdhwPl5EOSBRRRF6ujo0DXXXKM1a9ZoampKNTU1amtri2Wn3ruBs/Q1uIPj7wSejvZMTEyEt1SiH9Af+aU7HbvT2dmpurq6EPyhT83NzWpsbFRlZWVoFJTmg4Vk6SXZF5RE8Zgf7/Ng7m6zoJmkWDLhiB+BNvOIoijsFvCmZObmCerrjQXv6BECHHFzc7PuvPNOlZWVhSNwHX751re+pX/7t3/T8PBwYM7OnTv17LPP6ud//ue1ZcuWWDOLVMiiPNP3aNtryQg7hsoNmBSvu3mUjxPwzmLPFqU4fOgQsddwvX4nFRyXb9fh3q7ckmIQb3LtQPDsC3YDee7cuXBcLTz4wAc+oK6uLj311FMaHBxURUWF1q5dqzvuuEOrV6+OZR2sA4OIUjOXpAFD+Rw6g2bQnoHyuFLzd3hABjo8PKxsNqvKykq1tLTEjDy1QfjkmRryxxwkxZwp90kaPzcSbtjc6MBL5Mo/Q24w2PDKO+ihrzt1STF6Mg9kBEfsaBgGyNEZl5MoKhxG5SMJmbsMugN0CNMbnniWPycZBDskS5boJZ7JycmQlbneMC4Ew3u9OvkdkgrvgXAkIxmAOIrhaAA/nlm6THvg6oEYa0YnHQnkGReSL34ncXG0RlLsjYUECKWlpWppaVFtbW1Mxpg7cuH9L95rQMAA7xxVQmYu1OvjupxEp3iHgiStXr1a11xzjXbs2BEO/Kmrq9MVV1yhVatWxbZ9Jvsj4KU7am/4Q28d7XEee1LifJHmm4gJDL3E6zRHJiiVOc+Sduz1xoJ39FNTU+GtWAhca2tryAYRzsnJST311FP6t3/7Nw0ODsacWyqV0r59+/SFL3xBbW1tWr58eRAElAfj7LAwTTA4b880vPnKjSnPdIVBiJIQHgLpL/ZgTih6ZWVlUC6HSt35SIpFztyLZ0uF+p9vCQHN8LmCRvhJWNCG7YCcKf3ud79bt99+e4D+eMkGmdrIyIiam5vD3Ogid0VIRtr8jR8y8WTtjB8QEv9h3s7X6elpnTlzRrt371ZPT4+amppicsa83Ml4oIDxwji67KDknvFgFDyT84DQswnKCx7xO33cmWJgkUF3aD4/n0OyEx7ngVFyeXUHDZowPT2tU6dO6cknn1Rzc7O2bdsWUCN444aQdSNjBETwlzUkYXjmjHzj0C+0prm5+e1Yq1evDt8heIQuZHZSvBEwaZiZO/LCvb0s46hSEhFKOjw34hwD7DCtl0j8mOBkAIGTZI6Tk5MBWva58l1H7ug18BKCywDXkHh4iRIZ9iDBG2uHh4dVX18fQ+McDXTkxvnq9PHABxvLQWUEvpOTk2pqatL27du1ZMmS8EbLzs5OrVixQs3NzTFnLRWSBmSLNbMWlw+nI3zkyGtoRlYuzZ8sODc3F96kSe9QbW1t8BcekLm8oFv+HhGefzFjwTt6r61ASAyTZ4sjIyN6+OGHwylYbnAQ4IMHD+rVV19Ve3u76uvrY5G4G/YkfEomTVSKIHqE7hFiUvFRJjccZAluABxFwEC6MU9mOo4EIMzAt8lIVopnM6zTDxnCiLDljfkRaJHVk5WRDbS2toashHWdOHFCL7/8su64444YHd3YezTM/VBO30MtFZp5fD+qG8RcLhcylurq6lA/xSGWls6f8d7a2qqGhoYw32TDkgdHzMtfp4n8ORKDnDqM7pG9O2/POtwJOYqEAeYzD9YIDvyeDiF61kBQynOTe9bJWpNGnXWxlt27d+vb3/62Dh06FBpFr7322lgwhqFDB4Bnk93hyB/ymuwJcJqiS76Ni2dS2sK5EBAlncyF1sU17iidX+gX9HeYnIDFnQfXee3fnSbOg3tju+CJfw9eIQfwqqSkJLypMlkTxqmhDw4n+ytjPUnxjN1p5sHioUOHNDg4GF7yhR74uz1YD2tx2iI//kzsB7rs/UGsDdnGITY2Nuqyyy4L63YZQtcI+F3enN+u1x68u52HDz5HeOs2lwZObIrfh/XzXQY67wlUMaO34RE8xMdR0HU6NzenkydP6uDBgwHGw+AxcAjHjx8P9RKvbzmcjxNCcDyCx/k6tDs5ORnem57P58OpaDgx9sEmlYC1OVTvEaELHtk9NT8MNYaWngWH4V2wcSzM36E7qdAxj5GggcRr9PzO9/2wCofAysvLtWTJErW2toYaFXzjWRgfDIBn5u6cmA//ehcya+/t7dXBgwfV19enmpoarVq1Sj09PbGMsKSkRIsWLVJTU1OIyD3DpmFsfHz8vGweuNFrh94IhKG7UBc1Bhx5dOjeHfqFgg32fbNdiawuiWK4k+N7HlT5PMhCXKZdD6A7c0mn09qwYYNyuZzKy8t15MiRGNTswYYHMdw/GYyiwwRZ/ixHLKIoCs/0/gH0je97E6mXa5z+8M7LHWyh8kTAjT76z/99jX5ug5dV0EsvP5Etu0y7HUse7+sJgussc3DombX5i6M8o+V+6HUSRpd0XrnD79Pf369Dhw6Ft9o5uoKcuwzyfeZJOQx+48ChEbRHxxyBccfsO5D8GfAD+5lEDTxgZzjy5mju7Oysdu3apX379mndunXavHlzLLBk7gS0fj9GEtlAl5MBrQc0FzsWvKPHEWLUEXSHiDGINFD5d5MZu1R4dalnc/4dDyaIBqU4REmkTGRZVlYWojsck2cIPMt7ClAOj/CJvPkeA8MkKVYbQpj4G9m8Z3xkBVLhWEfoSGBANO57YX3LoGfy6XTh/dMMN+QIu7/o5ELGwI2hGzip8IpKHCO0SQYvZ8+e1UsvvaSnnnpKfX19amho0MDAQMgY2BstKWT6nmVI55+k5bxhYKA8m+ZzN2ieZfm/vkaP/qGtG4fkuQIYimRDFXz2E+p4PkadOcBbnsn7CZiz199LS+MHP6VSKV166aVqbW3VwMCANm/eHCtHIO/IMLRhvugI9/QAj+tZo8O/Xu91nnu2jA709vZqampKPT09MTpAw2SPBDSBLtgDL315CYNAy2maTqdjR1N7YIqceEnEgz0PeJgrjoo1e+ZJ8OZ7+kGXcHTM1+/HHCYmJmJJACgesDnXg1RVVFTo0ksv1bp162LHkPv8+Y4ffOPoEEimb8F0u5QMYjz4h9/8zr2TQSH6k6QX8uPJiNtg5g/txsfH9fjjj+vpp5/Wa6+9pvb2dnV0dAQasS7fBQO9vYcMWZfiW7qRM3ggxRt1X28seEefdFjJeg/X8LpYDt1wZcE48EpGqQAF+15lHBTMc2FO1sC9Ma+srCy8MMOj3uThFOXl5aEm51GpK7hU6Fh1hXBF5neUHAHE+M3NzYVmEa7zZiYULqkcGAYMFkYR+k1OTurZZ5/V888/r0svvVTXX399iO49a5EUM36OQBBEURumFucQObROrtEdHgHL0NCQjh07pkOHDimbzWp4eFjV1dXasGHDeVEzvIVvDC+1YEhwXJ7xIWvQF1qjwKzbYX2XXRSe+yBHPg9vymLOyATZBLIEbzwYdflEZtwBIZ+sERpTNpmcnIztpHDarV69Wt3d3bFz/l0mCSjp+nYnCx0w/BhMRzv8XAKH9qV4kM2aqENPTEzo8OHDGh4e1pIlS4Isuv4QVLq+MQ/2hXuDlTsQD8ThsdsWtwdOdw8qvETgc/Ng6EKIEDYCh+1z5EAv5MKdiXeeQz94QoDg8/HmQ55dXV2t2traoAd9fX2qrq5WXV1djD78n7ni+Orr64PeetIFzT3bdaTRZd5/RzdIstxWwBcPaqOo8J6NZOYNzXh2ZWWluru7dezYMZWXl+vMmTMqKSk574x6ggd45gmO0wNb4/QkIfM1XexY8I4eIZfiR4k6zJZOz293u/LKK8PhCq6gOPk1a9Zo69atwckgoN4s5MzxrNYzPoQEpiKwKDmGAIFgby0ZKkrGthD28rMud7AuzAgsc2AeKDfCyLM8+0kiCFLBYGGgHeaENnS6lpaW6ty5c/r2t7+t3bt369SpU1q3bp06OjpivMLReZRNNuEQK7W1VKpwABDOanx8PMDVDjV7QybGzJWY9eG0fL3A/nzv7Nmzqq+vjzXhpVKpsJfayw1E4cif18NRdo/4gWNdztzIJTNdBrLmaIAHWjiS5D3huwd3jq7AC4e/vZ8EWnm5B0fuELBUOPOB4BAUDT6CFiSdBo4VWeakPs9Ykxkq/PbsNSlnBCWXX355LJD0Z/sPGWyytAdtnabQwuWJNfg83C7wHHTOP/fvJJOVpB7AX86qoFludnZWZ8+e1WuvvaZ169aFw6uQQXdeLj/+HO9BcofpSJIH/HyfBlaHzB0p8Z4P5oANZLgT9r4MAm0/MMhtFCXLKIpCgMeJow7tuwx4adMbE73xj/Wk02l1dHSovb1dAwMDuv/++9XU1KR169Zpy5YtamlpCd3zyV6KfD4feoqQZ04znZycVDabVXV1deydIbOzs2H+FzMWvKP3iBmIDUHzWlhFRYVuu+029fX16fnnnw8nKUnzxmn16tX6pV/6JXV2dkq68GEa/J/nIrgIvFTYj+2NOf6yDG9QQWk5IMMzFDJZMl6cG8rqRo4sHCHCwAKpuQGnjODQI/fAOEoFpIT7ek0X4UVZnd51dXWqr6/XsmXLYi/MgX4OkfnfCFo86ODd4vADo4HTYu4oq8OgKExTU5NWr16tEydOaHBwUE1NTVqzZo06OjpCKcVhb+i/aNGiGHSIcYCu1AyhcRLqS67V66zuhJx/0NplzY0ghhFZS2bqbjzdKWPoHPJ0hAIH7FkN13pG5P0M/A7v0EE37hdCFQgy3bmiNy5f6B/rTRpQd5bQ7EIoCyhQWdn8C5xAa5KZJvOHNnw3WaZJwrLIBwE515IEJOnt8umBHvz02q33aMBf32GBTOF0yWSPHTumRx99VIsXL1Zzc3NMh3yg12zv8+ejb9iFZCOjHxzjcsK10AXeeEnGETKGXwsi5yUMeI6eOj9AfggGPeD3ZsYk4oncwXfowzHQBE8TExN64okn9OCDD+rIkSOBzpWVlXrllVd0+PBh/czP/Iw6OjpibwB0BBiUC35NT08rl8vp+PHjOnv2rBYvXqxly5aFngq3AxczFryjR/hcySXFnA/K2tXVpV/7tV/T448/rpdffjlEUhs3btSNN96ozs5O5fP50CCGopOVuGPxDA1DxDUIOb/PzMzEDt0BVsN5YPQJSPwZkmKZinenSoUslXm68XBj7/UsDFAulwsd9EkUhHsnYUnPsPx7FRUVqqmp0d13361z586pp6cnNLUxP6lQW/fBfVA2jCEHxfB36mHwRyr0FGCYUWx+b21t1VVXXaW6ujr19/ervr5e3d3dam9vjwU5ICZzc4WX5Hgw44EPvPIGoSSC5MELcgTPCWCgr2cujtA4nfmbyxrPZa7MDwNHzRaj4fNiTY6IJZ2RFEcNyN7gXxJi5RlJGNQbn9DVZBYHPOpy70GAN7iR9cFrD44xrlzLmtw+JMshXOflOc9gk0249LkkYW6XReQTfnBf0CruBd1AApJolx/36ygVPSYuR/Bu8+bNam1tVUdHR3B+8OZCGbTrdbJ0g1z5TiYv57AOruNaaOuoCs41iURxL+wIiJkHBPyLTHiw6egUaB5z+n6oSrJklERqHDU6cuSIduzYof3792tqairoJPbpiSeeUF1dne64446ABDhP8vl8OBoYdJS5jY2Nqb+/X7W1tcrlcrHEgRNAL2YseEefzOakQr3Jm9KkeQPT0dGhd7zjHdq+fXuIWOvq6kIEKSkYEGqs3MOzMQQfw+/K6NEjys1cS0tLw0tYvGbnW2WkQhbg3dIYC+rVOH2PjHmOZ5beUDUzM6Oamho9+eSTevnll/Xe975XNTU1gX5eDyey9uhZKjTJsH4csCQtXrxYixcv1tTUlM6cORNOp5IKr0XFUOPMq6qqYnCyVNj2407JIWupsB3PSxluuLiG92dzUmFNTU2AyeAv/PYszqFk+IGceA3fv8u1ZMrst0ZuMC7usNkm6LAvsuD9Bl5CcgPl9T83WD4/9MEhSnZq8LlUMJzwCmOfvKc7P58z/zJH70B2OcW5emMrZQd0EH3DqXs2SLMo8/LyiOsez/R/HWaHXj5ndxLQhOsI0riOABoH7HrLde7gWLfPlfkmbQqvYfZSBjzHLnizHmhJRUWFFi9eHGsgdNge+fTsEbpgP9yWeTCaRK48GIZX7li5V7JGzf+Tb75ztND7kJir1+EJPOGPozUui877pNP3a1KpwhHF+ICZmRkdPnxYhw8fDvro94miSNlsVs8//7wuu+wyNTY2xgLSkpKS2E4lnsealyxZoiiKQmMffgFbfbFjwTt6ZxiGyY2wQ0hSwQlKhZPFpAK86SeyoTQe0aKQrqAOxSKgXiclCvWzspkPioago1wIqws4CsX9mLu/EESK7yBw5eSZURSpvr4+NKT19fWptbU1zAEnmKyjQhvmT2mBSBxoDUfJ/bz7meEICPcHpnWn6rC6Z0Gsw5XcyyYoC7yprKxUfX19oDdzcBSBYMgRHZ7Lvbze5w4/yROfH/RyZ+IGH4fhEDGfQz/u5y/bgd4us1zH7w7vUg5i/d5syj35nhttZMlLGw5LO6SMAQSe5BoMtPc2eGObB1OOMExNTWl4eDjQgCNSaeBEd9whTUxMqLa2NgSgHvC6HHm27/VnH8heUg74Dnaguro6Bt37Z46IQXNHWBzuxoZ5UAhtPGOVCod9QXcPADyzpoSCLjjK5jVznotuQifPqD1AhT6OAHn/CfNyZHN8fFyjo6MqKytTJpMJL0JyVMTngW4REHvQ7GgFaAg85Mx97IHvRnAeIGeSQqBOQEbA1dfXF3vFrssqaxweHtapU6e0YsWKcKyzlzWjKDrvkLHZ2Vm1t7erubk5PN9l/42MBe/oaby4UA3Pa7YIC0YJ44ZCoTSeCXvG4MOztmTdCOPIvwgwz3YB8e7lZEbpWQDrQxA8s0sehAJ0D3TLfF1woijS2rVrw//Z359Kzb9UgRoVUa3XFD0rcYMjxff/U9aQzg82PADyXgYCJIcwySwxcMm3dzGnZEAyPT1/8l4ul1NnZ2csIGBNGCPm4kbajZNH8KzfAxOXLRyQO2/+9Z0YyC4G1ANE5JPX/XIv5uGlIz7zUpPDk8kAi+uhMcGNo1YOy7qsoRMeePAvGRbfRfbQDf7P3D3DlApb9vh8YGBAR48e1YEDB3T27FlNTk6qurpazc3N6u7uVk9Pj5qbm8PBONA/nU6H3hDuh466rLl8IZdJ5MZPheQe8M0RhWR5xINspzc643qO3fJ7uwP3e+AA0Tn4imwjqxMTEzp48KDq6uq0cuXKcL3T22We4UGY6xx8Ry94Jv9H56ArOx28KXF8fFz79+/Xvn37dOrUKVVUVGjFihXatGmT2trazuunYkuq85Z/k3bNEQOXc9ZAwMl6PVlwNHZiYiIEjgQ0XgJ1pMN/4L3bFYJ8D6Rp1vPkj/l4gzP39WPLX28seEfvEI4rmBQ/093hUpiAYnuNhyzA6ziegQOluvPyiN2zK89QUAaHAV3RMOhkIN4gxTVu3MkAQBqSfQI+52Rm5rAthsyDJAyXZ3huxHB2/iYpDAz3cmjLrwHCwqDgXHhroEfMKAVZPopIyQUFS0LF0LGmpiZWSvEmLB/MybMbn7MjE6zb684OScM/z8T4PjR02BP5SAar7HMvKyvT+Ph4MADuZL0pyOnlWTIBH06fF244fI8OYXScZkmo1oNab/qDLx5AJINsAgf+7/OV5rP1sbExHTlyRE8++aReeOEF9ff3a2JiIpYRgUa96U1v0urVq2NbxnD8OGIPNNhp4rTHPvjgfqw5SVOup+cCZ+J1WWTFUaMkUgVU6/qIDno5jO95kOR6PzExocHBQQ0ODoZ179u3TytWrAiHCiUDEHecjlQSQPiuFM9KHdXxIIhAk/kn+fzaa6/p/vvv14kTJ8ILaF599VUNDQ3pzW9+c3D22Dl/pjtGaIcNdpsEooKdZE3u4D3JAqb34NjRL9bb0dFxXvAhxdHk8vLy2HHeBBmelHgw5GtzZM/p7ejg640F7+ilONzmkZKkGPE8CnXnjwI4jOpRP0JLVOyR1+TkZBAmFOpCMCBG2gWIazxLRknGxsY0OTmpurq62JYYh2xZJ9/zYIVMDcPiWWk+nw9doGSljlp4FsrcmTPZX3JtjmZ4446jHgQWXqZwHnnHMdk72aH3DXjzGjzx2iaZSVnZ/PkFHm37ujxSZ23wkDn7sxxqdSfm77T3IMTvj0zAN4wk/0c+PfPL5/OxUo/vfUYOUqnClj/+zgCq9i53qdDbkM1mdfr0aZWXl6uxsTHW3MUc3OEzJ6/ZepAIPMo64DH/d3jfoV14IUmnT5/WQw89pKeeekqjo6Oxmn0ul1MqldLY2JjOnj2rs2fP6md/9me1fv16ZTKZUEoCjaqqqgpbMH17qgfi0IP/e5bmBtqz/2S2XVJSEvSJtaAvBFq+nZWgJWkPHPZGn6jVIhfwh3MaxsfHdfDgQe3du1fHjh3T3NycmpubtXjxYjU2NgYe+c4LZAd5Qa6SAYUjEC53yAEoTBLZ4jnozfj4uHp7e3X69GmNjIwE+kxOTuqJJ57Q6tWrg6MHNXDkCsfInJExd/7MqaKiImxLS5bm4LnrjpcH0unCQV/wvKqqSpdccomeeeaZsFOL+aH/paWlWrVqlbq6ukJCQgAxMTERAlB8h/sk3xHhiEmyhPR6Y8E7elc6hjPPsyVvmCK6An7zLNSjbo/uuLcrHhlbOp3W+Ph4gG+l+IEOZMfuKPgbBtLhv1dffVX79+/XmjVrdPnll8fW44YUYXIY2iEkrneY2+fkEJQHSRgEBNrpTKaJU2VPqEfYIAxkR+l0OuwlRdGAR/m/89GNrSMVyYYbPudv8NIzKCA0+i0kxRwafPcsxo21IwXSvBKOjo6GLNnRJDcoDrMicyAC0NzLNxghjBuGFSfgTWQejJAhMWe+j3wkT0P0oGN0dFT5fF61tbWx+ft1SZr4O7QJlD3zJcgku4c23ufCXKBxWVmZzp49q0ceeUSPP/64xsfHgx56Uyx0nJiY0AsvvKDKyko1NjZq1apVQf8HBwd16tQpLVu2TO3t7SEAhYeOitDlzRxpDPVrHNUAVoc3BLP8zZsG5+bir7yG72Tq7kQ9y3PEBJ3lc5zQ9PS0JicnNTAwoD179ujJJ5/UmTNnNDs7q5qaGm3atEmdnZ1asmRJzBZ55uqoG3LtgQFrcUebzOoJNFljMovGZvb39yuXy8WSrenpafX396uvry/WUO3BBvJ1IRsE+sgzkDV6i7wc4Nua4ZVn5B40eIkgl8tp0aJFuuOOO5TP59Xb2xsCypKS+fcL9PT06KabblJzc3OgpTc+ctgSQYRn8smg0uX9jYyL34j3/x+PPfaY7rzzzrCP+Ctf+Ursc5+g//zZn/1ZuGbZsmXnff6pT30qdp9XXnlF119/vSorK7VkyRL96Z/+6RudahgeGTnc7DVBHDPwclVVVeiI5lqcIBmiE96DAjIanA8QdllZWUzo3Xm6I3K6OEzPd2ZmZpTNZjU4OKhcLhfLQrinC4fvV2Y9fMZ8HfLybJP7AVM6KsB8/V/qhGRXfMezSSBJz9ihicPaGAUUNtnXwPfLyspiTpp7e2TM/PwH3sEjVx5o4cEOfPKIHziSZyYRA7IznBeDTMnr20Dn8A5aYVguFOwgt54he+OWBzPwmQDAHSlz4v6lpaWqrq7WokWL1NXVpdraWpWUlMSOLSYg9PnCN68XJx2UpBi/WEN5eXmYu2eH0jwMfujQIT333HMaGRmJrQ358Z+5ufl94y+++KJeeumlEESWlpaqvr5ezc3NIWtmvhho50kulwslNeSQ/zty5utPZvSSglOU5ptZ0QGCBs598AzVUSYG+tTb26vHHntMY2NjYV0EefAmnU5reHhYBw8e1MmTJ5XNZpXL5XTu3DkdOnRIp06dUjabjQXFyNDs7GygBzVpR0F9Cyk2E72YmJgI33UkAL6gLzyPBMuTI4fLHZFj/W6neA620QNukio/2Ar6MF94hR6g9x7su83gjaAEDel0WpdcconuvvtuveUtb9HGjRu1atUqbdq0SW95y1t01113adOmTaqqqlJpaeFFNswDVJYSG3Rwu0JQXF5erpqamjd0/K30H8jox8fHdckll+gDH/iA3vWud533+enTp2O/f+tb39IHP/hB3XXXXbG//9Ef/ZE+9KEPhd/JGCRpdHRUb33rW3XLLbfo7/7u7/Tqq6/qAx/4gBoaGvQrv/Irb2i+3lxVVlYWar3ebOPRp3edenQKbEm25I4YgU2ehuZbV2CcVFBCBlkAzgDjjiHBEIEGzM3N6fLLL1dPT4/a2tpCdAyagKGUCoaBufJs/sa6oJUrpmea0CEJ//Isak6+D5eMxYML1urwPVkl9EXpOVWP+zvU7b0MPkeMHRGzoypeQ8dYePbkw1+m49CepNhhQ5zi5lCdFId74aUfbuJGCiNKjc+Dsv7+fr322msaGRnR0qVLtXr16uBgcXZOFxAQdgTwpiz4gbP2bIzTA70ZjYChsbExlmUzpz179oTXzV5I5lKpwql3rDkJ2WO8gVLd8XnGJ8073N27d6u/vz8EvWwpc3TJHW0+n9fY2JhefvllXXvttWpvb1dJSYkaGhpUVVUVC1y4hwfgoBPZbFYtLS0B5fNXsrIW31OO0+AaEBdoAy+os3tggz3wYM1LANxzbGxMJ06c0MaNG4M+wUPuj7Pm/exu1whgkkEidPTSS1JfXe+QFxxPb2+vduzYoU2bNoWGXuc163Y0oqamRkuWLFFHR4empqbCAT1lZWUBdSCATPbwOIoAz9FRnptE/igTuj44/0HAPAlzRAbaQlPmsnz5cnV1dSmbzYbjmGtqagKy5T1A+B3mgN2j5waaOnIGX+GR76R5vfGGHf1tt92m22677ft+7keaStJXv/pV3XTTTVq+fHns77W1teddy/jf//t/a3p6Wv/8z/+s8vJybdiwQS+99JL+4i/+4g07eiJkGIixQWAcBpPiED8M9LO5fdsQyuCQ2ezsbOzYRxcSDKYb5ySE5AbEoXECFppnGhoawjudpcJ2KwTKHRgZFevDgbsy+3597un1eQy/Gx43Vsln4ESBpjxjg+7UvD2CB/2Azg5fuTMleHCFh4au2AR4BGQOdXI/+AmN2aOMsnuGBj2ZL5krBsQ7l53XF5JLz0x4Po43iiKNjo7qwQcf1He/+11ls1ktXbpU99xzj1auXBnWhlHiux70MVevRSJ33pfhzofhSBBBitN2bGzsPJnxMgPZK7QjaPLsi7VT6nL9KysrC5B5Pj9/ROjp06djgQs09GAdXvL5zMyMjh8/rqGhIXV0dAS6VVdXx+SVzBE9Rxez2azGxsZUW1sbHDyyCP+QdZepJJxPRuk7VdAfXpPsza/ch3/dSZeXl2vlypXq6uqKnbQGbT3brK+vV0dHh44cOaLR0dFA95qamvB2SL5HgML8nH+esSMHOCeXt+HhYe3bt09NTU3hrXVug/z78DqTyWjDhg06d+6cqqqqdOrUKUnzvuTmm2/WkiVLzkOuPCFCrpyXBAxk4DwXPSNbJzny5uWxsTFNTU2poaEhhth5MEby5Q2nyALHCl8IoUQXPGMngPTn8H144d9NojwXM36kNfozZ87oG9/4hj772c+e99mnPvUp/fEf/7G6u7v1vve9Tx/72McCE3fu3KkbbrghBk9s375df/Inf6KhoSE1Njaedz8YyxgdHZUUf4FEOp0OkZyk8wxfsiFKKmSLks47zhTiu/PwhqPkdjfvAUCoPAPhXm6oPMouKSmJ7c9N1uK9VOD7dPncISEMEDRwAfIaEVmCQ6IOSXo26cPre0BSruhuwLwsAS+dFh4UcV+cKjAiz/eI2Wvgnm15NuGOyAeGm8AGI45Dd7p4jRgl5Tt+eh90h+YYIIxLWVlZCNSoj7/88ssaGBhQPp/X8ePHdeDAAa1ZsyaGnlwoi/HSghtwAk9v1kRu+L+vC5q7XHZ1den222+PZZwYVD9IxE8QxOB75uWwtwfeyCVOj5PQstms5ubmAgKB83CZTQ4y/1wuF2TDAzPkJBmQIzeZTEadnZ0hMEg6X2jnWTF0xPZ4n43LMzQBFeLvoHfcz+2NB9jJjA49clvS3NysTZs2aXh4OBzqUl9fr2uvvVYrV65UZWVlDB1y+N7vh21zPfe+FJ6/Zs0avf/974+9uMaRMXeMzqOWlha9+c1v1vr163Xy5Eml02ktXrxYXV1dsR1HjoZ60oFMI0ulpfPbT9mR4nYHm0r5CKSRezlq4DbE7Rxr91ID17PtLZnF85zBwUENDAwoiqJQQpIUSgLQBBvuyYInaG/E2f9IHf1nP/tZ1dbWngfx/9f/+l912WWXqampSU8++aQ+8YlP6PTp0/qLv/gLSVJfX596enpi32lvbw+fXcjRf/KTn9Qf/uEfnvf3ZN0HxYNgrtzunJJQDTU8H66EUmFPMEbfG0hgDMbNnZafj44x8dIBz/JoEkOOA3TI1yHv5OEbGFAa9CYnJzUyMhKDl1B834/qzjOfz4ca3IW2k2AwEGAU3J000JQrSzabDXUsonc/ZAQ+ucPAeIJKTExMhKbH1tbW4PRQbOcVa3O+J42d096zeHiTNDbJuTns6ocGJTO3urq6mOPhfhzsAl9qamrCXDFCBMTQgm1Q7rA8e0UO+NebURme2REAwy+HO5kbPOa7TmuMo0PAZOu8Bth1h8yZQMnli5IDeueOxrMnd/pkueg4WxMJRDzg9swYulZXV8f2W/vw7/s9XLYcdauuro4hEaBaLm/orAfc6C2O01EtXyN8hm9lZWVatWqVysvLtXnzZk1PT6u5uVmbN29WS0tLoAnyxfydju5UQC9d3lgrAc+yZctiNsNR06SOuBNsampSU1OTenp6YutF73lBDwkPvCIw8tp6KpVSJpMJ535I0sDAgPbu3asjR46ooaFB69evV3Nzc9DTiooKVVZWhgNqPOsmGZLiW/j4XVLMtrsO+xkD4+PjevbZZ/Xss89qcnJS69at00033aT29vbwjKS99sQwaWsvdvxIHf0///M/6+677w4Gn/Hxj388/H/z5s0qLy/Xhz/8YX3yk5+MGYg3Mj7xiU/E7js6OhpqO37AhNcBPftB+RBcP3bUIygibqkgpGQv6XRa2WxWQ0NDyuVyKisrU0tLSzAUHulzP06dc5hGKhhkYE2iYq+7epcs60QpHFL3oyBpSnIoiHoS9/POUin+HmlHEuCVR+tA9ayRtbiRpRSB0noEDe09w+P5DjEyD1eqvr4+Pfjgg9q9e7cqKip0+eWX66abblJjY+N5e4C9fOG05P9uML2+Cn88SPFeAEbyNDro6GhAEoVwFAXad3Z2qre3V/l8Plb39KwbWnhW7giNw/NJGBiZwVE4AuQ64+cluBEfHR2NITbOd5cfutX5O2UgDLgHssgCf6dJsbW1NXYdw52S8wB61tfXq6Gh4bw6rjsfvz6fz8dO1kMXUqlUrF8F2iDD8A4Ex+ULGQXhuRCqwrOhiyMxPNuROeQRR8XzQAjQz+rqajU0NIR9/RUVFcpkMrFgwGXF0S/mRvnBa8SOOrAe0Buuc1idv0MLz4rpYC8rKwtv5XTeAsM7/ZkP9HIdxZZgV6enp/XYY4/pkUceUTabVWlpqfbu3asrr7xSQ0NDmp6e1po1a7R+/fpYwzTy6GVX5uy9VegQsuQ9YMxjenpaJ0+e1EsvvaSDBw8GJK+zs1ONjY0aHR3VxMSEuru7Y4gPtJ6entbhw4dVXl6u7u7uC5YEv9/4kTn6xx9/XPv27dPnP//51732qquu0uzsrI4ePRreHHbmzJnYNfz+/er6FRUVFwwSPJqXCufU49A8SkNpYXAyQ/dOcwTbs7fBwUG99NJL2r17t86cOaNMJqNrrrlGl156qaqrq2N1OhxnW1tbKCe4M01C4m6MmIc3GnIGPQLuTVkYIRTN67fskUagyDh4HnPwxq9kF6xUcFbM2z93yBjo1Q+VwSBAaz+aVio4W0cL4AljZmZGzz77rL75zW9qeHhY6XRafX19amlp0TXXXBMrA83MzGhoaEhHjx7V8PCwmpubtWTJknACIA4Qh4+xhw6+RujpZQZJQSmrq6vV3d0dk0lHODxw8bpjFEU6deqU9u3bp/7+fjU1Nam7uztmoMvLy8/LZpijH6hEhuy7FXAWBF7JdTNPqbC/neeAnHz7299WLpfTO9/5zqBDGHCehVx4QIX8VVZWBkide7u8eukkk8lo3bp1evjhh2PHjbpeuM7zU15erlWrVoVz4Vkn5QXPVuEFuu/y5pC7yznXMhyB4/MkrI8Mjo+PB/Stubk5OHNHABwl84SDpMSD71RqvgzAlj2uLykpUU1NTSg/sHPI6eZd6K7zyKWXyXK5nPL5fDhh0INHRzB9/heC8UlEuNa3liXRDBKXJNqGviHH0D+JvvT39+v555/X2bNnQ9Bz6NAhpVIpHT16VNPT86+exhZ48OTbPj3A8X4B1kBXPcEfc+Z7o6OjymazMf8zPDysqakpfe1rX9ORI0d011136aqrrgrf4/mlpaXq6uqK9S9d7PiROfp/+qd/0tatW3XJJZe87rUvvfSS0um02traJEnbtm3T7/7u78aMzoMPPqg1a9ZcELb/QcPrpg5FeY0aiFiKHztKU5TD2J518H++f/r0aT322GN69dVXw2E2ra2tWrNmjTKZjCTF+gjKy8sD2oFR8kiSgAAFRGjcyXuti0MyUE6iSGjg8D7OJpVKhbfIzc7OxpyBGws3qBia5Hwd4WDwXeaMk0B5eSZBCU4nWf+GT545Ivzw6siRI8FxTE5O6uzZszp69KiuuOKKGIyYy+X0yiuv6IEHHtDAwICWLFmi2267LZyT7pmSrwPllQr1QQ9QoCsNSSdPnlR3d7daW1tjwRnfdz6WlpaG7ZzI6+TkpEZHR2NwMs9KvgWL74FywBuMM8OzSW+mY04u45658WyumZmZ0alTp5TL5cIWT5+Dy607ZWTEZYx5ISvef8D3ysvLtX79em3YsEFPPvlk0CPPzl0+oU17e7uuueYatba2xmyAB2fIZXK+IHXJMxIcRfJ3A7iD9EyWspGfOHju3Dn19fXp6NGjqq+v19q1a2OvySXIRDd8e5uvG1uE7HHao/eNMC8PdtEDL/F5ggGtksEF2/VmZma0YsUKtbS0hAANuvsz3Vljz5E7bAfXYDfQB57t/QNVVVUXbBx2+UF/mTcBBeVG72VhK+Ds7KzOnTsX7CXzw3HDSy8ZeKLjO0w8oXPfk8vlNDw8HAK7ubk51dbWavXq1TGdYMsjtAEdrKioUF1d3Xlo0cWMN+zos9msDh48GH4/cuSIXnrppZBxSPOw+Re/+EX9+Z//+Xnf37lzp55++mnddNNNqq2t1c6dO/Wxj31MP//zPx+c+Pve9z794R/+oT74wQ/qd37nd7Rr1y791V/9lf7yL//yjU43Bqf5vkhgJohF9ysQEdeRyXMfqbB1hQgSJ3Ly5EkdOXIk1IhhLBCk11s8+0FoMBAO5brwAikhtMCL7mzcUeZyOY2NjSmfz6u5uTlsLfTte978gXCOj4+HwCSK5ncr9PX1hTfJ1dTUqKmpKdZk5gEC96TsgEMEonNnhpFwiIvhQZorDH/3ICOVSqmpqSlkhNJ8N29bW1swQihTNpvVK6+8on379ml6elpjY2NauXKl1qxZE2u6cucE3b3W63OBV7Ozszp58qSefvppnT17VlVVVSFQTKfTsczDIUiMghvo7u5ubdmyRTU1NVq8eLHWrFkT25+edKDMA9mSCoEW/4c2/spXD1rcCeLoh4eHA/LDequqqvSud71LJSUl4Z3mnsnxPOgGjz2YQBY8M+akP8/8oVNLS4tuvfVW9ff3a//+/THYHRnwzLKhoUG33XZbKHegu+4Eks6NcSGn5bqFk0C+ubdUePkI8s73sEGDg4N69dVX9cILLwTUaXx8XJdddplaWlqC48PZQzdo7wGoO0q3BRz0Mzo6qkwmE7rzmacHIQSHHuBy7DHfB1Xr7+/Xk08+qWw2K0lqaGgIdjKZpPguHUcVvWTgDX5c57zAdoPAEPQlm+ScV0nbE0WR2tratGrVKg0NDYV7NzU1afPmzWpoaNDw8LBWr16t2traWBnFy1HQn14BZI61u43yLb7IXFVVlZqbm3XJJZeE/oGuri51d3eroqJC73nPe9Tf36/Ozs5YYkEy6MgQweDFjjfs6J977jnddNNN4Xfq4u9///t13333SZLuv/9+RVGk9773ved9v6KiQvfff7/+4A/+QFNTU+rp6dHHPvaxWH29vr5e3/nOd3Tvvfdq69atamlp0e/93u+94a11UryRzLNRFI9IGYKiUBgoImEiUa9/ej1UUhBAhLmmpia2RcONBcLDXFC2w4cPhxqNf89r1giUdP4LdaTCvlWE3gXQ62J8hrGbmJjQyy+/rJGREV1++eUaGRnRjh07wpnilAOampq0ceNGbdu2TWvXrlV1dXWsK521oRRsPZyZmYmVMMimmA9KjHJ4lui1Kt+yA08zmYy2bt2qEydOaO/evSotLdXVV1+tSy+9NAaTuZGkDgzPkvSE7hMTEyFTKi8vD528XoIhUMMRgNYQJDrNJYUDgDwyxxgiS21tbbrjjjs0PDwcjALK71mky6yXEHA4nq0l50og61l40vHV1dXF5J5/Ozo6YnCtFN+i57KGnHt3OXNwKNyDWy8BwK9LLrlEv/ALv6DPfe5zOnDgQDC6jhaUlpaqtbVVt99+u+644w41NjaGxr5cLqczZ86ovr4+ZPmUMPyoZzfuOAvm6U4cRwtPoB+/wwuumZqaUl9fn1544QU999xzyuVyOn78uPL5vBYvXqympqZY4OCODv7wnGSQ4qgXAWR9fX2Qb2wMCYPP1xsy2UHhvSmsH5SyrKwsNIp6kOo7BtwxJpEsD8pA5DzAY90OicMraMncvDcJOcTmIPMVFRV629vepkwmo97eXtXW1mrz5s1au3attm7dqsnJSTU0NARZ93KVl2+QB9d76AuPvFHZA+2KigpdcsklWrJkiTKZTOwEzCiab0asr6+P0ZzPPQFM7qi6mJGKPIVaQGN0dFT19fX6/Oc/r46OjnCakCtu8k1wQPBuYHyLEIpPtAiTgfj7+vr0wAMPaM+ePUqn01q2bJmuueaacNa2R7aOEKBwe/bs0RNPPKF3v/vdampqisGQnqGhkMzfo0nvO0BIEQgMfBJRIIofGhrSP/7jP2pwcFDr16/Xjh07dOjQoTAHjDXZWGdnp26//XbdeuutQUCZowc07Ldlra7UTnPPsAjEMDxkVfCCWqY7t8nJSZ0+fVp9fX2qqqrS0qVLQwctCjIxMaFTp07pwIEDeuGFF3T27FmtXr1at9xyi5YuXRpeIZksgTgUSRbi9Vigxyia3/9+5MgRzc7OqrOzU4sWLQoBI/KGMfZshHMa3Ak6+gEf4RlG1psS3RB6zwPGAhmBJtzX38TmKAly4tsNL1R+YP35/HzjHTrhXfmsBbl3FIvfkROH9eEBMjI9Pa19+/Zpx44dev7559Xf3x94UlNTo/Xr1+umm27Sxo0bAxwuzZdCdu7cqW9961vq6OjQL/zCL6ihoSHQkeFvjksiI/DPa9zQgTqyNJ9RAjO7jk9NTenll1/Wl770Je3fvz+gfStWrNDP/dzPacuWLSEQdgfuz4YPyfMpkgiNBz7JxkJHAL1nRoqfxoh+gRDMzMyE42rb2trCiYnoOgHa6OhoKHu4XrsD9cDWS5FeMnAk1uUCOXckkHtPT8+fHU9Zxe3g5ORkOJOe1+DSt5UsHzHHZLDnJV8vyxDooNuua757yOWKQYDEPKEH19HHxdpLS0s1ODiot7zlLRoZGQl797/fWPBn3T/00ENas2aN1qxZo0WLFsUgUwTCm0JghjOI63HuZGkOseXzebW2tuqd73ynrrjiigA18sYih1fdcbjiLV++XN3d3aqtrQ2MdoeDUkrx10h6ZuuGxbMB35/t9ScXvOrqam3btk2PPPKIPv/5z4d9y1K8C5tgp6+vT1/96lc1MzOjd7zjHaqurg7GzaEuV9IkdOpOxfdeJx27N8cR8XtT0ezsbDhha+nSpWGeTvPZ2VkdO3ZMjz32mKqqqrR9+/ZwFjrbNz2C9zqr16eZP4bDjRnoAluZCGg8U4b2zI1dFC577mDcKPMM79h2R+tBwfT0dGjES2bayBUZuvc/8HzonDxfwrvCoRnGEIOFbiQDCIf4cU7QLp1Ox05rw4kS1GJIU6mU1q1bp+XLl+stb3lLcDwVFRVqaWlRZ2dnaIjiHqWl83ucR0ZGdPbsWZWUlCibzcYaMD1AcdkZGBhQQ0NDLKiBDtCAv8NfeI7sOS8rKytD4C8pdMFXVVXFTupz2B+5R969Ju70htesF/q50ya4zmazQT4kxfpIeKbzDf4uWrQo2EEP/j2Qxd54ecplKIlOeNbusL/bB/7FPlC+dFvq83f6OlrV3Nx8XvDs12NvkEOcvT/bg6+kbYTXrodegkTmHfnx4MUDaOiVbC4kwLvYseAd/eOPP66jR4+GelpTU1PM2dMY5k7EnaVUgFGSwsBnUqE2Dfzj0J6kWM3GywDeNOXGCaPt8/JoD4FwmJw5etaNYGKE6MhlDe5sgeP2798fc/I4BD/AAaU5d+6cvve976m7u1tXXHFFcL4YB5pIHJ71SBVlQeC9AdEVyA1sEnLECI2NjYXdDvX19aG25RH2wMCADh06pM7OTnV2dqq1tTUYxWTGye9eWvGtlU5HlNSdH9A5a3FoFIPsxkRSMGCsk2v8nl5PxTl66QGjR6YBD6h/e7DngRcBhzteDwa8XODz80AWR+1G0XmZLB8gw56xJAMDN6zMDYe/YsUKdXd3x2jP8xhurC+77DJJ87t3eF+HOzQPlgmGHH2BBsmMzIMsz6wJHlx2W1tbtWXLlgDjNzQ06PLLLw8nwMFnR+KSco/tcBg7l8upuro6JnfwAF1jLaOjo3rxxRfV3Nys9evXB97RU4K9cTQGZIAgBodIUJLMOL1ZzrN+6IQtopEtacs8yEH+OZQJm+165IEDKKLzkqAYGw9y4zYLe+IlQj4bHx8/75Q9T0CQU+TjQn1cnkC4/iODfiRyMsnCTtEwmJTBHzQWvKOfmprSsWPHtGvXrgDlQiCICWTqinGhc6g9akYoUQIEEyftEJNnc0lDAXSHA8HII3QYMKJdEAg3bJ6BOHRH9o/Bp1HHa8O+rsnJST3wwAM6ceJELGumKz+bzYbOf4dq+/r69Oijj2rdunWxZrtko9LMzEzsnHCHgh0y9rVgKMrKysL+V4afEphKpbR//369/PLLamlp0ZVXXhnoDV9KS0u1ePFivelNb1JLS0uo3aLsrIsfBsrsjYuskR9/z0GyzkhG40472bzmp3+5EfdauX+PZ7qcucOS5h0O/EgaQ+ic7H9IZjp8j/l7EOEoFwYSnruRQ9b8OncMjmxJ8SNCHY6F9sgeeuGlDtZMGYWBDre0tOhNb3pTkE9knF4d1o+uRVGk1tbWYAu8ARA7QTAFX7wO7egW9qK5uVlbt25VZ2enhoeHVVdXp87OTjU3N8e2NiILOHNKXb4VDlkhi/b5u3zBC/5eXV2trq4uVVVVhSAPJ8/80XWCDgIKL2c5kuHlCzJ61gKvkRlHjFijB7a+4wreJYNU5uSJQzIzTuqHQ/DeU4CcYtO8vwR997Mg+JdkyvsffAu37/v3ng1Hm5KIievx1NRUSFI5N98TuosdC97RQ6zh4eHQRAWxURIG0aHX6D2a4nc3EMljId1weibhxpVoEAVxh+0O/9ChQ6qrq1NbW1twiA7dY3hxMpKC4fUImeejcK5sCFt5ebmOHz+u559/PgQ9Ho1zQlkS2k6l5uHZ1157TceOHQsvQXFHmcwsoK1Hxhdah5ckCKQcvnVF5rzw8fFx1dfXB6eSRF46OjrU2toazl2ANuy4ILuEbqlU4X3uGC8MgfMbo0hDJ3xMnmKWrLcyLwy5H5LhDhuaeNBIMyHywHyT2+XgH4FesiTE2QnuCMjSGF7DdoQE+vJedObBgC4e9OTz8wfH4JhAEjy4IfhBluG9Z2keOCVLYcwTnXJD6t/xgBtH77RnuOPyum+yFIVdwIAjtzgQ6t3t7e3hICdvTkW2uN4b/nzNBPSgVhMTE+H/2AqH9H0gk6tXr47ZNxwOug0SB088c+d37g39eJ4HlwQLfp4JdPTsHLrzHUfTXNfYQUCZxXtOoD+JBXroJU6G66IHuclSAMEc/POEwJ00DYweQPg7EBzV8sAJGUyiV319fTpw4ID6+vqUSqW0bNmysMU8KZ+vNxa8o0c4Ghsbw/nLkmLCKxXgPY/0YAoOLek4aU45efKkoigK5zJ73QtBdCPAD9EozPX61ejoqP793/9dy5Yt05133hnbloJRkQpQLYKDsfLMFzqwTs+4yOQl6eTJkxoZGYkFCbOzs+FNVxgf1sU1MzMzGh4eVl9fX0zZWItUOG/egxDm6bU4AiQ6dfk+kbHzyY1DSUmJVqxYoZqaGtXW1qqtrS3WNAaN/DWwDsniVHAiznM3Hm6sXZFra2s1MzMTAjG+zyspuQ/rcYcsxU9Hc8PugWCyQcnvQUbEGpLGMvlc6OxwO3LiGQc8ISh2FIEAmi1hHtA4byTFINdkgAdvvLaKc/ZGzNLS0lBqQzdZH8NpQ1CAwefYZ39+sr8C/iYDYi+bSIrRyJEJno/e44x43zg7T1zXvbEXeXSUzzNdd4bMg3Wjl/5+A+cXnzNvrxt7QOCBpQeiBDduz/jcm9C8E98RMj5HVpBBdNqDeu6XRNn4PYkQ+WeejPAMX7vLHfP1nVSUIxxOpx/AaQ+v3b7AP54HwuRNmh6Ug14QhJNIUFp54okndPz4cUnS8uXLNTMzo61btwZ7c7FjwTv66upqtbe3a/369eFAHldsj6xwpJ7J+F5WoFWMeDab1aOPPqodO3aotrZW11xzjbZt2xarr2Ac3KjyXBwsHaLAhwjntm3bwhYmFxCifHdMnt16jdnr42Sw3oPgWTQvWnB4Ckfv8GtSaVGGwcHBAHF5VuE0Qzml88848ECGuWI8oRuZA3/j/5WVlWpqagqOPGnkkvt3/Rhh6fxDPnhlLHOGfwRxTidkgyMsHdWAbgQmfqxrsjTkEKZDkTzf4XCv13rg53znHh54+clkGFzkCBp5Exefe70S3r3wwgvasWOH3v3ud6ujoyPQ0OftAW/SEHIfN3g4H97SiOHlGg9gPTCgNIUeeADPWysdAoYuzMG7rOfm5mJn0KM/3v3NFrVkV73Ti+t83TgmD8r5gebU9pMvRGIOF2ruhD/IHDTHsU1OTmp4eDh0wzc3N6u6ujrYDvieROPYHovuJ8tlUrxjnOf5ITPJw428Ro5N9EyZIIuAj+Ey7oGBoxHJMiu2GJsKrVx/vVbu92A+4+PjGh4eVn19fdhK7MGn2ydHk5jDxMREkG9JoW/DAyoQTeZ17tw57dq1K5zLEkWRXnvtNWUyGa1Zsya8E+Rix4J39Ndcc416enq0adOm8JITN54IH4Lmx9E6070OSD11cHBQe/bsUV9fnwYGBsLpXb7lBGXmefQDYAySjScIXH19vS6//PIwNxyX1/u8RoogY7T8xC6UmOzGa+d8z40sRsfrkUmoyJWESJitaf6ZoyBu8DDgPJO1SIVtWw6ROoKQbJJBqYBA5+bmm41cIdlCxNo8o/FAD6PmwUry3ARfk0fyvN6S/fMYLKkArXtWiKFKZrnMyenmdCc7gBae7fF3+CcplhnyPBxFsq/ADZgjPx48IquLFy/Wddddp4aGBs3NzcWcM2sh0KmpqYk1LXmAUlNTE0pDHkC6nNG977KCw4OeyAHGF3q4nhFokW27s0xmmo6CuTFHhqCZpJgDdkjYecLcyboJQlzGKRH464c9S2VOfiQ06IUfZ+ylmOHhYT366KPas2ePBgcHlU7Pv2XupptuUmdnZ8weQAPPWr+fjDFfaOzBEJ8jW65/yJ7zG7nAOXrTq5d8nJbYL5y321po7CUyDzQ8CPB7Ia/cZ2BgQEeOHNHIyEg4y6KtrU2ZTCYWjLNm7/CXCkgWNOalW0k9gdbwlhMn2RGGPzp79qxGR0fV1NSkNzIWvKO/5ZZb1NHRofr6+th2EJzf+Pj4eVlVsp7j2U/S8Hd0dOjs2bPq7++PORoGRsOdtBTfHoNQotAOy7pxc2XwdVAG4F6urN4AQiZBfQvBwvC1tbWpuro6HGnqzWcMFNGhQJSxpaXlvDk7NJlEUhweR7Fra2tDBkAwgBLBJ18/zsOfNzQ0pJGRkXBSI7zC2Ejx7VBe8/ZGR6JsYGrm6mUWhwYzmUyobTJXn5dnzZ7BQw/mlwzcvNHMG5ySRolyAvzG+Hqm5cbX+w24r1RwIqw32TxHaaW2tjYEozMzM9q/f7+WLl2qpqammP4QYEJXeOIZHPSamZnRzp071dnZqY0bNwZa+WE2bhA9eMSYch/k1b9XXV2t6enpQGv4MDk5qfr6+ljzHPf1rU2OLPizKfURDCDP3J85OOo2OTmpEydOaHBwUM3NzeEFWI4cwB+CcUfn+J31Yt9ANtD5Rx99VA8//LCy2WzgBccXv/Od71RnZ2fglaMa6JoH5MibH4LlSYvXpF2eQPaSjarQDtlyufPjZr1s4MgbTtTp6wkQ+pOE59EJZBkdQCfy+bzOnj2r5557Ti+88IIGBgZUVVWlFStWhIPCeH8Cz+U5yYAC+YFu7Ll3tMbplUqlwkucOBYbGjc0NASUCJ5czFjwjp49tZ5duAN3BpeUFF5/mGSWNwbhXBobG7Vt2zbV19drbGxMl19+edijiUFE2aRCk4xDYcnsCuFkD7TXxugOThpvfyMdGY4rjxR3SKzJYSZJWrRokRoaGnT27NlgXDyTA4lwx89829ratGbNmpiBxwBBD/4PzOYKCi1wqDgrN6jJjAJFxYgwUATfKoOCk42xptLS0rD3n2CM+WFMyO48M3CaQ++mpqYAdcJLjIgrsiNKrJs5ISO+x9wNP/RGybmXr8shd3iFbHhGxZrIHvkuxp7jgNEb6JdKpYJD8nIDR/Qiq8g4jY8YZnhJUIOxleYz97q6ukAb9NIP7JEKDhOjj3xBS0oj3tWcz+dDlzlBBzJKgIlDIMhEvryHg98lxRp3WbfXTj3IJ2goLS3VuXPn9MADD+jZZ59Vf3+/KisrdcMNN+id73ynysrKYiUivgO93CZ5/Rld9QOdhoaG9Oqrr2pgYCBWGkin09qzZ49uuukmtbW1Bbo5bTxYTCYwOHjW7PPyhMZLG+gONPcdJvAUGntJx0s2yYTsQo252AyC5+QOFhAG1xWSH0d7aE7eu3dvsLlnz55VdXW1Fi1adF5/B74jm82qt7dXJ0+eVDqdVktLi5YtWxaa6JKIhydkrKWrq0uXXXaZpqamdPDgQU1PT6ulpUXXXXedWlpaYqjGxYwF7+ilC78GtKSkJNROqDslt9ThsGZnZ2NwqTRvYDOZjJYtW6a2trZg/FAIF3qpsI8eBUJwpEIzjMPt3tWNkJNZMg8EzOvMDp/5350OjhrwSshUKqXW1lZdeumlOnbsWMz5QCN/Pn8HrrrhhhsCnMRz3Jmh0Hzm26U8m0YJvKaKceA+QODQ1RUliubfcV5bWxuaHrPZbKz/gT22GHMMmqMFDiGSuYCeePbhCooxRlnpNIYH7vzgndcCpULd2R23D57jcphsvnMkwIMmEAWcLJ/7ViIcm2cbBDrIrAcevsMg+VIlN9Q4becr94EHc3Pz+6Q3bNgQK1W53iIv/jkyLc0Hb9lsNtQwvVxBUEzQWlJSEl4O5I24Xrbgx50DXd/wD1ogX9CNe/lhVSUl8y+T+eY3v6kHHngg9lKVr371q2ppadH27dsD3Qk2nP/wjOdcSIbhF+/b4Gx6ArlUKhXepMZ9oZ/LBkkP/GHvexKhQ2bRbUcUkyUr+Mf/PeCHnx4sOCKCTXTb6smFJwbYXD7zUg/2lowZOUaWZmdnNTw8rHPnzsUaC3O5nI4eParR0VE1NjbGEqooinTgwAE9+OCD2rNnT3grXXV1tdavX6877rhD69ati5VVPKH0kklNTY22bNmixsZGnTx5Uvl8Xh0dHVq+fHlsTRc7FryjhyBExe7EXUClAgzt9XKHpXwLDqOyslINDQ3BgGAgXeCk+Fuv3BAMDQ2F5hivyXn9yutnDvVK8bPOk7VJjJcbZq9j+Vn6BCp33HGH9uzZoyNHjgQF59lEuk7X0tJSXXrppbr99tsDbVkrRjBZDnEITio0RUF/6CAVan+eBQIFslbW7nU4d35kyCglzhcFJsMgEHPDwvXAvXTR19bWxrJrD6KgD/NyJ+IBgzdYEpTgkFx+MVAEoTgMhqMC7hg8KPDSDoaUdXENz2VuXjaBB+4E/DmuT/wNWlRXV8cciVSoa548eVITExPq6OgIsPr09HR4S1cSHXKZT6fTsfe7M4dMJhPWMjk5qZGREZWVlam+vj5kgdzDoXS6qglCeL4356JXSZklkHJZx6kwZ+49NDSk5557ToODgyFwiqJIY2Nj2rFjh2644YYg9+7k0WXPgN1BOK/gXSaTCS+gQm9YV21traqrq2OO1REg6Mk6ceTcw38cMfPP+S5rdKQAPfMatpdOHAV0NInn+bxAzpL2Cl3xDNh1gD4NroGH9OkgK8zJdRSd4PvHjh3T5z//ee3Zsye8Spl6+44dO3T69Gn9yq/8ilatWhVkzvfhI+skC1VVVVq1apWWLVsWQzCRWQ9+Xm+8sfz/p3CQcRKRe9brMJIUf+lLsv6BQnl2AKGBHRECnALGGQPtNfzZ2fm3nB08eFAnT57U0NBQzIAQTUvxvfceaLD324MBD0yoPaIgDms5SuBQWE9Pj+655x51d3fHhDyZpZWUzB/ledlll+nXfu3X1N7eHmugcXjZIW+EOoqiWNAALR0R4fvMl+8QsLFmhxWjKNLw8HAwoqlUKuwv9m0zZBlkTSgZ5QmP7JPlGzeGZGqsizlwL2QJWia74aGrw6IOV87MzJ/P784fA5YsB3hZxIMsvgN/qA/7K30d+vXveOZEoJSsPzuCxGfJRs5k5zsNozt37tRXvvIVHT9+PNAvmSXNzMzE+EIQguHz7LK8vDy8OOn48eP60pe+pE9/+tP6m7/5Gz366KOamJgI+u5vg3S9ZJ7IH/oDYlNeXh7bJpuUe9cb/u5BLmuAFo5UjY6OxoINRyoIgD3rdRQK1I25lpSUqK6uTtdee61aWlpicltVVaWNGzeG9zDAE4JnskboCz0cjXQ0w//G8H6TV199Vfv374+VW5Lbwxwl86TMZQnbigxgywkmoY/bUXfsHswQfHAtfC8rK1Mmk1F7e7u6u7tD411p6fyhNV1dXcpkMgEJlubPMXjiiSf02muvaXR0NJSNCL5nZmZ06NAhfeMb39D4+LjKyuYPImPdIDTeh0GgVlNTo8rKyvPeOOlB4OuNBZ/RSwXDAeFxuEnYDYGem5sL26s8AmbwdiKyK7IBskKpUJPyTlwEDGNPBk6tDSYmYU8iT1duDJ/v2ffnMG+HLx0N4F6exdGgxBvCvvrVr+rYsWOh+5PrSkvndwXceOONeu9736vu7u5gpBE+r/eRlXrt0IMVfneDnU6nYy+lSB5slIRkMRLj4+O677771NfXp3vuuUdr164N98BxlZfPv4HOERs/GTGKomA0fduSG2VHWZzuyJB3q3uQVFJSEtvn7IGm92iwHg+0gE0dNXGEhkGwCZLhWaY7H+bPcNjeYVcyMEpdlGE8QIOXDIdqyVY4MQ1jmsvl1NLSorm5+fdyQ0Nv6ETGaXLjnrlcLsDz8Mmd9uTkpJ577jl9/etf18jIiEpKSnTixAnV1NTosssuC7o3PDx8nkzyXA/g4AEO2XdVeLkNevhpeZ59pdNpNTQ0aNmyZTp58mSQEZwbp9W5TXJHdyHI2stqjuBgBzZv3qyZmRk98sgj2r9/v8rLy7V161bdfPPNymQygS/IhCMa3sDmc/VkiDIVASM7Vnzv+KlTp1RSUqKurq6A1rDDyQMNL+cky2PoljtEL20maZW0ddCPv8FDAj5Ka9irzs5O3XDDDaqqqtKxY8cURZF6enp07bXXhjIl987lctqzZ4/GxsZiyQRrgP979+7VsWPH1NDQEGTqQk2U2G7oy/+xEWVl8y8Outix4B29Z11EfBAfRfXs1iNmHDfXOITpzPPolxO/HLp2g4mCVFRUhN0AlZWVIbv0JhE/dtRhK55JZOfOiOuTW2KAIHGGGCt3Lny/urpaV111lbq7u7V3714dOXJEp0+fVi6XUyaT0fLly3XFFVdo2bJlqq2tDc9MQvEO23vXOj/QaGhoSPl8Xs3NzbF5JI+nhAYOE3tHcDqd1vDwsI4dO6ahoSGNj4/HzvvnuRgZhzk9e3XDjpI5bE0wJxXee+1ylMwqpILRwXDmcrlAKzdU3qGLM2JOjgSwDt5cxTXeNIoMu6zOzs5qz549WrNmTaAN2YT3BbissT6MkqQQhAFN0kDnzW8erBKoejZVUVGhK664QjMzM+Gd6aBj4+PjoavZM27W3dTUFNshAW8JnGZnZ3XkyBGNjo6GoOvkyZM6evSoLr300jBHz8aRBeezB9GeHeZyuRAceL+JByi+5c7lNJVK6cYbb9TRo0d19uzZUKNva2vT7bffHpIGrveyI0EcfIGnrhte7omi+e2Ll19+eUAMZmdntXLlSi1evDgEFTgXZA9byHx5DjR2+XD9xPYxd2T4mmuukTRfe3a0yW0bNtrLbm6H0R9QOoIwh9ClwuE9jix6wJK0Teg4PObzsrIyrV27Vo2NjRobGwtd77xZ1AORXC6nkZGRmP74c5DTXC6ngYGB8/pqmLOjPMiQJ36SQuCLrlzMWPCOHmZ6vaa8vDxGpCQUizAnHReQHMz1qBNmIDAIMAx1GBCjAsToWRWCjvBLOs8R4Rz8sBsXDp+zG3DW75CPdygjlBiwJUuWqLOzMwZjU56ApmR60M4V3J2yZ50o7dzcnHp7e/X5z39e6XRa73znO7Vhw4bAAzcmrAmDTvTtpYzp6Wk1Nzfr7W9/u2ZmZrRmzZpwGhr8hIbJco07R0cP6AnAWDjtyPx9B0GyPOEZO7zkXrwuk62fGEWvHTsvvcfDZcb7BzAUbmhwEgSbHR0dwck5QkSQiWN1Gffg0emTz+fDee3wzQNHRzUIGDDglH/QM3QyeSolg3VwIqUHl64n0IuXS2Ewa2trVV9fH8uyfHcJfHHDmsxyPdt2Ovk8XA88wEFHysrKQlf1rl27lMlk1Nraqje96U3aunVruD9rcnSJe7sj83l4A5oHSeXl5RoYGFA2m9Xk5KT27t2rq6++WtXV1bHAlbU6CoGsE5wTDHlpDLlw2YR309PT4Zz2JKTOGpNJjNsvPkN20EmSI5IWRyE8MIAOyDGBJ/fnMBzsJAhfLpdTfX29lixZEkPmkj0b8Mab+aCdIwjuB/gMmSA4c93gmci5I9PZbFZPP/20LnYseEefhN6I2n0gmAiPVKj7AkthxJIQtQcJSebyXIbPAaUFrnJjihHi+2TMLvwIsDspDzDcIKCE2Ww2BvV6ZM38XCGYD3P0N2qhdH4kqWdWXhNzp5XsDThz5oyOHj2qsrIyDQ8PB0Ui4PGsIplNOAzt+1cvv/zyUN/CIKJMvnZfM9c55IpBYM0YMi+jkEVzrdf8vDzDPPP5vI4dO6aDBw/qzJkzKi8v17Jly7Rs2bIAabpCl5TM7w5hi5rD11E0v8XTAwzf3eGOzw1/W1tbcKpJAwhdfPfJ7OxsQKoIXghImL/LEfKGU/DgiYzU9YZ3gmPw3fAnSwxe/nFapNPp2ImRmUxG119/vXp7e7Vv3z6VlJRo69atWrNmTXBsfu/S0tLY2/1865TLN89i/X7qoztnvksw7Gjb7Oz81sUrrrhCHR0d6u7u1sqVK2PQNbLOdz2QJthxu+LP9azSO/fZFZROp1VbWxuzj+5ccZ44JQ/OkC0PYJM9LtDXnXrSfnng58EyMkqm7rsLQJTQyWSC5HNmJHnta/FgEhoSTM7OzurcuXPK5/MhCEj2jnBdKjW/73316tU6ePBgDF1IBr319fVqaWkJNs4DQK4HcaTBkDX7qar79u3TY489posdC97Ru7AiGA5zAfN5s5I7bH8bm0f3XqflX5hOduawqTsYbyByh+XzRCEdwvfnj42NhSYzrkVpMUDu/JJHerpDwnADCXrdkd9RRle+pBF0+I0M0lEABJdIu6ysTCtXrgxn+a9cufI85YNmjnAwd57nxwyn0+mwZSbpvOApc+NzsibgaL+XH0zimQI0w7hyjUO9fggSvB4ZGdELL7ygJ598MtQtly5dqje/+c3aunVreFMgzuTUqVP6/Oc/r1tuuUVr1qw5D+6Ezw5F+i6LkZERlZeXx15QIhUa0TDYznOCMxwLKEQul4uVstwxYbgJlpMBMPRIImVJmfFACqSBzJ/gwx1IEtFy/vT09OiXf/mXtX//fpWWlmrFihXq6OiI1fVxKmTsHmjDB5dH6OdwL/wlKyOI94zWA/+SkhLV1taqp6dHS5YsCciDD+7tgZWjUASari+eiHAdPyUlJbr66quVSs1vEdu0aZPq6+uD7kZR4TwD5g09vGMe3tGvARron2Oz4BHrgc4kU57gOFJFsOvNce6geYNnEnHwPidHZdFx5kEvA+tiKy7JDPagpaUlNF56IODrw84QWL7yyivq7e0NMuk0KCsr08aNG7Vs2bJYSRYbDB9ZK3Z2dnY2nKmSTs+/jnv//v06c+aMLnYseEfvRgHiYoQgJsqOoKLc3igiFSBnDJNDct4I43/H2ROheg3GnSnKBXOTxsgF4PHHH9dDDz2kyy67TLfddltQHIfJiUDz+bzGx8c1MTERe6nP3NxcgHsdNcjn86H+xRry+XxwctCOdaAU0MSzAjI55gRMOzk5qcHBwfBmvltvvVXpdDoELvDG4UPPNGlA9Eg8+XYp/o4hIUDxIAODTtDHqVUeVCUDA77rwZ7DbRj+JCqDYRkYGNDLL7+sPXv2hIbA8fFxNTc3a+nSpaGc48hRa2urmpqaYsYMHrjMOvSOw3EYGsPtp5fxHObuDWVJx1FSUhJ7B4F/T4qf1sfAGTgvk8aY4c1QSQTIj3z1/g2XYRAEDGtVVZWWLVumrq6uYPDJ8NzBMICCydqSwQ7f894WAmCfm6QYouFGGh1JpVLhIK9kE6TLpGeGSTp6+cUzYC8fgSjl83m1tbVp+/bt4TrWjMyShDBcDyorK2PvjYf3SYTFy4rek+BJBfIxPj4eDqviuTg8h6opmbD7BHuSRFzdPkEz6Os2xFFbT3rgJXSgzOM+hO95xz/36e7u1s/93M/pa1/7mo4ePRqaE7FtmzZt0k033aTa2trAk6S84SMc7fXkD9RufHw8pmevNxa8o2dgVGAamZBHeigZDloqnDOPMDrE4vdDmfkMhYBZGBkECQH0ZzrsKsX33jLGx8f1yCOP6JVXXlE+n9dNN90U2xbjGSqKwPwcxsbYIzgeWbIGhMtrg8lyBE4XwcSxc10S+YiiKHbmAF3YDld6LX5kZESlpaVhe4nXHaHj4OCgxsbG1N7erkwmE/gNuoFRm5iY0KlTpzQ4OKiOjg51dHQEOBJl5//u8BwCTRpfl618fn4749jYmJqbmyXFA83p6enYIRw4h1wup2w2G44o9SCyo6ND7373u8PBRu4cMbJSoS6MgQTebG1tDbzivgQLbrDcuWMIPXDy4BZeukNy/kI/Aizu7Trjmah/hrzDt2QG5Q2y/A1j6UE8OozsoHde5nCH5RCqO11fn2dhbiccxXG5AAZOJgEeDHrfj0Po0JmykN/HkxLkC/6j8zhRL50RqDE3D55ZAzz2ufJsvudy73Tibx4EplLx8lcqNf+Sl9OnT2tubk6tra1qbGwMa3CI3ZFPylduW+E38ydD92wde+HBTTJg9h4c77nwgBTZQPeSu6ugzdVXX62Ojg49/fTTOnDgQHht9saNG7V161a1t7fHkih6iBhJGeF3AgpQh8bGxvN6BX7QWPCO3hucpALs68YOReMzZ4TDWkTofh83bgi2Q5IzMzMaGhoKZxQjSAgPioiBJgr3zAbjjIPbsmWLysrKdP3116u+vj6cle3P5lq+x3ZBKd7gk6zju+FyY+AZUxIq5vujo6NqaGgIECABgqTYcZ2ZTCa8BYp1egbD86emptTX16eqqiotWbIkOCHPrnK5nB566CGNj4/rzjvvVF1dXUAa4D3O5tlnn9W//Mu/aHh4WCtXrtSHP/xhLV++POZwuNa731kD2TD8wiFh7GZmZvTCCy/oqaee0s///M8HZ+/ZSnV1ddjzyz3Ky8uVyWRUVlZ23ln3fI/swTMBzmdPljeo4eJs3VFL8TfGed0RCNbXmDRCHojQP+Bb7Zw/0ND/7g7O4VwPQDzoRXbcsCYdby6XC7SC3zjFJCrHfMjGPWhjrTwfWjJf73vxMpL/8H3KOfzOM5lPEqr24Ai9TaVS4SU8zkf4zf28FIlDq62tjSUb/oIXqfAiJ7czXrq5EIKAvIN+EUijG9wDGuE8cUh+vHV/f79KSkrU3d0dHNjg4KB6e3tVUlISjuN2xNFPBXVHmEyUKCch1zhHDwS93IFtw/FDV0dX+H16ejo0ZHpZzn3N4sWL1draGnp2SkpKYsfWomcuyx40+3y9nOpJyVVXXaWjR49q165dupix4B09glBWVqbx8fEAHyOgRHtudDzz4RqHeqU4xIQAOeMRttHRUZ0+fVrV1dWxmi3BhXeqek2d4IJ6JVlleXm5br/9dt10003KZDIqKSlRW1tbzDDyfRpjcrmcjh07pjVr1qi0tDSc7kbUy3pwDgQ5viYUory8PGSMPAcaIbgIpAcaXi5BoKG1ZwlErkD9bW1tAery6BnFS6fTam9vVz6fjxk3lAqHOD09rQcffFBHjhzR3Nz80aBPPPGEWltbw5af5Lp5jsuG11992xMOo7W1VStXrlRtbW1AcRwB6ezs1KZNm9TX16fBwcHQm7BhwwZ1dHTE7sUgy/M6Hsd3enbnhwnxXAwttIN3BDBu4L0cQw1fUsgMPTMjIJDOf2UofMchecAnKQQVXvZwh+8lBIf+vffAn+sO2YNyvu86QUkD3nIf5k2AnuzXcbnC4aGXUiF4cqTBnb3PEyflZY9kRi0V6uC+z51nEvS5vHgA4Nd6GUpSkBXv2UEGsE3Mj+950y80cyTLbYCXhtwR87zq6mqtXbs2tgMln8/r5MmTevzxx1VWVqYbbrghNKfyjFRq/tXg2EF3lkleQw+OoW1sbAyoppeDkMFkyZQfAi4/QQ/9SaIb8Jt11tXVqbKyMsDsrr+uM0n68TwPmFxXSktL1dnZqbe//e36/Oc/r4sZC97RY+jInGAgypFUXIiKwOMsXWF9IGRucKVCBkt9hqMmHUrzeqHD5FKh6cMVBEPHSX8OvROMYMCJuufm5rfxrV69Ogare2YoFYIZr7UjzE4PVwyPnCsqKgJi4UEU9AQShQ/QFaPkGaZUMMq8JMiNG8KOc9+2bVuMTxgmDIjD29w7lZqvkfqxpxguoF5oDl+YK9m1w/jQpbW1VfX19bGMzbvM6+rqtG3bNtXV1enEiROqqKjQmjVrtHLlSmUymVim72iKOwDo6k2C0DmbzcZOCfO1QUMPWJExz0oY7lSTOyDcALvBI6hLOh9vdEL/Kisrg8x506Mbbe7rz0VnkCUvrfGd8vLCeyu8RusIkxvnmZmZ8H527sf6PHtmbnzfESgco2fyPBe5ZusWtE+lUiEB8TIZ93N5gMfOJ+TbHap/7nOCV/l8Pva+eOTCM3hHdpz27gw9i/YAA4fmgTA0gV4NDQ2BRtie6upqNTY2hrl4r0pFRUU47tgRTj4n6PSs/ujRo/rWt76lgYEBbdmyRbfeemsosXqjG7YYWXCEzxM7aOuZtvPe9ZYXQiHT0Mzl1fUOWfLkx3dvIBfITGVlpdrb23WxY8E7ehSFSJvszutKZOuedRJpSgUmYHA9uvesguzZFTOKoqDEGH2p4BjocvXI3p2Hd7hfCBpEyT0jwkD5vm8PHLyzFMPs8KA36LDlyOF6DwS+3xY4hzM96kbQUTKHgz0r43oUGr7gMKCDVGiu4TtkoxhnPr/hhhvU39+vkZERXXLJJdq6dWvIljAkGDjm7fu8PRMiEPG6siQNDg5qYmJCNTU14ex26M93li1bpubmZk1OTqq8vDxs3yEwcTnESXrPAHzAiHqWh0HA0cFr1pNEnrwb3wNQ/jY9PR3LUvie9wR4TRk+sFbmgqH3bNr549vFvJ6KbjjKwjO4P3KVRI24P/LjiJf/7o1mOGIPGnGWdP4TMHgJzgMl6OiOEn3ynQvI01NPPaXLLrssvN6X4VA4wWU2m1VDQ0OYl5dkkA0CF5pb3W5wfxwuAbE7XEdOZmdnQ5c7tsV11+nOXHkWGSjPc1nzcgpz6uzs1LXXXqt8fv4FLu6AkSPkGQfva2IO+XxeExMTeuaZZ/Tiiy9qcnJSQ0NDWrFihbZs2RL0KlmySNph9xuug558efkAPkFX383i68Vhu8643PIMdNJLxn6c9xsZC97RSwVBQnFrampix3XCTG9QQ5EwwCiB1+V5JSkM5k1FGALvnARW9cjca10zMzPh5DngIYfrJMWE0wMV7oPTdRjKHS2Okr85nMuxvpJihpz5unNg7sBLKETSmXAPVwCicO47OTmpycnJcDoggYVfT/bhkbwHCGTnXAvMLBWMcyqV0g033KBly5ZpZmZGXV1dsb3E8Ac6JyE5nsc1yW5s7uOd7s47Lwvg3NlWxX0c4cEYYWQ923D40Q2Sw44EEf7qTc8YPFN2hMv/RobpwacjHDwbWruRh0aO+DhP3bF47ZXglg54Lz9ks9lY3V4qZK5eusjn53s3/JRABnN2FIRtlUl+olNJ58bzMOLON673UovLAvrn37nkkkuUyWRieuSy442E7J5x/SUIcLviSB3/Ql/kiPt7IM66HQVKIixue3BKblf4jiNgyAs2hfX5dZlMRt3d3UHPoR+yT5brCAJr41rsi2f7yMTIyEisPwn7QGDE+gig3O4l0StHb73MwdxcVpg39PISCnxwOyrNHx7liRvXO+TP3y9m/D/h6CWFCJcIdmBgQGfPnlVbW1tomvIoCoJ77dsz7ampqfO2g2HkPdokAygtLdXg4KBGR0fV1tYWGowwqGTMDvEgyBxKU1paGoyPR35uFLz26s5RKigwf/NmGu7j9bAoikLg4obKI1iMG8KcRCT8O55ZeKY2PT2txsbGAOE65A3d4QuGm2ewHujuyoLye1C1fPny4EC9jusZsRtYHLMjFET0BGPeoNje3h5gac9cmDf3mJyc1MDAgCoqKtTU1BTLJPiBRzj2gYEB7dy5U9lsVtdcc426u7vPi+zT6fl9tmTrfh6889EDEH+mZ25uwNxAuS6wRq8V+04HDzBxTt5LwHAkyOeGfHp3sgeV7sT5DjxD5nxdyIKjTgSlnoVhVMkeWQ/yBd0JYBzqpzTm9HF59NpwaWmpmpubA0ztiQQy4FBvR0dHWCdBsVTYzposlbkDd5QFPoGQOW8ZyI3rH8Gi84FMnc+8pyQZWHqpgevhhTcj5nK52Kukafhkx5AnP77Dh+dVVlZq27ZtOnfunPr6+rRkyRKtXr06FiR4spCUYc/Q3TYSOHt5B9q6THn5Mqlr0AbddlueRBEIXpJJSBJFe73x/4SjJ+pGGCYmJrRjxw4dOXIkdK67YYDgHhESlSL43tSHEWffJJCuf2d6elrPPfecjh8/rttvv11tbW1BMKT4a2BxhCifn33ttShJMSVFMVBEnBnrcoHxTIdrvA7kgsc63egQoXP95ORk6LoHnudzVxroAx3Ly8vV3Nx8nvFOp+fPra+pqQndrK6grAH+QkOHvS7kBFKpVDhQxx08tVx3iB5wMT+eh4Hw7Ayjx7UOtcMj6PXKK6/omWeeUUVFhd7+9rertbU1xgc6drm+oqJCBw4c0J49e0KQ2dHRERALvtPf368DBw5oZGREy5cv19KlS897N7uXbZAzD8Q8+MEwwW9JMePIZ6zXyyaMVKrQ3e9QJutzhInnsf6kA3JUwh0YdHN+gND5M70k5EfpglChP/x9YGBA/f39am5uDs2SXE8g79kuc/JAG3vgfSke8CAz/Oud8MyLtXsW77pCAuP8w/l7E6XXp53H6Ce0wU46cuHyD/8IVvyEwGSfjwft7uChD+cJuL5WV1fHAkISAvjDejwo87WUlpZq2bJlet/73qfh4WE1NTXFdMwDVeYFTZJoKHOF1tAYevCv2wS31ZICappEBv35fJd1TE1Nac+ePZqdndXGjRvDG/OwqW8Evl/wjt4djmcElZWV6urqCtveYDwMdmjJs0YiPxjtiogCJLNslLa7u1udnZ3h3fMOORHh+Zy5L813Ho3ioICqpTgE7dGqZ9mufO7EXHGgAwEKQujKJBVg3Lm5OX33u9/VwYMHdeedd2r16tWSCsEIxjzpWHwt0BxjK0nNzc2x7McVgTl7VMv9HPKFJ9L5xxQ7HMu8yOBAXHBkbgi9LpqE+bm/ByY+oOPIyEjYcz84OKja2trY1roomu8YPnHihMbHx1VbWxtQqVQq3szkaxwZGdHLL7+s/v5+5fPztU6OAibbQjaQNbIkDKTDlh5s4IzLyspibxb0QXaLnPh7ENia5HVXL2fxPeZFSYcAArp7wxWG3R2L85fhTh7dpDbvRjeZgU1NTencuXMqKZnfIuX6lqS/l0m4H/dJzp2/QzNHoTygdnn1XgYPftFF128vG0ALnuMndyY70NF5AhBfo/Pagw1HMPxz/nW6egDjSKknFnwPpBNZcxTEbYE/k+9T7mloaFBzc3OgFwgrMuN2F9rgkNF1b9RL2lZQPU8asCce1HA9euQO3csq8FaSstmsnnrqKY2Ojqq+vl6rVq0K9sjLDRcz/p9w9M5Iaf4NSjfeeKNmZmbCvm+P3NxZAIF5RI6D8UhVim+xkQoZHhD48uXLJRWOH+V5Pkff2yvF964iVPl84VAT1oWypdPzNUe2g1DrRIC97gg0jVJ6J7/TASeBgiG8KOz09LRGR0c1MjISe92rFN8u58/yrNEDCZQVg4Bj4u/86yUHXlmadPrQKOkAMBxS4VATnxslGYy2BzgYB+bvuzXgOfNCZhz+ZqxcuVITExOqqqpSa2trrBwxNzenkydP6oUXXgivvmxubtaWLVt01VVXqby8cL48zZ/ITm1tbcj0W1paJBUORCFg8eDV99tDB8++fZsZxghn4xmoQ43OB3pfent79dprr2nlypVauXJlkFWGBwcOv7rzQSaZnwfiOCqMcTLbSvKdeyUD22TGVl1draVLlyqTyQQnz4+jN9AriZ45VM+POxwPDpOBqJfAcBZlZWVhy1h9fX0MWXNEY2ZmJoY2OGIFTejnwXYwb+jg0L2jVAQKzJWzFLxODw+ht7+Axrv7nRfMlTU5LO90cDQBO+AO0xEevpuUbUYys0fXWQMBjsuHy7xD71wHuubIjyNmnoQ4jwmg+X8mk9HKlSs1NDQU00Pv1bnYseAd/exs4ZxgqdCV2dDQoFwup9nZ2bAVgijQ4UHPonxvrzdYuADyDIfJec87QkANSlI4AjKdTsea0aQCfPX9YDfv5nd46+TJk3rllVc0MjKizs5OrVmzRosWLQrXOoLhTs4dAMbCHarXjBHekpISVVVV6cYbb9TVV1+tRYsWBdpwH+jptW6axbxO6zQjc+T5nv0nszhOw/NGlWQA4cGBG+okDO+IjRtJrwNyH88uCGYcdvWMKhm5L1q0SE1NTUqn02FbF9+ZnJzUgQMHtHPnTu3fv1/T0/Nv/yovL9fNN9+sZcuWhcDGjenc3Jzq6+t19dVXa2JiQu3t7eHtZO4YPZgia/XMzEtVyLojXH5ynpcrkF+vnfO948ePa9euXaqrq9OqVauCU/ZOeGQDWiVLJTwT2XHH6EaP+15ouyj091LU9PR06C73jvO5uTk1NTWF7ZLuBNEPRySwM8m5e/Dgc8V4o1/IoZ91wHrc3hw7dkzHjh3T+vXrY81rUuFti6ydYBPn5HoD/3iOo3dTU1Pn7aygtIhDZ93Qxu3QhRBC57PbB3+Ooxxci+31BMX1C1o60kYQ7ImK94148O/1ckqh/O5zRo8rKipUXV0dTuvznRrIp+uGJ5rA7sPDw5qZmVFbW9t58yd5qq6u1o033hgSNJJGTy4vdix4Ry/FG4kcNsTh0c2L0nsd22GviYkJjY6OBgPgHe7+OlQXNpSBZ3tE7ZkT0B+KQuSGEvH9iYmJ8P8kPJdKpTQ4OKinnnpKjz32mIaHh9XS0qK3vOUtqq6ujr1HGeOA4LBOh/JwzkSvGDEpfn5AWdn8azep/bqRYuA0vMMZw+4K5aUWz4wclvMSAAgC85Hi74N3VACF9syWhqQLOUP4iLPj/sndBsgSPIBWzBkDRZTP83E4ZNUYosnJSWWzWfX19YXdENlsVqdPn9bY2FgwfE4HRkVFRej/8MAKPfCaeDKz8dqpQ63QBAOEwSFg9SzrQshMeXm5VqxYoSiKtHjxYkkFZ+zIDkYcOriT9kzNSwwEJn6CHNks8HPyPAXv8mftLj/cBz7hYJPOoLy8POij16AdUfCdMMyBLYvwDpqfPHlSQ0NDamlpCf0APIfB8dHw0+0NsuOIB7Lb19en/v7+EGC6rjr93aEx/3S6cO68y70jIl4ucN1zRwu9kV+H/92WJevo0MwRRkpEjgwlgwpfv8uv2weGIyF8F93xnTQEUfDNy7bYDZADZHFqakqnT5/WyZMnQznh1Vdf1cTEhG644QYtWrQozIFn+3Y6eq/gFetKbhf9QWPBO/pkhsc+VjdMCINHpkReNMLlcjk9/fTT2rFjh2ZmZrRhwwbdeOONamlpUVlZWeytY/5vEuplPlLBYSE4CAnfLSkp0eDgoKanp0NW4U0iKJBn/AMDA3r11Vd14sQJTUxMaHJyUidOnFAul1Nra2vMkKKsDocjpL6vnEYfDCwRtRsZd5JEozjZmZmZcNiFB1SpVCrAfpQXMA7AWI4I8MwkYsLf3UljQMgegLt8pwP88ZdcJCFFeEaA4pkJcuOQLBkyn3sJBAeRSqU0MjKivr4+7dmzR0ePHlVFRYUuvfRSbdq0KchDskGUA36gO8bGz0UgiIVnSYTEoWwPROEr9yTbpT7v5x94HwMNnwQ8ybowNG1vb1dTU1MIaLiXVIDtfb7JrYaeUScDAowvPGdtGHLfPYGB9O7tysrKIIOUCNx5QF/vvPds2AMi5sjcQQWleCbPd/gZHR3VY489pl27dmnLli3avn17eAkV662srAwv6lm8eHFs1w885rleWpqbm9PY2Fh47zp9SQRLPrAHnpy4rXA75bbV7ZqXKhz9kwqlMs/GsbUeEHhPFddTBmJ+bnv4PBlkIuv83xsUuQ8/zNf7dlif900wT98ySjCCXpSWloaTDXt7e/X1r39dx44dUzqd1qZNm1RbWxvL8J1/yS2drNXtn5dlLmYseEefzGiS9SOHqTxzxUkhREeOHNHXvvY1vfbaayopKVFfX58aGxt10003hUzpQu9r90DCYfmkMcU54Vhh8ssvv6ypqSndeOONmp6eDo1VfjKTZ7u+Ta+srEyVlZUB9sXReYTrEbjXqyWFgCgJZ/M3h8A8K/cmPwwpw4V6bq6wDc2jawwFnfz5/Py+6NraWnV2dobnO+rgxhlDDI0x0skAQCrsqPAIWip0x7NeXxcBF8ELPPesw08M87IRgcDJkyf1yCOP6MSJExoZGdHY2Jheeuklve9979Oll16q5cuXh9fSZrNZtba2asOGDWpra9Pc3FyI7skocSg4St+S5EYf+njfh2cGHgAkAyH/PRlAEwDwOwYKPlRVVSmTyQRHOD09HXtVrpeoJIUmOUeYpqendejQIZWWzndUu5zBS2TZg5Tkjhv22FNz92CQoKekZP4cf3iKcc9kMrH9+tAMO4GxdoTMs1/f4uoZYz6f1+DgoIaGhjQ4OBju5Q2H/K2pqSnYLHTIs0kgdiD7dHp+Wx5bOZN6i4wwRw96fO0+B8+Ak7rnNPlBtiaZlTtC51k0iAfoAhkvfUeO0sFLRytZD8/lPqyH5/A9D7ChMXrutHZ43/kEUsKzDh8+rP3792tkZCTYgbvuukuLFi0KW619bgQ0bjPoi3HbXGzGs1FeXn6ewXMYiaxdKtRq3PGUl5drbGxMR44c0fHjx8NxlUNDQ+rr64tlk1Jhq5pHYGQrXOdGzmu6Pi8YuXHjxtABjuJjjIBRPbtbtGiRrrjiCs3NzWlkZEQrVqzQunXrlMlkgoB6jcfn7sLt3aHJbnuMpm/HIzsgmJienn+VYllZWYh8HalIBgpeoywpKdGpU6f0zDPP6MCBA4qiSCtXrtTWrVslFQ4QgT8onEfy3M8je77jXcJJh099Db6xLmjB/fib1zrT6XR41S3PcbpCy3w+r9OnT+vYsWMBxp2dnVV/f78efPBBrVu3TosWLdKtt96qZcuWaWJiQp2dnVq1apVaWlrC3Lzc4GgChhlZcdlPNl3R6IcMQBNfmweTbOfDKPGyJOTBAzl4Ce29Rg1dMeL9/f2SFFALh7Wl+cD5wIED+tznPqeSkhLdc889WrVqVazhCpq7HvEvTuvcuXPat2+fOjs7tXLlypgOeA8K68Xpu0zh3MiskEFH8dx5uE4zN0e7pPkA89prr1Vzc7NWrVqlxsbGmE3x7B++eNbsZSvPekHJSkpKwhsgmRdy504QuUnKTkVFhcbHx0Nfi/MSu8mzfCsm96DkwdzhE2siUyYgd8SAMopn+fAKPfDAi/NSoD30cVjdGwcZHlR4QgMPHEHFzjnKxFyZB/dEftEBgqmurq6gZ8gPz/MgEX1zu8KLdS52LHhHDzTsjsGhI99C5c1c/M5nVVVVqq+v1+joqEpKSlRbWxsa3DwrZ2AUgP6J8hwmx2EQiHjdFEHjABZJofaIILuz4r41NTW6/vrrtWrVKo2NjampqUnt7e0x6JX74yS80cmhbTdCnjkxVxwun9GMND09rf7+fn3nO99RS0uLtm/fHiBeVybPJlhHaWmpxsfH9fTTT+vLX/6y+vv7lU6ndfDgwVB/rqqqigUL/LixlQpQGLyGTvzO5wQr9GzAU4ypN9SgrI5uuGHzbIXnOaoE/QYHB5XNZmNo0vT0tI4fP67h4WEtW7ZMtbW1Wrp0aazOi8zCSxCeKIpCds+c4aN3LoMqIeMNDQ2xwJTsyJ2LO31KAA7R80yHuwlCHZpMBmMlJSXKZrP63ve+p6eeekpTU1NqaGjQDTfcEI4ndjnnHsDrDrEmA21HiOAjGVldXV3oM8BB4DhYe7Iuz5ql+FG6yQzWHYv3gnhQC82Q/9nZWWUyGW3atEnr1q2L1eT9ZESaektKCq+blQo9I+40ktlzFEVhvzrPdofESOp1stTmNWpo7cfSut7gwNEzeE9J0NEP1w139Enb4MEU90AekmgjgS3fR4e5D0GFlyK9L8BRK/7vdOHf5PMdsUmn09qwYYMOHz6svXv3SpLWrFkTzql39Ivvgm75s+BhLpcLOl3M6G0kI0siXo+cIK4LiVQQiFQqpbVr1+rNb36z9u7dq3Q6rS1btujSSy8NhiJZm+QeQFH+LIw0kA3RJfP1TJAoDkeNko2PjyudTod6up8iV1dXp4aGhlg5AWPmiAZK4nSCNmRKGGSEj3sSlXqU6c0iIBccIuTROzTyXQ4EGCARr7zySmhGS6VSOnHihPbv36+tW7eGoAG6OIQMr925eybF52RlzmcUh3k5fTxS9xq588xRCac1Ck/PQSo1fwzz6OhoCP6Qk5aWFlVXVweDyY6QpLwma4pA0TgD5sHcWadngn4PX5sbxOTZ7l5mcqSG4AeE4ujRo+GtjStWrAj1Zqfv9PS0XnzxRX3zm98M+/7T6bT6+vrU2tqqZcuWxeD9VatW6e6771YUReru7g70IKgqKSkJb/ST4kfHsvba2lpt3rw5OCDm5E1Y09PToaMauiSzcqeZG/XS0tKw5dF7Dhxydufhuu6wMVl18kAs7AT6BJ/QQe7j52kk94W7PPEs5I2Awfs5ko41ifIQXIA8MncPeJlTFEXh/ALXK7YOe4nTbTG08iAJmUSfvbRG8EywSYDM3JENt/GsLYoijY+Pa2pqKnZgVzKZA6VNpVKhjEDg4EhBe3u73vnOd+rKK6/UzMyMFi9erJaWlpgcJJE2pzP08SQEVPdix8WfoSfpk5/8pK644grV1taqra1N73jHO7Rv377YNZOTk7r33nvV3Nysmpoa3XXXXTpz5kzsmt7eXr3tbW9TdXW12tra9Fu/9VvnNYU88sgjuuyyy1RRUaGVK1fqvvvueyNTLSzQIiaPgpyoHoEmD2gBturq6tLb3vY2feADH9CHPvQh3XrrreHQEgQGmM8zJlcqKe6EvGMc5w9s6Yro53qTdVZUVATBRrG8zknzF84ThZ+eng5ZJFkiCuYOjKiaa7knnxHBQ9/Z2dlQ06SO+DM/8zO6+eabY7Uw1ulZiUOBOEK2H8IrL4mgGF6H9QyOzz3LI7PkjAFvKvRsdHh4WL29vWGuOHx3Zm5wXDHJCJOZCI6X6yVp7dq1WrRokSYnJzU+Pq6ZmRnV1dXp5ptvVmtrq6TCe9gd+ncY2Wu/yBGQHnyhFOHbpZgXfHQnkMvlzjM4BAWeaUmKvQQI1GxsbExf//rX9T//5//UZz7zGf393/+9vvSlL4WdLW7Ac7mcXnrppbB+gor+/n7t3r07xjvkedOmTdq8eXMsO4UWGEM3oMzda8+lpaXKZDIx2vI9h8Ax4FzrcurIytTUVKCzOxVkgYDRgynW5iiZOzHkmwQEOeQ6nu3BAfcme3eY2/mIU4F+ji5iI5kXDWYEEMmA2tEtrsfmOWKR7GbHzjEHtpj6iYiOsBJAQk90DX7yfZAxtyXeo+FJGTaB73hQn0qlguP2eSeDa+/DgS7eJ8XzOzs7demll+qSSy4Jb+QkkcMmOS3dJ7j/YG7+vIsZb8jRP/roo7r33nv11FNP6cEHH9TMzIze+ta3anx8PFzzsY99TF/72tf0xS9+UY8++qhOnTqld73rXeHzubk5ve1tb9P09LSefPJJffazn9V9992n3/u93wvXHDlyRG9729t000036aWXXtJHP/pR/fIv/7K+/e1vv5HpSlIMGveuZKmgXEl41euCDvfW1dWpp6cnHEjitSGE2SNmFBOBQvEQPIdgmYc30DiEPDExEYPkEBScZVlZWXgVLvd1h8g1JSUlwQgAOaEQbhj9+xjaJDTlmV5SccrKysKpbM57EAxv9MEQe6a4YsUK1dTUhNffLl68WOvXr1d9fX0sQHMIH546SuI13HR6/jWuw8PD4X3unvWSEbLdRSrAjR7R+1pdTjxzlgpGz+tyGIr29na95z3v0bZt29TT06PNmzfrnnvu0XXXXRdrLiQzIijj+1NTU+EcCOTc5Xh2dv70vcOHD+vUqVNhLTgRMkWydtYxPj5+HmKAE0X+PAtFbmkWOnPmjL7zne8ENIbdKnv37g2y7ijT0NBQ6E7GoGP8WBfD66oehPl8vBYLH8rLy0P5KRng+z3hD/XsqampsN/ZUTAPVjy7Qg+QZ0fqmJevA1lPIi1ul6RCcgAP+Z1GNGiJnUiWldB79IN7cH9PJDxpOXXqlB5//HE99NBDOnz4cMzpe/B56tQpHThwQIcOHYo1kWFzuB/PQ5bcJmIb4CO6i61INtQSvBKUMC9fC/oD2gh/HGbnefzAh0wmE94q6SgoATQ6iLxCN/q9WK/bNujvz8I/8TvzRl6QYXjqp6Riuy5mvCHo/oEHHoj9ft9996mtrU3PP/+8brjhBo2MjOif/umf9LnPfU5vfvObJUmf+cxntG7dOj311FO6+uqr9Z3vfEd79uzRQw89pPb2dm3ZskV//Md/rN/5nd/RH/zBH6i8vFx/93d/p56eHv35n/+5JGndunXasWOH/vIv/1Lbt2+/4NzoMmWMjo5K0nn1VZTV4RV3YA6HuNI5c1xh2Zrjz0aJEGYPBqT48ZUIKNd5c5orMLAdik2tBgeCsHskiBPGmKN07pB9r7XDRQQuGDIcFvN0uoIkcJIZBiafz4dDSKA/Tg86oLjeR1FbW6vbbrtNqVRKr732mjKZjK666ipt2bIlBG1kcfl8PpyMB8+gKU4AZUUxPaNKZvQ4D+iHY8/lcpqenlZtbW0IkqjVeknCESR3uhgprikvL9emTZu0bNky7d+/X5lMRsuXL1dVVVWMFi6bHmD5c5FFdz40BY6MjGhubi7U4r3pEKPiUD/Zq8OuLsPJejk8yGQy4U2E7K2HD5OTkzpz5kwwtshVbW2tVq9erddeey3UgNPp+T6TJUuWBLjXM1EMtUO0yYCRvyOH8Jz5e3lKKrwW12Uhm83qy1/+ss6dO6e77rpLnZ2dYa3e/4BDTz6LgAZZJ9BAPpK1YLdP8Bbao2fYBZ4BLbETJDOeGXpAzFp5blK+kB1JGhgY0He/+1299tprkuZfv/zWt75VDQ0NgY/o3q5du/Too4+qtrZWP/uzP6vu7u6Y/sMzd5R+WFZytwP8dXuWnNvOnTuVTqd17bXXhmeALHkZELoiD95jAITv5QpoDerA/7kHSY/zCNtMac63AfqzWeP3Q8icP8ybz5Bz7F/y2tcb/1c1erYLNDU1SZKef/55zczM6JZbbgnXrF27Vt3d3dq5c6euvvpq7dy5U5s2bQrNCJK0fft2feQjH9Hu3bt16aWXaufOnbF7cM1HP/rR7zuXT37yk/rDP/zD7/u51zhcuTB+UqE+6UR1xwHh3WGOj48HAcQAeFbu22kQeKlwYIjX9l35kq/uZD4+Rw8GPPigxktESySI8DM3ImY/0tK7WS/ktKBD0rEwV3eQOHLWRb3ZnR988Oi4rq5OnZ2deu973xuOf6ytrY1tffN3g3NKHI6bU6tY69TUlPr6+lRfX6/KykrV1tbGoH/mibGgsdAdOPV0z45wEDg8L0tA3+PHj2tubk5LliyJOWXoUl1dHWvGpAyDcYY3nrk73bxM4Znc3NycGhsbw7UElwzohQzilChpuBy5/Huw6vV5YM6GhgbV1dWFEkA+nw8dxp4ZQafrrrtOBw8e1N69ewPKcs0112jjxo2xQJVnQXdgbZezZLObZ53oAfdJBrLohu/pHxoa0ujoaAy98Swd+Webnge0vhsE+XY0wO0A8/XAhfMSvN7uHfys0wMxZBXnjjzAd4Im9I/DdQhQoHNZWVnYAnrq1ClVVlbq2LFjOnr0qKqrq1VaWqq6ujo1NjZKmne8R48eVX19vU6dOqVly5YFXaC84/attrZW+Xz8PRrQM5+f3wVFb04yQEil5htZd+zYoenpafX09GjlypXBjo2Ojga5he/IiqSw+8jLXR5o+TPRL/Qxm80qn8+rtbX1POfsHfhe/0d3eD42zH0Rz3FI3hFm/x6B0BvJ5qX/C0efz+f10Y9+VNdee602btwoSerr61N5eXmoXTPa29vV19cXrnEnz+d89oOuGR0dDeeDJ8cnPvEJffzjHw+/j46OasmSJQEm2rt3r3p7e9XV1RUgYBTcozQ3esAzUsGwSfMOC8hodHRUmUwmZHpEjf5OZ34Y7vAd/vQI7kLZE3VOmnRQdjcWc3OFk/7cCSXrZv4sDoNB8aDLuXPndOzYMXV0dKilpSXmuD24cGHFeSTrVjgxaooYMGqtMzMz2rNnj6anp7Vx40ZVVFQok8mESJu5+/C380mFs9f9JRjQt7W1NRbUQSvokIRwWQMOt7q6WplMRr29vaqoqFB7e3sIjjxjmpqaCtnbzMxM2LeM88AJODqydu3aWLDnSoyTYe0YAO6D0/DsgMzGz0/w7Al68TvbjbgGmfFDOTh86dixY+HkNs+OeXZDQ4Ouv/56Pfjgg8pms+EgoLVr157XyJbP59XY2Kj3v//92rt3r86dO6fFixdr06ZNIajleqcJmZfLlusXDhe+sg2wqakprIngBPlzZ4OO33nnnZqenlZnZ2fQWXSK3S/uKHCWF3JiybMKkg1zyCKfj4+Ph7nxObzkWSQSjlLm8/HzP0hMCDSQFd99hDyCUObz+fASlePHj2tiYkKHDx/WF77whYBGdHV16brrrtO6deu0fv169ff3h16mpDPiGdDZkSJHFFgrJQn4gaxAw7a2Nl1++eWBRtAxiqKYPQF55O/eIOsoLXKSdL4eaLpd9vLp7OxssEMX2mWBjhDII7fwB3nxZIp5OPLGPf0wLt8m/XrjP+zo7733Xu3atUs7duz4j97ihzo4Czg58vm8du/erX/913/V8ePHtWbNmgCbembh0a9DPlKhmcWz23R6fk9xY2NjDLrBWDIQWN8fyv09k8Bpe6YlKXSjAhER6Tr8hAGdmZkJzV01NTVqbGwMQsKzMVJeh0fQWCN/27t3r773ve/p+uuvV1NTU1g315FNkaV556srhgcbfAdDxbOpb/mLaKCDly2glTeW5XI5TUxMhHPdHYkoKZnfwnXq1KlwDCsK45kXQQrOF6MHr3CG/f39Ki2df4c4Dh0+c29fP4EKiu4ZJ4pcW1t7ntx6icWzd57lRoP5QR9kIZl1sM7kczzrdWOFsWQ9r776qr72ta/piiuu0G233RYcnQelNTU1uu2227RkyRKdOnVKzc3NuuSSS8JhOV46IehobW0NL+DBieMIvI7ssL+XMTwYIFDn+8nAzbeucXojsss1rHnZsmXK5/OhydRfasM1IHge7KVSqdj71JkbDoUSFwMblCwlejbrzsGDN+TTHYgHjfDVbR0yAC2QTeiAzF577bVqbW3VI488ohdffFFnz54N6zxz5kx4q9+GDRvU3d0d0A2e52t128Nrot2GODKJrYCfjkhRhtq+fXsMzUNefbeQIyru3B1dSeqDP9sDSEo2s7OzodQF+oCulZWVhd4S5s5PFMWP2PXAFDuSlCu3jUnUlp6dix3/IUf/67/+6/r617+uxx57LJxdLUkdHR2anp7W8PBwLKs/c+aMOjo6wjXPPPNM7H505fs1yU79M2fOqK6u7g0fFDA9Pa3du3frzJkzGh8f17Fjx3Tu3LlgkBFCoisp/hY6JybK6PVEbzKR4lC7R3Ewlr97JI/Se8NIKpUK20z4HWGRCqf8cW/PegcGBoJhouHMhcyhdoSQ8wa4dxRFampqCnVksgcpfgY5I5VKBYH1bUVOT+hNTR+6YbzWrl0bYEtQFu/idWiStYMEvPjii7rsssu0YsWKWAMgc128eHGsDosh8HnAE4ejmR+8XrlyZQj2XE6gJfLhMD7PosHLER74WVJSEgsU3RF4JukBHvLEXJ0u3AOZ9ddpOt8cCUgGqdwLJ9vS0qIVK1aovb090JDssbS0sC2qoaFBV155ZYwm9AwQwHi5y9/0xXNZF/TBeeBAfI3IvRte+EmwmE6nw5ZU+OsIg6NDnu0ROJ07d07Nzc06cOCA6urqgt0jqITXLi/Qmi1/0Mlr3C5/TnPPvrkvgQ6DUhf2xFEoRym5h+tbEknw8wrQkba2tpBd8+OljuPHj+u5555TT0+PWlpaznOm8CUJRaMfBNLe4Of2wgMeSSHJocveEyWXddcNbADoLPKITrAmn6uXiHDeBBlux5w/UTS/xx2dgP7c3wNMeIjugPQlUVzWQInFZSQJ7b/eeEOOPooi/cZv/Ia+/OUv65FHHlFPT0/s861bt6qsrEwPP/yw7rrrLknSvn371Nvbq23btkmStm3bpv/xP/6H+vv7w5t7HnzwQdXV1Wn9+vXhmm9+85uxez/44IPhHm9klJWVadGiRWptbVV5eblWr16t7u7uEBUjaAi+N1xAeDIvNw6eqaM4CJEfOAGTEUbqvK7gCOLIyIiam5uDUXOD5wLtkBNGSyrUBpubm1VdXR3qOv7iBX9mNpsNmTTZhj937dq1WrFiRRBevufRZiqVCpmLvxzI5+SZin/fMyQPtsgqHBVwaI9u2/Lycg0NDWn37t165ZVXNDk5qcbGRtXV1QXH5UdgOj89ovazCnieIzsMlPD48eNBrjA4fkws5RtkAZmhn8PPLvCaHY7BHYA7Ix/IhQcB8BgeEpAiJ15egBe+xZF5YPRmZ2fDNkeCHA6J8mY9YEQg4nx+fpsddWYpvu3Ks3HunXTO3nTE97wpzeeZNM6epXuA7XQiYOQz3/fNc4BzKyoqtHjx4rDTIZ1Oh2yWUwUJOqXClliMsTtJDw4dkk3ylv4fdvd44oEODQ8P69///d81MTGhO++8U4sWLQrr8t04rAN5AYVwGlNucKdHADk8PBwyZnQCXTh58mQ4Q58gC9sE79Ff+MK9kyUHRzWhE7aY9ZeUlIS6v581T8L1/Y50Rt7QOZILR7l8hwvDackc0Cu3WcgFQYEU3zGCTUFOoygK9sBp4cmflz98N4OXHy52vCFHf++99+pzn/ucvvrVr6q2tjbU1Ovr68PJcR/84Af18Y9/XE1NTaqrq9Nv/MZvaNu2bbr66qslSW9961u1fv163XPPPfrTP/1T9fX16b//9/+ue++9NxD0V3/1V/W//tf/0m//9m/rAx/4gL773e/qC1/4gr7xjW+8kenOL7C0VNdcc41qamqUy+W0atWqWGOUpOCMHSJFSCcmJjQwMKA9e/aotrZWa9asUX19fSxilwpRsxsPmEqG6xCxZ1l81tLSEo6aHB0dDUruGYhHcslyQz6fD81d7ATgABVJMSMmSSdOnFBXV1dsH25y+LvZWVs6nQ5G3Q2kO60kguCOrLKyMmwNw2nMzMyEN7PV19fHeOEGFGVwWHJwcFBjY2PhnnzH5wtPMDiZTCZsRXrppZc0OTmpq6++OnYoCddL80p78OBBffGLX9SJEydUWVmpNWvW6M477wyvCvUeB+jgmSt9AC5f/O5ZHBBh0qFxPZm/14gx1Ax3DCUlJWpoaNDg4KAGBwfV1NQU6Mg9MfK+BTUZiJSVzb+8yZtVXa6AYcleU6lUTK+8NARC5NA8n9HfkkqlYhmr65w3sqILHhAR4CELHjTjmN0psmaeS7DC7pbW1laVlZWpp6dHQ0ND2rFjh44ePar3vOc96u7ujskW9OfZ1PPJJJk3eg1yhbzk8/Nls+eee0433HCDVqxYEebliNaBAwf06KOPanp6WkuWLNHixYtjWTW8cafB/BzdcflCHghOPDjwQF1SrFmTvyWDP98l4/xzXnnZQCoEe67r6FU+n1dvb68aGxvD9z3A9OwevUVe3Fbyd7cp2IxcLhfkHlr7zgr6PkCXeXMp8g7/PTBFFpiD79pxJMN5QCDhNPHkI5mI/KDxhhz93/7t30qSbrzxxtjfP/OZz+gXf/EXJUl/+Zd/qXQ6rbvuuktTU1Pavn27/uZv/iZcW1JSoq9//ev6yEc+om3btimTyej973+//uiP/ihc09PTo2984xv62Mc+pr/6q7/S4sWL9Y//+I/fd2vdDxqp1Hzd6Morrwy1J/6ejBYhHL/Pzs5qdHRU3/nOd/Too49q6dKloXzgThzjiAFxhec6LxGgSFL8TUX8nk7PbzHid6lw+AMKQjaAsPI5wuSwKQoyPj6u5557TtlsVpdffrk6Oztj0S9zZ65eL/Jok4ADQ+Vn97uh5Hrqcl6fcgSFIIlshe8zfwwESIobgEwmow0bNqi6ulorV65UQ0NDLMvDwLmygdAwamtrlclkYkEQPHPaffnLX9ZTTz0V5j88PKyOjg61t7fHsgKyH/jGvPkec/HoXypko9597ZkvRsZhV4fx/Jhj4ECMysTEhB566CE9+uijuvvuu7Vx48aQgXlH8NzcnIaHh1VWVnaec3KDzt98bh7YULoDOk/CsVIhwKAsQpaEo2BuNTU1QW88K0KH+Yx5uaygL673rHFgYEBVVVXhhS9e0kFGhoaGQlDI4Tlzc3NqbW3VyMhILBiD3gSgOI9sNqvm5uZY8yZBnztmR3I86EIX0B2cSVdXl3p6epTNZsOrZ728cSEHzvw88eDe7rThfWtrq5YuXRrey+CZbCqVUnt7e+h14N0WXrrAoZFBe5KC/LG+ZAkMHYS/rIdzLjzg5779/f2xrngQS+7Jmh1xgcboIvLlqBhy57bLkSPo4vKDbLjN823YybKwyz22B9sFoux2842MNwzdv96orKzUpz/9aX3605/+vtcsXbr0PGg+OW688Ua9+OKLb2R6FxxkwgwECEMMcWEIhnlqakq9vb3K5XLq7e3V7OxsLOqG0bzNyjNujJ9v3/G6omc4KL5nOsyba3BOHiw4JO4BC/f291Lz09fXp//zf/6PcrmcampqdPnll8eE0VEILy143Zc5e/bIHB1u52+eOSDAXgv1jCuTycRqkFK869aDDejc0NCgrVu36pJLLgldtqzHD4KBRo68MEe6qqnZeeCGITp79mw4NATajI6O6tChQ8pms+H6C2XwbmDJ1r0pzekI/AdfpcKOj2TwCF18uyelAjJkZGtwcDDowTPPPKOpqSlt2bIlBFcgTGTx8B56uzPz78BvAhOXY89Q4TVr9GZDRxSSKBl7pLkH6Bj8h5+etUEz1zfPjiYmJrR//349//zzamlp0dVXX62enp4YKkA5pq6uLhxERR28ra1NbW1t2rJli2pqaoIsM3gufG9qagq6mEqlAgK1aNGi8Pdk4NvT06NFixYFtAE7BU940dGHP/xh5XI5dXV1BUibLXBexkC+CbgJwDxj5zk4uNLSUtXW1ur666/XqVOndPjw4Vhnf1dXlzZu3Bi2qzI35uq7l1zvQfAc2UhC8G5f2EoL+ucy5yOKooC8oO8evJSWlsZsom+Jc1vEfAiq3RazRraCepCBfH8/VAUao6NeOvPAj9/pG/F5OHL0Rpz9gj3rHuIPDQ3FYGma1Lx+CYMQyiiab047dOiQ6uvrtWnTJtXX12v16tVqbGzU8PBwEMhsNhsarUZGRmIZmCu/b3VLZkUYIgSP77qTcydOlkY9CTgXI4ET83qbJGWzWdXX1yuTyYSz8MfHx2OQEIrIfTA0OAFvnpIKtWXW4w07CHUqFd8Z4MqeDEakggKjjNDAIVdHMrieAI2TtNzouDFhDX5PjDKZHF32lFd4SxvzY31k2ZwOyT2gG86OSJ5/fdeBGy8GtCGocgQHOJ6X2ODo4ZmXTZxma9eu1cjIiL7zne+ov79fLS0tYZspwUdp6fzrd3Emydq9BwXsiECXMI6OMiD3fO66xnqQAeQcY5nMcKAttPBSFg7KdcqhZpfH/v5+vfLKKzp9+rQmJia0fv16DQ4OxoIjeF1XVxeMLVkV+prP54Mt4HmOfHgA4ob88ccf12uvvaZ3vetdAW7nmThkD+YmJiZiZwag66WlpaqpqQm2h8Yxz06RcT7jc7dJZ8+eVS6X05IlS2KBP/LT1dWlO+64Q08++aROnjwpSWppadEVV1yhxYsXK5VKaWhoKAQr7tgJuC6E2PjvXI+cuR6Mj4/HHC7zQhYcFZyZmQnlFkeOXL8cPfGANInGQkO3YdwPefB3pHg/RLLMwjOZ46lTp3T27FktWbJEmUwmllghJwQ3bp+9h8yT1dcbqehirvopHIcPH9aKFSt+0tMojuIojuIojuL4kY3jx4/Hdr9daCzYjJ7T+np7e1VfX/8Tns3CHRxMdPz4cdXV1f2kp7NgR5HOP55RpPOPbxRp/X83oigKJaDXGwvW0QPb1NfXF4XoxzDq6uqKdP4xjCKdfzyjSOcf3yjS+j8+LjaJfUNvryuO4iiO4iiO4iiOn65RdPTFURzFURzFURwLeCxYR19RUaHf//3fv+D598XxwxtFOv94RpHOP55RpPOPbxRp/eMbC7brvjiKoziKoziKozgWcEZfHMVRHMVRHMVRHEVHXxzFURzFURzFsaBH0dEXR3EUR3EUR3Es4FF09MVRHMVRHMVRHAt4FB19cRRHcRRHcRTHAh4L0tF/+tOf1rJly1RZWamrrrpKzzzzzE96Sj9V4w/+4A9iL/zhhSiMyclJ3XvvvWpublZNTY3uuusunTlzJnaP3t5eve1tb1N1dbXa2tr0W7/1W2/41YoLbTz22GO68847tWjRIqVSKX3lK1+JfR5FkX7v935PnZ2dqqqq0i233KIDBw7ErhkcHNTdd9+turo6NTQ06IMf/KCy2WzsmldeeUXXX3+9KisrtWTJEv3pn/7pj3pp/6nG69H5F3/xF8+T71tvvTV2TZHOrz8++clP6oorrlBtba3a2tr0jne8Q/v27Ytd88OyFY888oguu+wyVVRUaOXKlbrvvvt+1MtbWCNaYOP++++PysvLo3/+53+Odu/eHX3oQx+KGhoaojNnzvykp/ZTM37/938/2rBhQ3T69Onwc/bs2fD5r/7qr0ZLliyJHn744ei5556Lrr766uiaa64Jn8/OzkYbN26MbrnllujFF1+MvvnNb0YtLS3RJz7xiZ/Ecv7TjG9+85vR7/7u70b/9m//FkmKvvzlL8c+/9SnPhXV19dHX/nKV6KXX345+pmf+Zmop6cnmpiYCNfceuut0SWXXBI99dRT0eOPPx6tXLkyeu973xs+HxkZidrb26O777472rVrV/Sv//qvUVVVVfT3f//3P65l/sTH69H5/e9/f3TrrbfG5HtwcDB2TZHOrz+2b98efeYzn4l27doVvfTSS9Htt98edXd3R9lsNlzzw7AVhw8fjqqrq6OPf/zj0Z49e6K//uu/jkpKSqIHHnjgx7ren+ax4Bz9lVdeGd17773h97m5uWjRokXRJz/5yZ/grH66xu///u9Hl1xyyQU/Gx4ejsrKyqIvfvGL4W979+6NJEU7d+6Momje0KbT6aivry9c87d/+7dRXV1dNDU19SOd+0/LSDqgfD4fdXR0RH/2Z38W/jY8PBxVVFRE//qv/xpFURTt2bMnkhQ9++yz4ZpvfetbUSqVik6ePBlFURT9zd/8TdTY2Bij8+/8zu9Ea9as+RGv6D/n+H6O/u1vf/v3/U6Rzv+x0d/fH0mKHn300SiKfni24rd/+7ejDRs2xJ71nve8J9q+ffuPekkLZiwo6H56elrPP/+8brnllvC3dDqtW265RTt37vwJzuynbxw4cECLFi3S8uXLdffdd6u3t1eS9Pzzz2tmZiZG47Vr16q7uzvQeOfOndq0aZPa29vDNdu3b9fo6Kh27979413IT8k4cuSI+vr6YnStr6/XVVddFaNrQ0ODLr/88nDNLbfconQ6raeffjpcc8MNN6i8vDxcs337du3bt09DQ0M/ptX85x+PPPKI2tratGbNGn3kIx/RuXPnwmdFOv/HxsjIiKTCm0N/WLZi586dsXtwTdGmX/xYUI5+YGBAc3NzMaGRpPb2dvX19f2EZvXTN6666irdd999euCBB/S3f/u3OnLkiK6//nqNjY2pr69P5eXlamhoiH3HadzX13dBHvBZcZw/oMsPkt2+vj61tbXFPi8tLVVTU1OR9m9g3HrrrfqXf/kXPfzww/qTP/kTPfroo7rttts0NzcnqUjn/8jI5/P66Ec/qmuvvVYbN26UpB+arfh+14yOjmpiYuJHsZwFNxbsa2qL4z8+brvttvD/zZs366qrrtLSpUv1hS98QVVVVT/BmRVHcfzfj//yX/5L+P+mTZu0efNmrVixQo888ohuvvnmn+DMfnrHvffeq127dmnHjh0/6akUxwXGgsroW1paVFJScl5X55kzZ9TR0fETmtVP/2hoaNDq1at18OBBdXR0aHp6WsPDw7FrnMYdHR0X5AGfFcf5A7r8INnt6OhQf39/7PPZ2VkNDg4Waf9/MZYvX66WlhYdPHhQUpHOb3T8+q//ur7+9a/re9/7nhYvXhz+/sOyFd/vmrq6umLicZFjQTn68vJybd26VQ8//HD4Wz6f18MPP6xt27b9BGf20z2y2awOHTqkzs5Obd26VWVlZTEa79u3T729vYHG27Zt06uvvhozlg8++KDq6uq0fv36H/v8fxpGT0+POjo6YnQdHR3V008/HaPr8PCwnn/++XDNd7/7XeXzeV111VXhmscee0wzMzPhmgcffFBr1qxRY2Pjj2k1P13jxIkTOnfunDo7OyUV6XyxI4oi/fqv/7q+/OUv67vf/a56enpin/+wbMW2bdti9+Caok1/A+Mn3Q34wx73339/VFFREd13333Rnj17ol/5lV+JGhoaYl2dxfGDx2/+5m9GjzzySHTkyJHoiSeeiG655ZaopaUl6u/vj6JofstMd3d39N3vfjd67rnnom3btkXbtm0L32fLzFvf+tbopZdeih544IGotbX1//ntdWNjY9GLL74Yvfjii5Gk6C/+4i+iF198MTp27FgURfPb6xoaGqKvfvWr0SuvvBK9/e1vv+D2uksvvTR6+umnox07dkSrVq2KbfsaHh6O2tvbo3vuuSfatWtXdP/990fV1dX/T237+kF0Hhsbi/7bf/tv0c6dO6MjR45EDz30UHTZZZdFq1atiiYnJ8M9inR+/fGRj3wkqq+vjx555JHYVsVcLheu+WHYCrbX/dZv/Va0d+/e6NOf/nRxe90bHAvO0UdRFP31X/911N3dHZWXl0dXXnll9NRTT/2kp/RTNd7znvdEnZ2dUXl5edTV1RW95z3viQ4ePBg+n5iYiH7t134tamxsjKqrq6N3vvOd0enTp2P3OHr0aHTbbbdFVVVVUUtLS/Sbv/mb0czMzI97Kf+pxve+971I0nk/73//+6Momt9i9//9f/9f1N7eHlVUVEQ333xztG/fvtg9zp07F733ve+Nampqorq6uuiXfumXorGxsdg1L7/8cnTddddFFRUVUVdXV/SpT33qx7XE/xTjB9E5l8tFb33rW6PW1taorKwsWrp0afShD33ovESgSOfXHxeisaToM5/5TLjmh2Urvve970VbtmyJysvLo+XLl8eeURyvP4rvoy+O4iiO4iiO4ljAY0HV6IujOIqjOIqjOIojPoqOvjiKoziKoziKYwGPoqMvjuIojuIojuJYwKPo6IujOIqjOIqjOBbwKDr64iiO4iiO4iiOBTyKjr44iqM4iqM4imMBj6KjL47iKI7iKI7iWMCj6OiLoziKoziKozgW8Cg6+uIojuIojuIojgU8io6+OIqjOIqjOIpjAY+ioy+O4iiO4iiO4ljA4/8HagJCED0IUKMAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# Add the imageprep step description\n", - "MyPipeline.settings['steps'].update({'imageprep':\n", - " {'pipeline_class': 'pyopia.instrument.silcam.ImagePrep',\n", - " 'image_level': 'imraw'}\n", - " })\n", - "# Run the step\n", - "MyPipeline.run_step('imageprep')\n", - "# This is the same as running:\n", - "# ImagePrep = pyopia.instrument.silcam.ImagePrep(image_level='imraw')\n", - "# MyPipeline.data = ImagePrep(MyPipeline.data)\n", - "\n", - "plt.imshow(MyPipeline.data['imc'], cmap='grey')\n", - "plt.title('imc')" - ] + "outputs": [], + "source": "# Add the imageprep step description\nMyPipeline.settings['steps'].update({'imageprep':\n {'pipeline_class': 'pyopia.instrument.silcam.ImagePrep',\n 'image_level': 'imraw'}\n })\n# Run the step\nMyPipeline.run_step('imageprep')\n# This is the same as running:\n# ImagePrep = pyopia.instrument.silcam.ImagePrep(image_level='imraw')\n# MyPipeline.data = ImagePrep(MyPipeline.data)\n\nplt.imshow(MyPipeline.data['im_minimum'], cmap='grey')\nplt.title('im_minimum')" }, { "cell_type": "markdown", @@ -271,55 +229,11 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "57f09589", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Segment ready with: {'threshold': 0.85} and data dict_keys(['cl', 'settings', 'raw_files', 'filename', 'timestamp', 'imraw', 'imref', 'imc'])\n", - "segment\n", - "clean\n" - ] - }, - { - "data": { - "text/plain": [ - "Text(0.5, 1.0, 'imbw')" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# Add the segmentation step description\n", - "MyPipeline.settings['steps'].update({'segmentation':\n", - " {'pipeline_class': 'pyopia.process.Segment',\n", - " 'threshold': 0.85}}\n", - " )\n", - "# Run the step\n", - "MyPipeline.run_step('segmentation')\n", - "# This is the same as running:\n", - "# Segment = pyopia.process.Segment(threshold=settings['steps']['segmentation']['threshold'])\n", - "# data = Segment(data)\n", - "\n", - "plt.imshow(~MyPipeline.data['imbw'], cmap='grey')\n", - "plt.title('imbw')" - ] + "outputs": [], + "source": "# Add the segmentation step description\nMyPipeline.settings['steps'].update({'segmentation':\n {'pipeline_class': 'pyopia.process.Segment',\n 'threshold': 0.85,\n 'segment_source': 'im_minimum'}}\n )\n# Run the step\nMyPipeline.run_step('segmentation')\n# This is the same as running:\n# Segment = pyopia.process.Segment(threshold=settings['steps']['segmentation']['threshold'])\n# data = Segment(data)\n\nplt.imshow(~MyPipeline.data['imbw'], cmap='grey')\nplt.title('imbw')" }, { "cell_type": "markdown", @@ -372,37 +286,11 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "f6c91b57", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CalculateStats ready with: {} and data dict_keys(['cl', 'settings', 'raw_files', 'filename', 'timestamp', 'imraw', 'imref', 'imc', 'imbw'])\n", - "statextract\n", - "24.8% saturation\n", - "measure\n", - " 853 particles found\n", - "WARNING. exportparticles temporarily modified for 2-d images without color!\n", - "EXTRACTING 853 IMAGES from 853\n" - ] - } - ], - "source": [ - "# Add the segmentation step description\n", - "MyPipeline.settings['steps'].update({'statextract':\n", - " {'pipeline_class': 'pyopia.process.CalculateStats'}}\n", - " )\n", - "\n", - "# Run the step\n", - "MyPipeline.run_step('statextract')\n", - "# This is the same as running:\n", - "# CalculateStats = pyopia.process.CalculateStats()\n", - "# data = CalculateStats(data)\n", - "\n" - ] + "outputs": [], + "source": "# Add the segmentation step description\nMyPipeline.settings['steps'].update({'statextract':\n {'pipeline_class': 'pyopia.process.CalculateStats',\n 'roi_source': 'imref'}}\n )\n\n# Run the step\nMyPipeline.run_step('statextract')\n# This is the same as running:\n# CalculateStats = pyopia.process.CalculateStats()\n# data = CalculateStats(data)\n" }, { "cell_type": "markdown", @@ -1619,4 +1507,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file diff --git a/pyopia/tests/conftest.py b/pyopia/tests/conftest.py index 032408c2..6b7f1f40 100644 --- a/pyopia/tests/conftest.py +++ b/pyopia/tests/conftest.py @@ -1,5 +1,12 @@ ''' -Shared pytest fixtures for pyopia.cli integration tests. +Shared pytest fixtures for the pyopia test suite. + +The fixtures below that download real example data (images, models, the classifier +training database) are session-scoped: pytest creates each one at most once per test +run and hands the same object to every test that asks for it, regardless of which +test file it's in. This is what lets pyopia.tests.test_classify, test_pipeline, and +test_cli share a single real network download instead of each fetching their own copy. +See issue #403 for the motivation. ''' import os @@ -28,28 +35,68 @@ def invoke_in(directory, args): @pytest.fixture(scope='session') -def silcam_example_files(tmp_path_factory): - '''Download the real SilCam example image and classifier model once per test session. +def silcam_example_image_dir(tmp_path_factory): + '''Download the real SilCam example image once per test session. + + Returns the directory it was downloaded into, so a glob pattern like + ``f'{silcam_example_image_dir}/*.silc'`` finds it. + ''' + download_dir = tmp_path_factory.mktemp('silcam_example_image') + pyopia.exampledata.get_example_silc_image(str(download_dir)) + return download_dir + + +@pytest.fixture(scope='session') +def example_model_path(tmp_path_factory): + '''Download the real PyOPIA example classifier model once per test session.''' + download_dir = tmp_path_factory.mktemp('example_model') + return pyopia.exampledata.get_example_model(str(download_dir)) + + +@pytest.fixture(scope='session') +def holo_example_files(tmp_path_factory): + '''Download the real LISST-HOLO example hologram and its background image + once per test session. Returns (holo_filename, holo_background_filename). + ''' + download_dir = tmp_path_factory.mktemp('holo_example_files') + return pyopia.exampledata.get_example_hologram_and_background(str(download_dir)) + + +@pytest.fixture(scope='session') +def classifier_training_database(tmp_path_factory): + '''Download the real SilCam classifier training/labelled database once per + test session. Returns the path to the downloaded database folder. + ''' + download_dir = tmp_path_factory.mktemp('classifier_training_database') + database_path = os.path.join(str(download_dir), 'silcam_classification_database') + pyopia.exampledata.get_classifier_database_from_pysilcam_blob(database_path) + return database_path + + +@pytest.fixture(scope='session') +def silcam_example_files(tmp_path_factory, silcam_example_image_dir, example_model_path): + '''Real SilCam example image and classifier model, for CLI integration tests. pyopia.pipeline.FilesToProcess.prepare_chunking() refuses to process a raw file list with fewer than 2 entries (`num_chunks > len(files) // 2`), even for the default single-chunk case. Only one distinct real raw frame is available via - pyopia.exampledata, so the downloaded image is duplicated under a second, - differently-timestamped filename to satisfy that minimum. The image content - processed by the pipeline is still the real downloaded photo, just used twice; - no pipeline/classification logic is faked. + pyopia.exampledata, so it's copied into its own directory and duplicated under a + second, differently-timestamped filename there to satisfy that minimum. The image + content processed by the pipeline is still the real downloaded photo, just used + twice; no pipeline/classification logic is faked. + + This copies into a private directory rather than duplicating the file directly in + `silcam_example_image_dir`, so that other tests sharing that fixture always see + exactly one real file regardless of test execution order. ''' - download_dir = tmp_path_factory.mktemp('silcam_example_data') - image_filename = pyopia.exampledata.get_example_silc_image(str(download_dir)) - model_path = pyopia.exampledata.get_example_model(str(download_dir)) - - original_path = download_dir / image_filename - duplicate_path = download_dir / 'D20181101T142732.838206.silc' - shutil.copy(original_path, duplicate_path) + cli_download_dir = tmp_path_factory.mktemp('silcam_cli_download') + original_path = sorted(silcam_example_image_dir.glob('*.silc'))[0] + shutil.copy(original_path, cli_download_dir / original_path.name) + shutil.copy(original_path, cli_download_dir / 'D20181101T142732.838206.silc') return { - 'download_dir': download_dir, - 'model_path': model_path, + 'download_dir': cli_download_dir, + 'model_path': example_model_path, } diff --git a/pyopia/tests/test_classify.py b/pyopia/tests/test_classify.py index dac2a5d2..79d89213 100644 --- a/pyopia/tests/test_classify.py +++ b/pyopia/tests/test_classify.py @@ -4,11 +4,9 @@ """ from glob import glob -import tempfile import os from tqdm import tqdm -import pyopia.exampledata as exampledata import pyopia.io import pyopia.classify import pyopia.pipeline @@ -16,6 +14,7 @@ import pyopia.statistics import pyopia.background # noqa: F401 import pandas as pd +import pytest import skimage.io import numpy as np import pyopia.instrument.silcam @@ -24,233 +23,207 @@ ACCURACY = 60 -def test_match_to_database(): +@pytest.mark.slow +def test_match_to_database(classifier_training_database, example_model_path): """ Basic check of classification prediction against the training database. Therefore, if correct positive matches are not high percentages, then something is wrong with the prediction. @todo include more advanced testing of the classification feks. assert values in a confusion matrix. """ + database_path = classifier_training_database - # location of the training data - with tempfile.TemporaryDirectory() as tempdir: - # location of the training data - database_path = os.path.join(tempdir, "silcam_classification_database") + # Load the trained tensorflow model and class names + cl = pyopia.classify.Classify(model_path=example_model_path) + class_labels = cl.class_labels - exampledata.get_classifier_database_from_pysilcam_blob(database_path) - os.makedirs(os.path.join(tempdir, "model"), exist_ok=True) - model_path = exampledata.get_example_model(os.path.join(tempdir, "model")) + # class_labels should match the training data + classes = sorted(glob(os.path.join(database_path, "*"))) - # Load the trained tensorflow model and class names - cl = pyopia.classify.Classify(model_path=model_path) - class_labels = cl.class_labels + # @todo write a quick check that classes and class_labels agree before doing the proper test. - # class_labels should match the training data - classes = sorted(glob(os.path.join(database_path, "*"))) + def correct_positives(category): + """ + calculate the percentage positive matches for a given category + """ + print("Checking", category) + # list the files in this category of the training data + files = glob(os.path.join(database_path, category, "*.tiff")) - # @todo write a quick check that classes and class_labels agree before doing the proper test. + assert len(files) > 50, "less then 50 files in test data." - def correct_positives(category): - """ - calculate the percentage positive matches for a given category - """ - print("Checking", category) - # list the files in this category of the training data - files = glob(os.path.join(database_path, category, "*.tiff")) + # start a counter of incorrectly classified images + failed = 0 - assert len(files) > 50, "less then 50 files in test data." + # loop through the database images + for file in tqdm(files): + img = skimage.io.imread(file) # load ROI + img = np.float64(img) / 255 + prediction = cl.proc_predict(img) # run prediction from silcam_classify - # start a counter of incorrectly classified images - failed = 0 - time_limit = len(files) * 0.02 - t1 = pd.Timestamp.now() + ind = np.argmax(prediction) # find the highest score - # loop through the database images - for file in tqdm(files): - img = skimage.io.imread(file) # load ROI - img = np.float64(img) / 255 - prediction = cl.proc_predict(img) # run prediction from silcam_classify + # check if the highest score matches the correct category + if not class_labels[ind] == category: + # if not, the add to the failure count + failed += 1 - ind = np.argmax(prediction) # find the highest score + # turn failed count into a success percent + success = 100 - (failed / len(files)) * 100 - # check if the highest score matches the correct category - if not class_labels[ind] == category: - # if not, the add to the failure count - failed += 1 + return success - # turn failed count into a success percent - success = 100 - (failed / len(files)) * 100 - - t2 = pd.Timestamp.now() - td = t2 - t1 - assert td < pd.to_timedelta(time_limit, "s"), "Processing time too long." - - return success - - # loop through each category and calculate the success percentage - for cat in classes: - name = os.path.split(cat)[-1] - success = correct_positives(name) - print(name, success) - assert success > ACCURACY, ( - name + " was poorly classified at only " + str(success) + "percent." - ) + # loop through each category and calculate the success percentage + for cat in classes: + name = os.path.split(cat)[-1] + success = correct_positives(name) + print(name, success) + assert success > ACCURACY, ( + name + " was poorly classified at only " + str(success) + "percent." + ) -def test_pipeline_classification(): +@pytest.mark.slow +def test_pipeline_classification(classifier_training_database, example_model_path): """Check that the pipeline doesn't change the outcome of the classification. Do this by putting rois of know classificion (which we know get correctly classified independintly), and then use the same model in a pipeline analysing the synthetic image. """ + database_path = classifier_training_database + model_path = example_model_path + + # Load the trained tensorflow model and class names + cl = pyopia.classify.Classify(model_path=model_path) + + def get_good_roi(category): + """ + calculate the percentage positive matches for a given category + """ + + print("category", category) + # list the files in this category of the training data + files = sorted(glob(os.path.join(database_path, category, "*.tiff"))) + print(len(files), "files") + + found_match = 0 + # loop through the database images + for file in tqdm(files): + img = np.uint8(skimage.io.imread(file)) # load ROI + img = np.float64(img) / 255 + prediction = cl.proc_predict(img) # run prediction from silcam_classify + + if np.max(prediction) < (ACCURACY / 100): + continue + + ind = np.argmax(prediction) # find the highest score + + # check if the highest score matches the correct category + if cl.class_labels[ind] == category: + print("roi file", file) + return img, category + assert found_match == 1, ( + f"classifier not finding matching particle for {category}" + ) - with tempfile.TemporaryDirectory() as tempdir: - # location of the training data - database_path = os.path.join(tempdir, "silcam_classification_database") - - exampledata.get_classifier_database_from_pysilcam_blob(database_path) - os.makedirs("model", exist_ok=True) - model_path = exampledata.get_example_model("model") - - # Load the trained tensorflow model and class names - cl = pyopia.classify.Classify(model_path=model_path) - - def get_good_roi(category): - """ - calculate the percentage positive matches for a given category - """ - - print("category", category) - # list the files in this category of the training data - files = sorted(glob(os.path.join(database_path, category, "*.tiff"))) - print(len(files), "files") - - found_match = 0 - # loop through the database images - for file in tqdm(files): - img = np.uint8(skimage.io.imread(file)) # load ROI - img = np.float64(img) / 255 - prediction = cl.proc_predict(img) # run prediction from silcam_classify - - if np.max(prediction) < (ACCURACY / 100): - continue - - ind = np.argmax(prediction) # find the highest score - - # check if the highest score matches the correct category - if cl.class_labels[ind] == category: - print("roi file", file) - return img, category - assert found_match == 1, ( - f"classifier not finding matching particle for {category}" - ) - - canvas = np.ones((2048, 2448, 3), np.float64) - - rc_shift = int(2048 / len(cl.class_labels) / 1.5) - rc = rc_shift + canvas = np.ones((2048, 2448, 3), np.float64) - classes = sorted(glob(os.path.join(database_path, "*"))) + rc_shift = int(2048 / len(cl.class_labels) / 1.5) + rc = rc_shift - categories = [] + classes = sorted(glob(os.path.join(database_path, "*"))) - for cat in classes: - name = os.path.split(cat)[-1] - img, category = get_good_roi(name) - categories.append(category) - img_shape = np.shape(img) - rc += rc_shift - canvas[rc: rc + img_shape[0], rc: rc + img_shape[1], :] = np.float64(img) + categories = [] - settings = { - "general": {"raw_files": None, "pixel_size": 24}, - "steps": {"note": "non-standard pipeline."}, - } + for cat in classes: + name = os.path.split(cat)[-1] + img, category = get_good_roi(name) + categories.append(category) + img_shape = np.shape(img) + rc += rc_shift + canvas[rc: rc + img_shape[0], rc: rc + img_shape[1], :] = np.float64(img) - # Initialise the pipeline class without running anything - MyPipeline = pyopia.pipeline.Pipeline(settings=settings, initial_steps="") + settings = { + "general": {"raw_files": None, "pixel_size": 24}, + "steps": {"note": "non-standard pipeline."}, + } - # Get the example trained model - model_path = pyopia.exampledata.get_example_model(os.getcwd()) + # Initialise the pipeline class without running anything + MyPipeline = pyopia.pipeline.Pipeline(settings=settings, initial_steps="") - # Add the classifier step description to settings (i.e. metadata) - MyPipeline.settings["steps"].update( - { - "classifier": { - "pipeline_class": "pyopia.classify.Classify", - "model_path": model_path, - } + # Add the classifier step description to settings (i.e. metadata) + MyPipeline.settings["steps"].update( + { + "classifier": { + "pipeline_class": "pyopia.classify.Classify", + "model_path": model_path, } - ) - - # Execute the classifier step we defined above - MyPipeline.run_step("classifier") - # This is the same as running: - # MyPipeline.data['cl'] = pyopia.classify.Classify(model_path=model_path) - # Note: the classifier step is special in that it's output is specifically data['cl'], rather than other new keys in data - - MyPipeline.data["imraw"] = canvas - MyPipeline.data["timestamp"] = pd.Timestamp.now() - MyPipeline.data["filename"] = "" - - # Add the imageprep step description - MyPipeline.settings["steps"].update( - { - "imageprep": { - "pipeline_class": "pyopia.instrument.silcam.ImagePrep", - "image_level": "imraw", - } + } + ) + + # Execute the classifier step we defined above + MyPipeline.run_step("classifier") + # This is the same as running: + # MyPipeline.data['cl'] = pyopia.classify.Classify(model_path=model_path) + # Note: the classifier step is special in that it's output is specifically data['cl'], rather than other new keys in data + + MyPipeline.data["imraw"] = canvas + MyPipeline.data["timestamp"] = pd.Timestamp.now() + MyPipeline.data["filename"] = "" + + # Add the imageprep step description + MyPipeline.settings["steps"].update( + { + "imageprep": { + "pipeline_class": "pyopia.instrument.silcam.ImagePrep", + "image_level": "imraw", } - ) - # Run the step - MyPipeline.run_step("imageprep") - # This is the same as running: - # ImagePrep = pyopia.instrument.silcam.ImagePrep(image_level='imraw') - # MyPipeline.data = ImagePrep(MyPipeline.data) - - # Add the segmentation step description - MyPipeline.settings["steps"].update( - { - "segmentation": { - "pipeline_class": "pyopia.process.Segment", - "threshold": 1, - "segment_source": "im_minimum", - } + } + ) + # Run the step + MyPipeline.run_step("imageprep") + # This is the same as running: + # ImagePrep = pyopia.instrument.silcam.ImagePrep(image_level='imraw') + # MyPipeline.data = ImagePrep(MyPipeline.data) + + # Add the segmentation step description + MyPipeline.settings["steps"].update( + { + "segmentation": { + "pipeline_class": "pyopia.process.Segment", + "threshold": 1, + "segment_source": "im_minimum", } - ) - # Run the step - MyPipeline.run_step("segmentation") - # This is the same as running: - # Segment = pyopia.process.Segment(threshold=settings['steps']['segmentation']['threshold']) - # data = Segment(data) - - # Add the segmentation step description - MyPipeline.settings["steps"].update( - { - "statextract": { - "pipeline_class": "pyopia.process.CalculateStats", - "roi_source": "imref", - } + } + ) + # Run the step + MyPipeline.run_step("segmentation") + # This is the same as running: + # Segment = pyopia.process.Segment(threshold=settings['steps']['segmentation']['threshold']) + # data = Segment(data) + + # Add the segmentation step description + MyPipeline.settings["steps"].update( + { + "statextract": { + "pipeline_class": "pyopia.process.CalculateStats", + "roi_source": "imref", } - ) - - # Run the step - MyPipeline.run_step("statextract") - # This is the same as running: - # CalculateStats = pyopia.process.CalculateStats() - # data = CalculateStats(data) - - stats = pyopia.statistics.add_best_guesses_to_stats(MyPipeline.data["stats"]) + } + ) - out = [x[12:] for x in stats["best guess"].values] + # Run the step + MyPipeline.run_step("statextract") + # This is the same as running: + # CalculateStats = pyopia.process.CalculateStats() + # data = CalculateStats(data) - print("classes input", categories) - print("classes measured", out) + stats = pyopia.statistics.add_best_guesses_to_stats(MyPipeline.data["stats"]) - assert categories == out, ( - "Classes returned from classifier do not match what was given to the pipeline" - ) + out = [x[12:] for x in stats["best guess"].values] + print("classes input", categories) + print("classes measured", out) -if __name__ == "__main__": - test_match_to_database() - test_pipeline_classification() + assert categories == out, ( + "Classes returned from classifier do not match what was given to the pipeline" + ) diff --git a/pyopia/tests/test_cli.py b/pyopia/tests/test_cli.py index 0ef67d15..2c6546be 100644 --- a/pyopia/tests/test_cli.py +++ b/pyopia/tests/test_cli.py @@ -107,6 +107,7 @@ def test_version_flag_prints_package_version(): assert f'PyOPIA version: {pyopia.__version__}' in result.output +@pytest.mark.slow def test_init_project_creates_expected_structure(tmp_path): result = invoke_in(tmp_path, ['init-project', 'myproj']) @@ -168,6 +169,7 @@ def test_process_requires_an_output_step(tmp_path): assert 'output' in str(result.exception) +@pytest.mark.slow def test_process_produces_real_particle_stats_and_roi_export(silcam_cli_project): for stats_file in silcam_cli_project['stats_files']: with xarray.open_dataset(stats_file) as stats: @@ -234,6 +236,7 @@ def test_process_realtime_prepares_output_folder_and_calls_run_realtime(tmp_path assert recorded['pipeline_config']['steps']['output']['output_datafile'] == output_datafile +@pytest.mark.slow def test_merge_mfdata_combines_per_image_stats(silcam_cli_project, silcam_cli_merged_stats): with xarray.open_dataset(silcam_cli_merged_stats) as merged: merged.load() @@ -247,6 +250,7 @@ def test_merge_mfdata_combines_per_image_stats(silcam_cli_project, silcam_cli_me assert len(merged.major_axis_length) == sum(per_image_particle_counts) == 1740 +@pytest.mark.slow def test_convert_raw_images_creates_png(silcam_cli_project, tmp_path): result = invoke_in(tmp_path, ['convert-raw-images', str(silcam_cli_project['config_filename'])]) @@ -256,6 +260,7 @@ def test_convert_raw_images_creates_png(silcam_cli_project, tmp_path): assert len(converted) == 2 +@pytest.mark.slow def test_make_montage_creates_real_montage_image(silcam_cli_merged_stats, tmp_path): montage_path = tmp_path / 'montage.png' @@ -268,6 +273,7 @@ def test_make_montage_creates_real_montage_image(silcam_cli_merged_stats, tmp_pa assert montage_path.stat().st_size > 0 +@pytest.mark.slow def test_export_to_ecotaxa_creates_bundle_zip(silcam_cli_merged_stats, tmp_path): export_path = tmp_path / 'ecotaxa_export.zip' diff --git a/pyopia/tests/test_notebooks.py b/pyopia/tests/test_notebooks.py index 3c93f9d9..f2dc5473 100644 --- a/pyopia/tests/test_notebooks.py +++ b/pyopia/tests/test_notebooks.py @@ -1,26 +1,79 @@ -""" -A high level test for executing the ipynb notebooks in the notebooks folder. +''' +Executes notebooks end-to-end to check they still run against the current codebase. -Can only be run from top-level directory (i.e. with 'poetry run pytest -v') +Each notebook is its own parametrized test (test_notebook[.ipynb]), so a failure +in one notebook is reported individually instead of as one monolithic pass/fail across +all of them. Notebooks are executed with their own directory as the working directory, +since several of them load a local config.toml, or write/read files using paths that +are relative to where the notebook itself lives. -""" +See issue #403 for why this replaced a single un-parametrized test_notebooks() function, +and #237 for the docs/notebooks coverage this adds. +''' -from nbconvert.preprocessors import ExecutePreprocessor -import nbformat from pathlib import Path +import nbformat +import pytest +from nbconvert.preprocessors import ExecutePreprocessor + +REPO_ROOT = Path(__file__).resolve().parents[2] + +# Real network downloads and/or real pipeline runs, but no model training: acceptable +# to run in routine CI, just excluded from a fast local `pytest -m "not slow"` loop. +SLOW_NOTEBOOKS = [ + REPO_ROOT / 'notebooks' / 'single-image-stats.ipynb', + REPO_ROOT / 'notebooks' / 'pipeline-holo.ipynb', + REPO_ROOT / 'notebooks' / 'single-image-stats-holo.ipynb', + REPO_ROOT / 'notebooks' / 'pyopia-classifier' / 'pyopia-default-classifier.ipynb', + REPO_ROOT / 'docs' / 'notebooks' / 'background_correction.ipynb', + REPO_ROOT / 'docs' / 'notebooks' / 'montaging.ipynb', + REPO_ROOT / 'docs' / 'notebooks' / 'stats.ipynb', + REPO_ROOT / 'docs' / 'notebooks' / 'exploring_pipeline_data.ipynb', + REPO_ROOT / 'docs' / 'notebooks' / 'pipeline_step_by_step.ipynb', +] + +# No network/model dependency: fast enough to run alongside the rest of the suite. +FAST_NOTEBOOKS = [ + REPO_ROOT / 'docs' / 'notebooks' / 'cli.ipynb', +] + +# Markdown-only notebooks with no code cells to execute. Included for completeness +# (#237) but they provide no code-execution coverage on their own - there's nothing in +# them that could fail due to a code/API regression. +DOCS_ONLY_NOTEBOOKS = [ + REPO_ROOT / 'docs' / 'notebooks' / 'toml_config.ipynb', + REPO_ROOT / 'docs' / 'notebooks' / 'processing_raw_data.ipynb', + REPO_ROOT / 'docs' / 'notebooks' / 'big_datasets.ipynb', +] + +# Trains a real model from scratch (a DINOv2 backbone + 30 real training epochs, no +# reduced-epoch CI mode). Never runs in routine CI; run manually or on a schedule only, +# with `pytest -m training`. +TRAINING_NOTEBOOKS = [ + REPO_ROOT / 'notebooks' / 'pyopia-classifier' / 'pyopia-torch-dinov2-classifier-train.ipynb', +] + +# Not included: docs/notebooks/STATSnc.ipynb loads a pre-existing 'test-STATS.nc' file +# that no notebook produces at that same relative path when run in isolation - it's +# designed to be read by a user who already has their own processed stats file sitting +# in their working directory, not to be run standalone. Adding it here would need +# either chaining it after stats.ipynb in a shared working directory (fragile, couples +# two supposedly-independent tests) or changing the notebook itself to generate its own +# input first, which is a documentation content change rather than a test-infra one. + +NOTEBOOK_PARAMS = ( + [pytest.param(nb, id=nb.name, marks=pytest.mark.slow) for nb in SLOW_NOTEBOOKS] + + [pytest.param(nb, id=nb.name) for nb in FAST_NOTEBOOKS] + + [pytest.param(nb, id=nb.name) for nb in DOCS_ONLY_NOTEBOOKS] + + [pytest.param(nb, id=nb.name, marks=[pytest.mark.slow, pytest.mark.training]) for nb in TRAINING_NOTEBOOKS] +) -def test_notebooks(): - notebooks = sorted(Path("notebooks/").rglob("*.ipynb")) - notebooks.append("docs/notebooks/background_correction.ipynb") - for notebook_filename in notebooks: - with open(notebook_filename, encoding="utf8") as f: - nb = nbformat.read(f, as_version=4) - ep = ExecutePreprocessor() - print("running", notebook_filename) - ep.preprocess(nb, {"metadata": {"path": "notebooks/"}}) - print(notebook_filename, "complete") +@pytest.mark.parametrize('notebook_path', NOTEBOOK_PARAMS) +def test_notebook(notebook_path): + with open(notebook_path, encoding='utf8') as f: + nb = nbformat.read(f, as_version=4) -if __name__ == "__main__": - test_notebooks() + ep = ExecutePreprocessor() + ep.preprocess(nb, {'metadata': {'path': str(notebook_path.parent)}}) diff --git a/pyopia/tests/test_pipeline.py b/pyopia/tests/test_pipeline.py index 4ad23d44..d940d592 100644 --- a/pyopia/tests/test_pipeline.py +++ b/pyopia/tests/test_pipeline.py @@ -4,13 +4,11 @@ ''' from glob import glob -import tempfile import os import numpy as np import pytest import skimage.io -import pyopia.exampledata as testdata import pyopia.io import pyopia.classify from pyopia.pipeline import FilesToProcess, Pipeline @@ -20,7 +18,8 @@ import xarray -def test_holo_pipeline(): +@pytest.mark.slow +def test_holo_pipeline(tmp_path, holo_example_files): ''' Runs a holo pipeline on a single image with a pre-created background file. This test is primarily to detect errors when running the pipeline. @@ -31,96 +30,94 @@ def test_holo_pipeline(): Note: This does not properly test the background creation, and loads a pre-created background ''' import pyopia.instrument.holo # noqa: F401 - with tempfile.TemporaryDirectory() as tempdir: - print('tmpdir created:', tempdir) - os.makedirs(tempdir, exist_ok=True) - tempdir_proc = os.path.join(tempdir, 'proc') - os.makedirs(tempdir_proc, exist_ok=True) - - holo_filename, holo_background_filename = testdata.get_example_hologram_and_background(tempdir) - datafile_prefix = os.path.join(tempdir_proc, 'test') - - # define the configuration to use in the processing pipeline - given as a dictionary - with some values defined above - pipeline_config = { - 'general': { - 'raw_files': os.path.join(tempdir, '*.pgm'), - 'pixel_size': 4.4 # pixel size in um + tempdir_proc = tmp_path / 'proc' + tempdir_proc.mkdir() + + holo_filename, holo_background_filename = holo_example_files + datafile_prefix = os.path.join(tempdir_proc, 'test') + + # define the configuration to use in the processing pipeline - given as a dictionary - with some values defined above + pipeline_config = { + 'general': { + 'raw_files': os.path.join(os.path.dirname(holo_filename), '*.pgm'), + 'pixel_size': 4.4 # pixel size in um + }, + 'steps': { + 'initial': { + 'pipeline_class': 'pyopia.instrument.holo.Initial', + 'wavelength': 658, # laser wavelength in nm + 'n': 1.33, # index of refraction of sample volume medium (1.33 for water) + 'offset': 27, # offset to start of sample volume in mm + 'minZ': 0, # minimum reconstruction distance within sample volume in mm + 'maxZ': 50, # maximum reconstruction distance within sample volume in mm + 'stepZ': 0.5 # step size in mm }, - 'steps': { - 'initial': { - 'pipeline_class': 'pyopia.instrument.holo.Initial', - 'wavelength': 658, # laser wavelength in nm - 'n': 1.33, # index of refraction of sample volume medium (1.33 for water) - 'offset': 27, # offset to start of sample volume in mm - 'minZ': 0, # minimum reconstruction distance within sample volume in mm - 'maxZ': 50, # maximum reconstruction distance within sample volume in mm - 'stepZ': 0.5 # step size in mm - }, - 'load': { - 'pipeline_class': 'pyopia.instrument.holo.Load' - }, - 'correctbackground': { - 'pipeline_class': 'pyopia.background.CorrectBackgroundAccurate', - 'bgshift_function': 'accurate', - 'average_window': 1 - }, - 'reconstruct': { - 'pipeline_class': 'pyopia.instrument.holo.Reconstruct', - 'stack_clean': 0.02, - 'forward_filter_option': 2, - 'inverse_output_option': 0 - }, - 'focus': { - 'pipeline_class': 'pyopia.instrument.holo.Focus', - 'stacksummary_function': 'max_map', - 'threshold': 0.97, - 'focus_function': 'find_focus_sobel', - 'increase_depth_of_field': False, - 'merge_adjacent_particles': 2 - }, - 'segmentation': { - 'pipeline_class': 'pyopia.process.Segment', - 'threshold': 0.97, - 'segment_source': 'im_focussed' - }, - 'statextract': { - 'pipeline_class': 'pyopia.process.CalculateStats', - 'export_outputpath': tempdir_proc, - 'propnames': ['major_axis_length', 'minor_axis_length', 'equivalent_diameter', - 'feret_diameter_max', 'equivalent_diameter_area'], - 'roi_source': 'im_focussed' - }, - 'mergeholostats': { - 'pipeline_class': 'pyopia.instrument.holo.MergeStats', - }, - 'output': { - 'pipeline_class': 'pyopia.io.StatsToDisc', - 'output_datafile': datafile_prefix - } + 'load': { + 'pipeline_class': 'pyopia.instrument.holo.Load' + }, + 'correctbackground': { + 'pipeline_class': 'pyopia.background.CorrectBackgroundAccurate', + 'bgshift_function': 'accurate', + 'average_window': 1 + }, + 'reconstruct': { + 'pipeline_class': 'pyopia.instrument.holo.Reconstruct', + 'stack_clean': 0.02, + 'forward_filter_option': 2, + 'inverse_output_option': 0 + }, + 'focus': { + 'pipeline_class': 'pyopia.instrument.holo.Focus', + 'stacksummary_function': 'max_map', + 'threshold': 0.97, + 'focus_function': 'find_focus_sobel', + 'increase_depth_of_field': False, + 'merge_adjacent_particles': 2 + }, + 'segmentation': { + 'pipeline_class': 'pyopia.process.Segment', + 'threshold': 0.97, + 'segment_source': 'im_focussed' + }, + 'statextract': { + 'pipeline_class': 'pyopia.process.CalculateStats', + 'export_outputpath': str(tempdir_proc), + 'propnames': ['major_axis_length', 'minor_axis_length', 'equivalent_diameter', + 'feret_diameter_max', 'equivalent_diameter_area'], + 'roi_source': 'im_focussed' + }, + 'mergeholostats': { + 'pipeline_class': 'pyopia.instrument.holo.MergeStats', + }, + 'output': { + 'pipeline_class': 'pyopia.io.StatsToDisc', + 'output_datafile': datafile_prefix } } + } - processing_pipeline = Pipeline(pipeline_config) + processing_pipeline = Pipeline(pipeline_config) - # Manually initialize the background from a pre-computed and stored image - background_img = skimage.io.imread(holo_background_filename) - processing_pipeline.data['bgstack'] = [background_img] - processing_pipeline.data['imbg'] = np.mean(processing_pipeline.data['bgstack'], axis=0) + # Manually initialize the background from a pre-computed and stored image + background_img = skimage.io.imread(holo_background_filename) + processing_pipeline.data['bgstack'] = [background_img] + processing_pipeline.data['imbg'] = np.mean(processing_pipeline.data['bgstack'], axis=0) - print('Run processing on: ', holo_filename) - processing_pipeline.run(holo_filename) - with xarray.open_dataset(datafile_prefix + '-STATS.nc') as stats: - stats.load() + print('Run processing on: ', holo_filename) + processing_pipeline.run(holo_filename) + with xarray.open_dataset(datafile_prefix + '-STATS.nc') as stats: + stats.load() - print('stats header: ', stats.data_vars) - print('Total number of particles: ', len(stats.major_axis_length)) - assert len(stats.major_axis_length) == 40, ('Number of particles expected in this test is 56 for main' + - ' (or 40 for dev-1.2.)' + - ' This test counted ' + str(len(stats.major_axis_length)) + - ' Something has altered the number of particles detected') + print('stats header: ', stats.data_vars) + print('Total number of particles: ', len(stats.major_axis_length)) + assert len(stats.major_axis_length) == 40, ('Number of particles expected in this test is 56 for main' + + ' (or 40 for dev-1.2.)' + + ' This test counted ' + str(len(stats.major_axis_length)) + + ' Something has altered the number of particles detected') -def test_silcam_pipeline(): +@pytest.mark.slow +def test_silcam_pipeline(tmp_path, silcam_example_image_dir): ''' Asserts that the number of images counted in the processed hdf5 stats is the same as the number of images that should have been downloaded for the test. @@ -128,66 +125,61 @@ def test_silcam_pipeline(): This test is primarily to detect errors when running the pipeline. ''' import pyopia.instrument.silcam - with tempfile.TemporaryDirectory() as tempdir: - os.makedirs(tempdir, exist_ok=True) - tempdir_proc = os.path.join(tempdir, 'proc') - os.makedirs(tempdir_proc, exist_ok=True) - - filename = testdata.get_example_silc_image(tempdir) - print('filename got:', filename) - - files = glob(os.path.join(tempdir, '*.silc')) - print('file list available for test:') - print(files) - - datafile_prefix = os.path.join(tempdir_proc, 'test') - - pipeline_config = { - 'general': { - 'raw_files': files, - 'pixel_size': 28 # pixel size in um + tempdir_proc = tmp_path / 'proc' + tempdir_proc.mkdir() + + files = glob(os.path.join(silcam_example_image_dir, '*.silc')) + print('file list available for test:') + print(files) + + datafile_prefix = os.path.join(tempdir_proc, 'test') + + pipeline_config = { + 'general': { + 'raw_files': files, + 'pixel_size': 28 # pixel size in um + }, + 'steps': { + 'load': { + 'pipeline_class': 'pyopia.instrument.silcam.SilCamLoad' + }, + 'imageprep': { + 'pipeline_class': 'pyopia.instrument.silcam.ImagePrep', + 'image_level': 'imraw' + }, + 'segmentation': { + 'pipeline_class': 'pyopia.process.Segment', + 'threshold': 0.85, + 'segment_source': 'im_minimum' }, - 'steps': { - 'load': { - 'pipeline_class': 'pyopia.instrument.silcam.SilCamLoad' - }, - 'imageprep': { - 'pipeline_class': 'pyopia.instrument.silcam.ImagePrep', - 'image_level': 'imraw' - }, - 'segmentation': { - 'pipeline_class': 'pyopia.process.Segment', - 'threshold': 0.85, - 'segment_source': 'im_minimum' - }, - 'statextract': { - 'pipeline_class': 'pyopia.process.CalculateStats', - 'roi_source': 'im_minimum' - }, - 'output': { - 'pipeline_class': 'pyopia.io.StatsToDisc', - 'output_datafile': datafile_prefix - } + 'statextract': { + 'pipeline_class': 'pyopia.process.CalculateStats', + 'roi_source': 'im_minimum' + }, + 'output': { + 'pipeline_class': 'pyopia.io.StatsToDisc', + 'output_datafile': datafile_prefix } } + } - processing_pipeline = Pipeline(pipeline_config) + processing_pipeline = Pipeline(pipeline_config) - for filename in files[:2]: - stats = processing_pipeline.run(filename) + for filename in files[:2]: + stats = processing_pipeline.run(filename) - with xarray.open_dataset(datafile_prefix + '-STATS.nc') as stats: - stats.load() + with xarray.open_dataset(datafile_prefix + '-STATS.nc') as stats: + stats.load() - print('stats header: ', stats.data_vars) - print('Total number of particles: ', len(stats.major_axis_length)) - num_images = pyopia.statistics.count_images_in_stats(stats) - print('Number of raw images: ', num_images) - assert num_images == 1, ('Number of images expected is 1.' + - 'This test counted' + str(num_images)) - assert len(stats.major_axis_length) == 870, ('Number of particles expected in this test is 870.' + - 'This test counted ' + str(len(stats.major_axis_length)) + - ' Something has altered the number of particles detected') + print('stats header: ', stats.data_vars) + print('Total number of particles: ', len(stats.major_axis_length)) + num_images = pyopia.statistics.count_images_in_stats(stats) + print('Number of raw images: ', num_images) + assert num_images == 1, ('Number of images expected is 1.' + + 'This test counted' + str(num_images)) + assert len(stats.major_axis_length) == 870, ('Number of particles expected in this test is 870.' + + 'This test counted ' + str(len(stats.major_axis_length)) + + ' Something has altered the number of particles detected') def test_calculate_image_stats_uses_configured_path_length(): @@ -238,7 +230,7 @@ def test_calculate_image_stats_uses_configured_path_length(): assert not np.isclose(result['vc'], wrong_vc) -def test_per_class_concentration(): +def test_per_class_concentration(tmp_path): '''Verifies PerClassConcentration writes timestamp-indexed per-class number concentrations (numbers/L) to CSV across multiple images. ''' @@ -250,62 +242,61 @@ def test_per_class_concentration(): imy, imx = 2048, 2448 sample_volume = get_sample_volume(pixel_size, path_length, imx=imx, imy=imy) - with tempfile.TemporaryDirectory() as tempdir: - output_csv = os.path.join(tempdir, 'sub', 'per_class.csv') - - step = PerClassConcentration( - output_csv=output_csv, - probability_threshold=0.5, - overwrite=True, - ) - - # Image 1: 2 oil, 1 bubble, 1 below-threshold (unclassified) - stats_1 = pd.DataFrame({ - 'equivalent_diameter': [10.0, 12.0, 14.0, 9.0], - 'probability_oil': [0.9, 0.8, 0.1, 0.4], - 'probability_bubble': [0.05, 0.15, 0.85, 0.35], - 'probability_other': [0.05, 0.05, 0.05, 0.25], - }) - ts_1 = pd.Timestamp('2026-05-07T12:00:00') - - # Image 2: empty (placeholder NaN row, like pyopia.process.extract_particles) - stats_2 = pd.DataFrame({ - 'equivalent_diameter': [np.nan], - 'probability_oil': [np.nan], - 'probability_bubble': [np.nan], - 'probability_other': [np.nan], - }) - ts_2 = pd.Timestamp('2026-05-07T12:00:01') - - data = { - 'settings': {'general': {'pixel_size': pixel_size, 'path_length': path_length}}, - 'imraw': np.zeros((imy, imx, 3), dtype=np.uint8), - } + output_csv = tmp_path / 'sub' / 'per_class.csv' + + step = PerClassConcentration( + output_csv=str(output_csv), + probability_threshold=0.5, + overwrite=True, + ) + + # Image 1: 2 oil, 1 bubble, 1 below-threshold (unclassified) + stats_1 = pd.DataFrame({ + 'equivalent_diameter': [10.0, 12.0, 14.0, 9.0], + 'probability_oil': [0.9, 0.8, 0.1, 0.4], + 'probability_bubble': [0.05, 0.15, 0.85, 0.35], + 'probability_other': [0.05, 0.05, 0.05, 0.25], + }) + ts_1 = pd.Timestamp('2026-05-07T12:00:00') + + # Image 2: empty (placeholder NaN row, like pyopia.process.extract_particles) + stats_2 = pd.DataFrame({ + 'equivalent_diameter': [np.nan], + 'probability_oil': [np.nan], + 'probability_bubble': [np.nan], + 'probability_other': [np.nan], + }) + ts_2 = pd.Timestamp('2026-05-07T12:00:01') - data['stats'] = stats_1 - data['timestamp'] = ts_1 - step(data) + data = { + 'settings': {'general': {'pixel_size': pixel_size, 'path_length': path_length}}, + 'imraw': np.zeros((imy, imx, 3), dtype=np.uint8), + } - data['stats'] = stats_2 - data['timestamp'] = ts_2 - step(data) + data['stats'] = stats_1 + data['timestamp'] = ts_1 + step(data) - result = pd.read_csv(output_csv, index_col='timestamp', parse_dates=True) + data['stats'] = stats_2 + data['timestamp'] = ts_2 + step(data) - # Expected concentrations (counts / sample_volume in numbers/L) - assert result.shape[0] == 2 - assert list(result.index) == [ts_1, ts_2] - np.testing.assert_allclose(result.loc[ts_1, 'oil'], 2.0 / sample_volume) - np.testing.assert_allclose(result.loc[ts_1, 'bubble'], 1.0 / sample_volume) - np.testing.assert_allclose(result.loc[ts_1, 'other'], 0.0) - np.testing.assert_allclose(result.loc[ts_1, 'unclassified'], 1.0 / sample_volume) - np.testing.assert_allclose(result.loc[ts_1, 'total'], 4.0 / sample_volume) - np.testing.assert_allclose(result.loc[ts_1, 'sample_volume_L'], sample_volume) + result = pd.read_csv(output_csv, index_col='timestamp', parse_dates=True) - # Empty image: zero concentrations across the board - for col in ['oil', 'bubble', 'other', 'unclassified', 'total']: - assert result.loc[ts_2, col] == 0.0 - np.testing.assert_allclose(result.loc[ts_2, 'sample_volume_L'], sample_volume) + # Expected concentrations (counts / sample_volume in numbers/L) + assert result.shape[0] == 2 + assert list(result.index) == [ts_1, ts_2] + np.testing.assert_allclose(result.loc[ts_1, 'oil'], 2.0 / sample_volume) + np.testing.assert_allclose(result.loc[ts_1, 'bubble'], 1.0 / sample_volume) + np.testing.assert_allclose(result.loc[ts_1, 'other'], 0.0) + np.testing.assert_allclose(result.loc[ts_1, 'unclassified'], 1.0 / sample_volume) + np.testing.assert_allclose(result.loc[ts_1, 'total'], 4.0 / sample_volume) + np.testing.assert_allclose(result.loc[ts_1, 'sample_volume_L'], sample_volume) + + # Empty image: zero concentrations across the board + for col in ['oil', 'bubble', 'other', 'unclassified', 'total']: + assert result.loc[ts_2, col] == 0.0 + np.testing.assert_allclose(result.loc[ts_2, 'sample_volume_L'], sample_volume) def test_files_to_process_raises_clear_error_for_no_matching_files(tmp_path): @@ -321,10 +312,3 @@ def test_files_to_process_raises_clear_error_for_no_matching_files(tmp_path): with pytest.raises(RuntimeError, match='No raw files found'): raw_files.prepare_chunking(num_chunks=1, average_window=0, bgshift_function='pass') - - -if __name__ == "__main__": - test_holo_pipeline() - test_silcam_pipeline() - test_per_class_concentration() - test_files_to_process_raises_clear_error_for_no_matching_files() diff --git a/pyproject.toml b/pyproject.toml index b0c9b84a..8b667b41 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,6 +20,7 @@ dependencies = [ "numpy>=1.24.0", "scipy>=1.11.2,<2", "pytest>=7.2.0", + "pytest-timeout>=2.3.1,<3", "imageio>=2.31.3,<3", "matplotlib>=3.7", "tqdm>=4.66.1,<5", @@ -80,6 +81,13 @@ include = ["pyopia"] [tool.hatch.version] path = "pyopia/__init__.py" +[tool.pytest.ini_options] +markers = [ + "slow: real network downloads and/or real model inference; excluded from `pytest -m \"not slow\"` for a fast local loop, but still run in routine CI", + "training: trains a model from scratch (e.g. notebook-based training tutorials); never runs in routine CI, only manually or on a schedule", +] +timeout = 600 + [build-system] requires = ["hatchling"] build-backend = "hatchling.build" From eeeab7d8c3f346d6ecdf77643cb210e312230063 Mon Sep 17 00:00:00 2001 From: Alex Nimmo Smith Date: Thu, 30 Jul 2026 16:53:16 +0100 Subject: [PATCH 02/29] Raise notebook test timeout based on real CI evidence pipeline-holo.ipynb (an ordinary, non-training notebook) completed in ~2 minutes on Ubuntu and Windows in PR #404's CI run, but exceeded the 600s pytest-timeout default on macOS. The traceback showed it stuck waiting on the Jupyter kernel's socket, consistent with nbconvert/Jupyter-kernel execution being disproportionately slow on macOS CI runners specifically, not the underlying computation taking longer. Applies a 1800s override to all tests in this module rather than guessing a training-specific number, since any notebook could hit the same platform-specific slowdown. --- pyopia/tests/test_notebooks.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/pyopia/tests/test_notebooks.py b/pyopia/tests/test_notebooks.py index f2dc5473..1e80e4f8 100644 --- a/pyopia/tests/test_notebooks.py +++ b/pyopia/tests/test_notebooks.py @@ -69,6 +69,15 @@ + [pytest.param(nb, id=nb.name, marks=[pytest.mark.slow, pytest.mark.training]) for nb in TRAINING_NOTEBOOKS] ) +# Overrides pyproject.toml's 600s default for every test in this module. Confirmed on a +# real CI run (SINTEF/pyopia PR #404): pipeline-holo.ipynb - an ordinary, non-training +# notebook - completed in ~2 minutes on Ubuntu and Windows, but exceeded 600s on macOS. +# The traceback showed it stuck waiting on the Jupyter kernel's socket, which points to +# nbconvert/Jupyter-kernel execution being disproportionately slow on macOS CI runners +# specifically, not the underlying computation actually taking longer. Applies to all +# notebook tests here, not just the training one, since any of them could hit it. +pytestmark = pytest.mark.timeout(1800) + @pytest.mark.parametrize('notebook_path', NOTEBOOK_PARAMS) def test_notebook(notebook_path): From f341b78f1028de024283977017d3fbdbc62c83ac Mon Sep 17 00:00:00 2001 From: Alex Nimmo Smith Date: Thu, 30 Jul 2026 16:56:24 +0100 Subject: [PATCH 03/29] Auto-retry notebook tests on failure Adds pytest-rerunfailures and applies @pytest.mark.flaky(reruns=2) to test_notebooks.py, scoped to that module only. The macOS timeout seen on PR #404 looks like CI infra flakiness (a stuck Jupyter kernel socket) rather than a reproducible bug, so a couple of automatic retries is a reasonable complement to the longer timeout. Not applied suite-wide, since retrying elsewhere could mask a real, reproducible failure as flakiness. --- README.md | 2 +- pyopia/tests/test_notebooks.py | 7 ++++++- pyproject.toml | 1 + 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0f986fdb..87545a62 100644 --- a/README.md +++ b/README.md @@ -163,7 +163,7 @@ Unmarked tests are fast and have no external dependencies; they always run. **Shared fixtures**: tests that need real example data (an example image, the trained classifier model, the classifier training database, an example hologram) get it from session-scoped fixtures defined in `pyopia/tests/conftest.py`, rather than each downloading their own copy. The download happens once per test run and is shared across every test file that needs it. -**Notebooks**: `pyopia/tests/test_notebooks.py` executes the notebooks in `notebooks/` and `docs/notebooks/` to check they still run against the current codebase. Each notebook is its own parametrized test (`test_notebook[.ipynb]`), tagged `slow`/`training` as above where relevant. Not every notebook is included - a couple depend on state produced by another notebook, or by a user's own prior processing run, and would fail if executed standalone; see the comments in `test_notebooks.py` for which ones and why. +**Notebooks**: `pyopia/tests/test_notebooks.py` executes the notebooks in `notebooks/` and `docs/notebooks/` to check they still run against the current codebase. Each notebook is its own parametrized test (`test_notebook[.ipynb]`), tagged `slow`/`training` as above where relevant. Not every notebook is included - a couple depend on state produced by another notebook, or by a user's own prior processing run, and would fail if executed standalone; see the comments in `test_notebooks.py` for which ones and why. These tests also get a longer timeout (1800s) and up to 2 automatic retries on failure, since running a Jupyter kernel via nbconvert has shown real, platform-specific flakiness on macOS CI runners rather than a reproducible bug. Please do not disable or remove tests just to make a pull request pass - see Contributions guideline 3 above. diff --git a/pyopia/tests/test_notebooks.py b/pyopia/tests/test_notebooks.py index 1e80e4f8..3eb31503 100644 --- a/pyopia/tests/test_notebooks.py +++ b/pyopia/tests/test_notebooks.py @@ -76,7 +76,12 @@ # nbconvert/Jupyter-kernel execution being disproportionately slow on macOS CI runners # specifically, not the underlying computation actually taking longer. Applies to all # notebook tests here, not just the training one, since any of them could hit it. -pytestmark = pytest.mark.timeout(1800) +# +# Also auto-retries a failing notebook test up to twice (with a short delay between +# attempts) before letting it fail for real, since the underlying issue looks like CI +# infra flakiness (a stuck kernel socket) rather than a reproducible bug. Scoped to this +# module only - retrying the rest of the suite could mask a real, reproducible failure. +pytestmark = [pytest.mark.timeout(1800), pytest.mark.flaky(reruns=2, reruns_delay=10)] @pytest.mark.parametrize('notebook_path', NOTEBOOK_PARAMS) diff --git a/pyproject.toml b/pyproject.toml index 8b667b41..c38dcc94 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,6 +21,7 @@ dependencies = [ "scipy>=1.11.2,<2", "pytest>=7.2.0", "pytest-timeout>=2.3.1,<3", + "pytest-rerunfailures>=14.0,<15", "imageio>=2.31.3,<3", "matplotlib>=3.7", "tqdm>=4.66.1,<5", From 6ef82c142b4d67862c5df2c7224bc7eb9c50aa0c Mon Sep 17 00:00:00 2001 From: Alex Nimmo Smith Date: Thu, 30 Jul 2026 17:42:36 +0100 Subject: [PATCH 04/29] Fix NumPy 2.5 shape-assignment deprecation in holo reconstruction kernel In-place shape mutation (y.shape = ...) is deprecated as of NumPy 2.5. y is a freshly-created array here with no other references, so reassigning via reshape() is behavior-identical. Found via a DeprecationWarning in #404's CI. --- pyopia/instrument/holo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyopia/instrument/holo.py b/pyopia/instrument/holo.py index 4526436a..dbfc9b04 100644 --- a/pyopia/instrument/holo.py +++ b/pyopia/instrument/holo.py @@ -247,7 +247,7 @@ def create_kernel(im, pixel_size, wavelength, n, offset, minZ, maxZ, stepZ): x = (np.arange(0, im.shape[1]) - cx) / cx y = (np.arange(0, im.shape[0]) - cy) / cy - y.shape = (im.shape[0], 1) + y = y.reshape(im.shape[0], 1) f1 = np.tile(x, (im.shape[0], 1)) f2 = np.tile(y, (1, im.shape[1])) From ab815d285fa0ac3d830afffdf748e56e1261757c Mon Sep 17 00:00:00 2001 From: Alex Nimmo Smith Date: Thu, 30 Jul 2026 17:59:39 +0100 Subject: [PATCH 05/29] Fix get_j() feeding uninitialized memory into the Junge slope fit Fixes #405. get_j() used np.log's `where=` to skip non-positive number_distribution bins (to avoid log(0)/log(negative)), added in #314 specifically to "handle zero values in number_distribution[ind]". But `where=` without a matching `out=` leaves the skipped positions as uninitialized memory rather than excluding them, and that array was fed straight into np.polyfit for the Junge slope fit - a real, user-facing value returned by nc_vc_from_stats() and stored in image_stats['junge']. Excludes non-positive bins from the fit outright (properly completing the intent of #314's fix), and returns NaN when fewer than two bins remain in the 150-300um fitting range (e.g. an image with no particles in that range), rather than crashing or fitting garbage - matching how other undefined/no-data cases are already handled elsewhere in the codebase. The 150-300um range itself is untouched: it's a deliberate choice (per the existing comment) to fit the Junge slope only where LISST-100 and SilCam data are considered mutually valid, not an arbitrary restriction. --- pyopia/statistics.py | 13 +++++++++++-- pyopia/tests/test_pipeline.py | 30 ++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/pyopia/statistics.py b/pyopia/statistics.py index dcd6df87..383004f5 100644 --- a/pyopia/statistics.py +++ b/pyopia/statistics.py @@ -549,19 +549,28 @@ def get_j(dias, number_distribution): Junge slope from fitting of psd between 150 and 300um """ # conduct this calculation only on the part of the size distribution where - # LISST-100 and SilCam data overlap + # LISST-100 and SilCam data overlap. Bins with a non-positive count are excluded + # entirely (rather than masked via np.log's `where=`), since `where=` without a + # matching `out=` leaves uninitialized memory in the skipped positions, which would + # otherwise be fed straight into the fit below. ind = ( np.isfinite(dias) & np.isfinite(number_distribution) & (dias < 300) & (dias > 150) + & (number_distribution > 0) ) + # A linear fit needs at least two points. With fewer than that in range - e.g. an + # image with no particles between 150 and 300um - the slope is undefined. + if np.sum(ind) < 2: + return np.nan + # use polyfit to obtain the slope of the ditriubtion in log-space (which is # assumed near-linear in most parts of the ocean) p = np.polyfit( np.log(dias[ind]), - np.log(number_distribution[ind], where=number_distribution[ind] > 0), + np.log(number_distribution[ind]), 1, ) junge_slope = p[0] diff --git a/pyopia/tests/test_pipeline.py b/pyopia/tests/test_pipeline.py index d940d592..432de882 100644 --- a/pyopia/tests/test_pipeline.py +++ b/pyopia/tests/test_pipeline.py @@ -299,6 +299,36 @@ def test_per_class_concentration(tmp_path): np.testing.assert_allclose(result.loc[ts_2, 'sample_volume_L'], sample_volume) +def test_get_j_excludes_non_positive_bins_from_fit(): + '''Regression test for #405: get_j() used np.log's `where=` to skip non-positive + number_distribution bins, but without a matching `out=`, those skipped positions + were left as uninitialized memory and fed straight into the polyfit call. Verifies + the result matches a fit computed by excluding those bins outright. + ''' + dias = np.array([100.0, 160.0, 200.0, 250.0, 280.0, 350.0]) + number_distribution = np.array([10.0, 5.0, 0.0, 3.0, 2.0, 1.0]) # zero bin at 200um + + result = pyopia.statistics.get_j(dias, number_distribution) + + valid = (dias > 150) & (dias < 300) & (number_distribution > 0) + expected = np.polyfit(np.log(dias[valid]), np.log(number_distribution[valid]), 1)[0] + + np.testing.assert_allclose(result, expected) + + +def test_get_j_returns_nan_when_no_particles_in_fitting_range(): + '''An image with no particles between 150 and 300um (e.g. a single small particle, + as in test_calculate_image_stats_uses_configured_path_length) has an undefined + Junge slope - get_j() should return NaN rather than raising or fitting garbage. + ''' + dias = np.array([9.0]) + number_distribution = np.array([1.0]) + + result = pyopia.statistics.get_j(dias, number_distribution) + + assert np.isnan(result) + + def test_files_to_process_raises_clear_error_for_no_matching_files(tmp_path): '''Regression test for #279: an empty/non-matching raw_files pattern used to surface as a misleading "Number of chunks exceeds..." RuntimeError instead of a clear From 52b92da55a58d392fa44aae1fd552cc50d0acd31 Mon Sep 17 00:00:00 2001 From: Alex Nimmo Smith Date: Fri, 31 Jul 2026 16:41:27 +0100 Subject: [PATCH 06/29] Make multi-chunk logging queue-based and surface auxiliary data errors clearly Fixes #331 and #350. - process/process_realtime/merge_mfdata/process_file_list now all route logging through a multiprocessing.Queue drained by a single QueueListener, rather than each process/chunk opening its own FileHandler onto the same log file. Worker processes are named chunk-{c} so the merged log identifies which chunk each line came from. - AuxillaryData.load_auxillary_data failures are now wrapped in a new AuxillaryDataError naming the file and underlying cause, instead of being silently swallowed (or, for errors load_auxillary_data could actually raise, not caught at all). process_file_list stops the rest of that chunk on this error instead of retrying every remaining image against the same broken file. - Promoted the per-image exception traceback from DEBUG to ERROR so it's visible by default rather than only with verbose logging enabled. --- pyopia/auxillarydata.py | 21 ++++-- pyopia/cli.py | 148 +++++++++++++++++++++++++++++++--------- 2 files changed, 130 insertions(+), 39 deletions(-) diff --git a/pyopia/auxillarydata.py b/pyopia/auxillarydata.py index 4a84876f..0622b679 100644 --- a/pyopia/auxillarydata.py +++ b/pyopia/auxillarydata.py @@ -4,6 +4,11 @@ logger = logging.getLogger() + +class AuxillaryDataError(Exception): + """Raised when an auxiliary data file exists but cannot be parsed into the expected format.""" + + AUXILLARY_DATA_FILE_TEMPLATE = """% COMMENT LINE: PLEASE UPDATE THIS FILE WITH PROJECT RELEVANT DATA. EACH COLUMN WILL BECOME A NETCDF VARIABLE. % COMMENT LINE: ONE LINE PER MEASUREMENT, TIME IS INTERPOLATED TO IMAGE DATA TIMES IN PYOPIA. FOLLOWING LINES ARE UNITS, DESCRIPTION AND VARIABLE NAME. ,metres,degC @@ -50,17 +55,19 @@ class AuxillaryData: def __init__(self, auxillary_data_path=None): self.auxillary_data_path = auxillary_data_path - # Create empty dataframe for cases where no file was specified, or an error occured reading it + # Create empty dataframe for cases where no file was specified self.auxillary_data = pd.DataFrame(index=pd.Index([], name="time")).to_xarray() if auxillary_data_path is not None: try: self.auxillary_data = self.load_auxillary_data(auxillary_data_path) - except RuntimeError as e: - print(f"Failed to load auxillary data from file: {self.auxillary_data}") - logging.error( - f"Failed to load auxillary data from file: {self.auxillary_data}" - ) - logging.error(e) + except Exception as e: + # Re-raise as a single, specific error type that names the file and the + # underlying cause, so callers can recognise this failure mode (the same + # auxiliary data file applies to every image, so it is not worth retrying) + # and report something more useful than a bare KeyError/ValueError. + raise AuxillaryDataError( + f"Failed to load auxiliary data from '{auxillary_data_path}': {e}" + ) from e def load_auxillary_data(self, auxillary_data_path): """Load and format uxillary data from .csv file""" diff --git a/pyopia/cli.py b/pyopia/cli.py index f5004624..778dd795 100644 --- a/pyopia/cli.py +++ b/pyopia/cli.py @@ -9,6 +9,7 @@ import datetime import traceback import logging +import logging.handlers import json import numpy as np from rich.progress import Progress @@ -307,7 +308,9 @@ def process(config_filename: str, num_chunks: int = 1, strategy: str = "block"): progress.console.print("[blue]LOAD CONFIG") pipeline_config = pyopia.io.load_toml(config_filename) - setup_logging(pipeline_config) + log_queue = multiprocessing.Queue(-1) + listener = setup_queue_log_listener(pipeline_config, log_queue) + route_logging_through_queue(pipeline_config, log_queue) logger = logging.getLogger("rich") logger.info(f"PyOPIA process started {pd.Timestamp.now()}") @@ -347,11 +350,13 @@ def process(config_filename: str, num_chunks: int = 1, strategy: str = "block"): # With one chunk we keep the non-multiprocess functionality to ensure backwards compatibility job_list = [] if num_chunks == 1: - process_file_list(raw_files, pipeline_config, 0) + process_file_list(raw_files, pipeline_config, 0, log_queue) else: for c, chunk in enumerate(raw_files.chunked_files): job = multiprocessing.Process( - target=process_file_list, args=(chunk, pipeline_config, c) + target=process_file_list, + args=(chunk, pipeline_config, c, log_queue), + name=f"chunk-{c}", ) job_list.append(job) @@ -361,6 +366,8 @@ def process(config_filename: str, num_chunks: int = 1, strategy: str = "block"): # If we are using multiprocessing, make sure all jobs have finished [job.join() for job in job_list] + listener.stop() + # Calculate and print total processing time time_total = pd.to_timedelta(time.time() - t1, "seconds") with Progress(transient=True) as progress: @@ -386,7 +393,9 @@ def process_realtime(config_filename: str, watch_folder: str = None): """ # Load config and setup logging pipeline_config = pyopia.io.load_toml(config_filename) - setup_logging(pipeline_config) + log_queue = multiprocessing.Queue(-1) + listener = setup_queue_log_listener(pipeline_config, log_queue) + route_logging_through_queue(pipeline_config, log_queue) # Create output folders if "output" not in pipeline_config["steps"]: @@ -402,7 +411,10 @@ def process_realtime(config_filename: str, watch_folder: str = None): output_datafile = pipeline_config["steps"]["output"]["output_datafile"] os.makedirs(os.path.split(output_datafile)[:-1][0], exist_ok=True) - pyopia.realtime.run_realtime(pipeline_config, watch_folder=watch_folder) + try: + pyopia.realtime.run_realtime(pipeline_config, watch_folder=watch_folder) + finally: + listener.stop() @app.command() @@ -433,14 +445,20 @@ def merge_mfdata( Process this many files together and store as partially merged netcdf files, which are then merged at the end. Default: None, process all files together. """ - setup_logging({"general": {}}) - - pyopia.io.merge_and_save_mfdataset( - path_to_data, - prefix=prefix, - overwrite_existing_partials=overwrite_existing_partials, - chunk_size=chunk_size, - ) + pipeline_config = {"general": {}} + log_queue = multiprocessing.Queue(-1) + listener = setup_queue_log_listener(pipeline_config, log_queue) + route_logging_through_queue(pipeline_config, log_queue) + + try: + pyopia.io.merge_and_save_mfdataset( + path_to_data, + prefix=prefix, + overwrite_existing_partials=overwrite_existing_partials, + chunk_size=chunk_size, + ) + finally: + listener.stop() @app.command() @@ -572,7 +590,7 @@ def export_to_ecotaxa( ) -def process_file_list(file_list, pipeline_config, c): +def process_file_list(file_list, pipeline_config, c, log_queue): """Run a PyOPIA processing pipeline for a chuncked list of files based on a given config.toml Parameters @@ -586,9 +604,14 @@ def process_file_list(file_list, pipeline_config, c): c : int Chunk index for tracking progress and logging. If set to 0, enables the progress bar; for other values, the progress bar is disabled. + + log_queue : multiprocessing.Queue + Queue set up by `setup_queue_log_listener` in the calling command. Logging is + routed through it rather than this process opening its own handlers, so that + multiple chunks running in parallel don't write to the same log file at once. """ processing_pipeline = pyopia.pipeline.Pipeline(pipeline_config) - setup_logging(pipeline_config) + route_logging_through_queue(pipeline_config, log_queue) logger = logging.getLogger("rich") with get_custom_progress_bar( @@ -600,25 +623,31 @@ def process_file_list(file_list, pipeline_config, c): try: logger.debug(f"Chunk {c} starting to process {filename}") processing_pipeline.run(filename) + except pyopia.auxillarydata.AuxillaryDataError as e: + # The auxiliary data file is shared by every image in this chunk, so a + # parsing failure will not resolve itself by retrying on the next image. + logger.error( + f"[red]Stopping chunk {c}: {e} " + "Fix the auxiliary data file and re-run; " + "the rest of this chunk has been skipped." + ) + break except Exception as e: logger.warning( "[red]An error occured in processing, " + "skipping rest of pipeline and moving to next image." + f"(chunk {c})" ) - logger.error(e) - logger.debug("".join(traceback.format_tb(e.__traceback__))) + logger.error(f"{type(e).__name__}: {e}") + logger.error("".join(traceback.format_tb(e.__traceback__))) -def setup_logging(pipeline_config): - """Configure logging +LOG_FORMAT = "%(asctime)s %(levelname)s %(processName)s [%(module)s.%(funcName)s] %(message)s" +LOG_DATEFMT = "%Y-%m-%d %H:%M:%S" - Parameters - ---------- - pipeline_config : dict - TOML settings - """ - # Get user parameters or default values for logging + +def _log_level_and_handlers(pipeline_config): + """Build the log level and the real handlers (file or console) from pipeline_config.""" log_file = pipeline_config["general"].get("log_file", None) log_level_name = pipeline_config["general"].get("log_level", "INFO") log_level = getattr(logging, log_level_name) @@ -629,14 +658,69 @@ def setup_logging(pipeline_config): else: handlers = [logging.FileHandler(log_file, mode="a")] - # Configure logger - log_format = "%(asctime)s %(levelname)s %(processName)s [%(module)s.%(funcName)s] %(message)s" - logging.basicConfig( - level=log_level, - datefmt="%Y-%m-%d %H:%M:%S", - format=log_format, - handlers=handlers, + return log_level, handlers + + +def setup_queue_log_listener(pipeline_config, log_queue): + """Start a QueueListener that owns the real log handlers (file or console). + + This is the one place PyOPIA opens the real log file/console handler. Call it once + per command, before any process - including the caller itself - starts logging via + `route_logging_through_queue`. Every process sends LogRecords through `log_queue` + instead of writing to the log file directly, so this listener is the sole writer, + whether processing runs as one process or several in parallel; this avoids the + multi-writer file corruption risk of separate processes each opening their own + FileHandler onto the same file. See: + https://docs.python.org/3/howto/logging-cookbook.html#logging-to-a-single-file-from-multiple-processes + + Give each worker process a distinct `name` (e.g. `chunk-{c}`) when creating it, so + `%(processName)s` in the merged log identifies which chunk a line came from. + + Parameters + ---------- + pipeline_config : dict + TOML settings + log_queue : multiprocessing.Queue + Queue shared with every process that logs via `route_logging_through_queue` + + Returns + ------- + logging.handlers.QueueListener + Started listener; call `.stop()` once every process has finished logging + """ + _, handlers = _log_level_and_handlers(pipeline_config) + formatter = logging.Formatter(LOG_FORMAT, datefmt=LOG_DATEFMT) + for handler in handlers: + handler.setFormatter(formatter) + + listener = logging.handlers.QueueListener( + log_queue, *handlers, respect_handler_level=True ) + listener.start() + return listener + + +def route_logging_through_queue(pipeline_config, log_queue): + """Configure this process's root logger to send everything through `log_queue`. + + Used identically by every process that logs - the command's own main process and any + worker chunks it spawns - so exactly one process (the listener started by + `setup_queue_log_listener`) ever writes to the real log file/console. + + Parameters + ---------- + pipeline_config : dict + TOML settings + log_queue : multiprocessing.Queue + Queue read by the listener started by `setup_queue_log_listener` + """ + log_level_name = pipeline_config["general"].get("log_level", "INFO") + log_level = getattr(logging, log_level_name) + + root_logger = logging.getLogger() + root_logger.handlers.clear() + root_logger.addHandler(logging.handlers.QueueHandler(log_queue)) + root_logger.setLevel(log_level) def check_chunks(chunks, pipeline_config): From 68bb706b9c5272a31542699acfae41348c23e753 Mon Sep 17 00:00:00 2001 From: Alex Nimmo Smith Date: Fri, 31 Jul 2026 13:51:23 +0100 Subject: [PATCH 07/29] Fix README: broken docs-build command, broken link, typos, stale content Fixes #409. - "Build docs locally" was broken outright: the documented sphinx-apidoc command referenced docs/source and docs/build, neither of which exist. Verified against .readthedocs.yaml and confirmed the correct, working command is a single sphinx-build call (sphinx.ext.autosummary, already configured in docs/conf.py, generates the API docs automatically). - Fixed a broken markdown link (brackets/parens were swapped) and a Windows-style backslash path inside a bash command. - Fixed typos (regester, monatge, complie, awarenes, plesant, aknowledged) and inconsistent "PyOpia"/"PyOPIA" naming throughout. - Replaced the "Development targets" section, which had become stale and in places directly contradicted the current architecture (e.g. it said "no use of settings/config files," but the whole pipeline is config-driven), with a short, accurate "Design principles" section. - Clarified step 5's montage.png as an output file, not a command, and noted that init-project --example-data both downloads images and generates config.toml, so it doesn't appear to come from nowhere. - Expanded the Docker rationale beyond "for users who prefer not to install dependencies directly." Verified the full quick-start flow (init-project, process, merge-mfdata, make-montage) end-to-end with real example data. Co-Authored-By: Claude Sonnet 5 --- README.md | 53 +++++++++++++++++++---------------------------------- 1 file changed, 19 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index 87545a62..3b7f3862 100644 --- a/README.md +++ b/README.md @@ -3,10 +3,12 @@ PyOPIA A Python Ocean Particle Image Analysis toolbox +PyOPIA processes images of particles suspended in water (e.g. from SilCam, holographic, or UVP imaging systems) into particle size, shape, and concentration statistics. + # Quick tryout of PyOPIA 1) Install [uv](https://docs.astral.sh/uv/getting-started/installation) -2) Initialize PyOPIA project with a small example image dataset and run processing +2) Initialize a PyOPIA project with example data (`--example-data` downloads a small example image dataset and generates a matching `config.toml`), then run processing: ```bash uvx --python 3.12 --from pyopia[classification] pyopia init-project pyopiatest --example-data ``` @@ -24,19 +26,15 @@ uvx --python 3.12 --from pyopia[classification] pyopia merge-mfdata processed ``` ```bash -uvx --python 3.12 --from pyopia[classification] pyopia make-montage processed\pyopiatest-STATS.nc -``` -5) Visualise the monatge of all processed singular particle images in one -```bash -montage.png +uvx --python 3.12 --from pyopia[classification] pyopia make-montage processed/pyopiatest-STATS.nc ``` -Will show you a montage of all the processed particle images in one. +5) This creates `montage.png` in the current folder - open it to see a single image made up of all the processed particle images. See the documentation for more information on how to install and use PyOPIA. # Running with Docker -A prebuilt container image is published to GitHub Container Registry on every release, for users who prefer not to install PyOPIA's dependencies directly. +A prebuilt container image is published to GitHub Container Registry on every release. Docker is worth reaching for if you'd rather not install PyOPIA's dependencies directly: it avoids the install overhead of heavier optional dependencies (e.g. TensorFlow/PyTorch for classification), guarantees a consistent, reproducible environment regardless of your host OS, and is well suited to running on servers or HPC systems. ## One-off invocation @@ -109,35 +107,24 @@ PYOPIA_CONFIG=my_run.toml docker compose run --rm pyopia [pyopia.readthedocs.io](https://pyopia.readthedocs.io) # Current status: -- Under development. See/regester issues, [here](https://github.com/SINTEF/pyopia/issues) +- Under development. See/register issues, [here](https://github.com/SINTEF/pyopia/issues) ---- -# Development targets for PyOpia: - -1) Allow nonfamiliar users to install and use PyOpia, and to contribute & commit code changes -2) Not hardware specific -3) Smaller dependency list than PySilCam -Eventual optional dependencies (e.g. for classification) -4) Can be imported by pysilcam or other hardware-specific tools -5) Work on a single-image basis (...primarily, with options for multiprocess to be considered later) -6) No use of settings/config files within the core code - pass arguments directly. Eventual use of settings/config files should be handled by high-level wrappers that provide arguments to functions. -7) Github workflows -8) Tests +# Design principles -Normal functions within PyOpia should: - -1) take inputs -2) return new outputs -3) don't modify state of input -4) minimum possible disc IO during processing +- PyOPIA is instrument-agnostic at its core: SilCam, holographic, and UVP support are all built as pluggable instrument modules on top of a shared `Pipeline`. +- Processing is config-driven: a `Pipeline` is built from a TOML/dict `settings` object describing an ordered list of steps, each mapping to a Python class. Steps update a shared `data` dict as the pipeline runs. +- Heavy, optional dependencies (e.g. TensorFlow/PyTorch for classification) are kept out of the core install and available via extras (`pyopia[classification]`, `pyopia[classification-torch]`). +- Multi-file, multi-core processing is supported via chunked/parallel processing (`pyopia process --num-chunks`). ## Contributions We welcome additions and improvements to the code! We request that you follow a few guidelines. These are in place to make sure the code improves over time. 1. All code changes must be submitted as pull requests, either from a branch or a fork. -2. Good documentation of the code is needed for PyOpia to succeed and so please include up-to-date docstrings as you make changes, so that the auto-build on readthedocs is complete and useful for users. (A version of the new docs will complie when you make a pull request and a link to this can be found in the pull request checks) +2. Good documentation of the code is needed for PyOPIA to succeed and so please include up-to-date docstrings as you make changes, so that the auto-build on readthedocs is complete and useful for users. (A version of the new docs will compile when you make a pull request and a link to this can be found in the pull request checks) 3. All pull requests are required to pass all tests before merging. Please do not disable or remove tests just to make your branch pass the pull request. -4. All pull requests must be reviewed by a person. The benefits from code review are plenty, but we like to emphasise that code reviews help spreading the awarenes of code changes. Please note that code reviews should be a pleasant experience, so be plesant, polite and remember that there is a human being with good intentions on the other side of the screen. +4. All pull requests must be reviewed by a person. The benefits from code review are plenty, but we like to emphasise that code reviews help spreading the awareness of code changes. Please note that code reviews should be a pleasant experience, so be pleasant, polite and remember that there is a human being with good intentions on the other side of the screen. 5. All contributions are linted with flake8. We recommend that you run flake8 on your code while developing to fix any issues as you go. We recommend using autopep8 to autoformat your Python code (but please check the code behaviour is not affected by autoformatting before pushing). This makes flake8 happy, and makes it easier for us all to maintain a consistent and readable code base. ## Docstrings @@ -176,7 +163,7 @@ Users are expected to be familiar with Python. Please refer to the recommended i ## For developers from source -Install (uv)[https://docs.astral.sh/uv/getting-started/installation/] +Install [uv](https://docs.astral.sh/uv/getting-started/installation/) 1. Navigate to the folder where you want to install pyopia using the 'cd' command. @@ -193,7 +180,7 @@ For the next steps, you need to be located in the PyOPIA root directory that con 2. Install all requirements with ```bash -uv sync --all-extras +uv sync --all-extras --dev ``` 3. (optional) Run local tests (see the Testing section above for markers and how to run a fast subset): @@ -212,13 +199,11 @@ The version number of PyOPIA is split into three sections: MAJOR.MINOR.PATCH ## Build docs locally -``` -sphinx-apidoc -f -o docs/source docs/build --separate - -sphinx-build -b html ./docs/ ./docs/build +```bash +sphinx-build -b html docs/ docs/_build/html ``` ---- # License -PyOpia is licensed under the BSD3 license. See LICENSE. All contributors should be recognised & aknowledged. +PyOPIA is licensed under the BSD3 license. See LICENSE. All contributors should be recognised & acknowledged. From 42a9c13d333aa9ef09dbc781d56eaa5cf5f8ffe5 Mon Sep 17 00:00:00 2001 From: Alex Nimmo Smith Date: Fri, 31 Jul 2026 15:43:40 +0100 Subject: [PATCH 08/29] Migrate docs build from requirements.txt/pip to uv RTD now installs docs dependencies via `uv sync` using the classification extra plus a new `docs` dependency group, instead of pip-installing docs/requirements.txt. Verified with a real end-to-end `sphinx-build` using the resulting environment. Closes #399 --- .readthedocs.yaml | 8 ++++++-- docs/requirements.txt | 14 -------------- pyproject.toml | 9 +++++++++ 3 files changed, 15 insertions(+), 16 deletions(-) delete mode 100644 docs/requirements.txt diff --git a/.readthedocs.yaml b/.readthedocs.yaml index b659bc38..d7d172b1 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -23,8 +23,12 @@ sphinx: # Optionally set the version of Python and requirements required to build your docs python: install: - - requirements: docs/requirements.txt - - path: . + - method: uv + command: sync + extras: + - classification + groups: + - docs # By default readthedocs does not checkout git submodules submodules: diff --git a/docs/requirements.txt b/docs/requirements.txt deleted file mode 100644 index 2f4dc396..00000000 --- a/docs/requirements.txt +++ /dev/null @@ -1,14 +0,0 @@ -flake8 -docopt -setuptools -pytest-error-for-skips -sphinx_rtd_theme>=0.5.0 -sphinxcontrib-napoleon>=0.7 -sphinx-togglebutton -sphinx-copybutton -readthedocs-sphinx-search -myst-nb -jupyter_book -ipykernel>=6.19.4 -tensorflow==2.16.2 -keras>=3.13.2,<4 diff --git a/pyproject.toml b/pyproject.toml index c38dcc94..b36a315a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -66,6 +66,15 @@ classification-torch = [ "torch>=2.1.0", ] +[dependency-groups] +# Packages needed to build the docs that aren't already part of the base install or +# the classification extra (which the docs build also installs, since example +# notebooks exercise real classification). +docs = [ + "docopt", + "setuptools", +] + [project.urls] Repository = "https://github.com/sintef/pyopia" Documentation = "https://pyopia.readthedocs.io" From cb92b6f6c985195238c4a0a1b63e2e3d3f3095c7 Mon Sep 17 00:00:00 2001 From: Alex Nimmo Smith Date: Fri, 31 Jul 2026 17:51:44 +0100 Subject: [PATCH 09/29] Ensure the queue log listener is always stopped on early validation errors process()/process_realtime() created the log queue listener before validating the config (missing output step, etc.), but only stopped it at the very end - so a validation error left the listener's background thread (and the multiprocessing.Queue feeding it) running forever. Wrap the listener's whole lifetime in try/finally so it's always stopped, regardless of where an exception occurs. --- pyopia/cli.py | 146 +++++++++++++++++++++++++------------------------- 1 file changed, 73 insertions(+), 73 deletions(-) diff --git a/pyopia/cli.py b/pyopia/cli.py index 778dd795..0fefd1a5 100644 --- a/pyopia/cli.py +++ b/pyopia/cli.py @@ -302,71 +302,71 @@ def process(config_filename: str, num_chunks: int = 1, strategy: str = "block"): """ t1 = time.time() - with Progress(transient=True) as progress: - progress.console.print(f"[blue]PYOPIA VERSION {pyopia.__version__}") - - progress.console.print("[blue]LOAD CONFIG") - pipeline_config = pyopia.io.load_toml(config_filename) - - log_queue = multiprocessing.Queue(-1) - listener = setup_queue_log_listener(pipeline_config, log_queue) - route_logging_through_queue(pipeline_config, log_queue) - logger = logging.getLogger("rich") - logger.info(f"PyOPIA process started {pd.Timestamp.now()}") - - check_chunks(num_chunks, pipeline_config) - - progress.console.print("[blue]OBTAIN IMAGE LIST") - conf_corrbg = pipeline_config["steps"].get("correctbackground", dict()) - average_window = conf_corrbg.get("average_window", 0) - bgshift_function = conf_corrbg.get("bgshift_function", "pass") - raw_files = pyopia.pipeline.FilesToProcess( - pipeline_config["general"]["raw_files"] - ) - raw_files.prepare_chunking( - num_chunks, average_window, bgshift_function, strategy=strategy - ) - - # Write the dataset list of images to a text file - raw_files.to_filelist_file("filelist.txt") + pipeline_config = pyopia.io.load_toml(config_filename) + log_queue = multiprocessing.Queue(-1) + listener = setup_queue_log_listener(pipeline_config, log_queue) + route_logging_through_queue(pipeline_config, log_queue) + logger = logging.getLogger("rich") - progress.console.print("[blue]PREPARE FOLDERS") - if "output" not in pipeline_config["steps"]: - raise Exception( - 'The given config file is missing an "output" step.\n' - + "This is needed to setup how to save data to disc." + try: + with Progress(transient=True) as progress: + progress.console.print(f"[blue]PYOPIA VERSION {pyopia.__version__}") + progress.console.print("[blue]LOAD CONFIG") + logger.info(f"PyOPIA process started {pd.Timestamp.now()}") + + check_chunks(num_chunks, pipeline_config) + + progress.console.print("[blue]OBTAIN IMAGE LIST") + conf_corrbg = pipeline_config["steps"].get("correctbackground", dict()) + average_window = conf_corrbg.get("average_window", 0) + bgshift_function = conf_corrbg.get("bgshift_function", "pass") + raw_files = pyopia.pipeline.FilesToProcess( + pipeline_config["general"]["raw_files"] ) - output_datafile = pipeline_config["steps"]["output"]["output_datafile"] - os.makedirs(os.path.split(output_datafile)[:-1][0], exist_ok=True) - - if os.path.isfile(output_datafile + "-STATS.nc"): - dt_now = datetime.datetime.now().strftime("D%Y%m%dT%H%M%S") - newname = output_datafile + "-conflict-" + str(dt_now) + "-STATS.nc" - logger.warning(f"Renaming conflicting file to: {newname}") - os.rename(output_datafile + "-STATS.nc", newname) - - progress.console.print("[blue]INITIALISE PIPELINE") - - # With one chunk we keep the non-multiprocess functionality to ensure backwards compatibility - job_list = [] - if num_chunks == 1: - process_file_list(raw_files, pipeline_config, 0, log_queue) - else: - for c, chunk in enumerate(raw_files.chunked_files): - job = multiprocessing.Process( - target=process_file_list, - args=(chunk, pipeline_config, c, log_queue), - name=f"chunk-{c}", + raw_files.prepare_chunking( + num_chunks, average_window, bgshift_function, strategy=strategy ) - job_list.append(job) - # Start all the jobs - [job.start() for job in job_list] + # Write the dataset list of images to a text file + raw_files.to_filelist_file("filelist.txt") - # If we are using multiprocessing, make sure all jobs have finished - [job.join() for job in job_list] + progress.console.print("[blue]PREPARE FOLDERS") + if "output" not in pipeline_config["steps"]: + raise Exception( + 'The given config file is missing an "output" step.\n' + + "This is needed to setup how to save data to disc." + ) + output_datafile = pipeline_config["steps"]["output"]["output_datafile"] + os.makedirs(os.path.split(output_datafile)[:-1][0], exist_ok=True) + + if os.path.isfile(output_datafile + "-STATS.nc"): + dt_now = datetime.datetime.now().strftime("D%Y%m%dT%H%M%S") + newname = output_datafile + "-conflict-" + str(dt_now) + "-STATS.nc" + logger.warning(f"Renaming conflicting file to: {newname}") + os.rename(output_datafile + "-STATS.nc", newname) + + progress.console.print("[blue]INITIALISE PIPELINE") + + # With one chunk we keep the non-multiprocess functionality to ensure backwards compatibility + job_list = [] + if num_chunks == 1: + process_file_list(raw_files, pipeline_config, 0, log_queue) + else: + for c, chunk in enumerate(raw_files.chunked_files): + job = multiprocessing.Process( + target=process_file_list, + args=(chunk, pipeline_config, c, log_queue), + name=f"chunk-{c}", + ) + job_list.append(job) - listener.stop() + # Start all the jobs + [job.start() for job in job_list] + + # If we are using multiprocessing, make sure all jobs have finished + [job.join() for job in job_list] + finally: + listener.stop() # Calculate and print total processing time time_total = pd.to_timedelta(time.time() - t1, "seconds") @@ -397,21 +397,21 @@ def process_realtime(config_filename: str, watch_folder: str = None): listener = setup_queue_log_listener(pipeline_config, log_queue) route_logging_through_queue(pipeline_config, log_queue) - # Create output folders - if "output" not in pipeline_config["steps"]: - raise RuntimeError( - 'The given config file is missing an "output" step.\n' - + "This is needed to setup how to save data to disc." - ) - if "output_datafile" not in pipeline_config["steps"]["output"]: - raise RuntimeError( - 'The given config file is missing "output_datafile" option in the "output" step.\n' - + "This is needed to setup how to save data to disc." - ) - output_datafile = pipeline_config["steps"]["output"]["output_datafile"] - os.makedirs(os.path.split(output_datafile)[:-1][0], exist_ok=True) - try: + # Create output folders + if "output" not in pipeline_config["steps"]: + raise RuntimeError( + 'The given config file is missing an "output" step.\n' + + "This is needed to setup how to save data to disc." + ) + if "output_datafile" not in pipeline_config["steps"]["output"]: + raise RuntimeError( + 'The given config file is missing "output_datafile" option in the "output" step.\n' + + "This is needed to setup how to save data to disc." + ) + output_datafile = pipeline_config["steps"]["output"]["output_datafile"] + os.makedirs(os.path.split(output_datafile)[:-1][0], exist_ok=True) + pyopia.realtime.run_realtime(pipeline_config, watch_folder=watch_folder) finally: listener.stop() From 9772f87b26ad7fbdd7338efc5f5c2ae36407ec73 Mon Sep 17 00:00:00 2001 From: Alex Nimmo Smith Date: Wed, 5 Aug 2026 12:15:37 +0100 Subject: [PATCH 10/29] Add automated license-compliance check for dependencies Prompted by Emlyn's review comment on this PR about DINOv2's licensing history. Adds pip-licenses as a dev dependency and a CI job that fails the build if any dependency's license matches GPL/AGPL/LGPL/Commons Clause/Non-Commercial/SSPL/Business Source License. docutils needs an explicit exception since its PyPI metadata lists a compound license string that includes GPL from a couple of bundled non-code files, even though the actual code is BSD. Also declares PyOPIA's own license in packaging metadata (license = "BSD-3-Clause"), which was previously unset and reported as UNKNOWN by license-scanning tools. Closes #414 --- .github/workflows/build-and-test.yml | 23 +++++++++++++++++++++++ pyproject.toml | 5 +++++ 2 files changed, 28 insertions(+) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index d9ceb7c1..22b64687 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -59,3 +59,26 @@ jobs: - name: Run the automated tests run: uv run pytest -v -m "not training" + + License_check: + runs-on: ubuntu-latest + timeout-minutes: 10 + + steps: + - name: Check out code + uses: actions/checkout@v3 + + - name: Install uv + uses: astral-sh/setup-uv@v5 + with: + version: "0.6.10" + + - name: Install PyOPIA + run: uv sync --all-extras --dev + + - name: Check dependency licenses + run: > + uv run pip-licenses + --fail-on="GPL;AGPL;LGPL;Commons Clause;Non-Commercial;SSPL;Business Source License" + --partial-match + --ignore-packages docutils diff --git a/pyproject.toml b/pyproject.toml index b36a315a..aa6a019b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,6 +6,8 @@ authors = [ { name = "Emlyn Davies", email = "emlyn.davies@sintef.no" }, { name = "Alex Nimmo Smith", email = "alex@nimmosmith.co.uk" }, ] +license = "BSD-3-Clause" +license-files = ["LICENSE"] requires-python = "~=3.12.0" readme = "README.md" keywords = [ @@ -74,6 +76,9 @@ docs = [ "docopt", "setuptools", ] +dev = [ + "pip-licenses>=5.5.0,<6", +] [project.urls] Repository = "https://github.com/sintef/pyopia" From 1aba9600e373dc6957e82e3b0132267284051f26 Mon Sep 17 00:00:00 2001 From: Alex Nimmo Smith Date: Wed, 12 Aug 2026 16:05:12 +0100 Subject: [PATCH 11/29] Fully close the multiprocessing.Queue after stopping the log listener Real CI evidence: Windows CI runs on this stack were completing all tests successfully but then hanging for ~48 minutes before being killed by the 60-minute job timeout, with no further output after the test summary. Stopping the QueueListener alone isn't sufficient cleanup - the underlying multiprocessing.Queue keeps its own background feeder thread alive until explicitly closed, which per the multiprocessing docs can prevent a process from exiting cleanly. This wasn't visible in local verification (Linux/macOS) or in Ubuntu/macOS CI, but Windows' stricter process-exit/thread-cleanup semantics surfaced it as a full job timeout. Adds a shared stop_queue_logging() helper (listener.stop() + queue.close() + queue.join_thread()) used at all three call sites: process(), process_realtime(), and merge_mfdata(). --- pyopia/cli.py | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/pyopia/cli.py b/pyopia/cli.py index 0fefd1a5..c6560131 100644 --- a/pyopia/cli.py +++ b/pyopia/cli.py @@ -366,7 +366,7 @@ def process(config_filename: str, num_chunks: int = 1, strategy: str = "block"): # If we are using multiprocessing, make sure all jobs have finished [job.join() for job in job_list] finally: - listener.stop() + stop_queue_logging(listener, log_queue) # Calculate and print total processing time time_total = pd.to_timedelta(time.time() - t1, "seconds") @@ -414,7 +414,7 @@ def process_realtime(config_filename: str, watch_folder: str = None): pyopia.realtime.run_realtime(pipeline_config, watch_folder=watch_folder) finally: - listener.stop() + stop_queue_logging(listener, log_queue) @app.command() @@ -458,7 +458,7 @@ def merge_mfdata( chunk_size=chunk_size, ) finally: - listener.stop() + stop_queue_logging(listener, log_queue) @app.command() @@ -723,6 +723,27 @@ def route_logging_through_queue(pipeline_config, log_queue): root_logger.setLevel(log_level) +def stop_queue_logging(listener, log_queue): + """Stop the queue listener and fully close the queue itself. + + Stopping the listener alone isn't enough: an unclosed multiprocessing.Queue + keeps its background feeder thread alive, which can prevent the process + from exiting cleanly once everything else has finished - most visibly as a + hang on Windows, where process-exit/thread-cleanup semantics are stricter + than on Linux/macOS. + + Parameters + ---------- + listener : logging.handlers.QueueListener + Listener started by `setup_queue_log_listener` + log_queue : multiprocessing.Queue + The same queue passed to `setup_queue_log_listener` + """ + listener.stop() + log_queue.close() + log_queue.join_thread() + + def check_chunks(chunks, pipeline_config): if chunks < 1: raise RuntimeError("You must have at least 1 chunk") From 267433266795dd92a819d3b27bd3dd864a3eb766 Mon Sep 17 00:00:00 2001 From: Alex Nimmo Smith Date: Thu, 20 Aug 2026 17:38:29 +0100 Subject: [PATCH 12/29] Update local docs-build instructions for uv README's "Build docs locally" section now syncs the docs dependency group via uv before building, matching the RTD config. --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3b7f3862..768221ca 100644 --- a/README.md +++ b/README.md @@ -200,7 +200,8 @@ The version number of PyOPIA is split into three sections: MAJOR.MINOR.PATCH ## Build docs locally ```bash -sphinx-build -b html docs/ docs/_build/html +uv sync --extra classification --group docs +uv run sphinx-build -b html docs/ docs/_build/html ``` ---- From 078d59c365d4ef91eef88f3d6637c9a8db698bb6 Mon Sep 17 00:00:00 2001 From: Alex Nimmo Smith Date: Thu, 20 Aug 2026 17:40:29 +0100 Subject: [PATCH 13/29] Fix print_steps() referencing a non-existent attribute Fixes #415: print_steps() called steps_to_string(self.steps), but self.steps was never set anywhere - Pipeline only ever sets self.settings/self.stepnames in __init__. steps_to_string() also turned out to expect instantiated step objects (with a __dict__), not the raw settings dict, and is itself already marked deprecated - rather than resurrecting that, print_steps() now just pretty-prints the settings dict directly, which is simpler and shows the actually-configured arguments. --- pyopia/pipeline.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pyopia/pipeline.py b/pyopia/pipeline.py index 4df37607..9aeea0a4 100644 --- a/pyopia/pipeline.py +++ b/pyopia/pipeline.py @@ -191,10 +191,12 @@ def print_steps(self): # an eventual metadata parser could replace this below printing # and format into an appropriate standard + import pprint + logger.info('\n-- Pipeline configuration --\n') from pyopia import __version__ as pyopia_version logger.info(f'PyOpia version: {pyopia_version} + \n') - logger.debug(steps_to_string(self.steps)) + logger.debug(pprint.pformat(self.settings['steps'])) logger.info('\n---------------------------------\n') From 93f3947296d9bc7f9e5fe67f8894158a3b644fb7 Mon Sep 17 00:00:00 2001 From: Alex Nimmo Smith Date: Thu, 20 Aug 2026 17:41:35 +0100 Subject: [PATCH 14/29] bump version --- pyopia/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyopia/__init__.py b/pyopia/__init__.py index be90ee02..f7487666 100644 --- a/pyopia/__init__.py +++ b/pyopia/__init__.py @@ -1 +1 @@ -__version__ = "2.16.15" +__version__ = "2.16.16" From 97bce179eb31d47f34f89f4966f76dce1ac954de Mon Sep 17 00:00:00 2001 From: Alex Nimmo Smith Date: Thu, 20 Aug 2026 17:52:00 +0100 Subject: [PATCH 15/29] Add Releases and Using AI tools sections to README Closes #428: documents the release philosophy discussed in #425 - cut releases when work is finished and documented, rather than on a fixed schedule, and keep the Docker image in sync with each release. Closes #429: clarifies that AI coding tools are welcome as an aid, but whoever submits a PR is responsible for the code in it. --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 768221ca..a0058c1c 100644 --- a/README.md +++ b/README.md @@ -109,6 +109,11 @@ PYOPIA_CONFIG=my_run.toml docker compose run --rm pyopia - Under development. See/register issues, [here](https://github.com/SINTEF/pyopia/issues) +---- +# Releases + +Releases are cut when a finished, documented, and tested piece of work is ready to be used, rather than on a fixed schedule. If a feature has landed on `main` and meets the Contributions guidelines below, it should go out in the next release rather than sit unreleased. We aim to keep the Docker image (see Running with Docker above) in sync with each release, publishing it as part of the release process rather than as a separate manual step. + ---- # Design principles @@ -127,6 +132,10 @@ We welcome additions and improvements to the code! We request that you follow a 4. All pull requests must be reviewed by a person. The benefits from code review are plenty, but we like to emphasise that code reviews help spreading the awareness of code changes. Please note that code reviews should be a pleasant experience, so be pleasant, polite and remember that there is a human being with good intentions on the other side of the screen. 5. All contributions are linted with flake8. We recommend that you run flake8 on your code while developing to fix any issues as you go. We recommend using autopep8 to autoformat your Python code (but please check the code behaviour is not affected by autoformatting before pushing). This makes flake8 happy, and makes it easier for us all to maintain a consistent and readable code base. +### Using AI tools + +AI coding tools (e.g. Claude, Copilot, ChatGPT) are welcome as an aid to writing PyOPIA contributions. They are tools, not authors: whoever submits a pull request is responsible for the code in it, regardless of how much of it an AI tool helped produce. Please review, understand, and test any AI-assisted changes yourself before submitting them - the same guidelines above (documentation, tests, review, flake8) apply either way. + ## Docstrings Use the NumPy style in docstrings. See style guide [here](https://numpydoc.readthedocs.io/en/latest/format.html#documenting-classes) From a75c651ff689884c15267aed74970938880552e4 Mon Sep 17 00:00:00 2001 From: Alex Nimmo Smith Date: Thu, 20 Aug 2026 22:25:35 +0100 Subject: [PATCH 16/29] Cap DINOv2 training-notebook validation and run it in routine CI Closes #420: the training notebook's split logic put every image not chosen for training into validation, which for this dataset (thousands of images, badly imbalanced across classes) made evaluation dwarf training itself - locally, a single epoch at the old defaults took ~40 minutes almost entirely on a one-time ~7,400-image validation pass. Capping validation to VAL_PER_CLASS (20, randomly sampled) instead of "everything left over" brings the full 30-epoch default run down to ~16 minutes, confirmed empirically, with no change to training itself. That's cheap enough to move the notebook from pytest.mark.training (never ran in CI) into the routine per-PR slow-notebook set, so a real, full training run now has to pass before merging - removing the scheduled-vs-pinned dilemma #420 was asking about, since there's no longer a separate schedule to maintain. --- README.md | 7 +------ .../pyopia-torch-dinov2-classifier-train.ipynb | 11 +++++++++-- pyopia/tests/test_notebooks.py | 14 ++++---------- 3 files changed, 14 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index a0058c1c..fbdfaafe 100644 --- a/README.md +++ b/README.md @@ -150,16 +150,11 @@ PyOPIA's test suite lives in `pyopia/tests/` and runs via `pytest` (see `uv run ```bash uv run pytest -m "not slow" ``` -- `@pytest.mark.training` - tests that train a model from scratch (currently, a notebook that trains a DINOv2-based classifier). These never run in routine CI - only manually, or on a schedule - since they involve a real, uncapped multi-epoch training run rather than a check of PyOPIA's own correctness: - ```bash - uv run pytest -m training - ``` - Unmarked tests are fast and have no external dependencies; they always run. **Shared fixtures**: tests that need real example data (an example image, the trained classifier model, the classifier training database, an example hologram) get it from session-scoped fixtures defined in `pyopia/tests/conftest.py`, rather than each downloading their own copy. The download happens once per test run and is shared across every test file that needs it. -**Notebooks**: `pyopia/tests/test_notebooks.py` executes the notebooks in `notebooks/` and `docs/notebooks/` to check they still run against the current codebase. Each notebook is its own parametrized test (`test_notebook[.ipynb]`), tagged `slow`/`training` as above where relevant. Not every notebook is included - a couple depend on state produced by another notebook, or by a user's own prior processing run, and would fail if executed standalone; see the comments in `test_notebooks.py` for which ones and why. These tests also get a longer timeout (1800s) and up to 2 automatic retries on failure, since running a Jupyter kernel via nbconvert has shown real, platform-specific flakiness on macOS CI runners rather than a reproducible bug. +**Notebooks**: `pyopia/tests/test_notebooks.py` executes the notebooks in `notebooks/` and `docs/notebooks/` to check they still run against the current codebase. Each notebook is its own parametrized test (`test_notebook[.ipynb]`), tagged `slow` as above where relevant. Not every notebook is included - a couple depend on state produced by another notebook, or by a user's own prior processing run, and would fail if executed standalone; see the comments in `test_notebooks.py` for which ones and why. These tests also get a longer timeout (1800s) and up to 2 automatic retries on failure, since running a Jupyter kernel via nbconvert has shown real, platform-specific flakiness on macOS CI runners rather than a reproducible bug. Please do not disable or remove tests just to make a pull request pass - see Contributions guideline 3 above. diff --git a/notebooks/pyopia-classifier/pyopia-torch-dinov2-classifier-train.ipynb b/notebooks/pyopia-classifier/pyopia-torch-dinov2-classifier-train.ipynb index 3ebdcdf2..6011cab0 100644 --- a/notebooks/pyopia-classifier/pyopia-torch-dinov2-classifier-train.ipynb +++ b/notebooks/pyopia-classifier/pyopia-torch-dinov2-classifier-train.ipynb @@ -78,9 +78,15 @@ "# Option B: your own labelled data (set USE_EXAMPLE_DATABASE = False)\n", "DATA_DIR = \"\"\n", "\n", - "# Training images per class (remaining images used for validation)\n", + "# Training images per class\n", "IMAGES_PER_CLASS = 50\n", "\n", + "# Validation images per class, capped rather than using every remaining image - this\n", + "# dataset is large and unbalanced (thousands of images in some classes), so validating\n", + "# on \"everything left over\" is far more expensive than training itself for little\n", + "# extra signal.\n", + "VAL_PER_CLASS = 20\n", + "\n", "# Training epochs. 20–50 is typical; more rarely helps.\n", "EPOCHS = 30\n", "\n", @@ -178,9 +184,10 @@ " indices = np.arange(len(cls_samples))\n", " rng.shuffle(indices)\n", " n_train = min(IMAGES_PER_CLASS, len(cls_samples) - 1)\n", + " n_val = min(VAL_PER_CLASS, len(cls_samples) - n_train)\n", " for i in indices[:n_train]:\n", " train_samples.append(cls_samples[i])\n", - " for i in indices[n_train:]:\n", + " for i in indices[n_train:n_train + n_val]:\n", " val_samples.append(cls_samples[i])\n", " if n_train < IMAGES_PER_CLASS:\n", " print(f\" Warning: {classes[cls_idx]} has only {len(cls_samples)} images \"\n", diff --git a/pyopia/tests/test_notebooks.py b/pyopia/tests/test_notebooks.py index 3eb31503..35d52d67 100644 --- a/pyopia/tests/test_notebooks.py +++ b/pyopia/tests/test_notebooks.py @@ -19,13 +19,15 @@ REPO_ROOT = Path(__file__).resolve().parents[2] -# Real network downloads and/or real pipeline runs, but no model training: acceptable -# to run in routine CI, just excluded from a fast local `pytest -m "not slow"` loop. +# Real network downloads and/or real pipeline runs (including real model +# training/inference), but bounded enough to run in routine CI - excluded only from a +# fast local `pytest -m "not slow"` loop. SLOW_NOTEBOOKS = [ REPO_ROOT / 'notebooks' / 'single-image-stats.ipynb', REPO_ROOT / 'notebooks' / 'pipeline-holo.ipynb', REPO_ROOT / 'notebooks' / 'single-image-stats-holo.ipynb', REPO_ROOT / 'notebooks' / 'pyopia-classifier' / 'pyopia-default-classifier.ipynb', + REPO_ROOT / 'notebooks' / 'pyopia-classifier' / 'pyopia-torch-dinov2-classifier-train.ipynb', REPO_ROOT / 'docs' / 'notebooks' / 'background_correction.ipynb', REPO_ROOT / 'docs' / 'notebooks' / 'montaging.ipynb', REPO_ROOT / 'docs' / 'notebooks' / 'stats.ipynb', @@ -47,13 +49,6 @@ REPO_ROOT / 'docs' / 'notebooks' / 'big_datasets.ipynb', ] -# Trains a real model from scratch (a DINOv2 backbone + 30 real training epochs, no -# reduced-epoch CI mode). Never runs in routine CI; run manually or on a schedule only, -# with `pytest -m training`. -TRAINING_NOTEBOOKS = [ - REPO_ROOT / 'notebooks' / 'pyopia-classifier' / 'pyopia-torch-dinov2-classifier-train.ipynb', -] - # Not included: docs/notebooks/STATSnc.ipynb loads a pre-existing 'test-STATS.nc' file # that no notebook produces at that same relative path when run in isolation - it's # designed to be read by a user who already has their own processed stats file sitting @@ -66,7 +61,6 @@ [pytest.param(nb, id=nb.name, marks=pytest.mark.slow) for nb in SLOW_NOTEBOOKS] + [pytest.param(nb, id=nb.name) for nb in FAST_NOTEBOOKS] + [pytest.param(nb, id=nb.name) for nb in DOCS_ONLY_NOTEBOOKS] - + [pytest.param(nb, id=nb.name, marks=[pytest.mark.slow, pytest.mark.training]) for nb in TRAINING_NOTEBOOKS] ) # Overrides pyproject.toml's 600s default for every test in this module. Confirmed on a From 444c9ae07be24e8b6556ec393ea198798e6d0a9a Mon Sep 17 00:00:00 2001 From: Alex Nimmo Smith Date: Thu, 20 Aug 2026 23:08:26 +0100 Subject: [PATCH 17/29] Move DINOv2 notebook's torch/timm/scikit-learn deps into classification-torch extra CI just proved this: with the notebook's validation now bounded, it runs in routine CI alongside the rest of the notebook suite - and its own "!uv pip install torch timm scikit-learn" cell mutates the shared job venv outside pyproject.toml's constraints, silently bumping click past the <8.2.0 pin the project relies on to keep Typer working. That broke cli.ipynb's test on every OS immediately after the training notebook ran. timm and scikit-learn are now part of the classification-torch extra, next to the torch dependency that was already there, so `uv sync` resolves everything together respecting the project's real constraints. The notebook's install cell is now a no-op whenever those are already present (true for both routine CI and anyone who installed pyopia[classification-torch]) and only actually installs anything for someone running this notebook completely standalone without that extra. --- .../pyopia-torch-dinov2-classifier-train.ipynb | 10 ++++++++-- pyproject.toml | 2 ++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/notebooks/pyopia-classifier/pyopia-torch-dinov2-classifier-train.ipynb b/notebooks/pyopia-classifier/pyopia-torch-dinov2-classifier-train.ipynb index 6011cab0..3aaff17d 100644 --- a/notebooks/pyopia-classifier/pyopia-torch-dinov2-classifier-train.ipynb +++ b/notebooks/pyopia-classifier/pyopia-torch-dinov2-classifier-train.ipynb @@ -42,7 +42,7 @@ "metadata": {}, "source": [ "## Install extra dependencies\n", - "In addition to PyOPIA (for testing at the end), PyTorch, this notebook requires [TIMM](https://pypi.org/project/timm/) and scikit-learn. " + "In addition to PyOPIA (for testing at the end), PyTorch, this notebook requires [TIMM](https://pypi.org/project/timm/) and scikit-learn - already present if installed via `pyopia[classification-torch]`, otherwise installed automatically below. " ] }, { @@ -52,7 +52,13 @@ "metadata": {}, "outputs": [], "source": [ - "!uv pip install -q torch timm scikit-learn" + "import importlib.util\n", + "\n", + "missing = [pkg for pkg, mod in [(\"torch\", \"torch\"), (\"timm\", \"timm\"), (\"scikit-learn\", \"sklearn\")]\n", + " if importlib.util.find_spec(mod) is None]\n", + "if missing:\n", + " import subprocess\n", + " subprocess.run([\"uv\", \"pip\", \"install\", \"-q\", *missing], check=True)" ] }, { diff --git a/pyproject.toml b/pyproject.toml index aa6a019b..7ae21530 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -66,6 +66,8 @@ classification = [ classification-torch = [ "torch>=2.1.0", + "timm>=1.0.0", + "scikit-learn>=1.3.0", ] [dependency-groups] From bbb4a25f810b67752a23f8c32b0ac5607971bbf9 Mon Sep 17 00:00:00 2001 From: Alex Nimmo Smith Date: Thu, 20 Aug 2026 23:53:57 +0100 Subject: [PATCH 18/29] Add AGENTS.md; remove the now-unused training pytest marker Closes #429: adds AGENTS.md - operational guidance for AI coding agents (setup, testing, linting, conventions), distinct from the README's "Using AI tools" section, which is the human-facing policy statement. Also removes the training marker entirely rather than leaving it registered but unused: nothing has carried it since the DINOv2 notebook moved into the routine slow-notebook suite, and CI's `pytest -v -m "not training"` was already a no-op filter at that point. Simplifies CI's invocation to `pytest -v` accordingly. --- .github/workflows/build-and-test.yml | 6 ++-- AGENTS.md | 45 ++++++++++++++++++++++++++++ pyproject.toml | 1 - 3 files changed, 48 insertions(+), 4 deletions(-) create mode 100644 AGENTS.md diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 22b64687..43c3990d 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -20,7 +20,7 @@ jobs: run: uv sync --all-extras --dev - name: Run the automated tests - run: uv run pytest -v -m "not training" + run: uv run pytest -v Ubuntu_uv: runs-on: ubuntu-latest @@ -39,7 +39,7 @@ jobs: run: uv sync --all-extras --dev - name: Run the automated tests - run: uv run pytest -v -m "not training" + run: uv run pytest -v MacOS_uv: runs-on: macos-latest @@ -58,7 +58,7 @@ jobs: run: uv sync --all-extras --dev - name: Run the automated tests - run: uv run pytest -v -m "not training" + run: uv run pytest -v License_check: runs-on: ubuntu-latest diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 00000000..d1c43cf1 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,45 @@ +# AGENTS.md + +Operational guidance for AI coding agents working in this repository. See the +README's "Using AI tools" section for the human-facing policy this supports: +AI tools are welcome as an aid, but whoever submits a PR is responsible for +the code in it. + +## Setup + +```bash +uv sync --all-extras --dev +``` + +## Testing + +```bash +uv run pytest -m "not slow" # fast local loop, no network/model downloads +uv run pytest # everything CI runs, including the DINOv2 training notebook +``` + +Tests are marked `slow` (real network downloads and/or real model inference) +where relevant; excluded only from the fast local loop above, still run in +routine CI. + +## Linting + +```bash +uv run flake8 pyopia +``` + +autopep8 is fine for autoformatting, but verify behavior is unchanged before +committing. + +## Conventions + +- Docstrings: NumPy style. +- Pipeline steps are config-driven classes operating on a shared `data` dict + - see `pyopia/pipeline.py`. +- Version numbering is MAJOR.MINOR.PATCH - see the README's "Version + numbering" section for what bumps which. + +## Before submitting + +All PRs need a human review and must pass CI - see the README's +Contributions section for the full list of guidelines this repo expects. diff --git a/pyproject.toml b/pyproject.toml index 7ae21530..c67b02e2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -101,7 +101,6 @@ path = "pyopia/__init__.py" [tool.pytest.ini_options] markers = [ "slow: real network downloads and/or real model inference; excluded from `pytest -m \"not slow\"` for a fast local loop, but still run in routine CI", - "training: trains a model from scratch (e.g. notebook-based training tutorials); never runs in routine CI, only manually or on a schedule", ] timeout = 600 From 658bd2097054b70d47af6859280185d7fe2c0580 Mon Sep 17 00:00:00 2001 From: Alex Nimmo Smith Date: Fri, 21 Aug 2026 08:04:43 +0100 Subject: [PATCH 19/29] Pin timm exactly so DINOv2 weights don't silently drift in license terms Closes the licensing half of #420, which the earlier fix in this branch missed: DINOv2's pretrained weights started under a non-commercial license before later moving to Apache 2.0. timm was only floor-pinned (timm>=1.0.0), so uv sync (CI has no committed uv.lock) could silently resolve a newer timm release that remaps the "vit_small_patch14_dinov2.lvd142m" tag onto different weights/licensing, in both the classification-torch extra and the notebook's own standalone-install fallback. Pins both to timm==1.0.28 (the version already verified working throughout this branch's CI runs). Bumping it is now a deliberate, reviewed change rather than something that happens implicitly on every CI run. --- .../pyopia-torch-dinov2-classifier-train.ipynb | 11 ++++++++++- pyproject.toml | 7 ++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/notebooks/pyopia-classifier/pyopia-torch-dinov2-classifier-train.ipynb b/notebooks/pyopia-classifier/pyopia-torch-dinov2-classifier-train.ipynb index 3aaff17d..42c63d18 100644 --- a/notebooks/pyopia-classifier/pyopia-torch-dinov2-classifier-train.ipynb +++ b/notebooks/pyopia-classifier/pyopia-torch-dinov2-classifier-train.ipynb @@ -54,11 +54,20 @@ "source": [ "import importlib.util\n", "\n", + "# timm is pinned to match pyproject.toml's classification-torch extra: it resolves the\n", + "# DINOv2 backbone weights below (pretrained=True), and DINOv2's pretrained weights\n", + "# started under a non-commercial license before later moving to Apache 2.0 - an\n", + "# unpinned install could silently track a future timm release onto different\n", + "# weights/licensing terms. Bump only as a deliberate, reviewed change (both here and\n", + "# in pyproject.toml).\n", + "PINNED = {\"timm\": \"timm==1.0.28\"}\n", + "\n", "missing = [pkg for pkg, mod in [(\"torch\", \"torch\"), (\"timm\", \"timm\"), (\"scikit-learn\", \"sklearn\")]\n", " if importlib.util.find_spec(mod) is None]\n", "if missing:\n", " import subprocess\n", - " subprocess.run([\"uv\", \"pip\", \"install\", \"-q\", *missing], check=True)" + " to_install = [PINNED.get(pkg, pkg) for pkg in missing]\n", + " subprocess.run([\"uv\", \"pip\", \"install\", \"-q\", *to_install], check=True)" ] }, { diff --git a/pyproject.toml b/pyproject.toml index c67b02e2..ea4ece9d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -66,7 +66,12 @@ classification = [ classification-torch = [ "torch>=2.1.0", - "timm>=1.0.0", + # Pinned exactly: timm resolves the DINOv2 backbone weights used by the classifier + # training notebook (pretrained=True), and DINOv2's pretrained weights started under + # a non-commercial license before later moving to Apache 2.0 - an unpinned version + # could silently track a future timm release onto different weights/licensing terms. + # Bump this only as a deliberate, reviewed change. + "timm==1.0.28", "scikit-learn>=1.3.0", ] From 26fdad7a6aa4a7496c761e252eb9cdb06a6bbd06 Mon Sep 17 00:00:00 2001 From: Alex Nimmo Smith Date: Thu, 30 Jul 2026 19:01:34 +0100 Subject: [PATCH 20/29] Add scaled circular montage for fair density comparison across sample sizes Fixes #407. make_montage() always fills the same fixed rectangular canvas regardless of how much data went into it, making visual density comparisons across datasets with different sample sizes (e.g. depth bins with different numbers of raw images) misleading - every montage looks equally "full." make_montage_scaled() packs particles largest-first within a circular boundary whose area (not radius - area scales with sqrt(rel_scale) as the radius) is controlled by rel_scale. Setting rel_scale proportional to each dataset's relative sample size and placing the resulting montages side by side gives a fair visual comparison: half the raw images means half the circle area to fill. Also outputs grayscale rather than RGB, since particles from monochrome instruments don't need three channels, and it makes montage_plot()'s existing cmap='grey' argument actually take effect. Co-Authored-By: Claude Sonnet 5 --- pyopia/statistics.py | 157 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 157 insertions(+) diff --git a/pyopia/statistics.py b/pyopia/statistics.py index 383004f5..757ecb16 100644 --- a/pyopia/statistics.py +++ b/pyopia/statistics.py @@ -5,7 +5,9 @@ import os import pandas as pd import numpy as np +from skimage.draw import disk from skimage.exposure import rescale_intensity +from skimage.morphology import binary_dilation import h5py from tqdm import tqdm from pyopia.io import write_stats, load_stats_as_dataframe @@ -478,6 +480,161 @@ def make_montage( return montage_image +def make_montage_scaled( + stats_file_or_df, + pixel_size, + roidir, + msize=1024, + rel_scale=1.0, + gap=2, + max_attempts=500, + max_particles=500, + maxlength=100000, + crop_region=None, + brightness=1, + eyecandy=True, +): + """Makes a montage of particles packed within a circular boundary, largest first + + This is an alternative to :func:`make_montage` for instruments (e.g. holographic + imaging) where particles are naturally monochrome: the montage is a single-channel + grayscale image rather than RGB, so it can be plotted directly with + :func:`pyopia.plotting.montage_plot`, including its 1mm scale reference. + + The key difference from :func:`make_montage` is `rel_scale`: rather than always + filling the same fixed canvas regardless of how much data went into it, + `rel_scale` controls the *area* of the circular region available for packing, as a + fraction of the full canvas area. This makes it possible to visually compare + particle number density across datasets with different sample sizes - e.g. several + depth bins with different numbers of raw images - fairly: set `rel_scale` + proportional to each dataset's relative sample size (e.g. number of raw images, or + total sample volume) against a shared reference, generate one montage per dataset, + and place them side by side. A bin with half the raw images of another gets half + the circle area to fill, so the resulting packed density is directly comparable + between montages, rather than every montage always looking equally "full" + regardless of how much data it actually represents. + + Particles are placed largest-first, since bigger particles are harder to + accommodate once the canvas starts filling up. Each particle is given a `gap`-pixel + buffer against its neighbours (via binary dilation of its silhouette) so that + packed particles don't visually touch. A particle that can't find a free spot + within `max_attempts` random placements is skipped rather than resized or forced in. + + Parameters + ---------- + stats_file_or_df : DataFrame or str + either a str specifying the location of the STATS.nc file that comes from processing, or a stats dataframe + pixel_size : float + pixel size of system in microns + roidir : str + location of roifiles + msize : int, optional + size of the (square) canvas in pixels, by default 1024 + rel_scale : float, optional + fraction (0-1) of the full canvas *area* used as the circular placement + boundary. Set this proportional to relative sample size when comparing several + montages side by side (see above); use 1.0 for a single montage that isn't + being compared against others, by default 1.0 + gap : int, optional + minimum gap in pixels enforced between packed particles, by default 2 + max_attempts : int, optional + number of random placement attempts per particle before giving up on it, by default 500 + max_particles : int, optional + maximum number of (largest) particles to attempt to place, by default 500 + maxlength : int, optional + maximum length in microns of particles to be included in montage, by default 100000 + crop_region : tuple, optional + None or 4-tuple of lower-left then upper-right coord of crop, passed to :func:`crop_stats`, by default None + brightness : int, optional + brightness of packaged particles used with eyecandy option, by default 1 + eyecandy : bool, optional + boolean which if True will explode the contrast of packed particles + (nice for natural particles, but not so good for oil and gas), by default True + + Returns + ------- + montage_image : array + grayscale montage image (values 0-1, dark particles on a light background, + with the region outside the circular boundary shown slightly darker than the + background so the boundary is visible) that can be plotted with + :func:`pyopia.plotting.montage_plot` + """ + if isinstance(stats_file_or_df, str): + stats = load_stats_as_dataframe(stats_file_or_df) + else: + stats = stats_file_or_df + + if crop_region is not None: + stats = crop_stats(stats, crop_region) + + # remove nans because concentrations are not important here + stats = stats[~np.isnan(stats["major_axis_length"])] + stats = stats[(stats["major_axis_length"] * pixel_size) < maxlength] + + # pack largest particles first, since they're the hardest to fit later on + stats = stats.sort_values(by=["major_axis_length"], ascending=False) + + roifiles = stats["export_name"][stats["export_name"] != "not_exported"].values + roifiles = roifiles[:max_particles] + + # background = 1 (white); slightly darker outside the circular boundary so it's + # visible; particles are painted in as they're placed (values < 1) + montage = np.ones((msize, msize), dtype=np.float64) + # radius scales with sqrt(rel_scale) so that *area* (not radius) is proportional + # to rel_scale - see the rel_scale explanation above + radius = np.sqrt(rel_scale) * msize / 2 + rr, cc = disk((msize / 2, msize / 2), radius, shape=montage.shape) + within_boundary = np.zeros(montage.shape, dtype=bool) + within_boundary[rr, cc] = True + montage[~within_boundary] = 0.9 + + # available[i, j] is True while position (i, j) is free to place a particle in + available = within_boundary.copy() + + logger.info("making a scaled montage - this might take some time....") + n_placed = 0 + for roi_name in tqdm(roifiles): + particle_image = roi_from_export_name(roi_name, roidir) + if particle_image.ndim == 3: + particle_image = particle_image.mean(axis=2) + + if eyecandy: + particle_image = explode_contrast(particle_image) + particle_image = bright_norm(particle_image, brightness) + particle_image = np.clip(particle_image, 0, 1) + + height, width = particle_image.shape + if height >= msize or width >= msize: + continue + + # silhouette of the particle (darker-than-background pixels), padded out by + # `gap` so placed particles keep a visual buffer from their neighbours + silhouette = binary_dilation(particle_image < 0.9, footprint=np.ones((gap * 2 + 1, gap * 2 + 1))) + + placed = False + for _ in range(max_attempts): + r = np.random.randint(0, msize - height) + c = np.random.randint(0, msize - width) + + footprint = available[r:r + height, c:c + width] + if np.all(footprint[silhouette]): + canvas_region = montage[r:r + height, c:c + width] + particle_pixels = particle_image < 0.9 + canvas_region[particle_pixels] = particle_image[particle_pixels] + + available[r:r + height, c:c + width][silhouette] = False + placed = True + n_placed += 1 + break + + if not placed: + logger.debug(f"Could not find a free spot for particle: {roi_name}") + + logger.info(f"scaled montage complete: placed {n_placed} of {len(roifiles)} particles") + + return montage + + def gen_roifiles(stats, auto_scaler=500): """Generates a list of filenames suitable for making montages with From 0a74f5c02b04bcff0a42ab1b1332bf5d1fda31ee Mon Sep 17 00:00:00 2001 From: Alex Nimmo Smith Date: Wed, 5 Aug 2026 13:14:48 +0100 Subject: [PATCH 21/29] Attempt every particle in make_montage_scaled instead of truncating Prompted by Emlyn's review comment questioning the roifiles selection here. Truncating to the max_particles largest particles (or evenly subsampling, as gen_roifiles() does for the older make_montage) both misrepresent the true relative abundance of particle sizes - a scaled montage's whole purpose is a fair visual comparison, so it should reflect the real size distribution, not an artificially selected subset. Every exported particle is now attempted, largest first; particles that can't find a free spot are skipped as before, but now a warning is logged summarising how many were skipped once the montage is complete, since that means msize needs to be increased (not rel_scale, which exists specifically to preserve relative comparisons and would be distorted by nudging it to fit one particular montage). --- pyopia/statistics.py | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/pyopia/statistics.py b/pyopia/statistics.py index 757ecb16..704b12e4 100644 --- a/pyopia/statistics.py +++ b/pyopia/statistics.py @@ -488,7 +488,6 @@ def make_montage_scaled( rel_scale=1.0, gap=2, max_attempts=500, - max_particles=500, maxlength=100000, crop_region=None, brightness=1, @@ -514,11 +513,19 @@ def make_montage_scaled( between montages, rather than every montage always looking equally "full" regardless of how much data it actually represents. - Particles are placed largest-first, since bigger particles are harder to - accommodate once the canvas starts filling up. Each particle is given a `gap`-pixel - buffer against its neighbours (via binary dilation of its silhouette) so that - packed particles don't visually touch. A particle that can't find a free spot - within `max_attempts` random placements is skipped rather than resized or forced in. + Every exported particle is attempted, largest first, since bigger particles are + harder to accommodate once the canvas starts filling up - there is no upfront + subsampling or truncation, since either would misrepresent the true relative + abundance of particle sizes. Each particle is given a `gap`-pixel buffer against + its neighbours (via binary dilation of its silhouette) so that packed particles + don't visually touch. A particle that can't find a free spot within `max_attempts` + random placements is skipped rather than resized or forced in; if any particles are + skipped this way, a warning is logged summarising how many, once the montage is + complete. This means `msize` is too small to fit everything - increase it (and, if + this montage is one of several being compared via `rel_scale`, increase `msize` the + same way for all of them, to keep the relative comparison valid; don't compensate + by changing `rel_scale` itself, since that would distort the comparison it exists + to preserve). Parameters ---------- @@ -539,8 +546,6 @@ def make_montage_scaled( minimum gap in pixels enforced between packed particles, by default 2 max_attempts : int, optional number of random placement attempts per particle before giving up on it, by default 500 - max_particles : int, optional - maximum number of (largest) particles to attempt to place, by default 500 maxlength : int, optional maximum length in microns of particles to be included in montage, by default 100000 crop_region : tuple, optional @@ -574,8 +579,8 @@ def make_montage_scaled( # pack largest particles first, since they're the hardest to fit later on stats = stats.sort_values(by=["major_axis_length"], ascending=False) + # every exported particle is attempted - see docstring for why this isn't subsampled roifiles = stats["export_name"][stats["export_name"] != "not_exported"].values - roifiles = roifiles[:max_particles] # background = 1 (white); slightly darker outside the circular boundary so it's # visible; particles are painted in as they're placed (values < 1) @@ -630,11 +635,23 @@ def make_montage_scaled( if not placed: logger.debug(f"Could not find a free spot for particle: {roi_name}") - logger.info(f"scaled montage complete: placed {n_placed} of {len(roifiles)} particles") + _log_montage_placement_summary(n_placed, len(roifiles)) return montage +def _log_montage_placement_summary(n_placed, n_total): + """Log how many particles a scaled montage placed, warning if any were skipped""" + n_skipped = n_total - n_placed + if n_skipped > 0: + logger.warning( + f"{n_skipped} of {n_total} particles could not be placed and were skipped - " + "consider increasing msize to fit all particles (and, if comparing this montage " + "against others via rel_scale, increase msize consistently for all of them)." + ) + logger.info(f"scaled montage complete: placed {n_placed} of {n_total} particles") + + def gen_roifiles(stats, auto_scaler=500): """Generates a list of filenames suitable for making montages with From 5439189767b03d2dca747567b883f8379bf44e93 Mon Sep 17 00:00:00 2001 From: Alex Nimmo Smith Date: Thu, 20 Aug 2026 17:43:10 +0100 Subject: [PATCH 22/29] Add optional progress/ETA logging to Pipeline Closes #416: adds an opt-in Pipeline.enable_progress_tracking(total_files, log_interval) that logs percent complete/elapsed/ETA every log_interval calls to run(). No effect unless called. With multiple chunks (pyopia process --num-chunks), each chunk's Pipeline instance tracks its own progress independently - this rides on the existing per-process logger, so it's automatically safe under the queue-based multiprocess logging already in place. --- pyopia/pipeline.py | 65 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/pyopia/pipeline.py b/pyopia/pipeline.py index 9aeea0a4..e0a35404 100644 --- a/pyopia/pipeline.py +++ b/pyopia/pipeline.py @@ -75,6 +75,13 @@ def __init__(self, settings, # Flag used to control whether remaining pipeline steps should be skipped once it has been set to True self.data['skip_next_steps'] = False + # Progress tracking is opt-in via enable_progress_tracking(); left at these + # defaults, _log_progress() is a no-op + self._progress_total_files = None + self._progress_files_done = 0 + self._progress_start_time = None + self._progress_log_interval = 5 + self.pass_general_settings() for stepname in self.stepnames: @@ -126,10 +133,68 @@ def run(self, filename): # Reset skip flag self.data['skip_next_steps'] = False + self._log_progress() return + self._log_progress() return + def enable_progress_tracking(self, total_files, log_interval=5): + '''Opt in to periodic progress/ETA logging as `run()` is called in a loop + + Logs percent complete, elapsed time and an ETA at INFO level every + `log_interval` files. Has no effect unless called - by default `run()` does + not log any progress summary. + + Note + ---- + When running as multiple chunks (`pyopia process --num-chunks`), each chunk + runs in its own process with its own `Pipeline` instance, so progress is + reported per chunk (e.g. "3 of 20" for that chunk's own file list) rather than + as a single total across every chunk. + + Parameters + ---------- + total_files : int + Total number of files that will be passed to `run()`, used to calculate + percent complete and ETA + log_interval : int, optional + Log a progress update every this many files, by default 5 + + Examples + -------- + >>> pipeline = Pipeline(settings) + >>> pipeline.enable_progress_tracking(len(filenames)) + >>> for filename in filenames: + ... pipeline.run(filename) + ''' + self._progress_total_files = total_files + self._progress_files_done = 0 + self._progress_start_time = time.time() + self._progress_log_interval = log_interval + + def _log_progress(self): + '''Log a progress/ETA update, if progress tracking is enabled and due''' + if self._progress_total_files is None: + return + + self._progress_files_done += 1 + done = self._progress_files_done + total = self._progress_total_files + + if done % self._progress_log_interval != 0 and done != total: + return + + elapsed = time.time() - self._progress_start_time + remaining = (elapsed / done) * (total - done) + eta = (datetime.datetime.now() + datetime.timedelta(seconds=remaining)).strftime('%H:%M:%S') + + logger.info( + f'Progress: {done}/{total} ({100 * done / total:.1f}%) - ' + f'elapsed {datetime.timedelta(seconds=int(elapsed))}, ' + f'ETA {eta} (in {datetime.timedelta(seconds=int(remaining))})' + ) + def run_step(self, stepname): '''Execute a pipeline step and update the pipeline data From 9e17ad0860d9ce7cf6339e49c87ec6cc1ab0d4fb Mon Sep 17 00:00:00 2001 From: Alex Nimmo Smith Date: Wed, 5 Aug 2026 14:39:43 +0100 Subject: [PATCH 23/29] Add fixed-pixel ROI padding, complementing bbox_expansion Closes #418. bbox_expansion already lets a particle's bounding box be expanded before its ROI is cropped, but that expansion is fractional - it scales with each particle's own size. There was no way to add a fixed, consistent pixel margin regardless of particle size, e.g. to guarantee a small non-particle border around every ROI fed to the classifier (which is run on this same cropped ROI as the exported file), or for visual inspection/montage context. Adds a new pad_bbox() helper (fixed-pixel analogue of the existing expand_bbox()) and a pad parameter threaded through the same chain bbox_expansion already uses: extract_roi -> extract_particles -> statextract -> CalculateStats. pad is applied on top of bbox_expansion, so either, both, or neither can be used. Clamped to image bounds the same way. --- pyopia/process.py | 92 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 83 insertions(+), 9 deletions(-) diff --git a/pyopia/process.py b/pyopia/process.py index eeee21a7..db0695d8 100644 --- a/pyopia/process.py +++ b/pyopia/process.py @@ -183,7 +183,7 @@ def get_spine_length(imbw_roi): return spine_length -def extract_roi(input_image, bbox): +def extract_roi(input_image, bbox, pad=0): '''Given a full image and bounding box, this will return the roi image from within the bounding box Parameters @@ -192,12 +192,19 @@ def extract_roi(input_image, bbox): Full image. Can be any image, such as background-corrected image bbox : array bounding box from regionprops [r1, c1, r2, c2] + pad : int, optional + Additional fixed-pixel margin to add on every side before cropping, on top of + whatever bbox was passed in (e.g. one already expanded via :func:`expand_bbox`). + Clamped to image bounds. See :func:`pad_bbox`. Defaults to 0 (no padding). Returns ------- roi : array Image cropped to region of interest ''' + if pad: + bbox = pad_bbox(bbox, input_image.shape, pad) + # refer to skimage regionprops documentation on how bbox is structured roi = input_image[bbox[0]:bbox[2], bbox[1]:bbox[3]] @@ -257,6 +264,54 @@ def expand_bbox(bbox, image_shape, fraction): ], dtype=int) +def pad_bbox(bbox, image_shape, pad): + '''Expand a bounding box by a fixed number of pixels on every side, clamped to image bounds. + + Unlike :func:`expand_bbox`, which scales with the particle's own size, this adds the + same absolute pixel margin regardless of particle size - useful for guaranteeing a + consistent border (e.g. a small non-particle margin for the classifier, or for visual + inspection/montage context) rather than one proportional to the particle. Can be + combined with :func:`expand_bbox`: apply that first, then pass its result here. + + Parameters + ---------- + bbox : array-like of int + [min_row, min_col, max_row, max_col], following the skimage regionprops + convention where ``max_row`` and ``max_col`` are exclusive. + image_shape : tuple + Shape of the full image. Only the first two elements (H, W) are used, + so passing ``imc.shape`` works for both 2-D and 3-D images. + pad : int + Number of pixels to add on every side. ``0`` (or ``None``) returns the bbox + unchanged. Must be non-negative. + + Returns + ------- + padded : ndarray of int, shape (4,) + Padded and clamped bounding box, integer-valued. + + Raises + ------ + ValueError + If ``pad`` is negative. + ''' + bbox_int = np.asarray(bbox, dtype=int) + if pad is None or pad == 0: + return bbox_int + if pad < 0: + raise ValueError(f'pad must be non-negative, got {pad}') + + r1, c1, r2, c2 = bbox_int + H, W = image_shape[0], image_shape[1] + + return np.array([ + max(0, r1 - pad), + max(0, c1 - pad), + min(H, r2 + pad), + min(W, c2 + pad), + ], dtype=int) + + def put_roi_in_h5(export_outputpath, HDF5File, roi, filename, i): '''Adds rois to an open hdf file if export_outputpath is not None. For use within {func}`pyopia.process.export_particles` @@ -286,7 +341,7 @@ def put_roi_in_h5(export_outputpath, HDF5File, roi, filename, i): def extract_particles(imc, timestamp, Classification, region_properties, export_outputpath=None, min_length=0, propnames=['major_axis_length', 'minor_axis_length', 'equivalent_diameter'], - bbox_expansion=0.0): + bbox_expansion=0.0, pad=0): '''Extracts the particles to build stats and export particle rois to HDF5 files Parameters @@ -314,6 +369,13 @@ def extract_particles(imc, timestamp, Classification, region_properties, bounds. Only the exported ROI image is affected; the ``minr/minc/maxr/ maxc`` columns saved in stats continue to report the un-expanded regionprops bbox so that measurements are unchanged. + pad : int, optional + Fixed-pixel margin added on every side, on top of ``bbox_expansion`` (either, + both, or neither can be used). Unlike ``bbox_expansion``, this doesn't scale + with particle size, so it's useful for guaranteeing a consistent absolute + border - e.g. a small non-particle margin for the classifier, since the + classifier is run on this same cropped ROI. Clamped to image bounds. + Defaults to 0 (no padding). See :func:`pad_bbox`. Returns ------- @@ -365,10 +427,10 @@ def extract_particles(imc, timestamp, Classification, region_properties, if ((data[i, 0] > min_length) & (data[i, 1] > 2)): nb_extractable_part += 1 - # extract the region of interest from the corrected colour image, - # optionally with the bbox expanded by `bbox_expansion` to add context + # extract the region of interest from the corrected colour image, optionally + # with the bbox expanded by `bbox_expansion` and/or a fixed `pad` margin roi_bbox = expand_bbox(bboxes[i, :], imc.shape, bbox_expansion) - roi = extract_roi(imc, roi_bbox) + roi = extract_roi(imc, roi_bbox, pad=pad) if Classification is not None: # run a prediction on what type of particle this might be @@ -490,7 +552,7 @@ def statextract(imbw, timestamp, imc, export_outputpath=None, min_length=0, propnames=['major_axis_length', 'minor_axis_length', 'equivalent_diameter'], - bbox_expansion=0.0): + bbox_expansion=0.0, pad=0): '''Extracts statistics of particles in a binary images (imbw) Parameters @@ -519,6 +581,9 @@ def statextract(imbw, timestamp, imc, bbox_expansion : float, optional Fractional expansion of bounding boxes when cropping ROI images for export. See :func:`extract_particles`. Defaults to 0.0 (no expansion). + pad : int, optional + Fixed-pixel margin added on every side, on top of ``bbox_expansion``. + See :func:`extract_particles`. Defaults to 0 (no padding). Returns ------- @@ -547,7 +612,7 @@ def statextract(imbw, timestamp, imc, stats = extract_particles(imc, timestamp, Classification, region_properties, export_outputpath=export_outputpath, min_length=min_length, propnames=propnames, - bbox_expansion=bbox_expansion) + bbox_expansion=bbox_expansion, pad=pad) return stats, saturation @@ -632,6 +697,13 @@ class CalculateStats(): width and height (5% on each side, clamped to image bounds). The regionprops measurements and the ``minr/minc/maxr/maxc`` columns written into stats are unaffected. Defaults to ``0.0`` (no expansion). + pad: (int, optional) + Fixed-pixel margin added on every side of each ROI crop, on top of + ``bbox_expansion`` - either, both, or neither can be used. Unlike + ``bbox_expansion``, this doesn't scale with particle size, so it's useful + for guaranteeing a consistent absolute border, e.g. a small non-particle + margin for the classifier (which is run on this same cropped ROI). + Clamped to image bounds. Defaults to ``0`` (no padding). Configure from a TOML pipeline as:: @@ -639,6 +711,7 @@ class CalculateStats(): pipeline_class = "pyopia.process.CalculateStats" export_outputpath = "/path/to/rois" bbox_expansion = 0.1 + pad = 2 Returns ------- @@ -654,7 +727,7 @@ def __init__(self, min_length=0, propnames=['major_axis_length', 'minor_axis_length', 'equivalent_diameter'], roi_source='im_corrected', - bbox_expansion=0.0): + bbox_expansion=0.0, pad=0): self.max_coverage = max_coverage self.max_particles = max_particles @@ -663,6 +736,7 @@ def __init__(self, self.propnames = propnames self.roi_source = roi_source self.bbox_expansion = bbox_expansion + self.pad = pad self.calc_image_stats = CalculateImageStats() @@ -675,7 +749,7 @@ def __call__(self, data): export_outputpath=self.export_outputpath, min_length=self.min_length, propnames=self.propnames, - bbox_expansion=self.bbox_expansion) + bbox_expansion=self.bbox_expansion, pad=self.pad) stats['timestamp'] = data['timestamp'] stats['saturation'] = saturation From 3f91d607fb8937a72045aa3e17653415053ef4e0 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 13 Mar 2026 17:17:39 +0000 Subject: [PATCH 24/29] Add ImageToDisc pipeline step for saving processed images to file Adds a new pipeline-compatible class ImageToDisc to pyopia.io that saves processed pipeline images (raw, background, corrected, segmented, etc.) to an output folder. Supports configurable image keys, scale factor for downsizing, collage mode (all images in one file vs separate files), and image format selection. Co-authored-by: nepstad <152277+nepstad@users.noreply.github.com> --- pyopia/io.py | 174 ++++++++++++++++++++++++++++++++++++++++ pyopia/tests/test_io.py | 149 +++++++++++++++++++++++++++++++++- 2 files changed, 322 insertions(+), 1 deletion(-) diff --git a/pyopia/io.py b/pyopia/io.py index 92522b0f..ec4aae22 100644 --- a/pyopia/io.py +++ b/pyopia/io.py @@ -661,6 +661,180 @@ def __call__(self, data): return data +class ImageToDisc: + '''Pipeline-compatible class for saving processed images to disc. + + Saves specified pipeline images (e.g. raw, background corrected, segmented) + to an output folder. Can optionally downscale images and/or combine them + into a single collage per input image. + + Required keys in :class:`pyopia.pipeline.Data`: + - :attr:`pyopia.pipeline.Data.filename` + - At least one of the image keys specified in ``image_keys`` + + Parameters + ---------- + output_folder : str + Path to the output folder where images will be saved. + Created automatically if it does not exist. + image_keys : list of str, optional + List of pipeline data keys to save as images. + Defaults to ``['imraw', 'imbg', 'im_corrected', 'imbw']``. + Keys that are not present in the pipeline data for a given image + will be silently skipped. + scale_factor : float, optional + Factor to downscale images before saving. E.g. 0.5 halves the + resolution. Defaults to 1.0 (no scaling). + collage : bool, optional + If True, all specified images are combined into a single collage + image (one row per image key) rather than saved as separate files. + Defaults to False. + image_format : str, optional + Image file format extension. Defaults to ``'png'``. + + Returns + ------- + data : :class:`pyopia.pipeline.Data` + Unmodified pipeline data. + + Examples + -------- + Save background-corrected and segmented images to a folder: + + .. code-block:: toml + + [steps.saveimages] + pipeline_class = 'pyopia.io.ImageToDisc' + output_folder = 'processed_images' + image_keys = ['imraw', 'im_corrected', 'imbw'] + scale_factor = 0.5 + + Save a collage of all processing stages: + + .. code-block:: toml + + [steps.saveimages] + pipeline_class = 'pyopia.io.ImageToDisc' + output_folder = 'processed_images' + collage = true + ''' + + def __init__(self, output_folder='processed_images', + image_keys=None, + scale_factor=1.0, + collage=False, + image_format='png'): + if image_keys is None: + image_keys = ['imraw', 'imbg', 'im_corrected', 'imbw'] + self.output_folder = output_folder + self.image_keys = image_keys + self.scale_factor = scale_factor + self.collage = collage + self.image_format = image_format + + def __call__(self, data): + import matplotlib.pyplot as plt + from skimage.transform import rescale + + os.makedirs(self.output_folder, exist_ok=True) + + source_filename = data.get('filename', 'unknown') + base_name = Path(source_filename).stem + + # Collect available images + available_images = [] + for key in self.image_keys: + if key in data and data[key] is not None: + img = np.array(data[key], dtype=np.float64) + available_images.append((key, img)) + + if not available_images: + logger.warning('ImageToDisc: No images found in pipeline data for the specified keys.') + return data + + if self.collage: + self._save_collage(available_images, base_name, plt) + else: + self._save_separate(available_images, base_name, plt, rescale) + + return data + + def _prepare_image(self, img, rescale_func): + '''Prepare an image for saving: handle scaling and normalisation. + + Parameters + ---------- + img : ndarray + Image array (2D or 3D, float or bool). + rescale_func : callable + skimage.transform.rescale function. + + Returns + ------- + img : ndarray + Prepared image array clipped to [0, 1]. + ''' + if self.scale_factor != 1.0: + multichannel = img.ndim == 3 + img = rescale_func(img, self.scale_factor, + channel_axis=2 if multichannel else None, + anti_aliasing=True, + preserve_range=True) + # Convert boolean (binary) images to float for saving + if img.dtype == bool: + img = img.astype(np.float64) + # Clip to valid range for plt.imsave + img = np.clip(img, 0, 1) + return img + + def _save_separate(self, available_images, base_name, plt, rescale_func): + '''Save each image key as a separate file.''' + for key, img in available_images: + img = self._prepare_image(img, rescale_func) + out_path = Path(self.output_folder) / f'{base_name}_{key}.{self.image_format}' + if img.ndim == 2: + plt.imsave(str(out_path), img, cmap='gray') + else: + plt.imsave(str(out_path), img) + logger.debug(f'ImageToDisc: Saved {key} to {out_path}') + + def _save_collage(self, available_images, base_name, plt): + '''Save all images combined into a single collage image.''' + from skimage.transform import resize + + # Determine target width (use first image width, after scale) + first_img = available_images[0][1] + if first_img.ndim == 2: + target_h, target_w = first_img.shape + else: + target_h, target_w = first_img.shape[:2] + + if self.scale_factor != 1.0: + target_h = int(target_h * self.scale_factor) + target_w = int(target_w * self.scale_factor) + + # Resize all images to the same dimensions and convert to 3-channel + panels = [] + for key, img in available_images: + if img.dtype == bool: + img = img.astype(np.float64) + + if img.ndim == 2: + img = resize(img, (target_h, target_w), anti_aliasing=True, preserve_range=True) + # Convert grayscale to RGB for stacking + img = np.stack([img, img, img], axis=-1) + else: + img = resize(img, (target_h, target_w, img.shape[2]), anti_aliasing=True, preserve_range=True) + + img = np.clip(img, 0, 1) + panels.append(img) + + collage = np.concatenate(panels, axis=0) + out_path = Path(self.output_folder) / f'{base_name}_collage.{self.image_format}' + plt.imsave(str(out_path), collage) + logger.debug(f'ImageToDisc: Saved collage to {out_path}') + + def load_toml(toml_file): """Load a TOML settings file from file diff --git a/pyopia/tests/test_io.py b/pyopia/tests/test_io.py index 181e2bfe..8dd9701f 100644 --- a/pyopia/tests/test_io.py +++ b/pyopia/tests/test_io.py @@ -1,8 +1,9 @@ import os from pathlib import Path import pytest +import numpy as np import pandas as pd -from pyopia.io import write_stats, load_stats, get_cf_metadata_spec +from pyopia.io import write_stats, load_stats, get_cf_metadata_spec, ImageToDisc from pyopia.instrument.silcam import generate_config @@ -64,5 +65,151 @@ def test_write_and_load_stats(tmp_path: Path): assert "PyOPIA_version" in loaded_stats.attrs +def test_image_to_disc_separate(tmp_path: Path): + """Test ImageToDisc saves separate images for each pipeline key.""" + output_folder = str(tmp_path / "output_images") + + saver = ImageToDisc( + output_folder=output_folder, + image_keys=['imraw', 'im_corrected', 'imbw'], + scale_factor=1.0, + collage=False, + ) + + # Create fake pipeline data with a mix of image types + data = { + 'filename': '/fake/path/test_image.silc', + 'imraw': np.random.rand(100, 120, 3), + 'im_corrected': np.random.rand(100, 120, 3), + 'imbw': np.random.rand(100, 120) > 0.5, # boolean segmentation mask + } + + result = saver(data) + + # Check data is returned unmodified + assert result is data + + # Check output files exist + assert os.path.isfile(os.path.join(output_folder, 'test_image_imraw.png')) + assert os.path.isfile(os.path.join(output_folder, 'test_image_im_corrected.png')) + assert os.path.isfile(os.path.join(output_folder, 'test_image_imbw.png')) + + +def test_image_to_disc_collage(tmp_path: Path): + """Test ImageToDisc saves a single collage image.""" + output_folder = str(tmp_path / "output_collage") + + saver = ImageToDisc( + output_folder=output_folder, + image_keys=['imraw', 'im_corrected'], + collage=True, + ) + + data = { + 'filename': '/fake/path/sample.silc', + 'imraw': np.random.rand(80, 100, 3), + 'im_corrected': np.random.rand(80, 100, 3), + } + + result = saver(data) + + assert result is data + assert os.path.isfile(os.path.join(output_folder, 'sample_collage.png')) + + +def test_image_to_disc_scale_factor(tmp_path: Path): + """Test ImageToDisc applies scale factor when saving separate images.""" + output_folder = str(tmp_path / "output_scaled") + + saver = ImageToDisc( + output_folder=output_folder, + image_keys=['imraw'], + scale_factor=0.5, + collage=False, + ) + + data = { + 'filename': '/fake/path/scaled_test.silc', + 'imraw': np.random.rand(100, 120, 3), + } + + saver(data) + + out_file = os.path.join(output_folder, 'scaled_test_imraw.png') + assert os.path.isfile(out_file) + + # Load the saved image and verify it was scaled down + import matplotlib.pyplot as plt + saved_img = plt.imread(out_file) + assert saved_img.shape[0] == 50 + assert saved_img.shape[1] == 60 + + +def test_image_to_disc_missing_keys(tmp_path: Path): + """Test ImageToDisc gracefully skips missing keys.""" + output_folder = str(tmp_path / "output_missing") + + saver = ImageToDisc( + output_folder=output_folder, + image_keys=['imraw', 'imbg', 'nonexistent_key'], + ) + + data = { + 'filename': '/fake/path/missing_test.silc', + 'imraw': np.random.rand(50, 60, 3), + # 'imbg' and 'nonexistent_key' intentionally missing + } + + result = saver(data) + + assert result is data + # Only imraw should be saved + assert os.path.isfile(os.path.join(output_folder, 'missing_test_imraw.png')) + assert not os.path.isfile(os.path.join(output_folder, 'missing_test_imbg.png')) + assert not os.path.isfile(os.path.join(output_folder, 'missing_test_nonexistent_key.png')) + + +def test_image_to_disc_2d_grayscale(tmp_path: Path): + """Test ImageToDisc handles 2D grayscale images.""" + output_folder = str(tmp_path / "output_gray") + + saver = ImageToDisc( + output_folder=output_folder, + image_keys=['im_corrected'], + scale_factor=0.5, + ) + + data = { + 'filename': '/fake/path/gray_test.png', + 'im_corrected': np.random.rand(100, 120), + } + + saver(data) + + assert os.path.isfile(os.path.join(output_folder, 'gray_test_im_corrected.png')) + + +def test_image_to_disc_collage_mixed_types(tmp_path: Path): + """Test collage with a mix of 2D (binary) and 3D (RGB) images.""" + output_folder = str(tmp_path / "output_collage_mixed") + + saver = ImageToDisc( + output_folder=output_folder, + image_keys=['imraw', 'imbw'], + collage=True, + scale_factor=0.5, + ) + + data = { + 'filename': '/fake/path/mixed_test.silc', + 'imraw': np.random.rand(80, 100, 3), + 'imbw': np.random.rand(80, 100) > 0.5, + } + + saver(data) + + assert os.path.isfile(os.path.join(output_folder, 'mixed_test_collage.png')) + + if __name__ == "__main__": pytest.main() From 693e8352e19b3b6296fa33a563da01fe77064648 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 13 Mar 2026 17:19:29 +0000 Subject: [PATCH 25/29] Address code review: improve memory efficiency and move imports - Keep original image dtypes until conversion is needed (avoid premature float64 conversion) - Move matplotlib/skimage imports from __call__ to the specific methods that need them - Move test-level matplotlib import to module level Co-authored-by: nepstad <152277+nepstad@users.noreply.github.com> --- pyopia/io.py | 42 +++++++++++++++++++++-------------------- pyopia/tests/test_io.py | 2 +- 2 files changed, 23 insertions(+), 21 deletions(-) diff --git a/pyopia/io.py b/pyopia/io.py index ec4aae22..28756b93 100644 --- a/pyopia/io.py +++ b/pyopia/io.py @@ -733,64 +733,65 @@ def __init__(self, output_folder='processed_images', self.image_format = image_format def __call__(self, data): - import matplotlib.pyplot as plt - from skimage.transform import rescale - os.makedirs(self.output_folder, exist_ok=True) source_filename = data.get('filename', 'unknown') base_name = Path(source_filename).stem - # Collect available images + # Collect available images (keep original dtypes for efficiency) available_images = [] for key in self.image_keys: if key in data and data[key] is not None: - img = np.array(data[key], dtype=np.float64) - available_images.append((key, img)) + available_images.append((key, np.asarray(data[key]))) if not available_images: logger.warning('ImageToDisc: No images found in pipeline data for the specified keys.') return data if self.collage: - self._save_collage(available_images, base_name, plt) + self._save_collage(available_images, base_name) else: - self._save_separate(available_images, base_name, plt, rescale) + self._save_separate(available_images, base_name) return data - def _prepare_image(self, img, rescale_func): + def _prepare_image(self, img): '''Prepare an image for saving: handle scaling and normalisation. Parameters ---------- img : ndarray Image array (2D or 3D, float or bool). - rescale_func : callable - skimage.transform.rescale function. Returns ------- img : ndarray Prepared image array clipped to [0, 1]. ''' - if self.scale_factor != 1.0: - multichannel = img.ndim == 3 - img = rescale_func(img, self.scale_factor, - channel_axis=2 if multichannel else None, - anti_aliasing=True, - preserve_range=True) + from skimage.transform import rescale + # Convert boolean (binary) images to float for saving if img.dtype == bool: img = img.astype(np.float64) + else: + img = img.astype(np.float64) + + if self.scale_factor != 1.0: + multichannel = img.ndim == 3 + img = rescale(img, self.scale_factor, + channel_axis=2 if multichannel else None, + anti_aliasing=True, + preserve_range=True) # Clip to valid range for plt.imsave img = np.clip(img, 0, 1) return img - def _save_separate(self, available_images, base_name, plt, rescale_func): + def _save_separate(self, available_images, base_name): '''Save each image key as a separate file.''' + import matplotlib.pyplot as plt + for key, img in available_images: - img = self._prepare_image(img, rescale_func) + img = self._prepare_image(img) out_path = Path(self.output_folder) / f'{base_name}_{key}.{self.image_format}' if img.ndim == 2: plt.imsave(str(out_path), img, cmap='gray') @@ -798,8 +799,9 @@ def _save_separate(self, available_images, base_name, plt, rescale_func): plt.imsave(str(out_path), img) logger.debug(f'ImageToDisc: Saved {key} to {out_path}') - def _save_collage(self, available_images, base_name, plt): + def _save_collage(self, available_images, base_name): '''Save all images combined into a single collage image.''' + import matplotlib.pyplot as plt from skimage.transform import resize # Determine target width (use first image width, after scale) diff --git a/pyopia/tests/test_io.py b/pyopia/tests/test_io.py index 8dd9701f..6d8f01e6 100644 --- a/pyopia/tests/test_io.py +++ b/pyopia/tests/test_io.py @@ -2,6 +2,7 @@ from pathlib import Path import pytest import numpy as np +import matplotlib.pyplot as plt import pandas as pd from pyopia.io import write_stats, load_stats, get_cf_metadata_spec, ImageToDisc from pyopia.instrument.silcam import generate_config @@ -139,7 +140,6 @@ def test_image_to_disc_scale_factor(tmp_path: Path): assert os.path.isfile(out_file) # Load the saved image and verify it was scaled down - import matplotlib.pyplot as plt saved_img = plt.imread(out_file) assert saved_img.shape[0] == 50 assert saved_img.shape[1] == 60 From d73bde01844005970cf860aabfd0a8ef9db9684c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 13 Mar 2026 17:21:15 +0000 Subject: [PATCH 26/29] Clean up redundant if/else in _prepare_image Co-authored-by: nepstad <152277+nepstad@users.noreply.github.com> --- pyopia/io.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/pyopia/io.py b/pyopia/io.py index 28756b93..f1a23aa4 100644 --- a/pyopia/io.py +++ b/pyopia/io.py @@ -770,11 +770,8 @@ def _prepare_image(self, img): ''' from skimage.transform import rescale - # Convert boolean (binary) images to float for saving - if img.dtype == bool: - img = img.astype(np.float64) - else: - img = img.astype(np.float64) + # Convert to float64 for saving + img = img.astype(np.float64) if self.scale_factor != 1.0: multichannel = img.ndim == 3 From d099aa04796f2e5ed25886eeed4365e727093758 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 13 Mar 2026 17:54:18 +0000 Subject: [PATCH 27/29] Add documentation for ImageToDisc with instructive usage examples Adds documentation in two locations: - toml_config.ipynb: Comprehensive section with configuration options table, examples for separate images and collage mode, and pipeline placement guidance - processing_raw_data.ipynb: Practical section explaining when and how to use ImageToDisc for quality control and visual inspection Co-authored-by: nepstad <152277+nepstad@users.noreply.github.com> --- docs/notebooks/processing_raw_data.ipynb | 28 +++++++++ docs/notebooks/toml_config.ipynb | 79 ++++++++++++++++++++++++ 2 files changed, 107 insertions(+) diff --git a/docs/notebooks/processing_raw_data.ipynb b/docs/notebooks/processing_raw_data.ipynb index 489f38be..b9094211 100644 --- a/docs/notebooks/processing_raw_data.ipynb +++ b/docs/notebooks/processing_raw_data.ipynb @@ -102,6 +102,34 @@ "```" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## (Optional) Save intermediate images to disc\n", + "\n", + "During processing, it can be very helpful to save intermediate images for visual quality control or for sharing with collaborators.\n", + "For example, you may want to inspect the background-corrected images to ensure the correction is working properly.\n", + "\n", + "To do this, add a `[steps.saveimages]` step to your `config.toml` file. This uses {class}`pyopia.io.ImageToDisc`, which saves one or more pipeline images to a specified output folder.\n", + "\n", + "Here is an example that saves the raw, background, and corrected images at half resolution:\n", + "\n", + "```toml\n", + " [steps.saveimages]\n", + " pipeline_class = 'pyopia.io.ImageToDisc'\n", + " output_folder = 'processed_images'\n", + " image_keys = ['imraw', 'imbg', 'im_corrected']\n", + " scale_factor = 0.5\n", + "```\n", + "\n", + "Place this step **after** the steps that produce the images you want to save (e.g. after `correctbackground` for background-corrected images, or after `segmentation` to also include the binary segmentation mask `imbw`).\n", + "\n", + "You can also save a single **collage** image per input file, by setting `collage = true`.\n", + "\n", + "See {ref}`toml-config` for full configuration details and more examples." + ] + }, { "cell_type": "markdown", "metadata": {}, diff --git a/docs/notebooks/toml_config.ipynb b/docs/notebooks/toml_config.ipynb index 82cd49ef..373bb65b 100644 --- a/docs/notebooks/toml_config.ipynb +++ b/docs/notebooks/toml_config.ipynb @@ -199,6 +199,85 @@ "\n", "```" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Saving processed images to disc\n", + "\n", + "It is often useful to save intermediate pipeline images to disc for visual inspection, quality control,\n", + "or sharing with collaborators. For example, you may want to visually check that the background correction\n", + "is working correctly, or provide corrected images for manual review.\n", + "\n", + "The {class}`pyopia.io.ImageToDisc` pipeline step enables this. It can be inserted at any point in the pipeline\n", + "to save the current state of one or more images from the pipeline data. Common use cases include:\n", + "\n", + "- Saving the **background-corrected image** (`im_corrected`) for visual quality control\n", + "- Saving the **raw image** (`imraw`) and **background image** (`imbg`) alongside the corrected image for comparison\n", + "- Saving the **segmented image** (`imbw`) to verify that particle detection is working as expected\n", + "- Creating a **collage** of all processing stages for a quick overview of each image\n", + "\n", + "### Configuration options\n", + "\n", + "| Option | Description | Default |\n", + "| --- | --- | --- |\n", + "| `output_folder` | Path to folder where images will be saved (created if it does not exist) | `'processed_images'` |\n", + "| `image_keys` | List of pipeline data keys to save | `['imraw', 'imbg', 'im_corrected', 'imbw']` |\n", + "| `scale_factor` | Factor to downscale images before saving (e.g. `0.5` halves the resolution) | `1.0` |\n", + "| `collage` | If `true`, combine all images into a single vertically-stacked collage per input image | `false` |\n", + "| `image_format` | Output image format | `'png'` |\n", + "\n", + "### Example: Save separate images at half resolution\n", + "\n", + "Add this step after background correction (or after segmentation, depending on which images you want to capture):\n", + "\n", + "```toml\n", + " [steps.saveimages]\n", + " pipeline_class = 'pyopia.io.ImageToDisc'\n", + " output_folder = 'processed_images'\n", + " image_keys = ['imraw', 'imbg', 'im_corrected']\n", + " scale_factor = 0.5\n", + "```\n", + "\n", + "This will create one PNG file per image key, per input image, in the `processed_images/` folder.\n", + "For example, processing an image called `image_001.silc` would produce:\n", + "```\n", + "processed_images/\n", + "├── image_001_imraw.png\n", + "├── image_001_imbg.png\n", + "└── image_001_im_corrected.png\n", + "```\n", + "\n", + "### Example: Save a collage of all processing stages\n", + "\n", + "To get a single overview image showing all stages of processing for each input image:\n", + "\n", + "```toml\n", + " [steps.saveimages]\n", + " pipeline_class = 'pyopia.io.ImageToDisc'\n", + " output_folder = 'processed_images'\n", + " image_keys = ['imraw', 'im_corrected', 'imbw']\n", + " collage = true\n", + " scale_factor = 0.5\n", + "```\n", + "\n", + "This produces a single `image_001_collage.png` per input image, with the raw, corrected and segmented\n", + "images stacked vertically.\n", + "\n", + "### Placement in the pipeline\n", + "\n", + "The `saveimages` step should be placed **after** the processing steps that produce the images you want to save.\n", + "For instance, to save background-corrected images, place it after `correctbackground`.\n", + "To also include the segmented image (`imbw`), place it after the `segmentation` step.\n", + "You can also include multiple `saveimages` steps at different points in the pipeline if needed, e.g.\n", + "one right after background correction and another after segmentation.\n", + "\n", + "```{note}\n", + "Images that are not yet available in the pipeline data at the point where `saveimages` runs will be\n", + "silently skipped. So it is safe to request keys that may not exist for all configurations.\n", + "```" + ] } ], "metadata": { From efcd52d19679da4bca37b42131dd59556c11dd9c Mon Sep 17 00:00:00 2001 From: Alex Nimmo Smith Date: Thu, 20 Aug 2026 23:18:45 +0100 Subject: [PATCH 28/29] bump version --- pyopia/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyopia/__init__.py b/pyopia/__init__.py index f7487666..a6b62ff3 100644 --- a/pyopia/__init__.py +++ b/pyopia/__init__.py @@ -1 +1 @@ -__version__ = "2.16.16" +__version__ = "2.17.0" From 8c324a3f40d7353f257811d114118a70c3504af3 Mon Sep 17 00:00:00 2001 From: Alex Nimmo Smith Date: Thu, 20 Aug 2026 23:39:47 +0100 Subject: [PATCH 29/29] Bound the realtime processing queue, dropping oldest images under backlog Reimplements #390 (open 3+ weeks with no response) with the configurability suggested in review there: replaces the unbounded queue.Queue with a deque(maxlen=queue_size), so when processing falls behind acquisition, old images get dropped instead of an ever-growing backlog. The worker now pops from the right (most recently queued) so a backlog is worked off newest-first, staying close to realtime rather than grinding through stale images. queue_size defaults to 10 (matching #390's original fixed value) and is configurable via `pyopia process-realtime --queue-size`, the same way --watch-folder already is - the right value depends on acquisition rate vs. processing throughput, which is hardware/instrument-dependent. --- pyopia/cli.py | 10 +++++++-- pyopia/realtime.py | 32 ++++++++++++++++---------- pyopia/tests/test_cli.py | 8 ++++--- pyopia/tests/test_realtime.py | 42 ++++++++++++++++++++++++----------- 4 files changed, 62 insertions(+), 30 deletions(-) diff --git a/pyopia/cli.py b/pyopia/cli.py index c6560131..6b246254 100644 --- a/pyopia/cli.py +++ b/pyopia/cli.py @@ -375,7 +375,7 @@ def process(config_filename: str, num_chunks: int = 1, strategy: str = "block"): @app.command() -def process_realtime(config_filename: str, watch_folder: str = None): +def process_realtime(config_filename: str, watch_folder: str = None, queue_size: int = 10): """Run a PyOPIA processing pipeline in realtime by watching a folder. Parameters @@ -386,6 +386,12 @@ def process_realtime(config_filename: str, watch_folder: str = None): watch_folder : str, optional Folder to monitor. If not provided, inferred from `general.raw_files` in config. + queue_size : int, optional + Maximum number of queued images retained when processing falls behind + acquisition; older images are dropped to stay close to realtime. A bigger + queue only delays which images get dropped - it doesn't fix an underlying + backlog where processing is slower than acquisition. Defaults to 10. + Notes ----- - Single-core only: files are processed sequentially by a single worker thread. @@ -412,7 +418,7 @@ def process_realtime(config_filename: str, watch_folder: str = None): output_datafile = pipeline_config["steps"]["output"]["output_datafile"] os.makedirs(os.path.split(output_datafile)[:-1][0], exist_ok=True) - pyopia.realtime.run_realtime(pipeline_config, watch_folder=watch_folder) + pyopia.realtime.run_realtime(pipeline_config, watch_folder=watch_folder, queue_size=queue_size) finally: stop_queue_logging(listener, log_queue) diff --git a/pyopia/realtime.py b/pyopia/realtime.py index e0671f39..e9b2ba75 100644 --- a/pyopia/realtime.py +++ b/pyopia/realtime.py @@ -3,9 +3,9 @@ import fnmatch import logging import pathlib -import queue import threading import time +from collections import deque import pandas as pd from rich import print as rich_print @@ -29,7 +29,7 @@ def _resolve_watch_settings(raw_files_pattern: str, watch_folder: str | None) -> def _enqueue_file_if_new( file_path: pathlib.Path, - file_queue: queue.Queue, + file_queue: deque, file_pattern: str, seen_files: set[str], seen_lock: threading.Lock, @@ -46,14 +46,14 @@ def _enqueue_file_if_new( return False seen_files.add(file_key) - file_queue.put(file_path) + file_queue.append(file_path) return True def _enqueue_existing_files( watch_folder: str, file_pattern: str, - file_queue: queue.Queue, + file_queue: deque, seen_files: set[str], seen_lock: threading.Lock, logger: logging.Logger, @@ -64,7 +64,7 @@ def _enqueue_existing_files( def _build_event_handler( - file_queue: queue.Queue, + file_queue: deque, file_pattern: str, seen_files: set[str], seen_lock: threading.Lock, @@ -95,7 +95,7 @@ def on_moved(self, event): def _worker_loop( stop_event: threading.Event, - file_queue: queue.Queue, + file_queue: deque, processing_pipeline: pyopia.pipeline.Pipeline, logger: logging.Logger, runtime_state: dict, @@ -103,8 +103,12 @@ def _worker_loop( ): while not stop_event.is_set(): try: - filepath = file_queue.get(timeout=1) - except queue.Empty: + # Pop from the right (most recently queued) so a backlog is worked off + # newest-first, matching the point of a bounded, oldest-dropping queue: + # stay close to "now" rather than grinding through stale images. + filepath = file_queue.pop() + except IndexError: + time.sleep(0.1) continue try: @@ -123,10 +127,9 @@ def _worker_loop( finally: with state_lock: runtime_state["current_file"] = "idle" - file_queue.task_done() -def run_realtime(pipeline_config: dict, watch_folder: str | None = None): +def run_realtime(pipeline_config: dict, watch_folder: str | None = None, queue_size: int = 10): """Run a PyOPIA processing pipeline in realtime by watching a folder. Parameters @@ -135,6 +138,11 @@ def run_realtime(pipeline_config: dict, watch_folder: str | None = None): Loaded PyOPIA pipeline config. watch_folder : str, optional Folder to monitor. If not provided, inferred from ``general.raw_files``. + queue_size : int, optional + Maximum number of queued images retained when processing falls behind + acquisition; older images are dropped to stay close to realtime. A bigger + queue only delays which images get dropped - it doesn't fix an underlying + backlog where processing is slower than acquisition. """ logger = logging.getLogger("rich") logger.info(f"PyOPIA realtime process started {pd.Timestamp.now()}") @@ -145,7 +153,7 @@ def run_realtime(pipeline_config: dict, watch_folder: str | None = None): processing_pipeline = pyopia.pipeline.Pipeline(pipeline_config) - file_queue = queue.Queue() + file_queue = deque(maxlen=queue_size) stop_event = threading.Event() seen_files: set[str] = set() seen_lock = threading.Lock() @@ -212,7 +220,7 @@ def run_realtime(pipeline_config: dict, watch_folder: str | None = None): description=( "[blue]Realtime active" f" | processed: {processed_count}" - f" | queued: {file_queue.qsize()}" + f" | queued: {len(file_queue)}" f" | current: {current_file}" ), ) diff --git a/pyopia/tests/test_cli.py b/pyopia/tests/test_cli.py index 2c6546be..f6a76c0f 100644 --- a/pyopia/tests/test_cli.py +++ b/pyopia/tests/test_cli.py @@ -213,8 +213,8 @@ def test_process_realtime_prepares_output_folder_and_calls_run_realtime(tmp_path recorded = {} monkeypatch.setattr( pyopia.cli.pyopia.realtime, 'run_realtime', - lambda pipeline_config, watch_folder=None: recorded.update( - pipeline_config=pipeline_config, watch_folder=watch_folder + lambda pipeline_config, watch_folder=None, queue_size=10: recorded.update( + pipeline_config=pipeline_config, watch_folder=watch_folder, queue_size=queue_size ) ) @@ -227,12 +227,14 @@ def test_process_realtime_prepares_output_folder_and_calls_run_realtime(tmp_path }, fh) result = invoke_in(tmp_path, [ - 'process-realtime', str(config_filename), '--watch-folder', str(tmp_path / 'images') + 'process-realtime', str(config_filename), '--watch-folder', str(tmp_path / 'images'), + '--queue-size', '25', ]) assert result.exit_code == 0, result.output assert (tmp_path / 'proc').is_dir() assert recorded['watch_folder'] == str(tmp_path / 'images') + assert recorded['queue_size'] == 25 assert recorded['pipeline_config']['steps']['output']['output_datafile'] == output_datafile diff --git a/pyopia/tests/test_realtime.py b/pyopia/tests/test_realtime.py index 769a4018..5cc54d1a 100644 --- a/pyopia/tests/test_realtime.py +++ b/pyopia/tests/test_realtime.py @@ -1,6 +1,6 @@ import logging -import queue import threading +from collections import deque from pathlib import Path import pyopia.realtime @@ -119,7 +119,7 @@ def test_resolve_watch_settings_prefers_explicit_watch_folder(tmp_path: Path): def test_event_handler_enqueues_only_matching_moved_files(tmp_path: Path): - file_queue = queue.Queue() + file_queue = deque() logger = logging.getLogger("test") seen_files = set() seen_lock = threading.Lock() @@ -142,13 +142,13 @@ def test_event_handler_enqueues_only_matching_moved_files(tmp_path: Path): handler.on_moved(moved_event_match) handler.on_moved(moved_event_no_match) - queued = file_queue.get_nowait() + queued = file_queue.popleft() assert queued == matched - assert file_queue.empty() + assert len(file_queue) == 0 def test_event_handler_deduplicates_same_moved_file(tmp_path: Path): - file_queue = queue.Queue() + file_queue = deque() logger = logging.getLogger("test") seen_files = set() seen_lock = threading.Lock() @@ -167,13 +167,13 @@ def test_event_handler_deduplicates_same_moved_file(tmp_path: Path): handler.on_moved(moved_event) handler.on_moved(moved_event) - queued = file_queue.get_nowait() + queued = file_queue.popleft() assert queued == matched - assert file_queue.empty() + assert len(file_queue) == 0 def test_enqueue_existing_files_matches_pattern_and_deduplicates(tmp_path: Path): - file_queue = queue.Queue() + file_queue = deque() seen_files = set() seen_lock = threading.Lock() logger = logging.getLogger("test") @@ -200,13 +200,29 @@ def test_enqueue_existing_files_matches_pattern_and_deduplicates(tmp_path: Path) logger, ) - queued = file_queue.get_nowait() + queued = file_queue.popleft() assert queued == matched - assert file_queue.empty() + assert len(file_queue) == 0 + + +def test_enqueue_drops_oldest_once_queue_size_is_exceeded(tmp_path: Path): + file_queue = deque(maxlen=2) + seen_files = set() + seen_lock = threading.Lock() + + files = [] + for i in range(3): + f = tmp_path / f"image_{i}.silc" + f.write_text("ok") + files.append(f) + pyopia.realtime._enqueue_file_if_new(f, file_queue, "*.silc", seen_files, seen_lock) + + assert len(file_queue) == 2 + assert list(file_queue) == files[1:] def test_integration_existing_then_moved_files_processed_once(tmp_path: Path): - file_queue = queue.Queue() + file_queue = deque() seen_files = set() seen_lock = threading.Lock() logger = logging.getLogger("test") @@ -272,8 +288,8 @@ def run(self, filename): image_file.write_text("content") stop_event = threading.Event() - file_queue = queue.Queue() - file_queue.put(image_file) + file_queue = deque() + file_queue.append(image_file) pipeline = DummyPipeline() runtime_state = {"processed_count": 0, "current_file": "idle"} state_lock = threading.Lock()