From 72f113b260a6e41542d134f679125999c6058721 Mon Sep 17 00:00:00 2001 From: tomsail Date: Wed, 8 Oct 2025 10:15:19 +0200 Subject: [PATCH 01/12] feat: support for chunked arrays --- tests/io_test.py | 44 ++++++++++++++++++++++++++++++++ xarray_selafin/xarray_backend.py | 5 ++++ 2 files changed, 49 insertions(+) diff --git a/tests/io_test.py b/tests/io_test.py index 126326b..78ae949 100644 --- a/tests/io_test.py +++ b/tests/io_test.py @@ -28,6 +28,14 @@ ], ) +NODE_TIME = pytest.mark.parametrize( + "dim_test", + [ + pytest.param("node", id="node"), + pytest.param("time", id="time"), + ], +) + def write_netcdf(ds, nc_out): # Remove dict and multi-dimensional arrays not supported in netCDF @@ -174,6 +182,42 @@ def test_dim(slf_in): repr(ds) +@DIMS +@NODE_TIME +def test_dask_mean_consistency(slf_in, dim_test): + def analyze_block(ds_block: xr.Dataset) -> xr.Dataset: + return ds_block.mean(dim=dim_test) + + # --- Reference computation without Dask --- + ds_ref = xr.open_dataset(slf_in, chunks=None) + ref = ds_ref.mean(dim=dim_test) + + # --- Dask-based computation --- + with xr.open_dataset(slf_in) as ds: + ds = ds.chunk({"time": -1, "node": 50}) + result = xr.map_blocks(analyze_block, ds).compute() + computed = result.compute() + + # --- Structural checks --- + assert set(computed.data_vars) == set(ref.data_vars) + for var in ref.data_vars: + da_ref = ref[var] + da_comp = computed[var] + # shapes should match (node dim gone) + assert da_ref.shape == da_comp.shape, f"Shape mismatch for {var}" + # coordinate consistency + assert all(c in da_comp.coords for c in da_ref.coords), f"Missing coords in {var}" + + # # This check won't work because local mean != global mean >> find another type of assertion + # np.testing.assert_allclose( + # da_ref.values, + # da_comp.values, + # rtol=1e-6, + # atol=1e-8, + # err_msg=f"Mismatch in mean(node) for {var}" + # ) + + @BUMP def test_eager_vs_lazy(slf_in): with xr.load_dataset(slf_in, engine="selafin") as ds_eager: diff --git a/xarray_selafin/xarray_backend.py b/xarray_selafin/xarray_backend.py index dd50323..6e5ddf6 100644 --- a/xarray_selafin/xarray_backend.py +++ b/xarray_selafin/xarray_backend.py @@ -199,6 +199,11 @@ def _raw_indexing_method(self, key): if not isinstance(key, tuple): raise NotImplementedError("SELAFIN access must use tuple indexing") + # Pad key with slices to match array dimensions + ndim = len(self.shape) + if len(key) < ndim: + key = key + (slice(None),) * (ndim - len(key)) + # --- Parse keys if ndim == 3: # 3D file From 1d465f787d8542548228b09b3f5436261c0f3552 Mon Sep 17 00:00:00 2001 From: tomsail Date: Wed, 8 Oct 2025 10:22:27 +0200 Subject: [PATCH 02/12] add dask in dev dependencies --- .github/workflows/run_tests.yml | 2 +- poetry.lock | 1260 ++++++++++++++++------------- pyproject.toml | 3 +- requirements/requirements-dev.txt | 976 ++++++++++++---------- requirements/requirements.txt | 217 +++-- 5 files changed, 1385 insertions(+), 1073 deletions(-) diff --git a/.github/workflows/run_tests.yml b/.github/workflows/run_tests.yml index cc80ce8..678d74b 100644 --- a/.github/workflows/run_tests.yml +++ b/.github/workflows/run_tests.yml @@ -28,7 +28,7 @@ jobs: fail-fast: false matrix: os: ["ubuntu-latest"] - python: ["3.9", "3.10", "3.11"] + python: ["3.10", "3.11", "3.12", "3.13"] include: - os: "macos-latest" python: "3.10" diff --git a/poetry.lock b/poetry.lock index b472517..ff665f1 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.0 and should not be changed by hand. [[package]] name = "asciitree" @@ -10,75 +10,60 @@ files = [ {file = "asciitree-0.3.3.tar.gz", hash = "sha256:4aa4b9b649f85e3fcb343363d97564aa1fb62e249677f2e18a96765145cc0f6e"}, ] -[[package]] -name = "beautifulsoup4" -version = "4.12.3" -description = "Screen-scraping library" -optional = false -python-versions = ">=3.6.0" -files = [ - {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, - {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, -] - -[package.dependencies] -soupsieve = ">1.2" - -[package.extras] -cchardet = ["cchardet"] -chardet = ["chardet"] -charset-normalizer = ["charset-normalizer"] -html5lib = ["html5lib"] -lxml = ["lxml"] - [[package]] name = "certifi" -version = "2024.6.2" +version = "2025.10.5" description = "Python package for providing Mozilla's CA Bundle." optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"}, - {file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"}, + {file = "certifi-2025.10.5-py3-none-any.whl", hash = "sha256:0f212c2744a9bb6de0c56639a6f68afe01ecd92d91f14ae897c4fe7bbeeef0de"}, + {file = "certifi-2025.10.5.tar.gz", hash = "sha256:47c09d31ccf2acf0be3f701ea53595ee7e0b8fa08801c6624be771df09ae7b43"}, ] [[package]] name = "cftime" -version = "1.6.4" +version = "1.6.4.post1" description = "Time-handling functionality from netcdf4-python" optional = false python-versions = ">=3.8" files = [ - {file = "cftime-1.6.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ee70074df4bae0d9ee98f201cf5f11fd302791cf1cdeb73c34f685d6b632e17d"}, - {file = "cftime-1.6.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e5456fd58d4cc6b8d7b4932b749617ee142b62a52bc5d8e3c282ce69ce3a20ba"}, - {file = "cftime-1.6.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1289e08617be350a6b26c6e4352a0cb088625ac33d25e95110df549c26d6ab8e"}, - {file = "cftime-1.6.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18b132d9225b4a109929866200846c72302316db9069e2de3ec8d8ec377f567f"}, - {file = "cftime-1.6.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ca1a264570e68fbb611bba251641b8efd0cf88c0ad2dcab5fa784df264232b75"}, - {file = "cftime-1.6.4-cp310-cp310-win_amd64.whl", hash = "sha256:6fc82928cbf477bebf233f41914e64bff7b9e894c7f0c34170784a48250f8da7"}, - {file = "cftime-1.6.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c1558d9b477bd29626cd8bfc89e736635f72887d1a993e2834ab579bba7abb8c"}, - {file = "cftime-1.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:03494e7b66a2fbb6b04e364ab67185130dee0ced660abac5c1559070571d143d"}, - {file = "cftime-1.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4dcb2a01d4e614437582af33b36db4fb441b7666758482864827a1f037d2b639"}, - {file = "cftime-1.6.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b47bf25195fb3889bbae34df0e80957eb69c48f66902f5d538c7a8ec34253f6"}, - {file = "cftime-1.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d4f2cc0d5c6ffba9c5b0fd1ecd0c7c1c426d0be7b8de1480e2a9fb857c1905e9"}, - {file = "cftime-1.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:76b8f1e5d1e424accdf760a43e0a1793a7b640bab83cb067273d5c9dbb336c44"}, - {file = "cftime-1.6.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c349a91fa7ac9ec50118b04a8746bdea967bd2fc525d87c776003040b8d3392"}, - {file = "cftime-1.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:588d073400798adc24ece759cd1cb24ef730f55d1f70e31a898e7686f9d763d8"}, - {file = "cftime-1.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e07b91b488570573bbeb6f815656a8974d13d15b2279c82de2927f4f692bbcd"}, - {file = "cftime-1.6.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f92f2e405eeda47b30ab6231d8b7d136a55f21034d394f93ade322d356948654"}, - {file = "cftime-1.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:567574df94d0de1101bb5da76e7fbc6eabfddeeb2eb8cf83286b3599a136bbf7"}, - {file = "cftime-1.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:5b5ad7559a16bedadb66af8e417b6805f758acb57aa38d2730844dfc63a1e667"}, - {file = "cftime-1.6.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c072fe9e09925af66a9473edf5752ca1890ba752e7c1935d1f0245ad48f0977c"}, - {file = "cftime-1.6.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c05a71389f53d6340cb365b60f028c08268c72401660b9ef76108dee9f1cb5b2"}, - {file = "cftime-1.6.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0edeb1cb019d8155b2513cffb96749c0d7d459370e69bdf03077e0bee214aed8"}, - {file = "cftime-1.6.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8f05d5d6bb4137f9783fa61ad330030fcea8dcc6946dea69a27774edbe480e7"}, - {file = "cftime-1.6.4-cp38-cp38-win_amd64.whl", hash = "sha256:b32ac1278a2a111b066d5a1e6e5ce6f38c4c505993a6a3130873b56f99d7b56f"}, - {file = "cftime-1.6.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c20f03e12af39534c3450bba376272803bfb850b5ce6433c839bfaa99f8d835a"}, - {file = "cftime-1.6.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:90609b3c1a31a756a68ecdbc961a4ce0b22c1620f166c8dabfa3a4c337ac8b9e"}, - {file = "cftime-1.6.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbe11ad73b2a0ddc79995da21459fc2a3fd6b1593ca73f00a60e4d81c3e230f3"}, - {file = "cftime-1.6.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25f043703e785de0bd7cd8222c0a53317e9aeb3dfc062588b05e6f3ebb007468"}, - {file = "cftime-1.6.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f9acc272df1022f24fe7dbe9de43fa5d8271985161df14549e4d8d28c90dc9ea"}, - {file = "cftime-1.6.4-cp39-cp39-win_amd64.whl", hash = "sha256:e8467b6fbf8dbfe0be8c04d61180765fdd3b9ab0fe51313a0bbf87e63634a3d8"}, - {file = "cftime-1.6.4.tar.gz", hash = "sha256:e325406193758a7ed67308deb52e727782a19e384e183378e7ff62098be0aedc"}, + {file = "cftime-1.6.4.post1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0baa9bc4850929da9f92c25329aa1f651e2d6f23e237504f337ee9e12a769f5d"}, + {file = "cftime-1.6.4.post1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6bb6b087f4b2513c37670bccd457e2a666ca489c5f2aad6e2c0e94604dc1b5b9"}, + {file = "cftime-1.6.4.post1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d9bdeb9174962c9ca00015190bfd693de6b0ec3ec0b3dbc35c693a4f48efdcc"}, + {file = "cftime-1.6.4.post1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e735cfd544878eb94d0108ff5a093bd1a332dba90f979a31a357756d609a90d5"}, + {file = "cftime-1.6.4.post1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1dcd1b140bf50da6775c56bd7ca179e84bd258b2f159b53eefd5c514b341f2bf"}, + {file = "cftime-1.6.4.post1-cp310-cp310-win_amd64.whl", hash = "sha256:e60b8f24b20753f7548f410f7510e28b941f336f84bd34e3cfd7874af6e70281"}, + {file = "cftime-1.6.4.post1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1bf7be0a0afc87628cb8c8483412aac6e48e83877004faa0936afb5bf8a877ba"}, + {file = "cftime-1.6.4.post1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0f64ca83acc4e3029f737bf3a32530ffa1fbf53124f5bee70b47548bc58671a7"}, + {file = "cftime-1.6.4.post1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7ebdfd81726b0cfb8b524309224fa952898dfa177c13d5f6af5b18cefbf497d"}, + {file = "cftime-1.6.4.post1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9ea0965a4c87739aebd84fe8eed966e5809d10065eeffd35c99c274b6f8da15"}, + {file = "cftime-1.6.4.post1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:800a18aea4e8cb2b206450397cb8a53b154798738af3cdd3c922ce1ca198b0e6"}, + {file = "cftime-1.6.4.post1-cp311-cp311-win_amd64.whl", hash = "sha256:5dcfc872f455db1f12eabe3c3ba98e93757cd60ed3526a53246e966ccde46c8a"}, + {file = "cftime-1.6.4.post1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a590f73506f4704ba5e154ef55bfbaed5e1b4ac170f3caeb8c58e4f2c619ee4e"}, + {file = "cftime-1.6.4.post1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:933cb10e1af4e362e77f513e3eb92b34a688729ddbf938bbdfa5ac20a7f44ba0"}, + {file = "cftime-1.6.4.post1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf17a1b36f62e9e73c4c9363dd811e1bbf1170f5ac26d343fb26012ccf482908"}, + {file = "cftime-1.6.4.post1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e18021f421aa26527bad8688c1acf0c85fa72730beb6efce969c316743294f2"}, + {file = "cftime-1.6.4.post1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5835b9d622f9304d1c23a35603a0f068739f428d902860f25e6e7e5a1b7cd8ea"}, + {file = "cftime-1.6.4.post1-cp312-cp312-win_amd64.whl", hash = "sha256:7f50bf0d1b664924aaee636eb2933746b942417d1f8b82ab6c1f6e8ba0da6885"}, + {file = "cftime-1.6.4.post1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5c89766ebf088c097832ea618c24ed5075331f0b7bf8e9c2d4144aefbf2f1850"}, + {file = "cftime-1.6.4.post1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7f27113f7ccd1ca32881fdcb9a4bec806a5f54ae621fc1c374f1171f3ed98ef2"}, + {file = "cftime-1.6.4.post1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da367b23eea7cf4df071c88e014a1600d6c5bbf22e3393a4af409903fa397e28"}, + {file = "cftime-1.6.4.post1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6579c5c83cdf09d73aa94c7bc34925edd93c5f2c7dd28e074f568f7e376271a0"}, + {file = "cftime-1.6.4.post1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6b731c7133d17b479ca0c3c46a7a04f96197f0a4d753f4c2284c3ff0447279b4"}, + {file = "cftime-1.6.4.post1-cp313-cp313-win_amd64.whl", hash = "sha256:d2a8c223faea7f1248ab469cc0d7795dd46f2a423789038f439fee7190bae259"}, + {file = "cftime-1.6.4.post1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9df3e2d49e548c62d1939e923800b08d2ab732d3ac8d75b857edd7982c878552"}, + {file = "cftime-1.6.4.post1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2892b7e7654142d825655f60eb66c3e1af745901890316907071d44cf9a18d8a"}, + {file = "cftime-1.6.4.post1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4ab54e6c04e68395d454cd4001188fc4ade2fe48035589ed65af80c4527ef08"}, + {file = "cftime-1.6.4.post1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:568b69fc52f406e361db62a4d7a219c6fb0ced138937144c3b3a511648dd6c50"}, + {file = "cftime-1.6.4.post1-cp38-cp38-win_amd64.whl", hash = "sha256:640911d2629f4a8f81f6bc0163a983b6b94f86d1007449b8cbfd926136cda253"}, + {file = "cftime-1.6.4.post1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:44e9f8052600803b55f8cb6bcac2be49405c21efa900ec77a9fb7f692db2f7a6"}, + {file = "cftime-1.6.4.post1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a90b6ef4a3fc65322c212a2c99cec75d1886f1ebaf0ff6189f7b327566762222"}, + {file = "cftime-1.6.4.post1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:652700130dbcca3ae36dbb5b61ff360e62aa09fabcabc42ec521091a14389901"}, + {file = "cftime-1.6.4.post1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24a7fb6cc541a027dab37fdeb695f8a2b21cd7d200be606f81b5abc38f2391e2"}, + {file = "cftime-1.6.4.post1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:fc2c0abe2dbd147e1b1e6d0f3de19a5ea8b04956acc204830fd8418066090989"}, + {file = "cftime-1.6.4.post1-cp39-cp39-win_amd64.whl", hash = "sha256:0ee2f5af8643aa1b47b7e388763a1a6e0dc05558cd2902cffb9cbcf954397648"}, + {file = "cftime-1.6.4.post1.tar.gz", hash = "sha256:50ac76cc9f10ab7bd46e44a71c51a6927051b499b4407df4f29ab13d741b942f"}, ] [package.dependencies] @@ -89,101 +74,115 @@ numpy = [ [[package]] name = "charset-normalizer" -version = "3.3.2" +version = "3.4.3" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false -python-versions = ">=3.7.0" -files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +python-versions = ">=3.7" +files = [ + {file = "charset_normalizer-3.4.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fb7f67a1bfa6e40b438170ebdc8158b78dc465a5a67b6dde178a46987b244a72"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc9370a2da1ac13f0153780040f465839e6cccb4a1e44810124b4e22483c93fe"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:07a0eae9e2787b586e129fdcbe1af6997f8d0e5abaa0bc98c0e20e124d67e601"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:74d77e25adda8581ffc1c720f1c81ca082921329452eba58b16233ab1842141c"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d0e909868420b7049dafd3a31d45125b31143eec59235311fc4c57ea26a4acd2"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c6f162aabe9a91a309510d74eeb6507fab5fff92337a15acbe77753d88d9dcf0"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4ca4c094de7771a98d7fbd67d9e5dbf1eb73efa4f744a730437d8a3a5cf994f0"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:02425242e96bcf29a49711b0ca9f37e451da7c70562bc10e8ed992a5a7a25cc0"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:78deba4d8f9590fe4dae384aeff04082510a709957e968753ff3c48399f6f92a"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-win32.whl", hash = "sha256:d79c198e27580c8e958906f803e63cddb77653731be08851c7df0b1a14a8fc0f"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-win_amd64.whl", hash = "sha256:c6e490913a46fa054e03699c70019ab869e990270597018cef1d8562132c2669"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b256ee2e749283ef3ddcff51a675ff43798d92d746d1a6e4631bf8c707d22d0b"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:13faeacfe61784e2559e690fc53fa4c5ae97c6fcedb8eb6fb8d0a15b475d2c64"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:00237675befef519d9af72169d8604a067d92755e84fe76492fef5441db05b91"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:585f3b2a80fbd26b048a0be90c5aae8f06605d3c92615911c3a2b03a8a3b796f"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e78314bdc32fa80696f72fa16dc61168fda4d6a0c014e0380f9d02f0e5d8a07"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:96b2b3d1a83ad55310de8c7b4a2d04d9277d5591f40761274856635acc5fcb30"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:939578d9d8fd4299220161fdd76e86c6a251987476f5243e8864a7844476ba14"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:fd10de089bcdcd1be95a2f73dbe6254798ec1bda9f450d5828c96f93e2536b9c"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1e8ac75d72fa3775e0b7cb7e4629cec13b7514d928d15ef8ea06bca03ef01cae"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-win32.whl", hash = "sha256:6cf8fd4c04756b6b60146d98cd8a77d0cdae0e1ca20329da2ac85eed779b6849"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:31a9a6f775f9bcd865d88ee350f0ffb0e25936a7f930ca98995c05abf1faf21c"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e28e334d3ff134e88989d90ba04b47d84382a828c061d0d1027b1b12a62b39b1"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0cacf8f7297b0c4fcb74227692ca46b4a5852f8f4f24b3c766dd94a1075c4884"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c6fd51128a41297f5409deab284fecbe5305ebd7e5a1f959bee1c054622b7018"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cfb2aad70f2c6debfbcb717f23b7eb55febc0bb23dcffc0f076009da10c6392"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1606f4a55c0fd363d754049cdf400175ee96c992b1f8018b993941f221221c5f"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:027b776c26d38b7f15b26a5da1044f376455fb3766df8fc38563b4efbc515154"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:42e5088973e56e31e4fa58eb6bd709e42fc03799c11c42929592889a2e54c491"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cc34f233c9e71701040d772aa7490318673aa7164a0efe3172b2981218c26d93"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:320e8e66157cc4e247d9ddca8e21f427efc7a04bbd0ac8a9faf56583fa543f9f"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-win32.whl", hash = "sha256:fb6fecfd65564f208cbf0fba07f107fb661bcd1a7c389edbced3f7a493f70e37"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:86df271bf921c2ee3818f0522e9a5b8092ca2ad8b065ece5d7d9d0e9f4849bcc"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-win32.whl", hash = "sha256:6fb70de56f1859a3f71261cbe41005f56a7842cc348d3aeb26237560bfa5e0ce"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:cf1ebb7d78e1ad8ec2a8c4732c7be2e736f6e5123a4146c5b89c9d1f585f8cef"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-win32.whl", hash = "sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0f2be7e0cf7754b9a30eb01f4295cc3d4358a479843b31f328afd210e2c7598c"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c60e092517a73c632ec38e290eba714e9627abe9d301c8c8a12ec32c314a2a4b"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:252098c8c7a873e17dd696ed98bbe91dbacd571da4b87df3736768efa7a792e4"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3653fad4fe3ed447a596ae8638b437f827234f01a8cd801842e43f3d0a6b281b"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8999f965f922ae054125286faf9f11bc6932184b93011d138925a1773830bbe9"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d95bfb53c211b57198bb91c46dd5a2d8018b3af446583aab40074bf7988401cb"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:5b413b0b1bfd94dbf4023ad6945889f374cd24e3f62de58d6bb102c4d9ae534a"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:b5e3b2d152e74e100a9e9573837aba24aab611d39428ded46f4e4022ea7d1942"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a2d08ac246bb48479170408d6c19f6385fa743e7157d716e144cad849b2dd94b"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-win32.whl", hash = "sha256:ec557499516fc90fd374bf2e32349a2887a876fbf162c160e3c01b6849eaf557"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:5d8d01eac18c423815ed4f4a2ec3b439d654e55ee4ad610e153cf02faf67ea40"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:70bfc5f2c318afece2f5838ea5e4c3febada0be750fcf4775641052bbba14d05"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:23b6b24d74478dc833444cbd927c338349d6ae852ba53a0d02a2de1fce45b96e"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:34a7f768e3f985abdb42841e20e17b330ad3aaf4bb7e7aeeb73db2e70f077b99"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fb731e5deb0c7ef82d698b0f4c5bb724633ee2a489401594c5c88b02e6cb15f7"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:257f26fed7d7ff59921b78244f3cd93ed2af1800ff048c33f624c87475819dd7"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1ef99f0456d3d46a50945c98de1774da86f8e992ab5c77865ea8b8195341fc19"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:2c322db9c8c89009a990ef07c3bcc9f011a3269bc06782f916cd3d9eed7c9312"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:511729f456829ef86ac41ca78c63a5cb55240ed23b4b737faca0eb1abb1c41bc"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:88ab34806dea0671532d3f82d82b85e8fc23d7b2dd12fa837978dad9bb392a34"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-win32.whl", hash = "sha256:16a8770207946ac75703458e2c743631c79c59c5890c80011d536248f8eaa432"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:d22dbedd33326a4a5190dd4fe9e9e693ef12160c77382d9e87919bce54f3d4ca"}, + {file = "charset_normalizer-3.4.3-py3-none-any.whl", hash = "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a"}, + {file = "charset_normalizer-3.4.3.tar.gz", hash = "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14"}, +] + +[[package]] +name = "click" +version = "8.3.0" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.10" +files = [ + {file = "click-8.3.0-py3-none-any.whl", hash = "sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc"}, + {file = "click-8.3.0.tar.gz", hash = "sha256:e7b8232224eba16f4ebe410c25ced9f7875cb5f3263ffc93cc3e8da705e229c4"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "cloudpickle" +version = "3.1.1" +description = "Pickler class to extend the standard pickle.Pickler functionality" +optional = false +python-versions = ">=3.8" +files = [ + {file = "cloudpickle-3.1.1-py3-none-any.whl", hash = "sha256:c8c5a44295039331ee9dad40ba100a9c7297b6f988e50e87ccdf3765a668350e"}, + {file = "cloudpickle-3.1.1.tar.gz", hash = "sha256:b216fa8ae4019d5482a8ac3c95d8f6346115d8835911fd4aefd1a445e4242c64"}, ] [[package]] @@ -198,49 +197,71 @@ files = [ ] [[package]] -name = "docopt" -version = "0.6.2" -description = "Pythonic argument parser, that will make you smile" +name = "dask" +version = "2025.9.1" +description = "Parallel PyData with Task Scheduling" optional = false -python-versions = "*" +python-versions = ">=3.10" files = [ - {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, + {file = "dask-2025.9.1-py3-none-any.whl", hash = "sha256:2a8a7dc933caaea2f47745a65a6ec93d9e616e12aab53b4f03ee161d31939110"}, + {file = "dask-2025.9.1.tar.gz", hash = "sha256:718df73e1fd3d7e2b8546e0f04ce08e1ed7f9aa3da1eecd0c1f44c8b6d52f7e0"}, ] +[package.dependencies] +click = ">=8.1" +cloudpickle = ">=3.0.0" +fsspec = ">=2021.09.0" +importlib_metadata = {version = ">=4.13.0", markers = "python_version < \"3.12\""} +packaging = ">=20.0" +partd = ">=1.4.0" +pyyaml = ">=5.3.1" +toolz = ">=0.10.0" + +[package.extras] +array = ["numpy (>=1.24)"] +complete = ["dask[array,dataframe,diagnostics,distributed]", "lz4 (>=4.3.2)", "pyarrow (>=14.0.1)"] +dataframe = ["dask[array]", "pandas (>=2.0)", "pyarrow (>=14.0.1)"] +diagnostics = ["bokeh (>=3.1.0)", "jinja2 (>=2.10.3)"] +distributed = ["distributed (==2025.9.1)"] +test = ["pandas[test]", "pre-commit", "pytest", "pytest-cov", "pytest-mock", "pytest-rerunfailures", "pytest-timeout", "pytest-xdist"] + [[package]] name = "exceptiongroup" -version = "1.2.1" +version = "1.3.0" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, - {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, + {file = "exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10"}, + {file = "exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88"}, ] +[package.dependencies] +typing-extensions = {version = ">=4.6.0", markers = "python_version < \"3.13\""} + [package.extras] test = ["pytest (>=6)"] [[package]] name = "fasteners" -version = "0.19" +version = "0.20" description = "A python package that provides useful locks" optional = false python-versions = ">=3.6" files = [ - {file = "fasteners-0.19-py3-none-any.whl", hash = "sha256:758819cb5d94cdedf4e836988b74de396ceacb8e2794d21f82d131fd9ee77237"}, - {file = "fasteners-0.19.tar.gz", hash = "sha256:b4f37c3ac52d8a445af3a66bce57b33b5e90b97c696b7b984f530cf8f0ded09c"}, + {file = "fasteners-0.20-py3-none-any.whl", hash = "sha256:9422c40d1e350e4259f509fb2e608d6bc43c0136f79a00db1b49046029d0b3b7"}, + {file = "fasteners-0.20.tar.gz", hash = "sha256:55dce8792a41b56f727ba6e123fcaee77fd87e638a6863cec00007bfea84c8d8"}, ] [[package]] name = "fsspec" -version = "2024.6.0" +version = "2025.9.0" description = "File-system specification" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "fsspec-2024.6.0-py3-none-any.whl", hash = "sha256:58d7122eb8a1a46f7f13453187bfea4972d66bf01618d37366521b1998034cee"}, - {file = "fsspec-2024.6.0.tar.gz", hash = "sha256:f579960a56e6d8038a9efc8f9c77279ec12e6299aa86b0769a7e9c46b94527c2"}, + {file = "fsspec-2025.9.0-py3-none-any.whl", hash = "sha256:530dc2a2af60a414a832059574df4a6e10cce927f6f4a78209390fe38955cfb7"}, + {file = "fsspec-2025.9.0.tar.gz", hash = "sha256:19fd429483d25d28b65ec68f9f4adc16c17ea2c7c7bf54ec61360d478fb19c19"}, ] [package.extras] @@ -248,7 +269,7 @@ abfs = ["adlfs"] adl = ["adlfs"] arrow = ["pyarrow (>=1)"] dask = ["dask", "distributed"] -dev = ["pre-commit", "ruff"] +dev = ["pre-commit", "ruff (>=0.5)"] doc = ["numpydoc", "sphinx", "sphinx-design", "sphinx-rtd-theme", "yarl"] dropbox = ["dropbox", "dropboxdrivefs", "requests"] full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] @@ -267,19 +288,19 @@ sftp = ["paramiko"] smb = ["smbprotocol"] ssh = ["paramiko"] test = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "numpy", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "requests"] -test-downstream = ["aiobotocore (>=2.5.4,<3.0.0)", "dask-expr", "dask[dataframe,test]", "moto[server] (>4,<5)", "pytest-timeout", "xarray"] +test-downstream = ["aiobotocore (>=2.5.4,<3.0.0)", "dask[dataframe,test]", "moto[server] (>4,<5)", "pytest-timeout", "xarray"] test-full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "cloudpickle", "dask", "distributed", "dropbox", "dropboxdrivefs", "fastparquet", "fusepy", "gcsfs", "jinja2", "kerchunk", "libarchive-c", "lz4", "notebook", "numpy", "ocifs", "pandas", "panel", "paramiko", "pyarrow", "pyarrow (>=1)", "pyftpdlib", "pygit2", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "python-snappy", "requests", "smbprotocol", "tqdm", "urllib3", "zarr", "zstandard"] tqdm = ["tqdm"] [[package]] name = "h5netcdf" -version = "1.3.0" +version = "1.6.4" description = "netCDF4 via h5py" optional = false python-versions = ">=3.9" files = [ - {file = "h5netcdf-1.3.0-py3-none-any.whl", hash = "sha256:f2df69dcd3665dc9c4d43eb6529dedd113b2508090d12ac973573305a8406465"}, - {file = "h5netcdf-1.3.0.tar.gz", hash = "sha256:a171c027daeb34b24c24a3b6304195b8eabbb6f10c748256ed3cfe19806383cf"}, + {file = "h5netcdf-1.6.4-py3-none-any.whl", hash = "sha256:e0018e6a918f2bef2a4aa7b470a952b8a0b5d16a5893d59bea56524cc6207fcf"}, + {file = "h5netcdf-1.6.4.tar.gz", hash = "sha256:83db7e5eb9b822bed2c79050d6cf8f36ecbd1039f4252bd90fab200edcaaf67d"}, ] [package.dependencies] @@ -291,177 +312,138 @@ test = ["netCDF4", "pytest"] [[package]] name = "h5py" -version = "3.11.0" +version = "3.14.0" description = "Read and write HDF5 files from Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "h5py-3.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1625fd24ad6cfc9c1ccd44a66dac2396e7ee74940776792772819fc69f3a3731"}, - {file = "h5py-3.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c072655ad1d5fe9ef462445d3e77a8166cbfa5e599045f8aa3c19b75315f10e5"}, - {file = "h5py-3.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77b19a40788e3e362b54af4dcf9e6fde59ca016db2c61360aa30b47c7b7cef00"}, - {file = "h5py-3.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:ef4e2f338fc763f50a8113890f455e1a70acd42a4d083370ceb80c463d803972"}, - {file = "h5py-3.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bbd732a08187a9e2a6ecf9e8af713f1d68256ee0f7c8b652a32795670fb481ba"}, - {file = "h5py-3.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75bd7b3d93fbeee40860fd70cdc88df4464e06b70a5ad9ce1446f5f32eb84007"}, - {file = "h5py-3.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52c416f8eb0daae39dabe71415cb531f95dce2d81e1f61a74537a50c63b28ab3"}, - {file = "h5py-3.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:083e0329ae534a264940d6513f47f5ada617da536d8dccbafc3026aefc33c90e"}, - {file = "h5py-3.11.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a76cae64080210389a571c7d13c94a1a6cf8cb75153044fd1f822a962c97aeab"}, - {file = "h5py-3.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3736fe21da2b7d8a13fe8fe415f1272d2a1ccdeff4849c1421d2fb30fd533bc"}, - {file = "h5py-3.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa6ae84a14103e8dc19266ef4c3e5d7c00b68f21d07f2966f0ca7bdb6c2761fb"}, - {file = "h5py-3.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:21dbdc5343f53b2e25404673c4f00a3335aef25521bd5fa8c707ec3833934892"}, - {file = "h5py-3.11.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:754c0c2e373d13d6309f408325343b642eb0f40f1a6ad21779cfa9502209e150"}, - {file = "h5py-3.11.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:731839240c59ba219d4cb3bc5880d438248533366f102402cfa0621b71796b62"}, - {file = "h5py-3.11.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ec9df3dd2018904c4cc06331951e274f3f3fd091e6d6cc350aaa90fa9b42a76"}, - {file = "h5py-3.11.0-cp38-cp38-win_amd64.whl", hash = "sha256:55106b04e2c83dfb73dc8732e9abad69d83a436b5b82b773481d95d17b9685e1"}, - {file = "h5py-3.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f4e025e852754ca833401777c25888acb96889ee2c27e7e629a19aee288833f0"}, - {file = "h5py-3.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c4b760082626120031d7902cd983d8c1f424cdba2809f1067511ef283629d4b"}, - {file = "h5py-3.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67462d0669f8f5459529de179f7771bd697389fcb3faab54d63bf788599a48ea"}, - {file = "h5py-3.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:d9c944d364688f827dc889cf83f1fca311caf4fa50b19f009d1f2b525edd33a3"}, - {file = "h5py-3.11.0.tar.gz", hash = "sha256:7b7e8f78072a2edec87c9836f25f34203fd492a4475709a18b417a33cfb21fa9"}, + {file = "h5py-3.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:24df6b2622f426857bda88683b16630014588a0e4155cba44e872eb011c4eaed"}, + {file = "h5py-3.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ff2389961ee5872de697054dd5a033b04284afc3fb52dc51d94561ece2c10c6"}, + {file = "h5py-3.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:016e89d3be4c44f8d5e115fab60548e518ecd9efe9fa5c5324505a90773e6f03"}, + {file = "h5py-3.14.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1223b902ef0b5d90bcc8a4778218d6d6cd0f5561861611eda59fa6c52b922f4d"}, + {file = "h5py-3.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:852b81f71df4bb9e27d407b43071d1da330d6a7094a588efa50ef02553fa7ce4"}, + {file = "h5py-3.14.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f30dbc58f2a0efeec6c8836c97f6c94afd769023f44e2bb0ed7b17a16ec46088"}, + {file = "h5py-3.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:543877d7f3d8f8a9828ed5df6a0b78ca3d8846244b9702e99ed0d53610b583a8"}, + {file = "h5py-3.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c497600c0496548810047257e36360ff551df8b59156d3a4181072eed47d8ad"}, + {file = "h5py-3.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:723a40ee6505bd354bfd26385f2dae7bbfa87655f4e61bab175a49d72ebfc06b"}, + {file = "h5py-3.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:d2744b520440a996f2dae97f901caa8a953afc055db4673a993f2d87d7f38713"}, + {file = "h5py-3.14.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e0045115d83272090b0717c555a31398c2c089b87d212ceba800d3dc5d952e23"}, + {file = "h5py-3.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6da62509b7e1d71a7d110478aa25d245dd32c8d9a1daee9d2a42dba8717b047a"}, + {file = "h5py-3.14.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:554ef0ced3571366d4d383427c00c966c360e178b5fb5ee5bb31a435c424db0c"}, + {file = "h5py-3.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0cbd41f4e3761f150aa5b662df991868ca533872c95467216f2bec5fcad84882"}, + {file = "h5py-3.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:bf4897d67e613ecf5bdfbdab39a1158a64df105827da70ea1d90243d796d367f"}, + {file = "h5py-3.14.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:aa4b7bbce683379b7bf80aaba68e17e23396100336a8d500206520052be2f812"}, + {file = "h5py-3.14.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ef9603a501a04fcd0ba28dd8f0995303d26a77a980a1f9474b3417543d4c6174"}, + {file = "h5py-3.14.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8cbaf6910fa3983c46172666b0b8da7b7bd90d764399ca983236f2400436eeb"}, + {file = "h5py-3.14.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d90e6445ab7c146d7f7981b11895d70bc1dd91278a4f9f9028bc0c95e4a53f13"}, + {file = "h5py-3.14.0-cp313-cp313-win_amd64.whl", hash = "sha256:ae18e3de237a7a830adb76aaa68ad438d85fe6e19e0d99944a3ce46b772c69b3"}, + {file = "h5py-3.14.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f5cc1601e78027cedfec6dd50efb4802f018551754191aeb58d948bd3ec3bd7a"}, + {file = "h5py-3.14.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e59d2136a8b302afd25acdf7a89b634e0eb7c66b1a211ef2d0457853768a2ef"}, + {file = "h5py-3.14.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:573c33ad056ac7c1ab6d567b6db9df3ffc401045e3f605736218f96c1e0490c6"}, + {file = "h5py-3.14.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ccbe17dc187c0c64178f1a10aa274ed3a57d055117588942b8a08793cc448216"}, + {file = "h5py-3.14.0-cp39-cp39-win_amd64.whl", hash = "sha256:4f025cf30ae738c4c4e38c7439a761a71ccfcce04c2b87b2a2ac64e8c5171d43"}, + {file = "h5py-3.14.0.tar.gz", hash = "sha256:2372116b2e0d5d3e5e705b7f663f7c8d96fa79a4052d250484ef91d24d6a08f4"}, ] [package.dependencies] -numpy = ">=1.17.3" +numpy = ">=1.19.3" [[package]] name = "idna" -version = "3.7" +version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" files = [ - {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, - {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] -[[package]] -name = "iniconfig" -version = "2.0.0" -description = "brain-dead simple config-ini parsing" -optional = false -python-versions = ">=3.7" -files = [ - {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, - {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, -] +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] [[package]] -name = "jinja2" -version = "3.1.4" -description = "A very fast and expressive template engine." +name = "importlib-metadata" +version = "8.7.0" +description = "Read metadata from Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, - {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, + {file = "importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd"}, + {file = "importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000"}, ] [package.dependencies] -MarkupSafe = ">=2.0" +zipp = ">=3.20" [package.extras] -i18n = ["Babel (>=2.7)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] +perf = ["ipython"] +test = ["flufl.flake8", "importlib_resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] +type = ["pytest-mypy"] [[package]] -name = "markupsafe" -version = "2.1.5" -description = "Safely add untrusted strings to HTML/XML markup." +name = "iniconfig" +version = "2.1.0" +description = "brain-dead simple config-ini parsing" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760"}, + {file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"}, +] + +[[package]] +name = "locket" +version = "1.0.0" +description = "File-based locks for Python on Linux and Windows" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, - {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, + {file = "locket-1.0.0-py2.py3-none-any.whl", hash = "sha256:b6c819a722f7b6bd955b80781788e4a66a55628b858d347536b7e81325a3a5e3"}, + {file = "locket-1.0.0.tar.gz", hash = "sha256:5c0d4c052a8bbbf750e056a8e65ccd309086f4f0f18a2eac306a8dfa4112a632"}, ] [[package]] name = "netcdf4" -version = "1.7.1" +version = "1.7.2" description = "Provides an object-oriented python interface to the netCDF version 4 library" optional = false python-versions = ">=3.8" files = [ - {file = "netCDF4-1.7.1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:7503bc1a7b013c7ba5d715a72826f7debf65633eace4a4280c2700b1cc001945"}, - {file = "netCDF4-1.7.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:3b345b68365ecae2c8c9c33e7d41a1a94e80ef987f40928a02e2f210d05d02b2"}, - {file = "netCDF4-1.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:867466bef3d109d79d35b2bbcb713565f29b2df0cb52cd19691cba65374129ac"}, - {file = "netCDF4-1.7.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73f017f4d909cea6ab1065e8199d597a9bf5cf60f91c37ae8a040c35256bc196"}, - {file = "netCDF4-1.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:48c56e96107ec8e2daf08cb0a9dde2b66e118de397c5f06511b31c37ef35e113"}, - {file = "netCDF4-1.7.1-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:dfb92f8db5731b285546b732dfbe5870ed09b16a0453bb213a8dba83d1045935"}, - {file = "netCDF4-1.7.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:9cd8b9ab2508cc4a8d52957f84c1f34d94755c748ef6f285f756044842184852"}, - {file = "netCDF4-1.7.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b43f6569ef09fba75d2bd194fe60d286736b96329e0e50e90df4e236b272db0e"}, - {file = "netCDF4-1.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56af0fa24a39a14bc68cc1ab97e6d33fbaff934ba0659f740ad54bd80fbf732f"}, - {file = "netCDF4-1.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ce2207d836e5289f8caa66a540b222f76c242e6be565cefe8478a19bb08c206"}, - {file = "netCDF4-1.7.1-cp312-cp312-macosx_11_0_x86_64.whl", hash = "sha256:5724ba076ea49b63625447cd6e8d936929a2b23d3e63157c16a607e8e7505598"}, - {file = "netCDF4-1.7.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:b6917f8ad44722fefb26134b540e97a9eef5ffd0b73e4564666b697f0f43ae5d"}, - {file = "netCDF4-1.7.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d407f5725daf8972ff7a4af48925a75c349158681e3f14f264616a013fe97aca"}, - {file = "netCDF4-1.7.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e26fd9a30c26d7757444410fe85d68ce8d3f64119d33feaa4daed374d1779590"}, - {file = "netCDF4-1.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:7258b98ebfaf7f0a3f362946d0192020d0d0284b131e7ef775e66858d3ff13ae"}, - {file = "netCDF4-1.7.1-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:b300b6933ab83496914c0f1731075a3a40829b9010c3f1548eece5ccb3ea629a"}, - {file = "netCDF4-1.7.1-cp38-cp38-macosx_14_0_arm64.whl", hash = "sha256:c4ece6fe318f787b212e6169dee5e2c3326650dd64b1af44e2b815c6b48f2231"}, - {file = "netCDF4-1.7.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a9d8906ff7c86e1af176efbd85603088c98271cf844562a482286411289a7ec"}, - {file = "netCDF4-1.7.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f858bef2edd5dfccacd4c556eae7db55b185ba6af9b6520d8ae1ea16a72004a6"}, - {file = "netCDF4-1.7.1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:225a03e1d216618d14f721c72b47a42f09e68dcc6b1509c93c784c60c630129f"}, - {file = "netCDF4-1.7.1-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:85d28a26080b2a05b0786135be7b215ed0629a974895b135bd4ef2eddbb3e1ad"}, - {file = "netCDF4-1.7.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec569b56ab8714aded398b1667e1ca01489c71ed51965e9a0bd51d7c217ce352"}, - {file = "netCDF4-1.7.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7553e9cd37ef9a2382e3f8088b0f4c00e8078e76e2358c140eb882eefabe6db7"}, - {file = "netCDF4-1.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:6e343b7e42cd11184c2686e2899915bb1f3f1df7c9c62681590c35c088a9c66b"}, - {file = "netcdf4-1.7.1.tar.gz", hash = "sha256:87d666093870ebbc0153c8eb42a4a70d6a1d33b47fa3d8fd2e01b6d8de52023e"}, + {file = "netCDF4-1.7.2-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:5e9b485e3bd9294d25ff7dc9addefce42b3d23c1ee7e3627605277d159819392"}, + {file = "netCDF4-1.7.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:118b476fd00d7e3ab9aa7771186d547da645ae3b49c0c7bdab866793ebf22f07"}, + {file = "netCDF4-1.7.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abe5b1837ff209185ecfe50bd71884c866b3ee69691051833e410e57f177e059"}, + {file = "netCDF4-1.7.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28021c7e886e5bccf9a8ce504c032d1d7f98d86f67495fb7cf2c9564eba04510"}, + {file = "netCDF4-1.7.2-cp310-cp310-win_amd64.whl", hash = "sha256:7460b638e41c8ce4179d082a81cb6456f0ce083d4d959f4d9e87a95cd86f64cb"}, + {file = "netCDF4-1.7.2-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:09d61c2ddb6011afb51e77ea0f25cd0bdc28887fb426ffbbc661d920f20c9749"}, + {file = "netCDF4-1.7.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:fd2a16dbddeb8fa7cf48c37bfc1967290332f2862bb82f984eec2007bb120aeb"}, + {file = "netCDF4-1.7.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f54f5d39ffbcf1726a1e6fd90cb5fa74277ecea739a5fa0f424636d71beafe24"}, + {file = "netCDF4-1.7.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:902aa50d70f49d002d896212a171d344c38f7b8ca520837c56c922ac1535c4a3"}, + {file = "netCDF4-1.7.2-cp311-cp311-win_amd64.whl", hash = "sha256:3291f9ad0c98c49a4dd16aefad1a9abd3a1b884171db6c81bdcee94671cfabe3"}, + {file = "netCDF4-1.7.2-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:e73e3baa0b74afc414e53ff5095748fdbec7fb346eda351e567c23f2f0d247f1"}, + {file = "netCDF4-1.7.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:a51da09258b31776f474c1d47e484fc7214914cdc59edf4cee789ba632184591"}, + {file = "netCDF4-1.7.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb95b11804fe051897d1f2044b05d82a1847bc2549631cdd2f655dde7de77a9c"}, + {file = "netCDF4-1.7.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9d8a848373723f41ef662590b4f5e1832227501c9fd4513e8ad8da58c269977"}, + {file = "netCDF4-1.7.2-cp312-cp312-win_amd64.whl", hash = "sha256:568ea369e00b581302d77fc5fd0b8f78e520c7e08d0b5af5219ba51f3f1cd694"}, + {file = "netCDF4-1.7.2-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:205a5f1de3ddb993c7c97fb204a923a22408cc2e5facf08d75a8eb89b3e7e1a8"}, + {file = "netCDF4-1.7.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:96653fc75057df196010818367c63ba6d7e9af603df0a7fe43fcdad3fe0e9e56"}, + {file = "netCDF4-1.7.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30d20e56b9ba2c48884eb89c91b63e6c0612b4927881707e34402719153ef17f"}, + {file = "netCDF4-1.7.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d6bfd38ba0bde04d56f06c1554714a2ea9dab75811c89450dc3ec57a9d36b80"}, + {file = "netCDF4-1.7.2-cp313-cp313-win_amd64.whl", hash = "sha256:5c5fbee6134ee1246c397e1508e5297d825aa19221fdf3fa8dc9727ad824d7a5"}, + {file = "netCDF4-1.7.2-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:6bf402c2c7c063474576e5cf89af877d0b0cd097d9316d5bc4fcb22b62f12567"}, + {file = "netCDF4-1.7.2-cp38-cp38-macosx_14_0_arm64.whl", hash = "sha256:5bdf3b34e6fd4210e34fdc5d1a669a22c4863d96f8a20a3928366acae7b3cbbb"}, + {file = "netCDF4-1.7.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:657774404b9f78a5e4d26506ac9bfe106e4a37238282a70803cc7ce679c5a6cc"}, + {file = "netCDF4-1.7.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e896d92f01fbf365e33e2513d5a8c4cfe16ff406aae9b6034e5ba1538c8c7a8"}, + {file = "netCDF4-1.7.2-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:eb87c08d1700fe67c301898cf5ba3a3e1f8f2fbb417fcd0e2ac784846b60b058"}, + {file = "netCDF4-1.7.2-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:59b403032774c723ee749d7f2135be311bad7d00d1db284bebfab58b9d5cdb92"}, + {file = "netCDF4-1.7.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:572f71459ef4b30e8554dcc4e1e6f55de515acc82a50968b48fe622244a64548"}, + {file = "netCDF4-1.7.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f77e72281acc5f331f82271e5f7f014d46f5ca9bcaa5aafe3e46d66cee21320"}, + {file = "netCDF4-1.7.2-cp39-cp39-win_amd64.whl", hash = "sha256:d0fa7a9674fae8ae4877e813173c3ff7a6beee166b8730bdc847f517b282ed31"}, + {file = "netcdf4-1.7.2.tar.gz", hash = "sha256:a4c6375540b19989896136943abb6d44850ff6f1fa7d3f063253b1ad3f8b7fce"}, ] [package.dependencies] @@ -474,142 +456,178 @@ tests = ["Cython", "packaging", "pytest"] [[package]] name = "numcodecs" -version = "0.12.1" +version = "0.13.1" description = "A Python package providing buffer compression and transformation codecs for use in data storage and communication applications." optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" files = [ - {file = "numcodecs-0.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d37f628fe92b3699e65831d5733feca74d2e33b50ef29118ffd41c13c677210e"}, - {file = "numcodecs-0.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:941b7446b68cf79f089bcfe92edaa3b154533dcbcd82474f994b28f2eedb1c60"}, - {file = "numcodecs-0.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e79bf9d1d37199ac00a60ff3adb64757523291d19d03116832e600cac391c51"}, - {file = "numcodecs-0.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:82d7107f80f9307235cb7e74719292d101c7ea1e393fe628817f0d635b7384f5"}, - {file = "numcodecs-0.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:eeaf42768910f1c6eebf6c1bb00160728e62c9343df9e2e315dc9fe12e3f6071"}, - {file = "numcodecs-0.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:135b2d47563f7b9dc5ee6ce3d1b81b0f1397f69309e909f1a35bb0f7c553d45e"}, - {file = "numcodecs-0.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a191a8e347ecd016e5c357f2bf41fbcb026f6ffe78fff50c77ab12e96701d155"}, - {file = "numcodecs-0.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:21d8267bd4313f4d16f5b6287731d4c8ebdab236038f29ad1b0e93c9b2ca64ee"}, - {file = "numcodecs-0.12.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:2f84df6b8693206365a5b37c005bfa9d1be486122bde683a7b6446af4b75d862"}, - {file = "numcodecs-0.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:760627780a8b6afdb7f942f2a0ddaf4e31d3d7eea1d8498cf0fd3204a33c4618"}, - {file = "numcodecs-0.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c258bd1d3dfa75a9b708540d23b2da43d63607f9df76dfa0309a7597d1de3b73"}, - {file = "numcodecs-0.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:e04649ea504aff858dbe294631f098fbfd671baf58bfc04fc48d746554c05d67"}, - {file = "numcodecs-0.12.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:caf1a1e6678aab9c1e29d2109b299f7a467bd4d4c34235b1f0e082167846b88f"}, - {file = "numcodecs-0.12.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c17687b1fd1fef68af616bc83f896035d24e40e04e91e7e6dae56379eb59fe33"}, - {file = "numcodecs-0.12.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:29dfb195f835a55c4d490fb097aac8c1bcb96c54cf1b037d9218492c95e9d8c5"}, - {file = "numcodecs-0.12.1-cp38-cp38-win_amd64.whl", hash = "sha256:2f1ba2f4af3fd3ba65b1bcffb717fe65efe101a50a91c368f79f3101dbb1e243"}, - {file = "numcodecs-0.12.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2fbb12a6a1abe95926f25c65e283762d63a9bf9e43c0de2c6a1a798347dfcb40"}, - {file = "numcodecs-0.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f2207871868b2464dc11c513965fd99b958a9d7cde2629be7b2dc84fdaab013b"}, - {file = "numcodecs-0.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abff3554a6892a89aacf7b642a044e4535499edf07aeae2f2e6e8fc08c9ba07f"}, - {file = "numcodecs-0.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:ef964d4860d3e6b38df0633caf3e51dc850a6293fd8e93240473642681d95136"}, - {file = "numcodecs-0.12.1.tar.gz", hash = "sha256:05d91a433733e7eef268d7e80ec226a0232da244289614a8f3826901aec1098e"}, + {file = "numcodecs-0.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:96add4f783c5ce57cc7e650b6cac79dd101daf887c479a00a29bc1487ced180b"}, + {file = "numcodecs-0.13.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:237b7171609e868a20fd313748494444458ccd696062f67e198f7f8f52000c15"}, + {file = "numcodecs-0.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96e42f73c31b8c24259c5fac6adba0c3ebf95536e37749dc6c62ade2989dca28"}, + {file = "numcodecs-0.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:eda7d7823c9282e65234731fd6bd3986b1f9e035755f7fed248d7d366bb291ab"}, + {file = "numcodecs-0.13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2eda97dd2f90add98df6d295f2c6ae846043396e3d51a739ca5db6c03b5eb666"}, + {file = "numcodecs-0.13.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2a86f5367af9168e30f99727ff03b27d849c31ad4522060dde0bce2923b3a8bc"}, + {file = "numcodecs-0.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:233bc7f26abce24d57e44ea8ebeb5cd17084690b4e7409dd470fdb75528d615f"}, + {file = "numcodecs-0.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:796b3e6740107e4fa624cc636248a1580138b3f1c579160f260f76ff13a4261b"}, + {file = "numcodecs-0.13.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5195bea384a6428f8afcece793860b1ab0ae28143c853f0b2b20d55a8947c917"}, + {file = "numcodecs-0.13.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3501a848adaddce98a71a262fee15cd3618312692aa419da77acd18af4a6a3f6"}, + {file = "numcodecs-0.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da2230484e6102e5fa3cc1a5dd37ca1f92dfbd183d91662074d6f7574e3e8f53"}, + {file = "numcodecs-0.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:e5db4824ebd5389ea30e54bc8aeccb82d514d28b6b68da6c536b8fa4596f4bca"}, + {file = "numcodecs-0.13.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7a60d75179fd6692e301ddfb3b266d51eb598606dcae7b9fc57f986e8d65cb43"}, + {file = "numcodecs-0.13.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3f593c7506b0ab248961a3b13cb148cc6e8355662ff124ac591822310bc55ecf"}, + {file = "numcodecs-0.13.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80d3071465f03522e776a31045ddf2cfee7f52df468b977ed3afdd7fe5869701"}, + {file = "numcodecs-0.13.1-cp313-cp313-win_amd64.whl", hash = "sha256:90d3065ae74c9342048ae0046006f99dcb1388b7288da5a19b3bddf9c30c3176"}, + {file = "numcodecs-0.13.1.tar.gz", hash = "sha256:a3cf37881df0898f3a9c0d4477df88133fe85185bffe57ba31bcc2fa207709bc"}, ] [package.dependencies] numpy = ">=1.7" [package.extras] -docs = ["mock", "numpydoc", "sphinx (<7.0.0)", "sphinx-issues"] +docs = ["mock", "numpydoc", "pydata-sphinx-theme", "sphinx", "sphinx-issues"] msgpack = ["msgpack"] -test = ["coverage", "flake8", "pytest", "pytest-cov"] +pcodec = ["pcodec (>=0.2.0)"] +test = ["coverage", "pytest", "pytest-cov"] test-extras = ["importlib-metadata"] -zfpy = ["zfpy (>=1.0.0)"] +zfpy = ["numpy (<2.0.0)", "zfpy (>=1.0.0)"] [[package]] name = "numpy" -version = "2.0.0" +version = "2.2.6" description = "Fundamental package for array computing in Python" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" files = [ - {file = "numpy-2.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:04494f6ec467ccb5369d1808570ae55f6ed9b5809d7f035059000a37b8d7e86f"}, - {file = "numpy-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2635dbd200c2d6faf2ef9a0d04f0ecc6b13b3cad54f7c67c61155138835515d2"}, - {file = "numpy-2.0.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:0a43f0974d501842866cc83471bdb0116ba0dffdbaac33ec05e6afed5b615238"}, - {file = "numpy-2.0.0-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:8d83bb187fb647643bd56e1ae43f273c7f4dbcdf94550d7938cfc32566756514"}, - {file = "numpy-2.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79e843d186c8fb1b102bef3e2bc35ef81160ffef3194646a7fdd6a73c6b97196"}, - {file = "numpy-2.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d7696c615765091cc5093f76fd1fa069870304beaccfd58b5dcc69e55ef49c1"}, - {file = "numpy-2.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b4c76e3d4c56f145d41b7b6751255feefae92edbc9a61e1758a98204200f30fc"}, - {file = "numpy-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:acd3a644e4807e73b4e1867b769fbf1ce8c5d80e7caaef0d90dcdc640dfc9787"}, - {file = "numpy-2.0.0-cp310-cp310-win32.whl", hash = "sha256:cee6cc0584f71adefe2c908856ccc98702baf95ff80092e4ca46061538a2ba98"}, - {file = "numpy-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:ed08d2703b5972ec736451b818c2eb9da80d66c3e84aed1deeb0c345fefe461b"}, - {file = "numpy-2.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad0c86f3455fbd0de6c31a3056eb822fc939f81b1618f10ff3406971893b62a5"}, - {file = "numpy-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e7f387600d424f91576af20518334df3d97bc76a300a755f9a8d6e4f5cadd289"}, - {file = "numpy-2.0.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:34f003cb88b1ba38cb9a9a4a3161c1604973d7f9d5552c38bc2f04f829536609"}, - {file = "numpy-2.0.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:b6f6a8f45d0313db07d6d1d37bd0b112f887e1369758a5419c0370ba915b3871"}, - {file = "numpy-2.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f64641b42b2429f56ee08b4f427a4d2daf916ec59686061de751a55aafa22e4"}, - {file = "numpy-2.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7039a136017eaa92c1848152827e1424701532ca8e8967fe480fe1569dae581"}, - {file = "numpy-2.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:46e161722e0f619749d1cd892167039015b2c2817296104487cd03ed4a955995"}, - {file = "numpy-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0e50842b2295ba8414c8c1d9d957083d5dfe9e16828b37de883f51fc53c4016f"}, - {file = "numpy-2.0.0-cp311-cp311-win32.whl", hash = "sha256:2ce46fd0b8a0c947ae047d222f7136fc4d55538741373107574271bc00e20e8f"}, - {file = "numpy-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:fbd6acc766814ea6443628f4e6751d0da6593dae29c08c0b2606164db026970c"}, - {file = "numpy-2.0.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:354f373279768fa5a584bac997de6a6c9bc535c482592d7a813bb0c09be6c76f"}, - {file = "numpy-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4d2f62e55a4cd9c58c1d9a1c9edaedcd857a73cb6fda875bf79093f9d9086f85"}, - {file = "numpy-2.0.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:1e72728e7501a450288fc8e1f9ebc73d90cfd4671ebbd631f3e7857c39bd16f2"}, - {file = "numpy-2.0.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:84554fc53daa8f6abf8e8a66e076aff6ece62de68523d9f665f32d2fc50fd66e"}, - {file = "numpy-2.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c73aafd1afca80afecb22718f8700b40ac7cab927b8abab3c3e337d70e10e5a2"}, - {file = "numpy-2.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49d9f7d256fbc804391a7f72d4a617302b1afac1112fac19b6c6cec63fe7fe8a"}, - {file = "numpy-2.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0ec84b9ba0654f3b962802edc91424331f423dcf5d5f926676e0150789cb3d95"}, - {file = "numpy-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:feff59f27338135776f6d4e2ec7aeeac5d5f7a08a83e80869121ef8164b74af9"}, - {file = "numpy-2.0.0-cp312-cp312-win32.whl", hash = "sha256:c5a59996dc61835133b56a32ebe4ef3740ea5bc19b3983ac60cc32be5a665d54"}, - {file = "numpy-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:a356364941fb0593bb899a1076b92dfa2029f6f5b8ba88a14fd0984aaf76d0df"}, - {file = "numpy-2.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e61155fae27570692ad1d327e81c6cf27d535a5d7ef97648a17d922224b216de"}, - {file = "numpy-2.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4554eb96f0fd263041baf16cf0881b3f5dafae7a59b1049acb9540c4d57bc8cb"}, - {file = "numpy-2.0.0-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:903703372d46bce88b6920a0cd86c3ad82dae2dbef157b5fc01b70ea1cfc430f"}, - {file = "numpy-2.0.0-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:3e8e01233d57639b2e30966c63d36fcea099d17c53bf424d77f088b0f4babd86"}, - {file = "numpy-2.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cde1753efe513705a0c6d28f5884e22bdc30438bf0085c5c486cdaff40cd67a"}, - {file = "numpy-2.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:821eedb7165ead9eebdb569986968b541f9908979c2da8a4967ecac4439bae3d"}, - {file = "numpy-2.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9a1712c015831da583b21c5bfe15e8684137097969c6d22e8316ba66b5baabe4"}, - {file = "numpy-2.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9c27f0946a3536403efb0e1c28def1ae6730a72cd0d5878db38824855e3afc44"}, - {file = "numpy-2.0.0-cp39-cp39-win32.whl", hash = "sha256:63b92c512d9dbcc37f9d81b123dec99fdb318ba38c8059afc78086fe73820275"}, - {file = "numpy-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:3f6bed7f840d44c08ebdb73b1825282b801799e325bcbdfa6bc5c370e5aecc65"}, - {file = "numpy-2.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9416a5c2e92ace094e9f0082c5fd473502c91651fb896bc17690d6fc475128d6"}, - {file = "numpy-2.0.0-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:17067d097ed036636fa79f6a869ac26df7db1ba22039d962422506640314933a"}, - {file = "numpy-2.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ecb5b0582cd125f67a629072fed6f83562d9dd04d7e03256c9829bdec027ad"}, - {file = "numpy-2.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cef04d068f5fb0518a77857953193b6bb94809a806bd0a14983a8f12ada060c9"}, - {file = "numpy-2.0.0.tar.gz", hash = "sha256:cf5d1c9e6837f8af9f92b6bd3e86d513cdc11f60fd62185cc49ec7d1aba34864"}, + {file = "numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb"}, + {file = "numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90"}, + {file = "numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163"}, + {file = "numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf"}, + {file = "numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83"}, + {file = "numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915"}, + {file = "numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680"}, + {file = "numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289"}, + {file = "numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d"}, + {file = "numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3"}, + {file = "numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae"}, + {file = "numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a"}, + {file = "numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42"}, + {file = "numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491"}, + {file = "numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a"}, + {file = "numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf"}, + {file = "numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1"}, + {file = "numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab"}, + {file = "numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47"}, + {file = "numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303"}, + {file = "numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff"}, + {file = "numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c"}, + {file = "numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3"}, + {file = "numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282"}, + {file = "numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87"}, + {file = "numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249"}, + {file = "numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49"}, + {file = "numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de"}, + {file = "numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4"}, + {file = "numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2"}, + {file = "numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84"}, + {file = "numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b"}, + {file = "numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d"}, + {file = "numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566"}, + {file = "numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f"}, + {file = "numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f"}, + {file = "numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868"}, + {file = "numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d"}, + {file = "numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd"}, + {file = "numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c"}, + {file = "numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6"}, + {file = "numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda"}, + {file = "numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40"}, + {file = "numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8"}, + {file = "numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f"}, + {file = "numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa"}, + {file = "numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571"}, + {file = "numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1"}, + {file = "numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff"}, + {file = "numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06"}, + {file = "numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d"}, + {file = "numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db"}, + {file = "numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543"}, + {file = "numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00"}, + {file = "numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd"}, ] [[package]] name = "packaging" -version = "24.1" +version = "25.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, - {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, + {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, + {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, ] [[package]] name = "pandas" -version = "2.2.2" +version = "2.3.3" description = "Powerful data structures for data analysis, time series, and statistics" optional = false python-versions = ">=3.9" files = [ - {file = "pandas-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce"}, - {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08"}, - {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0"}, - {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51"}, - {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8e5a0b00e1e56a842f922e7fae8ae4077aee4af0acb5ae3622bd4b4c30aedf99"}, - {file = "pandas-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:ddf818e4e6c7c6f4f7c8a12709696d193976b591cc7dc50588d3d1a6b5dc8772"}, - {file = "pandas-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288"}, - {file = "pandas-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151"}, - {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b"}, - {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee"}, - {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2925720037f06e89af896c70bca73459d7e6a4be96f9de79e2d440bd499fe0db"}, - {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1"}, - {file = "pandas-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24"}, - {file = "pandas-2.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef"}, - {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad"}, - {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad"}, - {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76"}, - {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32"}, - {file = "pandas-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23"}, - {file = "pandas-2.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2"}, - {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863"}, - {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921"}, - {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a"}, - {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:92fd6b027924a7e178ac202cfbe25e53368db90d56872d20ffae94b96c7acc57"}, - {file = "pandas-2.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:640cef9aa381b60e296db324337a554aeeb883ead99dc8f6c18e81a93942f5f4"}, - {file = "pandas-2.2.2.tar.gz", hash = "sha256:9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54"}, + {file = "pandas-2.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:376c6446ae31770764215a6c937f72d917f214b43560603cd60da6408f183b6c"}, + {file = "pandas-2.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e19d192383eab2f4ceb30b412b22ea30690c9e618f78870357ae1d682912015a"}, + {file = "pandas-2.3.3-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5caf26f64126b6c7aec964f74266f435afef1c1b13da3b0636c7518a1fa3e2b1"}, + {file = "pandas-2.3.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd7478f1463441ae4ca7308a70e90b33470fa593429f9d4c578dd00d1fa78838"}, + {file = "pandas-2.3.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4793891684806ae50d1288c9bae9330293ab4e083ccd1c5e383c34549c6e4250"}, + {file = "pandas-2.3.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:28083c648d9a99a5dd035ec125d42439c6c1c525098c58af0fc38dd1a7a1b3d4"}, + {file = "pandas-2.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:503cf027cf9940d2ceaa1a93cfb5f8c8c7e6e90720a2850378f0b3f3b1e06826"}, + {file = "pandas-2.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:602b8615ebcc4a0c1751e71840428ddebeb142ec02c786e8ad6b1ce3c8dec523"}, + {file = "pandas-2.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8fe25fc7b623b0ef6b5009149627e34d2a4657e880948ec3c840e9402e5c1b45"}, + {file = "pandas-2.3.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b468d3dad6ff947df92dcb32ede5b7bd41a9b3cceef0a30ed925f6d01fb8fa66"}, + {file = "pandas-2.3.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b98560e98cb334799c0b07ca7967ac361a47326e9b4e5a7dfb5ab2b1c9d35a1b"}, + {file = "pandas-2.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37b5848ba49824e5c30bedb9c830ab9b7751fd049bc7914533e01c65f79791"}, + {file = "pandas-2.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db4301b2d1f926ae677a751eb2bd0e8c5f5319c9cb3f88b0becbbb0b07b34151"}, + {file = "pandas-2.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:f086f6fe114e19d92014a1966f43a3e62285109afe874f067f5abbdcbb10e59c"}, + {file = "pandas-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53"}, + {file = "pandas-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35"}, + {file = "pandas-2.3.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908"}, + {file = "pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89"}, + {file = "pandas-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98"}, + {file = "pandas-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084"}, + {file = "pandas-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b"}, + {file = "pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713"}, + {file = "pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8"}, + {file = "pandas-2.3.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e32e7cc9af0f1cc15548288a51a3b681cc2a219faa838e995f7dc53dbab1062d"}, + {file = "pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac"}, + {file = "pandas-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e0a175408804d566144e170d0476b15d78458795bb18f1304fb94160cabf40c"}, + {file = "pandas-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2d9ab0fc11822b5eece72ec9587e172f63cff87c00b062f6e37448ced4493"}, + {file = "pandas-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee"}, + {file = "pandas-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:75ea25f9529fdec2d2e93a42c523962261e567d250b0013b16210e1d40d7c2e5"}, + {file = "pandas-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74ecdf1d301e812db96a465a525952f4dde225fdb6d8e5a521d47e1f42041e21"}, + {file = "pandas-2.3.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6435cb949cb34ec11cc9860246ccb2fdc9ecd742c12d3304989017d53f039a78"}, + {file = "pandas-2.3.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:900f47d8f20860de523a1ac881c4c36d65efcb2eb850e6948140fa781736e110"}, + {file = "pandas-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a45c765238e2ed7d7c608fc5bc4a6f88b642f2f01e70c0c23d2224dd21829d86"}, + {file = "pandas-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c4fc4c21971a1a9f4bdb4c73978c7f7256caa3e62b323f70d6cb80db583350bc"}, + {file = "pandas-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0"}, + {file = "pandas-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593"}, + {file = "pandas-2.3.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c"}, + {file = "pandas-2.3.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b"}, + {file = "pandas-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6"}, + {file = "pandas-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3"}, + {file = "pandas-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5"}, + {file = "pandas-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec"}, + {file = "pandas-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7"}, + {file = "pandas-2.3.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450"}, + {file = "pandas-2.3.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5"}, + {file = "pandas-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788"}, + {file = "pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87"}, + {file = "pandas-2.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c503ba5216814e295f40711470446bc3fd00f0faea8a086cbc688808e26f92a2"}, + {file = "pandas-2.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a637c5cdfa04b6d6e2ecedcb81fc52ffb0fd78ce2ebccc9ea964df9f658de8c8"}, + {file = "pandas-2.3.3-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:854d00d556406bffe66a4c0802f334c9ad5a96b4f1f868adf036a21b11ef13ff"}, + {file = "pandas-2.3.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bf1f8a81d04ca90e32a0aceb819d34dbd378a98bf923b6398b9a3ec0bf44de29"}, + {file = "pandas-2.3.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:23ebd657a4d38268c7dfbdf089fbc31ea709d82e4923c5ffd4fbd5747133ce73"}, + {file = "pandas-2.3.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5554c929ccc317d41a5e3d1234f3be588248e61f08a74dd17c9eabb535777dc9"}, + {file = "pandas-2.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:d3e28b3e83862ccf4d85ff19cf8c20b2ae7e503881711ff2d534dc8f761131aa"}, + {file = "pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b"}, ] [package.dependencies] @@ -647,36 +665,54 @@ sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-d test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] xml = ["lxml (>=4.9.2)"] +[[package]] +name = "partd" +version = "1.4.2" +description = "Appendable key-value storage" +optional = false +python-versions = ">=3.9" +files = [ + {file = "partd-1.4.2-py3-none-any.whl", hash = "sha256:978e4ac767ec4ba5b86c6eaa52e5a2a3bc748a2ca839e8cc798f1cc6ce6efb0f"}, + {file = "partd-1.4.2.tar.gz", hash = "sha256:d022c33afbdc8405c226621b015e8067888173d85f7f5ecebb3cafed9a20f02c"}, +] + +[package.dependencies] +locket = "*" +toolz = "*" + +[package.extras] +complete = ["blosc", "numpy (>=1.20.0)", "pandas (>=1.3)", "pyzmq"] + [[package]] name = "platformdirs" -version = "4.2.2" +version = "4.4.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, - {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, + {file = "platformdirs-4.4.0-py3-none-any.whl", hash = "sha256:abd01743f24e5287cd7a5db3752faf1a2d65353f38ec26d98e25a6db65958c85"}, + {file = "platformdirs-4.4.0.tar.gz", hash = "sha256:ca753cf4d81dc309bc67b0ea38fd15dc97bc30ce419a7f58d13eb3bf14c4febf"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] -type = ["mypy (>=1.8)"] +docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.4)", "pytest-cov (>=6)", "pytest-mock (>=3.14)"] +type = ["mypy (>=1.14.1)"] [[package]] name = "pluggy" -version = "1.5.0" +version = "1.6.0" description = "plugin and hook calling mechanisms for python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, - {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, + {file = "pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746"}, + {file = "pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3"}, ] [package.extras] dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] +testing = ["coverage", "pytest", "pytest-benchmark"] [[package]] name = "pooch" @@ -700,56 +736,41 @@ sftp = ["paramiko (>=2.7.0)"] xxhash = ["xxhash (>=1.4.3)"] [[package]] -name = "pydap" -version = "3.4.1" -description = "An implementation of the Data Access Protocol." +name = "pygments" +version = "2.19.2" +description = "Pygments is a syntax highlighting package written in Python." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pydap-3.4.1-py3-none-any.whl", hash = "sha256:a24cc3bc8c78089542699382bf650d57a055c82bb72c342fa7caa6618b9e4417"}, - {file = "pydap-3.4.1.tar.gz", hash = "sha256:17c46087b53c6aec9bc5495a5d52aca19b2aa4b045f370b9f4b3a6058f5d8df7"}, + {file = "pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b"}, + {file = "pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887"}, ] -[package.dependencies] -beautifulsoup4 = "*" -docopt = "*" -Jinja2 = "*" -numpy = "*" -requests = "*" -six = ">=1.4.0" -Webob = "*" - [package.extras] -cas = ["lxml"] -docs = ["Pygments", "Sphinx", "sphinx-rtd-theme"] -functions = ["coards", "gsw (==3.0.6)"] -handlers-netcdf = ["netCDF4", "ordereddict"] -netcdf = ["netCDF4", "ordereddict"] -server = ["PasteDeploy", "gunicorn"] -testing = ["PasteDeploy", "WebTest", "beautifulsoup4", "coards", "flake8", "gsw (==3.0.6)", "gunicorn", "lxml", "netCDF4", "ordereddict", "pyopenssl", "pytest (>=3.6)", "pytest-attrib", "pytest-cov", "requests-mock", "werkzeug"] -tests = ["WebTest", "beautifulsoup4", "flake8", "pyopenssl", "pytest (>=3.6)", "pytest-attrib", "pytest-cov", "requests-mock", "werkzeug"] +windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pytest" -version = "8.2.2" +version = "8.4.2" description = "pytest: simple powerful testing with Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "pytest-8.2.2-py3-none-any.whl", hash = "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343"}, - {file = "pytest-8.2.2.tar.gz", hash = "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977"}, + {file = "pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79"}, + {file = "pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01"}, ] [package.dependencies] -colorama = {version = "*", markers = "sys_platform == \"win32\""} -exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} -iniconfig = "*" -packaging = "*" -pluggy = ">=1.5,<2.0" +colorama = {version = ">=0.4", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1", markers = "python_version < \"3.11\""} +iniconfig = ">=1" +packaging = ">=20" +pluggy = ">=1.5,<2" +pygments = ">=2.7.2" tomli = {version = ">=1", markers = "python_version < \"3.11\""} [package.extras] -dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "requests", "setuptools", "xmlschema"] [[package]] name = "python-dateutil" @@ -767,29 +788,104 @@ six = ">=1.5" [[package]] name = "pytz" -version = "2024.1" +version = "2025.2" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ - {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, - {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, + {file = "pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00"}, + {file = "pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3"}, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b"}, + {file = "pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956"}, + {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8"}, + {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198"}, + {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b"}, + {file = "pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0"}, + {file = "pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69"}, + {file = "pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e"}, + {file = "pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c"}, + {file = "pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e"}, + {file = "pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824"}, + {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c"}, + {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00"}, + {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d"}, + {file = "pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a"}, + {file = "pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4"}, + {file = "pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b"}, + {file = "pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf"}, + {file = "pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196"}, + {file = "pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0"}, + {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28"}, + {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c"}, + {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc"}, + {file = "pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e"}, + {file = "pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea"}, + {file = "pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5"}, + {file = "pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b"}, + {file = "pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd"}, + {file = "pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8"}, + {file = "pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1"}, + {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c"}, + {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5"}, + {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6"}, + {file = "pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6"}, + {file = "pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be"}, + {file = "pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26"}, + {file = "pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c"}, + {file = "pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb"}, + {file = "pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac"}, + {file = "pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310"}, + {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7"}, + {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788"}, + {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5"}, + {file = "pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764"}, + {file = "pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35"}, + {file = "pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac"}, + {file = "pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3"}, + {file = "pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3"}, + {file = "pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba"}, + {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c"}, + {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702"}, + {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c"}, + {file = "pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065"}, + {file = "pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65"}, + {file = "pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9"}, + {file = "pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b"}, + {file = "pyyaml-6.0.3-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da"}, + {file = "pyyaml-6.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917"}, + {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9"}, + {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5"}, + {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a"}, + {file = "pyyaml-6.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926"}, + {file = "pyyaml-6.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7"}, + {file = "pyyaml-6.0.3-cp39-cp39-win32.whl", hash = "sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0"}, + {file = "pyyaml-6.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007"}, + {file = "pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f"}, ] [[package]] name = "requests" -version = "2.32.3" +version = "2.32.5" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, - {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, + {file = "requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6"}, + {file = "requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf"}, ] [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" +charset_normalizer = ">=2,<4" idna = ">=2.5,<4" urllib3 = ">=1.21.1,<3" @@ -799,99 +895,161 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "scipy" -version = "1.13.1" +version = "1.15.3" description = "Fundamental algorithms for scientific computing in Python" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" files = [ - {file = "scipy-1.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:20335853b85e9a49ff7572ab453794298bcf0354d8068c5f6775a0eabf350aca"}, - {file = "scipy-1.13.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:d605e9c23906d1994f55ace80e0125c587f96c020037ea6aa98d01b4bd2e222f"}, - {file = "scipy-1.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cfa31f1def5c819b19ecc3a8b52d28ffdcc7ed52bb20c9a7589669dd3c250989"}, - {file = "scipy-1.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26264b282b9da0952a024ae34710c2aff7d27480ee91a2e82b7b7073c24722f"}, - {file = "scipy-1.13.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:eccfa1906eacc02de42d70ef4aecea45415f5be17e72b61bafcfd329bdc52e94"}, - {file = "scipy-1.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:2831f0dc9c5ea9edd6e51e6e769b655f08ec6db6e2e10f86ef39bd32eb11da54"}, - {file = "scipy-1.13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:27e52b09c0d3a1d5b63e1105f24177e544a222b43611aaf5bc44d4a0979e32f9"}, - {file = "scipy-1.13.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:54f430b00f0133e2224c3ba42b805bfd0086fe488835effa33fa291561932326"}, - {file = "scipy-1.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e89369d27f9e7b0884ae559a3a956e77c02114cc60a6058b4e5011572eea9299"}, - {file = "scipy-1.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a78b4b3345f1b6f68a763c6e25c0c9a23a9fd0f39f5f3d200efe8feda560a5fa"}, - {file = "scipy-1.13.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:45484bee6d65633752c490404513b9ef02475b4284c4cfab0ef946def50b3f59"}, - {file = "scipy-1.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:5713f62f781eebd8d597eb3f88b8bf9274e79eeabf63afb4a737abc6c84ad37b"}, - {file = "scipy-1.13.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5d72782f39716b2b3509cd7c33cdc08c96f2f4d2b06d51e52fb45a19ca0c86a1"}, - {file = "scipy-1.13.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:017367484ce5498445aade74b1d5ab377acdc65e27095155e448c88497755a5d"}, - {file = "scipy-1.13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:949ae67db5fa78a86e8fa644b9a6b07252f449dcf74247108c50e1d20d2b4627"}, - {file = "scipy-1.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de3ade0e53bc1f21358aa74ff4830235d716211d7d077e340c7349bc3542e884"}, - {file = "scipy-1.13.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2ac65fb503dad64218c228e2dc2d0a0193f7904747db43014645ae139c8fad16"}, - {file = "scipy-1.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:cdd7dacfb95fea358916410ec61bbc20440f7860333aee6d882bb8046264e949"}, - {file = "scipy-1.13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:436bbb42a94a8aeef855d755ce5a465479c721e9d684de76bf61a62e7c2b81d5"}, - {file = "scipy-1.13.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:8335549ebbca860c52bf3d02f80784e91a004b71b059e3eea9678ba994796a24"}, - {file = "scipy-1.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d533654b7d221a6a97304ab63c41c96473ff04459e404b83275b60aa8f4b7004"}, - {file = "scipy-1.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:637e98dcf185ba7f8e663e122ebf908c4702420477ae52a04f9908707456ba4d"}, - {file = "scipy-1.13.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a014c2b3697bde71724244f63de2476925596c24285c7a637364761f8710891c"}, - {file = "scipy-1.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:392e4ec766654852c25ebad4f64e4e584cf19820b980bc04960bca0b0cd6eaa2"}, - {file = "scipy-1.13.1.tar.gz", hash = "sha256:095a87a0312b08dfd6a6155cbbd310a8c51800fc931b8c0b84003014b874ed3c"}, + {file = "scipy-1.15.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:a345928c86d535060c9c2b25e71e87c39ab2f22fc96e9636bd74d1dbf9de448c"}, + {file = "scipy-1.15.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:ad3432cb0f9ed87477a8d97f03b763fd1d57709f1bbde3c9369b1dff5503b253"}, + {file = "scipy-1.15.3-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:aef683a9ae6eb00728a542b796f52a5477b78252edede72b8327a886ab63293f"}, + {file = "scipy-1.15.3-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:1c832e1bd78dea67d5c16f786681b28dd695a8cb1fb90af2e27580d3d0967e92"}, + {file = "scipy-1.15.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:263961f658ce2165bbd7b99fa5135195c3a12d9bef045345016b8b50c315cb82"}, + {file = "scipy-1.15.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2abc762b0811e09a0d3258abee2d98e0c703eee49464ce0069590846f31d40"}, + {file = "scipy-1.15.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ed7284b21a7a0c8f1b6e5977ac05396c0d008b89e05498c8b7e8f4a1423bba0e"}, + {file = "scipy-1.15.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5380741e53df2c566f4d234b100a484b420af85deb39ea35a1cc1be84ff53a5c"}, + {file = "scipy-1.15.3-cp310-cp310-win_amd64.whl", hash = "sha256:9d61e97b186a57350f6d6fd72640f9e99d5a4a2b8fbf4b9ee9a841eab327dc13"}, + {file = "scipy-1.15.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:993439ce220d25e3696d1b23b233dd010169b62f6456488567e830654ee37a6b"}, + {file = "scipy-1.15.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:34716e281f181a02341ddeaad584205bd2fd3c242063bd3423d61ac259ca7eba"}, + {file = "scipy-1.15.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3b0334816afb8b91dab859281b1b9786934392aa3d527cd847e41bb6f45bee65"}, + {file = "scipy-1.15.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:6db907c7368e3092e24919b5e31c76998b0ce1684d51a90943cb0ed1b4ffd6c1"}, + {file = "scipy-1.15.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:721d6b4ef5dc82ca8968c25b111e307083d7ca9091bc38163fb89243e85e3889"}, + {file = "scipy-1.15.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39cb9c62e471b1bb3750066ecc3a3f3052b37751c7c3dfd0fd7e48900ed52982"}, + {file = "scipy-1.15.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:795c46999bae845966368a3c013e0e00947932d68e235702b5c3f6ea799aa8c9"}, + {file = "scipy-1.15.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:18aaacb735ab38b38db42cb01f6b92a2d0d4b6aabefeb07f02849e47f8fb3594"}, + {file = "scipy-1.15.3-cp311-cp311-win_amd64.whl", hash = "sha256:ae48a786a28412d744c62fd7816a4118ef97e5be0bee968ce8f0a2fba7acf3bb"}, + {file = "scipy-1.15.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6ac6310fdbfb7aa6612408bd2f07295bcbd3fda00d2d702178434751fe48e019"}, + {file = "scipy-1.15.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:185cd3d6d05ca4b44a8f1595af87f9c372bb6acf9c808e99aa3e9aa03bd98cf6"}, + {file = "scipy-1.15.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:05dc6abcd105e1a29f95eada46d4a3f251743cfd7d3ae8ddb4088047f24ea477"}, + {file = "scipy-1.15.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:06efcba926324df1696931a57a176c80848ccd67ce6ad020c810736bfd58eb1c"}, + {file = "scipy-1.15.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05045d8b9bfd807ee1b9f38761993297b10b245f012b11b13b91ba8945f7e45"}, + {file = "scipy-1.15.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:271e3713e645149ea5ea3e97b57fdab61ce61333f97cfae392c28ba786f9bb49"}, + {file = "scipy-1.15.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6cfd56fc1a8e53f6e89ba3a7a7251f7396412d655bca2aa5611c8ec9a6784a1e"}, + {file = "scipy-1.15.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ff17c0bb1cb32952c09217d8d1eed9b53d1463e5f1dd6052c7857f83127d539"}, + {file = "scipy-1.15.3-cp312-cp312-win_amd64.whl", hash = "sha256:52092bc0472cfd17df49ff17e70624345efece4e1a12b23783a1ac59a1b728ed"}, + {file = "scipy-1.15.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2c620736bcc334782e24d173c0fdbb7590a0a436d2fdf39310a8902505008759"}, + {file = "scipy-1.15.3-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:7e11270a000969409d37ed399585ee530b9ef6aa99d50c019de4cb01e8e54e62"}, + {file = "scipy-1.15.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:8c9ed3ba2c8a2ce098163a9bdb26f891746d02136995df25227a20e71c396ebb"}, + {file = "scipy-1.15.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:0bdd905264c0c9cfa74a4772cdb2070171790381a5c4d312c973382fc6eaf730"}, + {file = "scipy-1.15.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79167bba085c31f38603e11a267d862957cbb3ce018d8b38f79ac043bc92d825"}, + {file = "scipy-1.15.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9deabd6d547aee2c9a81dee6cc96c6d7e9a9b1953f74850c179f91fdc729cb7"}, + {file = "scipy-1.15.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dde4fc32993071ac0c7dd2d82569e544f0bdaff66269cb475e0f369adad13f11"}, + {file = "scipy-1.15.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f77f853d584e72e874d87357ad70f44b437331507d1c311457bed8ed2b956126"}, + {file = "scipy-1.15.3-cp313-cp313-win_amd64.whl", hash = "sha256:b90ab29d0c37ec9bf55424c064312930ca5f4bde15ee8619ee44e69319aab163"}, + {file = "scipy-1.15.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3ac07623267feb3ae308487c260ac684b32ea35fd81e12845039952f558047b8"}, + {file = "scipy-1.15.3-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:6487aa99c2a3d509a5227d9a5e889ff05830a06b2ce08ec30df6d79db5fcd5c5"}, + {file = "scipy-1.15.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:50f9e62461c95d933d5c5ef4a1f2ebf9a2b4e83b0db374cb3f1de104d935922e"}, + {file = "scipy-1.15.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:14ed70039d182f411ffc74789a16df3835e05dc469b898233a245cdfd7f162cb"}, + {file = "scipy-1.15.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a769105537aa07a69468a0eefcd121be52006db61cdd8cac8a0e68980bbb723"}, + {file = "scipy-1.15.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9db984639887e3dffb3928d118145ffe40eff2fa40cb241a306ec57c219ebbbb"}, + {file = "scipy-1.15.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:40e54d5c7e7ebf1aa596c374c49fa3135f04648a0caabcb66c52884b943f02b4"}, + {file = "scipy-1.15.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5e721fed53187e71d0ccf382b6bf977644c533e506c4d33c3fb24de89f5c3ed5"}, + {file = "scipy-1.15.3-cp313-cp313t-win_amd64.whl", hash = "sha256:76ad1fb5f8752eabf0fa02e4cc0336b4e8f021e2d5f061ed37d6d264db35e3ca"}, + {file = "scipy-1.15.3.tar.gz", hash = "sha256:eae3cf522bc7df64b42cad3925c876e1b0b6c35c1337c93e12c0f366f55b0eaf"}, ] [package.dependencies] -numpy = ">=1.22.4,<2.3" +numpy = ">=1.23.5,<2.5" [package.extras] -dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] -doc = ["jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.12.0)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0)", "sphinx-design (>=0.4.0)"] -test = ["array-api-strict", "asv", "gmpy2", "hypothesis (>=6.30)", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodestyle", "pydevtool", "rich-click", "ruff (>=0.0.292)", "types-psutil", "typing_extensions"] +doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.19.1)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.0.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)"] +test = ["Cython", "array-api-strict (>=2.0,<2.1.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "six" -version = "1.16.0" +version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, +] + +[[package]] +name = "tomli" +version = "2.2.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.8" files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, + {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, + {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, + {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, + {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, + {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, + {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, + {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, + {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, ] [[package]] -name = "soupsieve" -version = "2.5" -description = "A modern CSS selector implementation for Beautiful Soup." +name = "toolz" +version = "1.0.0" +description = "List processing tools and functional utilities" optional = false python-versions = ">=3.8" files = [ - {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, - {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, + {file = "toolz-1.0.0-py3-none-any.whl", hash = "sha256:292c8f1c4e7516bf9086f8850935c799a874039c8bcf959d47b600e4c44a6236"}, + {file = "toolz-1.0.0.tar.gz", hash = "sha256:2c86e3d9a04798ac556793bced838816296a2f085017664e4995cb40a1047a02"}, ] [[package]] -name = "tomli" -version = "2.0.1" -description = "A lil' TOML parser" +name = "typing-extensions" +version = "4.15.0" +description = "Backported and Experimental Type Hints for Python 3.9+" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, + {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"}, + {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"}, ] [[package]] name = "tzdata" -version = "2024.1" +version = "2025.2" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" files = [ - {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, - {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, + {file = "tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8"}, + {file = "tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9"}, ] [[package]] name = "urllib3" -version = "2.2.2" +version = "2.5.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, - {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, + {file = "urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc"}, + {file = "urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760"}, ] [package.extras] @@ -900,30 +1058,15 @@ h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] -[[package]] -name = "webob" -version = "1.8.7" -description = "WSGI request and response object" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*" -files = [ - {file = "WebOb-1.8.7-py2.py3-none-any.whl", hash = "sha256:73aae30359291c14fa3b956f8b5ca31960e420c28c1bec002547fb04928cf89b"}, - {file = "WebOb-1.8.7.tar.gz", hash = "sha256:b64ef5141be559cfade448f044fa45c2260351edcb6a8ef6b7e00c7dcef0c323"}, -] - -[package.extras] -docs = ["Sphinx (>=1.7.5)", "pylons-sphinx-themes"] -testing = ["coverage", "pytest (>=3.1.0)", "pytest-cov", "pytest-xdist"] - [[package]] name = "xarray" -version = "2024.6.0" +version = "2025.6.1" description = "N-D labeled arrays and datasets in Python" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" files = [ - {file = "xarray-2024.6.0-py3-none-any.whl", hash = "sha256:721a7394e8ec3d592b2d8ebe21eed074ac077dc1bb1bd777ce00e41700b4866c"}, - {file = "xarray-2024.6.0.tar.gz", hash = "sha256:0b91e0bc4dc0296947947640fe31ec6e867ce258d2f7cbc10bedf4a6d68340c7"}, + {file = "xarray-2025.6.1-py3-none-any.whl", hash = "sha256:8b988b47f67a383bdc3b04c5db475cd165e580134c1f1943d52aee4a9c97651b"}, + {file = "xarray-2025.6.1.tar.gz", hash = "sha256:a84f3f07544634a130d7dc615ae44175419f4c77957a7255161ed99c69c7c8b0"}, ] [package.dependencies] @@ -931,44 +1074,63 @@ cftime = {version = "*", optional = true, markers = "extra == \"io\""} fsspec = {version = "*", optional = true, markers = "extra == \"io\""} h5netcdf = {version = "*", optional = true, markers = "extra == \"io\""} netCDF4 = {version = "*", optional = true, markers = "extra == \"io\""} -numpy = ">=1.23" -packaging = ">=23.1" -pandas = ">=2.0" +numpy = ">=1.24" +packaging = ">=23.2" +pandas = ">=2.1" pooch = {version = "*", optional = true, markers = "extra == \"io\""} -pydap = {version = "*", optional = true, markers = "python_version < \"3.10\" and extra == \"io\""} scipy = {version = "*", optional = true, markers = "extra == \"io\""} zarr = {version = "*", optional = true, markers = "extra == \"io\""} [package.extras] -accel = ["bottleneck", "flox", "numbagg", "opt-einsum", "scipy"] -complete = ["xarray[accel,dev,io,parallel,viz]"] -dev = ["hypothesis", "mypy", "pre-commit", "pytest", "pytest-cov", "pytest-env", "pytest-timeout", "pytest-xdist", "ruff", "xarray[complete]"] +accel = ["bottleneck", "flox", "numba (>=0.54)", "numbagg", "opt_einsum", "scipy"] +complete = ["xarray[accel,etc,io,parallel,viz]"] +etc = ["sparse"] io = ["cftime", "fsspec", "h5netcdf", "netCDF4", "pooch", "pydap", "scipy", "zarr"] parallel = ["dask[complete]"] -viz = ["matplotlib", "nc-time-axis", "seaborn"] +types = ["pandas-stubs", "scipy-stubs", "types-PyYAML", "types-Pygments", "types-colorama", "types-decorator", "types-defusedxml", "types-docutils", "types-networkx", "types-openpyxl", "types-pexpect", "types-psutil", "types-pycurl", "types-python-dateutil", "types-pytz", "types-setuptools"] +viz = ["cartopy", "matplotlib", "nc-time-axis", "seaborn"] [[package]] name = "zarr" -version = "2.18.2" +version = "2.18.3" description = "An implementation of chunked, compressed, N-dimensional arrays for Python" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" files = [ - {file = "zarr-2.18.2-py3-none-any.whl", hash = "sha256:a638754902f97efa99b406083fdc807a0e2ccf12a949117389d2a4ba9b05df38"}, - {file = "zarr-2.18.2.tar.gz", hash = "sha256:9bb393b8a0a38fb121dbb913b047d75db28de9890f6d644a217a73cf4ae74f47"}, + {file = "zarr-2.18.3-py3-none-any.whl", hash = "sha256:b1f7dfd2496f436745cdd4c7bcf8d3b4bc1dceef5fdd0d589c87130d842496dd"}, + {file = "zarr-2.18.3.tar.gz", hash = "sha256:2580d8cb6dd84621771a10d31c4d777dca8a27706a1a89b29f42d2d37e2df5ce"}, ] [package.dependencies] asciitree = "*" fasteners = {version = "*", markers = "sys_platform != \"emscripten\""} numcodecs = ">=0.10.0" -numpy = ">=1.23" +numpy = ">=1.24" [package.extras] docs = ["numcodecs[msgpack]", "numpydoc", "pydata-sphinx-theme", "sphinx", "sphinx-automodapi", "sphinx-copybutton", "sphinx-design", "sphinx-issues"] jupyter = ["ipytree (>=0.2.2)", "ipywidgets (>=8.0.0)", "notebook"] +[[package]] +name = "zipp" +version = "3.23.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +optional = false +python-versions = ">=3.9" +files = [ + {file = "zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e"}, + {file = "zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166"}, +] + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["big-O", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more_itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] +type = ["pytest-mypy"] + [metadata] lock-version = "2.0" -python-versions = ">=3.9" -content-hash = "63845dc148feaa351fc20955b5fc706e2f13e525d1025e09ff63bd1c8d024a91" +python-versions = ">=3.10" +content-hash = "a10be91a54ea04a478a2ec3154d3bc61b7bfe52bf851336205b2125f524c9b7a" diff --git a/pyproject.toml b/pyproject.toml index cd5849c..f1f63ca 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,7 +11,7 @@ include = [ ] [tool.poetry.dependencies] -python = ">=3.9" +python = ">=3.10" numpy = "*" xarray = "*" @@ -22,6 +22,7 @@ selafin = "xarray_selafin.xarray_backend:SelafinBackendEntrypoint" pytest = "*" scipy = "*" xarray = {version = "*", extras = ["io"]} +dask = "*" [build-system] requires = ["poetry-core"] diff --git a/requirements/requirements-dev.txt b/requirements/requirements-dev.txt index 4ddf28c..e12d26e 100644 --- a/requirements/requirements-dev.txt +++ b/requirements/requirements-dev.txt @@ -1,440 +1,550 @@ -asciitree==0.3.3 ; python_version >= "3.9" \ +asciitree==0.3.3 ; python_version >= "3.10" \ --hash=sha256:4aa4b9b649f85e3fcb343363d97564aa1fb62e249677f2e18a96765145cc0f6e -beautifulsoup4==4.12.3 ; python_version < "3.10" and python_version >= "3.9" \ - --hash=sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051 \ - --hash=sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed -certifi==2024.6.2 ; python_version >= "3.9" \ - --hash=sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516 \ - --hash=sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56 -cftime==1.6.4 ; python_version >= "3.9" \ - --hash=sha256:03494e7b66a2fbb6b04e364ab67185130dee0ced660abac5c1559070571d143d \ - --hash=sha256:0b47bf25195fb3889bbae34df0e80957eb69c48f66902f5d538c7a8ec34253f6 \ - --hash=sha256:0edeb1cb019d8155b2513cffb96749c0d7d459370e69bdf03077e0bee214aed8 \ - --hash=sha256:1289e08617be350a6b26c6e4352a0cb088625ac33d25e95110df549c26d6ab8e \ - --hash=sha256:18b132d9225b4a109929866200846c72302316db9069e2de3ec8d8ec377f567f \ - --hash=sha256:25f043703e785de0bd7cd8222c0a53317e9aeb3dfc062588b05e6f3ebb007468 \ - --hash=sha256:3c349a91fa7ac9ec50118b04a8746bdea967bd2fc525d87c776003040b8d3392 \ - --hash=sha256:4dcb2a01d4e614437582af33b36db4fb441b7666758482864827a1f037d2b639 \ - --hash=sha256:567574df94d0de1101bb5da76e7fbc6eabfddeeb2eb8cf83286b3599a136bbf7 \ - --hash=sha256:588d073400798adc24ece759cd1cb24ef730f55d1f70e31a898e7686f9d763d8 \ - --hash=sha256:5b5ad7559a16bedadb66af8e417b6805f758acb57aa38d2730844dfc63a1e667 \ - --hash=sha256:6e07b91b488570573bbeb6f815656a8974d13d15b2279c82de2927f4f692bbcd \ - --hash=sha256:6fc82928cbf477bebf233f41914e64bff7b9e894c7f0c34170784a48250f8da7 \ - --hash=sha256:76b8f1e5d1e424accdf760a43e0a1793a7b640bab83cb067273d5c9dbb336c44 \ - --hash=sha256:90609b3c1a31a756a68ecdbc961a4ce0b22c1620f166c8dabfa3a4c337ac8b9e \ - --hash=sha256:a8f05d5d6bb4137f9783fa61ad330030fcea8dcc6946dea69a27774edbe480e7 \ - --hash=sha256:b32ac1278a2a111b066d5a1e6e5ce6f38c4c505993a6a3130873b56f99d7b56f \ - --hash=sha256:bbe11ad73b2a0ddc79995da21459fc2a3fd6b1593ca73f00a60e4d81c3e230f3 \ - --hash=sha256:c05a71389f53d6340cb365b60f028c08268c72401660b9ef76108dee9f1cb5b2 \ - --hash=sha256:c072fe9e09925af66a9473edf5752ca1890ba752e7c1935d1f0245ad48f0977c \ - --hash=sha256:c1558d9b477bd29626cd8bfc89e736635f72887d1a993e2834ab579bba7abb8c \ - --hash=sha256:c20f03e12af39534c3450bba376272803bfb850b5ce6433c839bfaa99f8d835a \ - --hash=sha256:ca1a264570e68fbb611bba251641b8efd0cf88c0ad2dcab5fa784df264232b75 \ - --hash=sha256:d4f2cc0d5c6ffba9c5b0fd1ecd0c7c1c426d0be7b8de1480e2a9fb857c1905e9 \ - --hash=sha256:e325406193758a7ed67308deb52e727782a19e384e183378e7ff62098be0aedc \ - --hash=sha256:e5456fd58d4cc6b8d7b4932b749617ee142b62a52bc5d8e3c282ce69ce3a20ba \ - --hash=sha256:e8467b6fbf8dbfe0be8c04d61180765fdd3b9ab0fe51313a0bbf87e63634a3d8 \ - --hash=sha256:ee70074df4bae0d9ee98f201cf5f11fd302791cf1cdeb73c34f685d6b632e17d \ - --hash=sha256:f92f2e405eeda47b30ab6231d8b7d136a55f21034d394f93ade322d356948654 \ - --hash=sha256:f9acc272df1022f24fe7dbe9de43fa5d8271985161df14549e4d8d28c90dc9ea -charset-normalizer==3.3.2 ; python_version >= "3.9" \ - --hash=sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027 \ - --hash=sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087 \ - --hash=sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786 \ - --hash=sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8 \ - --hash=sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09 \ - --hash=sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185 \ - --hash=sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574 \ - --hash=sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e \ - --hash=sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519 \ - --hash=sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898 \ - --hash=sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269 \ - --hash=sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3 \ - --hash=sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f \ - --hash=sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6 \ - --hash=sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8 \ - --hash=sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a \ - --hash=sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73 \ - --hash=sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc \ - --hash=sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714 \ - --hash=sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2 \ - --hash=sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc \ - --hash=sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce \ - --hash=sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d \ - --hash=sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e \ - --hash=sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6 \ - --hash=sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269 \ - --hash=sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96 \ - --hash=sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d \ - --hash=sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a \ - --hash=sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4 \ - --hash=sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77 \ - --hash=sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d \ - --hash=sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0 \ - --hash=sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed \ - --hash=sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068 \ - --hash=sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac \ - --hash=sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25 \ - --hash=sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8 \ - --hash=sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab \ - --hash=sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26 \ - --hash=sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2 \ - --hash=sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db \ - --hash=sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f \ - --hash=sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5 \ - --hash=sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99 \ - --hash=sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c \ - --hash=sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d \ - --hash=sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811 \ - --hash=sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa \ - --hash=sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a \ - --hash=sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03 \ - --hash=sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b \ - --hash=sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04 \ - --hash=sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c \ - --hash=sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001 \ - --hash=sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458 \ - --hash=sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389 \ - --hash=sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99 \ - --hash=sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985 \ - --hash=sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537 \ - --hash=sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238 \ - --hash=sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f \ - --hash=sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d \ - --hash=sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796 \ - --hash=sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a \ - --hash=sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143 \ - --hash=sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8 \ - --hash=sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c \ - --hash=sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5 \ - --hash=sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5 \ - --hash=sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711 \ - --hash=sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4 \ - --hash=sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6 \ - --hash=sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c \ - --hash=sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7 \ - --hash=sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4 \ - --hash=sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b \ - --hash=sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae \ - --hash=sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12 \ - --hash=sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c \ - --hash=sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae \ - --hash=sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8 \ - --hash=sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887 \ - --hash=sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b \ - --hash=sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4 \ - --hash=sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f \ - --hash=sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5 \ - --hash=sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33 \ - --hash=sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519 \ - --hash=sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561 -colorama==0.4.6 ; python_version >= "3.9" and sys_platform == "win32" \ +certifi==2025.10.5 ; python_version >= "3.10" \ + --hash=sha256:0f212c2744a9bb6de0c56639a6f68afe01ecd92d91f14ae897c4fe7bbeeef0de \ + --hash=sha256:47c09d31ccf2acf0be3f701ea53595ee7e0b8fa08801c6624be771df09ae7b43 +cftime==1.6.4.post1 ; python_version >= "3.10" \ + --hash=sha256:0baa9bc4850929da9f92c25329aa1f651e2d6f23e237504f337ee9e12a769f5d \ + --hash=sha256:0ee2f5af8643aa1b47b7e388763a1a6e0dc05558cd2902cffb9cbcf954397648 \ + --hash=sha256:0f64ca83acc4e3029f737bf3a32530ffa1fbf53124f5bee70b47548bc58671a7 \ + --hash=sha256:1bf7be0a0afc87628cb8c8483412aac6e48e83877004faa0936afb5bf8a877ba \ + --hash=sha256:1dcd1b140bf50da6775c56bd7ca179e84bd258b2f159b53eefd5c514b341f2bf \ + --hash=sha256:24a7fb6cc541a027dab37fdeb695f8a2b21cd7d200be606f81b5abc38f2391e2 \ + --hash=sha256:2892b7e7654142d825655f60eb66c3e1af745901890316907071d44cf9a18d8a \ + --hash=sha256:44e9f8052600803b55f8cb6bcac2be49405c21efa900ec77a9fb7f692db2f7a6 \ + --hash=sha256:50ac76cc9f10ab7bd46e44a71c51a6927051b499b4407df4f29ab13d741b942f \ + --hash=sha256:568b69fc52f406e361db62a4d7a219c6fb0ced138937144c3b3a511648dd6c50 \ + --hash=sha256:5835b9d622f9304d1c23a35603a0f068739f428d902860f25e6e7e5a1b7cd8ea \ + --hash=sha256:5c89766ebf088c097832ea618c24ed5075331f0b7bf8e9c2d4144aefbf2f1850 \ + --hash=sha256:5dcfc872f455db1f12eabe3c3ba98e93757cd60ed3526a53246e966ccde46c8a \ + --hash=sha256:640911d2629f4a8f81f6bc0163a983b6b94f86d1007449b8cbfd926136cda253 \ + --hash=sha256:652700130dbcca3ae36dbb5b61ff360e62aa09fabcabc42ec521091a14389901 \ + --hash=sha256:6579c5c83cdf09d73aa94c7bc34925edd93c5f2c7dd28e074f568f7e376271a0 \ + --hash=sha256:6b731c7133d17b479ca0c3c46a7a04f96197f0a4d753f4c2284c3ff0447279b4 \ + --hash=sha256:6bb6b087f4b2513c37670bccd457e2a666ca489c5f2aad6e2c0e94604dc1b5b9 \ + --hash=sha256:7d9bdeb9174962c9ca00015190bfd693de6b0ec3ec0b3dbc35c693a4f48efdcc \ + --hash=sha256:7f27113f7ccd1ca32881fdcb9a4bec806a5f54ae621fc1c374f1171f3ed98ef2 \ + --hash=sha256:7f50bf0d1b664924aaee636eb2933746b942417d1f8b82ab6c1f6e8ba0da6885 \ + --hash=sha256:800a18aea4e8cb2b206450397cb8a53b154798738af3cdd3c922ce1ca198b0e6 \ + --hash=sha256:8e18021f421aa26527bad8688c1acf0c85fa72730beb6efce969c316743294f2 \ + --hash=sha256:933cb10e1af4e362e77f513e3eb92b34a688729ddbf938bbdfa5ac20a7f44ba0 \ + --hash=sha256:9df3e2d49e548c62d1939e923800b08d2ab732d3ac8d75b857edd7982c878552 \ + --hash=sha256:a4ab54e6c04e68395d454cd4001188fc4ade2fe48035589ed65af80c4527ef08 \ + --hash=sha256:a590f73506f4704ba5e154ef55bfbaed5e1b4ac170f3caeb8c58e4f2c619ee4e \ + --hash=sha256:a90b6ef4a3fc65322c212a2c99cec75d1886f1ebaf0ff6189f7b327566762222 \ + --hash=sha256:c9ea0965a4c87739aebd84fe8eed966e5809d10065eeffd35c99c274b6f8da15 \ + --hash=sha256:cf17a1b36f62e9e73c4c9363dd811e1bbf1170f5ac26d343fb26012ccf482908 \ + --hash=sha256:d2a8c223faea7f1248ab469cc0d7795dd46f2a423789038f439fee7190bae259 \ + --hash=sha256:d7ebdfd81726b0cfb8b524309224fa952898dfa177c13d5f6af5b18cefbf497d \ + --hash=sha256:da367b23eea7cf4df071c88e014a1600d6c5bbf22e3393a4af409903fa397e28 \ + --hash=sha256:e60b8f24b20753f7548f410f7510e28b941f336f84bd34e3cfd7874af6e70281 \ + --hash=sha256:e735cfd544878eb94d0108ff5a093bd1a332dba90f979a31a357756d609a90d5 \ + --hash=sha256:fc2c0abe2dbd147e1b1e6d0f3de19a5ea8b04956acc204830fd8418066090989 +charset-normalizer==3.4.3 ; python_version >= "3.10" \ + --hash=sha256:00237675befef519d9af72169d8604a067d92755e84fe76492fef5441db05b91 \ + --hash=sha256:02425242e96bcf29a49711b0ca9f37e451da7c70562bc10e8ed992a5a7a25cc0 \ + --hash=sha256:027b776c26d38b7f15b26a5da1044f376455fb3766df8fc38563b4efbc515154 \ + --hash=sha256:07a0eae9e2787b586e129fdcbe1af6997f8d0e5abaa0bc98c0e20e124d67e601 \ + --hash=sha256:0cacf8f7297b0c4fcb74227692ca46b4a5852f8f4f24b3c766dd94a1075c4884 \ + --hash=sha256:0e78314bdc32fa80696f72fa16dc61168fda4d6a0c014e0380f9d02f0e5d8a07 \ + --hash=sha256:0f2be7e0cf7754b9a30eb01f4295cc3d4358a479843b31f328afd210e2c7598c \ + --hash=sha256:13faeacfe61784e2559e690fc53fa4c5ae97c6fcedb8eb6fb8d0a15b475d2c64 \ + --hash=sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe \ + --hash=sha256:1606f4a55c0fd363d754049cdf400175ee96c992b1f8018b993941f221221c5f \ + --hash=sha256:16a8770207946ac75703458e2c743631c79c59c5890c80011d536248f8eaa432 \ + --hash=sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc \ + --hash=sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa \ + --hash=sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9 \ + --hash=sha256:1e8ac75d72fa3775e0b7cb7e4629cec13b7514d928d15ef8ea06bca03ef01cae \ + --hash=sha256:1ef99f0456d3d46a50945c98de1774da86f8e992ab5c77865ea8b8195341fc19 \ + --hash=sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d \ + --hash=sha256:23b6b24d74478dc833444cbd927c338349d6ae852ba53a0d02a2de1fce45b96e \ + --hash=sha256:252098c8c7a873e17dd696ed98bbe91dbacd571da4b87df3736768efa7a792e4 \ + --hash=sha256:257f26fed7d7ff59921b78244f3cd93ed2af1800ff048c33f624c87475819dd7 \ + --hash=sha256:2c322db9c8c89009a990ef07c3bcc9f011a3269bc06782f916cd3d9eed7c9312 \ + --hash=sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92 \ + --hash=sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31 \ + --hash=sha256:31a9a6f775f9bcd865d88ee350f0ffb0e25936a7f930ca98995c05abf1faf21c \ + --hash=sha256:320e8e66157cc4e247d9ddca8e21f427efc7a04bbd0ac8a9faf56583fa543f9f \ + --hash=sha256:34a7f768e3f985abdb42841e20e17b330ad3aaf4bb7e7aeeb73db2e70f077b99 \ + --hash=sha256:3653fad4fe3ed447a596ae8638b437f827234f01a8cd801842e43f3d0a6b281b \ + --hash=sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15 \ + --hash=sha256:3cfb2aad70f2c6debfbcb717f23b7eb55febc0bb23dcffc0f076009da10c6392 \ + --hash=sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f \ + --hash=sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8 \ + --hash=sha256:42e5088973e56e31e4fa58eb6bd709e42fc03799c11c42929592889a2e54c491 \ + --hash=sha256:4ca4c094de7771a98d7fbd67d9e5dbf1eb73efa4f744a730437d8a3a5cf994f0 \ + --hash=sha256:511729f456829ef86ac41ca78c63a5cb55240ed23b4b737faca0eb1abb1c41bc \ + --hash=sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0 \ + --hash=sha256:585f3b2a80fbd26b048a0be90c5aae8f06605d3c92615911c3a2b03a8a3b796f \ + --hash=sha256:5b413b0b1bfd94dbf4023ad6945889f374cd24e3f62de58d6bb102c4d9ae534a \ + --hash=sha256:5d8d01eac18c423815ed4f4a2ec3b439d654e55ee4ad610e153cf02faf67ea40 \ + --hash=sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927 \ + --hash=sha256:6cf8fd4c04756b6b60146d98cd8a77d0cdae0e1ca20329da2ac85eed779b6849 \ + --hash=sha256:6fb70de56f1859a3f71261cbe41005f56a7842cc348d3aeb26237560bfa5e0ce \ + --hash=sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14 \ + --hash=sha256:70bfc5f2c318afece2f5838ea5e4c3febada0be750fcf4775641052bbba14d05 \ + --hash=sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c \ + --hash=sha256:74d77e25adda8581ffc1c720f1c81ca082921329452eba58b16233ab1842141c \ + --hash=sha256:78deba4d8f9590fe4dae384aeff04082510a709957e968753ff3c48399f6f92a \ + --hash=sha256:86df271bf921c2ee3818f0522e9a5b8092ca2ad8b065ece5d7d9d0e9f4849bcc \ + --hash=sha256:88ab34806dea0671532d3f82d82b85e8fc23d7b2dd12fa837978dad9bb392a34 \ + --hash=sha256:8999f965f922ae054125286faf9f11bc6932184b93011d138925a1773830bbe9 \ + --hash=sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096 \ + --hash=sha256:939578d9d8fd4299220161fdd76e86c6a251987476f5243e8864a7844476ba14 \ + --hash=sha256:96b2b3d1a83ad55310de8c7b4a2d04d9277d5591f40761274856635acc5fcb30 \ + --hash=sha256:a2d08ac246bb48479170408d6c19f6385fa743e7157d716e144cad849b2dd94b \ + --hash=sha256:b256ee2e749283ef3ddcff51a675ff43798d92d746d1a6e4631bf8c707d22d0b \ + --hash=sha256:b5e3b2d152e74e100a9e9573837aba24aab611d39428ded46f4e4022ea7d1942 \ + --hash=sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db \ + --hash=sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5 \ + --hash=sha256:c60e092517a73c632ec38e290eba714e9627abe9d301c8c8a12ec32c314a2a4b \ + --hash=sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce \ + --hash=sha256:c6e490913a46fa054e03699c70019ab869e990270597018cef1d8562132c2669 \ + --hash=sha256:c6f162aabe9a91a309510d74eeb6507fab5fff92337a15acbe77753d88d9dcf0 \ + --hash=sha256:c6fd51128a41297f5409deab284fecbe5305ebd7e5a1f959bee1c054622b7018 \ + --hash=sha256:cc34f233c9e71701040d772aa7490318673aa7164a0efe3172b2981218c26d93 \ + --hash=sha256:cc9370a2da1ac13f0153780040f465839e6cccb4a1e44810124b4e22483c93fe \ + --hash=sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049 \ + --hash=sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a \ + --hash=sha256:cf1ebb7d78e1ad8ec2a8c4732c7be2e736f6e5123a4146c5b89c9d1f585f8cef \ + --hash=sha256:d0e909868420b7049dafd3a31d45125b31143eec59235311fc4c57ea26a4acd2 \ + --hash=sha256:d22dbedd33326a4a5190dd4fe9e9e693ef12160c77382d9e87919bce54f3d4ca \ + --hash=sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16 \ + --hash=sha256:d79c198e27580c8e958906f803e63cddb77653731be08851c7df0b1a14a8fc0f \ + --hash=sha256:d95bfb53c211b57198bb91c46dd5a2d8018b3af446583aab40074bf7988401cb \ + --hash=sha256:e28e334d3ff134e88989d90ba04b47d84382a828c061d0d1027b1b12a62b39b1 \ + --hash=sha256:ec557499516fc90fd374bf2e32349a2887a876fbf162c160e3c01b6849eaf557 \ + --hash=sha256:fb6fecfd65564f208cbf0fba07f107fb661bcd1a7c389edbced3f7a493f70e37 \ + --hash=sha256:fb731e5deb0c7ef82d698b0f4c5bb724633ee2a489401594c5c88b02e6cb15f7 \ + --hash=sha256:fb7f67a1bfa6e40b438170ebdc8158b78dc465a5a67b6dde178a46987b244a72 \ + --hash=sha256:fd10de089bcdcd1be95a2f73dbe6254798ec1bda9f450d5828c96f93e2536b9c \ + --hash=sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9 +click==8.3.0 ; python_version >= "3.10" \ + --hash=sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc \ + --hash=sha256:e7b8232224eba16f4ebe410c25ced9f7875cb5f3263ffc93cc3e8da705e229c4 +cloudpickle==3.1.1 ; python_version >= "3.10" \ + --hash=sha256:b216fa8ae4019d5482a8ac3c95d8f6346115d8835911fd4aefd1a445e4242c64 \ + --hash=sha256:c8c5a44295039331ee9dad40ba100a9c7297b6f988e50e87ccdf3765a668350e +colorama==0.4.6 ; python_version >= "3.10" and (sys_platform == "win32" or platform_system == "Windows") \ --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 -docopt==0.6.2 ; python_version < "3.10" and python_version >= "3.9" \ - --hash=sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491 -exceptiongroup==1.2.1 ; python_version < "3.11" and python_version >= "3.9" \ - --hash=sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad \ - --hash=sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16 -fasteners==0.19 ; sys_platform != "emscripten" and python_version >= "3.9" \ - --hash=sha256:758819cb5d94cdedf4e836988b74de396ceacb8e2794d21f82d131fd9ee77237 \ - --hash=sha256:b4f37c3ac52d8a445af3a66bce57b33b5e90b97c696b7b984f530cf8f0ded09c -fsspec==2024.6.0 ; python_version >= "3.9" \ - --hash=sha256:58d7122eb8a1a46f7f13453187bfea4972d66bf01618d37366521b1998034cee \ - --hash=sha256:f579960a56e6d8038a9efc8f9c77279ec12e6299aa86b0769a7e9c46b94527c2 -h5netcdf==1.3.0 ; python_version >= "3.9" \ - --hash=sha256:a171c027daeb34b24c24a3b6304195b8eabbb6f10c748256ed3cfe19806383cf \ - --hash=sha256:f2df69dcd3665dc9c4d43eb6529dedd113b2508090d12ac973573305a8406465 -h5py==3.11.0 ; python_version >= "3.9" \ - --hash=sha256:083e0329ae534a264940d6513f47f5ada617da536d8dccbafc3026aefc33c90e \ - --hash=sha256:1625fd24ad6cfc9c1ccd44a66dac2396e7ee74940776792772819fc69f3a3731 \ - --hash=sha256:21dbdc5343f53b2e25404673c4f00a3335aef25521bd5fa8c707ec3833934892 \ - --hash=sha256:52c416f8eb0daae39dabe71415cb531f95dce2d81e1f61a74537a50c63b28ab3 \ - --hash=sha256:55106b04e2c83dfb73dc8732e9abad69d83a436b5b82b773481d95d17b9685e1 \ - --hash=sha256:67462d0669f8f5459529de179f7771bd697389fcb3faab54d63bf788599a48ea \ - --hash=sha256:6c4b760082626120031d7902cd983d8c1f424cdba2809f1067511ef283629d4b \ - --hash=sha256:731839240c59ba219d4cb3bc5880d438248533366f102402cfa0621b71796b62 \ - --hash=sha256:754c0c2e373d13d6309f408325343b642eb0f40f1a6ad21779cfa9502209e150 \ - --hash=sha256:75bd7b3d93fbeee40860fd70cdc88df4464e06b70a5ad9ce1446f5f32eb84007 \ - --hash=sha256:77b19a40788e3e362b54af4dcf9e6fde59ca016db2c61360aa30b47c7b7cef00 \ - --hash=sha256:7b7e8f78072a2edec87c9836f25f34203fd492a4475709a18b417a33cfb21fa9 \ - --hash=sha256:8ec9df3dd2018904c4cc06331951e274f3f3fd091e6d6cc350aaa90fa9b42a76 \ - --hash=sha256:a76cae64080210389a571c7d13c94a1a6cf8cb75153044fd1f822a962c97aeab \ - --hash=sha256:aa6ae84a14103e8dc19266ef4c3e5d7c00b68f21d07f2966f0ca7bdb6c2761fb \ - --hash=sha256:bbd732a08187a9e2a6ecf9e8af713f1d68256ee0f7c8b652a32795670fb481ba \ - --hash=sha256:c072655ad1d5fe9ef462445d3e77a8166cbfa5e599045f8aa3c19b75315f10e5 \ - --hash=sha256:d9c944d364688f827dc889cf83f1fca311caf4fa50b19f009d1f2b525edd33a3 \ - --hash=sha256:ef4e2f338fc763f50a8113890f455e1a70acd42a4d083370ceb80c463d803972 \ - --hash=sha256:f3736fe21da2b7d8a13fe8fe415f1272d2a1ccdeff4849c1421d2fb30fd533bc \ - --hash=sha256:f4e025e852754ca833401777c25888acb96889ee2c27e7e629a19aee288833f0 -idna==3.7 ; python_version >= "3.9" \ - --hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \ - --hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0 -iniconfig==2.0.0 ; python_version >= "3.9" \ - --hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \ - --hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374 -jinja2==3.1.4 ; python_version < "3.10" and python_version >= "3.9" \ - --hash=sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369 \ - --hash=sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d -markupsafe==2.1.5 ; python_version < "3.10" and python_version >= "3.9" \ - --hash=sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf \ - --hash=sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff \ - --hash=sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f \ - --hash=sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3 \ - --hash=sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532 \ - --hash=sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f \ - --hash=sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617 \ - --hash=sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df \ - --hash=sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4 \ - --hash=sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906 \ - --hash=sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f \ - --hash=sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4 \ - --hash=sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8 \ - --hash=sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371 \ - --hash=sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2 \ - --hash=sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465 \ - --hash=sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52 \ - --hash=sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6 \ - --hash=sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169 \ - --hash=sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad \ - --hash=sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2 \ - --hash=sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0 \ - --hash=sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029 \ - --hash=sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f \ - --hash=sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a \ - --hash=sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced \ - --hash=sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5 \ - --hash=sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c \ - --hash=sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf \ - --hash=sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9 \ - --hash=sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb \ - --hash=sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad \ - --hash=sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3 \ - --hash=sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1 \ - --hash=sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46 \ - --hash=sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc \ - --hash=sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a \ - --hash=sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee \ - --hash=sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900 \ - --hash=sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5 \ - --hash=sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea \ - --hash=sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f \ - --hash=sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5 \ - --hash=sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e \ - --hash=sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a \ - --hash=sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f \ - --hash=sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50 \ - --hash=sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a \ - --hash=sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b \ - --hash=sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4 \ - --hash=sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff \ - --hash=sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2 \ - --hash=sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46 \ - --hash=sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b \ - --hash=sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf \ - --hash=sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5 \ - --hash=sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5 \ - --hash=sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab \ - --hash=sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd \ - --hash=sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68 -netcdf4==1.7.1 ; python_version >= "3.9" \ - --hash=sha256:225a03e1d216618d14f721c72b47a42f09e68dcc6b1509c93c784c60c630129f \ - --hash=sha256:3b345b68365ecae2c8c9c33e7d41a1a94e80ef987f40928a02e2f210d05d02b2 \ - --hash=sha256:48c56e96107ec8e2daf08cb0a9dde2b66e118de397c5f06511b31c37ef35e113 \ - --hash=sha256:56af0fa24a39a14bc68cc1ab97e6d33fbaff934ba0659f740ad54bd80fbf732f \ - --hash=sha256:5724ba076ea49b63625447cd6e8d936929a2b23d3e63157c16a607e8e7505598 \ - --hash=sha256:6e343b7e42cd11184c2686e2899915bb1f3f1df7c9c62681590c35c088a9c66b \ - --hash=sha256:7258b98ebfaf7f0a3f362946d0192020d0d0284b131e7ef775e66858d3ff13ae \ - --hash=sha256:73f017f4d909cea6ab1065e8199d597a9bf5cf60f91c37ae8a040c35256bc196 \ - --hash=sha256:7503bc1a7b013c7ba5d715a72826f7debf65633eace4a4280c2700b1cc001945 \ - --hash=sha256:7553e9cd37ef9a2382e3f8088b0f4c00e8078e76e2358c140eb882eefabe6db7 \ - --hash=sha256:7a9d8906ff7c86e1af176efbd85603088c98271cf844562a482286411289a7ec \ - --hash=sha256:85d28a26080b2a05b0786135be7b215ed0629a974895b135bd4ef2eddbb3e1ad \ - --hash=sha256:867466bef3d109d79d35b2bbcb713565f29b2df0cb52cd19691cba65374129ac \ - --hash=sha256:87d666093870ebbc0153c8eb42a4a70d6a1d33b47fa3d8fd2e01b6d8de52023e \ - --hash=sha256:8ce2207d836e5289f8caa66a540b222f76c242e6be565cefe8478a19bb08c206 \ - --hash=sha256:9cd8b9ab2508cc4a8d52957f84c1f34d94755c748ef6f285f756044842184852 \ - --hash=sha256:b300b6933ab83496914c0f1731075a3a40829b9010c3f1548eece5ccb3ea629a \ - --hash=sha256:b43f6569ef09fba75d2bd194fe60d286736b96329e0e50e90df4e236b272db0e \ - --hash=sha256:b6917f8ad44722fefb26134b540e97a9eef5ffd0b73e4564666b697f0f43ae5d \ - --hash=sha256:c4ece6fe318f787b212e6169dee5e2c3326650dd64b1af44e2b815c6b48f2231 \ - --hash=sha256:d407f5725daf8972ff7a4af48925a75c349158681e3f14f264616a013fe97aca \ - --hash=sha256:dfb92f8db5731b285546b732dfbe5870ed09b16a0453bb213a8dba83d1045935 \ - --hash=sha256:e26fd9a30c26d7757444410fe85d68ce8d3f64119d33feaa4daed374d1779590 \ - --hash=sha256:ec569b56ab8714aded398b1667e1ca01489c71ed51965e9a0bd51d7c217ce352 \ - --hash=sha256:f858bef2edd5dfccacd4c556eae7db55b185ba6af9b6520d8ae1ea16a72004a6 -numcodecs==0.12.1 ; python_version >= "3.9" \ - --hash=sha256:05d91a433733e7eef268d7e80ec226a0232da244289614a8f3826901aec1098e \ - --hash=sha256:0e79bf9d1d37199ac00a60ff3adb64757523291d19d03116832e600cac391c51 \ - --hash=sha256:135b2d47563f7b9dc5ee6ce3d1b81b0f1397f69309e909f1a35bb0f7c553d45e \ - --hash=sha256:21d8267bd4313f4d16f5b6287731d4c8ebdab236038f29ad1b0e93c9b2ca64ee \ - --hash=sha256:29dfb195f835a55c4d490fb097aac8c1bcb96c54cf1b037d9218492c95e9d8c5 \ - --hash=sha256:2f1ba2f4af3fd3ba65b1bcffb717fe65efe101a50a91c368f79f3101dbb1e243 \ - --hash=sha256:2f84df6b8693206365a5b37c005bfa9d1be486122bde683a7b6446af4b75d862 \ - --hash=sha256:2fbb12a6a1abe95926f25c65e283762d63a9bf9e43c0de2c6a1a798347dfcb40 \ - --hash=sha256:760627780a8b6afdb7f942f2a0ddaf4e31d3d7eea1d8498cf0fd3204a33c4618 \ - --hash=sha256:82d7107f80f9307235cb7e74719292d101c7ea1e393fe628817f0d635b7384f5 \ - --hash=sha256:941b7446b68cf79f089bcfe92edaa3b154533dcbcd82474f994b28f2eedb1c60 \ - --hash=sha256:a191a8e347ecd016e5c357f2bf41fbcb026f6ffe78fff50c77ab12e96701d155 \ - --hash=sha256:abff3554a6892a89aacf7b642a044e4535499edf07aeae2f2e6e8fc08c9ba07f \ - --hash=sha256:c17687b1fd1fef68af616bc83f896035d24e40e04e91e7e6dae56379eb59fe33 \ - --hash=sha256:c258bd1d3dfa75a9b708540d23b2da43d63607f9df76dfa0309a7597d1de3b73 \ - --hash=sha256:caf1a1e6678aab9c1e29d2109b299f7a467bd4d4c34235b1f0e082167846b88f \ - --hash=sha256:d37f628fe92b3699e65831d5733feca74d2e33b50ef29118ffd41c13c677210e \ - --hash=sha256:e04649ea504aff858dbe294631f098fbfd671baf58bfc04fc48d746554c05d67 \ - --hash=sha256:eeaf42768910f1c6eebf6c1bb00160728e62c9343df9e2e315dc9fe12e3f6071 \ - --hash=sha256:ef964d4860d3e6b38df0633caf3e51dc850a6293fd8e93240473642681d95136 \ - --hash=sha256:f2207871868b2464dc11c513965fd99b958a9d7cde2629be7b2dc84fdaab013b -numpy==2.0.0 ; python_version >= "3.9" \ - --hash=sha256:04494f6ec467ccb5369d1808570ae55f6ed9b5809d7f035059000a37b8d7e86f \ - --hash=sha256:0a43f0974d501842866cc83471bdb0116ba0dffdbaac33ec05e6afed5b615238 \ - --hash=sha256:0e50842b2295ba8414c8c1d9d957083d5dfe9e16828b37de883f51fc53c4016f \ - --hash=sha256:0ec84b9ba0654f3b962802edc91424331f423dcf5d5f926676e0150789cb3d95 \ - --hash=sha256:17067d097ed036636fa79f6a869ac26df7db1ba22039d962422506640314933a \ - --hash=sha256:1cde1753efe513705a0c6d28f5884e22bdc30438bf0085c5c486cdaff40cd67a \ - --hash=sha256:1e72728e7501a450288fc8e1f9ebc73d90cfd4671ebbd631f3e7857c39bd16f2 \ - --hash=sha256:2635dbd200c2d6faf2ef9a0d04f0ecc6b13b3cad54f7c67c61155138835515d2 \ - --hash=sha256:2ce46fd0b8a0c947ae047d222f7136fc4d55538741373107574271bc00e20e8f \ - --hash=sha256:34f003cb88b1ba38cb9a9a4a3161c1604973d7f9d5552c38bc2f04f829536609 \ - --hash=sha256:354f373279768fa5a584bac997de6a6c9bc535c482592d7a813bb0c09be6c76f \ - --hash=sha256:38ecb5b0582cd125f67a629072fed6f83562d9dd04d7e03256c9829bdec027ad \ - --hash=sha256:3e8e01233d57639b2e30966c63d36fcea099d17c53bf424d77f088b0f4babd86 \ - --hash=sha256:3f6bed7f840d44c08ebdb73b1825282b801799e325bcbdfa6bc5c370e5aecc65 \ - --hash=sha256:4554eb96f0fd263041baf16cf0881b3f5dafae7a59b1049acb9540c4d57bc8cb \ - --hash=sha256:46e161722e0f619749d1cd892167039015b2c2817296104487cd03ed4a955995 \ - --hash=sha256:49d9f7d256fbc804391a7f72d4a617302b1afac1112fac19b6c6cec63fe7fe8a \ - --hash=sha256:4d2f62e55a4cd9c58c1d9a1c9edaedcd857a73cb6fda875bf79093f9d9086f85 \ - --hash=sha256:5f64641b42b2429f56ee08b4f427a4d2daf916ec59686061de751a55aafa22e4 \ - --hash=sha256:63b92c512d9dbcc37f9d81b123dec99fdb318ba38c8059afc78086fe73820275 \ - --hash=sha256:6d7696c615765091cc5093f76fd1fa069870304beaccfd58b5dcc69e55ef49c1 \ - --hash=sha256:79e843d186c8fb1b102bef3e2bc35ef81160ffef3194646a7fdd6a73c6b97196 \ - --hash=sha256:821eedb7165ead9eebdb569986968b541f9908979c2da8a4967ecac4439bae3d \ - --hash=sha256:84554fc53daa8f6abf8e8a66e076aff6ece62de68523d9f665f32d2fc50fd66e \ - --hash=sha256:8d83bb187fb647643bd56e1ae43f273c7f4dbcdf94550d7938cfc32566756514 \ - --hash=sha256:903703372d46bce88b6920a0cd86c3ad82dae2dbef157b5fc01b70ea1cfc430f \ - --hash=sha256:9416a5c2e92ace094e9f0082c5fd473502c91651fb896bc17690d6fc475128d6 \ - --hash=sha256:9a1712c015831da583b21c5bfe15e8684137097969c6d22e8316ba66b5baabe4 \ - --hash=sha256:9c27f0946a3536403efb0e1c28def1ae6730a72cd0d5878db38824855e3afc44 \ - --hash=sha256:a356364941fb0593bb899a1076b92dfa2029f6f5b8ba88a14fd0984aaf76d0df \ - --hash=sha256:a7039a136017eaa92c1848152827e1424701532ca8e8967fe480fe1569dae581 \ - --hash=sha256:acd3a644e4807e73b4e1867b769fbf1ce8c5d80e7caaef0d90dcdc640dfc9787 \ - --hash=sha256:ad0c86f3455fbd0de6c31a3056eb822fc939f81b1618f10ff3406971893b62a5 \ - --hash=sha256:b4c76e3d4c56f145d41b7b6751255feefae92edbc9a61e1758a98204200f30fc \ - --hash=sha256:b6f6a8f45d0313db07d6d1d37bd0b112f887e1369758a5419c0370ba915b3871 \ - --hash=sha256:c5a59996dc61835133b56a32ebe4ef3740ea5bc19b3983ac60cc32be5a665d54 \ - --hash=sha256:c73aafd1afca80afecb22718f8700b40ac7cab927b8abab3c3e337d70e10e5a2 \ - --hash=sha256:cee6cc0584f71adefe2c908856ccc98702baf95ff80092e4ca46061538a2ba98 \ - --hash=sha256:cef04d068f5fb0518a77857953193b6bb94809a806bd0a14983a8f12ada060c9 \ - --hash=sha256:cf5d1c9e6837f8af9f92b6bd3e86d513cdc11f60fd62185cc49ec7d1aba34864 \ - --hash=sha256:e61155fae27570692ad1d327e81c6cf27d535a5d7ef97648a17d922224b216de \ - --hash=sha256:e7f387600d424f91576af20518334df3d97bc76a300a755f9a8d6e4f5cadd289 \ - --hash=sha256:ed08d2703b5972ec736451b818c2eb9da80d66c3e84aed1deeb0c345fefe461b \ - --hash=sha256:fbd6acc766814ea6443628f4e6751d0da6593dae29c08c0b2606164db026970c \ - --hash=sha256:feff59f27338135776f6d4e2ec7aeeac5d5f7a08a83e80869121ef8164b74af9 -packaging==24.1 ; python_version >= "3.9" \ - --hash=sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002 \ - --hash=sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124 -pandas==2.2.2 ; python_version >= "3.9" \ - --hash=sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863 \ - --hash=sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2 \ - --hash=sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1 \ - --hash=sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad \ - --hash=sha256:2925720037f06e89af896c70bca73459d7e6a4be96f9de79e2d440bd499fe0db \ - --hash=sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76 \ - --hash=sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51 \ - --hash=sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32 \ - --hash=sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08 \ - --hash=sha256:58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b \ - --hash=sha256:640cef9aa381b60e296db324337a554aeeb883ead99dc8f6c18e81a93942f5f4 \ - --hash=sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921 \ - --hash=sha256:696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288 \ - --hash=sha256:6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee \ - --hash=sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0 \ - --hash=sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24 \ - --hash=sha256:8e5a0b00e1e56a842f922e7fae8ae4077aee4af0acb5ae3622bd4b4c30aedf99 \ - --hash=sha256:8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151 \ - --hash=sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce \ - --hash=sha256:92fd6b027924a7e178ac202cfbe25e53368db90d56872d20ffae94b96c7acc57 \ - --hash=sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef \ - --hash=sha256:9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54 \ - --hash=sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a \ - --hash=sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23 \ - --hash=sha256:ddf818e4e6c7c6f4f7c8a12709696d193976b591cc7dc50588d3d1a6b5dc8772 \ - --hash=sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad -platformdirs==4.2.2 ; python_version >= "3.9" \ - --hash=sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee \ - --hash=sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3 -pluggy==1.5.0 ; python_version >= "3.9" \ - --hash=sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1 \ - --hash=sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669 -pooch==1.8.2 ; python_version >= "3.9" \ +dask==2025.9.1 ; python_version >= "3.10" \ + --hash=sha256:2a8a7dc933caaea2f47745a65a6ec93d9e616e12aab53b4f03ee161d31939110 \ + --hash=sha256:718df73e1fd3d7e2b8546e0f04ce08e1ed7f9aa3da1eecd0c1f44c8b6d52f7e0 +exceptiongroup==1.3.0 ; python_version < "3.11" and python_version >= "3.10" \ + --hash=sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10 \ + --hash=sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88 +fasteners==0.20 ; sys_platform != "emscripten" and python_version >= "3.10" \ + --hash=sha256:55dce8792a41b56f727ba6e123fcaee77fd87e638a6863cec00007bfea84c8d8 \ + --hash=sha256:9422c40d1e350e4259f509fb2e608d6bc43c0136f79a00db1b49046029d0b3b7 +fsspec==2025.9.0 ; python_version >= "3.10" \ + --hash=sha256:19fd429483d25d28b65ec68f9f4adc16c17ea2c7c7bf54ec61360d478fb19c19 \ + --hash=sha256:530dc2a2af60a414a832059574df4a6e10cce927f6f4a78209390fe38955cfb7 +h5netcdf==1.6.4 ; python_version >= "3.10" \ + --hash=sha256:83db7e5eb9b822bed2c79050d6cf8f36ecbd1039f4252bd90fab200edcaaf67d \ + --hash=sha256:e0018e6a918f2bef2a4aa7b470a952b8a0b5d16a5893d59bea56524cc6207fcf +h5py==3.14.0 ; python_version >= "3.10" \ + --hash=sha256:016e89d3be4c44f8d5e115fab60548e518ecd9efe9fa5c5324505a90773e6f03 \ + --hash=sha256:0cbd41f4e3761f150aa5b662df991868ca533872c95467216f2bec5fcad84882 \ + --hash=sha256:1223b902ef0b5d90bcc8a4778218d6d6cd0f5561861611eda59fa6c52b922f4d \ + --hash=sha256:2372116b2e0d5d3e5e705b7f663f7c8d96fa79a4052d250484ef91d24d6a08f4 \ + --hash=sha256:24df6b2622f426857bda88683b16630014588a0e4155cba44e872eb011c4eaed \ + --hash=sha256:4f025cf30ae738c4c4e38c7439a761a71ccfcce04c2b87b2a2ac64e8c5171d43 \ + --hash=sha256:543877d7f3d8f8a9828ed5df6a0b78ca3d8846244b9702e99ed0d53610b583a8 \ + --hash=sha256:554ef0ced3571366d4d383427c00c966c360e178b5fb5ee5bb31a435c424db0c \ + --hash=sha256:573c33ad056ac7c1ab6d567b6db9df3ffc401045e3f605736218f96c1e0490c6 \ + --hash=sha256:5e59d2136a8b302afd25acdf7a89b634e0eb7c66b1a211ef2d0457853768a2ef \ + --hash=sha256:6da62509b7e1d71a7d110478aa25d245dd32c8d9a1daee9d2a42dba8717b047a \ + --hash=sha256:6ff2389961ee5872de697054dd5a033b04284afc3fb52dc51d94561ece2c10c6 \ + --hash=sha256:723a40ee6505bd354bfd26385f2dae7bbfa87655f4e61bab175a49d72ebfc06b \ + --hash=sha256:852b81f71df4bb9e27d407b43071d1da330d6a7094a588efa50ef02553fa7ce4 \ + --hash=sha256:8c497600c0496548810047257e36360ff551df8b59156d3a4181072eed47d8ad \ + --hash=sha256:aa4b7bbce683379b7bf80aaba68e17e23396100336a8d500206520052be2f812 \ + --hash=sha256:ae18e3de237a7a830adb76aaa68ad438d85fe6e19e0d99944a3ce46b772c69b3 \ + --hash=sha256:bf4897d67e613ecf5bdfbdab39a1158a64df105827da70ea1d90243d796d367f \ + --hash=sha256:ccbe17dc187c0c64178f1a10aa274ed3a57d055117588942b8a08793cc448216 \ + --hash=sha256:d2744b520440a996f2dae97f901caa8a953afc055db4673a993f2d87d7f38713 \ + --hash=sha256:d90e6445ab7c146d7f7981b11895d70bc1dd91278a4f9f9028bc0c95e4a53f13 \ + --hash=sha256:e0045115d83272090b0717c555a31398c2c089b87d212ceba800d3dc5d952e23 \ + --hash=sha256:e8cbaf6910fa3983c46172666b0b8da7b7bd90d764399ca983236f2400436eeb \ + --hash=sha256:ef9603a501a04fcd0ba28dd8f0995303d26a77a980a1f9474b3417543d4c6174 \ + --hash=sha256:f30dbc58f2a0efeec6c8836c97f6c94afd769023f44e2bb0ed7b17a16ec46088 \ + --hash=sha256:f5cc1601e78027cedfec6dd50efb4802f018551754191aeb58d948bd3ec3bd7a +idna==3.10 ; python_version >= "3.10" \ + --hash=sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9 \ + --hash=sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3 +importlib-metadata==8.7.0 ; python_version < "3.12" and python_version >= "3.10" \ + --hash=sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000 \ + --hash=sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd +iniconfig==2.1.0 ; python_version >= "3.10" \ + --hash=sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7 \ + --hash=sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760 +locket==1.0.0 ; python_version >= "3.10" \ + --hash=sha256:5c0d4c052a8bbbf750e056a8e65ccd309086f4f0f18a2eac306a8dfa4112a632 \ + --hash=sha256:b6c819a722f7b6bd955b80781788e4a66a55628b858d347536b7e81325a3a5e3 +netcdf4==1.7.2 ; python_version >= "3.10" \ + --hash=sha256:09d61c2ddb6011afb51e77ea0f25cd0bdc28887fb426ffbbc661d920f20c9749 \ + --hash=sha256:118b476fd00d7e3ab9aa7771186d547da645ae3b49c0c7bdab866793ebf22f07 \ + --hash=sha256:205a5f1de3ddb993c7c97fb204a923a22408cc2e5facf08d75a8eb89b3e7e1a8 \ + --hash=sha256:28021c7e886e5bccf9a8ce504c032d1d7f98d86f67495fb7cf2c9564eba04510 \ + --hash=sha256:30d20e56b9ba2c48884eb89c91b63e6c0612b4927881707e34402719153ef17f \ + --hash=sha256:3291f9ad0c98c49a4dd16aefad1a9abd3a1b884171db6c81bdcee94671cfabe3 \ + --hash=sha256:568ea369e00b581302d77fc5fd0b8f78e520c7e08d0b5af5219ba51f3f1cd694 \ + --hash=sha256:572f71459ef4b30e8554dcc4e1e6f55de515acc82a50968b48fe622244a64548 \ + --hash=sha256:59b403032774c723ee749d7f2135be311bad7d00d1db284bebfab58b9d5cdb92 \ + --hash=sha256:5bdf3b34e6fd4210e34fdc5d1a669a22c4863d96f8a20a3928366acae7b3cbbb \ + --hash=sha256:5c5fbee6134ee1246c397e1508e5297d825aa19221fdf3fa8dc9727ad824d7a5 \ + --hash=sha256:5e9b485e3bd9294d25ff7dc9addefce42b3d23c1ee7e3627605277d159819392 \ + --hash=sha256:657774404b9f78a5e4d26506ac9bfe106e4a37238282a70803cc7ce679c5a6cc \ + --hash=sha256:6bf402c2c7c063474576e5cf89af877d0b0cd097d9316d5bc4fcb22b62f12567 \ + --hash=sha256:7460b638e41c8ce4179d082a81cb6456f0ce083d4d959f4d9e87a95cd86f64cb \ + --hash=sha256:7e896d92f01fbf365e33e2513d5a8c4cfe16ff406aae9b6034e5ba1538c8c7a8 \ + --hash=sha256:7f77e72281acc5f331f82271e5f7f014d46f5ca9bcaa5aafe3e46d66cee21320 \ + --hash=sha256:8d6bfd38ba0bde04d56f06c1554714a2ea9dab75811c89450dc3ec57a9d36b80 \ + --hash=sha256:902aa50d70f49d002d896212a171d344c38f7b8ca520837c56c922ac1535c4a3 \ + --hash=sha256:96653fc75057df196010818367c63ba6d7e9af603df0a7fe43fcdad3fe0e9e56 \ + --hash=sha256:a4c6375540b19989896136943abb6d44850ff6f1fa7d3f063253b1ad3f8b7fce \ + --hash=sha256:a51da09258b31776f474c1d47e484fc7214914cdc59edf4cee789ba632184591 \ + --hash=sha256:abe5b1837ff209185ecfe50bd71884c866b3ee69691051833e410e57f177e059 \ + --hash=sha256:cb95b11804fe051897d1f2044b05d82a1847bc2549631cdd2f655dde7de77a9c \ + --hash=sha256:d0fa7a9674fae8ae4877e813173c3ff7a6beee166b8730bdc847f517b282ed31 \ + --hash=sha256:e73e3baa0b74afc414e53ff5095748fdbec7fb346eda351e567c23f2f0d247f1 \ + --hash=sha256:eb87c08d1700fe67c301898cf5ba3a3e1f8f2fbb417fcd0e2ac784846b60b058 \ + --hash=sha256:f54f5d39ffbcf1726a1e6fd90cb5fa74277ecea739a5fa0f424636d71beafe24 \ + --hash=sha256:f9d8a848373723f41ef662590b4f5e1832227501c9fd4513e8ad8da58c269977 \ + --hash=sha256:fd2a16dbddeb8fa7cf48c37bfc1967290332f2862bb82f984eec2007bb120aeb +numcodecs==0.13.1 ; python_version >= "3.10" \ + --hash=sha256:233bc7f26abce24d57e44ea8ebeb5cd17084690b4e7409dd470fdb75528d615f \ + --hash=sha256:237b7171609e868a20fd313748494444458ccd696062f67e198f7f8f52000c15 \ + --hash=sha256:2a86f5367af9168e30f99727ff03b27d849c31ad4522060dde0bce2923b3a8bc \ + --hash=sha256:2eda97dd2f90add98df6d295f2c6ae846043396e3d51a739ca5db6c03b5eb666 \ + --hash=sha256:3501a848adaddce98a71a262fee15cd3618312692aa419da77acd18af4a6a3f6 \ + --hash=sha256:3f593c7506b0ab248961a3b13cb148cc6e8355662ff124ac591822310bc55ecf \ + --hash=sha256:5195bea384a6428f8afcece793860b1ab0ae28143c853f0b2b20d55a8947c917 \ + --hash=sha256:796b3e6740107e4fa624cc636248a1580138b3f1c579160f260f76ff13a4261b \ + --hash=sha256:7a60d75179fd6692e301ddfb3b266d51eb598606dcae7b9fc57f986e8d65cb43 \ + --hash=sha256:80d3071465f03522e776a31045ddf2cfee7f52df468b977ed3afdd7fe5869701 \ + --hash=sha256:90d3065ae74c9342048ae0046006f99dcb1388b7288da5a19b3bddf9c30c3176 \ + --hash=sha256:96add4f783c5ce57cc7e650b6cac79dd101daf887c479a00a29bc1487ced180b \ + --hash=sha256:96e42f73c31b8c24259c5fac6adba0c3ebf95536e37749dc6c62ade2989dca28 \ + --hash=sha256:a3cf37881df0898f3a9c0d4477df88133fe85185bffe57ba31bcc2fa207709bc \ + --hash=sha256:da2230484e6102e5fa3cc1a5dd37ca1f92dfbd183d91662074d6f7574e3e8f53 \ + --hash=sha256:e5db4824ebd5389ea30e54bc8aeccb82d514d28b6b68da6c536b8fa4596f4bca \ + --hash=sha256:eda7d7823c9282e65234731fd6bd3986b1f9e035755f7fed248d7d366bb291ab +numpy==2.2.6 ; python_version >= "3.10" \ + --hash=sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff \ + --hash=sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47 \ + --hash=sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84 \ + --hash=sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d \ + --hash=sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6 \ + --hash=sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f \ + --hash=sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b \ + --hash=sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49 \ + --hash=sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163 \ + --hash=sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571 \ + --hash=sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42 \ + --hash=sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff \ + --hash=sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491 \ + --hash=sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4 \ + --hash=sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566 \ + --hash=sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf \ + --hash=sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40 \ + --hash=sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd \ + --hash=sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06 \ + --hash=sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282 \ + --hash=sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680 \ + --hash=sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db \ + --hash=sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3 \ + --hash=sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90 \ + --hash=sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1 \ + --hash=sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289 \ + --hash=sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab \ + --hash=sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c \ + --hash=sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d \ + --hash=sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb \ + --hash=sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d \ + --hash=sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a \ + --hash=sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf \ + --hash=sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1 \ + --hash=sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2 \ + --hash=sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a \ + --hash=sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543 \ + --hash=sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00 \ + --hash=sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c \ + --hash=sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f \ + --hash=sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd \ + --hash=sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868 \ + --hash=sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303 \ + --hash=sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83 \ + --hash=sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3 \ + --hash=sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d \ + --hash=sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87 \ + --hash=sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa \ + --hash=sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f \ + --hash=sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae \ + --hash=sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda \ + --hash=sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915 \ + --hash=sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249 \ + --hash=sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de \ + --hash=sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8 +packaging==25.0 ; python_version >= "3.10" \ + --hash=sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484 \ + --hash=sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f +pandas==2.3.3 ; python_version >= "3.10" \ + --hash=sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7 \ + --hash=sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593 \ + --hash=sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5 \ + --hash=sha256:1d37b5848ba49824e5c30bedb9c830ab9b7751fd049bc7914533e01c65f79791 \ + --hash=sha256:23ebd657a4d38268c7dfbdf089fbc31ea709d82e4923c5ffd4fbd5747133ce73 \ + --hash=sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec \ + --hash=sha256:28083c648d9a99a5dd035ec125d42439c6c1c525098c58af0fc38dd1a7a1b3d4 \ + --hash=sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5 \ + --hash=sha256:318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac \ + --hash=sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084 \ + --hash=sha256:376c6446ae31770764215a6c937f72d917f214b43560603cd60da6408f183b6c \ + --hash=sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87 \ + --hash=sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35 \ + --hash=sha256:4793891684806ae50d1288c9bae9330293ab4e083ccd1c5e383c34549c6e4250 \ + --hash=sha256:4e0a175408804d566144e170d0476b15d78458795bb18f1304fb94160cabf40c \ + --hash=sha256:503cf027cf9940d2ceaa1a93cfb5f8c8c7e6e90720a2850378f0b3f3b1e06826 \ + --hash=sha256:5554c929ccc317d41a5e3d1234f3be588248e61f08a74dd17c9eabb535777dc9 \ + --hash=sha256:56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713 \ + --hash=sha256:5caf26f64126b6c7aec964f74266f435afef1c1b13da3b0636c7518a1fa3e2b1 \ + --hash=sha256:602b8615ebcc4a0c1751e71840428ddebeb142ec02c786e8ad6b1ce3c8dec523 \ + --hash=sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3 \ + --hash=sha256:6435cb949cb34ec11cc9860246ccb2fdc9ecd742c12d3304989017d53f039a78 \ + --hash=sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53 \ + --hash=sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c \ + --hash=sha256:74ecdf1d301e812db96a465a525952f4dde225fdb6d8e5a521d47e1f42041e21 \ + --hash=sha256:75ea25f9529fdec2d2e93a42c523962261e567d250b0013b16210e1d40d7c2e5 \ + --hash=sha256:854d00d556406bffe66a4c0802f334c9ad5a96b4f1f868adf036a21b11ef13ff \ + --hash=sha256:8fe25fc7b623b0ef6b5009149627e34d2a4657e880948ec3c840e9402e5c1b45 \ + --hash=sha256:900f47d8f20860de523a1ac881c4c36d65efcb2eb850e6948140fa781736e110 \ + --hash=sha256:93c2d9ab0fc11822b5eece72ec9587e172f63cff87c00b062f6e37448ced4493 \ + --hash=sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b \ + --hash=sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450 \ + --hash=sha256:a45c765238e2ed7d7c608fc5bc4a6f88b642f2f01e70c0c23d2224dd21829d86 \ + --hash=sha256:a637c5cdfa04b6d6e2ecedcb81fc52ffb0fd78ce2ebccc9ea964df9f658de8c8 \ + --hash=sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98 \ + --hash=sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89 \ + --hash=sha256:b468d3dad6ff947df92dcb32ede5b7bd41a9b3cceef0a30ed925f6d01fb8fa66 \ + --hash=sha256:b98560e98cb334799c0b07ca7967ac361a47326e9b4e5a7dfb5ab2b1c9d35a1b \ + --hash=sha256:bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8 \ + --hash=sha256:bf1f8a81d04ca90e32a0aceb819d34dbd378a98bf923b6398b9a3ec0bf44de29 \ + --hash=sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6 \ + --hash=sha256:c4fc4c21971a1a9f4bdb4c73978c7f7256caa3e62b323f70d6cb80db583350bc \ + --hash=sha256:c503ba5216814e295f40711470446bc3fd00f0faea8a086cbc688808e26f92a2 \ + --hash=sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788 \ + --hash=sha256:d3e28b3e83862ccf4d85ff19cf8c20b2ae7e503881711ff2d534dc8f761131aa \ + --hash=sha256:db4301b2d1f926ae677a751eb2bd0e8c5f5319c9cb3f88b0becbbb0b07b34151 \ + --hash=sha256:dd7478f1463441ae4ca7308a70e90b33470fa593429f9d4c578dd00d1fa78838 \ + --hash=sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b \ + --hash=sha256:e19d192383eab2f4ceb30b412b22ea30690c9e618f78870357ae1d682912015a \ + --hash=sha256:e32e7cc9af0f1cc15548288a51a3b681cc2a219faa838e995f7dc53dbab1062d \ + --hash=sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908 \ + --hash=sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0 \ + --hash=sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b \ + --hash=sha256:f086f6fe114e19d92014a1966f43a3e62285109afe874f067f5abbdcbb10e59c \ + --hash=sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee +partd==1.4.2 ; python_version >= "3.10" \ + --hash=sha256:978e4ac767ec4ba5b86c6eaa52e5a2a3bc748a2ca839e8cc798f1cc6ce6efb0f \ + --hash=sha256:d022c33afbdc8405c226621b015e8067888173d85f7f5ecebb3cafed9a20f02c +platformdirs==4.4.0 ; python_version >= "3.10" \ + --hash=sha256:abd01743f24e5287cd7a5db3752faf1a2d65353f38ec26d98e25a6db65958c85 \ + --hash=sha256:ca753cf4d81dc309bc67b0ea38fd15dc97bc30ce419a7f58d13eb3bf14c4febf +pluggy==1.6.0 ; python_version >= "3.10" \ + --hash=sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3 \ + --hash=sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746 +pooch==1.8.2 ; python_version >= "3.10" \ --hash=sha256:3529a57096f7198778a5ceefd5ac3ef0e4d06a6ddaf9fc2d609b806f25302c47 \ --hash=sha256:76561f0de68a01da4df6af38e9955c4c9d1a5c90da73f7e40276a5728ec83d10 -pydap==3.4.1 ; python_version < "3.10" and python_version >= "3.9" \ - --hash=sha256:17c46087b53c6aec9bc5495a5d52aca19b2aa4b045f370b9f4b3a6058f5d8df7 \ - --hash=sha256:a24cc3bc8c78089542699382bf650d57a055c82bb72c342fa7caa6618b9e4417 -pytest==8.2.2 ; python_version >= "3.9" \ - --hash=sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343 \ - --hash=sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977 -python-dateutil==2.9.0.post0 ; python_version >= "3.9" \ +pygments==2.19.2 ; python_version >= "3.10" \ + --hash=sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887 \ + --hash=sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b +pytest==8.4.2 ; python_version >= "3.10" \ + --hash=sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01 \ + --hash=sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79 +python-dateutil==2.9.0.post0 ; python_version >= "3.10" \ --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 -pytz==2024.1 ; python_version >= "3.9" \ - --hash=sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812 \ - --hash=sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319 -requests==2.32.3 ; python_version >= "3.9" \ - --hash=sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760 \ - --hash=sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 -scipy==1.13.1 ; python_version >= "3.9" \ - --hash=sha256:017367484ce5498445aade74b1d5ab377acdc65e27095155e448c88497755a5d \ - --hash=sha256:095a87a0312b08dfd6a6155cbbd310a8c51800fc931b8c0b84003014b874ed3c \ - --hash=sha256:20335853b85e9a49ff7572ab453794298bcf0354d8068c5f6775a0eabf350aca \ - --hash=sha256:27e52b09c0d3a1d5b63e1105f24177e544a222b43611aaf5bc44d4a0979e32f9 \ - --hash=sha256:2831f0dc9c5ea9edd6e51e6e769b655f08ec6db6e2e10f86ef39bd32eb11da54 \ - --hash=sha256:2ac65fb503dad64218c228e2dc2d0a0193f7904747db43014645ae139c8fad16 \ - --hash=sha256:392e4ec766654852c25ebad4f64e4e584cf19820b980bc04960bca0b0cd6eaa2 \ - --hash=sha256:436bbb42a94a8aeef855d755ce5a465479c721e9d684de76bf61a62e7c2b81d5 \ - --hash=sha256:45484bee6d65633752c490404513b9ef02475b4284c4cfab0ef946def50b3f59 \ - --hash=sha256:54f430b00f0133e2224c3ba42b805bfd0086fe488835effa33fa291561932326 \ - --hash=sha256:5713f62f781eebd8d597eb3f88b8bf9274e79eeabf63afb4a737abc6c84ad37b \ - --hash=sha256:5d72782f39716b2b3509cd7c33cdc08c96f2f4d2b06d51e52fb45a19ca0c86a1 \ - --hash=sha256:637e98dcf185ba7f8e663e122ebf908c4702420477ae52a04f9908707456ba4d \ - --hash=sha256:8335549ebbca860c52bf3d02f80784e91a004b71b059e3eea9678ba994796a24 \ - --hash=sha256:949ae67db5fa78a86e8fa644b9a6b07252f449dcf74247108c50e1d20d2b4627 \ - --hash=sha256:a014c2b3697bde71724244f63de2476925596c24285c7a637364761f8710891c \ - --hash=sha256:a78b4b3345f1b6f68a763c6e25c0c9a23a9fd0f39f5f3d200efe8feda560a5fa \ - --hash=sha256:cdd7dacfb95fea358916410ec61bbc20440f7860333aee6d882bb8046264e949 \ - --hash=sha256:cfa31f1def5c819b19ecc3a8b52d28ffdcc7ed52bb20c9a7589669dd3c250989 \ - --hash=sha256:d533654b7d221a6a97304ab63c41c96473ff04459e404b83275b60aa8f4b7004 \ - --hash=sha256:d605e9c23906d1994f55ace80e0125c587f96c020037ea6aa98d01b4bd2e222f \ - --hash=sha256:de3ade0e53bc1f21358aa74ff4830235d716211d7d077e340c7349bc3542e884 \ - --hash=sha256:e89369d27f9e7b0884ae559a3a956e77c02114cc60a6058b4e5011572eea9299 \ - --hash=sha256:eccfa1906eacc02de42d70ef4aecea45415f5be17e72b61bafcfd329bdc52e94 \ - --hash=sha256:f26264b282b9da0952a024ae34710c2aff7d27480ee91a2e82b7b7073c24722f -six==1.16.0 ; python_version >= "3.9" \ - --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ - --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 -soupsieve==2.5 ; python_version < "3.10" and python_version >= "3.9" \ - --hash=sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690 \ - --hash=sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7 -tomli==2.0.1 ; python_version < "3.11" and python_version >= "3.9" \ - --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ - --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f -tzdata==2024.1 ; python_version >= "3.9" \ - --hash=sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd \ - --hash=sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252 -urllib3==2.2.2 ; python_version >= "3.9" \ - --hash=sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472 \ - --hash=sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168 -webob==1.8.7 ; python_version >= "3.9" and python_version < "3.10" \ - --hash=sha256:73aae30359291c14fa3b956f8b5ca31960e420c28c1bec002547fb04928cf89b \ - --hash=sha256:b64ef5141be559cfade448f044fa45c2260351edcb6a8ef6b7e00c7dcef0c323 -xarray==2024.6.0 ; python_version >= "3.9" \ - --hash=sha256:0b91e0bc4dc0296947947640fe31ec6e867ce258d2f7cbc10bedf4a6d68340c7 \ - --hash=sha256:721a7394e8ec3d592b2d8ebe21eed074ac077dc1bb1bd777ce00e41700b4866c -xarray[io]==2024.6.0 ; python_version >= "3.9" \ - --hash=sha256:0b91e0bc4dc0296947947640fe31ec6e867ce258d2f7cbc10bedf4a6d68340c7 \ - --hash=sha256:721a7394e8ec3d592b2d8ebe21eed074ac077dc1bb1bd777ce00e41700b4866c -zarr==2.18.2 ; python_version >= "3.9" \ - --hash=sha256:9bb393b8a0a38fb121dbb913b047d75db28de9890f6d644a217a73cf4ae74f47 \ - --hash=sha256:a638754902f97efa99b406083fdc807a0e2ccf12a949117389d2a4ba9b05df38 +pytz==2025.2 ; python_version >= "3.10" \ + --hash=sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3 \ + --hash=sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00 +pyyaml==6.0.3 ; python_version >= "3.10" \ + --hash=sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c \ + --hash=sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a \ + --hash=sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3 \ + --hash=sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956 \ + --hash=sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6 \ + --hash=sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c \ + --hash=sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65 \ + --hash=sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a \ + --hash=sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0 \ + --hash=sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b \ + --hash=sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1 \ + --hash=sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7 \ + --hash=sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e \ + --hash=sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007 \ + --hash=sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310 \ + --hash=sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4 \ + --hash=sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9 \ + --hash=sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea \ + --hash=sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0 \ + --hash=sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e \ + --hash=sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac \ + --hash=sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9 \ + --hash=sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7 \ + --hash=sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35 \ + --hash=sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb \ + --hash=sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69 \ + --hash=sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5 \ + --hash=sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b \ + --hash=sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c \ + --hash=sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd \ + --hash=sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824 \ + --hash=sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198 \ + --hash=sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065 \ + --hash=sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c \ + --hash=sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c \ + --hash=sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764 \ + --hash=sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196 \ + --hash=sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b \ + --hash=sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00 \ + --hash=sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac \ + --hash=sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8 \ + --hash=sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e \ + --hash=sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28 \ + --hash=sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3 \ + --hash=sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5 \ + --hash=sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b \ + --hash=sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf \ + --hash=sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5 \ + --hash=sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702 \ + --hash=sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8 \ + --hash=sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788 \ + --hash=sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da \ + --hash=sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d \ + --hash=sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc \ + --hash=sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c \ + --hash=sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba \ + --hash=sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917 \ + --hash=sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5 \ + --hash=sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26 \ + --hash=sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f \ + --hash=sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b \ + --hash=sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be \ + --hash=sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c \ + --hash=sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6 \ + --hash=sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926 \ + --hash=sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0 +requests==2.32.5 ; python_version >= "3.10" \ + --hash=sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6 \ + --hash=sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf +scipy==1.15.3 ; python_version >= "3.10" \ + --hash=sha256:05dc6abcd105e1a29f95eada46d4a3f251743cfd7d3ae8ddb4088047f24ea477 \ + --hash=sha256:06efcba926324df1696931a57a176c80848ccd67ce6ad020c810736bfd58eb1c \ + --hash=sha256:0a769105537aa07a69468a0eefcd121be52006db61cdd8cac8a0e68980bbb723 \ + --hash=sha256:0bdd905264c0c9cfa74a4772cdb2070171790381a5c4d312c973382fc6eaf730 \ + --hash=sha256:0ff17c0bb1cb32952c09217d8d1eed9b53d1463e5f1dd6052c7857f83127d539 \ + --hash=sha256:14ed70039d182f411ffc74789a16df3835e05dc469b898233a245cdfd7f162cb \ + --hash=sha256:185cd3d6d05ca4b44a8f1595af87f9c372bb6acf9c808e99aa3e9aa03bd98cf6 \ + --hash=sha256:18aaacb735ab38b38db42cb01f6b92a2d0d4b6aabefeb07f02849e47f8fb3594 \ + --hash=sha256:1c832e1bd78dea67d5c16f786681b28dd695a8cb1fb90af2e27580d3d0967e92 \ + --hash=sha256:263961f658ce2165bbd7b99fa5135195c3a12d9bef045345016b8b50c315cb82 \ + --hash=sha256:271e3713e645149ea5ea3e97b57fdab61ce61333f97cfae392c28ba786f9bb49 \ + --hash=sha256:2c620736bcc334782e24d173c0fdbb7590a0a436d2fdf39310a8902505008759 \ + --hash=sha256:34716e281f181a02341ddeaad584205bd2fd3c242063bd3423d61ac259ca7eba \ + --hash=sha256:39cb9c62e471b1bb3750066ecc3a3f3052b37751c7c3dfd0fd7e48900ed52982 \ + --hash=sha256:3ac07623267feb3ae308487c260ac684b32ea35fd81e12845039952f558047b8 \ + --hash=sha256:3b0334816afb8b91dab859281b1b9786934392aa3d527cd847e41bb6f45bee65 \ + --hash=sha256:40e54d5c7e7ebf1aa596c374c49fa3135f04648a0caabcb66c52884b943f02b4 \ + --hash=sha256:50f9e62461c95d933d5c5ef4a1f2ebf9a2b4e83b0db374cb3f1de104d935922e \ + --hash=sha256:52092bc0472cfd17df49ff17e70624345efece4e1a12b23783a1ac59a1b728ed \ + --hash=sha256:5380741e53df2c566f4d234b100a484b420af85deb39ea35a1cc1be84ff53a5c \ + --hash=sha256:5e721fed53187e71d0ccf382b6bf977644c533e506c4d33c3fb24de89f5c3ed5 \ + --hash=sha256:6487aa99c2a3d509a5227d9a5e889ff05830a06b2ce08ec30df6d79db5fcd5c5 \ + --hash=sha256:6ac6310fdbfb7aa6612408bd2f07295bcbd3fda00d2d702178434751fe48e019 \ + --hash=sha256:6cfd56fc1a8e53f6e89ba3a7a7251f7396412d655bca2aa5611c8ec9a6784a1e \ + --hash=sha256:6db907c7368e3092e24919b5e31c76998b0ce1684d51a90943cb0ed1b4ffd6c1 \ + --hash=sha256:721d6b4ef5dc82ca8968c25b111e307083d7ca9091bc38163fb89243e85e3889 \ + --hash=sha256:76ad1fb5f8752eabf0fa02e4cc0336b4e8f021e2d5f061ed37d6d264db35e3ca \ + --hash=sha256:79167bba085c31f38603e11a267d862957cbb3ce018d8b38f79ac043bc92d825 \ + --hash=sha256:795c46999bae845966368a3c013e0e00947932d68e235702b5c3f6ea799aa8c9 \ + --hash=sha256:7e11270a000969409d37ed399585ee530b9ef6aa99d50c019de4cb01e8e54e62 \ + --hash=sha256:8c9ed3ba2c8a2ce098163a9bdb26f891746d02136995df25227a20e71c396ebb \ + --hash=sha256:993439ce220d25e3696d1b23b233dd010169b62f6456488567e830654ee37a6b \ + --hash=sha256:9d61e97b186a57350f6d6fd72640f9e99d5a4a2b8fbf4b9ee9a841eab327dc13 \ + --hash=sha256:9db984639887e3dffb3928d118145ffe40eff2fa40cb241a306ec57c219ebbbb \ + --hash=sha256:9e2abc762b0811e09a0d3258abee2d98e0c703eee49464ce0069590846f31d40 \ + --hash=sha256:a345928c86d535060c9c2b25e71e87c39ab2f22fc96e9636bd74d1dbf9de448c \ + --hash=sha256:ad3432cb0f9ed87477a8d97f03b763fd1d57709f1bbde3c9369b1dff5503b253 \ + --hash=sha256:ae48a786a28412d744c62fd7816a4118ef97e5be0bee968ce8f0a2fba7acf3bb \ + --hash=sha256:aef683a9ae6eb00728a542b796f52a5477b78252edede72b8327a886ab63293f \ + --hash=sha256:b90ab29d0c37ec9bf55424c064312930ca5f4bde15ee8619ee44e69319aab163 \ + --hash=sha256:c05045d8b9bfd807ee1b9f38761993297b10b245f012b11b13b91ba8945f7e45 \ + --hash=sha256:c9deabd6d547aee2c9a81dee6cc96c6d7e9a9b1953f74850c179f91fdc729cb7 \ + --hash=sha256:dde4fc32993071ac0c7dd2d82569e544f0bdaff66269cb475e0f369adad13f11 \ + --hash=sha256:eae3cf522bc7df64b42cad3925c876e1b0b6c35c1337c93e12c0f366f55b0eaf \ + --hash=sha256:ed7284b21a7a0c8f1b6e5977ac05396c0d008b89e05498c8b7e8f4a1423bba0e \ + --hash=sha256:f77f853d584e72e874d87357ad70f44b437331507d1c311457bed8ed2b956126 +six==1.17.0 ; python_version >= "3.10" \ + --hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 \ + --hash=sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81 +tomli==2.2.1 ; python_version < "3.11" and python_version >= "3.10" \ + --hash=sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6 \ + --hash=sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd \ + --hash=sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c \ + --hash=sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b \ + --hash=sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8 \ + --hash=sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6 \ + --hash=sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77 \ + --hash=sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff \ + --hash=sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea \ + --hash=sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192 \ + --hash=sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249 \ + --hash=sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee \ + --hash=sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4 \ + --hash=sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98 \ + --hash=sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8 \ + --hash=sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4 \ + --hash=sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281 \ + --hash=sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744 \ + --hash=sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69 \ + --hash=sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13 \ + --hash=sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140 \ + --hash=sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e \ + --hash=sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e \ + --hash=sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc \ + --hash=sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff \ + --hash=sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec \ + --hash=sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2 \ + --hash=sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222 \ + --hash=sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106 \ + --hash=sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272 \ + --hash=sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a \ + --hash=sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7 +toolz==1.0.0 ; python_version >= "3.10" \ + --hash=sha256:292c8f1c4e7516bf9086f8850935c799a874039c8bcf959d47b600e4c44a6236 \ + --hash=sha256:2c86e3d9a04798ac556793bced838816296a2f085017664e4995cb40a1047a02 +typing-extensions==4.15.0 ; python_version < "3.11" and python_version >= "3.10" \ + --hash=sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466 \ + --hash=sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548 +tzdata==2025.2 ; python_version >= "3.10" \ + --hash=sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8 \ + --hash=sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9 +urllib3==2.5.0 ; python_version >= "3.10" \ + --hash=sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760 \ + --hash=sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc +xarray==2025.6.1 ; python_version >= "3.10" \ + --hash=sha256:8b988b47f67a383bdc3b04c5db475cd165e580134c1f1943d52aee4a9c97651b \ + --hash=sha256:a84f3f07544634a130d7dc615ae44175419f4c77957a7255161ed99c69c7c8b0 +xarray[io]==2025.6.1 ; python_version >= "3.10" \ + --hash=sha256:8b988b47f67a383bdc3b04c5db475cd165e580134c1f1943d52aee4a9c97651b \ + --hash=sha256:a84f3f07544634a130d7dc615ae44175419f4c77957a7255161ed99c69c7c8b0 +zarr==2.18.3 ; python_version >= "3.10" \ + --hash=sha256:2580d8cb6dd84621771a10d31c4d777dca8a27706a1a89b29f42d2d37e2df5ce \ + --hash=sha256:b1f7dfd2496f436745cdd4c7bcf8d3b4bc1dceef5fdd0d589c87130d842496dd +zipp==3.23.0 ; python_version < "3.12" and python_version >= "3.10" \ + --hash=sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e \ + --hash=sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166 diff --git a/requirements/requirements.txt b/requirements/requirements.txt index a7a4cc2..7ab1329 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -1,91 +1,130 @@ -numpy==2.0.0 ; python_version >= "3.9" \ - --hash=sha256:04494f6ec467ccb5369d1808570ae55f6ed9b5809d7f035059000a37b8d7e86f \ - --hash=sha256:0a43f0974d501842866cc83471bdb0116ba0dffdbaac33ec05e6afed5b615238 \ - --hash=sha256:0e50842b2295ba8414c8c1d9d957083d5dfe9e16828b37de883f51fc53c4016f \ - --hash=sha256:0ec84b9ba0654f3b962802edc91424331f423dcf5d5f926676e0150789cb3d95 \ - --hash=sha256:17067d097ed036636fa79f6a869ac26df7db1ba22039d962422506640314933a \ - --hash=sha256:1cde1753efe513705a0c6d28f5884e22bdc30438bf0085c5c486cdaff40cd67a \ - --hash=sha256:1e72728e7501a450288fc8e1f9ebc73d90cfd4671ebbd631f3e7857c39bd16f2 \ - --hash=sha256:2635dbd200c2d6faf2ef9a0d04f0ecc6b13b3cad54f7c67c61155138835515d2 \ - --hash=sha256:2ce46fd0b8a0c947ae047d222f7136fc4d55538741373107574271bc00e20e8f \ - --hash=sha256:34f003cb88b1ba38cb9a9a4a3161c1604973d7f9d5552c38bc2f04f829536609 \ - --hash=sha256:354f373279768fa5a584bac997de6a6c9bc535c482592d7a813bb0c09be6c76f \ - --hash=sha256:38ecb5b0582cd125f67a629072fed6f83562d9dd04d7e03256c9829bdec027ad \ - --hash=sha256:3e8e01233d57639b2e30966c63d36fcea099d17c53bf424d77f088b0f4babd86 \ - --hash=sha256:3f6bed7f840d44c08ebdb73b1825282b801799e325bcbdfa6bc5c370e5aecc65 \ - --hash=sha256:4554eb96f0fd263041baf16cf0881b3f5dafae7a59b1049acb9540c4d57bc8cb \ - --hash=sha256:46e161722e0f619749d1cd892167039015b2c2817296104487cd03ed4a955995 \ - --hash=sha256:49d9f7d256fbc804391a7f72d4a617302b1afac1112fac19b6c6cec63fe7fe8a \ - --hash=sha256:4d2f62e55a4cd9c58c1d9a1c9edaedcd857a73cb6fda875bf79093f9d9086f85 \ - --hash=sha256:5f64641b42b2429f56ee08b4f427a4d2daf916ec59686061de751a55aafa22e4 \ - --hash=sha256:63b92c512d9dbcc37f9d81b123dec99fdb318ba38c8059afc78086fe73820275 \ - --hash=sha256:6d7696c615765091cc5093f76fd1fa069870304beaccfd58b5dcc69e55ef49c1 \ - --hash=sha256:79e843d186c8fb1b102bef3e2bc35ef81160ffef3194646a7fdd6a73c6b97196 \ - --hash=sha256:821eedb7165ead9eebdb569986968b541f9908979c2da8a4967ecac4439bae3d \ - --hash=sha256:84554fc53daa8f6abf8e8a66e076aff6ece62de68523d9f665f32d2fc50fd66e \ - --hash=sha256:8d83bb187fb647643bd56e1ae43f273c7f4dbcdf94550d7938cfc32566756514 \ - --hash=sha256:903703372d46bce88b6920a0cd86c3ad82dae2dbef157b5fc01b70ea1cfc430f \ - --hash=sha256:9416a5c2e92ace094e9f0082c5fd473502c91651fb896bc17690d6fc475128d6 \ - --hash=sha256:9a1712c015831da583b21c5bfe15e8684137097969c6d22e8316ba66b5baabe4 \ - --hash=sha256:9c27f0946a3536403efb0e1c28def1ae6730a72cd0d5878db38824855e3afc44 \ - --hash=sha256:a356364941fb0593bb899a1076b92dfa2029f6f5b8ba88a14fd0984aaf76d0df \ - --hash=sha256:a7039a136017eaa92c1848152827e1424701532ca8e8967fe480fe1569dae581 \ - --hash=sha256:acd3a644e4807e73b4e1867b769fbf1ce8c5d80e7caaef0d90dcdc640dfc9787 \ - --hash=sha256:ad0c86f3455fbd0de6c31a3056eb822fc939f81b1618f10ff3406971893b62a5 \ - --hash=sha256:b4c76e3d4c56f145d41b7b6751255feefae92edbc9a61e1758a98204200f30fc \ - --hash=sha256:b6f6a8f45d0313db07d6d1d37bd0b112f887e1369758a5419c0370ba915b3871 \ - --hash=sha256:c5a59996dc61835133b56a32ebe4ef3740ea5bc19b3983ac60cc32be5a665d54 \ - --hash=sha256:c73aafd1afca80afecb22718f8700b40ac7cab927b8abab3c3e337d70e10e5a2 \ - --hash=sha256:cee6cc0584f71adefe2c908856ccc98702baf95ff80092e4ca46061538a2ba98 \ - --hash=sha256:cef04d068f5fb0518a77857953193b6bb94809a806bd0a14983a8f12ada060c9 \ - --hash=sha256:cf5d1c9e6837f8af9f92b6bd3e86d513cdc11f60fd62185cc49ec7d1aba34864 \ - --hash=sha256:e61155fae27570692ad1d327e81c6cf27d535a5d7ef97648a17d922224b216de \ - --hash=sha256:e7f387600d424f91576af20518334df3d97bc76a300a755f9a8d6e4f5cadd289 \ - --hash=sha256:ed08d2703b5972ec736451b818c2eb9da80d66c3e84aed1deeb0c345fefe461b \ - --hash=sha256:fbd6acc766814ea6443628f4e6751d0da6593dae29c08c0b2606164db026970c \ - --hash=sha256:feff59f27338135776f6d4e2ec7aeeac5d5f7a08a83e80869121ef8164b74af9 -packaging==24.1 ; python_version >= "3.9" \ - --hash=sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002 \ - --hash=sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124 -pandas==2.2.2 ; python_version >= "3.9" \ - --hash=sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863 \ - --hash=sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2 \ - --hash=sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1 \ - --hash=sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad \ - --hash=sha256:2925720037f06e89af896c70bca73459d7e6a4be96f9de79e2d440bd499fe0db \ - --hash=sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76 \ - --hash=sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51 \ - --hash=sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32 \ - --hash=sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08 \ - --hash=sha256:58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b \ - --hash=sha256:640cef9aa381b60e296db324337a554aeeb883ead99dc8f6c18e81a93942f5f4 \ - --hash=sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921 \ - --hash=sha256:696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288 \ - --hash=sha256:6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee \ - --hash=sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0 \ - --hash=sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24 \ - --hash=sha256:8e5a0b00e1e56a842f922e7fae8ae4077aee4af0acb5ae3622bd4b4c30aedf99 \ - --hash=sha256:8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151 \ - --hash=sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce \ - --hash=sha256:92fd6b027924a7e178ac202cfbe25e53368db90d56872d20ffae94b96c7acc57 \ - --hash=sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef \ - --hash=sha256:9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54 \ - --hash=sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a \ - --hash=sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23 \ - --hash=sha256:ddf818e4e6c7c6f4f7c8a12709696d193976b591cc7dc50588d3d1a6b5dc8772 \ - --hash=sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad -python-dateutil==2.9.0.post0 ; python_version >= "3.9" \ +numpy==2.2.6 ; python_version >= "3.10" \ + --hash=sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff \ + --hash=sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47 \ + --hash=sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84 \ + --hash=sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d \ + --hash=sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6 \ + --hash=sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f \ + --hash=sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b \ + --hash=sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49 \ + --hash=sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163 \ + --hash=sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571 \ + --hash=sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42 \ + --hash=sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff \ + --hash=sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491 \ + --hash=sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4 \ + --hash=sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566 \ + --hash=sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf \ + --hash=sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40 \ + --hash=sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd \ + --hash=sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06 \ + --hash=sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282 \ + --hash=sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680 \ + --hash=sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db \ + --hash=sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3 \ + --hash=sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90 \ + --hash=sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1 \ + --hash=sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289 \ + --hash=sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab \ + --hash=sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c \ + --hash=sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d \ + --hash=sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb \ + --hash=sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d \ + --hash=sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a \ + --hash=sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf \ + --hash=sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1 \ + --hash=sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2 \ + --hash=sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a \ + --hash=sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543 \ + --hash=sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00 \ + --hash=sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c \ + --hash=sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f \ + --hash=sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd \ + --hash=sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868 \ + --hash=sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303 \ + --hash=sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83 \ + --hash=sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3 \ + --hash=sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d \ + --hash=sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87 \ + --hash=sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa \ + --hash=sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f \ + --hash=sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae \ + --hash=sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda \ + --hash=sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915 \ + --hash=sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249 \ + --hash=sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de \ + --hash=sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8 +packaging==25.0 ; python_version >= "3.10" \ + --hash=sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484 \ + --hash=sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f +pandas==2.3.3 ; python_version >= "3.10" \ + --hash=sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7 \ + --hash=sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593 \ + --hash=sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5 \ + --hash=sha256:1d37b5848ba49824e5c30bedb9c830ab9b7751fd049bc7914533e01c65f79791 \ + --hash=sha256:23ebd657a4d38268c7dfbdf089fbc31ea709d82e4923c5ffd4fbd5747133ce73 \ + --hash=sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec \ + --hash=sha256:28083c648d9a99a5dd035ec125d42439c6c1c525098c58af0fc38dd1a7a1b3d4 \ + --hash=sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5 \ + --hash=sha256:318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac \ + --hash=sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084 \ + --hash=sha256:376c6446ae31770764215a6c937f72d917f214b43560603cd60da6408f183b6c \ + --hash=sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87 \ + --hash=sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35 \ + --hash=sha256:4793891684806ae50d1288c9bae9330293ab4e083ccd1c5e383c34549c6e4250 \ + --hash=sha256:4e0a175408804d566144e170d0476b15d78458795bb18f1304fb94160cabf40c \ + --hash=sha256:503cf027cf9940d2ceaa1a93cfb5f8c8c7e6e90720a2850378f0b3f3b1e06826 \ + --hash=sha256:5554c929ccc317d41a5e3d1234f3be588248e61f08a74dd17c9eabb535777dc9 \ + --hash=sha256:56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713 \ + --hash=sha256:5caf26f64126b6c7aec964f74266f435afef1c1b13da3b0636c7518a1fa3e2b1 \ + --hash=sha256:602b8615ebcc4a0c1751e71840428ddebeb142ec02c786e8ad6b1ce3c8dec523 \ + --hash=sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3 \ + --hash=sha256:6435cb949cb34ec11cc9860246ccb2fdc9ecd742c12d3304989017d53f039a78 \ + --hash=sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53 \ + --hash=sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c \ + --hash=sha256:74ecdf1d301e812db96a465a525952f4dde225fdb6d8e5a521d47e1f42041e21 \ + --hash=sha256:75ea25f9529fdec2d2e93a42c523962261e567d250b0013b16210e1d40d7c2e5 \ + --hash=sha256:854d00d556406bffe66a4c0802f334c9ad5a96b4f1f868adf036a21b11ef13ff \ + --hash=sha256:8fe25fc7b623b0ef6b5009149627e34d2a4657e880948ec3c840e9402e5c1b45 \ + --hash=sha256:900f47d8f20860de523a1ac881c4c36d65efcb2eb850e6948140fa781736e110 \ + --hash=sha256:93c2d9ab0fc11822b5eece72ec9587e172f63cff87c00b062f6e37448ced4493 \ + --hash=sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b \ + --hash=sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450 \ + --hash=sha256:a45c765238e2ed7d7c608fc5bc4a6f88b642f2f01e70c0c23d2224dd21829d86 \ + --hash=sha256:a637c5cdfa04b6d6e2ecedcb81fc52ffb0fd78ce2ebccc9ea964df9f658de8c8 \ + --hash=sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98 \ + --hash=sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89 \ + --hash=sha256:b468d3dad6ff947df92dcb32ede5b7bd41a9b3cceef0a30ed925f6d01fb8fa66 \ + --hash=sha256:b98560e98cb334799c0b07ca7967ac361a47326e9b4e5a7dfb5ab2b1c9d35a1b \ + --hash=sha256:bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8 \ + --hash=sha256:bf1f8a81d04ca90e32a0aceb819d34dbd378a98bf923b6398b9a3ec0bf44de29 \ + --hash=sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6 \ + --hash=sha256:c4fc4c21971a1a9f4bdb4c73978c7f7256caa3e62b323f70d6cb80db583350bc \ + --hash=sha256:c503ba5216814e295f40711470446bc3fd00f0faea8a086cbc688808e26f92a2 \ + --hash=sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788 \ + --hash=sha256:d3e28b3e83862ccf4d85ff19cf8c20b2ae7e503881711ff2d534dc8f761131aa \ + --hash=sha256:db4301b2d1f926ae677a751eb2bd0e8c5f5319c9cb3f88b0becbbb0b07b34151 \ + --hash=sha256:dd7478f1463441ae4ca7308a70e90b33470fa593429f9d4c578dd00d1fa78838 \ + --hash=sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b \ + --hash=sha256:e19d192383eab2f4ceb30b412b22ea30690c9e618f78870357ae1d682912015a \ + --hash=sha256:e32e7cc9af0f1cc15548288a51a3b681cc2a219faa838e995f7dc53dbab1062d \ + --hash=sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908 \ + --hash=sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0 \ + --hash=sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b \ + --hash=sha256:f086f6fe114e19d92014a1966f43a3e62285109afe874f067f5abbdcbb10e59c \ + --hash=sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee +python-dateutil==2.9.0.post0 ; python_version >= "3.10" \ --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 -pytz==2024.1 ; python_version >= "3.9" \ - --hash=sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812 \ - --hash=sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319 -six==1.16.0 ; python_version >= "3.9" \ - --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ - --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 -tzdata==2024.1 ; python_version >= "3.9" \ - --hash=sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd \ - --hash=sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252 -xarray==2024.6.0 ; python_version >= "3.9" \ - --hash=sha256:0b91e0bc4dc0296947947640fe31ec6e867ce258d2f7cbc10bedf4a6d68340c7 \ - --hash=sha256:721a7394e8ec3d592b2d8ebe21eed074ac077dc1bb1bd777ce00e41700b4866c +pytz==2025.2 ; python_version >= "3.10" \ + --hash=sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3 \ + --hash=sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00 +six==1.17.0 ; python_version >= "3.10" \ + --hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 \ + --hash=sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81 +tzdata==2025.2 ; python_version >= "3.10" \ + --hash=sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8 \ + --hash=sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9 +xarray==2025.6.1 ; python_version >= "3.10" \ + --hash=sha256:8b988b47f67a383bdc3b04c5db475cd165e580134c1f1943d52aee4a9c97651b \ + --hash=sha256:a84f3f07544634a130d7dc615ae44175419f4c77957a7255161ed99c69c7c8b0 From 13dc6ee3d79bdf16f8bc6c12cbcbb63963245448 Mon Sep 17 00:00:00 2001 From: Luc DURON Date: Wed, 15 Oct 2025 14:08:29 +0200 Subject: [PATCH 03/12] Fix test_eager_vs_lazy --- tests/io_test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/io_test.py b/tests/io_test.py index 78ae949..dd4cf46 100644 --- a/tests/io_test.py +++ b/tests/io_test.py @@ -220,10 +220,10 @@ def analyze_block(ds_block: xr.Dataset) -> xr.Dataset: @BUMP def test_eager_vs_lazy(slf_in): - with xr.load_dataset(slf_in, engine="selafin") as ds_eager: + with xr.load_dataset(slf_in, lazy_loading=False, engine="selafin") as ds_eager: z_levels_eager = ds_eager.Z.isel(time=0).drop_vars("time") dz_eager = z_levels_eager.diff(dim="plan") - with xr.open_dataset(slf_in, engine="selafin") as ds_lazy: + with xr.open_dataset(slf_in, lazy_loading=True, engine="selafin") as ds_lazy: z_levels_lazy = ds_lazy.Z.isel(time=0).drop_vars("time") dz_lazy = z_levels_lazy.diff(dim="plan") xr.testing.assert_allclose(dz_eager, dz_lazy, rtol=1e-3) From 0fd18a60cdeffda9d7a6dd5f2164b70242f48497 Mon Sep 17 00:00:00 2001 From: Luc DURON Date: Wed, 15 Oct 2025 15:40:16 +0200 Subject: [PATCH 04/12] Explicitly specify engine in io_tests.py --- tests/io_test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/io_test.py b/tests/io_test.py index dd4cf46..7bb7642 100644 --- a/tests/io_test.py +++ b/tests/io_test.py @@ -189,11 +189,11 @@ def analyze_block(ds_block: xr.Dataset) -> xr.Dataset: return ds_block.mean(dim=dim_test) # --- Reference computation without Dask --- - ds_ref = xr.open_dataset(slf_in, chunks=None) + ds_ref = xr.open_dataset(slf_in, engine="selafin", chunks=None) ref = ds_ref.mean(dim=dim_test) # --- Dask-based computation --- - with xr.open_dataset(slf_in) as ds: + with xr.open_dataset(slf_in, engine="selafin") as ds: ds = ds.chunk({"time": -1, "node": 50}) result = xr.map_blocks(analyze_block, ds).compute() computed = result.compute() From b5b644f2fa93905b61ce9d2aa396a4b18607fbd7 Mon Sep 17 00:00:00 2001 From: Luc DURON Date: Wed, 15 Oct 2025 16:19:08 +0200 Subject: [PATCH 05/12] Add a lock for dask to avoid unexpected buffer truncation while reading - Use a dask.utils.SerializableLock instance to avoid conflict while reading - Refactor some variable in loops to be more precise - Add a SerafinRequestError in cas of buffer truncation (in Serafin.read_var_in_frame) --- tests/io_test.py | 2 +- xarray_selafin/Serafin.py | 6 +- xarray_selafin/xarray_backend.py | 169 ++++++++++++++++++------------- 3 files changed, 102 insertions(+), 75 deletions(-) diff --git a/tests/io_test.py b/tests/io_test.py index 7bb7642..bbe19c7 100644 --- a/tests/io_test.py +++ b/tests/io_test.py @@ -184,7 +184,7 @@ def test_dim(slf_in): @DIMS @NODE_TIME -def test_dask_mean_consistency(slf_in, dim_test): +def test_dask_mean_consistency(slf_in, dim_test): # requires dask def analyze_block(ds_block: xr.Dataset) -> xr.Dataset: return ds_block.mean(dim=dim_test) diff --git a/xarray_selafin/Serafin.py b/xarray_selafin/Serafin.py index b6dd26b..b812fcf 100644 --- a/xarray_selafin/Serafin.py +++ b/xarray_selafin/Serafin.py @@ -1100,9 +1100,13 @@ def read_var_in_frame(self, time_index, var_ID): pos_var = self._get_var_index(var_ID) self._seek_to_frame(time_index, pos_var) self.file.read(4) - return self.unpack_array( + array = self.unpack_array( self.header.float_size * self.header.nb_nodes, self.header.np_type ) + if len(array) != self.header.nb_nodes: + raise SerafinRequestError("CRITICAL ERROR: buffer was truncated (%i vs %i values) while reading" + % (len(array), self.header.nb_nodes)) + return array def read_vars_in_frame(self, time_index, var_IDs=None): """! diff --git a/xarray_selafin/xarray_backend.py b/xarray_selafin/xarray_backend.py index 6e5ddf6..551af46 100644 --- a/xarray_selafin/xarray_backend.py +++ b/xarray_selafin/xarray_backend.py @@ -1,17 +1,28 @@ +""" +Documentation on how to implement a new backend in xarray +* https://docs.xarray.dev/en/latest/internals/how-to-add-new-backend.html +* https://tutorial.xarray.dev/advanced/backends/2.Backend_with_Lazy_Loading.html +""" import os from datetime import datetime from datetime import timedelta -from operator import attrgetter - import numpy as np +from operator import attrgetter +import threading import xarray as xr -from xarray.backends import BackendArray -from xarray.backends import BackendEntrypoint +from xarray.backends import BackendArray, BackendEntrypoint from xarray.core import indexing from xarray_selafin import Serafin +try: + import dask + DASK_AVAILABLE = True +except ImportError: + DASK_AVAILABLE = False + + DEFAULT_DATE_START = (1900, 1, 1, 0, 0, 0) @@ -157,31 +168,33 @@ def write_serafin(fout, ds): return # no time (header only is written) if isinstance(time_serie, float): time_serie = [time_serie] - for it, t_ in enumerate(time_serie): + for time_index, time in enumerate(time_serie): temp = np.empty(shape, dtype=slf_header.np_float_type) for iv, var in enumerate(slf_header.var_IDs): if slf_header.nb_frames == 1: temp[iv] = ds[var].values else: - temp[iv] = ds.isel(time=it)[var].values + temp[iv] = ds.isel(time=time_index)[var].values if slf_header.nb_planes > 1: temp[iv] = np.reshape( np.ravel(temp[iv]), (slf_header.nb_planes, slf_header.nb_nodes_2d) ) resout.write_entire_frame( slf_header, - t_, + time, np.reshape(temp, (slf_header.nb_var, slf_header.nb_nodes)), ) class SelafinLazyArray(BackendArray): - # not implemented yet: too slow - def __init__(self, slf_reader, var, dtype, shape): - self.slf_reader = slf_reader - self.var = var - self.dtype = dtype + + def __init__(self, filename_or_obj, shape, dtype, lock, var): + self.filename_or_obj = filename_or_obj self.shape = shape + self.dtype = dtype + self.lock = lock + # Below are other backend specific keyword arguments + self.var = var def __getitem__(self, key): return indexing.explicit_indexing_adapter( @@ -192,71 +205,70 @@ def __getitem__(self, key): ) def _raw_indexing_method(self, key): - ndim = len(self.shape) - if ndim not in (2, 3): - raise NotImplementedError(f"Unsupported SELAFIN shape {self.shape}") - - if not isinstance(key, tuple): - raise NotImplementedError("SELAFIN access must use tuple indexing") - - # Pad key with slices to match array dimensions - ndim = len(self.shape) - if len(key) < ndim: - key = key + (slice(None),) * (ndim - len(key)) - - # --- Parse keys - if ndim == 3: - # 3D file - if len(key) == 3: - time_key, plan_key, node_key = key - elif len(key) == 2: - time_key, node_key = key - plan_key = slice(None) - else: - raise NotImplementedError("Only (time, plan, node) or (time, node) supported for 3D files") - else: - # 2D file - if len(key) == 2: - time_key, node_key = key - elif len(key) == 1: - time_key = key[0] - node_key = slice(None) - else: - raise NotImplementedError("Only (time, node) supported for 2D files") - - # --- helper - def _range_from_key(k, n): - if isinstance(k, slice): - return range(*k.indices(n)) - elif isinstance(k, int): - return [k] - else: - raise ValueError("index must be int or slice") + with self.lock: + ndim = len(self.shape) + if ndim not in (2, 3): + raise NotImplementedError(f"Unsupported SELAFIN shape {self.shape}") - time_indices = _range_from_key(time_key, self.shape[0]) + if not isinstance(key, tuple): + raise NotImplementedError("SELAFIN access must use tuple indexing") - if ndim == 3: - plan_indices = _range_from_key(plan_key, self.shape[1]) - node_indices = _range_from_key(node_key, self.shape[2]) - data_shape = (len(time_indices), len(plan_indices), len(node_indices)) - else: - node_indices = _range_from_key(node_key, self.shape[1]) - data_shape = (len(time_indices), len(node_indices)) - - data = np.empty(data_shape, dtype=self.dtype) + # Pad key with slices to match array dimensions + ndim = len(self.shape) + if len(key) < ndim: + key = key + (slice(None),) * (ndim - len(key)) - for it, t in enumerate(time_indices): - temp = self.slf_reader.read_var_in_frame(t, self.var) + # --- Parse keys if ndim == 3: - temp = np.reshape(temp, (self.shape[1], self.shape[2])) # (nplan, nnode) - values = temp[np.ix_(plan_indices, node_indices)] - data[it, :, :] = values + # 3D file + if len(key) == 3: + time_key, plan_key, node_key = key + elif len(key) == 2: + time_key, node_key = key + plan_key = slice(None) + else: + raise NotImplementedError("Only (time, plan, node) or (time, node) supported for 3D files") else: - temp = np.asarray(temp) # (nnode,) - values = temp[node_indices] - data[it, :] = values + # 2D file + if len(key) == 2: + time_key, node_key = key + elif len(key) == 1: + time_key = key[0] + node_key = slice(None) + else: + raise NotImplementedError("Only (time, node) supported for 2D files") + + # --- helper + def _range_from_key(k, n): + if isinstance(k, slice): + return range(*k.indices(n)) + elif isinstance(k, int): + return [k] + else: + raise ValueError("index must be int or slice") + + time_indices = _range_from_key(time_key, self.shape[0]) - return data.squeeze() + if ndim == 3: + plan_indices = _range_from_key(plan_key, self.shape[1]) + node_indices = _range_from_key(node_key, self.shape[2]) + data_shape = (len(time_indices), len(plan_indices), len(node_indices)) + else: # ndim = 2 + node_indices = _range_from_key(node_key, self.shape[1]) + data_shape = (len(time_indices), len(node_indices)) + + data = np.empty(data_shape, dtype=self.dtype) + + for data_index, time_index in enumerate(time_indices): + temp = self.filename_or_obj.read_var_in_frame(time_index, self.var) # np.ndarray + + if ndim == 3: + temp = np.reshape(temp, (self.shape[1], self.shape[2])) # (nplan, nnode) + data[data_index, :, :] = temp[np.ix_(plan_indices, node_indices)] + else: # ndim = 2 + data[data_index, :] = temp[node_indices] + + return data.squeeze() class SelafinBackendEntrypoint(BackendEntrypoint): @@ -269,6 +281,7 @@ def open_dataset( # Below are custom arguments lazy_loading=True, lang=Serafin.LANG, + # `chunks` and `cache` DO NOT go here, they are handled by xarray ): # Initialize SELAFIN reader slf = read_serafin(filename_or_obj, lang) @@ -296,14 +309,24 @@ def open_dataset( shape = (len(times), nplan, npoin2) dims = ["time", "plan", "node"] + if DASK_AVAILABLE: + file_lock = dask.utils.SerializableLock() + else: + file_lock = threading.Lock() + for var in vars: if lazy_loading: - lazy_array = SelafinLazyArray(slf, var, dtype, shape) + lazy_array = SelafinLazyArray( + filename_or_obj=slf, + shape=shape, + dtype=dtype, + lock=file_lock, + var=var) data = indexing.LazilyIndexedArray(lazy_array) data_vars[var] = xr.Variable(dims=dims, data=data) else: data = np.empty(shape, dtype=dtype) - for time_index, t in enumerate(times): + for time_index, _ in enumerate(times): values = slf.read_var_in_frame(time_index, var) if is_2d: data[time_index, :] = values From abc0be8b93b99ec7520e5df98026cbe105fc39a1 Mon Sep 17 00:00:00 2001 From: Luc DURON Date: Wed, 15 Oct 2025 21:54:02 +0200 Subject: [PATCH 06/12] Improve code in SelafinLazyArray --- tests/io_test.py | 2 +- xarray_selafin/xarray_backend.py | 126 +++++++++++++++++-------------- 2 files changed, 69 insertions(+), 59 deletions(-) diff --git a/tests/io_test.py b/tests/io_test.py index bbe19c7..75ac5af 100644 --- a/tests/io_test.py +++ b/tests/io_test.py @@ -195,7 +195,7 @@ def analyze_block(ds_block: xr.Dataset) -> xr.Dataset: # --- Dask-based computation --- with xr.open_dataset(slf_in, engine="selafin") as ds: ds = ds.chunk({"time": -1, "node": 50}) - result = xr.map_blocks(analyze_block, ds).compute() + result = xr.map_blocks(analyze_block, ds) computed = result.compute() # --- Structural checks --- diff --git a/xarray_selafin/xarray_backend.py b/xarray_selafin/xarray_backend.py index 551af46..5987c7a 100644 --- a/xarray_selafin/xarray_backend.py +++ b/xarray_selafin/xarray_backend.py @@ -26,6 +26,15 @@ DEFAULT_DATE_START = (1900, 1, 1, 0, 0, 0) +def range_from_key(k, n): + if isinstance(k, slice): + return range(*k.indices(n)) + elif isinstance(k, int): + return range(k, k + 1) + else: + raise ValueError("index must be int or slice") + + def compute_duration_between_datetime(t0, time_serie): return (time_serie - t0).astype("timedelta64[s]").astype(float) @@ -204,71 +213,72 @@ def __getitem__(self, key): self._raw_indexing_method, ) - def _raw_indexing_method(self, key): - with self.lock: - ndim = len(self.shape) - if ndim not in (2, 3): - raise NotImplementedError(f"Unsupported SELAFIN shape {self.shape}") - - if not isinstance(key, tuple): - raise NotImplementedError("SELAFIN access must use tuple indexing") - - # Pad key with slices to match array dimensions - ndim = len(self.shape) - if len(key) < ndim: - key = key + (slice(None),) * (ndim - len(key)) - - # --- Parse keys + def _raw_indexing_method_unlocked(self, key): + ndim = self.ndim # = len(self.shape) + if ndim not in (2, 3): + raise NotImplementedError(f"Unsupported SELAFIN shape {ndim}") + assert len(key) == len(self.shape) + + if not isinstance(key, tuple): + raise NotImplementedError("SELAFIN access must use tuple indexing") + + nb_nodes_2d = self.shape[-1] # last dimension + + # Parse keys + if ndim == 3: # (3D) + time_key, plan_key, node_key = key + else: # ndim = 2 (2D) + time_key, node_key = key + plan_key = None + + # Build indices + time_range = range_from_key(time_key, self.shape[0]) + if ndim == 3: # (3D) + nb_planes = self.shape[1] + plan_range = range_from_key(plan_key, nb_planes) + node_range = range_from_key(node_key, nb_nodes_2d) + ds_shape = (len(time_range), len(plan_range), len(node_range)) + else: # ndim = 2 (2D) + nb_planes = 1 + node_range = range_from_key(node_key, nb_nodes_2d) + ds_shape = (len(time_range), len(node_range)) + plan_range = None + + res_array = np.empty(ds_shape, dtype=self.dtype) + + for ds_index_time, time_index in enumerate(time_range): + flatten_values = self.filename_or_obj.read_var_in_frame(time_index, self.var) # flatten np.ndarray if ndim == 3: - # 3D file - if len(key) == 3: - time_key, plan_key, node_key = key - elif len(key) == 2: - time_key, node_key = key - plan_key = slice(None) + all_values = flatten_values.reshape((nb_planes, nb_nodes_2d)) + if plan_range == slice(None, None, None) and node_key == slice(None, None, None): # avoid a subset to speedup + res_array[ds_index_time, :, :] = all_values else: - raise NotImplementedError("Only (time, plan, node) or (time, node) supported for 3D files") + res_array[ds_index_time, :, :] = all_values[np.ix_(plan_range, node_range)] else: - # 2D file - if len(key) == 2: - time_key, node_key = key - elif len(key) == 1: - time_key = key[0] - node_key = slice(None) + if node_key == slice(None, None, None): # avoid a subset to speedup + res_array[ds_index_time, :] = flatten_values else: - raise NotImplementedError("Only (time, node) supported for 2D files") - - # --- helper - def _range_from_key(k, n): - if isinstance(k, slice): - return range(*k.indices(n)) - elif isinstance(k, int): - return [k] - else: - raise ValueError("index must be int or slice") - - time_indices = _range_from_key(time_key, self.shape[0]) - - if ndim == 3: - plan_indices = _range_from_key(plan_key, self.shape[1]) - node_indices = _range_from_key(node_key, self.shape[2]) - data_shape = (len(time_indices), len(plan_indices), len(node_indices)) - else: # ndim = 2 - node_indices = _range_from_key(node_key, self.shape[1]) - data_shape = (len(time_indices), len(node_indices)) + res_array[ds_index_time, :] = flatten_values[node_range] - data = np.empty(data_shape, dtype=self.dtype) + # Remove some dimensions if it was selected by integer + squeeze_dims = [] + if isinstance(time_key, int): + squeeze_dims.append(0) + if isinstance(plan_key, int): + squeeze_dims.append(1) + if isinstance(node_key, int): + squeeze_dims.append(-1) + if squeeze_dims: + res_array = np.squeeze(res_array, axis=tuple(squeeze_dims)) - for data_index, time_index in enumerate(time_indices): - temp = self.filename_or_obj.read_var_in_frame(time_index, self.var) # np.ndarray + return res_array - if ndim == 3: - temp = np.reshape(temp, (self.shape[1], self.shape[2])) # (nplan, nnode) - data[data_index, :, :] = temp[np.ix_(plan_indices, node_indices)] - else: # ndim = 2 - data[data_index, :] = temp[node_indices] - - return data.squeeze() + def _raw_indexing_method(self, key): + if self.lock is None: + return self._raw_indexing_method_unlocked(key) + else: + with self.lock: + return self._raw_indexing_method_unlocked(key) class SelafinBackendEntrypoint(BackendEntrypoint): From 8b7ca834899dd1f4d1cef35c2406c24b0dbe02da Mon Sep 17 00:00:00 2001 From: Luc DURON Date: Wed, 15 Oct 2025 22:48:35 +0200 Subject: [PATCH 07/12] Improve maintenance of write_serafin --- xarray_selafin/xarray_backend.py | 291 +++++++++++++++---------------- 1 file changed, 140 insertions(+), 151 deletions(-) diff --git a/xarray_selafin/xarray_backend.py b/xarray_selafin/xarray_backend.py index 5987c7a..52b535b 100644 --- a/xarray_selafin/xarray_backend.py +++ b/xarray_selafin/xarray_backend.py @@ -47,154 +47,6 @@ def read_serafin(f, lang): return resin -def write_serafin(fout, ds): - # Title - try: - title = ds.attrs["title"] - except KeyError: - title = "Converted with array-serafin" - - slf_header = Serafin.SerafinHeader(title) - - # File precision - try: - float_size = ds.attrs["float_size"] - except KeyError: - float_size = 4 # Default: single precision - if float_size == 4: - slf_header.to_single_precision() - elif float_size == 8: - slf_header.to_double_precision() - else: - raise NotImplementedError - - try: - slf_header.endian = ds.attrs["endian"] - except KeyError: - pass # Default: ">" - - try: - slf_header.nb_frames = ds.time.size - except AttributeError: - slf_header.nb_frames = 0 - - try: - slf_header.date = ds.attrs["date_start"] - except KeyError: - # Retrieve starting date from first time - if slf_header.nb_frames == 0: - first_time = ds.time - else: - first_time = ds.time[0] - first_date_str = first_time.values.astype(str) # "1900-01-01T00:00:00.000000000" - first_date_str = first_date_str.rstrip("0") + "0" # "1900-01-01T00:00:00.0" - try: - date = datetime.strptime(first_date_str, "%Y-%m-%dT%H:%M:%S.%f") - slf_header.date = attrgetter("year", "month", "day", "hour", "minute", "second")(date) - except ValueError: - slf_header.date = DEFAULT_DATE_START - - # Variables - try: - slf_header.language = ds.attrs["language"] - except KeyError: - slf_header.language = Serafin.LANG - for var in ds.data_vars: - try: - name, unit = ds.attrs["variables"][var] - slf_header.add_variable_str(var, name, unit) - except KeyError: - try: - slf_header.add_variable_from_ID(var) - except Serafin.SerafinRequestError: - slf_header.add_variable_str(var, var, "?") - slf_header.nb_var = len(slf_header.var_IDs) - - if "plan" in ds.dims: # 3D - is_2d = False - nplan = len(ds.plan) - slf_header.nb_nodes_per_elem = 6 - slf_header.nb_elements = len(ds.attrs["ikle2"]) * (nplan - 1) - else: # 2D - is_2d = True - nplan = 1 # just to do a multiplication - slf_header.nb_nodes_per_elem = ds.attrs["ikle2"].shape[1] - slf_header.nb_elements = len(ds.attrs["ikle2"]) - - slf_header.nb_nodes = ds.sizes["node"] * nplan - slf_header.nb_nodes_2d = ds.sizes["node"] - - x = ds.coords["x"].values - y = ds.coords["y"].values - if not is_2d: - x = np.tile(x, nplan) - y = np.tile(y, nplan) - slf_header.x = x - slf_header.y = y - slf_header.mesh_origin = (0, 0) # Should be integers - slf_header.x_stored = x - slf_header.mesh_origin[0] - slf_header.y_stored = y - slf_header.mesh_origin[1] - slf_header.ikle_2d = ds.attrs["ikle2"] - if is_2d: - slf_header.ikle = slf_header.ikle_2d.flatten() - else: - try: - slf_header.ikle = ds.attrs["ikle3"] - except KeyError: - # Rebuild IKLE from 2D - slf_header.ikle = slf_header.compute_ikle(len(ds.plan), slf_header.nb_nodes_per_elem) - - try: - slf_header.ipobo = ds.attrs["ipobo"] - except KeyError: - # Rebuild IPOBO - slf_header.build_ipobo() - - if "plan" in ds.dims: # 3D - slf_header.nb_planes = len(ds.plan) - slf_header.is_2d = False - shape = (slf_header.nb_var, slf_header.nb_planes, slf_header.nb_nodes_2d) - else: # 2D (converted if required) - # if ds.attrs["type"] == "3D": - # slf_header.is_2d = False # to enable conversion from 3D - # slf_header = slf_header.copy_as_2d() - slf_header.is_2d = True - shape = (slf_header.nb_var, slf_header.nb_nodes_2d) - - try: - slf_header.params = ds.attrs["params"] - except KeyError: - slf_header.build_params() - - with Serafin.Write(fout, slf_header.language, overwrite=True) as resout: - resout.write_header(slf_header) - - t0 = np.datetime64(datetime(*slf_header.date)) - - try: - time_serie = compute_duration_between_datetime(t0, ds.time.values) - except AttributeError: - return # no time (header only is written) - if isinstance(time_serie, float): - time_serie = [time_serie] - for time_index, time in enumerate(time_serie): - temp = np.empty(shape, dtype=slf_header.np_float_type) - for iv, var in enumerate(slf_header.var_IDs): - if slf_header.nb_frames == 1: - temp[iv] = ds[var].values - else: - temp[iv] = ds.isel(time=time_index)[var].values - if slf_header.nb_planes > 1: - temp[iv] = np.reshape( - np.ravel(temp[iv]), (slf_header.nb_planes, slf_header.nb_nodes_2d) - ) - resout.write_entire_frame( - slf_header, - time, - np.reshape(temp, (slf_header.nb_var, slf_header.nb_nodes)), - ) - - class SelafinLazyArray(BackendArray): def __init__(self, filename_or_obj, shape, dtype, lock, var): @@ -391,8 +243,145 @@ def guess_can_open(filename_or_obj): @xr.register_dataset_accessor("selafin") class SelafinAccessor: + def __init__(self, xarray_obj): - self._obj = xarray_obj + self._ds = xarray_obj + self._header = None + + def _build_header(self): + ds = self._ds + + # Title + title = ds.attrs.get("title", "Converted with array-serafin") + header = Serafin.SerafinHeader(title) + + # File precision + float_size = ds.attrs.get("float_size", 4) # Default: single precision + if float_size == 4: + header.to_single_precision() + elif float_size == 8: + header.to_double_precision() + else: + raise NotImplementedError + + header.endian = ds.attrs.get("endian", ">") # Default: ">" + + try: + header.nb_frames = ds.time.size + except AttributeError: + header.nb_frames = 0 + + try: + header.date = ds.attrs["date_start"] + except KeyError: + # Retrieve starting date from first time + if header.nb_frames == 0: + first_time = ds.time + else: + first_time = ds.time[0] + first_date_str = first_time.values.astype(str) # "1900-01-01T00:00:00.000000000" + first_date_str = first_date_str.rstrip("0") + "0" # "1900-01-01T00:00:00.0" + try: + date = datetime.strptime(first_date_str, "%Y-%m-%dT%H:%M:%S.%f") + header.date = attrgetter("year", "month", "day", "hour", "minute", "second")(date) + except ValueError: + header.date = DEFAULT_DATE_START + + # Variables + header.language = ds.attrs.get("language", Serafin.LANG) + for var in ds.data_vars: + try: + name, unit = ds.attrs["variables"][var] + header.add_variable_str(var, name, unit) + except KeyError: + try: + header.add_variable_from_ID(var) + except Serafin.SerafinRequestError: + header.add_variable_str(var, var, "?") + header.nb_var = len(header.var_IDs) + + if "plan" in ds.dims: # 3D + is_2d = False + nplan = len(ds.plan) + header.nb_nodes_per_elem = 6 + header.nb_elements = len(ds.attrs["ikle2"]) * (nplan - 1) + header.nb_planes = nplan + else: # 2D + is_2d = True + nplan = 1 # just to do a multiplication below + header.nb_nodes_per_elem = ds.attrs["ikle2"].shape[1] + header.nb_elements = len(ds.attrs["ikle2"]) + header.nb_planes = 0 # convention in Selafin for 2D files + + header.nb_nodes_2d = ds.sizes["node"] + header.nb_nodes = header.nb_nodes_2d * nplan + + x = ds.coords["x"].values + y = ds.coords["y"].values + if not is_2d: + x = np.tile(x, nplan) + y = np.tile(y, nplan) + header.x = x + header.y = y + header.mesh_origin = (0, 0) # Should be integers + header.x_stored = x - header.mesh_origin[0] + header.y_stored = y - header.mesh_origin[1] + header.ikle_2d = ds.attrs["ikle2"] + if is_2d: + header.ikle = header.ikle_2d.flatten() + else: + try: + header.ikle = ds.attrs["ikle3"] + except KeyError: + # Rebuild IKLE from 2D + header.ikle = header.compute_ikle(nplan, header.nb_nodes_per_elem) + + try: + header.ipobo = ds.attrs["ipobo"] + except KeyError: + # Rebuild IPOBO + header.build_ipobo() + + # if ds.attrs["type"] == "3D": + # header.is_2d = False # to enable conversion from 3D + # header = header.copy_as_2d() + + try: + header.params = ds.attrs["params"] + except KeyError: + header.build_params() + + self._header = header + + def _write_all(self, filepath): + header = self._header + + with Serafin.Write(filepath, header.language, overwrite=True) as resout: + resout.write_header(header) + + t0 = np.datetime64(datetime(*header.date)) + + try: + time_serie = compute_duration_between_datetime(t0, self._ds.time.values) + except AttributeError: + return # no time (header only is written) + if isinstance(time_serie, float): + time_serie = [time_serie] + + shape = (header.nb_var, header.nb_nodes) + values = np.empty(shape, dtype=header.np_float_type) + for time_index, time in enumerate(time_serie): + for var_index, var in enumerate(header.var_IDs): + if header.nb_frames == 1: + array = self._ds[var].values + else: + array = self._ds.isel(time=time_index)[var].values + values[var_index, :] = array.ravel() + resout.write_entire_frame( + header, + time, + values, + ) def write(self, filepath, **kwargs): """ @@ -400,5 +389,5 @@ def write(self, filepath, **kwargs): Parameters: - filename: String with the path to the output SELAFIN file. """ - ds = self._obj - write_serafin(filepath, ds) + self._build_header() + self._write_all(filepath) From 476b7fce22718cc8a78b1b610e4c902f1d8f8831 Mon Sep 17 00:00:00 2001 From: Luc DURON Date: Thu, 16 Oct 2025 10:56:52 +0200 Subject: [PATCH 08/12] Update README and minor changes --- README.md | 55 +++++++++++++++++--------------- xarray_selafin/xarray_backend.py | 15 ++++----- 2 files changed, 37 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index cf91bf5..27dcf14 100644 --- a/README.md +++ b/README.md @@ -34,19 +34,19 @@ ds.close() # avoid a ResourceWarning (unclosed file) ``` ``` - -Dimensions: (time: 17, node: 648, plan: 21) + Size: 5MB +Dimensions: (time: 17, plan: 21, node: 648) Coordinates: - x (node) float32 ... - y (node) float32 ... - * time (time) datetime64[ns] 1900-01-01 ... 1900-01-02T20:26:40 -Dimensions without coordinates: node, plan + x (node) float32 3kB ... + y (node) float32 3kB ... + * time (time) datetime64[ns] 136B 1900-01-01 ... 1900-01-02T20:26:40 +Dimensions without coordinates: plan, node Data variables: - Z (time, node, plan) ... - U (time, node, plan) ... - V (time, node, plan) ... - W (time, node, plan) ... - MUD (time, node, plan) ... + Z (time, plan, node) float32 925kB ... + U (time, plan, node) float32 925kB ... + V (time, plan, node) float32 925kB ... + W (time, plan, node) float32 925kB ... + MUD (time, plan, node) float32 925kB ... Attributes: title: Sloped flume Rouse profile test language: en @@ -83,9 +83,14 @@ ds.selafin.write("output_file.slf") ## DataSet content ### Dimensions -* time -* node -* plan (only in 3D) +In 2D: +1. time +2. node + +in 3D: +1. time +2. plan +3. node ### Coordinates @@ -99,14 +104,14 @@ ds.selafin.write("output_file.slf") All attributes are optional except `ikle2`: -| Attribute | Description | Default value | -|------------|-------------------------------------------------------------------------|--------------------------| -| title | Serafin title | "" (empty string) | -| language | Language for variable detection | "en" | -| float_size | Float size | 4 (single precision) | -| endian | File endianness | ">" | -| params | Table of integer parameters | (can be rebuilt) | -| ikle2 | Connectivity table in 2D (1-indexed) | - | -| ikle3 | Connectivity table in 3D (1-indexed, only in 3D, optional) | (can be rebuilt from 2D) | -| variables | Dictionary with variable names and units (key is variable abbreviation) | - | -| date_start | Starting date with integers (year to seconds) | (from first time serie) | +| Attribute | Description | Default value | +|------------|-------------------------------------------------------------------------|--------------------------------| +| title | Serafin title | "Converted with array-serafin" | +| language | Language for variable detection | "en" | +| float_size | Float size | 4 (single precision) | +| endian | File endianness | ">" | +| params | Table of integer parameters | (can be rebuilt) | +| ikle2 | Connectivity table in 2D (1-indexed) | - | +| ikle3 | Connectivity table in 3D (1-indexed, only in 3D, optional) | (can be rebuilt from 2D) | +| variables | Dictionary with variable names and units (key is variable abbreviation) | - | +| date_start | Starting date with integers (year to seconds) | (from first time serie) | diff --git a/xarray_selafin/xarray_backend.py b/xarray_selafin/xarray_backend.py index 52b535b..11320f1 100644 --- a/xarray_selafin/xarray_backend.py +++ b/xarray_selafin/xarray_backend.py @@ -39,8 +39,8 @@ def compute_duration_between_datetime(t0, time_serie): return (time_serie - t0).astype("timedelta64[s]").astype(float) -def read_serafin(f, lang): - resin = Serafin.Read(f, lang) +def read_serafin(filepath, lang): + resin = Serafin.Read(filepath, lang) resin.__enter__() resin.read_header() resin.get_time() @@ -134,6 +134,7 @@ def _raw_indexing_method(self, key): class SelafinBackendEntrypoint(BackendEntrypoint): + def open_dataset( self, filename_or_obj, @@ -183,7 +184,8 @@ def open_dataset( shape=shape, dtype=dtype, lock=file_lock, - var=var) + var=var, + ) data = indexing.LazilyIndexedArray(lazy_array) data_vars[var] = xr.Variable(dims=dims, data=data) else: @@ -238,7 +240,7 @@ def guess_can_open(filename_or_obj): return ext.lower() in {".slf"} description = "A SELAFIN file format backend for Xarray" - url = "https://www.example.com/selafin_backend_documentation" + url = "https://github.com/oceanmodeling/xarray-selafin/" @xr.register_dataset_accessor("selafin") @@ -266,10 +268,7 @@ def _build_header(self): header.endian = ds.attrs.get("endian", ">") # Default: ">" - try: - header.nb_frames = ds.time.size - except AttributeError: - header.nb_frames = 0 + header.nb_frames = ds.sizes.get("time", 0) try: header.date = ds.attrs["date_start"] From 7c79e2c30dcd59cd584ca68325d7eb9925ee54e0 Mon Sep 17 00:00:00 2001 From: Luc DURON Date: Thu, 16 Oct 2025 10:58:14 +0200 Subject: [PATCH 09/12] Fix header.is_2d before writing selafin --- xarray_selafin/xarray_backend.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/xarray_selafin/xarray_backend.py b/xarray_selafin/xarray_backend.py index 11320f1..8181a6d 100644 --- a/xarray_selafin/xarray_backend.py +++ b/xarray_selafin/xarray_backend.py @@ -300,13 +300,13 @@ def _build_header(self): header.nb_var = len(header.var_IDs) if "plan" in ds.dims: # 3D - is_2d = False + header.is_2d = False nplan = len(ds.plan) header.nb_nodes_per_elem = 6 header.nb_elements = len(ds.attrs["ikle2"]) * (nplan - 1) header.nb_planes = nplan else: # 2D - is_2d = True + header.is_2d = True nplan = 1 # just to do a multiplication below header.nb_nodes_per_elem = ds.attrs["ikle2"].shape[1] header.nb_elements = len(ds.attrs["ikle2"]) @@ -317,7 +317,7 @@ def _build_header(self): x = ds.coords["x"].values y = ds.coords["y"].values - if not is_2d: + if not header.is_2d: x = np.tile(x, nplan) y = np.tile(y, nplan) header.x = x @@ -326,7 +326,7 @@ def _build_header(self): header.x_stored = x - header.mesh_origin[0] header.y_stored = y - header.mesh_origin[1] header.ikle_2d = ds.attrs["ikle2"] - if is_2d: + if header.is_2d: header.ikle = header.ikle_2d.flatten() else: try: From 56c3cadc0f473d3fe8e4781da776164ec976e498 Mon Sep 17 00:00:00 2001 From: Luc DURON Date: Thu, 16 Oct 2025 11:01:08 +0200 Subject: [PATCH 10/12] Add disable_lock argument and avoid useless ravel --- xarray_selafin/xarray_backend.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/xarray_selafin/xarray_backend.py b/xarray_selafin/xarray_backend.py index 8181a6d..52eeeb8 100644 --- a/xarray_selafin/xarray_backend.py +++ b/xarray_selafin/xarray_backend.py @@ -142,6 +142,7 @@ def open_dataset( drop_variables=None, decode_times=True, # Below are custom arguments + disable_lock=False, lazy_loading=True, lang=Serafin.LANG, # `chunks` and `cache` DO NOT go here, they are handled by xarray @@ -172,10 +173,13 @@ def open_dataset( shape = (len(times), nplan, npoin2) dims = ["time", "plan", "node"] - if DASK_AVAILABLE: - file_lock = dask.utils.SerializableLock() + if disable_lock: + file_lock = None else: - file_lock = threading.Lock() + if DASK_AVAILABLE: + file_lock = dask.utils.SerializableLock() + else: + file_lock = threading.Lock() for var in vars: if lazy_loading: @@ -341,10 +345,6 @@ def _build_header(self): # Rebuild IPOBO header.build_ipobo() - # if ds.attrs["type"] == "3D": - # header.is_2d = False # to enable conversion from 3D - # header = header.copy_as_2d() - try: header.params = ds.attrs["params"] except KeyError: @@ -375,7 +375,11 @@ def _write_all(self, filepath): array = self._ds[var].values else: array = self._ds.isel(time=time_index)[var].values - values[var_index, :] = array.ravel() + if header.is_2d: + values[var_index, :] = array + else: + values[var_index, :] = array.ravel() + resout.write_entire_frame( header, time, From adebd1db7725f7ae413dc902365623eb250db393 Mon Sep 17 00:00:00 2001 From: Luc DURON Date: Thu, 16 Oct 2025 11:49:09 +0200 Subject: [PATCH 11/12] Implement get_dataset_as_2d --- .../data/r3d_bump_extracted_bottom_layer.slf | Bin 0 -> 136580 bytes tests/data/r3d_bump_extracted_top_layer.slf | Bin 0 -> 136580 bytes tests/io_test.py | 34 ++++++++++++++---- xarray_selafin/xarray_backend.py | 21 ++++++++++- 4 files changed, 48 insertions(+), 7 deletions(-) create mode 100644 tests/data/r3d_bump_extracted_bottom_layer.slf create mode 100644 tests/data/r3d_bump_extracted_top_layer.slf diff --git a/tests/data/r3d_bump_extracted_bottom_layer.slf b/tests/data/r3d_bump_extracted_bottom_layer.slf new file mode 100644 index 0000000000000000000000000000000000000000..8929bb399f9a7ab6dc45c501621d7f7b88e02971 GIT binary patch literal 136580 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 literal 0 HcmV?d00001 diff --git a/tests/data/r3d_bump_extracted_top_layer.slf b/tests/data/r3d_bump_extracted_top_layer.slf new file mode 100644 index 0000000000000000000000000000000000000000..a541f17be15c84e7c802804713bf973863ec2286 GIT binary patch literal 136580 zcmeF)chnTsx9G22=#Is2EWM0Z~bcC}PeTb5?>FKm{cW zn82JPW)xIF0Y$;{nYH&GN4Cb{!bN*BGAgsbb-dd7s{}SCBOCT4e{ZY%GLZ6M_(395=ZTZvav+xVf?<}-+ z6yo(*YpmHivv|LC7vg-8o9>X8EUqU{g_u|5GIA=9S*%lD3$gCVee8j}XOS2CP>4Lm zUd5i-r!4Z=5s}vpyx8L&{K$KI#6CnVL`|H&^d3 zjJoV&yiknV?PvUp7`g6m{G0d4cVP-*PhxM*=P#l6#!J|XHxL8(ztb%-2`zZ>xf;Y@ zMmNU`*pnBZ!y)_?^d5K)yYu36dlCOHx*5h}H{LK@%>SF-70+N7-le#Nzlz=&PoXLA zG7RVcOEin{dm zxDIR6JK$k#j|yH!8Er5F?h}RmFbz@HH{u4YLvM!%u`PWwZo+!>Hn<;K)3@RlY(Q^? zd$A>bJ8r{9^cJ`qo6~pV4s1eihLPBmz6-{s@ZvSc6gH;sf%lf;9C0q^jQeouKDbsX zt{K-hhr;^w12DHz%rWL_&V_a9hhQzGSW~Rc8VhykM<73?9q7ofJQp&k zrBI|t!@iVaf9zx89EA~(^Td1$k@p=@*J;c>?)#bdWcD}l{v_U$&`-iOGW9?flFR&` zf9a<%4o&IR{7c1E^fP!GyYS2}Q7h47qTggspn>E5=HdW)KL0fFEBYqO2X zck>bRkiR766*-Pv%WoF*mhU9i5qlDQV?VO)wEamUAFt3q!v1BE-#PrqckFrW{Q}sJ zxbJ5_!=A-`KU;(|5q0(}dV0@P@7-UFdW^bUj9&C)evKIQ8+E)C=g=?m%VN}f)cqgm zOHbst7UT1=0?TnO{XBnPG4?k0_)nZiPvGw(MlD25ti%QMv;4ipXXsV<2LtJ+`7Ok! z==eOZ#$b9Je^2pAHQ@taGR!XYf5!567sv2Y6!}Bx(fr-SQ9K8iGX5}HT_wASQCn+5 zt!0WTKvoCNBBF54`Y_`0piP;Y1~2dc`ZygZYTOo$9=z4$9pfQAL2I> zALOlvb@^A)5AYj^_wzQu`uwZu`}p<5dwCmSL;kh&J^Z@j-Mme(G5>n{F8=o7NZw}H zlz$_ACx2V<4&D~noPRTYJAZ5OHr`g)l7B0W#5j6D-1ke4$sAkop2T~j2gH59^)9-!GX%W-bM5NUSA#K-~9B)}F~h!I~3mj~)>B{gSn35AfDNyvP0&E z@g1=A7-AoGbew&P@8+4jBwkD8Bfh(5kHDT}uAj(xVlL53;=Z3X(Q>>$8Ls6xHhMtZ z_p_b(&X>qxA~(@*@*X3vnLH&IIX)59RowTpJshvzk|FpPgLy5`oUcBUK~THV1LD4) zwdAYkWB~rg1-yN*H-9{RK72N!2gH3pYsG(#?vE8Xm)9Em@n4|(VHx`J%4ox%MEAk( zIEPn*3jZa#H&zeb;gZ*d~8GY;dwL7#xH(T&#yhx6yr$Kxv;$2$UD`ESw3 z;tL$ZI|@hg-=UAjX9zD|qto|juP2`%&JpMG{`3Rd`I3(i*NkhsUK-lZv#XC%S@{QRekUAO1qR4Q3$fH0re<{}*~c zOheRl)OUaWZ*(h6L3|G4^Kd?Y3B5O7!d|?A7{LFXZiz`~!5fT0{AF}=ynsD<7h(v1 z1-%EJ!|uGHxQPE3-3;RqH8>0x^Z%xI#WUE2cPTF6ucCLxQ)tS&48!^V(oOIrcEW*} z2cL3yN;kwPG@!4>RVdN*@i^+yJ`343Sd-on zkD@MpJ+8yr^bU9!+tWAV2CPGGhX=7OeKT&tdh|B9A6wJ6;udT`Z-slYC4DjRldm+^BTvP+cH}a0w*Nh$z_x*G%%!^$pnq%~UxbLUqpiYw2{7c1Ew3|6AJxbLT_=Tuc!FE<6gt7Xh(m?KU4gcegm(g1N{yE4DoAv9_HczdOrU&@hkc*yorP8 zFZrj4U(oO1ZFHhP=XV!Bqu;~3IF$aBf1>ya{Q=%bXZmA)H}NAn_z+!av3Q&q$Hsdc zmmWcTU-1|*&K=iq-t;Kib&3&VE-@$bNaHy3D#rU_?y&~*PMtUI`>D01t{wON)cRBN zi~D{mM`^4<&Wf?7$hUn;8JTE#HZ+gu^NNv zar`|+_k-k3<1V6_O6D4O7S&zyy78f++Kl^tR`A{n>9PFXMfD!{{jA6zN{{C6Ci;BD zeLwStbQt{ve;4s_-kMm0e<}SKzp3~rZ*8o_zl?r_zmxbdZynU(Urs;7ZzMj*TMz5< zucRN~HxTdVZGiRpSJU_L>xuXBHo}JdYw3IVb;Y}Rn_y%9_4Hl*?ZuJ2&9Eu|M*3F% zmf|hE?XWHXPWop4=HgAfZLl@}cAoVWT|d4r#`p5nI#cr~T3^xiLHIJh8 z6ym)u}*7DtuM8{VqhFSBlpj5 z*jkIj#NDu~@hDtuoQgxm-O&5Y%+^ zhUf=rOJj9j9Du)Z0dF7dZ9E?5<1d`Y+ZU~jpF@AFz`4BE*w6R{^usdr<(1LKcoO>H zcbvnkLB;qb^u`kO!WDe`6a6*6?>97#z1knO##7Ws)P((s9uW8aOf99cPiNyd^rYLN zt?@LRg#2LH;(9!s1oQ|Jx8t)(+XgnLI;zyjq>x6@iU%|=v9^H9| z;t=E4a1y@7iM-A@%=itQfUnVw*9C_g&%^Qf3diw|Kv(0pa4f#SF}$O2r13jA8lNG& zcrEmMh}SoMNcToXWkcj@Z~xBLiB`Ud;SdiEZCRm3(*sbZTZvavtb{j zFGNo$*7EIp+8gR5`a-b=6~6jO`#@bqUx=PiY{Q>K_ro%%!{`ac{rKuL?T-~ux6u=d zt@zK;=i@J^^XLi1z4_zm0r(p}7ts@nE&0#TgRlw%c`eYK|CHDjAHm+ny}x)EKlWX1 z6b~_08|e`Ii^04-u?PQ2`Xcq5h!^s9M>GBy`eJ@64(08JUHPNvOZX*m7;hKs%zvC7 z&Ra;f_-l)o@peLE{=@VY{B^|3d5zGJ{~&!8e?3vnL{BKz=ig6X!{0!> znpY1y^6#au<8LHh%d3kW_;=Gc@HY{!=WUPe_#?%w;C;~#q6egRz;VSb;C;~#q6eh6 zAS3&L)XEq!LBTlcXPj}=)|2=b zs}c3~G(YO~DXhXj7>H;2dx_8BZ>+=xn84ph9FM>7C(gt3{C&meuma0*E++C@i!Wdq z{y<;6$S;eN@H>{`98Bidh%aFY7NZw0>amXT<(O)`zc>XC88;Fi6mNxnN$pF1@BdZo ziRrv{;xzn%MK}{P`5nX=Scso-24?XO5MRbmSb)3W`Kh5IW3-tlcDrj{_dhWjAvtZA-Rwq$KO*_hw*G2&%?=J`e}X(Q60v!aXb$v z1LFyoJ&vSw-(i5JR8UJ zaMG84kzW?oVLThh^KfzwJ(*u4s>66Tj_2W|7d@4~zo_=&**Knulb-Z+emhZ(#j|ld z4<~0@cNZLPY)|uNt>fvBjAuH&gQ)i6nK_=5lQZa9`~yU_m#DpD0Zyam@DCDa(`qmI z0jJQf@;ixYFP?Ri@6erooqwpP_TpJL`35J_bNQV`wHMF2$$WI9-{hNXJo_eUFP?AX zH_v#k&5jV&UOel@^KJa*8PB!ZQKH(5XWe+djo&=uxi*W})m}X7#`A6b<{8hmS)5Pp z#j|ca-^OpA@m!n5^?CWd{~mEmdQ;qqP3XIE7dEFi#_iaM-Wppu&uxhFx_10t8u$Hp zPDn0w++)t)RD6`THrC=_MnA&eNqm^M4(jkPryt@s5+CHPhjsZ^($<$n{;VnP`|+HR zTrJ+h+d{lq+!osy-+`NqHxq9Zx5swIBe4VGn&DlK>k#wW5i!TQ^tHGKv5xw99QA0| ziyoXm4>aVBLIXPHcLh?qF~%U)5bGI%gl>W-5o?b14>$Jti|+{ey+3jk`MQMm`HSxq z`MrM^-Y{HD|BYrCkKK4fagp&~*aOdDcix2Xu%tZ0mi>$ zZ@h%Pco*P&<0XhakNv(4tuO`q@FKrAz#gU>;#Sz7=mXgnV(iO#=Pbik7$cmus^RS&NBWU?eQAg@ybub)CGg9Kr9(H;=R-MnN6sz2pip zr5j@m)M4JUM~DgC1W!U8=HGjUJI}xL&UgyyF#q0j34ay6E1rQmEDpoP{J-gD7!P%r zfA6`7{};Uno`X8fzxNE`ub`Xb1*pUPd(R;LGP)%uK^^Abdj{}-r}xH7P>1>Vp7Z%j z=vJ5lwU>YI>CgX--Vf8DuJZ3a{rJBaAC3>u86V+8ba7l8%z%2!zYq0s{6e~dm!aPB z??b)$Khd?AjT*jsi|5P^~4>$b}w!)-bB1!tcx9t@5Xh; z8;RFq8{7}~h1B`dnD24)me|7iZ=vsSA8=gsjOZWnyG(KuJ(9njcqeaDxK`qt`S-13 zjbpB^m$`2KJ^n~B))BS8G0Y)}xwuXm=e-%u6+IyC|8eh+9v1ii=v~nR^85e8;zOY0 z`)u9=)}|lDBZ#%G1?$W2|Bv$?L*!-+T#XVv3Qxf2E}jYU9+1*wFdB_`MO==AeiCEh zbLX)Cc;@?;ehTBz6s!4{imUJpp2jZthd)gG8{_dT;&Zo>KUDk+&tU@MbN46zLU9FN z!1LG>%lU)FWtfDCXn{ZY1I6F*5?;h!SjxXZTq4FE+UvXrOyNz&KJ>bfO<3_$}VR>*#=Q_-BY;V;<(>0Ly&*BT#N6V$Z({z5`KQ*ESyyUZiS;Jdn^&KTQ0aeg;ot7kV}SQgIdi6vm+`uYk+=|I$xlEOz1*aXAut3`V07 z?G4$LNa;~{0uAUja5dCO@;DwtJ$fx%i#6#-@d)bDb#Oh_rXR*b*q&Y&H)0)mxzD_u zBkuok?~m{LasMygW9%Gp|IdH-+0fWEk_Yhsw)Ot?aWmF)%zW`Q(Pt#NAI_U>&GWwO zR%}4KM&i85mbB|+w__vPHIloqIlU?Fgt;UmVVr~)uQ?{$jJ^Zjo5VTdT+W$oLEi?~ zN?bGgP-1RL%rWL_&e4;i4<*)~L=GYsauPi$`cPusN#xABGdYYtl*F2^f!t>GA@A`_ z9?v1kRj?OXL)fQyK9A>?r#9v0Y#3Z!f z4a5Nc@ATey348G_!1??obSq53KD_hLpZ^=ZAEsen`@I3=IPU-P%pd<2s^D{-Z4EUL zJs@j?8EEbGzUbqag>(fkqs%)8z4<@UwU~_>UN4-@|B-HsSFk^?C(h!3Pq)WwXvaGf zJ^0_!9q|S_@Xo;L{IBT)F%JjuPQ$7EujqsE77pT_f|L1Q(1+k1bmDc#N&L^~!|)ys z<(-HV_@B^+;{$Z&b;I%ekLa$5*oAi-j^)R3yW$z_f+G>v8=o))&`|Ynxvo)^EO9M$gg~4k?-!j$c20rVn5_B`w@||$esKaW{Z(udr)}UYdx?Ku@A8y?fEn4v+xUI z-(vsT@~6>f<2S@U$9~uHr_jBz1W^|?sPJE+``~v(9YsC0;ZLIbVHu+CqW<>dzd-lL z3PjDShl~@%h*bE&0#TgRlw%c`eYK{}eq0|6(w2Pwc^e zlD?==C?(>Byxq}^KZd@TpNd0yyJ1)UDEbn9NgT#gAIZ-A$LZnxHN{JLP0@t^C_RF| zwix%7ozR&7FntAo9r1ErBQ)ec=yQ8N?!(qzyUH=^iC22P0qQ%(>)AE@4aBQ?^{^xV zUiv!zM&h+N9X}yHPj#__WA3JJaLgv+^}Ow|9e*T!6Mr-DM&7pAhJOcr3x5moW}Z1E zTk&tBQ8JER68$4_Ou@04_msRhdP($;_%}}l=gwTCyG}B$VowNGWjaWTlN5NUC3uaUNiYE$#e9Q=pTvv7wkj! z7{7`5C~r-y!M9%}`!7J^> zdj`)MJ1*}j?|bcUti%QQ1Ruk>ORkakmk;TW5Yb#p=9KrBIPL?)In2Fe4S7$A>%E7# zzO|OR^UWiR`I%QC<|{WPIm-J;tj9VEu|Byh$!Xq4=F`?)h$sXi=B=RLsg~(qA z{+WDv%p$+?T8MnN_Pp>k zcHv*j^I6SS(@$X>n({B>{VS5uKMG^96MZ=n6zMS-jYjm9NRiQ_@B|vrSHnq4YtWD5 zG1Q~4#hO@)eiVtTJIW6nR}XRqCl`>-|t zR&0O`>3eYxwxn;zM%b9X8+T!I`c7Y_|=p7~bjGj@D>q6xDD%g)g=C#pih(_26W6{`amtzF%W%P&W2Zc+#wyU>2 z0ecwzA^Jh#VtzB8b45Rh{t*43a1nnGo^wV&2rKUgL-@^k;}A8q8fvUCh`%%MF+?p~ z<~`OCJ*w1-Hvv)0e?n~+`t$eWJ&zaY z%%&IMN1Vz(m^TNn&_CdNoXkIj_bOhazr(jUiGLXHb-Y1;gRgM{|8U-1%%kVyD;&@7 z%6k)U(O=>V9LqnF_cq?4KgVY{n!h*iS&TQPqd!Cs$nX7siRa@}d;;evIal^RKA=Cw zM{v!OYiA!Kw3zn*b1a!_=D6qqc~6LQTT{u}GUtsRkoSa`mmHMjB6>pffV?NfI^?V* zcbWA>56F8$tXqyta-GdbH3h?+IhX z#`F~^BBk9Y@*dETz6u%QO+K4>52#OHgEg=w?=d`z9qH?^7S^U8!Nb^rz5#Wx4*d`w z#CG&eSQqP|kNNr>MxQP`fcvox{}!x|4e0xDFSep@!-m+1z6W<>3;GUhj7{jfFcO>5 zV)TUQ0eMewT){CV?~9%gJs|H1&RcNKlIuiIh#rvl1oJ4EL&?0NCqxg(dxA9-V*b_? zJt2BP-V?03V7(}6SyPNd z6M8rYYE>yLB!@fmK7>DZ6g4}JOZ znJ;4|+VJ||9DdYa4Q8Rjljry?Df&SCew5$;Yk6m*C;tatJG_dvyt8m7|2w(^UPpUg z51hgOhCTpu(UEsLPUFv~55k)`kasFh;eSbY!rM5QcQU&3Kc{!Yv)C1f;$0l#^@}mo zF)PKBaH8?2Uh9naaTxCebmM`E0z9V@@gN{Cs zc|E`XhZnDTfAoRO`SSaJoFmTVdeH|m*U#o7t{K-hzvu&*`R4ckm}AV<+M*9+-4S_> zHN`sRCHg=nPx<{nauYd{$LIq|mi+yUxpU&%v zUlIEm`?^1WD%}f<5&Iu?P{W^0pM#}{dWpIz^IxR<;txc9MV+irZog8GkKt zIIjtI;y*%P&aWem;59}g{zLSY{B^}Ea0Y(H>0WP$299}vzS=SCi&ydLqaOc0`da>m z;x)V-QI~%YeLa6;@jBiP*q(nEeItKU@dn;@*p`1MeKUV^@h09j*qVPkeJg)U@fO}z zFpfSDzZu2-KYm+Ewt)9WABf+K;{G4MEhU@5wW1HiZ$@$dkKdM(O<-=(2jVxQQeE+G z-bS#N=mYV)Q6eYN2a*k7?a>D^`HK60_8?Bf0-TCn@HFg0CTIEge|gG#h`bky&Jj6s zj(AqcQjz4R%*x=hE>tFa1dHG9DMVh#6u?HN%`r`DGI zgTJB9)A9Vh#b@c2_zUOL&+%J{6X-v&0{!V1`1^^^)6208{pd;jHsVD35B!ck^h^AT z_#(X&OVFF1!mkx4(~I#N&ZejF+lo`^U-1jhqG#~ii__^vSco3<%lwYwO!{a1gwyHS z`~$^Vw7pG!#HsWv{DZ|g^bhzRC)1<&yNXZXHRD6XSLHcF>X?i19lpg$UVFnahl#J# z-{5PUK+oeJF3zRr<0~9bzs2t=zDa+HFK{gV4*y8;ZTfS3hNJ2C_z~ZwKgB1A<38ZW z``)KN#z%|HZ#Z z{F9!5@n}Z>&A(V&Nk5Bcuq(ZaFPG^*^wW3>JJbL2hl}x<9)~Bn<16jPsd$Y~y+u@wi2eP<^Yh_!~H^bbbCuA{KbI!Jn>VnQ7+;+AdU0MacbQ~>nyrXe8*4aAd}LYDJ567jBU+o-` z_qg`fUfTs~E47~DB^c%y^_K1iwV3Y8yBI_H>NDLPYBz1hy9gKZ)pNQh)OxxHZwLnS zm(wjU5zTpnFp&QTy%%0YOWpunz+X!5gUQ&NcRtSJFQ)g!RJ7vt$GQAp>DHKz{doP* zm%oTEVs@)r;uwCs|0u-yj^rH;I{HBB z^|<$^;l*p-AAO)0?{|&F8j5PVcqKB#^~@>yKx&S0?@wc1F+XdFK9E{d-22m5N36%1 zqYtEV5cmEx)*b7Yqv!*voW;FAjXXuZdk2>V7Z&v-Cjxg8{sjXu*G)9*ot9&r@^k$sb2w=rdgq zQUcqaK2K)!;tNH7TQ9JcfkAEM1Eq_Dt8s3hm z%fE-dp1-kp9d8G0&%cYlk-w>U18+NQ%fFMpnZLPs6K@-A&A*+#mA|EU3vUZJCi+0? zJ#p_(@8E3($3!1UkHeSnSxL=3|2`P=jrmzaeD_JsJ$gbK^NsmgLwv7K%{{)$r!n7{ zpEX3^NXgoWsVm-!vVnfMt$;dIRAA1Kbk0{n?M59`VMhP6cR$a{tLM!$$>i0B!4zmT7JmWX~4&k)fw@_r$o@hlPjBAy|lXXO1t z{^MC9`b9iL6g!IcCGQmr#UAtwetXeA=Dp$<@hn;mM9;|kg*u66iRc&c3=use?-%MS zo+YAR#4|+njJ#i{!+4g6ei6?Q(KGUXp>E?@BKk!XNl++@eC0?BkvbJ z7x63+{UV+rqG#m&!sjTSC8A%%Geq=^ykGd-#j`~8i&PE7ciFiA$MZz=kLVp)f%h+l z&`wUS46*vXNc$-(J!J`#Ir>7i+F~Jo)P^bdPO`- zM8Ak86tW{^o!^f z@hlPjBAy|lXGFh#ji|7^cERpvM#}(tXE$Hy>fcF)hw;1QziuM_a zXW;z)Z=LZBkh*sKW|Q{->(1}})|TJ@ttsyT)}7z`tu4R*TT|Wx;p9`TalM za~tF=?)~wc5cmIhK8PL=_y4%}$Fo7)|BJ(n?RVV&@w+ z{Xd=wQuP$~|G4+Zvq66UA1tm$)S=ppXM_CyKTuS=asQ8de>@xH_x}sTl~Ct#?~iAL z{QiHQ_$T`F_QSr$&*NMyM?YR0v^JiIzW4)ucome5U&J|Bir&0h)EG}jFD%B{xQuTP ziACta>xd4GMcf9fD5AucAA?!%4iuaH#R?I1%6A1m5B3Y&;j;FdxVBx}uBmn>Y?% z;#l61IKudC9D~nsG%q;H_+3Q&6poGOfV>AdUpyy856JKTaqbTh*KdqQ#t-32<8{R= z@Bq|#d@oDmvwI8Hr{BkWu%`GuDenoH*G6L$8u|>Y?f9M--|^!6T|EECcf90U{)XZ; zxZ2qH;#oTxYFrf6YW!B3?e6%o^o9I_s8-{*(ri!uIC?NvL#@W|qgf07)AT_61GO5z zk7j%EpQSIrN}SJAtJyyM3G{jR6a9H=HQSf}Jbf;fqaRPLX07=X>Av^_YBf`fgqn=sL9-+HZ_~%%bEwDo9W*K_d0))iTvO+Y--EMVjGyrS zOTE5^cnNQ3H03`=U&dccbl=FDU?=_~^yU0I;s{=2G~z!*U&&uryn@#d4fqeh+~WIv z-2daZqO2YrbBcLxBgR}e$7aSiVWjbP;+^8A*u?k-+-pGQ|3Pr!II!(aT1#6R&op2Hqk!5<sUHF$pd4JAZ(<6qE51_Qn$a`Ql=6ZCnR?8Tb8oPKfVe`F;OkF>?Bw*ZYe;Z^h}D zhW+phzn{1WGcf~gu#n$J{28Y zdwk39A%26ocmo~rHUD(c=PkeQ&l3;CSNv1OFX1y5&j#@wI-UvAlf}>RF5bZ*_>6y& z_$fXyK0*9gTn9HmeaACF{u{%GYWf5ESn++H_oVTjBYE3Gjpz6OTX;8PecJKyJuCV^ z@}79K==!O7q;YLJ?KXv@&*57F=`=d;vF19f5tyajQWZ?dk=@vpYTr*qdwJQ`T-87KjI%R z^5Q#w{+<0Eabs-6yAJmo*B9>-2d)&&qu20~*sKa2X1`rWl7N^l)5iyc)aUY3$6q z1hLM4up6GmuDn?DP~(-@9X?~x3!)Fi@1A)t*i(ESd+>%}u<>%VfX`U;g8UhHpz$Br z3ooK2e*i8pUW$D%8GG~2$9cw!MKzILi?!%|F%_*~zw&+%Iqr{h>0i+r)3G0~ANm?E zLK!pBhSvw@82^kK%tD3N8@-GdV1LX(E$?jfH2wkY@G9E!eCFc!?z|Ut5MM`oUJsmM z{0$DkTy*4}j?;|i;~=~VpS$P-=_$rvq7&Z6!91V2w7c==I27;V5Z*~R(fCvG1ave0 zSd5yx9(8a$j^lr**6dlf8$B8g(SZK|t~Op@yh=P4#~8n_)_rE8KP0z%-y5 z9uFbvJ?j2Otn0YWi1!`lSaZwFEqYF3&e1~>bIzD@5_v7Z-XD1Rlr z8=l3kyh|{Q{|~(jp2p6+;kcB)nr@15Xu=zT%TSufXLf(v2`0Y9~`G*_H5y zqye5lefk<)jWy_ccnmwz*Wp^MMc2h6*ugx!meTn%!1cx(8#^}c{qdWA-2by1;I*ud z_Z)z^=!gz@9qq9_9)g<8)MR!e)}^<_15n4A+Rbjp`t;Ut?qn&)OvOY zZihL=zky2b!e;bH+=)%;z&P22z8j8-XW}Hz<($a|i0ip-vYz$GLH^x8@^n99eddxq z2=k17mBhTwKUs%<7}gd2Dv9;WL$Wq4ui2xJzhq4~Un1w3eaIe%{3RvWr^Fs*qcIBh zE=gfulOjD9W6+pRFaia79G*lI;$PlyaW(xkp2E)bD*h#+8q1!=GuV~>i?3b_YBf{8 z*>h0Cg%y1DU06;}#0yaKg=Ku7hr%E9iozpSXygi5X}^FXZQWmM>&_`Ssi^c>7aE&U_^Z1D&BRlI_> z^!NO;#P4YJn7xMf^tb#T;y3hMyn&AN*ZkAP`ShEZhXd)a_@|0r(r@D}987<~KUw^o zei!fH5c)IzN#dvU`*;tB(Vy^75I@G>#utk#y*2^k(F`Br103$Pj~sKn7@qfJbk>!( zF>c33^u4$TTRP7B;kj<{6?QC$anOXLhMQGjs1u|Q?Nft z=x(F={Pp?l+uGPvO^!QJYbt zOVFEsiC+<;mZPSBM<03;zl|8RAD@9`=tsZ6-%os={u3+EpMH+tN{oGr{rd~&)8qMj zi_g;k;BO3|pW(L@pQcx16$a5y@tcd|3Wbu8{fi+6PxAK=$MTCv_!rS*_|3%8ybLM- zVtN#RSMdqn8gR1cGlj?bJByF;*20?n;q;^YCgLN!I#`=Of_|9aSbT`LF4o~+K|jcE zC_cbjAM5e2qVMO|7w_Y3hz*%}rJBWAj zHpM3V8|abz?Zi8In`1NnP4pf7ZA71elDaQ#!M}yRjlY$6D{pHUM-M4@E&4{`X5O~& z-sm9(=Zd~jxRJL#Tq}A=!L_4r6t3shg}Fr!DOg+djl$Ku2C(+%6$QD79#XiH*9dYI zeWM_E(JKm<^LB#VM&Br0#$Qt$&f6JH`Sz%ADSr*|5}y4m?ZUUGg<DpGBXB1vr&=Fb?9+p-;gNIGJ|{ zI`LnnyW=~Y#5)X!@?WP<#5XvBcQ`up=hEFUAII~$q6_~``Z#=vV|hp72>#pjG58!u z;{vS2`Ce~@eH=4E^jhgC<9EF#Mh_{(IpSR2AN{0oo&DWNyp~rFJM!PYuP8)rB1hf%F>iT_UQvi#Mo#51 z`bI%sqgNCn_pt}^p3SH2L-dM5>{aZUeTu$O=zz#;>}~Avnf%CmJH$S;iP6{%X1@#-Rys1TF(v*a>6Nn7#s+qewTxXf&j+!j;JA26zJX z>1%K`)}ZU*G3-dIvC_3zi>`}DumgPqu16hudpv~g=$mjO)}_msi8g4B>2UujY>Nl5 zjpJ^?%~+q_8uwu<`ZnB(4e2d$54NE1!0p(W-W+#fGkPTM#HMs$T-b!Z8;*&-QHb|= zZ($?)UN~p;jY3?*wF(>1_rn~bZxmuq=2lpbeh?2J<{oRa#=<)E!?5<~8->V)oD|lk zAB9|%>e7)@xs6RKje?v<-za3T7lo7_gVAV27jZcfdKcLLcxH%x5YG&SVQ%4XTmIAk zaZG-^bL8iX*W-F?BKFK&@_CtSK5uKu*JZ8wy5%Czi(KV-lgm7>a-HYhUgY~?ukwAf z$N7G%fxI4e6zf3^<@MB1j5VmiydIl~O<@grJ*)A&-hBr0&x6lM{(12k%0Ev&WBKQ8 zZ*d>A!oG;QX^p6*sH+NUP>cQ17VXd;9ncX6;6NONgV70x;7}Zf&Nv)h&=p7ENF0Tu zaSV>daX22`Z~{)mN$8G~aSBewX*eBcpa;&xS?Gzg(F?tC4*H-k`r%yk$9Xs(7hnJe zVh{#n2rk4$7>bKA442?i498{aBkH#Lr<#GtzzFpapWo`AY6c<$m#c^9chx`D3`7R5 zP!G}PtADB)hz$5Hn#A|y>Yr)`A_G^chj<>S{;6glGH|teh-d5SpK1mo1J|gB_}!rT zr<#Gtz_scjeq*ctsb(NDaGiSa`(m;o{N9-OJvIJ*ELj)ppbplC-zk$du?9-WkfMkL zajt){8msUR{>DoDg+H+Z%drf9;CC#=5-i4V_!Ylk5fLNAU zhkJ1k?#5jhi92xzZpUr76}RAK+=Lr(1Frv%->f%(x_ti38_IL%&Z}(Dtx08{!xvRf z?l`V8V*81ekt6S_jN5cbW#$dtDj(HpQ&~7-hZ=9Jsne!k&8CCDuGxNKmztfHy9*7InlsKgqo(h}AJq*0`hc2CZ|GKYh1af~JFn&@uisIp zP0c-yd9dTSn#UYB#(AH1>~k}3sCm)x(_Lfs_7iJfcb&JoHK}>uwLTenSIw8M_w7e@ zY8JTWubU33`Q3H@JbY2js=klZCLPDsrXSU*UE_>1YS&u!a_u@JcBox{(;>ARKKxPb zCe54IZZ`9V+AR-XRJ--p2h?uo__}_qu6IMX+J@UttZh7Q)7qwO`ql0-cV2C?ZcS?U zSU94##o(`N_pZ~Xw$;eHYFqELytX{COKq)dv~`URu5o~C9PAp0x<+T$=;|6ry2dfC zahz+M;2Pas;}q98-8Fi+Mo-u1=NbcCV~}fH=o&*^W0-SY; zK3V-fS$)2!K3`OyH>=N^)!!egzduxekE;G2RsDVP|J3i3|Mk0dq57wqf&WJa%AMxU z#j91SIml~au6n3a&B1@xKxHd`pIN1vga4|5PX5kY&!|$(ff|@s8Rq|ytx7cq|5XDc zN8ah*z*MQ`;6G|$eDmEaRjN7ouNs&;_w7oRY7YLZ27Wl>%u1DN4*s(SY6}1HA4RCf zY968n{`0>P;@{Kfe?wPs;Gf>SyH3QWQR5MV`Ks5u^3{*2v z%|JB+)eKZKP|ZL!1Jw*vGf>SyH3QWQ{5Q!!{O>d7{~L|}P3BXbMl}P~3{*2v%|JB+ z)eKZKP|ZL!1Jw*vGf>SyH3QWQR5MV`Ks5u^3{*2v&A|WN8L0kl{eSoVS65%nKs5u^ z3{*2v%|JB+)eKZKP|ZL!1Jw*vGf>SyH3QWQR5MV`Ks5u^4E%S?K=pU)|86@{oli9b z)eKZKP|ZL!1Jw*vGf>SyH3QWQR5MV`Ks5u^3{*2v%|JB+)eKZK@PBs(^8ZFiR{Lt6 zh5Ub`vC^dJc9r_4&8sv#EvwZ3Za}5sU!_We{x?+`?Q(9V!HK;p4OhHcX|Q>xO2Zkg zD)m44x6<&gu9f;vtW#+?U`nO_h4m{94|}#!|A<2>4IAHEslU^qm4?NgD)qDel?L+$ zR_ZN%s?y-rn=AD``KQw0^m&zfuU=MZu-!+Mdhb70ssHwxm3pr|Q>p*xu9bS@PpH&C zb>~XG=_@MrH}6%cH?~Wq-V(tCsN&kmJ(Cr+x=JMF~Ej_>bU+3~RTDs@|ZRoS6M z_saHlCRMh*W4p@MKg_IbwL{m+<|{U?Z2I$0m5nbyyRzXPJ5<)2bWEkr-$z!~I_-%{ zsnzI8@s{JttH#eLuXy~*^5TuBl^6Uwt31EU+vShPom+nE_toV&eMXe0wA!&e{)pGg zqt=;RzHj^1BgKiZcv`v@c#1LRqvMP9o@b>?}8J`^A1|GJa4zn%5&dH z%X4RUEzf=YtN8D)R~lWtL8U>1_bLr;dbiTxu1_lsmei>#VFH28T)rNLLf zR2q!iw$k9Ssg(wo4X892I>_GI?-TBYaK~rCvX5@=ayO6X#ay9yF`6!@)f&+i%ylvhCx& zD%)&ucx9`tHmq#1S%Gvjvd)I5RMtB7?MkWdd6nX!lgq1H ztX*Dl)zI?d16P$7TySZ5{_>N{AK&+J`K>!%DbIOqYI(|8N0i66*u4D2{0++Yb?IEb z<%lKaE5;2j4{UjS`Q+B?l@EOGw{r6l2bXu8+_=2)dwZ1EKjhc)y5ApH-l+Z2<*jad zwA^HiBg-{g+)zHL_ci6qZ~M3W=$uLA*ADJpUbyu)mE`p`Dr+3Rq>>)CxV-$m`sHt% z4lBRC<(K8@tuC?uqs!xty0biX;DzOJuPiA~xO}Vf%nzEz&J|Mc>#09d2aKE%kv6m?wi*` zlbaV;>hF6}rQwGID)pzGU1_xOUzG-zj;u6l@pPrZ8IM;Qu5Masu*J@mhOd0!{%~WZ z;r%Ns^+)|#X*lFT_lM6a4UgTWQoqxgm4+?1tkiGd_4I~H{k6ta8oalnQtw+eGxqCB zz1N#p8uZ+>Qg7Zjl?L_eR_eX9s#5>Y4J!3UcdFDMdy@OY<(2x~&ac#a(*5Fpu=gHL zQEXqhHerSg5(EU4Gz3vl6p)$jVXqA;QANQlCQua2IbzNtM@5vJ6h$RUoNi_W$&x`y zf`B=rC?-Vi{+&~|>iZwQYgN}M3I*Noe%@y-Da96GdOiwFzZ0HBd?S|un0k)^(;ZL2 zL^KR0zPVsL+60W~wP0va1Y`5AgZ@V!&>Lk3IwNagbk{o2JnjbS)4qV}4QWtTK7TIw<^0)Z@evPU)O^glCGeN&Q(ZkB1ZRqOh>mT^`dxt zc@!=yM5iTOw0FHH;lp|4F|GsIk1s(c21ZEJJ`<@GG$WO81Ej9uiS#e6Lsri=Am`QH zXieTCbZ&DKy7_)Isyw#`y%}%=X{`$2zFZ8l2D<2b#7p#CV>fE#?nK24cA-2~bCe-6 zMrluDQ0DXvD7W+xD#{n5^7T_u9XkWHd|QaxA{$VA5Ae_+@MKp3ZxlmbrNFeE^hk>%n6{EUT_If&NqXeyO)y

Vj3+M!qZI{U=y@N;US9_W>PDb9_8sWz?19m3eW01*1nN_LK~=mFl=Wpn z!6yN@o0CB%zz6-Me9(`1o#^wHbLh=2AJkj70k!+BLyamDR1yCTiDk1<&h9jHTW>mw z`|%ZpFYiL9d*-0My1{7Gy(sC8dAYLOp>8dMBWjqz4g z`N0j9=QyLX^A4zNBaO;+5>Z7^5UTw67*$_8hHALksMhK?s_pkib*np2-F81zw_X|5 zO(q%n9EEC|ev&+>{l|x(5a5OMf`vgP@CMYtf^sE%I1Cm@2h4)V`5&$aGXoF8hs(fw zG6l?UOaqD&f94m?fSA(=O66 z0qel@K7g6i2$-g>2i~{4U@CeIyjwKsgl^!SaRbxP({$gHnH!yP^7N9{_~-+dmvdD4h_&$puX+hI*PLeHGfqlTRps95$P${l`+ zGMB3n)f)P6Mb; z-+}O97OH*FPV#W?-#nNbAFnj%gxZqka*E#}b50k;{$x|@9wwo{_ z7RISST<4^L5i zpb83C9FI;jBWQ0ejaCJABahV8$X>P>ncxJZ>6V1l@(CZxYms_m57L(xBP)+&gs<46 z)%VlU>G?J&W&9FUwPY!J_j4CWf71uKb#fp(^Emn*{R}<(=!Y7|`bCwLs9l3*wKHfs*mC~s0n-h9ubP2T`FGX#?Mxj=V9@Jc>g6g|3p_);@QI*s# zRNgTLl~tvqvdk7#zVHvKh-*Vt+OtvhT`uv5Bvfl@jB4A;QJuFIaR^ydx9}Ual0&t5`~KsDDS3V$y1`=BQR0Tz!D6{Km?ei1K9F2&A&GuhRm| z({=*y`Y$jK%>v#o5ts+20?+*}m}3F)LPszk?GL7Zi@~hb9!&cugIPizIpYmrwww3^ zV+&>z2@lF_f%oe1e_W_j0@E{O-Z-@!Op|IzJ_tX~w*YS(aR@(EFl|}@rXDZB^iU$0 zs$I$JG?@-(~ z3o>7G|D z%s^{Q2_Gu&q15Kt=wawu^nUwkkPg)bZp>SdSr>@DwV0y5pe?9Aa}&D1%>d;lEkqgB z7ASq~ZIs2UM0sBgkobcMs@VM;)h{RWg+UH#qY6;lerxpj${N%>B?#3AhM_5-hre7u*X#7z@`SGgT{;m?4Vg-N$m0dN0R z;B6&+Gg|~a!WQ0i;tmGHW7Wu?HPr>v$A(}!C}2%g&;s;%aRGXhaTWD;MWXf?71Zz`8C9eYBeACv%5hgix24ljJns<- z_j5(3OBSI$e_o^23YN%&`GM><^&yj(2&6fkLTb+Akn*L4NIiQE(znb(R!cS`{4Ng# zjA})v>p!BD$pxrtjSqVFB?6>t?}6O3wIHj#6n%GYL(j6lqK3wHRE&I3p5trc4Zl$O zf_{`Kib8pt=OFRS^{9L#9Mui2MlHX>P#e7mwI!6I$F;Li^P#h-K5GH-$#PVsWrQl^ zuAp-60aP|Xm=Ze;RW$5DRd5Pbi!)G-+)-3(l!t07d{G^>2i5tKS;Kt;sxv!9_+Wx+ zTZ2$76Z3B##{XRdW?hb8@rW@0mIdL&95B1Pm+T)%ckJ3v_;3!)CXn;rxPYAL`(U2Y z4!k>L&v1#H>1~N%zC9dxa0txZ-x2PIfw@K)@T7@{_Dl!Uo&_XRNnl$47|hnlgK6VB zGTV|_GMl)lEIIp8?}5hzgXvur;O&@0{NW|pg%EdKT?;&OGJkBX2h;LlFr~hOX+|8F zBsqae$ZatCSPn)T=fJq1t}wQN1^u3tpr@h(y0SvT2Nlpf{E+lTC#c3EP}XSyg_(zd z8>9;|WVZi{1n9^5F!b5z6ngV$3F=L)MC~UHP(xNVs>rcI;wcU&$EbwlK^DauY(U|& zEYayTEZVz*%oqDdkb8p(va{qP23%AynJB7u8Bg z9x}@Q&4b~@ZZMxT8qBAWxk6G&_(0}|og@oq>cH&yHZY4I%s5MUaqcJCQw4$9Cc=_M z#5p|(JA{T{X0ArqLb$K zS>QSHfj2c2cn;dYlOZ`!Anzv~NEopYOqQMWItEi!A4DpBcNIdlr%5hCWw^gK2yz_Asu21+-^AFk^ zRE$>nT}2*2!N^`C92s9di!_cjBDGm{NI85pQeW{G>DRqSR`u%<{>`F*cUtI7R}4yd zFG5vV1HD_a6QsAC0&Z6&$h2vr!I6pRSx*R6wr~(V4rNjEqEu9$O!f~dcTts z*A&dR>Vl=d1DN~PgT*#78>Hrfg+B3z!|%v^5f5f_BEYhYTp!1_#i?RiOEQ;n}~8I?L?{l`^mhig~Dg#pwlOl(VpS? zXw}3c$Rqs)vXeQAjAt)Gqt{80x|}jnwn;(iqB}^>>khIU_=udRo<;$tm&Zhk<;Gk2mql#!a`U5?D+e`Z504o2x2bJsEkiHm; z%F`-PMMWN}@;HjBlRQaZ$fBC>h&bavsBW|);X^2@vr#~G3iru;u?W?Q$sVGBIA?9$ z|NTE2;p&oBh#o6}sAH87dFK^G>d%C0Z@xj~yjF-za)l_g8=}s1Lp0|(L<@5uI`Ilb zKQ@P$Nn;>py%=Khxe)Vb48#iKAoff$#6D<%xKR%w4p&0l)sGM-`UdgZgAngn2J!z; z5TDrx32H(};LU}EQ)?k1DIOAjPKHE7Ur5}i1&OhBkR)dfNz)Y|N&EnkJ=7sN{VQDm z#)q2|d*F6J7o^*2K=#bPkT16x*g40c#KaFO=fprAdkP*coC{Az--f;}3f{aaf&Mob ze(;~d-&0jsR>KC%ef)uyn#W_c-fXP-H5=>l)UbiC12#&Zhs`)mc>LDI*!s<4JY~}e zcKG!fQ>W%*(3yp&UlU-rpP%q7V}0x`UWa`$?C^Y#FL;4UA)X(WgnjN(*xUXz_DBlA z&came5UYeO?*72qR+q4>*Kn#tZysVL)nqKEeFV#%8o)B4Q?Sg>WXuVa!E#GpU=z>gCqg8(6e4#r5ZRdlQM2kH>aHb3 z%PK&$n+HUPK8EP(n-HTyvf%CjF<}cJ=3x)Sjv9hk@5>N-*$-kH??K$??GQJ27~(D; zhqz_|#H;Uu__=`)e{n3t*T+GEDg_C1Rzbq~5J;#!1&JzYkT|Cb5-+Pl;*&9uWD@~N z=chojMhYaKO@Zs@#gKCLKBSh}K-vKt$l9w8dD_*$__jc?wjET^Lr{CO2U;9^pyQ(p z^p;?FowEx*mFB?U_gOIPr-5a*7-KnCgq3XHVKu%Z)^tn8I-3%){++4V@cS&xo7Ijj z3sz(6$yL}kdkc0D+{A*1(=l3Hf?YcNu^T>vy|&w9@9|#P$EX|ozPg9!S1@?~or~C4 zI{|zDX~v#!74US&c+8*r7h9bek9E85VeZ;Sc<9hSq;CbJIuR=U8z84Anve8e^O<1@87S^{Y#Cn~YSl2%jYt72WYCf4*an=LORid$sX$F>RQNU7vzF-;r7IVz} zvD}nWte`v_D{g;)l{{8srSreB(yZxN@y<@HP`4Y)cU{49zg}WFG9`2KhcI_t4CZ={ z#$4Yqn7eZu<|e$y-0Eb^eK!_!e@bKSr__J*5VLzVL?0c7Xw|V0HFg|CK5c?1y?BTU zbcd*(dWg0hg6I<*h|YTo(L*5+WBm(a*117Uaw^2M7D24uLx}ab2C?Ch5X<;LoazpU zn@IR@Yyre2+=sXyDiE(h*sysY#Gg=y_-Eb_KSbEDP!kfik=MGLknmm_5?xauamx%y zY`6$X$_F9ovBf4%*)5t<1?`B9eM2F7=r~B`!VuO!7iGre>sDuA?!#B`VclHlc;^mnfvV7VU<(Xv zxq)TGm$CAVKCId7jCB*1VZ9a#>z%!Wbq!8oEiE0aX1NI~TF=FtPs_0k*Aq)+x?-tD zEi9vW1Is>3z}#0nEMJg<6~~CN;(I>%y3DZRyAxQ^9b<(J`?37~*;ww{3e4>sg}L+g zV9tm+<~(i0oENh(S4IkRCkV*fWifYiAm$z%!Q8#q|Kr2yEf5u<4pE%V5UDT~uKm@8 zNC!oTyyZsnkpfXi2_xEGL$nde#+p)yPW}PWuY?d|aglUJ9mJ%+hM4{sh_!nRvAY*R ztf&NHe_V$+aDlkJzaZ{@1jPM`fOyD<_=8pu{{WFZgh7JyBuEG;hJ@lbkT9YEi8E~> z@r*kpHk(6|k z*zj8t=FKI15S_)=HXLl5lZG9fYzQA3FhL1bhFOhdsOZ;psX$m@oAUTP@y>b*r{wuD>wH{~HJ`R%)sIK9!e;IM14F8kv|C^`nN%p zZY4x*+yPO22@q{TGH@gaqO+z$^w;eWW4a4sR`f#5l^YOK?**}HIuHy0K@iS zCsht{mK#YHWt!JEp#+j-H$zegafq)AAo=7UxE?*7@Zl_^_Ek-Uz?ZcM$=40!Lj@UN64?9ddj|G*I|N5dm1-s2yMDk!u^3aHV%q*~Pk0ze~U>%-c zxEK4X9l_qO2_M*F*rhT9J8oQs$H!m9x|rN&KEV5eJ<##|Ftn9zgucP^Fwl*$%!_4M zIWH7zRv*E-2X|w=$OTxB&cr$;U$JJP1y*hCB6(PdIko$-^dB88Rj?6D^%P+loo+1q zvWc8~36_sl#|ocTV#T}_BoAk>Vwwh4R4Kp;(W6s;fm{au| zbLz%m&YP8(tENiw@ECKwNq4MpAy@ssd5C&JoKepnA`3slwTg7OR@Va8UNu0ZUl&A{ zA&9ah`8Z5mqVg_8YiL2VuM$K@&VlIeaELLBfSBN1h{@4{7~=i0P6FbU9S~bl265_p zh(m0GxJYS;d-Mq6O>`ih?3m(jI6{2yTS%}N4GC*VChkrqdFX>gTYE^{ITjL&{UJ&F z5hU%o3dwTBA$I4%^{6Y55;=qPg(IZx9|Kub2;}x%0>#ZN>Vj?Sv1Z#2>7% zC2NMQZFRA2);Gcj7c8j1M)>fI@ZkY=bK8ZzcKcxOi8a{A@;UZ>wg}I!dQCDR!oGTQ z2_Jr8&qvF!%g`3=*rI~1j2f_R_%zI=yx{$`%g{mZfHv10=*!cCftp2F=ItD;TvCrU z+escmQ?XuZHP-VA#X1cX)+|xMs-1OM;Y%#$)PKV=vX)q?>^PSCau~}@IErO|yv5u% z9a#RxTdXjkMDiew6+akb#oLcb9%`|IpdZUG=)rP_(=fO03Fgjf#hkwtnA78oInO?0 z&hQ7!<;}!gcL&T3q%e06af|~R|MkU|&k&V-8KTIpDe~c4hs}Lq};55)Ybt=3&W7bp8>f89Kwfil84t&VZ%UeTmZBPuMvM3f?lyD z;e!Tzx_1%=-)|)TU_|^u9?J=G2p{HQwef4QCVVD*_(Aw!PW*wwJonGoGWQdeP?+Q|(!`&L%;-%o3!4mk&3&yhY@3C^7AJ(j0hIIpmu%5pa z9`lxT*b+IC)t6Y+{|Qz&pMp6@ZLxHnIhIPy#!_tsSVl7t%XU7(+y_&z{PvYtA?Gw! z+-QpxV?JWV1r=DKkR~(5S29beVYzAKxf3VhDw7Npn_y021Lj;G!W=P0I^!tj%KBoi zkq_pQGs2yc`yU_NvmvrY3L-C_By14Cwa!y;t;ZQ6o#G%eOoQa(DMUFYk(u;6MAaRK zXl;^>Rhm_tlc2?OJ#_qC0KLtR;kAf?Pc_mo z_$vd3mkNnLSYbK0PT~&?R-2Yg{2?CeZ2OA!Z^vQ7Up(Rud4vy7u(h2%w#|Qu9dH2_ zG@d2jAeE0@o@Zh=uSwYJU?%pSGJ<_3@v-lRXgt4l8lGR*gME!$2_FR5vsw$gJTb$L zN&R^IM|Z3n_!@H!c<>&%Ku7csXlqY{XA8~X>$>w;cG6m`{IeEo4qw2!aqd_zWg6CV zRKq%1_pxU3X{=g#7b|>SiaGD5Vwq{0SXyBwmKJWtGTZwxXPN-ZjWNaYr5mxLR5w;E zAbs&FA1fx+Vnw+Q!iPRAzkCyx`-eE=b23M)TSh*QnV2)Af;oQ{W3JXI%(Z`xxeLkf zZV!TL)3qju7R~K-A7Ih}z%{Q3>G?MP|il85M}e*$^G5MqDxj zqATY@jPyz}XDlRh#(s#2B%Sfdf_Q`;#7KR{f{6T*m- z5O3H9@%soLVq+kF@HHgpklxre2npeOknoK-gx*0&3?VaT&TB}rErF!?)sXBE0@uCk zA!Vy9q$adL+A>!p|!ohMjvRKJzB32vciZ$&`u+H*dSpRAvHhei9^PDDQ%QRVRZSou2rrf{| zQ+lzW)C{8q=48IOkKJ6uNMGC~d9cGiHczqdJ3YdNt9X8qHTKnzBK|OfJu@<}%WVzp zXmS>hmkz=@vk0TD-@`jOMQDHJ2W@+=z_YOv;p-G{EUSD7D_6u}&4R;N7f2p#-r+H~ z%&?A11=bkYk5zS6Un3CFUE-5-)3L&7;th@; zu%bViHT0ijg~Q9Se9mnw*QtT!M#W<8`kR>3Pnd9P3+9|9{S!)d7&jhcPQ?}C5rhpK zk_WAqm^$q z-BgGyehpF6gCMGkutGQp(JT!y=42-k{fO+QBoMn{3B;C6hd68EmirDsT-R2Jx3q@% zV|yXKk`D1lEWXsb(=`I z;iC&TJ$}ROoy#HZRU%}ihe6)FNx(!GK=E!xsJN93b-KyWk}(XO%OauADhS?;qM_el zHhg#c3&TnNSmx3(EVq6qR`T)3YV#GaX5d4t6ZQz}SDe5`nrkp`!%l43dL3JPg<;$J znb={eI~Kfk!f1~taRLUrttrG_7q4S)&zsoC1Q4q;!LdOTNlGxltV z#V!q(vEzJw(Sa;Gp!emEyZzKyHe!rlN{5^i(^Sv<*TBW`&iL1z0nVc!r}D zamnd;OieY`ahr%WksVguup28RYGY2kIhOudfTiy5!czTSSjI3P%XW}6e(xf2gnXoNh)>AGsihHb2R5coYs1XTelP9 zVoyQbSK^Z6UqF0_0mP@tLxS=SNSJsK5-w_!Y)pj2Q5BF#TSH=E7}-J0g{0X-kd*Zh zl2?C*>#p*UVqXBM^OwQhx7Lt}vLNUC6c8D5;XY>{luwF+niykfo*D@4k9R=NZ7Fzl zbOwC96c69>n&FRX8MD?%=tZ zso1O23D58e!2?^PUCGrxwAJMfvc)Ar}5N6p}rGE*@2r zgh#iLU8(0htm`m>M}JDg>VGz26QjT_89oHDjfbE{)wdqreT>! zE|_!vB<4P0u-wfMEcd1u%iTMKE0vL7PxcoG z%kV<5jHe}**>M`nTx-HI*|k`vjQ@Z4)<^#T{SD~<@2mg++yVZ_0_XqbfxiF8m3rYR zq{_c$6+Zd1k@4u*%Y?t0!4%KA&SY0xF=d9s%-sP^rm$OuNiL3LvUnOyf?XAJYo0Na zcmSB#Yp0l`lt;{^Y+oi(?HF^S)Rjr9v}9HqJz!GrNi+7`8YXpI7c)+33zHnbjFCOv z%p|YL7d<~W#9W;tWVi+_bJ8P&;UFL8tbK{7#Vm(87&KPY=bXq)X!;;}KkpPjH+?B( z>)0e{ws)l}Ub#@QD)$91=d=_Y4D}byvp-XCid8Kr`=u_p@V80OvA#qQU#3J&F#I4m zJ8^)*Dmw&e%zMg7FP)m0K8>=*JE)B%i>Muc)Ts;l52*dCBdGgQxm41|PgIfVb*j}h zmTG1uP=il?P``%{(n^QxXzdM|H1BOLZT0;vJvDOIPY}G?rcO_l8{?q{2!an@$C8Waz5TLZN%}4dL;sZNl>#^n}M!LAdhM1EKZF z0Q%+rtMs}tUnm>n5$0CwH&)*83iG1n2O|?Ofx4F$Pp>^yLKiBHr9U6>6{-ZL3bkMR z33a!~2-UwH5Xv2TNPpeGknUVCo38MEM;DCWLT7DWL1$Xm(zz23(?!i!>B_K=bo1hU z^pjir=x4S(`c>c(`c+se{c^rG{mikAe)8%9-7#q<-LCoee|cb6N|c%DAGHL1NnX@3 z{%$J4Z8UZC)?+IAjerVFu%p7iD^k91f~b=k>XhA+Xljn1H>KocEBM=0DG;$nf?4%X z1C<81Lu6c;jy z!Jk`2kD@t@)7fHCUvC`ayO~{XA&*1?LZrdxwJ9+ zi(cA<;tKAHk(Vw?qLS&InX?*o)#qEBK{;qeQM(zw`gnDTO!VN(F|}St5SQ zCxLUGGr!hdx!|681V3`{WWnW*>-^sQ5P_g+o*-)BAwk3U`-0`1xzvO~8~&rPbCit6 zIKk1@P61o8POwXJonXVl48ic8W`PZg5MtV&iqv*Z0*(ZK*dWubDL zvQNKEMMrm1yAL0wZnpiRLMBb5Vx_-P>rJjwCvNYfT-i;O`%Xn_;wg?`c*AK*`;V?* z_gHDcucxhiZA*!u$umo2I_k2Z@YXR=+))smP|gwMs$)KTb-##xySq^7WvQq;wzTl6 z+&9s%h!VMX&tqhM*^9yk|1i>nGNMdJ0mE6cl+o0SU?w;!GD_>bM8BWi5FI^TD!N@5 zDe7*2%9!pDGL|W?85f(&%!Kpz8102V4Cgiy{qp%GnzertBlS~SOWqI`E=TdZ{@kRRf zfCW{)W;HuDrHMWFBb|+w1hElirR?!K2iD{1I_9sF7vps+R-kX%L#dJhccD<2l+2M1+~ z61?J>VE4&P%`RZIwk&2Hy-L_Q#uwPd7Zq8bNjDoqtT=uO1<2^*AIr@%fNIq}@ZQUl37Ri~(gF7fc;J zy_*VKH-^f&J%*}l?4rIx5A})}rlqIsppCm3dhF!Ww93I|D*fk7rt@Ge8$G1W#vJ!$ zPt7~V#%;1=CBNF(qMiS+VUH77wc`qcai1Al<+>@o=CuQTEIW_hoUop@JT{X$8ZgYv zp3=jPyR(Yj{6WZudOl&#-cDrKbmg+zML(If0p5bQ%Hya9gF&={MHj8^+C=?!PowUp zSW)U{bw%r46_^!;ip<>$+nCY`MNE;>WhQCcUS?&Iq3Fxc)rI%_Ed`7`W6hiUW}*E-rZ@&mmnoTle2 zyiEH?-l4s+E$C%)&(Y2!@9Ei;EzP$~ps5G4wDpyTv_*(KZPedLt9w|}Iu;kHfp%3| zCE1^9SazKnIXa)pSrbUT9#~36oSjECFTX(@IND9+9e7JE-%~_gowA9V!GBI|yEj5v zxdG*A(n@ijU!w#jQ4~jFP3c$#3a;PWBnW-CP~bjOK~R_%BAC0#LvZd!h+x#S0zR5` zuAsRuu<(c{;?I~^=s4lmeE!yM1Hl|MExyZ*KEauN0{(Jo+Ze}`$-dI`4;|&Sc9Pi|pTB+pLR|o~y`p5E9-i>pt z{@o$aUbJ3tB<8E2vnZRosCa;S(EXZXveKwltVF&4ZBGq}-Dtnqayns794#1-XKr)^ zv!T&VY}%s}Y~qwG_UN)oR*0RM&n?H8)t6@#eh8Z@c#z~Pcri!J_wM@6%)M}im7RBp zT~gl5Ud|V>H*eXpx2j#)E5{G8!Bq@v`l*^JnfisHr5A|e=ROdfyE}(bn(oJh)-PbX zGtRJjuhLlIpG)lg&OvthpM$KQ_9S-prgoOEqsp2LRkHH_QOrA!W~O|NHMhv2mLBZ6xPI0(_Zd?*I)b^hW2`9JzJ%eJ?3|X_)grpS z=)GX{_`QWktCk7k7JU;O9{MbJ!C55u(-%TT<6#@%|+1DJ*BWS`>`N4 z%vE%1$t!+wMTF>Sy^bh5wwT!de9?uiexh>0(Sm@wos7BRa#6h33ud;i9HXT$#L)C| zMmE_`B=PDLz2@7APO_Ipr&PK{Iboq9%g>3T^0l2JP1zbzMaQkerl4P<<|Ri(yu@OW zv;Qv9eY=w)^W@1Qzni8a-~3?FrKf)jr+&~ZtWOFRX~@46gqX_<_7*J_^o)(Bwx~X) z;_n1fu^abO4^J3Tx6FH}gz*!o=SKUfpAXfk=Wq8=Z1x>yMr0g&-qD&Z8t28{slLsg z-SLF=4%A?N$|Z>^q^qcFXX0t&tXuRVYY83nr-xpmcAg&ZyPqoEs4Cb)*)t&qo0wm{ z8`*J8A#1ek5-YR6or!&|E81OhmU4MAk*YPDMJwyZ()!!H=rI$X(lVE$sj96{s3X62 z2%aCQb!=GrQ*?2-MO42hR#a%(CbIkdlAq`}BxsqGLQS0^P3>8Gor+j-lS(PKqB0eS zs0{sXDxJ~zUml8Z$-A|x6T4g4w@-}Nxb1B$vi{DzythqM z`Kd?nalsojDWozl2K5bew&Xq3Bv!x$^E?sNm zMwjo_qMOE?pi7-<>Bhg9F7_OzYj!2lOwB#Id|*1A9VJ6c3{KN`UM!)rk0{bNwuaIv zH63(J!Bsl?{tOC%x5+rPpnqK(8$>rPn^_pjT@wq5XMd=w&u1X#Z#x+V}1qdiilxdP%pCp0#)- zz37K2J#UeO_TuT%UQ2 z89HTDFfB5)r;DC#q|*w@=qSfRI`U))Q zR=R|Vex=Je3<^YNKgjWmd({PJR*V)L{(HLMK!2g=#Ro&?xG;-pnzoHqn&r+Kn<=oy z90OKOIiGoKQ^Opae?e3z>=W4DFsI}usZzG{d?*vRB6!N);}2OM7VXV0V02dWF@C*) z%-MyW%sqJYErd*)!r~Au ziqgDD&5b@niRvy=jXFlu&>L@B{n2WA^vo>UdLO3E9aq!n$V__DT5^xe?dd7sGimQ+ zYue$jJUz>XPuulRpgm{A)7CqaX_riS+Ul+n?XWn6HkEd#ZT9YTP97}TznrVf!WwcUvFs-YgNRL|jmF5{J(c|9A)8@esX`96DwB0ywdYbewEu8k0 zcK>>Uo>|sSFHjz!7i}9uuTFKQgBNb1x38t?Ba(Xh(7v1WiOQF>P~TGY4-?Bg|KP_= zY&Ybq{nVn;lJ?RHoLRK?OAV^qcR*0`*@ZUBG!ts8ZWNxdo+ON?LxfkK%@iIyIV5yG zJx(ZpeHwjZULUR1eo`P@uELz@+rea}l`^xg?x(cWUFfkTL-gfo9(2Qn9{MjEDO8OJ z7Hax52uBS{3+0E8(0}w+(XZ5X=oTMux{U8dGxhFt{#}+X*xX37rxoc3>I>=Wp&N9Q z%n7>vyM*pGkE8q2uhGxq8|mj}HFV$oWV$CKltA&EV+?g@M4@)$OPvx-f;J)2EX31IKct6@`=W!cQzR_q-c8TMYSBbyfW znJu^w!KN$OvxP&y*{pF>*#a{wHZxVk7XA)q(BvZ{)uWX?K&@s{!ToaSz$k#@BLIxIry{-+Y)UY!8e)ChQ8@_>c6_kc^u3{d@Z z9GyKjwJ7V1ujE+mBS}3wQ}TY7l;r8nxssf@U6M_r<>J=$1Hv^ApE*63p^<}H4Dy|^ z2ze#tA~Pv)YFM_-Nwc@E=zhA5_}tRnVsW&s_@Uw+asGig@depI@f2C(qH|pj=vs@- z!qPA&C$;=jPR7fwJLw-nPO>{b3(Hm0g$LJV(mysYpdS1jVs(DpXZHp_VV6=e4BMSg z-B`GY-nnmz*dpDxsHC)jjUO9DPh62pPhIcDcw5tKSmzYBBUzOlY+uNJU)s;Ut9rrq z1TSM-PgJwb0o`mPua#|dJH$3xaoNT~O|~ICg>6{p$JP$cW@{cEVXOZ!W2-D@v*l4- zw*0_p_JM0VTk@irz5i-AD>>i8vVU%{MHe5jg=gg0!mpp$f=pL7zvDHVKg?m-8!@az z6vWmIUS&Iv+84f(*u>EiRtMvLQ{&Wf`T zUtApUNZdGQinzCXl6c^@zeH9kQ=;0nN1}K2r^I6Va*4fcjKrlfQR1`4OXC05RI)SX zisbkuH_3&WXC&8-SV)p5K9;0UR+SVUnkFfI@mqri2W{LlH2C^ePTbx7@M#!u;5qTVbi`>f( zBTJsI(^EZTCw|YJqJY}V;vEws#n~Iv#HEYU#Chfy#24)-u~St-(OsoawA$ot!j#^h zPO^pyPGfF%dhVX<6BUHF>hgN=kh?UYA#qK+}i`{X?j8$G|NExp< zOD{8ADLz!CA~vk)EpkhWWB&AJQ@Wo5*fD;i*({lQ_Onz)k<6$__IFDO`{CdiwqwMX zZF-l*R%J!7)j~72?5Q(bwZD`t+g!|6UU<$v*u97?+qagLwC-n%uWVphXBW2U`!lxi z3dM@Tud?~Us%-uO2R7GmKAVFtu-U)z*(^IPHY+%r&6uUaW|lr=Gg-{$F8#z7cABs? zax!f5sI^6M$#zBavipnT{x}yk1kgqO*YAim%a4hjM&5`wZq^WoPNT&Mz82yvPg`-Z z&RTK9`E%mliIw6nb>0%0jt>&m)Qu87-=`9b+07EW9z%&s?h}a*f4#*2^##e!{T7nr z2WCqyAaBXFt*a%;CK-}+^XHPn{plnRrIH3U14+k%mE_s2m%QSxmOOj9O49s5T9T=u zBUw=LM;xm8UHI2L-|6>nH?;O(HOkI0Lw~ZDfO-8daP4Y^1=qsCO)(2}yTZ{8eOV{j zOP3@I%v~f!hMtn1%5RcR%Q{J3rbrS(m?XXQRMB|faZWi!=E&r;9&#NBL2fcZ$YRA# zr>DUQPQsHmMRV3o6mOd5CC<3R7nfL@iF4|z#Q#WkiP4@FMVV@SRPp4m!UUT-;YiSD zC+!`toU}S~ous02h2@@x!eh#QLOIHrmMdS*%KY5MhP-KI_eVV;&s&@SHZ`4|Hg~yr z+VilYC!d?x+rj0uby@`NH-9%1yepQCw=HG+%L9t!syvIh$1>RADY5Lws`2deqrceh zG2LvZR~y^0+<Vq(JVIqP&mu_&S0yGoY}^} zrA4yXqG)dIsG>NP)}p$`7eybs<;9v_tztBMTD+<3usHO7fH>i?K%8}BjJQ~i5jX66 zE$+z(5`W3IlgK14kf@&AD$!fuC$X^ck=VU?Epdr-lK9MACh>ptk7Vbz1(M^NKT9sy z&yZZ(v_O)q`Hv)BuS8O~qeD{KHA~XK36^wtAD8qczn8q?T$MZ4Cvne@vc*MPlf<{u4YZmi|h zB@A;Cbhj1FDSaglF7Fkmt-3FkOiK`FB~*z+tKNwP8FPzLk22IZb%8M9Gwa*@mdO?Ftyll>U6h<#$}&o+-vWUI&J zvDJtD*ovb|+3Ly{Y^6;gTYYXDTRuUZtyuSe*n97;D4s9co22BNB+sBCiV7+Q=$>=R ztf-(Um=orl5OV;`0xBvwi;9vJ6zJ(DijqZ;ECvJ<22jk(t^50~yVmm(o3Nas~bNkMhMkSg^D?g@4 z-#-rEb@YGnu)&JoY;ceF+x3i(&dlc1?hNDe`d9H)+Y0%o(hk0B(hfoH%oRa>e!5^} zmnc{nX9}Z=yoCu@P71E0iv*8nX9dp{wSw=ixq?3%AOx@4O!c57B%8k%vb^31g-`Da zReE+p!4cH;#%K94_hIzuA+<&osCX)>&{m%^>XE8)*& zBeaTe!l@sIp!;lPobtp44K56a7^N=u{%vhxkw=pted{W;HhvN6zpoN*mG2YwC{O0U z{Q|DCS5J~PH5n|e3}EsAgo)8h!E)?EN!|Hhk`Y7Pq#lOf`Ay4|`J0c=@Z6$GKG`ga zKRwfeA62R*joB$>`bF+xqeVRXqf|$t^-WKr(Ne;GcaLOqO;g#!zDBI#@^_5by8 z-$C5$&cocCquX=3EyEqI6?Zd(ZhYg7I^(3$kU}orb(Z6~UtWx2b5c%?@(wPz<1qK) zLk0Ioc@+2O5OUpZmRyIr9M|&eB3FOeo_l;@5BGSjD))FoI`{b8K(5B~CiiF$;VR=} zxbn^~T#0EucYn75S2SooS5W(v%Z>QM2{S)(+}dU?o92wWtU8zRHk)Qn3od<9GnYC) zj!VgE;!;Ywxb$fcxlHe)T+t*OuB>O4R94AK>Vi4ah;8Z83YQPkPVK9__T)pn#KWK8 ztkS~!ovh%aYvlN}vQ$2ATrXdBYCZq-;Ay^VMui}^AW=|fe+ov54}^hlqlHnoHH8UB zdj!`Z&VomQw&1zGui(2=Ecn~L7J^qQ3vt@*Lb73hA#39cp|IhPP^COmXmtM|Jio0j zbeJRwZE6RFM{h%f)Y0n%cMVP6uW1qcS3zC!dzK}voiPH^YmUP2vFSMQngUJ@Zb0|j z2{_d!nC{5rLM(h>>%Vmi3%Z^N(uF2M>k=cO{?K3H)`A+rYvKg{>m_9_4_-^M?t6gv zYaLA5(-$V}P6AQkG)Ya3m1NkYHPUr^xAPl5xAO@fw(wa=pZS}%Px%wEH+kFIAZf(- z?~KvVOg22Sf&F~UTB2@oSfcV>iS0T!o6RwJ%I@9m%PRC1GL|okbFRzo;ihXjan9Gr zax&wejgy`0?f9$OmY;5w%ggu=lUnZH&5hK2mi^jxFt_gDZ7wGTuYJ$S6l1Cl_ynl71oovQcWeU!ZVF4Wiq+)D;3=R&UEfU_7ko!djVIZxPr^| zP2+OEDskMq1swNhIG2_Dj=P)8a+zXJ?silYm#$RAr8XOK$w6PaB%^fPB@Nc>ZZ|Cf{WjEy(Q}EvOI47L3$egn?~ag;5zJgb61!1XnAG;PH09 z;JMvW@ZFyz_!E&3yn_gF7Ft5G$SR@mL#a?@`9)|v_(XW#@kr=cbzf-nm?+fP z`3R}bV+D6*4gO4XwnR29Uh;Q^6Rd0A47bM`!`~KF92C@q)3thVzHv5AX&Zz3`8-4p z>truPM+qwqh6utBMtFMqqfigNLfXq_VMneZ-?`f=C;W4OBu{-m^#5!Rll-;-sT&Sv zKV>BqZb=gHf^z9`jOVv5YU2~$_u=nU_wd)v%6MPB41TcbMd^jIH_XhtTiD2R4BK_Z zN}^ISNTS%8$i7=Qgw1I1Wp~IQVr9MpW8T}C6JBtJnSHxYa@2_o=(3eRj1<`=m;wGAr7+FMDISce@?A zm&2EF&(!_6C(IVE$^Jdpzb^G|T)x?8!D!`ryRo)E5Jsy@dXN;xjSmb*K9 z6PJ0lj7v`m;nEDBa7i*hxSK_>+;zvZ+*RK-+?AwIE^gLiE>3qd7hijcOX$?(?j}9s z@=a>FpQ9E_XRzhcFoWaL(y-amH)fl8tzqYR*7yOxF>x(__QgIvdi6Cv?L<4D`_Z1S z8vllWYU{;+deAM%8DA09KDi40a%KtxV?PR`w#Wz*n0jH(cR9g>_7#)b&#r(!AFSJI96aAF4)k_Uu)Ol%7jwIV1xnRGt7Nr@=J;o}}DdMubmz(@bI0mZOMI=hByt;?lwfa7iEZxx}zQ zEM#a6X*F{(yfWI-ht(Gti-PFl=GF%!8ft+%;!&99vFfhG6t=qu^; zuN$SIua-&6HD5^IF~@nW0R_Bd>sNjg@5TF_)90fD7xHQ6mhibL&-u!yPJHXT!ThIH z;{-XquYy{Mvd~Xx5(b`B5k_rXAWX0sEzD_k7d-q|2%cung75srf`7kDLh#HgA@+BK zkgTjMWUVa_3hOO}D&t(C@yJTyd3S@*aa=02`D_^foIo!R`!IlhuUuJa{- z-`B!=%>cOVtpUA<1+<>*f=)7)I6rs=PVqX8dVb3xZ0}@t^;}uOgVhy;f-^$v?r7n0 zXuOc}qrb4_bq?R2rtX+@d9bA5lOGIFiH3<2JOB>Lf{9(I4^sinZ3!I*vKcj?E8mAq8PkZqA>eC`?9TzO&j`% z-F)U3D;vF=8I{tTGcwqoGaU7VGm{U@Nm-Za@W{f2QCrAJ_SZd(#D^o?ngbl?edQz6DsxS^d%GLBlHDV@{46c5 zV5=S{edWUmeSdOyHUx4xz;KykJ-IC1O)%u zBRP>U@U^ipDy2r4aIl^Bn=1v6x>=a=9=u}KI%*dfFX6@=umx1 zt5k@CHulHq{np_8^;dD~wo){ReGJio&)I_IkA;Qj0|n0Wnb30TuJCxsULmz-m$1`l z0{_W*7I(6*t|Y6)9xQtA0EzYiiQ5D)nZI39dPzimgQE^*r|J#6ULj;yrc^?q|MvO<^qN zF336jMvk)yujB0Z$mG0fS&{8LeyiiPq^0bKA`f;rna{}EtmcM!?RN0GQNXCW)iH@1 z{xET0H!{J62F$=;pByvR+{@-4uglpRHiwh%c*3a#)pL?B$2p0MHn(ntJ+~&kg*!g+ z0Ozwtox9jFoD1N+xyV7DT$pMd7th?KpZ8{QN#j>=S1KL36wiy?jW1zb@~P+CO`Rex zef2W#+LJ;q^~ql@u~mjkp1zYySF_@T00XW#vxoaIVWD(b&=#q0{C4S`&i&Flqous^ zfi#}w&G@Y*v-kj+{d~-ieSCVEI-j>*g|E_c;ajgt`HxYIAiKI=P<=N{FpMn{28>G< zMtn07$j)YAw(>n;#j#vrNBd5}$HGiFTRv2{+<9AwIdVrx-1AwubAOyrz!0Hg|0AJ6 zF+q6tG+*e@DiK~zQxG1f-xSiF_Y2F(xQGyGIgmx*LvU*KQrBjj|lz4r?y?=uLjQNPYfNz zk6EoP&75{1=ZTRyyT!wrtvoiC{l0w~`@=VjZLTk66Pa!7TKYN1kF|s`q}Rx%gq-E( z`JLl7hq!QK?`_Mu?RjCG->V7#Z{PagPX50U_%{OoM&REF{2PIPBk*qo{*A!D5%@O( z|3={72>cs?ekKKbHe&5Ks9CJ9eSYmIBmLzlZAgexd5{^Qe?F5Bn50p}ggA=#AY7KN6=w z_mPqCF7ZCJJ%0u*6V0F|^$wJ+@PhoNQpkEmStdIQA^w&Qg!%+RK>2;}HA;YO`jcS3 zxEk>BHLy;-3kDBPfxL^G@m3W_qI+M)yc>(XJM+-7iC zUk(dg=fM%XUI;su4B52=8Urc!>y0eRL@_AGy@cMS{h%w1GM}E5LzV1j%IOoqZEg=F zWle{KnR#$ya4;lUO@rIYiIDSm9u(0-%`0y0gU5USK-1;#&=S@I&36t$!;UVf@h^Z% z(;|2fR}DqS3L$U5D&+351ip7N`r$sNis|Hstnue1(D zYY(6()D%VC0*d$4qd5OMiVGj3IPxKiH`4i^I*aN+7R4hr(c4@U4?jvZaSFwzDk!Gx zHBm2}x6fh}QQn-W#gl5`1BwcDQIz9{q7l&J_|*Z zu_dwdpItI-@z%e0v1d&pkxde#=p5`*-Y<7lm@Q6QS4d82qr)h3>gS z;2l{DZFfFFbL~#330eiEEsG)lsVQW+-h-6A9K?@Y0HIqpLxAU4@OiBVTcehOdtDx& z{bU%dFdy^>AA>$@x1`tXsN{>+d&%eOyOOUFGw3x`6G47}2dJ!f0Db$_FmQwou-W%v zY1T0~KFb1Pnw5Z0%7aD^CFmM`7G-8zquj|P=(Sl4-7fy{d|3!oeN>0MdCwtZ#(GGy z$%llA4Un)o1rpyAxD|LBIO}Ot5A&g-Z4f+;`$+Y009xY9pt+(38g@^Cn$SN`sTlze zN^7C;hX&-eE(1aO7=)o=kZYU;d5uL-NYC^yp2fg}@082)kTNx1;{O;4{hJ@4#X34) zw1;-GyfrW_OTST_{g`%w+dL-EKm`jtLsV@AEf0>zpmQS^n* z>z6YqYWj(ymvns>OhnPcDyoHRD9WPq9#n^->-H!*!>9+3e_LPpsG~}DrJ1cKIL{OuQLyNsVDr1e-GUoTH)QT zUTCYRhZZ;jHCGQo*&HeLhr^InPW7-m2;#%@A#_hF1Qag?pT91!ZD1L=Hy;ChRSnh! zW5GZ)5Bk{71Q|Fj`Lg(@q{m^iwP^G~BGIg!Hm7$j&r`!d%MA>OKIEVGA@}ISo&yG0<`*3mRwILhVWq%7*QL2QNIK z=x_#Qa_j}+r4;yLMaZ3U9`Z)DKw+Ca+$+8dCF5s7nc^-eZx8rS4>mDq5jq-0NfW3Z zd{BJlEsEb$FL+JoJvj`;tIyJU(HF&oMJOJ&7{zubR2!qHCMXk)auLO^kpjc zBR13@>QHamZPXbv7ByeApnAZj|9CpPx@o-_jdE4x(0kPieu!DMEiQt|o3pmIDtlL7VKiq*n z{X-;w?fXeS$7o1CU(k|#WvwK?e^7rgU_fPj2Ixyp!hi!Uz!Yo2lF1HmOmqfdwZ6B72mXD4(gh)}zcKI~ z(ZD|#4uba*$ZHRS!qdZ{c=I+W3EKr_j$M?c(f&U@44kEc=CAcoG-VQs`Uax-K^%&U zJJ3??J*^j%lesm8&b>2=hZLgNVi5HTS|_Y&rWi(fXu2a&tQJJ;4E2Z}S|b{sqv$#H z{`=EWRF+D$fV5`Nx^eL(iem54dJ&JJQ-LVjM6=34>IW`VKkMo1CQ)6?q~2n`2SvCY zMJ7})!?jVQK;NfQgBB$$T6C761=XVYOGLA+l-1eTgC-kN(b%yO`z@sPB0L85);pul z`c~I|Df7VR>kQa7Yznx0(}SKrg@N@FSI~c43JT9AOM2If zC0~Z$lzhoklzcsZSn{X#8pvH$0+pl#pxbpE`v24fhZVN4;C2oiJsAUG?q}g{|MyTg znukxyb|`a(Mfn4bC~Kq*J-#F0<*`?kuXY{^40b?9#8625-3r$pSHQIf0dB;dg|x(e zkZtP(g$3^^fAb~OE$;`-C3B(mtQ$P>eh5tpE>OF$1uFfnzyk-G6N2VLZs9wi7moqI z=p*DReuF&UK2RiE0mX-xKneE=%GLxy#gt|L`NQu|Xug%s%d#~z)6w;R*Ad0-zG$gR zGeX7y6feJr;?cz@7Hy@uL5=zY<)DpzLG`hO`okI&E6bx;#ur8J2cqcpTbduJ|39KN zf%2t90?iJI_o)^b6ot8<$Y(W*jt-~wLIXuBSD|P&tqn72T^aTfMMG$vG0s7YKeR6V zJckx7L(rml4qDu>LW@(mXtAHxHT^_1KYsou;kmWuXQucd5ywzI>-DUy-8q;lcWlsa;?mEzmJ`4l490F#dpD&`qW-pZ8ashg({Gcs&1yl$9fjr8>xgC`THy2QD_y;??pY3wiF8Dzd)|nS>Ty^;A7T< zFuoS@H7%g9su7B-c_?|uLRmrzR5%~`PY=UQ(PDZxiZ7I-XvA`~RF^|>`bV@hbwKfc zni+Pa(Rsg2bEG?p&0eF}@fxiiR3F2x()_TL<_EgIyA)`iq;=y-A&Q>TTv$vqLuC<) zlHE|0N&O*w1-;Sy;3JPBzq>TQo};-^lV%1*+S}0j!cu>5r{70R>j}`G!$g82b2}8t z&!zt0Nb^HCT6}qm7D)4C(^KjXU(xjSZ8X^=rT)NTKettA5aCAs;TZJ?W7PakP`xCd z`U8VXJmvZ38>76D3iNU#;m2iF==R$~`wL@etDg-m)6YOn)KuyZu8>bzhglEnAmuC#*Ad`N*>B;iXG7LOEvO542p^kwpiJ_2l;1iP zWxn)-FCEFyc5wkz527``-2iSMbBCLM&%m{z8F0;GJ>2M0f%Ne$kh5Vi+;iLvm5(x^ zer*G^%$NqPzAvEVHbSGzTd1+4oVBzsaNpk%3di|CZs27QJdA+Pl!4q;^^orp14UzZ z!hLn5uJcc_DC(efppnk`<0_gd>H5#1`bf(`QREMr zDa%lF`ZtR9KSj}&Ocbr7dBOQMil+Oc$bn{2>%}NCppUhWpvA{tw0Mz-7PY_7B4Qg_ z1W!Ees7^(*r8rt?i&1O5OIO+iR+x?+X{0Z{xwSfOc`wORAApGow{JC?W@bw(ZX&VbA zUP@3FOgWJ1S^w$5{4APhDNrwPr#X*igPygt7TiS3J{2f-H%0MzI`4yN4RNAbLfn_` zLr^`4N>My?3yL+yQIDWGvF9qiCDK|!weg~h`ok_1l`cY2#y%9Ko6%Y^6h+aGP;_J- z%@5X8541LIr+uz#4E;Bs(>zJ@r*j_^Sv{opd#ESG()vO78{X2tm)nXK_hV`OpkFCp z%lw%Unz?O5)7JTDvSlzDvx?Yn&Vc{&!xBIpdX~E8XH8V6=clWhS)tNhL+n$kNjaGp zpf_z6{J3EX-P>c}UB)wLs}$4yhmBAZJp#&R$v}QvCuAj0fRr<_5P!IY)(ck%D7Xtg zEzPivveeu!_Yv4Y~--C}p-c%k`>Slpn zT{aB(N$Z7b3@p(I248hYh-?T0js!vDi4V|qY7fdx+<~$m^59RNH_a0gcsf>qiUY4e zxc>-l<-CN%)DMs_?=Re#IS`W1kA{rOIl#|-3dI!$P-QJZU7vbr?4tV0RD(vkUs11` z3)Rz`6h}Ql@oou<2T(1{%|Y=}+EZ?!Insmn7}KdwI8vV&HiznkW(d(D z6!+VYV)b~MA7p5zq`G)V^J6ou0W}^dD$%F@Kyyjz0~B35NP8DL?`H~V&5+XkkWFg_ zi=xH!HB*CWz3@fR$Vi$WXx-2rN_!02TfAn_qS^;7?k=aj1%14x8qI&7L36jwXtr=7 znqKgx{RL&WejQAIuX+<2EF4Sy!3}i=?MKbF6{vo~5>@rL)BIpd^TS${Yj%g;z}N6& zL<#LLF2K9-H=&LD2F>?gKuv5c?ZL|-zj_s9EvkVO4+i1~zlPAYe<5JeQL2XrK#u_h z_q0O*Z-T)3sV3;_JqCp=SIJ+yR>_y6@scmxddc@`XC;3x%m;-b)u4LhCm47>0V~G^ z0E+Ig+@c$f-!FvNo@$y6ra?>FALuS1(0l9{%6zhcUxQ`fy*%AVI2r`ympnkYFcUJo zDj@kMK;r!VkYrK~sh^iZW@{qwfnvDV=?oPSC!luxC}>!)2^v4rTi@|eXWI_d^#4*Z zi?Uq>Ddj%@fda>9$Xlued793U7o!3N_6!saYNOoWIq;y~3rg?hL%E&*|MVdCx{a38 zC=2l>p=*0Qil0`}wVF@&rKle$1fV!=Gm0lut?ax)bwKBz-GySKB)UJz)9esPdkjyy zH%YVPFWO(U(wz8WIPERMs6WtrkfB8L!yoDoNpw%D6GbQH(4Ld_mz!umvU?`&FM#G) zstdLaMU!dWu$+XVvAHxi(5xYvNcW|Z(Bk)dx+g_zT2T>NjN6XpwL{Tt@p&}Uq5Z|l zb~JXsfc=(@L4%lD)LXqBbvCa+&2Q1DUZ;(!gX&NzcPRF0R6%*;d(c}->qWX3bbF72 zca>T+Pr5_P+6t(NYlkuyEhvz4gRBHqNC_JZ@yF#M^iVbgev^ zFl;8}@@d?rES)zPe3>$JD*s~0@-rCHycI)7cw(rl4~DLoMA->C7X5f^U!4|U&Trt!{<%H@O|{0^!T$FUOo!LKYzvull7FP zkU^O%97bHAe6G7i81d{HM)s9rB?jR-Xc@(LtqC zdaFf@@H{blagT`3%qQYONyOq!GBGpXM~ucq5k0<~XgPf(YC9RC9QTbVS*Q`k*O5f2 z;R8{L-AUA58WT<8L$p`kAiApEL{EDZ(c9cX^vsSD-HEP5N4}D1U5Fu?CaZ{gJ$-%4 zHKI0pHBpnfLm69iZnjXy!J}*pJG==)$17k+K{kebm8D#zb9BBtF>J#P47$@0k_z1(NU&rvh$LM?;V0f97&i50HFkOieQx0Lo&J~og^BW_|C}-zK zAB-FrkCAgJbIH36Bh%JlZ3faiFD5Q?4sx7>tfW)VHj;uhS95nF*@BHV+Kyf znB#LPZz%?^tT(`Gfv$LS;v`HV3-DIU3(OK(BL7Ani?moQ-IIjX%2TmE=LNQ&-hl0U zPGjeZDEut7#$WwfiL6T_>0@m`l=bIR9>pu7J@gpSpZAa$oogm$&H2P~oC~qKQb}yg zmJ-{z1H^tr9vN4hL?lZB$@sS~$&^)Y#3|`2arR$F<`h$gO80f*wvQ+7TNV-bQzNM^ zmJ>I(GnAchl+0xCip>XhG^j-l!57&b)) z!;*LmtB%F6*5erV(i+2li!i*u1jF6NVfg7K7@kdeOYNU1Lxu8m#?HowWt81{CL1F% z==y*D93$0+Vx)r@BUhGDz7A!p+||O!=Trl#r!mUD7^9Z$z^GG{t#WG{Mm-O}Xq~kf z?P`G0(N8eOOq=TAC&tEhEOaa+He%rjg_Top5jbIWq#WS~YSn%NPD^DG&5(vMiQ(DkX^LHcU< z;?EX)>}sMO5lg*dYdw)0@Pa7sKR~o)E)v81x5V`OeIjCuiFo51B8pl=%+1abW49=x zU(-so?G=c+ZW2-cw3R3sZz76UW>MaPl&B1%EZ4n>MB{5a(VjYj=vo#Ny+v_EuZ0l3 z#CW1h`8qmD*+iRhCYpt%L}Sl&qP|~|sJ#j&6xH>g9xhYvru+r!4;+Ss>tcxE49alL zz|b*6G4xFkttCG&Z0A-C+x`^8Jnv%I>6sXIoAQ-j5ezpwjp5GJ8}@5ZhG!S$xl)cw z57mW;a$TKAV#L957;%%{Z+M82iW;;Y&^oX>kMe#EFtXSmBfpzt)KFE7TD}OQf}Ua2 z!{wCun~2d1oGF`aD#lp(P(3`u*q~Uv;yVYgWpv@qIeD0(I~#A6C}WmkBJv*(V^ROT zSbEL~tHqQ}@$fjdhR?(H6T`9dqCI}T|Ay8JmdLv0Q?}G9qHK~))XkEJ_Nc`~e{nT2 z3VKex`7yCXKVo(B6S1MS#r9?&V(&1IjH}EclGVLr{O43MW%Etqlvzdfuz}2}ETaD4 zNZbx35O-f);(k7uxDWeH+&m1(Jk3Bdr*|@Oel(3t|5HaMyjV*d`WBF({-(q{z>jEE zl~EoVi{E?w@RJdPpEN@8>rVqByMHuMYJN<#D1XIp(kWu%x7EY7)#Hio87~TI1 zM$e*t;PoA&<4Q1^eoh*rp^7o?nHW>C1!G4fVw`g{#*>41{lE-NG|R!1<_mb+m(~kj z2ZcZp7Uhk@vLWxWI{OJWtX_yuhb+Sm4S#&E{|&!PjK*K#@g9-yiwm)>$tU(6hGg8=Fe34zoIT?v%1}8_db3~uETG8n~3Zk`m^XfM8!ZX zO&o}L$zft%{*@Rvs}KXT`IIhiNz~p@p6@lvaV<$BimNvgCD#a|GJXg3e>2ex6j@k9)FRHK}4s)gZwDRXTBhVP(R;l>jTe?jx1 zel$jmKZOw+t1;rz2#m-*h!LHyG14>^BWF-O94NxbL;)kIzelNtU=%xy@_ltMD!LS- zY5}7aZ(%g3Qa#Yzklsw$TaFk*f-oj*FUFe9$Jk?!FfK$5<9+_(^_)YPxKtNYb^Y*m zwgqPWxQjx~Uc9G}jb%G_;v?DD*pOn1Pd&4-W1$YdU#^Z{{I=n*7o|itopKFNjVH>x zDv0{7mqh#2aH5~;NsQho67x|sKb*5BRzC(4n;m|{wkL+z`$iK7!&)Lq9z!NLej!tC zuOv>tXA|ef7UF8)LFPG%h+FXz;$Ept+*=Ka`{8!tcAIjaR}Lbsa}{*V#a1om^-pd`+}&E+dBA5Ml;r zh=}KirSc~twof7E-V2GbM-tKBy_;xlGb3v9(}EGPUCqE4D+Xa#?zKGS8l_w${iTq zcM*oeFbv&J8Y`21_kJ2UD(_4uCu2aM)br&)Fok=VgJ|b4dQ-}>&O>B!@h`qanjO(04B)}H}!`mGH;wcaUH5cT;#im z6HF!(8J;*?tRll!ejyeYb%^#I%JB^Sj6c$v@KcZ-esW!m-&TwyvXs-Q?3_rn4dh8b z(JW#XEFt1PH;E;)kBFTUi1}%b7_XZ}^w0JoS_v^kZHpXHcE3&(le;L(o$}gFy{Fu7 zZJH}K5zVYZqGRGlbbIuPzVTP0fAlKRA90lEx%{F%#|@$#=1R0iITB6zvqWR4CQ&cG zNYr22{!b54KW#9w^Cd=jaTsRx0Yjgj#xT{*l=U8l;p^z_KJ|i5Lkxe982+srBQ#Se zt5u2i50vqJ;}}LXXJMrBB8;@B^IchcMo`1(XIU82?-<6+PQaLRl*d+Gg0Z68l+mb+af%Nx?x-GRe!s=5 zeu^>Ia{J#kwNr7&m_h+2Z*`n0b*G>oeUZ)OKg(kh@IUIV$WL> z2bVuY@{;xl+pEZw*Y;$FZ6$G0^Czy;Ey=vidx_ik)5QJnIx=77330z(McnEe$h;#Z z#C82?;zF~l)6!rvahfr4@OB}?Om|a%XeL@89uft5E!p?cIry3N$}nevRR&4OBDlFucVE!@DamLh&m`h;uN4nTrwgB~&-FFyh=| znk#o=#QkQBcu9LrIbV#l_>GbHlxm1(jUz1>8B3pkK(*OL^Ti;VIW|)b)jMG{Dr1bB zKgPMp;?)c9@dkSplb&3}^uW=0=iw5R=E!2fr@L6PZW>nomczQ_3;1N;bbPt$J-*v9 z0=us-#Gifl5t#=!D8Dq1C|%McY9UXER(c}Qdvb^vnG7ao8`lzXNgS~n+eLxj~!bfPjQlc;&95sif5MC;CWqT@P{=+3htx@kT{ck6JXbKRS0AEOz? zE|X}qG!gaGPNG)wmZ(Xl5;cVn|I@?8tOUGdvOqSR)1}g<(#wVho_)r`_g*sIx06i%`+_)4q4R8ILFTysC39&8aqH_r z+ns-FWMnvcto}}-Dcckx|8lvRxLsUjFL~VF6QU6Ud!m3uHHE}P|I%`9; zCQKok2fT>J0w1C->p)av{t}g?KsmtHL@8(}QPT4KpB{qk-ePcRJBICb!?3(x7@q!^ z?m66|^S73=TV*lq3f*^XJb>Xt*J1dazZkyzFos_|j^Xrk%t3>%I!3EayFZ_56FMb z#Uk^|SbFjtR;$Hfeaa+k-8=-_r;o%=CkcMubrydX>k?T@$~64Cjwn4FP1ITgh}Nh6 zM4#4bqgm?2EXbOOKVBnN3s#UJRSdCpjU%I;(f-2o5|OBUB;&(F$rQuu#A)3^;=I6< z%n5WRa|>4!wBphL?oW?Pg4pOFS>vN{!#ssGF?lq?3 ziaS%5)6G=4vCMap1c&07*9`k1EW9FUPQKr)&oauf&o$3B0$9yYKV}8{QVt(KL z!^&Qt#md&uvm6hMVf*SGWEDqWVO7qhvnt(Ltj3F9tX8=;tDBO__8U8fHC&*>nw?n8 zDs^fzS#f8WSf}Mo?6?igEkT{BTQ!}P?|H`dZ*XEKu5D)5Dn4R;OHNWYLKK^DJ&H}~ z)L~P`Z(y?zb+P%S`D}VeCVR1QEbBg`gsF4h@9@{Ng}X7uQL4RQoODE7yL9N!3aOex z5tmZmHz#R~J|i+QW{PepuzfvbS(8F3Yxq=~?Q49IDOow0Iq=lkvFd$ucJo2Q96@UX zrz?9i=gq*>ob+Y=vnM)tI7%LUbZqun$mqoCGnOd}8EaWnM(Nm7Myq?M<6GR|_}%B- z|MbxBA~3-@Ud*F0LmA=sNG8xUoLLpLhyfD~#>oMgrTK3dualFQ!>7ubqmw(C{l3?k zJ!>49-TqSiWKAe@_~8`hsKF!VXzdQ>$j@tx&-4Vw zduuA=eVQ^S^pNqMI)piP$%pBj)$pkvoG7;;f%uNTD2^rLnIsPM#*`vxZYjmucjZZq6oim;@dmoiDzW0YP z-rj-C@i3P0Q6I}3m8@ruHWxCxhqW^MQ|>amjBJ?gR_@HM_GV^dk(k+*(}&q~w}#o! zB4xIOZ(!D$dNEsv$}=05Tw=DIJHzY{)R=7<)0o5k`!a`Re3=t_^qJG13CvlKR3@Tk zGLw2@40HF#IVP+27?Zx@8I$t2hq<}_8gpambmrPu115Mw5wj`r1!Kq)#^d5GR(4}6 z%XY=GQ&=ySG3>{hQ9j?(lS$0c&m$e<>r-;(REOpCF8i7D+enh#BkIG*7@T5Kc5h)d zDplACEB)9tb{|wmsv}(z=|)vVvWXUvVA8 z)Qg>+7r{Ds6taV_oM6?TiCLxX3s_~3a8@_=0c&(;BWs@2!W45;4z`>kOBSK zA$u3HLw3lrHubky8?hp5ll_z(dNQB2VNbC`o$t}-#;`+T)LH8f7t5ZT!(!KHcB0`6c5+%U zJN58+c3Q_>cDnm>c6!N6)@fk|JN?dG*6F1O>$LAFJ3}#zoskLbj6$BB>3@oy`P7k} z6;R2}dcT%+ei+8OJi5frzWJ1$%RXS;JT9>d_3GJWqHXNTuchp|wFd0w15eou%P|D2Ux>RLdToKaM?C(!!pb|C^02PiM1a{n+Zk-E3XQZT7C#ch)aMpIy`x z!&+&}Gxb^hnS~=hj(g5AoYt|eoOjL*?%2R9oMTRJw%U#-%&P1R=Ev_Kme^FXyG7U8 zvs-_&ezH~U5jPojMvn}uJ#Hj(ZACDnCa>WTZMrr)>)|#>S^J5M((onB1^u;5vsDSJ zeL0owU%h~}TlW_3+cCXnfikj?wG!j4@Z?#ym#a$~oz8N%*7_mkc8S%KaA z^C5enzLGtpn8hA!3}z2cOkfZ7w_p!z4qy+p+OdZO5qm`Rg+09S6MLj-EPHhP2llAi z8`gV-5qmVJAM3rfh4n7o!g^od#rmAM%lddmv%YcH*<<&e*^_dm?CFI~>{+F^Y=CJ8 zdqG{9y%aT$4engchJ1-;!?aehAu37ir5TUefR_sF$<>qCv(KKeaoaoD%p*B$!fSc< z>^&XU<#`3uTPiTC6q>VTTIxB)O(C5ABFvdMz=p91TEe%80Tg47}xk`%$`SsnB;=<%uD+jtOj$H?LY7^ zYrEnlYj1v%9kk;wYmq&LRdkMHK7H88R4b@3xhLEi3QYRHddRuBxt060R8eZM-(1SX zEtL+pOwkebb$A~j#PPimSyUTQizPilPrnbc_MbZNf@ zO;UsEQBs2?-=%t4-=unSHBz16eNyc$_oSLXTcjGb{iW(QIZ`!QTdB$jR;p~DBJG=9 zA?<7FB9)IAC6z6|DwUOcNEr;e+>g4MTu+{e`&jS6bv-fV-f84S*EdzgX z)z-7QvIEUr>A{0s(KK7`-hf#gSG$PID);2>+=}ATat?9nR$*LXzct(qhdH05GKQn@%eLoWLLelFZgo{Ln!#9eNE%U#~I zo4fE@mpi-fFLx%hlJh>I&+T{6;Wp^r=iL8(=4Kxr$W2=Az)kuU&W%m7<7~c-o__m zk2B4&w5l&=Y{j; z3@^@$`&#Ghz1Ow&y3bs&rHpVI^~@fq_a2!Pgv3&!!>f2kKZpNe)`XU;S)+5(Zs_W{ zE_D6qSCo(_KsSz>{4XAaS;^OV9g$0XPpvLr-m;LF`~8_>Q3I756-#x@oksyPMCDhu zQ&ImOQ_0oUREE<-s;K1#Rbm)KmCAmg%A5SCl0yzu`Rqih(rgZOUqXs{cwi${yWWzj zU#Cgc@5`r}3N@)$M4D;~E}^uyqX`84YyGB5gYV$X1$=WcpEE6#ar)L$}^)qI(9b z=z#|X^k3zZj95_&BUOBe8GG{}BVY85QE*FUlw5-t<)42UwdJ+Uq_k6vx?3MJZSX6j z>7B{wnEzsQb@woOXLA{YGk+OFy>pDQ!vto|f&Z9!-6t5+%O%YG4K2)qreelyu?j;Q zUS<|0r83JzYnW9}0vOw0`BaCsg%hGa6hfibb@vvE;;e=-0At^nHOl>aveU?OB2UiwDGy zGeke5mC?;-PtoSSCzOQKRqAcjYkEl?P0RdnpgLrJQ#&&S)E3f4*~-7Ag4^P$2(?Hm zc25;`mCB?12b8H}@fOssm_*8cLkYDany6` z<1B)T=2@JR9IzPUKgay%^TZ;PofnJpp1KP~93~1ki?|8bsOk%gQgwxestrOCoXIP; z4hX}2tcv495-7RMQ0lVqB$eitK|R>%Llut4R7qnwRlZD(dXn{+YT0N(y{dUny|s~| zo_L?29t_z~|a2| zd%va(1cQ9bnabV+jR<`(<+NJYJZ?8Yi%rAat>SV1AJNg7JfLMA(E?45fw2P zq9FeX_xw`Caq}9m^x9*z+!`H5pK@eQG;L$fSx#nFrFhU~@*9yu`CGhg*J@1EcjF() z?PSbwIFXS#fT%>qR!%)-aVg#7-dA zkq5}^>6JvM`Z3YIXGLa8w-dcahUmv!A~W52qHDFEOdl6Qw4x-5X09dCc+*NW48D?S zM*qlEt8$`l5<{lUGa{26OUNWg1)>%aNmPrwiAv)bqB6dfOf-)n%1(!g(zP-&p)r(9 zkp4*&%_k9spgUxIfiD?HBFH!o86sC)NaSumCS$!biL?$+B%)^%@#!r@yzUDTznw@V zyE=%Z<_sb+Y)&NP=M!-cc_N;dPQ)ubh(zcIBDq4ING47rQXzMU)R|vIs;Zqxi#;Gx zVY`Ub(DIRIB}6JFm`H_35h<;Tk^6&0vgI9-5>X(M;7BA_rV~lG$wZ<`oJjQkArfVu zh{Sy@A{jDBB6wub~Wa*8dC zgX>x5pqK??H|`)KH`qaM@?42#F29OJ2Nq!~vtfLwS%^=sBKX*sa_rD!hXteq>rF7m z8daA6Hy)NxRwCQj%H z!#A$9;Oiw3INr1d$9ZkQF=Z3*wHFs~v}QDpn%aiLf9%8Iv>6V4&*3X^HTd#ocN`M= z1_vBJi_djW#)pdX@u9s%*#Ckx4mRQOmGB50+Et9Nf&vbM1;PluZElg?ONw;~JI zH1*(nuOsoj?q~Sn!R5H+^fx@bzLHFuxQUon)DkPN!(?IE3u5fFfG8b%j+?|@;3K!M z^FNz5GgEb9nCK53%>DVZm!{{+e;C}>)Paf+3e|c;C_f0oGsGml& zxxtK%!aqiSfgP=9I~JMAZ9@622`DFW8*)2R!w=~f^8t(B@_QQY@fl|G_|5<;Bvq)4 zr1Qo3;m;C$m&O_Xsh<;n-#?Wv(=+FVNi}@_${;@7l;gvTj`C-9t@*Vc=Xs@PJ;Ey0 z{^I8oS}g=Uew1kTE^3?Cb}GebHdR0QBQ4^5hnD}>Pb*FtrXJ%>6#mxB-+ulOOGa?m zxA7{@yI+qRf2<+Wg(+lquqxT~c0BO`YZ9KWO;TH`NPfjkQkim>G|X!v-7^sR-7g9< zYvVw9?h(*ZZUdvv7GTS0Smn76wozx`NQW%=F3E!nDhx#Kv4%uV2gq9c4hk!ypxh-L z9@T$>MxR&k)^;;=?FfJl_8>I)uY)4-MsQvdL+YI)@S|zdnA_|2vAdjpv-ugRoP?Mb z$GZRJ&Qk^)IrUv2BB&PVh>sOm-diGAcjum9MPGqHzbKFEX&cL}zgS0fF^02sp76k~ zANm#;La)(8sQz#m!i$733s(|KT$2s3T+M0x1a6n64R>yg4Cjlda63CBxEZt_Tk!NN zvuw&mvRCacX*N&;*^hCclvf1OZi`7{UO&0AR}>GmThR3zzp+#NPOzSeZEWNcc{W;O z6YC!p#9Ed4Gj9Z^=%?RH$7u*=lDP$;TJh4TwekQ=`D1Z%m3R@Rfz~Rac z@JW~iA)CS>;=)BpnC}Xi%Uhrz&l$?BFG6kpWO#XeFSLa`A91MMfKDxCXf(YKLbXHS zerGJ{-TReH7mnl#Z1=H--+1==2P5`tDa)A}?BLE74RFHbhuo0#8-b3Elfe3TyV61K2$dx|y%gd(j)}GUVa<6=|@1w{^rJ^_?~Q zIG_Jl_Hf+ynHkwmn1CbTGVwnch^rxM^@$nb2Gk=9UWbX*i z=B6=}V-hpJY#Qyoc{^IBGotp?4n-|`1}LGq5t%&S$Jf|p@L6*8eCHb$sX#h1O8t%I z&AE&87d}N(o*qStX#+^^aSxLHvIWWYeMNH5w;|aZ0wlA^8%eUYNK{3e|LdF24~`T| zd=AOxKi*u)cXqGk-+s2|TTX`Z&DX^ER#Pdy*P#=MXuU_8LliQ#MJRGX6IR`qihW{N z;JmfD`03l9M8dy_81MN^wifgg|0UuiS~`o|3^+szo2|)x3up4eBbD@6YLGu89u%3} zK~O#x0a}J%z^FL_SZ_^OCBFf-M$dpFV=5h8c1-M0hz9yP|$P+%G^q! zwo?yY=9)v>6L07`V+ozdMw|(2%c1yF1h@$l$h$5TqIdeq*ucbw?pG?HK zxwBh2U#$VIXkP^P`_B}C_JmCWOXo|1^`Dmu)|841OhP6KM7R z45Ktg1L^Mc;v+33`M}|~{Bs*yq$)dz<^)xvd0!Tz83&&umGnU*yUQC%`OQR9EB%o4 zsgbedwkncrv_oRAMEIdeANj#UM*Ki(3;#i8BH#Ui=i5Ub@vXfY{OfN#-=rJNzuI<^ ze_a*B_uTd2f4h1j)w8pZj?WtuI4Kz`OxcD#gq}EioB@8gIFg7NN)V&38Dy)+ed4bb zPok>llk|TdNTJ3Wa*w`G8g@mIZtdsfH+~5+bCN-6@Hc1{KL(?NH-H@z2Q~@WuvOy< z9FA84pY!`6gmZ@oR|80x{2MZj$3sEv1t>E%g4*O>*OtWpG-Fup{ouRu(SLV*tjFF*#1moZf<}#=W80v6|YL>{uvqwbk^Gn7Ow)q zrbX$3weKDYOx8;XL^jUm{B&yR{br7^C2|aulnUX4*H-x4hv9|)GDv$}2kXZDASuby zS&f4$IE9mh+wOdd3(OMbLOv4CbFC!D$*yKwdS5e-D^iH zLHY;wk)+sqq8xaiz83bL)tb77^_xPm*M0KX8|7Qs;EN^fl70V}s#;Zgtn@UJX@87x zdnk1L(h25J&LhTs@*sWsM>DFBlErh$39LWG9t}t%bm^`!GIvo!^KK=hJ;gofqPPNz zy_=8XG@qb|aY^XH&T16U5rF)DIU)b}lPI9V0|hE%pnzSIksnS(zGZFb>`*@PN=rbV zdGC?O?i6%f&mFm5UW*QQDjv+ zkAg=DJT#uX2XC{+L$|9Cx;(m|Y25$_%YVYLCF@AL?I)t!97g9YR%K`A`mxt4o!O7U zXE@_|r@6D9XSjmC8{Dtg76NVQmvUw-GN(qN7!Cct7wVD*fZ(*eed%1B%pSYbyIb2ZRIPOxXGk12OK4)1k z&bD*Yn0hB=vN11-blo2Ywfbbxv3~?=5#{82^T@nPvVtgO$j~*HUb1>m4cPNj$Fqsn z25iDh%mzKqWfz4`W{Q=~c|Wym5_F}Ss3feX^}@}WYmQ;e)wXx^gE0;0yqO19JGBr` zc>EoeUKU53_jJB+Q8-U(U!sZj46?QRfn56bp+h2iXlq9oviT^5EXxsE7_=N&?YNGX z;4rkTEE+AFXoMEmEJjw=AJM|}qlo)eh1l3xh$-|(w5}tf>c%09Mf;G2%4|gKE=0_D zcVw+@f^4Vr$c1@>Jike!T*?&d&~tEr{eQRs&BxCUkK_hA9Lb#fePp}MZxT=`L9Vqu zCbyjYNO7nnsq%LxFAtw0J)ITg?>0A(8B_q}nq{CBcMpvBk2FxxJOQh!H^MeYTR76L z4Zem;A*3qxFH-5ORyB6!U3)fmsUh1Rbby;%dzSM(Xv-BZ5aa&ljO?TCuM#X)&Jk?t z5*OHQ&lAi~JRlIOy1<>+8f2y#NPwf-L@4cg4gDR#@S|ZCv_tE z;)ggD=;oXY%ehOLlHAn?ecU;zD$c62i)}rl$z-r?WQbS=fq@L?Lv#_HnRBrAACm` z&1kOP&ctl^xlAC$C$kDER+ewgp%ho|mB#|{!K zAL4;e`q|^0VmJJ7K%R(hwI#E21Z4Bh@x(7kibQcUNP1x}DX3^Cm4%+5s4$2)+B7m=h(hLkStv;Q z24z--Po!AUQ4I)Z=z{ArJ*|<$} z*#0YPxw+$tIG?V^T+zmI?$3=Tfp(w2z$)KTu+c*xShui2V4A!~Ae#S_3)t2>Qd1%i zTe5wWg|G$l#n!OJJx*FFsFWcHFtPU9Czt<6?f&s2hMwD zD@S{dXY1y#Vcfj6iPy)K8{FvT(yrqA94%E>24Z%zn_uH1uvmo_p6ZVjwS{eCuB zPK{02vX+g1l*sy5_pug-Bbdw+>(O*;2XYHvC)S;c==b0bM!!;(Sza(i>wI5_?*C%3 z(O*k!n0NzADbGV#5QVN9oJUvED3mhC6AASmpvve~s4|lv5-5TSm=R}INGQr4Qb5_S zrlK5;k#mh3$_n;Hx6X*5n@b{4+RR>*a&!|)dZLUHFSw%wlT>v5>q->=avO?YnS|n= zr=aVHx>2Ib9h9E63l$9NqEe$$^z%UvUUK#;jz|&1XD zwR95qY&*&Js3z#L1$p2ylf2TMLO%FDBSY;UVXW~ms7SSe_RGI8=Tmv#{=3(r|mwXFZY|y%(Z6qi_Wp}mOI!l8c#WsqYt=qc7dEwN0j?_^u0hwk`q`D zX9+eP_Z6%QEE1Sbm>>{2wS)70oJz5W6Jh%Y6)2Z;hkgqTgT~3w+?WfuqIAJ7Oq#?@ zl4VzRT)7L!vbbYAzj7v8J#3}aNoL2x`^5E!5$U=80+hp-fqIS( zj6dg3I?k>lQG5gu_p7Jd17cXMXO8Sy`4To-+>(t}T+5#G_{lOe?=a-e49e@d3~}CW zN*0v)VE>*zBrV!S2XwF&Iu{htLE$U(Q!WaNo9LsDlX6C!?e|gWW*g-DV-X6b9-_z= zIh4?)f|6ynqZ_C1qH8XPQMhXf3eE6ES3b0&D=n_*N{K4Ee9Hk{nl=kv(Aa>2P5z+s zE>Yf65=1&5fy9Z+AZwli6sDYl z^5stO=!pU}@=EabUng`o4ntQ<4m1@@fH3AbxZZLgt;4^Frr;@Eaq1bXSF)FlaaLhJ zNh@-5)rvUZgo5YD#86)NntTs%H~N-_NX@^&mH8zY4eYg(i3A)(6gOnKtKea|<`^ zNFJN%hZsExC9?J2a`Gg}93&2lfUIpd8P@raJZz02=asDSKzGW>I^i@cf2NJyHSm}X zk~C$5%l5EtigB#Tn{&*AL_a#mlhc^S?1!#n+C92_@PbihUCHEVvlD-h7{H zlKJvVHM8aS&lU~d94t0kXk6?(?Mm@H<+Vi*=X@%9_Uunl?2%=K=+nodq9C2Z;j6a_ zub$$H;vlAY{K;v>*KNKDmru+QKKq@?+jjQxMS0oCGF}4pk2S{*?*uq{MF1{#UWk7O zs*RM=d6BKsnZ#e>D2W{CCTRzrk-IgsNcq83Qg5O{+Mj!nAA7?=DzE`2Z1DgMohUGT z_ZR4(U9fW67ucNc35TXWhO-gBA=sCN@O)>uu}cqbdB#J2Z!(kyO@P`l!SLdZGPKF5 zLuc`K=`;8iTR#Cws(j-5n>X=N0rh_fc8acqLZYxbL>0XJXf9_PP(6Gy^^ z1Y+Ao1bVkO3zjt<5^Tat1-24{0)wFyT+gis+*;cMWcr%#aB`j!l&v>~Hyga5Y2sce zI_C)iauYz+VJ}geeuMSa-M}fX_U2aH`N!=yGvf9-e&d$T?BymTHnPbxM{0H^d?r-j zFe$QYCLb!kk>9!zq+8aS@ZNI7>ysz$KbB9A$vw>Uot(ukeRYg=|LDM;DMakv^mulj zk|Oi=LNv3`@B}M%rIm1q;8a6qCM=l(fihfQE`ELEzSfj zGT$m8OR2jwP_Ch~DE|c)sm-g0DE&tZs4=>P8Xu5EsZEfew0m|@x=SBW>I&7AeCm2? zoaIGIY8|3vw@FgUuOCzDRjHI_zBgr|-$ijc7pe9Ay3|p@Dk>m-G8LM$kjmKOO5HvY zKo!c&q5fM~MxEC=Y7yA=9nJkrVbL57>^R{)KA*T8SD*SwCQ1D!D}?XKNna6i8C@qg zIy_0v`4Jy3lDj8=6)xh2p}Qa3W+L z>8nvAc5f%6*!@#jX_K4mh2m`Xoz7Nnma`q_T|Uy2wCXnZZ)T1_r_f!nSlvai{zI?8 z28slR$GW+J{dJtn-3mNgcRV=SjfMP;6f~?D1J6WfLcz!yG~mls(6I0#%Zqojg0*Wn z(K+uqMq&ZCg)Zc_UwgwXRd?akq=MOe{yS5>HIs}@+Dno$FljbkPx?>Dl6TcP1UrWi z{}I=$Y)CkAsFY{QP&7NgZ9RKnK#V;Vq{<$cRL(LlR9Uf*lT28<-v7&6k7n{m35*gL yB``{0l)xx~Q39g`MhT1(7$q=DV3fcpfl&gZ1V#yr5*Q^gN??@0{~rWY?))G4sIJKX literal 0 HcmV?d00001 diff --git a/tests/io_test.py b/tests/io_test.py index 75ac5af..41605cb 100644 --- a/tests/io_test.py +++ b/tests/io_test.py @@ -1,5 +1,6 @@ import numpy as np import pandas as pd +from pathlib import Path import pytest import xarray as xr from scipy.spatial import Delaunay @@ -55,6 +56,11 @@ def equals_dataset_vs_netcdf_export(ds, nc_out): return ds_nc.equals(ds) +def equals_two_binary_files(slf_in, slf_out): + with open(slf_in, "rb") as in_slf1, open(slf_out, "rb") as in_slf2: + return in_slf1.read() == in_slf2.read() + + @TIDAL_FLATS def test_open_dataset(slf_in): with xr.open_dataset(slf_in, engine="selafin") as ds: @@ -104,9 +110,7 @@ def test_to_selafin(tmp_path, slf_in): with xr.open_dataset(slf_out, engine="selafin") as ds_slf2: assert ds_slf2.equals(ds_slf) - # Compare binary files - with open(slf_in, "rb") as in_slf1, open(slf_out, "rb") as in_slf2: - assert in_slf1.read() == in_slf2.read() + assert equals_two_binary_files(slf_in, slf_out) @TIDAL_FLATS @@ -121,9 +125,7 @@ def test_to_selafin_eager_mode(tmp_path, slf_in): with xr.open_dataset(slf_out, engine="selafin") as ds_slf2: assert ds_slf2.equals(ds_slf) - # Compare binary files - with open(slf_in, "rb") as in_slf1, open(slf_out, "rb") as in_slf2: - assert in_slf1.read() == in_slf2.read() + assert equals_two_binary_files(slf_in, slf_out) @TIDAL_FLATS @@ -227,3 +229,23 @@ def test_eager_vs_lazy(slf_in): z_levels_lazy = ds_lazy.Z.isel(time=0).drop_vars("time") dz_lazy = z_levels_lazy.diff(dim="plan") xr.testing.assert_allclose(dz_eager, dz_lazy, rtol=1e-3) + + +@BUMP +def test_get_dataset_as_2d(tmp_path, slf_in): + with xr.load_dataset(slf_in, engine="selafin") as ds: + # Top layer + FILENAME = "r3d_bump_extracted_bottom_layer.slf" + ref_path = Path('tests') / 'data' / FILENAME + out_path = tmp_path / FILENAME + ds_bottom_layer = ds.selafin.get_dataset_as_2d(plan=0) + ds_bottom_layer.selafin.write(out_path) + assert equals_two_binary_files(ref_path, out_path) + + # Bottom layer + FILENAME = "r3d_bump_extracted_top_layer.slf" + ref_path = Path('tests') / 'data' / FILENAME + out_path = tmp_path / FILENAME + ds_top_layer = ds.selafin.get_dataset_as_2d(plan=4) + ds_top_layer.selafin.write(out_path) + assert equals_two_binary_files(ref_path, out_path) diff --git a/xarray_selafin/xarray_backend.py b/xarray_selafin/xarray_backend.py index 52eeeb8..a1fc2ee 100644 --- a/xarray_selafin/xarray_backend.py +++ b/xarray_selafin/xarray_backend.py @@ -254,6 +254,25 @@ def __init__(self, xarray_obj): self._ds = xarray_obj self._header = None + def get_dataset_as_2d(self, plan): + """Generate a copy of the current DataSet in a 2D format""" + # Check input DataSet + if "plan" not in self._ds.dims: + raise RuntimeError("get_dataset_as_2d requires a 3D DataSet") + assert 0 <= plan <= self._ds.sizes.get("plan") - 1 + + # Generate a shallow copy + ds_out = self._ds.copy(deep=False).isel(plan=plan) + + nb_nodes_2d = self._ds.sizes.get("node") + + # Remove or adapt some attributes (if present) + if "ipobo" in self._ds.attrs: + ds_out.attrs["ipobo"] = self._ds.attrs["ipobo"][:nb_nodes_2d] + ds_out.attrs.pop("ikle3", None) + + return ds_out + def _build_header(self): ds = self._ds @@ -371,7 +390,7 @@ def _write_all(self, filepath): values = np.empty(shape, dtype=header.np_float_type) for time_index, time in enumerate(time_serie): for var_index, var in enumerate(header.var_IDs): - if header.nb_frames == 1: + if header.nb_frames in (0, 1): array = self._ds[var].values else: array = self._ds.isel(time=time_index)[var].values From 99c629ec731a233bb625c0b0a5304bd72742aed7 Mon Sep 17 00:00:00 2001 From: Luc DURON Date: Thu, 16 Oct 2025 11:57:35 +0200 Subject: [PATCH 12/12] Add/correct some comment lines --- README.md | 6 ++++++ tests/io_test.py | 4 ++-- xarray_selafin/xarray_backend.py | 4 +++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 27dcf14..35d6410 100644 --- a/README.md +++ b/README.md @@ -74,6 +74,12 @@ ds = ds.assign(UTIMES100=lambda x: x.U * 100) # Add a new variable ds.drop_vars(["W"]) # Remove variable `VELOCITY W` ``` +## Extracting a specific layer from a 3D DataSet + +```python +ds_bottom = ds.selafin.get_dataset_as_2d(plan=0) # bottom layer +``` + ## Write Selafin ```python diff --git a/tests/io_test.py b/tests/io_test.py index 41605cb..8b5f67e 100644 --- a/tests/io_test.py +++ b/tests/io_test.py @@ -234,7 +234,7 @@ def test_eager_vs_lazy(slf_in): @BUMP def test_get_dataset_as_2d(tmp_path, slf_in): with xr.load_dataset(slf_in, engine="selafin") as ds: - # Top layer + # Bottom layer FILENAME = "r3d_bump_extracted_bottom_layer.slf" ref_path = Path('tests') / 'data' / FILENAME out_path = tmp_path / FILENAME @@ -242,7 +242,7 @@ def test_get_dataset_as_2d(tmp_path, slf_in): ds_bottom_layer.selafin.write(out_path) assert equals_two_binary_files(ref_path, out_path) - # Bottom layer + # Top layer FILENAME = "r3d_bump_extracted_top_layer.slf" ref_path = Path('tests') / 'data' / FILENAME out_path = tmp_path / FILENAME diff --git a/xarray_selafin/xarray_backend.py b/xarray_selafin/xarray_backend.py index a1fc2ee..d669014 100644 --- a/xarray_selafin/xarray_backend.py +++ b/xarray_selafin/xarray_backend.py @@ -274,6 +274,7 @@ def get_dataset_as_2d(self, plan): return ds_out def _build_header(self): + """Build a SerafinHeader corresponding to DataSet""" ds = self._ds # Title @@ -372,6 +373,7 @@ def _build_header(self): self._header = header def _write_all(self, filepath): + """Writes header and all data frames into output file""" header = self._header with Serafin.Write(filepath, header.language, overwrite=True) as resout: @@ -409,7 +411,7 @@ def write(self, filepath, **kwargs): """ Write data from an Xarray dataset to a SELAFIN file. Parameters: - - filename: String with the path to the output SELAFIN file. + - filepath: String with the path to the output SELAFIN file. """ self._build_header() self._write_all(filepath)