diff --git a/poetry.lock b/poetry.lock index aa7592e..c90ce3c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -11,6 +11,147 @@ files = [ {file = "alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65"}, ] +[[package]] +name = "annotated-types" +version = "0.7.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +files = [ + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, +] + +[[package]] +name = "anyio" +version = "4.12.1" +description = "High-level concurrency and networking framework on top of asyncio or Trio" +optional = false +python-versions = ">=3.9" +files = [ + {file = "anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c"}, + {file = "anyio-4.12.1.tar.gz", hash = "sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703"}, +] + +[package.dependencies] +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} +idna = ">=2.8" +typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} + +[package.extras] +trio = ["trio (>=0.31.0)", "trio (>=0.32.0)"] + +[[package]] +name = "appnope" +version = "0.1.4" +description = "Disable App Nap on macOS >= 10.9" +optional = false +python-versions = ">=3.6" +files = [ + {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, + {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, +] + +[[package]] +name = "argon2-cffi" +version = "25.1.0" +description = "Argon2 for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "argon2_cffi-25.1.0-py3-none-any.whl", hash = "sha256:fdc8b074db390fccb6eb4a3604ae7231f219aa669a2652e0f20e16ba513d5741"}, + {file = "argon2_cffi-25.1.0.tar.gz", hash = "sha256:694ae5cc8a42f4c4e2bf2ca0e64e51e23a040c6a517a85074683d3959e1346c1"}, +] + +[package.dependencies] +argon2-cffi-bindings = "*" + +[[package]] +name = "argon2-cffi-bindings" +version = "25.1.0" +description = "Low-level CFFI bindings for Argon2" +optional = false +python-versions = ">=3.9" +files = [ + {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:3d3f05610594151994ca9ccb3c771115bdb4daef161976a266f0dd8aa9996b8f"}, + {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8b8efee945193e667a396cbc7b4fb7d357297d6234d30a489905d96caabde56b"}, + {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3c6702abc36bf3ccba3f802b799505def420a1b7039862014a65db3205967f5a"}, + {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a1c70058c6ab1e352304ac7e3b52554daadacd8d453c1752e547c76e9c99ac44"}, + {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e2fd3bfbff3c5d74fef31a722f729bf93500910db650c925c2d6ef879a7e51cb"}, + {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c4f9665de60b1b0e99bcd6be4f17d90339698ce954cfd8d9cf4f91c995165a92"}, + {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ba92837e4a9aa6a508c8d2d7883ed5a8f6c308c89a4790e1e447a220deb79a85"}, + {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-win32.whl", hash = "sha256:84a461d4d84ae1295871329b346a97f68eade8c53b6ed9a7ca2d7467f3c8ff6f"}, + {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b55aec3565b65f56455eebc9b9f34130440404f27fe21c3b375bf1ea4d8fbae6"}, + {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:87c33a52407e4c41f3b70a9c2d3f6056d88b10dad7695be708c5021673f55623"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:aecba1723ae35330a008418a91ea6cfcedf6d31e5fbaa056a166462ff066d500"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2630b6240b495dfab90aebe159ff784d08ea999aa4b0d17efa734055a07d2f44"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:7aef0c91e2c0fbca6fc68e7555aa60ef7008a739cbe045541e438373bc54d2b0"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e021e87faa76ae0d413b619fe2b65ab9a037f24c60a1e6cc43457ae20de6dc6"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d3e924cfc503018a714f94a49a149fdc0b644eaead5d1f089330399134fa028a"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c87b72589133f0346a1cb8d5ecca4b933e3c9b64656c9d175270a000e73b288d"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1db89609c06afa1a214a69a462ea741cf735b29a57530478c06eb81dd403de99"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-win32.whl", hash = "sha256:473bcb5f82924b1becbb637b63303ec8d10e84c8d241119419897a26116515d2"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-win_amd64.whl", hash = "sha256:a98cd7d17e9f7ce244c0803cad3c23a7d379c301ba618a5fa76a67d116618b98"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-win_arm64.whl", hash = "sha256:b0fdbcf513833809c882823f98dc2f931cf659d9a1429616ac3adebb49f5db94"}, + {file = "argon2_cffi_bindings-25.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6dca33a9859abf613e22733131fc9194091c1fa7cb3e131c143056b4856aa47e"}, + {file = "argon2_cffi_bindings-25.1.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:21378b40e1b8d1655dd5310c84a40fc19a9aa5e6366e835ceb8576bf0fea716d"}, + {file = "argon2_cffi_bindings-25.1.0-pp310-pypy310_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d588dec224e2a83edbdc785a5e6f3c6cd736f46bfd4b441bbb5aa1f5085e584"}, + {file = "argon2_cffi_bindings-25.1.0-pp310-pypy310_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5acb4e41090d53f17ca1110c3427f0a130f944b896fc8c83973219c97f57b690"}, + {file = "argon2_cffi_bindings-25.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:da0c79c23a63723aa5d782250fbf51b768abca630285262fb5144ba5ae01e520"}, + {file = "argon2_cffi_bindings-25.1.0.tar.gz", hash = "sha256:b957f3e6ea4d55d820e40ff76f450952807013d361a65d7f28acc0acbf29229d"}, +] + +[package.dependencies] +cffi = {version = ">=1.0.1", markers = "python_version < \"3.14\""} + +[[package]] +name = "arrow" +version = "1.4.0" +description = "Better dates & times for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "arrow-1.4.0-py3-none-any.whl", hash = "sha256:749f0769958ebdc79c173ff0b0670d59051a535fa26e8eba02953dc19eb43205"}, + {file = "arrow-1.4.0.tar.gz", hash = "sha256:ed0cc050e98001b8779e84d461b0098c4ac597e88704a655582b21d116e526d7"}, +] + +[package.dependencies] +python-dateutil = ">=2.7.0" +tzdata = {version = "*", markers = "python_version >= \"3.9\""} + +[package.extras] +doc = ["doc8", "sphinx (>=7.0.0)", "sphinx-autobuild", "sphinx-autodoc-typehints", "sphinx_rtd_theme (>=1.3.0)"] +test = ["dateparser (==1.*)", "pre-commit", "pytest", "pytest-cov", "pytest-mock", "pytz (==2025.2)", "simplejson (==3.*)"] + +[[package]] +name = "asttokens" +version = "3.0.1" +description = "Annotate AST trees with source code positions" +optional = false +python-versions = ">=3.8" +files = [ + {file = "asttokens-3.0.1-py3-none-any.whl", hash = "sha256:15a3ebc0f43c2d0a50eeafea25e19046c68398e487b9f1f5b517f7c0f40f976a"}, + {file = "asttokens-3.0.1.tar.gz", hash = "sha256:71a4ee5de0bde6a31d64f6b13f2293ac190344478f081c3d1bccfcf5eacb0cb7"}, +] + +[package.extras] +astroid = ["astroid (>=2,<5)"] +test = ["astroid (>=2,<5)", "pytest (<9.0)", "pytest-cov", "pytest-xdist"] + +[[package]] +name = "async-lru" +version = "2.0.5" +description = "Simple LRU cache for asyncio" +optional = false +python-versions = ">=3.9" +files = [ + {file = "async_lru-2.0.5-py3-none-any.whl", hash = "sha256:ab95404d8d2605310d345932697371a5f40def0487c03d6d0ad9138de52c9943"}, + {file = "async_lru-2.0.5.tar.gz", hash = "sha256:481d52ccdd27275f42c43a928b4a50c3bfb2d67af4e78b170e3e0bb39c66e5bb"}, +] + +[package.dependencies] +typing_extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} + [[package]] name = "atomicwrites" version = "1.4.1" @@ -46,6 +187,46 @@ files = [ [package.extras] dev = ["backports.zoneinfo", "freezegun (>=1.0,<2.0)", "jinja2 (>=3.0)", "pytest (>=6.0)", "pytest-cov", "pytz", "setuptools", "tzdata"] +[[package]] +name = "beautifulsoup4" +version = "4.15.0" +description = "Screen-scraping library" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "beautifulsoup4-4.15.0-py3-none-any.whl", hash = "sha256:d6f88de62e1d4e38ecb1077eb9724cd0eff29d2a08ca16a401e9b9e93f117cf9"}, + {file = "beautifulsoup4-4.15.0.tar.gz", hash = "sha256:288e3ca7d54b06f2ac191970bc275c1939cb46d450b255bf6718b04aa37ab4f7"}, +] + +[package.dependencies] +soupsieve = ">=1.6.1" +typing-extensions = ">=4.0.0" + +[package.extras] +cchardet = ["cchardet"] +chardet = ["chardet"] +charset-normalizer = ["charset-normalizer"] +html5lib = ["html5lib"] +lxml = ["lxml"] + +[[package]] +name = "bleach" +version = "6.2.0" +description = "An easy safelist-based HTML-sanitizing tool." +optional = false +python-versions = ">=3.9" +files = [ + {file = "bleach-6.2.0-py3-none-any.whl", hash = "sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e"}, + {file = "bleach-6.2.0.tar.gz", hash = "sha256:123e894118b8a599fd80d3ec1a6d4cc7ce4e5882b1317a7e1ba69b56e95f991f"}, +] + +[package.dependencies] +tinycss2 = {version = ">=1.1.0,<1.5", optional = true, markers = "extra == \"css\""} +webencodings = "*" + +[package.extras] +css = ["tinycss2 (>=1.1.0,<1.5)"] + [[package]] name = "certifi" version = "2026.6.17" @@ -57,6 +238,102 @@ files = [ {file = "certifi-2026.6.17.tar.gz", hash = "sha256:024c88eeec92ca068db80f02b8b07c9cef7b9fe261d1d535abfd5abd6f6af432"}, ] +[[package]] +name = "cffi" +version = "2.0.0" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.9" +files = [ + {file = "cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44"}, + {file = "cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453"}, + {file = "cffi-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495"}, + {file = "cffi-2.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5"}, + {file = "cffi-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb"}, + {file = "cffi-2.0.0-cp310-cp310-win32.whl", hash = "sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a"}, + {file = "cffi-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739"}, + {file = "cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe"}, + {file = "cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26"}, + {file = "cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9"}, + {file = "cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414"}, + {file = "cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743"}, + {file = "cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5"}, + {file = "cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5"}, + {file = "cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d"}, + {file = "cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d"}, + {file = "cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba"}, + {file = "cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94"}, + {file = "cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187"}, + {file = "cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18"}, + {file = "cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5"}, + {file = "cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6"}, + {file = "cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb"}, + {file = "cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26"}, + {file = "cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c"}, + {file = "cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b"}, + {file = "cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27"}, + {file = "cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75"}, + {file = "cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91"}, + {file = "cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5"}, + {file = "cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13"}, + {file = "cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b"}, + {file = "cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c"}, + {file = "cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef"}, + {file = "cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775"}, + {file = "cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205"}, + {file = "cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1"}, + {file = "cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f"}, + {file = "cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25"}, + {file = "cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad"}, + {file = "cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9"}, + {file = "cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d"}, + {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c"}, + {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8"}, + {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc"}, + {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592"}, + {file = "cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512"}, + {file = "cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4"}, + {file = "cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e"}, + {file = "cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6"}, + {file = "cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9"}, + {file = "cffi-2.0.0-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:fe562eb1a64e67dd297ccc4f5addea2501664954f2692b69a76449ec7913ecbf"}, + {file = "cffi-2.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:de8dad4425a6ca6e4e5e297b27b5c824ecc7581910bf9aee86cb6835e6812aa7"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:4647afc2f90d1ddd33441e5b0e85b16b12ddec4fca55f0d9671fef036ecca27c"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3f4d46d8b35698056ec29bca21546e1551a205058ae1a181d871e278b0b28165"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:e6e73b9e02893c764e7e8d5bb5ce277f1a009cd5243f8228f75f842bf937c534"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:cb527a79772e5ef98fb1d700678fe031e353e765d1ca2d409c92263c6d43e09f"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:61d028e90346df14fedc3d1e5441df818d095f3b87d286825dfcbd6459b7ef63"}, + {file = "cffi-2.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0f6084a0ea23d05d20c3edcda20c3d006f9b6f3fefeac38f59262e10cef47ee2"}, + {file = "cffi-2.0.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1cd13c99ce269b3ed80b417dcd591415d3372bcac067009b6e0f59c7d4015e65"}, + {file = "cffi-2.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:89472c9762729b5ae1ad974b777416bfda4ac5642423fa93bd57a09204712322"}, + {file = "cffi-2.0.0-cp39-cp39-win32.whl", hash = "sha256:2081580ebb843f759b9f617314a24ed5738c51d2aee65d31e02f6f7a2b97707a"}, + {file = "cffi-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:b882b3df248017dba09d6b16defe9b5c407fe32fc7c65a9c69798e6175601be9"}, + {file = "cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529"}, +] + +[package.dependencies] +pycparser = {version = "*", markers = "implementation_name != \"PyPy\""} + [[package]] name = "charset-normalizer" version = "3.4.7" @@ -197,15 +474,18 @@ files = [ [[package]] name = "click" -version = "7.1.2" +version = "8.1.8" description = "Composable command line interface toolkit" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7" files = [ - {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, - {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, + {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, + {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, ] +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + [[package]] name = "colorama" version = "0.4.6" @@ -217,6 +497,20 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "comm" +version = "0.2.3" +description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." +optional = false +python-versions = ">=3.8" +files = [ + {file = "comm-0.2.3-py3-none-any.whl", hash = "sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417"}, + {file = "comm-0.2.3.tar.gz", hash = "sha256:2dc8048c10962d55d7ad693be1e7045d891b7ce8d999c97963a5e3e99c055971"}, +] + +[package.extras] +test = ["pytest"] + [[package]] name = "coverage" version = "7.10.7" @@ -336,6 +630,67 @@ tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.1 [package.extras] toml = ["tomli"] +[[package]] +name = "debugpy" +version = "1.8.21" +description = "An implementation of the Debug Adapter Protocol for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "debugpy-1.8.21-cp310-cp310-macosx_15_0_x86_64.whl", hash = "sha256:8eeab7b5462f683452c57c0126aaa5ec4e974ddb705f39ba87dff8818c8e08f9"}, + {file = "debugpy-1.8.21-cp310-cp310-manylinux_2_34_x86_64.whl", hash = "sha256:0fddfdc130ac6d8bfc0415b0409822fa901c8f310e5c945ac5653a0352532344"}, + {file = "debugpy-1.8.21-cp310-cp310-win32.whl", hash = "sha256:72b5d676c4cbfac3bac5bb01c138a4656e843f93f03ce2a5f4e394ad49fbee73"}, + {file = "debugpy-1.8.21-cp310-cp310-win_amd64.whl", hash = "sha256:a7fe47fd23da57b9e0bec3f4a8ee65a2dc55782455ed7f2141d75ab5d2eaeef5"}, + {file = "debugpy-1.8.21-cp311-cp311-macosx_15_0_universal2.whl", hash = "sha256:da456226c7b4c69e35dbe35dcee6623d912000a77816db7856a41af1c72a0264"}, + {file = "debugpy-1.8.21-cp311-cp311-manylinux_2_34_x86_64.whl", hash = "sha256:f68b891688e61bdc08b8d364d919ff0051e0b94657b39dcd027bc3173edb7cdc"}, + {file = "debugpy-1.8.21-cp311-cp311-win32.whl", hash = "sha256:f843a8b08c2edeaf9b1582eed4f25441af21a297c22ff16bf76a662557aa9c9e"}, + {file = "debugpy-1.8.21-cp311-cp311-win_amd64.whl", hash = "sha256:84c564d8cc701d41843b29a92814c1f1bef6798724ca9d675c284ad9f6a547d7"}, + {file = "debugpy-1.8.21-cp312-cp312-macosx_15_0_universal2.whl", hash = "sha256:9f96713896f39c3dff0ee841f47320c3f2983d33c341e009361bb0ebc79adc4e"}, + {file = "debugpy-1.8.21-cp312-cp312-manylinux_2_34_x86_64.whl", hash = "sha256:c193d474f0a211191f2b4449d2d06157c689013035bd952f3b617e0ef422b176"}, + {file = "debugpy-1.8.21-cp312-cp312-win32.whl", hash = "sha256:4743373c1cac7f9e74a1b9915bf1dbe0e900eca657ffb170ae07ac8363205ae9"}, + {file = "debugpy-1.8.21-cp312-cp312-win_amd64.whl", hash = "sha256:bd7ba9dd3daa7c2f942c6ca8d4695a16bf9ac16b63615261c7982bc74f7ed20c"}, + {file = "debugpy-1.8.21-cp313-cp313-macosx_15_0_universal2.whl", hash = "sha256:13678151fc401e2d68c9880b91e28714f797d40422994572b24560ef80910a88"}, + {file = "debugpy-1.8.21-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:ecbd158386c31ffe71d46f72d44d56e66331ab9b16cad649156d514368f23ab2"}, + {file = "debugpy-1.8.21-cp313-cp313-win32.whl", hash = "sha256:2c2ae706dec41d99a9ca1f7ebc987a83e65578363be6f6b3ac9067504917fae1"}, + {file = "debugpy-1.8.21-cp313-cp313-win_amd64.whl", hash = "sha256:aa648733047443eb1d07682c4ef287d36a54507b643ffdf38b09a3ef002c72a0"}, + {file = "debugpy-1.8.21-cp314-cp314-macosx_15_0_universal2.whl", hash = "sha256:9bb2a685287a2ac9b181cde89edcec64845cb51de7faaa75badb9a698bc24782"}, + {file = "debugpy-1.8.21-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:3d6922439bf33fd38a3e2c447869ebc7b97da5cd3d329ff1ef9bc06c4903437e"}, + {file = "debugpy-1.8.21-cp314-cp314-win32.whl", hash = "sha256:15d4963bd5ffa48f0da0947fd06757fa7621945048a14ad7705431566d3c0e7c"}, + {file = "debugpy-1.8.21-cp314-cp314-win_amd64.whl", hash = "sha256:fe0744a12353406de0ae8ccff0d0a4a666f00801a3db8fd04e7a5f761cd520e8"}, + {file = "debugpy-1.8.21-cp38-cp38-macosx_15_0_x86_64.whl", hash = "sha256:0042da0ecd0a8b50dc4a54395ecd870d258d73fa18776f50c91fdcabdcad2675"}, + {file = "debugpy-1.8.21-cp38-cp38-manylinux_2_34_x86_64.whl", hash = "sha256:ffd932c6796afadab6993ec96745918a8cb2444dbd392074f769db5ea40ab440"}, + {file = "debugpy-1.8.21-cp38-cp38-win32.whl", hash = "sha256:4e7c2d784d78ad4b71a5f8cd7b59c167719ec8a7a0211dbb3eb1bfeda78bc4e2"}, + {file = "debugpy-1.8.21-cp38-cp38-win_amd64.whl", hash = "sha256:aa9d941d6dfe3d0407e4b3ca0b9ec466030e260fbf1174094f68785680f66db6"}, + {file = "debugpy-1.8.21-cp39-cp39-macosx_15_0_x86_64.whl", hash = "sha256:9f5171176a0084b95d2ebe55a4d1f7b2a75b74c5dbec577ebd3a85c740551c36"}, + {file = "debugpy-1.8.21-cp39-cp39-manylinux_2_34_x86_64.whl", hash = "sha256:f15c10084f9861b5e8414a48f18f8e4aadf51a98a59e72c16aa28281ca994672"}, + {file = "debugpy-1.8.21-cp39-cp39-win32.whl", hash = "sha256:4e70cc8b5079f885cb43910924ee0aab73b8b6b2a14eff23afdd9895d86e79eb"}, + {file = "debugpy-1.8.21-cp39-cp39-win_amd64.whl", hash = "sha256:e935f9dc0501be523c8a8e1853c39432e1354e9ece717ae5998fd2371c4542c3"}, + {file = "debugpy-1.8.21-py2.py3-none-any.whl", hash = "sha256:b1e37d333663c8851516a47364ef473da127f9caebe4417e6df6f5825a7e9a92"}, + {file = "debugpy-1.8.21.tar.gz", hash = "sha256:a3c53278e84c94e11bd87c53970ec391d1a67396c8b22609fcac576520e611a6"}, +] + +[[package]] +name = "decorator" +version = "5.3.1" +description = "Decorators for Humans" +optional = false +python-versions = ">=3.8" +files = [ + {file = "decorator-5.3.1-py3-none-any.whl", hash = "sha256:f47fe6fdbd2edd623ecfe36875d37aba411624e2670dd395dddae1358689bb3c"}, + {file = "decorator-5.3.1.tar.gz", hash = "sha256:4cbcdd55a6efadb9dbea26b858f4fb3264567b52d69ca0d25b721b553f60ea82"}, +] + +[[package]] +name = "defusedxml" +version = "0.7.1" +description = "XML bomb protection for Python stdlib modules" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, + {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, +] + [[package]] name = "docutils" version = "0.20.1" @@ -347,6 +702,118 @@ files = [ {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"}, ] +[[package]] +name = "exceptiongroup" +version = "1.3.1" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598"}, + {file = "exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.6.0", markers = "python_version < \"3.13\""} + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "executing" +version = "2.2.1" +description = "Get the currently executing AST node of a frame, and other information" +optional = false +python-versions = ">=3.8" +files = [ + {file = "executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017"}, + {file = "executing-2.2.1.tar.gz", hash = "sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4"}, +] + +[package.extras] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] + +[[package]] +name = "fastjsonschema" +version = "2.21.2" +description = "Fastest Python implementation of JSON schema" +optional = false +python-versions = "*" +files = [ + {file = "fastjsonschema-2.21.2-py3-none-any.whl", hash = "sha256:1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463"}, + {file = "fastjsonschema-2.21.2.tar.gz", hash = "sha256:b1eb43748041c880796cd077f1a07c3d94e93ae84bba5ed36800a33554ae05de"}, +] + +[package.extras] +devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] + +[[package]] +name = "fqdn" +version = "1.5.1" +description = "Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers" +optional = false +python-versions = ">=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4, <4" +files = [ + {file = "fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014"}, + {file = "fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f"}, +] + +[[package]] +name = "h11" +version = "0.16.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.8" +files = [ + {file = "h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86"}, + {file = "h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1"}, +] + +[[package]] +name = "httpcore" +version = "1.0.9" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55"}, + {file = "httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8"}, +] + +[package.dependencies] +certifi = "*" +h11 = ">=0.16" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<1.0)"] + +[[package]] +name = "httpx" +version = "0.28.1" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, + {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, +] + +[package.dependencies] +anyio = "*" +certifi = "*" +httpcore = "==1.*" +idna = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +zstd = ["zstandard (>=0.18.0)"] + [[package]] name = "idna" version = "3.18" @@ -406,6 +873,130 @@ files = [ {file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"}, ] +[[package]] +name = "ipykernel" +version = "6.31.0" +description = "IPython Kernel for Jupyter" +optional = false +python-versions = ">=3.9" +files = [ + {file = "ipykernel-6.31.0-py3-none-any.whl", hash = "sha256:abe5386f6ced727a70e0eb0cf1da801fa7c5fa6ff82147747d5a0406cd8c94af"}, + {file = "ipykernel-6.31.0.tar.gz", hash = "sha256:2372ce8bc1ff4f34e58cafed3a0feb2194b91fc7cad0fc72e79e47b45ee9e8f6"}, +] + +[package.dependencies] +appnope = {version = ">=0.1.2", markers = "platform_system == \"Darwin\""} +comm = ">=0.1.1" +debugpy = ">=1.6.5" +ipython = ">=7.23.1" +jupyter-client = ">=8.0.0" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +matplotlib-inline = ">=0.1" +nest-asyncio = ">=1.4" +packaging = ">=22" +psutil = ">=5.7" +pyzmq = ">=25" +tornado = ">=6.2" +traitlets = ">=5.4.0" + +[package.extras] +cov = ["coverage[toml]", "matplotlib", "pytest-cov", "trio"] +docs = ["intersphinx-registry", "myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] +pyqt5 = ["pyqt5"] +pyside6 = ["pyside6"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0,<9)", "pytest-asyncio (>=0.23.5)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "ipython" +version = "8.18.1" +description = "IPython: Productive Interactive Computing" +optional = false +python-versions = ">=3.9" +files = [ + {file = "ipython-8.18.1-py3-none-any.whl", hash = "sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397"}, + {file = "ipython-8.18.1.tar.gz", hash = "sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +jedi = ">=0.16" +matplotlib-inline = "*" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} +prompt-toolkit = ">=3.0.41,<3.1.0" +pygments = ">=2.4.0" +stack-data = "*" +traitlets = ">=5" +typing-extensions = {version = "*", markers = "python_version < \"3.10\""} + +[package.extras] +all = ["black", "curio", "docrepr", "exceptiongroup", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] +black = ["black"] +doc = ["docrepr", "exceptiongroup", "ipykernel", "matplotlib", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] +kernel = ["ipykernel"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["ipywidgets", "notebook"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath", "trio"] + +[[package]] +name = "ipywidgets" +version = "8.1.8" +description = "Jupyter interactive widgets" +optional = false +python-versions = ">=3.7" +files = [ + {file = "ipywidgets-8.1.8-py3-none-any.whl", hash = "sha256:ecaca67aed704a338f88f67b1181b58f821ab5dc89c1f0f5ef99db43c1c2921e"}, + {file = "ipywidgets-8.1.8.tar.gz", hash = "sha256:61f969306b95f85fba6b6986b7fe45d73124d1d9e3023a8068710d47a22ea668"}, +] + +[package.dependencies] +comm = ">=0.1.3" +ipython = ">=6.1.0" +jupyterlab_widgets = ">=3.0.15,<3.1.0" +traitlets = ">=4.3.1" +widgetsnbextension = ">=4.0.14,<4.1.0" + +[package.extras] +test = ["ipykernel", "jsonschema", "pytest (>=3.6.0)", "pytest-cov", "pytz"] + +[[package]] +name = "isoduration" +version = "20.11.0" +description = "Operations with ISO 8601 durations" +optional = false +python-versions = ">=3.7" +files = [ + {file = "isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042"}, + {file = "isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9"}, +] + +[package.dependencies] +arrow = ">=0.15.0" + +[[package]] +name = "jedi" +version = "0.19.2" +description = "An autocompletion tool for Python that can be used for text editors." +optional = false +python-versions = ">=3.6" +files = [ + {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"}, + {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"}, +] + +[package.dependencies] +parso = ">=0.8.4,<0.9.0" + +[package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<9.0.0)"] + [[package]] name = "jinja2" version = "3.1.6" @@ -423,6 +1014,354 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] +[[package]] +name = "json5" +version = "0.15.0" +description = "A Python implementation of the JSON5 data format." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "json5-0.15.0-py3-none-any.whl", hash = "sha256:56636a30c0e8a4665fe2179c0212f32eae3796dea89ea6f649b9436ecdb39618"}, + {file = "json5-0.15.0.tar.gz", hash = "sha256:7424d1f1eb1d56da6e3d70643f53619862b4ce81440bdb8ecfd6f875e5ba4a71"}, +] + +[[package]] +name = "jsonpointer" +version = "3.0.0" +description = "Identify specific nodes in a JSON document (RFC 6901)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, + {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, +] + +[[package]] +name = "jsonschema" +version = "4.25.1" +description = "An implementation of JSON Schema validation for Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "jsonschema-4.25.1-py3-none-any.whl", hash = "sha256:3fba0169e345c7175110351d456342c364814cfcf3b964ba4587f22915230a63"}, + {file = "jsonschema-4.25.1.tar.gz", hash = "sha256:e4a9655ce0da0c0b67a085847e00a3a51449e1157f4f75e9fb5aa545e122eb85"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +fqdn = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +idna = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +isoduration = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +jsonpointer = {version = ">1.13", optional = true, markers = "extra == \"format-nongpl\""} +jsonschema-specifications = ">=2023.03.6" +referencing = ">=0.28.4" +rfc3339-validator = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +rfc3986-validator = {version = ">0.1.0", optional = true, markers = "extra == \"format-nongpl\""} +rfc3987-syntax = {version = ">=1.1.0", optional = true, markers = "extra == \"format-nongpl\""} +rpds-py = ">=0.7.1" +uri-template = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +webcolors = {version = ">=24.6.0", optional = true, markers = "extra == \"format-nongpl\""} + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "rfc3987-syntax (>=1.1.0)", "uri-template", "webcolors (>=24.6.0)"] + +[[package]] +name = "jsonschema-specifications" +version = "2025.9.1" +description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +optional = false +python-versions = ">=3.9" +files = [ + {file = "jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe"}, + {file = "jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d"}, +] + +[package.dependencies] +referencing = ">=0.31.0" + +[[package]] +name = "jupyter" +version = "1.1.1" +description = "Jupyter metapackage. Install all the Jupyter components in one go." +optional = false +python-versions = "*" +files = [ + {file = "jupyter-1.1.1-py2.py3-none-any.whl", hash = "sha256:7a59533c22af65439b24bbe60373a4e95af8f16ac65a6c00820ad378e3f7cc83"}, + {file = "jupyter-1.1.1.tar.gz", hash = "sha256:d55467bceabdea49d7e3624af7e33d59c37fff53ed3a350e1ac957bed731de7a"}, +] + +[package.dependencies] +ipykernel = "*" +ipywidgets = "*" +jupyter-console = "*" +jupyterlab = "*" +nbconvert = "*" +notebook = "*" + +[[package]] +name = "jupyter-client" +version = "8.6.3" +description = "Jupyter protocol implementation and client libraries" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f"}, + {file = "jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +python-dateutil = ">=2.8.2" +pyzmq = ">=23.0" +tornado = ">=6.2" +traitlets = ">=5.3" + +[package.extras] +docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest (<8.2.0)", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] + +[[package]] +name = "jupyter-console" +version = "6.6.3" +description = "Jupyter terminal console" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jupyter_console-6.6.3-py3-none-any.whl", hash = "sha256:309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485"}, + {file = "jupyter_console-6.6.3.tar.gz", hash = "sha256:566a4bf31c87adbfadf22cdf846e3069b59a71ed5da71d6ba4d8aaad14a53539"}, +] + +[package.dependencies] +ipykernel = ">=6.14" +ipython = "*" +jupyter-client = ">=7.0.0" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +prompt-toolkit = ">=3.0.30" +pygments = "*" +pyzmq = ">=17" +traitlets = ">=5.4" + +[package.extras] +test = ["flaky", "pexpect", "pytest"] + +[[package]] +name = "jupyter-core" +version = "5.8.1" +description = "Jupyter core package. A base package on which Jupyter projects rely." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_core-5.8.1-py3-none-any.whl", hash = "sha256:c28d268fc90fb53f1338ded2eb410704c5449a358406e8a948b75706e24863d0"}, + {file = "jupyter_core-5.8.1.tar.gz", hash = "sha256:0a5f9706f70e64786b75acba995988915ebd4601c8a52e534a40b51c95f59941"}, +] + +[package.dependencies] +platformdirs = ">=2.5" +pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} +traitlets = ">=5.3" + +[package.extras] +docs = ["intersphinx-registry", "myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-spelling", "traitlets"] +test = ["ipykernel", "pre-commit", "pytest (<9)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "jupyter-events" +version = "0.12.1" +description = "Jupyter Event System library" +optional = false +python-versions = ">=3.9" +files = [ + {file = "jupyter_events-0.12.1-py3-none-any.whl", hash = "sha256:c366585253f537a627da52fa7ca7410c5b5301fe893f511e7b077c2d93ec8bcf"}, + {file = "jupyter_events-0.12.1.tar.gz", hash = "sha256:faff25f77218335752f35f23c5fe6e4a392a7bd99a5939ccb9b8fbf594636cf3"}, +] + +[package.dependencies] +jsonschema = {version = ">=4.18.0", extras = ["format-nongpl"]} +packaging = "*" +python-json-logger = ">=2.0.4" +pyyaml = ">=5.3" +referencing = "*" +rfc3339-validator = "*" +rfc3986-validator = ">=0.1.1" +traitlets = ">=5.3" + +[package.extras] +cli = ["click", "rich"] +docs = ["jupyterlite-sphinx", "myst-parser", "pydata-sphinx-theme (>=0.16)", "sphinx (>=8)", "sphinxcontrib-spelling"] +test = ["click", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.19.0)", "pytest-console-scripts", "rich"] + +[[package]] +name = "jupyter-lsp" +version = "2.3.1" +description = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_lsp-2.3.1-py3-none-any.whl", hash = "sha256:71b954d834e85ff3096400554f2eefaf7fe37053036f9a782b0f7c5e42dadb81"}, + {file = "jupyter_lsp-2.3.1.tar.gz", hash = "sha256:fdf8a4aa7d85813976d6e29e95e6a2c8f752701f926f2715305249a3829805a6"}, +] + +[package.dependencies] +importlib_metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} +jupyter_server = ">=1.1.2" + +[[package]] +name = "jupyter-server" +version = "2.18.2" +description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." +optional = false +python-versions = ">=3.9" +files = [ + {file = "jupyter_server-2.18.2-py3-none-any.whl", hash = "sha256:fa5e46539ded65791838035a2b6001f13e54d5f64b8b3752eb1e91fdd641a5b8"}, + {file = "jupyter_server-2.18.2.tar.gz", hash = "sha256:06b4f40d8a7a00bb39d5216859c81374a0e7cfefe6d8a5a7facc5a5c37c679a7"}, +] + +[package.dependencies] +anyio = ">=3.1.0" +argon2-cffi = ">=21.1" +jinja2 = ">=3.0.3" +jupyter-client = ">=7.4.4" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +jupyter-events = ">=0.11.0" +jupyter-server-terminals = ">=0.4.4" +nbconvert = ">=6.4.4" +nbformat = ">=5.3.0" +overrides = {version = ">=5.0", markers = "python_version < \"3.12\""} +packaging = ">=22.0" +prometheus-client = ">=0.9" +pywinpty = {version = ">=2.0.1", markers = "os_name == \"nt\""} +pyzmq = ">=24" +send2trash = ">=1.8.2" +terminado = ">=0.8.3" +tornado = ">=6.2.0" +traitlets = ">=5.6.0" +websocket-client = ">=1.7" + +[package.extras] +docs = ["ipykernel", "jinja2", "jupyter-client", "myst-parser", "nbformat", "prometheus-client", "pydata-sphinx-theme", "send2trash", "sphinx (<9.0)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-openapi (>=0.8.0)", "sphinxcontrib-spelling", "sphinxemoji", "tornado", "typing-extensions"] +test = ["flaky", "ipykernel", "pre-commit", "pytest (>=7.0,<9)", "pytest-console-scripts", "pytest-jupyter[server] (>=0.7)", "pytest-timeout", "requests"] + +[[package]] +name = "jupyter-server-terminals" +version = "0.5.4" +description = "A Jupyter Server Extension Providing Terminals." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_server_terminals-0.5.4-py3-none-any.whl", hash = "sha256:55be353fc74a80bc7f3b20e6be50a55a61cd525626f578dcb66a5708e2007d14"}, + {file = "jupyter_server_terminals-0.5.4.tar.gz", hash = "sha256:bbda128ed41d0be9020349f9f1f2a4ab9952a73ed5f5ac9f1419794761fb87f5"}, +] + +[package.dependencies] +pywinpty = {version = ">=2.0.3", markers = "os_name == \"nt\""} +terminado = ">=0.8.3" + +[package.extras] +docs = ["jinja2", "jupyter-server", "mistune (<4.0)", "myst-parser", "nbformat", "packaging", "pydata-sphinx-theme", "sphinxcontrib-github-alt", "sphinxcontrib-openapi", "sphinxcontrib-spelling", "sphinxemoji", "tornado"] +test = ["jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-jupyter[server] (>=0.5.3)", "pytest-timeout"] + +[[package]] +name = "jupyterlab" +version = "4.5.9" +description = "JupyterLab computational environment" +optional = false +python-versions = ">=3.9" +files = [ + {file = "jupyterlab-4.5.9-py3-none-any.whl", hash = "sha256:5ff0f908e8ac0afbed32b106fdef360f101c0a6654d1bf4a81e98a293ae1b336"}, + {file = "jupyterlab-4.5.9.tar.gz", hash = "sha256:dd79a073fecae7a39066ea99e4627ed6c76269ac926e95a810e1e1df6358d865"}, +] + +[package.dependencies] +async-lru = ">=1.0.0" +httpx = ">=0.25.0,<1" +importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} +ipykernel = ">=6.5.0,<6.30.0 || >6.30.0" +jinja2 = ">=3.0.3" +jupyter-core = "*" +jupyter-lsp = ">=2.0.0" +jupyter-server = ">=2.4.0,<3" +jupyterlab-server = ">=2.28.0,<3" +notebook-shim = ">=0.2" +packaging = ">=23.2" +setuptools = ">=41.1.0" +tomli = {version = ">=1.2.2", markers = "python_version < \"3.11\""} +tornado = ">=6.2.0" +traitlets = "*" + +[package.extras] +dev = ["build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.11.12)"] +docs = ["jsx-lexer", "myst-parser", "pydata-sphinx-theme (>=0.13.0)", "pytest", "pytest-check-links", "pytest-jupyter", "sphinx (>=1.8,<8.2.0)", "sphinx-copybutton"] +docs-screenshots = ["altair (==6.0.0)", "ipython (==8.16.1)", "ipywidgets (==8.1.5)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.3.post1)", "matplotlib (==3.10.0)", "nbconvert (>=7.0.0)", "pandas (==2.2.3)", "scipy (==1.15.1)"] +test = ["coverage", "pytest (>=7.0)", "pytest-check-links (>=0.7)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter (>=0.5.3)", "pytest-timeout", "pytest-tornasync", "requests", "requests-cache", "virtualenv"] +upgrade-extension = ["copier (>=9,<10)", "jinja2-time (<0.3)", "pydantic (<3.0)", "pyyaml-include (<3.0)", "tomli-w (<2.0)"] + +[[package]] +name = "jupyterlab-pygments" +version = "0.3.0" +description = "Pygments theme using JupyterLab CSS variables" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780"}, + {file = "jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d"}, +] + +[[package]] +name = "jupyterlab-server" +version = "2.28.0" +description = "A set of server components for JupyterLab and JupyterLab like applications." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyterlab_server-2.28.0-py3-none-any.whl", hash = "sha256:e4355b148fdcf34d312bbbc80f22467d6d20460e8b8736bf235577dd18506968"}, + {file = "jupyterlab_server-2.28.0.tar.gz", hash = "sha256:35baa81898b15f93573e2deca50d11ac0ae407ebb688299d3a5213265033712c"}, +] + +[package.dependencies] +babel = ">=2.10" +importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} +jinja2 = ">=3.0.3" +json5 = ">=0.9.0" +jsonschema = ">=4.18.0" +jupyter-server = ">=1.21,<3" +packaging = ">=21.3" +requests = ">=2.31" + +[package.extras] +docs = ["autodoc-traits", "jinja2 (<3.2.0)", "mistune (<4)", "myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-copybutton", "sphinxcontrib-openapi (>0.8)"] +openapi = ["openapi-core (>=0.18.0,<0.19.0)", "ruamel-yaml"] +test = ["hatch", "ipykernel", "openapi-core (>=0.18.0,<0.19.0)", "openapi-spec-validator (>=0.6.0,<0.8.0)", "pytest (>=7.0,<8)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter[server] (>=0.6.2)", "pytest-timeout", "requests-mock", "ruamel-yaml", "sphinxcontrib-spelling", "strict-rfc3339", "werkzeug"] + +[[package]] +name = "jupyterlab-widgets" +version = "3.0.16" +description = "Jupyter interactive widgets for JupyterLab" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jupyterlab_widgets-3.0.16-py3-none-any.whl", hash = "sha256:45fa36d9c6422cf2559198e4db481aa243c7a32d9926b500781c830c80f7ecf8"}, + {file = "jupyterlab_widgets-3.0.16.tar.gz", hash = "sha256:423da05071d55cf27a9e602216d35a3a65a3e41cdf9c5d3b643b814ce38c19e0"}, +] + +[[package]] +name = "lark" +version = "1.3.1" +description = "a modern parsing library" +optional = false +python-versions = ">=3.8" +files = [ + {file = "lark-1.3.1-py3-none-any.whl", hash = "sha256:c629b661023a014c37da873b4ff58a817398d12635d3bbb2c5a03be7fe5d1e12"}, + {file = "lark-1.3.1.tar.gz", hash = "sha256:b426a7a6d6d53189d318f2b6236ab5d6429eaf09259f1ca33eb716eed10d2905"}, +] + +[package.extras] +atomic-cache = ["atomicwrites"] +interegular = ["interegular (>=0.3.1,<0.4.0)"] +nearley = ["js2py"] +regex = ["regex"] + [[package]] name = "loguru" version = "0.7.3" @@ -563,6 +1502,23 @@ files = [ {file = "markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698"}, ] +[[package]] +name = "matplotlib-inline" +version = "0.2.2" +description = "Inline Matplotlib backend for Jupyter" +optional = false +python-versions = ">=3.9" +files = [ + {file = "matplotlib_inline-0.2.2-py3-none-any.whl", hash = "sha256:3c821cf1c209f59fb2d2d64abbf5b23b67bcb2210d663f9918dd851c6da1fcf6"}, + {file = "matplotlib_inline-0.2.2.tar.gz", hash = "sha256:72f3fe8fce36b70d4a5b612f899090cd0401deddc4ea90e1572b9f4bfb058c79"}, +] + +[package.dependencies] +traitlets = "*" + +[package.extras] +test = ["flake8", "matplotlib", "nbdime", "nbval", "notebook", "pytest"] + [[package]] name = "mdit-py-plugins" version = "0.4.2" @@ -593,6 +1549,31 @@ files = [ {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, ] +[[package]] +name = "mistune" +version = "3.3.2" +description = "A sane and fast Markdown parser with useful plugins and renderers" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mistune-3.3.2-py3-none-any.whl", hash = "sha256:a678a56387d487db7368ede4647cb2ba1deff22ce61f92343e4ebe0ddfce4f2d"}, + {file = "mistune-3.3.2.tar.gz", hash = "sha256:e12ee4f1e74336e91aa1141e35f913b337c40bdf7c0cc49f21fb853a27e8b62f"}, +] + +[package.dependencies] +typing-extensions = {version = "*", markers = "python_version < \"3.11\""} + +[[package]] +name = "mypy-extensions" +version = "1.1.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.8" +files = [ + {file = "mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505"}, + {file = "mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558"}, +] + [[package]] name = "myst-parser" version = "2.0.0" @@ -619,6 +1600,137 @@ rtd = ["ipython", "pydata-sphinx-theme (==v0.13.0rc4)", "sphinx-autodoc2 (>=0.4. testing = ["beautifulsoup4", "coverage[toml]", "pytest (>=7,<8)", "pytest-cov", "pytest-param-files (>=0.3.4,<0.4.0)", "pytest-regressions", "sphinx-pytest"] testing-docutils = ["pygments", "pytest (>=7,<8)", "pytest-param-files (>=0.3.4,<0.4.0)"] +[[package]] +name = "nbclient" +version = "0.10.2" +description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." +optional = false +python-versions = ">=3.9.0" +files = [ + {file = "nbclient-0.10.2-py3-none-any.whl", hash = "sha256:4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d"}, + {file = "nbclient-0.10.2.tar.gz", hash = "sha256:90b7fc6b810630db87a6d0c2250b1f0ab4cf4d3c27a299b0cde78a4ed3fd9193"}, +] + +[package.dependencies] +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +nbformat = ">=5.1" +traitlets = ">=5.4" + +[package.extras] +dev = ["pre-commit"] +docs = ["autodoc-traits", "flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "mock", "moto", "myst-parser", "nbconvert (>=7.1.0)", "pytest (>=7.0,<8)", "pytest-asyncio", "pytest-cov (>=4.0)", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling", "testpath", "xmltodict"] +test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.1.0)", "pytest (>=7.0,<8)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] + +[[package]] +name = "nbconvert" +version = "7.17.1" +description = "Convert Jupyter Notebooks (.ipynb files) to other formats." +optional = false +python-versions = ">=3.9" +files = [ + {file = "nbconvert-7.17.1-py3-none-any.whl", hash = "sha256:aa85c087b435e7bf1ffd03319f658e285f2b89eccab33bc1ba7025495ab3e7c8"}, + {file = "nbconvert-7.17.1.tar.gz", hash = "sha256:34d0d0a7e73ce3cbab6c5aae8f4f468797280b01fd8bd2ca746da8569eddd7d2"}, +] + +[package.dependencies] +beautifulsoup4 = "*" +bleach = {version = "!=5.0.0", extras = ["css"]} +defusedxml = "*" +importlib-metadata = {version = ">=3.6", markers = "python_version < \"3.10\""} +jinja2 = ">=3.0" +jupyter-core = ">=4.7" +jupyterlab-pygments = "*" +markupsafe = ">=2.0" +mistune = ">=2.0.3,<4" +nbclient = ">=0.5.0" +nbformat = ">=5.7" +packaging = "*" +pandocfilters = ">=1.4.1" +pygments = ">=2.4.1" +traitlets = ">=5.1" + +[package.extras] +all = ["flaky", "intersphinx-registry", "ipykernel", "ipython", "ipywidgets (>=7.5)", "myst-parser", "nbsphinx (>=0.2.12)", "playwright", "pydata-sphinx-theme", "pyqtwebengine (>=5.15)", "pytest (>=7)", "sphinx (>=5.0.2)", "sphinxcontrib-spelling", "tornado (>=6.1)"] +docs = ["intersphinx-registry", "ipykernel", "ipython", "myst-parser", "nbsphinx (>=0.2.12)", "pydata-sphinx-theme", "sphinx (>=5.0.2)", "sphinxcontrib-spelling"] +qtpdf = ["pyqtwebengine (>=5.15)"] +qtpng = ["pyqtwebengine (>=5.15)"] +serve = ["tornado (>=6.1)"] +test = ["flaky", "ipykernel", "ipywidgets (>=7.5)", "pytest (>=7)"] +webpdf = ["playwright"] + +[[package]] +name = "nbformat" +version = "5.10.4" +description = "The Jupyter Notebook format" +optional = false +python-versions = ">=3.8" +files = [ + {file = "nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b"}, + {file = "nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a"}, +] + +[package.dependencies] +fastjsonschema = ">=2.15" +jsonschema = ">=2.6" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +traitlets = ">=5.1" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["pep440", "pre-commit", "pytest", "testpath"] + +[[package]] +name = "nest-asyncio" +version = "1.6.0" +description = "Patch asyncio to allow nested event loops" +optional = false +python-versions = ">=3.5" +files = [ + {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, + {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, +] + +[[package]] +name = "notebook" +version = "7.5.7" +description = "Jupyter Notebook - A web-based notebook environment for interactive computing" +optional = false +python-versions = ">=3.9" +files = [ + {file = "notebook-7.5.7-py3-none-any.whl", hash = "sha256:1f95f79d117e47d20b5555b5c85a397d2cfecf136978aaab767cf0314b09165b"}, + {file = "notebook-7.5.7.tar.gz", hash = "sha256:d6d59288a25303b25e1dcb71e9b017ec3a785f7d92f38b9bc288ca1970d5b0a8"}, +] + +[package.dependencies] +jupyter-server = ">=2.4.0,<3" +jupyterlab = ">=4.5.8,<4.6" +jupyterlab-server = ">=2.28.0,<3" +notebook-shim = ">=0.2,<0.3" +tornado = ">=6.2.0" + +[package.extras] +dev = ["hatch", "pre-commit"] +docs = ["myst-parser", "nbsphinx", "pydata-sphinx-theme", "sphinx (>=1.3.6)", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["importlib-resources (>=5.0)", "ipykernel", "jupyter-server[test] (>=2.4.0,<3)", "jupyterlab-server[test] (>=2.28.0,<3)", "nbval", "pytest (>=7.0)", "pytest-console-scripts", "pytest-timeout", "pytest-tornasync", "requests"] + +[[package]] +name = "notebook-shim" +version = "0.2.4" +description = "A shim layer for notebook traits and config" +optional = false +python-versions = ">=3.7" +files = [ + {file = "notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef"}, + {file = "notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb"}, +] + +[package.dependencies] +jupyter-server = ">=1.8,<3" + +[package.extras] +test = ["pytest", "pytest-console-scripts", "pytest-jupyter", "pytest-tornasync"] + [[package]] name = "numpy" version = "1.26.4" @@ -664,6 +1776,17 @@ files = [ {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, ] +[[package]] +name = "overrides" +version = "7.7.0" +description = "A decorator to automatically detect mismatch when overriding a method." +optional = false +python-versions = ">=3.6" +files = [ + {file = "overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49"}, + {file = "overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a"}, +] + [[package]] name = "packaging" version = "26.2" @@ -743,6 +1866,97 @@ sql-other = ["SQLAlchemy (>=1.4.36)"] test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] xml = ["lxml (>=4.8.0)"] +[[package]] +name = "pandera" +version = "0.26.1" +description = "A light-weight and flexible data validation and testing tool for statistical data objects." +optional = false +python-versions = ">=3.9" +files = [ + {file = "pandera-0.26.1-py3-none-any.whl", hash = "sha256:1ff5b70556ce2f85c6b27e8fbe835a1761972f4d05f6548b4686b0db26ecb73b"}, + {file = "pandera-0.26.1.tar.gz", hash = "sha256:81a55a6429770d31b3bf4c3e8e1096a38296bd3009f9eca5780fad3c3c17fd82"}, +] + +[package.dependencies] +packaging = ">=20.0" +pydantic = "*" +typeguard = "*" +typing_extensions = "*" +typing_inspect = ">=0.6.0" + +[package.extras] +all = ["black", "dask[dataframe]", "distributed", "fastapi", "frictionless (<=4.40.8)", "geopandas (<1.1.0)", "hypothesis (>=6.92.7)", "ibis-framework (>=9.0.0)", "modin", "pandas-stubs", "polars (>=0.20.0)", "pyspark[connect] (>=3.2.0,<4.0.0)", "pyyaml (>=5.1)", "ray", "scipy", "shapely"] +dask = ["dask[dataframe]", "distributed"] +fastapi = ["fastapi"] +geopandas = ["geopandas (<1.1.0)", "shapely"] +hypotheses = ["scipy"] +ibis = ["ibis-framework (>=9.0.0)"] +io = ["black", "frictionless (<=4.40.8)", "pyyaml (>=5.1)"] +modin = ["dask[dataframe]", "distributed", "modin", "ray"] +modin-dask = ["dask[dataframe]", "distributed", "modin"] +modin-ray = ["modin", "ray"] +mypy = ["pandas-stubs"] +pandas = ["numpy (>=1.24.4)", "pandas (>=2.1.1)"] +polars = ["polars (>=0.20.0)"] +pyspark = ["pyspark[connect] (>=3.2.0,<4.0.0)"] +strategies = ["hypothesis (>=6.92.7)"] + +[[package]] +name = "pandocfilters" +version = "1.5.1" +description = "Utilities for writing pandoc filters in python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc"}, + {file = "pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e"}, +] + +[[package]] +name = "parso" +version = "0.8.7" +description = "A Python Parser" +optional = false +python-versions = ">=3.6" +files = [ + {file = "parso-0.8.7-py2.py3-none-any.whl", hash = "sha256:a8926eb2a1b915486941fdbd31e86a4baf88fe8c210f25f2f35ecec5b574ca1c"}, + {file = "parso-0.8.7.tar.gz", hash = "sha256:eaaac4c9fdd5e9e8852dc778d2d7405897ec510f2a298071453e5e3a07914bb1"}, +] + +[package.extras] +qa = ["flake8 (==5.0.4)", "types-setuptools (==67.2.0.1)", "zuban (==0.5.1)"] +testing = ["docopt", "pytest"] + +[[package]] +name = "pexpect" +version = "4.9.0" +description = "Pexpect allows easy control of interactive console applications." +optional = false +python-versions = "*" +files = [ + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, +] + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +name = "platformdirs" +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.9" +files = [ + {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 (>=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.6.0" @@ -758,6 +1972,95 @@ files = [ dev = ["pre-commit", "tox"] testing = ["coverage", "pytest", "pytest-benchmark"] +[[package]] +name = "prometheus-client" +version = "0.25.0" +description = "Python client for the Prometheus monitoring system." +optional = false +python-versions = ">=3.9" +files = [ + {file = "prometheus_client-0.25.0-py3-none-any.whl", hash = "sha256:d5aec89e349a6ec230805d0df882f3807f74fd6c1a2fa86864e3c2279059fed1"}, + {file = "prometheus_client-0.25.0.tar.gz", hash = "sha256:5e373b75c31afb3c86f1a52fa1ad470c9aace18082d39ec0d2f918d11cc9ba28"}, +] + +[package.extras] +aiohttp = ["aiohttp"] +django = ["django"] +twisted = ["twisted"] + +[[package]] +name = "prompt-toolkit" +version = "3.0.52" +description = "Library for building powerful interactive command lines in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955"}, + {file = "prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855"}, +] + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "psutil" +version = "7.2.2" +description = "Cross-platform lib for process and system monitoring." +optional = false +python-versions = ">=3.6" +files = [ + {file = "psutil-7.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2edccc433cbfa046b980b0df0171cd25bcaeb3a68fe9022db0979e7aa74a826b"}, + {file = "psutil-7.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78c8603dcd9a04c7364f1a3e670cea95d51ee865e4efb3556a3a63adef958ea"}, + {file = "psutil-7.2.2-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a571f2330c966c62aeda00dd24620425d4b0cc86881c89861fbc04549e5dc63"}, + {file = "psutil-7.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:917e891983ca3c1887b4ef36447b1e0873e70c933afc831c6b6da078ba474312"}, + {file = "psutil-7.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:ab486563df44c17f5173621c7b198955bd6b613fb87c71c161f827d3fb149a9b"}, + {file = "psutil-7.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:ae0aefdd8796a7737eccea863f80f81e468a1e4cf14d926bd9b6f5f2d5f90ca9"}, + {file = "psutil-7.2.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:eed63d3b4d62449571547b60578c5b2c4bcccc5387148db46e0c2313dad0ee00"}, + {file = "psutil-7.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7b6d09433a10592ce39b13d7be5a54fbac1d1228ed29abc880fb23df7cb694c9"}, + {file = "psutil-7.2.2-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fa4ecf83bcdf6e6c8f4449aff98eefb5d0604bf88cb883d7da3d8d2d909546a"}, + {file = "psutil-7.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e452c464a02e7dc7822a05d25db4cde564444a67e58539a00f929c51eddda0cf"}, + {file = "psutil-7.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:c7663d4e37f13e884d13994247449e9f8f574bc4655d509c3b95e9ec9e2b9dc1"}, + {file = "psutil-7.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:11fe5a4f613759764e79c65cf11ebdf26e33d6dd34336f8a337aa2996d71c841"}, + {file = "psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486"}, + {file = "psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979"}, + {file = "psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9"}, + {file = "psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e"}, + {file = "psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8"}, + {file = "psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc"}, + {file = "psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988"}, + {file = "psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee"}, + {file = "psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372"}, +] + +[package.extras] +dev = ["abi3audit", "black", "check-manifest", "colorama", "coverage", "packaging", "psleak", "pylint", "pyperf", "pypinfo", "pyreadline3", "pytest", "pytest-cov", "pytest-instafail", "pytest-xdist", "pywin32", "requests", "rstcheck", "ruff", "setuptools", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "validate-pyproject[all]", "virtualenv", "vulture", "wheel", "wheel", "wmi"] +test = ["psleak", "pytest", "pytest-instafail", "pytest-xdist", "pywin32", "setuptools", "wheel", "wmi"] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +optional = false +python-versions = "*" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +description = "Safely evaluate AST nodes without side effects" +optional = false +python-versions = "*" +files = [ + {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"}, + {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"}, +] + +[package.extras] +tests = ["pytest"] + [[package]] name = "py" version = "1.11.0" @@ -824,6 +2127,170 @@ files = [ [package.extras] test = ["cffi", "hypothesis", "pandas", "pytest", "pytz"] +[[package]] +name = "pycparser" +version = "2.23" +description = "C parser in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934"}, + {file = "pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2"}, +] + +[[package]] +name = "pydantic" +version = "2.13.4" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pydantic-2.13.4-py3-none-any.whl", hash = "sha256:45a282cde31d808236fd7ea9d919b128653c8b38b393d1c4ab335c62924d9aba"}, + {file = "pydantic-2.13.4.tar.gz", hash = "sha256:c40756b57adaa8b1efeeced5c196f3f3b7c435f90e84ea7f443901bec8099ef6"}, +] + +[package.dependencies] +annotated-types = ">=0.6.0" +pydantic-core = "2.46.4" +typing-extensions = ">=4.14.1" +typing-inspection = ">=0.4.2" + +[package.extras] +email = ["email-validator (>=2.0.0)"] +timezone = ["tzdata"] + +[[package]] +name = "pydantic-core" +version = "2.46.4" +description = "Core functionality for Pydantic validation and serialization" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pydantic_core-2.46.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a396dcc17e5a0b164dbe026896245a4fa9ff402edca1dff0be3d53a517f74de4"}, + {file = "pydantic_core-2.46.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:da4b951fe36dc7c3a1ccb4e3cd1747c3542b8c9ceede8fc86cae054e764485f5"}, + {file = "pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb63e0198ca18aad131c089b9204c23079c3afa95487e561f4c522d519e55aba"}, + {file = "pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f47286a97f0bc9b8859519809077b91b2cefe4ae47fcbf5e466a009c1c5d742b"}, + {file = "pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:905a0ed8ea6f2d61c1738835f99b699348d7857379083e5fc497fa0c967a407c"}, + {file = "pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea793e075b70290d89d8142074262885d3f7da19634845135751bd6344f73b50"}, + {file = "pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:395aebd9183f9d112f569aeb5b2214d1a10a33bec8456447f7fbdfa51d38d4cd"}, + {file = "pydantic_core-2.46.4-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:b078afbc25f3a1436c7a1d2cd3e322497ee99615ba97c563566fdf46aff1ee01"}, + {file = "pydantic_core-2.46.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f747929cf940cddb5b3668a390056ddd5ba2e5010615ea2dcf4f9c4f3ab8791d"}, + {file = "pydantic_core-2.46.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:daa27d92c36f24388fe3ad306b174781c747627f134452e4f128ea00ce1fe8c4"}, + {file = "pydantic_core-2.46.4-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:19e51f073cd3df251856a8a4189fbdf1de4012c3ebacfb1884f94f1eb406079f"}, + {file = "pydantic_core-2.46.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1747f85cee84c26985853c6f3d9bd3e75da5212912443fa111c113b9c246f39"}, + {file = "pydantic_core-2.46.4-cp310-cp310-win32.whl", hash = "sha256:2f84c03c8607173d16b5a854ec68a2f9079ae03237a54fb506d13af47e1d018d"}, + {file = "pydantic_core-2.46.4-cp310-cp310-win_amd64.whl", hash = "sha256:8358a950c8909158e3df31538a7e4edc2d7265a7c54b47f0864d9e5bae9dcebf"}, + {file = "pydantic_core-2.46.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:0e96592440881c74a213e5ad528e2b24d3d4f940de2766bed9010ab1d9e51594"}, + {file = "pydantic_core-2.46.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0d65b8c354be7fb5f720c3caa8bc940bc2d20ce749c8e06135f07f8ed95dd7c"}, + {file = "pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bfb192b3f4b9e8a89b6277b6ce787564f62cfd272055f6e685726b111dc7826"}, + {file = "pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9037063db01f09b09e237c282b6792bd4da634b5402c4e7f0c61effed7701a04"}, + {file = "pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc010ab034c8c7452522748bf937df58020d256ccae0874463d1f4d01758af8e"}, + {file = "pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c5dac79fa1614d1e06ca695109c6105923bd9c7d1d6c918d4e637b7e6b32fd3"}, + {file = "pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9fa868638bf362d3d138ea55829cefb3d5f4b0d7f142234382a15e2485dbec4"}, + {file = "pydantic_core-2.46.4-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:17299feefe090f2caa5b8e37222bb5f663e4935a8bfa6931d4102e5df1a9f398"}, + {file = "pydantic_core-2.46.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4c63ebc82684aa89d9a3bcbd13d515b3be44250dc68dd3bd81526c1cb31286c3"}, + {file = "pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:aaa2a54443eff1950ba5ddc6b6ccda0d9c84a364276a62f969bdf2a390650848"}, + {file = "pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:18e5ceec2ab67e6d5f1a9085e5a24c9c4e2ac4545730bfe668680bca05e555f3"}, + {file = "pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a0f62d0a58f4e7da165457e995725421e0064f2255d8eccebc49f41bbc23b109"}, + {file = "pydantic_core-2.46.4-cp311-cp311-win32.whl", hash = "sha256:041bde0a48fd37cf71cab1c9d56d3e8625a3793fef1f7dd232b3ff37e978ecda"}, + {file = "pydantic_core-2.46.4-cp311-cp311-win_amd64.whl", hash = "sha256:6f2eeda33a839975441c86a4119e1383c50b47faf0cbb5176985565c6bb02c33"}, + {file = "pydantic_core-2.46.4-cp311-cp311-win_arm64.whl", hash = "sha256:14f4c5d6db102bd796a627bbb3a17b4cf4574b9ae861d8b7c9a9661c6dd3362d"}, + {file = "pydantic_core-2.46.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3245406455a5d98187ec35530fd772b1d799b26667980872c8d4614991e2c4a2"}, + {file = "pydantic_core-2.46.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:962ccbab7b642487b1d8b7df90ef677e03134cf1fd8880bf698649b22a69371f"}, + {file = "pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8233f2947cf85404441fd7e0085f53b10c93e0ee78611099b5c7237e36aacbf7"}, + {file = "pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a233125ac121aa3ffba9a2b59edfc4a985a76092dc8279586ab4b71390875e7"}, + {file = "pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b712b53160b79a5850310b912a5ef8e57e56947c8ad690c227f5c9d7e561712"}, + {file = "pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9401557acd873c3a7f3eb9383edef8ac4968f9510e340f4808d427e75667e7b4"}, + {file = "pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:926c9541b14b12b1681dca8a0b75feb510b06c6341b70a8e500c2fdcff837cce"}, + {file = "pydantic_core-2.46.4-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:56cb4851bcaf3d117eddcef4fe66afd750a50274b0da8e22be256d10e5611987"}, + {file = "pydantic_core-2.46.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c68fcd102d71ea85c5b2dfac3f4f8476eff42a9e078fd5faefff6d145063536b"}, + {file = "pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b2f69dec1725e79a012d920df1707de5caf7ed5e08f3be4435e25803efc47458"}, + {file = "pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:8d0820e8192167f80d88d64038e609c31452eeca865b4e1d9950a27a4609b00b"}, + {file = "pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fbdb89b3e1c94a30cc5edfce477c6e6a5dc4d8f84665b455c27582f211a1c72c"}, + {file = "pydantic_core-2.46.4-cp312-cp312-win32.whl", hash = "sha256:9aa768456404a8bf48a4406685ac2bec8e72b62c69313734fa3b73cf33b3a894"}, + {file = "pydantic_core-2.46.4-cp312-cp312-win_amd64.whl", hash = "sha256:e9c26f834c65f5752f3f06cb08cb86a913ceb7274d0db6e267808a708b46bc89"}, + {file = "pydantic_core-2.46.4-cp312-cp312-win_arm64.whl", hash = "sha256:4fc73cb559bdb54b1134a706a2802a4cddd27a0633f5abb7e53056268751ac6a"}, + {file = "pydantic_core-2.46.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5d5902252db0d3cedf8d4a1bc68f70eeb430f7e4c7104c8c476753519b423008"}, + {file = "pydantic_core-2.46.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c94f0688e7b8d0a67abf40e57a7eaaecd17cc9586706a31b76c031f63df052b4"}, + {file = "pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f027324c56cd5406ca49c124b0db10e56c69064fec039acc571c29020cc87c76"}, + {file = "pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e739fee756ba1010f8bcccb534252e85a35fe45ae92c295a06059ce58b74ccd3"}, + {file = "pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d56801be94b86a9da183e5f3766e6310752b99ff647e38b09a9500d88e46e76"}, + {file = "pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2412e734dcb48da14d4e4006b82b46b74f2518b8a26ee7e58c6844a6cd6d03c4"}, + {file = "pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9551187363ffc0de2a00b2e47c25aeaeb1020b69b668762966df15fc5659dd5a"}, + {file = "pydantic_core-2.46.4-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:0186750b482eefa11d7f435892b09c5c606193ef3375bcf94aa00ae6bfb66262"}, + {file = "pydantic_core-2.46.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5855698a4856556d86e8e6cd8434bc3ac0314ee8e12089ae0e143f64c6256e4e"}, + {file = "pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:cbaf13819775b7f769bf4a1f066cb6df7a28d4480081a589828ef190226881cd"}, + {file = "pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:633147d34cf4550417f12e2b1a0383973bdf5cdfde212cb09e9a581cf10820be"}, + {file = "pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:82cf5301172168103724d49a1444d3378cb20cdee30b116a1bd6031236298a5d"}, + {file = "pydantic_core-2.46.4-cp313-cp313-win32.whl", hash = "sha256:9fa8ae11da9e2b3126c6426f147e0fba88d96d65921799bb30c6abd1cb2c97fb"}, + {file = "pydantic_core-2.46.4-cp313-cp313-win_amd64.whl", hash = "sha256:6b3ace8194b0e5204818c92802dcdca7fc6d88aabbb799d7c795540d9cd6d292"}, + {file = "pydantic_core-2.46.4-cp313-cp313-win_arm64.whl", hash = "sha256:184c081504d17f1c1066e430e117142b2c77d9448a97f7b65c6ac9fd9aee238d"}, + {file = "pydantic_core-2.46.4-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:428e04521a40150c85216fc8b85e8d39fece235a9cf5e383761238c7fa9b96fb"}, + {file = "pydantic_core-2.46.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:23ace664830ee0bfe014a0c7bc248b1f7f25ed7ad103852c317624a1083af462"}, + {file = "pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce5c1d2a8b27468f433ca974829c44060b8097eedc39933e3c206a90ee49c4a9"}, + {file = "pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7283d57845ecf5a163403eb0702dfc220cc4fbdd18919cb5ccea4f95ee1cdab4"}, + {file = "pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8daafc69c93ee8a0204506a3b6b30f586ef54028f52aeeeb5c4cfc5184fd5914"}, + {file = "pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2213145bcc2ba85884d0ac63d222fece9209678f77b9b4d76f054c561adb28"}, + {file = "pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a5f930472650a82629163023e630d160863fce524c616f4e5186e5de9d9a49b"}, + {file = "pydantic_core-2.46.4-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:c1b3f518abeca3aa13c712fd202306e145abf59a18b094a6bafb2d2bbf59192c"}, + {file = "pydantic_core-2.46.4-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a7dd0b3ee80d90150e3495a3a13ac34dbcbfd4f012996a6a1d8900e91b5c0fb"}, + {file = "pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:3fb702cd90b0446a3a1c5e470bfa0dd23c0233b676a9099ddcc964fa6ca13898"}, + {file = "pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:b8458003118a712e66286df6a707db01c52c0f52f7db8e4a38f0da1d3b94fc4e"}, + {file = "pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:372429a130e469c9cd698925ce5fc50940b7a1336b0d82038e63d5bbc4edc519"}, + {file = "pydantic_core-2.46.4-cp314-cp314-win32.whl", hash = "sha256:85bb3611ff1802f3ee7fdd7dbff26b56f343fb432d57a4728fdd49b6ef35e2f4"}, + {file = "pydantic_core-2.46.4-cp314-cp314-win_amd64.whl", hash = "sha256:811ff8e9c313ab425368bcbb36e5c4ebd7108c2bbf4e4089cfbb0b01eff63fac"}, + {file = "pydantic_core-2.46.4-cp314-cp314-win_arm64.whl", hash = "sha256:bfec22eab3c8cc2ceec0248aec886624116dc079afa027ecc8ad4a7e62010f8a"}, + {file = "pydantic_core-2.46.4-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:af8244b2bef6aaad6d92cda81372de7f8c8d36c9f0c3ea36e827c60e7d9467a0"}, + {file = "pydantic_core-2.46.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5a4330cdbc57162e4b3aa303f588ba752257694c9c9be3e7ebb11b4aca659b5d"}, + {file = "pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29c61fc04a3d840155ff08e475a04809278972fe6aef51e2720554e96367e34b"}, + {file = "pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c50f2528cf200c5eed56faf3f4e22fcd5f38c157a8b78576e6ba3168ec35f000"}, + {file = "pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0cbe8b01f948de4286c74cdd6c667aceb38f5c1e26f0693b3983d9d74887c65e"}, + {file = "pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:617d7e2ca7dcb8c5cf6bcb8c59b8832c94b36196bbf1cbd1bfb56ed341905edd"}, + {file = "pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7027560ee92211647d0d34e3f7cd6f50da56399d26a9c8ad0da286d3869a53f3"}, + {file = "pydantic_core-2.46.4-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:f99626688942fb746e545232e7726926f3be91b5975f8b55327665fafda991c7"}, + {file = "pydantic_core-2.46.4-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fc3e9034a63de20e15e8ade85358bc6efc614008cab72898b4b4952bea0509ff"}, + {file = "pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:97e7cf2be5c77b7d1a9713a05605d49460d02c6078d38d8bef3cbe323c548424"}, + {file = "pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:3bf92c5d0e00fefaab325a4d27828fe6b6e2a21848686b5b60d2d9eeb09d76c6"}, + {file = "pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:3ecbc122d18468d06ca279dc26a8c2e2d5acb10943bb35e36ae92096dc3b5565"}, + {file = "pydantic_core-2.46.4-cp314-cp314t-win32.whl", hash = "sha256:e846ae7835bf0703ae43f534ab79a867146dadd59dc9ca5c8b53d5c8f7c9ef02"}, + {file = "pydantic_core-2.46.4-cp314-cp314t-win_amd64.whl", hash = "sha256:2108ba5c1c1eca18030634489dc544844144ee36357f2f9f780b93e7ddbb44b5"}, + {file = "pydantic_core-2.46.4-cp314-cp314t-win_arm64.whl", hash = "sha256:4fcbe087dbc2068af7eda3aa87634eba216dbda64d1ae73c8684b621d33f6596"}, + {file = "pydantic_core-2.46.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:fd8b3d9fd264be37976686c7f65cd52a83f5e84f4bfd2adf9c1d469676bbb6ae"}, + {file = "pydantic_core-2.46.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9f444c499b3eefd3a92e348059471ea0c3a6e303d9c1cec09fa748fd9f895201"}, + {file = "pydantic_core-2.46.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3447661d99f75a3683a4cf5c87da72f2161964611864dbbeac7fbb118bb4bfc0"}, + {file = "pydantic_core-2.46.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8b9bab013d1c7a79d3501ff86d0bc9c31bf587db4551677b96bec07df78c6b15"}, + {file = "pydantic_core-2.46.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d995260fdf4e1db774581b4900e0f832abe3c7c84996726bbc161b19c8f29e76"}, + {file = "pydantic_core-2.46.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f13a646d65d09fbf1bc6b3a9635d30095c8e7e5cc419ff35ecc563c5fd04cd49"}, + {file = "pydantic_core-2.46.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432c179df7874eeb73307aad2df0755e1ae0efa61ff0ea89b93e194411ae3928"}, + {file = "pydantic_core-2.46.4-cp39-cp39-manylinux_2_31_riscv64.whl", hash = "sha256:e68b7a074f65a2fd746c52a7ce6142ab7006074ac269ace0c25cd8ba171f8066"}, + {file = "pydantic_core-2.46.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4a05d69cba51d852c5c3e92758653245a50c0b646ced0cf05bd793ed592839d6"}, + {file = "pydantic_core-2.46.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:228ee9bae8bef5b1e97ec58302f80357c37199e0d0a99174e138d28e6957b9d9"}, + {file = "pydantic_core-2.46.4-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:10e17cbb10a330363733efc4d7c4d0dd827ac0909b8f6a6542298fed1ea62f29"}, + {file = "pydantic_core-2.46.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:91a06d2e259ecfbd8c901d70c3c507900458498142b3026a296b7de4d1322cc9"}, + {file = "pydantic_core-2.46.4-cp39-cp39-win32.whl", hash = "sha256:d80ee3d731373b24cebbc10d689ca4ee1875caf0d5703a245db18efd4dd37fc1"}, + {file = "pydantic_core-2.46.4-cp39-cp39-win_amd64.whl", hash = "sha256:3be77f45df024d789a672ae34f8b06fb346c4f9f46ea714956660ea4862e89ac"}, + {file = "pydantic_core-2.46.4-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:14d4edf427bdcf950a8a02d7cb44a08614388dd6e1bdcbf4f67504fa7887da9c"}, + {file = "pydantic_core-2.46.4-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:0ce40cd7b21210e99342afafbd4d0f76d784eb5b1d60f3bdc566be4983c6c73b"}, + {file = "pydantic_core-2.46.4-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90884113d8b48f760e9587002789ddd741e76ab9f89518cd1e43b1f1a52ec44b"}, + {file = "pydantic_core-2.46.4-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66ce7632c22d837c95301830e111ad0128a32b8207533b60896a96c4915192ea"}, + {file = "pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:1d8ba486450b14f3b1d63bc521d410ec7565e52f887b9fb671791886436a42f7"}, + {file = "pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:3009f12e4e90b7f88b4f9adb1b0c4a3d58fe7820f3238c190047209d148026df"}, + {file = "pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad785e92e6dc634c21555edc8bd6b64957ab844541bcb96a1366c202951ae526"}, + {file = "pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00c603d540afdd6b80eb39f078f33ebd46211f02f33e34a32d9f053bba711de0"}, + {file = "pydantic_core-2.46.4-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:0c563b08bca408dc7f65f700633d8442fffb2421fc47b8101377e9fd65051ff0"}, + {file = "pydantic_core-2.46.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:db06ffe51636ffe9ca531fe9023dd64bdd794be8754cb5df57c5498ae5b518a7"}, + {file = "pydantic_core-2.46.4-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:133878133d271ade3d41d1bfb2a45ec38dbdbda40bc065921c6b04e4630127e2"}, + {file = "pydantic_core-2.46.4-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9bc519fbf2b7578398853d815009ae5e4d4603d12f4e3f91da8c06852d3da3e9"}, + {file = "pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:c7a7bd4e39e8e4c12c39cd480356842b6a8a06e41b23a55a5e3e191718838ddf"}, + {file = "pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:d396ec2b979760aaf3218e76c24e65bd0aca24983298653b3a9d7a45f9e47b30"}, + {file = "pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:86e1a4418c6cd97d60c95c71164158eaf7324fae7b0923264016baa993eba6fc"}, + {file = "pydantic_core-2.46.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:d51026d73fcfd93610abc7b27789c26b313920fcfb20e27462d74a7f8b06e983"}, + {file = "pydantic_core-2.46.4.tar.gz", hash = "sha256:62f875393d7f270851f20523dd2e29f082bcc82292d66db2b64ea71f64b6e1c1"}, +] + +[package.dependencies] +typing-extensions = ">=4.14.1" + [[package]] name = "pygments" version = "2.20.0" @@ -895,6 +2362,23 @@ files = [ [package.dependencies] six = ">=1.5" +[[package]] +name = "python-json-logger" +version = "4.0.0" +description = "JSON Log Formatter for the Python Logging Package" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python_json_logger-4.0.0-py3-none-any.whl", hash = "sha256:af09c9daf6a813aa4cc7180395f50f2a9e5fa056034c9953aec92e381c5ba1e2"}, + {file = "python_json_logger-4.0.0.tar.gz", hash = "sha256:f58e68eb46e1faed27e0f574a55a0455eecd7b8a5b88b85a784519ba3cff047f"}, +] + +[package.dependencies] +typing_extensions = {version = "*", markers = "python_version < \"3.10\""} + +[package.extras] +dev = ["backports.zoneinfo", "black", "build", "freezegun", "mdx_truly_sane_lists", "mike", "mkdocs", "mkdocs-awesome-pages-plugin", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-material (>=8.5)", "mkdocstrings[python]", "msgspec", "mypy", "orjson", "pylint", "pytest", "tzdata", "validate-pyproject[all]"] + [[package]] name = "pytz" version = "2026.2" @@ -906,6 +2390,61 @@ files = [ {file = "pytz-2026.2.tar.gz", hash = "sha256:0e60b47b29f21574376f218fe21abc009894a2321ea16c6754f3cad6eb7cdd6a"}, ] +[[package]] +name = "pywin32" +version = "312" +description = "Python for Windows Extensions" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pywin32-312-cp310-cp310-win32.whl", hash = "sha256:772235332b5d1024c696f11cea1ae4be7930f0a8b894bb43db14e3f435f1ff7e"}, + {file = "pywin32-312-cp310-cp310-win_amd64.whl", hash = "sha256:5dbc35d2b5320dc07f25fa31269cfb767471002b17de5eb067d03da68c7cb2db"}, + {file = "pywin32-312-cp310-cp310-win_arm64.whl", hash = "sha256:3020656e34f1cf7faeb7bccd2b84653a607c6ff0c55ada85e6487d61716deabd"}, + {file = "pywin32-312-cp311-cp311-win32.whl", hash = "sha256:17948aeadbdb091f0ced6ef0841620794e68327b94ee415571c1203594b7215c"}, + {file = "pywin32-312-cp311-cp311-win_amd64.whl", hash = "sha256:d11417d84412f859b722fad0841b3614459ed0047f7542d8362e77884f6b6e8a"}, + {file = "pywin32-312-cp311-cp311-win_arm64.whl", hash = "sha256:b2200a054ca6d6625c4842fc56a4976a4b47f96b73dbe5538c3f813a80359f47"}, + {file = "pywin32-312-cp312-cp312-win32.whl", hash = "sha256:dab4f65ac9c4e48400a2a0530c46c3c579cd5905ecd11b80692373915269208b"}, + {file = "pywin32-312-cp312-cp312-win_amd64.whl", hash = "sha256:b457f6d628a47e8a7346ce22acb7e1a46a4a78b52e1d17e1af56871bd19a93bc"}, + {file = "pywin32-312-cp312-cp312-win_arm64.whl", hash = "sha256:6017c58e12f6809fbb0555b75df144c2922a9ffd18e4b9b5afa863b6c1a9d950"}, + {file = "pywin32-312-cp313-cp313-win32.whl", hash = "sha256:7a27df850933d16a8eabfbaeb73d52b273e2da667f80d70b01a89d1f6828d02c"}, + {file = "pywin32-312-cp313-cp313-win_amd64.whl", hash = "sha256:c53e878d15a1c44788082bfe712a905433473aa38f86375b7cf8b45e3acbaaf9"}, + {file = "pywin32-312-cp313-cp313-win_arm64.whl", hash = "sha256:59aba5d5940842075343a5ddc6b11f1cdf0d1567fe745290359dfbcc7c2eb831"}, + {file = "pywin32-312-cp314-cp314-win32.whl", hash = "sha256:a77a90fbb6881238d2ca9c6fd797b25817f3768fe78d214a90137ff055a75f5b"}, + {file = "pywin32-312-cp314-cp314-win_amd64.whl", hash = "sha256:a4dd3a848290ef724347b19f301045831d8e802fa4464f491b98b1e0a081432e"}, + {file = "pywin32-312-cp314-cp314-win_arm64.whl", hash = "sha256:9fce94568364e0155e6dfb781ac5d95903be8baf28670632beab1b523f300daa"}, + {file = "pywin32-312-cp315-cp315-win32.whl", hash = "sha256:5c1fbe4a937a73ae9297384a3da38518cbc694c68ad8a809b2e19acd350f03ed"}, + {file = "pywin32-312-cp315-cp315-win_amd64.whl", hash = "sha256:c2f03a0f73f804a13c2735b99392b0cd426bb4f2c4d0178e5ac966a0f21618d5"}, + {file = "pywin32-312-cp315-cp315-win_arm64.whl", hash = "sha256:a8597d28f267b39074aef51fa593530082b39cbe5a074226096857b1fed2dfb9"}, + {file = "pywin32-312-cp39-cp39-win32.whl", hash = "sha256:d620900033cc7531e50727c3c8333091df5dd3ffe6d68cdca38c03f5821408d5"}, + {file = "pywin32-312-cp39-cp39-win_amd64.whl", hash = "sha256:dc90147579a905b8635e1b0ec6514967dcb07e6e0d9c42f1477feef14cac23bb"}, + {file = "pywin32-312-cp39-cp39-win_arm64.whl", hash = "sha256:02ebca0f0242b75292e218065004310d6a477407c09fa449bfe4f6022bc0c0fc"}, +] + +[[package]] +name = "pywinpty" +version = "3.0.3" +description = "Pseudo terminal support for Windows from Python." +optional = false +python-versions = ">=3.9" +files = [ + {file = "pywinpty-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:ff05f12d775b142b11c6fe085129bdd759b61cf7d41da6c745e78e3a1ef5bf40"}, + {file = "pywinpty-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:340ccacb4d74278a631923794ccd758471cfc8eeeeee4610b280420a17ad1e82"}, + {file = "pywinpty-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:dff25a9a6435f527d7c65608a7e62783fc12076e7d44487a4911ee91be5a8ac8"}, + {file = "pywinpty-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:fbc1e230e5b193eef4431cba3f39996a288f9958f9c9f092c8a961d930ee8f68"}, + {file = "pywinpty-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:c9081df0e49ffa86d15db4a6ba61530630e48707f987df42c9d3313537e81fc0"}, + {file = "pywinpty-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:15e79d870e18b678fb8a5a6105fd38496b55697c66e6fc0378236026bc4d59e9"}, + {file = "pywinpty-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9c91dbb026050c77bdcef964e63a4f10f01a639113c4d3658332614544c467ab"}, + {file = "pywinpty-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:fe1f7911805127c94cf51f89ab14096c6f91ffdcacf993d2da6082b2142a2523"}, + {file = "pywinpty-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:3f07a6cf1c1d470d284e614733c3d0f726d2c85e78508ea10a403140c3c0c18a"}, + {file = "pywinpty-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:15c7c0b6f8e9d87aabbaff76468dabf6e6121332c40fc1d83548d02a9d6a3759"}, + {file = "pywinpty-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:d4b6b7b0fe0cdcd02e956bd57cfe9f4e5a06514eecf3b5ae174da4f951b58be9"}, + {file = "pywinpty-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:34789d685fc0d547ce0c8a65e5a70e56f77d732fa6e03c8f74fefb8cbb252019"}, + {file = "pywinpty-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:0c37e224a47a971d1a6e08649a1714dac4f63c11920780977829ed5c8cadead1"}, + {file = "pywinpty-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:c4e9c3dff7d86ba81937438d5819f19f385a39d8f592d4e8af67148ceb4f6ab5"}, + {file = "pywinpty-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:0f10e81d52d7f2c4d927f645f247028e64eaf205a3ed9e64dbd998122108a218"}, + {file = "pywinpty-3.0.3.tar.gz", hash = "sha256:523441dc34d231fb361b4b00f8c99d3f16de02f5005fd544a0183112bcc22412"}, +] + [[package]] name = "pyyaml" version = "6.0.3" @@ -988,6 +2527,126 @@ files = [ {file = "pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f"}, ] +[[package]] +name = "pyzmq" +version = "27.1.0" +description = "Python bindings for 0MQ" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyzmq-27.1.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:508e23ec9bc44c0005c4946ea013d9317ae00ac67778bd47519fdf5a0e930ff4"}, + {file = "pyzmq-27.1.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:507b6f430bdcf0ee48c0d30e734ea89ce5567fd7b8a0f0044a369c176aa44556"}, + {file = "pyzmq-27.1.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf7b38f9fd7b81cb6d9391b2946382c8237fd814075c6aa9c3b746d53076023b"}, + {file = "pyzmq-27.1.0-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:03ff0b279b40d687691a6217c12242ee71f0fba28bf8626ff50e3ef0f4410e1e"}, + {file = "pyzmq-27.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:677e744fee605753eac48198b15a2124016c009a11056f93807000ab11ce6526"}, + {file = "pyzmq-27.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dd2fec2b13137416a1c5648b7009499bcc8fea78154cd888855fa32514f3dad1"}, + {file = "pyzmq-27.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:08e90bb4b57603b84eab1d0ca05b3bbb10f60c1839dc471fc1c9e1507bef3386"}, + {file = "pyzmq-27.1.0-cp310-cp310-win32.whl", hash = "sha256:a5b42d7a0658b515319148875fcb782bbf118dd41c671b62dae33666c2213bda"}, + {file = "pyzmq-27.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:c0bb87227430ee3aefcc0ade2088100e528d5d3298a0a715a64f3d04c60ba02f"}, + {file = "pyzmq-27.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:9a916f76c2ab8d045b19f2286851a38e9ac94ea91faf65bd64735924522a8b32"}, + {file = "pyzmq-27.1.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:226b091818d461a3bef763805e75685e478ac17e9008f49fce2d3e52b3d58b86"}, + {file = "pyzmq-27.1.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:0790a0161c281ca9723f804871b4027f2e8b5a528d357c8952d08cd1a9c15581"}, + {file = "pyzmq-27.1.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c895a6f35476b0c3a54e3eb6ccf41bf3018de937016e6e18748317f25d4e925f"}, + {file = "pyzmq-27.1.0-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bbf8d3630bf96550b3be8e1fc0fea5cbdc8d5466c1192887bd94869da17a63e"}, + {file = "pyzmq-27.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:15c8bd0fe0dabf808e2d7a681398c4e5ded70a551ab47482067a572c054c8e2e"}, + {file = "pyzmq-27.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bafcb3dd171b4ae9f19ee6380dfc71ce0390fefaf26b504c0e5f628d7c8c54f2"}, + {file = "pyzmq-27.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e829529fcaa09937189178115c49c504e69289abd39967cd8a4c215761373394"}, + {file = "pyzmq-27.1.0-cp311-cp311-win32.whl", hash = "sha256:6df079c47d5902af6db298ec92151db82ecb557af663098b92f2508c398bb54f"}, + {file = "pyzmq-27.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:190cbf120fbc0fc4957b56866830def56628934a9d112aec0e2507aa6a032b97"}, + {file = "pyzmq-27.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:eca6b47df11a132d1745eb3b5b5e557a7dae2c303277aa0e69c6ba91b8736e07"}, + {file = "pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:452631b640340c928fa343801b0d07eb0c3789a5ffa843f6e1a9cee0ba4eb4fc"}, + {file = "pyzmq-27.1.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1c179799b118e554b66da67d88ed66cd37a169f1f23b5d9f0a231b4e8d44a113"}, + {file = "pyzmq-27.1.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3837439b7f99e60312f0c926a6ad437b067356dc2bc2ec96eb395fd0fe804233"}, + {file = "pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43ad9a73e3da1fab5b0e7e13402f0b2fb934ae1c876c51d0afff0e7c052eca31"}, + {file = "pyzmq-27.1.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0de3028d69d4cdc475bfe47a6128eb38d8bc0e8f4d69646adfbcd840facbac28"}, + {file = "pyzmq-27.1.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:cf44a7763aea9298c0aa7dbf859f87ed7012de8bda0f3977b6fb1d96745df856"}, + {file = "pyzmq-27.1.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f30f395a9e6fbca195400ce833c731e7b64c3919aa481af4d88c3759e0cb7496"}, + {file = "pyzmq-27.1.0-cp312-abi3-win32.whl", hash = "sha256:250e5436a4ba13885494412b3da5d518cd0d3a278a1ae640e113c073a5f88edd"}, + {file = "pyzmq-27.1.0-cp312-abi3-win_amd64.whl", hash = "sha256:9ce490cf1d2ca2ad84733aa1d69ce6855372cb5ce9223802450c9b2a7cba0ccf"}, + {file = "pyzmq-27.1.0-cp312-abi3-win_arm64.whl", hash = "sha256:75a2f36223f0d535a0c919e23615fc85a1e23b71f40c7eb43d7b1dedb4d8f15f"}, + {file = "pyzmq-27.1.0-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:93ad4b0855a664229559e45c8d23797ceac03183c7b6f5b4428152a6b06684a5"}, + {file = "pyzmq-27.1.0-cp313-cp313-android_24_x86_64.whl", hash = "sha256:fbb4f2400bfda24f12f009cba62ad5734148569ff4949b1b6ec3b519444342e6"}, + {file = "pyzmq-27.1.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:e343d067f7b151cfe4eb3bb796a7752c9d369eed007b91231e817071d2c2fec7"}, + {file = "pyzmq-27.1.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:08363b2011dec81c354d694bdecaef4770e0ae96b9afea70b3f47b973655cc05"}, + {file = "pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d54530c8c8b5b8ddb3318f481297441af102517602b569146185fa10b63f4fa9"}, + {file = "pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f3afa12c392f0a44a2414056d730eebc33ec0926aae92b5ad5cf26ebb6cc128"}, + {file = "pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c65047adafe573ff023b3187bb93faa583151627bc9c51fc4fb2c561ed689d39"}, + {file = "pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:90e6e9441c946a8b0a667356f7078d96411391a3b8f80980315455574177ec97"}, + {file = "pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:add071b2d25f84e8189aaf0882d39a285b42fa3853016ebab234a5e78c7a43db"}, + {file = "pyzmq-27.1.0-cp313-cp313t-win32.whl", hash = "sha256:7ccc0700cfdf7bd487bea8d850ec38f204478681ea02a582a8da8171b7f90a1c"}, + {file = "pyzmq-27.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:8085a9fba668216b9b4323be338ee5437a235fe275b9d1610e422ccc279733e2"}, + {file = "pyzmq-27.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:6bb54ca21bcfe361e445256c15eedf083f153811c37be87e0514934d6913061e"}, + {file = "pyzmq-27.1.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ce980af330231615756acd5154f29813d553ea555485ae712c491cd483df6b7a"}, + {file = "pyzmq-27.1.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1779be8c549e54a1c38f805e56d2a2e5c009d26de10921d7d51cfd1c8d4632ea"}, + {file = "pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7200bb0f03345515df50d99d3db206a0a6bee1955fbb8c453c76f5bf0e08fb96"}, + {file = "pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01c0e07d558b06a60773744ea6251f769cd79a41a97d11b8bf4ab8f034b0424d"}, + {file = "pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:80d834abee71f65253c91540445d37c4c561e293ba6e741b992f20a105d69146"}, + {file = "pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:544b4e3b7198dde4a62b8ff6685e9802a9a1ebf47e77478a5eb88eca2a82f2fd"}, + {file = "pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cedc4c68178e59a4046f97eca31b148ddcf51e88677de1ef4e78cf06c5376c9a"}, + {file = "pyzmq-27.1.0-cp314-cp314t-win32.whl", hash = "sha256:1f0b2a577fd770aa6f053211a55d1c47901f4d537389a034c690291485e5fe92"}, + {file = "pyzmq-27.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:19c9468ae0437f8074af379e986c5d3d7d7bfe033506af442e8c879732bedbe0"}, + {file = "pyzmq-27.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dc5dbf68a7857b59473f7df42650c621d7e8923fb03fa74a526890f4d33cc4d7"}, + {file = "pyzmq-27.1.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:18339186c0ed0ce5835f2656cdfb32203125917711af64da64dbaa3d949e5a1b"}, + {file = "pyzmq-27.1.0-cp38-cp38-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:753d56fba8f70962cd8295fb3edb40b9b16deaa882dd2b5a3a2039f9ff7625aa"}, + {file = "pyzmq-27.1.0-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b721c05d932e5ad9ff9344f708c96b9e1a485418c6618d765fca95d4daacfbef"}, + {file = "pyzmq-27.1.0-cp38-cp38-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7be883ff3d722e6085ee3f4afc057a50f7f2e0c72d289fd54df5706b4e3d3a50"}, + {file = "pyzmq-27.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:b2e592db3a93128daf567de9650a2f3859017b3f7a66bc4ed6e4779d6034976f"}, + {file = "pyzmq-27.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ad68808a61cbfbbae7ba26d6233f2a4aa3b221de379ce9ee468aa7a83b9c36b0"}, + {file = "pyzmq-27.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:e2687c2d230e8d8584fbea433c24382edfeda0c60627aca3446aa5e58d5d1831"}, + {file = "pyzmq-27.1.0-cp38-cp38-win32.whl", hash = "sha256:a1aa0ee920fb3825d6c825ae3f6c508403b905b698b6460408ebd5bb04bbb312"}, + {file = "pyzmq-27.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:df7cd397ece96cf20a76fae705d40efbab217d217897a5053267cd88a700c266"}, + {file = "pyzmq-27.1.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:96c71c32fff75957db6ae33cd961439f386505c6e6b377370af9b24a1ef9eafb"}, + {file = "pyzmq-27.1.0-cp39-cp39-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:49d3980544447f6bd2968b6ac913ab963a49dcaa2d4a2990041f16057b04c429"}, + {file = "pyzmq-27.1.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:849ca054d81aa1c175c49484afaaa5db0622092b5eccb2055f9f3bb8f703782d"}, + {file = "pyzmq-27.1.0-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3970778e74cb7f85934d2b926b9900e92bfe597e62267d7499acc39c9c28e345"}, + {file = "pyzmq-27.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:da96ecdcf7d3919c3be2de91a8c513c186f6762aa6cf7c01087ed74fad7f0968"}, + {file = "pyzmq-27.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:9541c444cfe1b1c0156c5c86ece2bb926c7079a18e7b47b0b1b3b1b875e5d098"}, + {file = "pyzmq-27.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e30a74a39b93e2e1591b58eb1acef4902be27c957a8720b0e368f579b82dc22f"}, + {file = "pyzmq-27.1.0-cp39-cp39-win32.whl", hash = "sha256:b1267823d72d1e40701dcba7edc45fd17f71be1285557b7fe668887150a14b78"}, + {file = "pyzmq-27.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:0c996ded912812a2fcd7ab6574f4ad3edc27cb6510349431e4930d4196ade7db"}, + {file = "pyzmq-27.1.0-cp39-cp39-win_arm64.whl", hash = "sha256:346e9ba4198177a07e7706050f35d733e08c1c1f8ceacd5eb6389d653579ffbc"}, + {file = "pyzmq-27.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c17e03cbc9312bee223864f1a2b13a99522e0dc9f7c5df0177cd45210ac286e6"}, + {file = "pyzmq-27.1.0-pp310-pypy310_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:f328d01128373cb6763823b2b4e7f73bdf767834268c565151eacb3b7a392f90"}, + {file = "pyzmq-27.1.0-pp310-pypy310_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c1790386614232e1b3a40a958454bdd42c6d1811837b15ddbb052a032a43f62"}, + {file = "pyzmq-27.1.0-pp310-pypy310_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:448f9cb54eb0cee4732b46584f2710c8bc178b0e5371d9e4fc8125201e413a74"}, + {file = "pyzmq-27.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:05b12f2d32112bf8c95ef2e74ec4f1d4beb01f8b5e703b38537f8849f92cb9ba"}, + {file = "pyzmq-27.1.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:18770c8d3563715387139060d37859c02ce40718d1faf299abddcdcc6a649066"}, + {file = "pyzmq-27.1.0-pp311-pypy311_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:ac25465d42f92e990f8d8b0546b01c391ad431c3bf447683fdc40565941d0604"}, + {file = "pyzmq-27.1.0-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53b40f8ae006f2734ee7608d59ed661419f087521edbfc2149c3932e9c14808c"}, + {file = "pyzmq-27.1.0-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f605d884e7c8be8fe1aa94e0a783bf3f591b84c24e4bc4f3e7564c82ac25e271"}, + {file = "pyzmq-27.1.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c9f7f6e13dff2e44a6afeaf2cf54cee5929ad64afaf4d40b50f93c58fc687355"}, + {file = "pyzmq-27.1.0-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:50081a4e98472ba9f5a02850014b4c9b629da6710f8f14f3b15897c666a28f1b"}, + {file = "pyzmq-27.1.0-pp38-pypy38_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:510869f9df36ab97f89f4cff9d002a89ac554c7ac9cadd87d444aa4cf66abd27"}, + {file = "pyzmq-27.1.0-pp38-pypy38_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1f8426a01b1c4098a750973c37131cf585f61c7911d735f729935a0c701b68d3"}, + {file = "pyzmq-27.1.0-pp38-pypy38_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:726b6a502f2e34c6d2ada5e702929586d3ac948a4dbbb7fed9854ec8c0466027"}, + {file = "pyzmq-27.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:bd67e7c8f4654bef471c0b1ca6614af0b5202a790723a58b79d9584dc8022a78"}, + {file = "pyzmq-27.1.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:722ea791aa233ac0a819fc2c475e1292c76930b31f1d828cb61073e2fe5e208f"}, + {file = "pyzmq-27.1.0-pp39-pypy39_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:01f9437501886d3a1dd4b02ef59fb8cc384fa718ce066d52f175ee49dd5b7ed8"}, + {file = "pyzmq-27.1.0-pp39-pypy39_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4a19387a3dddcc762bfd2f570d14e2395b2c9701329b266f83dd87a2b3cbd381"}, + {file = "pyzmq-27.1.0-pp39-pypy39_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c618fbcd069e3a29dcd221739cacde52edcc681f041907867e0f5cc7e85f172"}, + {file = "pyzmq-27.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ff8d114d14ac671d88c89b9224c63d6c4e5a613fe8acd5594ce53d752a3aafe9"}, + {file = "pyzmq-27.1.0.tar.gz", hash = "sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540"}, +] + +[package.dependencies] +cffi = {version = "*", markers = "implementation_name == \"pypy\""} + +[[package]] +name = "referencing" +version = "0.36.2" +description = "JSON Referencing + Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0"}, + {file = "referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" +typing-extensions = {version = ">=4.4.0", markers = "python_version < \"3.13\""} + [[package]] name = "requests" version = "2.32.5" @@ -1009,6 +2668,48 @@ urllib3 = ">=1.21.1,<3" socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] +[[package]] +name = "rfc3339-validator" +version = "0.1.4" +description = "A pure python RFC3339 validator" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa"}, + {file = "rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b"}, +] + +[package.dependencies] +six = "*" + +[[package]] +name = "rfc3986-validator" +version = "0.1.1" +description = "Pure python rfc3986 validator" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9"}, + {file = "rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055"}, +] + +[[package]] +name = "rfc3987-syntax" +version = "1.1.0" +description = "Helper functions to syntactically validate strings according to RFC 3987." +optional = false +python-versions = ">=3.9" +files = [ + {file = "rfc3987_syntax-1.1.0-py3-none-any.whl", hash = "sha256:6c3d97604e4c5ce9f714898e05401a0445a641cfa276432b0a648c80856f6a3f"}, + {file = "rfc3987_syntax-1.1.0.tar.gz", hash = "sha256:717a62cbf33cffdd16dfa3a497d81ce48a660ea691b1ddd7be710c22f00b4a0d"}, +] + +[package.dependencies] +lark = ">=1.2.2" + +[package.extras] +testing = ["pytest (>=8.3.5)"] + [[package]] name = "rich" version = "15.0.0" @@ -1047,6 +2748,185 @@ typing_extensions = ">=4" dev = ["mypy", "packaging", "pre-commit", "pytest", "pytest-cov", "rich-codex", "ruff", "types-setuptools"] docs = ["markdown_include", "mkdocs", "mkdocs-glightbox", "mkdocs-material-extensions", "mkdocs-material[imaging] (>=9.5.18,<9.6.0)", "mkdocs-rss-plugin", "mkdocstrings[python]", "rich-codex"] +[[package]] +name = "rpds-py" +version = "0.27.1" +description = "Python bindings to Rust's persistent data structures (rpds)" +optional = false +python-versions = ">=3.9" +files = [ + {file = "rpds_py-0.27.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:68afeec26d42ab3b47e541b272166a0b4400313946871cba3ed3a4fc0cab1cef"}, + {file = "rpds_py-0.27.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74e5b2f7bb6fa38b1b10546d27acbacf2a022a8b5543efb06cfebc72a59c85be"}, + {file = "rpds_py-0.27.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9024de74731df54546fab0bfbcdb49fae19159ecaecfc8f37c18d2c7e2c0bd61"}, + {file = "rpds_py-0.27.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:31d3ebadefcd73b73928ed0b2fd696f7fefda8629229f81929ac9c1854d0cffb"}, + {file = "rpds_py-0.27.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2e7f8f169d775dd9092a1743768d771f1d1300453ddfe6325ae3ab5332b4657"}, + {file = "rpds_py-0.27.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d905d16f77eb6ab2e324e09bfa277b4c8e5e6b8a78a3e7ff8f3cdf773b4c013"}, + {file = "rpds_py-0.27.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50c946f048209e6362e22576baea09193809f87687a95a8db24e5fbdb307b93a"}, + {file = "rpds_py-0.27.1-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:3deab27804d65cd8289eb814c2c0e807c4b9d9916c9225e363cb0cf875eb67c1"}, + {file = "rpds_py-0.27.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8b61097f7488de4be8244c89915da8ed212832ccf1e7c7753a25a394bf9b1f10"}, + {file = "rpds_py-0.27.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8a3f29aba6e2d7d90528d3c792555a93497fe6538aa65eb675b44505be747808"}, + {file = "rpds_py-0.27.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dd6cd0485b7d347304067153a6dc1d73f7d4fd995a396ef32a24d24b8ac63ac8"}, + {file = "rpds_py-0.27.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6f4461bf931108c9fa226ffb0e257c1b18dc2d44cd72b125bec50ee0ab1248a9"}, + {file = "rpds_py-0.27.1-cp310-cp310-win32.whl", hash = "sha256:ee5422d7fb21f6a00c1901bf6559c49fee13a5159d0288320737bbf6585bd3e4"}, + {file = "rpds_py-0.27.1-cp310-cp310-win_amd64.whl", hash = "sha256:3e039aabf6d5f83c745d5f9a0a381d031e9ed871967c0a5c38d201aca41f3ba1"}, + {file = "rpds_py-0.27.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:be898f271f851f68b318872ce6ebebbc62f303b654e43bf72683dbdc25b7c881"}, + {file = "rpds_py-0.27.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:62ac3d4e3e07b58ee0ddecd71d6ce3b1637de2d373501412df395a0ec5f9beb5"}, + {file = "rpds_py-0.27.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4708c5c0ceb2d034f9991623631d3d23cb16e65c83736ea020cdbe28d57c0a0e"}, + {file = "rpds_py-0.27.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:abfa1171a9952d2e0002aba2ad3780820b00cc3d9c98c6630f2e93271501f66c"}, + {file = "rpds_py-0.27.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b507d19f817ebaca79574b16eb2ae412e5c0835542c93fe9983f1e432aca195"}, + {file = "rpds_py-0.27.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:168b025f8fd8d8d10957405f3fdcef3dc20f5982d398f90851f4abc58c566c52"}, + {file = "rpds_py-0.27.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb56c6210ef77caa58e16e8c17d35c63fe3f5b60fd9ba9d424470c3400bcf9ed"}, + {file = "rpds_py-0.27.1-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:d252f2d8ca0195faa707f8eb9368955760880b2b42a8ee16d382bf5dd807f89a"}, + {file = "rpds_py-0.27.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6e5e54da1e74b91dbc7996b56640f79b195d5925c2b78efaa8c5d53e1d88edde"}, + {file = "rpds_py-0.27.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ffce0481cc6e95e5b3f0a47ee17ffbd234399e6d532f394c8dce320c3b089c21"}, + {file = "rpds_py-0.27.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a205fdfe55c90c2cd8e540ca9ceba65cbe6629b443bc05db1f590a3db8189ff9"}, + {file = "rpds_py-0.27.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:689fb5200a749db0415b092972e8eba85847c23885c8543a8b0f5c009b1a5948"}, + {file = "rpds_py-0.27.1-cp311-cp311-win32.whl", hash = "sha256:3182af66048c00a075010bc7f4860f33913528a4b6fc09094a6e7598e462fe39"}, + {file = "rpds_py-0.27.1-cp311-cp311-win_amd64.whl", hash = "sha256:b4938466c6b257b2f5c4ff98acd8128ec36b5059e5c8f8372d79316b1c36bb15"}, + {file = "rpds_py-0.27.1-cp311-cp311-win_arm64.whl", hash = "sha256:2f57af9b4d0793e53266ee4325535a31ba48e2f875da81a9177c9926dfa60746"}, + {file = "rpds_py-0.27.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ae2775c1973e3c30316892737b91f9283f9908e3cc7625b9331271eaaed7dc90"}, + {file = "rpds_py-0.27.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2643400120f55c8a96f7c9d858f7be0c88d383cd4653ae2cf0d0c88f668073e5"}, + {file = "rpds_py-0.27.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16323f674c089b0360674a4abd28d5042947d54ba620f72514d69be4ff64845e"}, + {file = "rpds_py-0.27.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a1f4814b65eacac94a00fc9a526e3fdafd78e439469644032032d0d63de4881"}, + {file = "rpds_py-0.27.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ba32c16b064267b22f1850a34051121d423b6f7338a12b9459550eb2096e7ec"}, + {file = "rpds_py-0.27.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5c20f33fd10485b80f65e800bbe5f6785af510b9f4056c5a3c612ebc83ba6cb"}, + {file = "rpds_py-0.27.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:466bfe65bd932da36ff279ddd92de56b042f2266d752719beb97b08526268ec5"}, + {file = "rpds_py-0.27.1-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:41e532bbdcb57c92ba3be62c42e9f096431b4cf478da9bc3bc6ce5c38ab7ba7a"}, + {file = "rpds_py-0.27.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f149826d742b406579466283769a8ea448eed82a789af0ed17b0cd5770433444"}, + {file = "rpds_py-0.27.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:80c60cfb5310677bd67cb1e85a1e8eb52e12529545441b43e6f14d90b878775a"}, + {file = "rpds_py-0.27.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7ee6521b9baf06085f62ba9c7a3e5becffbc32480d2f1b351559c001c38ce4c1"}, + {file = "rpds_py-0.27.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a512c8263249a9d68cac08b05dd59d2b3f2061d99b322813cbcc14c3c7421998"}, + {file = "rpds_py-0.27.1-cp312-cp312-win32.whl", hash = "sha256:819064fa048ba01b6dadc5116f3ac48610435ac9a0058bbde98e569f9e785c39"}, + {file = "rpds_py-0.27.1-cp312-cp312-win_amd64.whl", hash = "sha256:d9199717881f13c32c4046a15f024971a3b78ad4ea029e8da6b86e5aa9cf4594"}, + {file = "rpds_py-0.27.1-cp312-cp312-win_arm64.whl", hash = "sha256:33aa65b97826a0e885ef6e278fbd934e98cdcfed80b63946025f01e2f5b29502"}, + {file = "rpds_py-0.27.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:e4b9fcfbc021633863a37e92571d6f91851fa656f0180246e84cbd8b3f6b329b"}, + {file = "rpds_py-0.27.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1441811a96eadca93c517d08df75de45e5ffe68aa3089924f963c782c4b898cf"}, + {file = "rpds_py-0.27.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55266dafa22e672f5a4f65019015f90336ed31c6383bd53f5e7826d21a0e0b83"}, + {file = "rpds_py-0.27.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d78827d7ac08627ea2c8e02c9e5b41180ea5ea1f747e9db0915e3adf36b62dcf"}, + {file = "rpds_py-0.27.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae92443798a40a92dc5f0b01d8a7c93adde0c4dc965310a29ae7c64d72b9fad2"}, + {file = "rpds_py-0.27.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c46c9dd2403b66a2a3b9720ec4b74d4ab49d4fabf9f03dfdce2d42af913fe8d0"}, + {file = "rpds_py-0.27.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2efe4eb1d01b7f5f1939f4ef30ecea6c6b3521eec451fb93191bf84b2a522418"}, + {file = "rpds_py-0.27.1-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:15d3b4d83582d10c601f481eca29c3f138d44c92187d197aff663a269197c02d"}, + {file = "rpds_py-0.27.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4ed2e16abbc982a169d30d1a420274a709949e2cbdef119fe2ec9d870b42f274"}, + {file = "rpds_py-0.27.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a75f305c9b013289121ec0f1181931975df78738cdf650093e6b86d74aa7d8dd"}, + {file = "rpds_py-0.27.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:67ce7620704745881a3d4b0ada80ab4d99df390838839921f99e63c474f82cf2"}, + {file = "rpds_py-0.27.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d992ac10eb86d9b6f369647b6a3f412fc0075cfd5d799530e84d335e440a002"}, + {file = "rpds_py-0.27.1-cp313-cp313-win32.whl", hash = "sha256:4f75e4bd8ab8db624e02c8e2fc4063021b58becdbe6df793a8111d9343aec1e3"}, + {file = "rpds_py-0.27.1-cp313-cp313-win_amd64.whl", hash = "sha256:f9025faafc62ed0b75a53e541895ca272815bec18abe2249ff6501c8f2e12b83"}, + {file = "rpds_py-0.27.1-cp313-cp313-win_arm64.whl", hash = "sha256:ed10dc32829e7d222b7d3b93136d25a406ba9788f6a7ebf6809092da1f4d279d"}, + {file = "rpds_py-0.27.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:92022bbbad0d4426e616815b16bc4127f83c9a74940e1ccf3cfe0b387aba0228"}, + {file = "rpds_py-0.27.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:47162fdab9407ec3f160805ac3e154df042e577dd53341745fc7fb3f625e6d92"}, + {file = "rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb89bec23fddc489e5d78b550a7b773557c9ab58b7946154a10a6f7a214a48b2"}, + {file = "rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e48af21883ded2b3e9eb48cb7880ad8598b31ab752ff3be6457001d78f416723"}, + {file = "rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f5b7bd8e219ed50299e58551a410b64daafb5017d54bbe822e003856f06a802"}, + {file = "rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08f1e20bccf73b08d12d804d6e1c22ca5530e71659e6673bce31a6bb71c1e73f"}, + {file = "rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dc5dceeaefcc96dc192e3a80bbe1d6c410c469e97bdd47494a7d930987f18b2"}, + {file = "rpds_py-0.27.1-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:d76f9cc8665acdc0c9177043746775aa7babbf479b5520b78ae4002d889f5c21"}, + {file = "rpds_py-0.27.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:134fae0e36022edad8290a6661edf40c023562964efea0cc0ec7f5d392d2aaef"}, + {file = "rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:eb11a4f1b2b63337cfd3b4d110af778a59aae51c81d195768e353d8b52f88081"}, + {file = "rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:13e608ac9f50a0ed4faec0e90ece76ae33b34c0e8656e3dceb9a7db994c692cd"}, + {file = "rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dd2135527aa40f061350c3f8f89da2644de26cd73e4de458e79606384f4f68e7"}, + {file = "rpds_py-0.27.1-cp313-cp313t-win32.whl", hash = "sha256:3020724ade63fe320a972e2ffd93b5623227e684315adce194941167fee02688"}, + {file = "rpds_py-0.27.1-cp313-cp313t-win_amd64.whl", hash = "sha256:8ee50c3e41739886606388ba3ab3ee2aae9f35fb23f833091833255a31740797"}, + {file = "rpds_py-0.27.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:acb9aafccaae278f449d9c713b64a9e68662e7799dbd5859e2c6b3c67b56d334"}, + {file = "rpds_py-0.27.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:b7fb801aa7f845ddf601c49630deeeccde7ce10065561d92729bfe81bd21fb33"}, + {file = "rpds_py-0.27.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe0dd05afb46597b9a2e11c351e5e4283c741237e7f617ffb3252780cca9336a"}, + {file = "rpds_py-0.27.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b6dfb0e058adb12d8b1d1b25f686e94ffa65d9995a5157afe99743bf7369d62b"}, + {file = "rpds_py-0.27.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed090ccd235f6fa8bb5861684567f0a83e04f52dfc2e5c05f2e4b1309fcf85e7"}, + {file = "rpds_py-0.27.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf876e79763eecf3e7356f157540d6a093cef395b65514f17a356f62af6cc136"}, + {file = "rpds_py-0.27.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12ed005216a51b1d6e2b02a7bd31885fe317e45897de81d86dcce7d74618ffff"}, + {file = "rpds_py-0.27.1-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:ee4308f409a40e50593c7e3bb8cbe0b4d4c66d1674a316324f0c2f5383b486f9"}, + {file = "rpds_py-0.27.1-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0b08d152555acf1f455154d498ca855618c1378ec810646fcd7c76416ac6dc60"}, + {file = "rpds_py-0.27.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:dce51c828941973a5684d458214d3a36fcd28da3e1875d659388f4f9f12cc33e"}, + {file = "rpds_py-0.27.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:c1476d6f29eb81aa4151c9a31219b03f1f798dc43d8af1250a870735516a1212"}, + {file = "rpds_py-0.27.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3ce0cac322b0d69b63c9cdb895ee1b65805ec9ffad37639f291dd79467bee675"}, + {file = "rpds_py-0.27.1-cp314-cp314-win32.whl", hash = "sha256:dfbfac137d2a3d0725758cd141f878bf4329ba25e34979797c89474a89a8a3a3"}, + {file = "rpds_py-0.27.1-cp314-cp314-win_amd64.whl", hash = "sha256:a6e57b0abfe7cc513450fcf529eb486b6e4d3f8aee83e92eb5f1ef848218d456"}, + {file = "rpds_py-0.27.1-cp314-cp314-win_arm64.whl", hash = "sha256:faf8d146f3d476abfee026c4ae3bdd9ca14236ae4e4c310cbd1cf75ba33d24a3"}, + {file = "rpds_py-0.27.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:ba81d2b56b6d4911ce735aad0a1d4495e808b8ee4dc58715998741a26874e7c2"}, + {file = "rpds_py-0.27.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:84f7d509870098de0e864cad0102711c1e24e9b1a50ee713b65928adb22269e4"}, + {file = "rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9e960fc78fecd1100539f14132425e1d5fe44ecb9239f8f27f079962021523e"}, + {file = "rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:62f85b665cedab1a503747617393573995dac4600ff51869d69ad2f39eb5e817"}, + {file = "rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fed467af29776f6556250c9ed85ea5a4dd121ab56a5f8b206e3e7a4c551e48ec"}, + {file = "rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2729615f9d430af0ae6b36cf042cb55c0936408d543fb691e1a9e36648fd35a"}, + {file = "rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b207d881a9aef7ba753d69c123a35d96ca7cb808056998f6b9e8747321f03b8"}, + {file = "rpds_py-0.27.1-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:639fd5efec029f99b79ae47e5d7e00ad8a773da899b6309f6786ecaf22948c48"}, + {file = "rpds_py-0.27.1-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fecc80cb2a90e28af8a9b366edacf33d7a91cbfe4c2c4544ea1246e949cfebeb"}, + {file = "rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:42a89282d711711d0a62d6f57d81aa43a1368686c45bc1c46b7f079d55692734"}, + {file = "rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:cf9931f14223de59551ab9d38ed18d92f14f055a5f78c1d8ad6493f735021bbb"}, + {file = "rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f39f58a27cc6e59f432b568ed8429c7e1641324fbe38131de852cd77b2d534b0"}, + {file = "rpds_py-0.27.1-cp314-cp314t-win32.whl", hash = "sha256:d5fa0ee122dc09e23607a28e6d7b150da16c662e66409bbe85230e4c85bb528a"}, + {file = "rpds_py-0.27.1-cp314-cp314t-win_amd64.whl", hash = "sha256:6567d2bb951e21232c2f660c24cf3470bb96de56cdcb3f071a83feeaff8a2772"}, + {file = "rpds_py-0.27.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c918c65ec2e42c2a78d19f18c553d77319119bf43aa9e2edf7fb78d624355527"}, + {file = "rpds_py-0.27.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1fea2b1a922c47c51fd07d656324531adc787e415c8b116530a1d29c0516c62d"}, + {file = "rpds_py-0.27.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbf94c58e8e0cd6b6f38d8de67acae41b3a515c26169366ab58bdca4a6883bb8"}, + {file = "rpds_py-0.27.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c2a8fed130ce946d5c585eddc7c8eeef0051f58ac80a8ee43bd17835c144c2cc"}, + {file = "rpds_py-0.27.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:037a2361db72ee98d829bc2c5b7cc55598ae0a5e0ec1823a56ea99374cfd73c1"}, + {file = "rpds_py-0.27.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5281ed1cc1d49882f9997981c88df1a22e140ab41df19071222f7e5fc4e72125"}, + {file = "rpds_py-0.27.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fd50659a069c15eef8aa3d64bbef0d69fd27bb4a50c9ab4f17f83a16cbf8905"}, + {file = "rpds_py-0.27.1-cp39-cp39-manylinux_2_31_riscv64.whl", hash = "sha256:c4b676c4ae3921649a15d28ed10025548e9b561ded473aa413af749503c6737e"}, + {file = "rpds_py-0.27.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:079bc583a26db831a985c5257797b2b5d3affb0386e7ff886256762f82113b5e"}, + {file = "rpds_py-0.27.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4e44099bd522cba71a2c6b97f68e19f40e7d85399de899d66cdb67b32d7cb786"}, + {file = "rpds_py-0.27.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e202e6d4188e53c6661af813b46c37ca2c45e497fc558bacc1a7630ec2695aec"}, + {file = "rpds_py-0.27.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f41f814b8eaa48768d1bb551591f6ba45f87ac76899453e8ccd41dba1289b04b"}, + {file = "rpds_py-0.27.1-cp39-cp39-win32.whl", hash = "sha256:9e71f5a087ead99563c11fdaceee83ee982fd39cf67601f4fd66cb386336ee52"}, + {file = "rpds_py-0.27.1-cp39-cp39-win_amd64.whl", hash = "sha256:71108900c9c3c8590697244b9519017a400d9ba26a36c48381b3f64743a44aab"}, + {file = "rpds_py-0.27.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7ba22cb9693df986033b91ae1d7a979bc399237d45fccf875b76f62bb9e52ddf"}, + {file = "rpds_py-0.27.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5b640501be9288c77738b5492b3fd3abc4ba95c50c2e41273c8a1459f08298d3"}, + {file = "rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb08b65b93e0c6dd70aac7f7890a9c0938d5ec71d5cb32d45cf844fb8ae47636"}, + {file = "rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d7ff07d696a7a38152ebdb8212ca9e5baab56656749f3d6004b34ab726b550b8"}, + {file = "rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fb7c72262deae25366e3b6c0c0ba46007967aea15d1eea746e44ddba8ec58dcc"}, + {file = "rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7b002cab05d6339716b03a4a3a2ce26737f6231d7b523f339fa061d53368c9d8"}, + {file = "rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23f6b69d1c26c4704fec01311963a41d7de3ee0570a84ebde4d544e5a1859ffc"}, + {file = "rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:530064db9146b247351f2a0250b8f00b289accea4596a033e94be2389977de71"}, + {file = "rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7b90b0496570bd6b0321724a330d8b545827c4df2034b6ddfc5f5275f55da2ad"}, + {file = "rpds_py-0.27.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:879b0e14a2da6a1102a3fc8af580fc1ead37e6d6692a781bd8c83da37429b5ab"}, + {file = "rpds_py-0.27.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:0d807710df3b5faa66c731afa162ea29717ab3be17bdc15f90f2d9f183da4059"}, + {file = "rpds_py-0.27.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:3adc388fc3afb6540aec081fa59e6e0d3908722771aa1e37ffe22b220a436f0b"}, + {file = "rpds_py-0.27.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c796c0c1cc68cb08b0284db4229f5af76168172670c74908fdbd4b7d7f515819"}, + {file = "rpds_py-0.27.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cdfe4bb2f9fe7458b7453ad3c33e726d6d1c7c0a72960bcc23800d77384e42df"}, + {file = "rpds_py-0.27.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:8fabb8fd848a5f75a2324e4a84501ee3a5e3c78d8603f83475441866e60b94a3"}, + {file = "rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eda8719d598f2f7f3e0f885cba8646644b55a187762bec091fa14a2b819746a9"}, + {file = "rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3c64d07e95606ec402a0a1c511fe003873fa6af630bda59bac77fac8b4318ebc"}, + {file = "rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93a2ed40de81bcff59aabebb626562d48332f3d028ca2036f1d23cbb52750be4"}, + {file = "rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:387ce8c44ae94e0ec50532d9cb0edce17311024c9794eb196b90e1058aadeb66"}, + {file = "rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aaf94f812c95b5e60ebaf8bfb1898a7d7cb9c1af5744d4a67fa47796e0465d4e"}, + {file = "rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:4848ca84d6ded9b58e474dfdbad4b8bfb450344c0551ddc8d958bf4b36aa837c"}, + {file = "rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2bde09cbcf2248b73c7c323be49b280180ff39fadcfe04e7b6f54a678d02a7cf"}, + {file = "rpds_py-0.27.1-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:94c44ee01fd21c9058f124d2d4f0c9dc7634bec93cd4b38eefc385dabe71acbf"}, + {file = "rpds_py-0.27.1-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:df8b74962e35c9249425d90144e721eed198e6555a0e22a563d29fe4486b51f6"}, + {file = "rpds_py-0.27.1-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:dc23e6820e3b40847e2f4a7726462ba0cf53089512abe9ee16318c366494c17a"}, + {file = "rpds_py-0.27.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:aa8933159edc50be265ed22b401125c9eebff3171f570258854dbce3ecd55475"}, + {file = "rpds_py-0.27.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a50431bf02583e21bf273c71b89d710e7a710ad5e39c725b14e685610555926f"}, + {file = "rpds_py-0.27.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78af06ddc7fe5cc0e967085a9115accee665fb912c22a3f54bad70cc65b05fe6"}, + {file = "rpds_py-0.27.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:70d0738ef8fee13c003b100c2fbd667ec4f133468109b3472d249231108283a3"}, + {file = "rpds_py-0.27.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2f6fd8a1cea5bbe599b6e78a6e5ee08db434fc8ffea51ff201c8765679698b3"}, + {file = "rpds_py-0.27.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8177002868d1426305bb5de1e138161c2ec9eb2d939be38291d7c431c4712df8"}, + {file = "rpds_py-0.27.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:008b839781d6c9bf3b6a8984d1d8e56f0ec46dc56df61fd669c49b58ae800400"}, + {file = "rpds_py-0.27.1-pp39-pypy39_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:a55b9132bb1ade6c734ddd2759c8dc132aa63687d259e725221f106b83a0e485"}, + {file = "rpds_py-0.27.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a46fdec0083a26415f11d5f236b79fa1291c32aaa4a17684d82f7017a1f818b1"}, + {file = "rpds_py-0.27.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:8a63b640a7845f2bdd232eb0d0a4a2dd939bcdd6c57e6bb134526487f3160ec5"}, + {file = "rpds_py-0.27.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:7e32721e5d4922deaaf963469d795d5bde6093207c52fec719bd22e5d1bedbc4"}, + {file = "rpds_py-0.27.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:2c426b99a068601b5f4623573df7a7c3d72e87533a2dd2253353a03e7502566c"}, + {file = "rpds_py-0.27.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4fc9b7fe29478824361ead6e14e4f5aed570d477e06088826537e202d25fe859"}, + {file = "rpds_py-0.27.1.tar.gz", hash = "sha256:26a1c73171d10b7acccbded82bf6a586ab8203601e565badc74bbbf8bc5a10f8"}, +] + +[[package]] +name = "send2trash" +version = "2.1.0" +description = "Send file to trash natively under Mac OS X, Windows and Linux" +optional = false +python-versions = ">=3.8" +files = [ + {file = "send2trash-2.1.0-py3-none-any.whl", hash = "sha256:0da2f112e6d6bb22de6aa6daa7e144831a4febf2a87261451c4ad849fe9a873c"}, + {file = "send2trash-2.1.0.tar.gz", hash = "sha256:1c72b39f09457db3c05ce1d19158c2cbef4c32b8bedd02c155e49282b7ea7459"}, +] + +[package.extras] +nativelib = ["pyobjc (>=9.0)", "pywin32 (>=305)"] +test = ["pytest (>=8)"] + [[package]] name = "setuptools" version = "65.7.0" @@ -1085,6 +2965,17 @@ files = [ {file = "snowballstemmer-3.1.1.tar.gz", hash = "sha256:e07bbc54a0d798fe6010a12398422e62a8bfbba95c394fd0956ef58cb4d3e260"}, ] +[[package]] +name = "soupsieve" +version = "2.8.4" +description = "A modern CSS selector implementation for Beautiful Soup." +optional = false +python-versions = ">=3.9" +files = [ + {file = "soupsieve-2.8.4-py3-none-any.whl", hash = "sha256:e7e6b0769c8f51ed59acab6e994b00621096cfb1c640a7509295987388fbaf65"}, + {file = "soupsieve-2.8.4.tar.gz", hash = "sha256:e121fd02e975c695e4e9e8774a5ee35d74714b59307868dcc5319ad2d9e3328e"}, +] + [[package]] name = "sphinx" version = "7.4.7" @@ -1264,6 +3155,46 @@ lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] standalone = ["Sphinx (>=5)"] test = ["pytest"] +[[package]] +name = "stack-data" +version = "0.6.3" +description = "Extract data from python stack frames and tracebacks for informative displays" +optional = false +python-versions = "*" +files = [ + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, +] + +[package.dependencies] +asttokens = ">=2.1.0" +executing = ">=1.2.0" +pure-eval = "*" + +[package.extras] +tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] + +[[package]] +name = "terminado" +version = "0.18.1" +description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." +optional = false +python-versions = ">=3.8" +files = [ + {file = "terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0"}, + {file = "terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e"}, +] + +[package.dependencies] +ptyprocess = {version = "*", markers = "os_name != \"nt\""} +pywinpty = {version = ">=1.1.0", markers = "os_name == \"nt\""} +tornado = ">=6.1.0" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["pre-commit", "pytest (>=7.0)", "pytest-timeout"] +typing = ["mypy (>=1.6,<2.0)", "traitlets (>=5.11.1)"] + [[package]] name = "terminaltables" version = "3.1.10" @@ -1275,6 +3206,24 @@ files = [ {file = "terminaltables-3.1.10.tar.gz", hash = "sha256:ba6eca5cb5ba02bba4c9f4f985af80c54ec3dccf94cfcd190154386255e47543"}, ] +[[package]] +name = "tinycss2" +version = "1.4.0" +description = "A tiny CSS parser" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289"}, + {file = "tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7"}, +] + +[package.dependencies] +webencodings = ">=0.4" + +[package.extras] +doc = ["sphinx", "sphinx_rtd_theme"] +test = ["pytest", "ruff"] + [[package]] name = "toml" version = "0.10.2" @@ -1342,6 +3291,55 @@ files = [ {file = "tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f"}, ] +[[package]] +name = "tornado" +version = "6.5.7" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +optional = false +python-versions = ">=3.9" +files = [ + {file = "tornado-6.5.7-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:148b2eb15c2c765a50796172c1e499649b35f30d2e3c3d3e15913cfa56bfb163"}, + {file = "tornado-6.5.7-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9da38de27f1da3b78a966f0dae12b5a1ea9afe72ca805d84ff06508272ddf100"}, + {file = "tornado-6.5.7-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8d759e71906ee783f8867b93bf26a265743da4c1e2f4a018464c1ba019862972"}, + {file = "tornado-6.5.7-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a46347a18f23fb92b396beebe0fb78f61dda0cc302445202c16203d8a18848b"}, + {file = "tornado-6.5.7-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:7778b30bef919231265e91c69963ce0f49a1e9c07ac900bbe75b19ce2575ba92"}, + {file = "tornado-6.5.7-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e726f0c75da7726eec023aa62751ff8878bd2737e34fbdd33b1ae5897d2200f5"}, + {file = "tornado-6.5.7-cp39-abi3-win32.whl", hash = "sha256:f8de3bf12d3efdd0cbe7c8887868198f8a91415e3f29fcf258d9b8eb7b1d9ae4"}, + {file = "tornado-6.5.7-cp39-abi3-win_amd64.whl", hash = "sha256:de942f843533a039ef9fa3d9c88c7cd8a7c94553fb5ad0154270989b3d99a2c4"}, + {file = "tornado-6.5.7-cp39-abi3-win_arm64.whl", hash = "sha256:ff934fce95643af5f11efdae618eaa73d469dc588641e5c8d19295a0c65c4796"}, + {file = "tornado-6.5.7.tar.gz", hash = "sha256:66c513a76cda70d53907bc27cf1447557699c2e95aa48ba27a442ff61c3ddfc2"}, +] + +[[package]] +name = "traitlets" +version = "5.15.1" +description = "Traitlets Python configuration system" +optional = false +python-versions = ">=3.9" +files = [ + {file = "traitlets-5.15.1-py3-none-any.whl", hash = "sha256:770a53705f84b81ac107e83a1b3328ff2dae16094d8fc3cfc004e4b22dfd8e92"}, + {file = "traitlets-5.15.1.tar.gz", hash = "sha256:7b1c07854fe25acb39e009bae49f11b79ff6cbb2f27999104e9110e7a6b53722"}, +] + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.17.0,<1.19)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] + +[[package]] +name = "typeguard" +version = "4.5.2" +description = "Run-time type checker for Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "typeguard-4.5.2-py3-none-any.whl", hash = "sha256:fcf9de18bd945cdb4c7b996e12b4c51ce83f92f191314a6d7cf1739586ec98cf"}, + {file = "typeguard-4.5.2.tar.gz", hash = "sha256:5a16dcac23502039299c97c8941651bc33d7ea8cc4b2f7d6bbb1b528f6eea423"}, +] + +[package.dependencies] +importlib_metadata = {version = ">=3.6", markers = "python_version < \"3.10\""} +typing_extensions = ">=4.14.0" + [[package]] name = "typing-extensions" version = "4.15.0" @@ -1353,6 +3351,35 @@ files = [ {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"}, ] +[[package]] +name = "typing-inspect" +version = "0.9.0" +description = "Runtime inspection utilities for typing module." +optional = false +python-versions = "*" +files = [ + {file = "typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f"}, + {file = "typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78"}, +] + +[package.dependencies] +mypy-extensions = ">=0.3.0" +typing-extensions = ">=3.7.4" + +[[package]] +name = "typing-inspection" +version = "0.4.2" +description = "Runtime typing introspection tools" +optional = false +python-versions = ">=3.9" +files = [ + {file = "typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7"}, + {file = "typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464"}, +] + +[package.dependencies] +typing-extensions = ">=4.12.0" + [[package]] name = "tzdata" version = "2026.2" @@ -1364,6 +3391,20 @@ files = [ {file = "tzdata-2026.2.tar.gz", hash = "sha256:9173fde7d80d9018e02a662e168e5a2d04f87c41ea174b139fbef642eda62d10"}, ] +[[package]] +name = "uri-template" +version = "1.3.0" +description = "RFC 6570 URI Template Processor" +optional = false +python-versions = ">=3.7" +files = [ + {file = "uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7"}, + {file = "uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363"}, +] + +[package.extras] +dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake8-commas", "flake8-comprehensions", "flake8-continuation", "flake8-datetimez", "flake8-docstrings", "flake8-import-order", "flake8-literal", "flake8-modern-annotations", "flake8-noqa", "flake8-pyproject", "flake8-requirements", "flake8-typechecking-import", "flake8-use-fstring", "mypy", "pep8-naming", "types-PyYAML"] + [[package]] name = "urllib3" version = "1.26.20" @@ -1380,6 +3421,66 @@ brotli = ["brotli (==1.0.9)", "brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotl secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +[[package]] +name = "wcwidth" +version = "0.8.2" +description = "Measures the displayed width of unicode strings in a terminal" +optional = false +python-versions = ">=3.8" +files = [ + {file = "wcwidth-0.8.2-py3-none-any.whl", hash = "sha256:d63947694a0539a1d51e01eda7caf800c291020e6cdd7e28ad7b14dd33ad4f85"}, + {file = "wcwidth-0.8.2.tar.gz", hash = "sha256:91fbef97204b96a3d4d421609b80340b760cf33e26da123ff243d76b1fda8dda"}, +] + +[[package]] +name = "webcolors" +version = "24.11.1" +description = "A library for working with the color formats defined by HTML and CSS." +optional = false +python-versions = ">=3.9" +files = [ + {file = "webcolors-24.11.1-py3-none-any.whl", hash = "sha256:515291393b4cdf0eb19c155749a096f779f7d909f7cceea072791cb9095b92e9"}, + {file = "webcolors-24.11.1.tar.gz", hash = "sha256:ecb3d768f32202af770477b8b65f318fa4f566c22948673a977b00d589dd80f6"}, +] + +[[package]] +name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +optional = false +python-versions = "*" +files = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] + +[[package]] +name = "websocket-client" +version = "1.9.0" +description = "WebSocket client for Python with low level API options" +optional = false +python-versions = ">=3.9" +files = [ + {file = "websocket_client-1.9.0-py3-none-any.whl", hash = "sha256:af248a825037ef591efbf6ed20cc5faa03d3b47b9e5a2230a529eeee1c1fc3ef"}, + {file = "websocket_client-1.9.0.tar.gz", hash = "sha256:9e813624b6eb619999a97dc7958469217c3176312b3a16a4bd1bc7e08a46ec98"}, +] + +[package.extras] +docs = ["Sphinx (>=6.0)", "myst-parser (>=2.0.0)", "sphinx_rtd_theme (>=1.1.0)"] +optional = ["python-socks", "wsaccel"] +test = ["pytest", "websockets"] + +[[package]] +name = "widgetsnbextension" +version = "4.0.15" +description = "Jupyter interactive widgets for Jupyter Notebook" +optional = false +python-versions = ">=3.7" +files = [ + {file = "widgetsnbextension-4.0.15-py3-none-any.whl", hash = "sha256:8156704e4346a571d9ce73b84bee86a29906c9abfd7223b7228a28899ccf3366"}, + {file = "widgetsnbextension-4.0.15.tar.gz", hash = "sha256:de8610639996f1567952d763a5a41af8af37f2575a41f9852a38f947eb82a3b9"}, +] + [[package]] name = "win32-setctime" version = "1.2.0" @@ -1416,4 +3517,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = ">=3.9, <3.14" -content-hash = "35f6c41bcd2f19d5c5086be42b9c8dc8f40d414e1678f01755628a92fc4dddd8" +content-hash = "4be6ac677c354c91423d1bf21ac9538be65daf86604d6342a110c5f0ab41a6e4" diff --git a/pyproject.toml b/pyproject.toml index 7b5b691..8412073 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [tool.poetry] name = "quantaq-cli" version = "1.0.0rc0" -description = "The QuantAQ CLI" +description = "The QuantAQ Python Toolkit and CLI" authors = ["David H Hagan "] license = "Apache-2.0" readme = "README.md" @@ -13,13 +13,15 @@ classifiers = [] [tool.poetry.dependencies] python = ">=3.9, <3.14" pandas = ">=2.1.4,<2.2" -click = "^7.1.2" +click = "^8.1" pyarrow = ">=14.0.2" terminaltables = "^3.1.0" urllib3 = "^1.26.10" numpy = "^1.23.2" rich-click = ">=1.7.2" loguru = "^0.7.3" +jupyter = "^1.1.1" +pandera = ">=0.24,<0.29" [tool.poetry.group.dev.dependencies] pytest = "^6.2.5" @@ -32,7 +34,7 @@ sphinx-rtd-theme = "^2.0" setuptools = "^65.6.3" [tool.poetry.scripts] -quantaq-cli = "quantaq_cli.console:main" +quantaq-cli = "quantaq_cli.cli:main" [build-system] requires = ["poetry-core>=1.0.0"] diff --git a/quantaq_cli/__init__.py b/quantaq_cli/__init__.py index e69de29..a8a328d 100644 --- a/quantaq_cli/__init__.py +++ b/quantaq_cli/__init__.py @@ -0,0 +1,18 @@ +from quantaq_cli.toolkit.concat import concat_files +from quantaq_cli.toolkit.merge import merge_files +from quantaq_cli.toolkit.resample import resample_dataframe +from quantaq_cli.toolkit.flag import flag_dataframe, echo_flag_table, flag_summary +from quantaq_cli.toolkit.expunge import expunge_dataframe +from quantaq_cli.toolkit.munge import clean_dataframe + + +__all__ = [ + "concat_files", + "merge_files", + "resample_dataframe", + "flag_dataframe", + "echo_flag_table", + "expunge_dataframe", + "flag_summary", + "clean_dataframe" +] diff --git a/quantaq_cli/cli.py b/quantaq_cli/cli.py new file mode 100644 index 0000000..f6143af --- /dev/null +++ b/quantaq_cli/cli.py @@ -0,0 +1,242 @@ +from pathlib import Path + +import pkg_resources +import rich_click as click +from loguru import logger + +from quantaq_cli import concat_files, merge_files, resample_dataframe, clean_dataframe +from quantaq_cli import flag_dataframe, echo_flag_table, expunge_dataframe +from quantaq_cli.exceptions import InvalidFileExtension +from quantaq_cli.log import configure_logging, LOG_LEVELS +from quantaq_cli.toolkit.resample import WIND_COLUMNS +from quantaq_cli.utilities import safe_load +from quantaq_cli.variables import SUPPORTED_MODELS, SUPPORTED_SOURCES + + +CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help']) + +__version__ = pkg_resources.get_distribution('quantaq_cli').version + + +@click.group(context_settings=CONTEXT_SETTINGS) +@click.version_option(__version__) +@click.pass_context +def main(ctx): + pass + + +def save_file(df, output): + """Helper func to save a DataFrame to disk as CSV or parquet. + + Args: + df (pd.DataFrame): DataFrame to save + output (str): Destination filepath. + """ + logger.info("Saving file to {}", output) + output = Path(output) + if output.suffix == ".csv": + df.to_csv(output, index=False) + else: + df.to_parquet(output, index=False) + +def check_extension(output): + """Helper func to check if the output extension is either a csv or parquet + format. + + Args: + output (str): Destination filepath. + """ + output = Path(output) + if output.suffix not in (".csv", ".parquet"): + error = InvalidFileExtension(f"Invalid file extension; got {output.suffix!r}") + logger.error(error) + raise error + return output + + +@click.command("concat") +@click.argument("files", nargs=-1, type=click.Path()) +@click.option("-o", "--output", default="output.csv", help="The filepath where you would like to save the file", type=str) +@click.option("--log-level", default="INFO", + type=click.Choice(LOG_LEVELS, case_sensitive=False), + help="loguru log level (default: INFO)") +def concat_command(files, output, log_level): + """Concat FILES and save to OUTPUT.""" + configure_logging(log_level) + + # make sure the extension is either a csv or parquet format + check_extension(output) + + # concat everything in filepath + logger.info("Files to read: {}", files) + + df = concat_files(files) + + # save the file + save_file(df, output) + + +@click.command("merge", short_help="merge two files together on their timestamp") +@click.argument("files", nargs=-1, type=click.Path()) +@click.option("-ts", "--tscol", default="timestamp", help="The column by which to join the files", type=str) +@click.option("-o", "--output", default="output.csv", help="The filepath where you would like to save the file", type=str) +@click.option("--log-level", default="INFO", + type=click.Choice(LOG_LEVELS, case_sensitive=False), + help="loguru log level (default: INFO)") +def merge_command(files, output, tscol, log_level): + """Merge FILES together and save to OUTPUT.""" + configure_logging(log_level) + + # make sure the extension is either a csv or parquet format + check_extension(output) + + # merge everything in filepath + logger.info("Files to read: {}", files) + + df = merge_files(files, tscol) + + # save the file + save_file(df, output) + + +@click.command("resample", short_help="up/down sample data") +@click.argument("file", nargs=1, type=click.Path()) +@click.argument("rule", nargs=1, type=str) +@click.option("-o", "--output", default="output.csv", help="The filepath where you would like to save the file", type=str) +@click.option("--on", default="timestamp", help="Name of the datetime column to resample over.", type=str) +@click.option("--by", default=None, help="Optional column(s) to group by first") +@click.option( + "--wind", + nargs=4, + type=str, + default=("wx_u", "wx_v", "wx_ws", "wx_wd"), + help="(u, v, speed, direction) column names. The u/v columns don't need to be present in the dataframe, but the column names need to be specified.", +) +@click.option("--numeric_how", default="mean", help="Aggregation for numeric columns.") +@click.option("--nonnumeric_how", default="first", help="Aggregation for non-numeric columns.") +@click.option("--log-level", default="INFO", + type=click.Choice(LOG_LEVELS, case_sensitive=False), + help="loguru log level (default: INFO)") +def resample_command(file, rule, output, log_level, **kwargs): + """Resample FILE at INTERVAL and save to OUTPUT.""" + configure_logging(log_level) + + on = kwargs.pop("on", "timestamp") + by = kwargs.pop("by", None) + wind = kwargs.pop("wind", WIND_COLUMNS) + numeric_how = kwargs.pop("numeric_how", "mean") + nonnumeric_how = kwargs.pop("nonnumeric_how", "first") + + # make sure the extension is either a csv or parquet format + check_extension(output) + + logger.info("File to read: {}", file) + + # load the file + df = safe_load(file) + + # if column to resample over needs to be made a datetime obj, do so + if on not in df.columns: + error = ValueError(f"Invalid column name for the timestamp; got {on!r}") + logger.error(error) + raise error + + # resample + df = resample_dataframe( + df, + rule, + on=on, + by=by, + wind=wind, + numeric_how=numeric_how, + nonnumeric_how=nonnumeric_how, + ) + + # save the file + save_file(df, output) + + +@click.command("flag") +@click.argument("file", nargs=1, type=click.Path()) +@click.option("-o", "--output", default="output.csv", help="The filepath where you would like to save the file", type=str) +@click.option("--log-level", default="INFO", + type=click.Choice(LOG_LEVELS, case_sensitive=False), + help="loguru log level (default: INFO)") +def flag_command(file, output, log_level): + """Flag FILE and save to OUTPUT.""" + configure_logging(log_level) + + # make sure the extension is either a csv or parquet format + check_extension(output) + + logger.info("File to read: {}", file) + + # load the file + df = safe_load(file) + + # flag the dataframe + df = flag_dataframe(df) + + # save the file + save_file(df, output) + + +@click.command("expunge") +@click.argument("file", nargs=1, type=click.Path()) +@click.option("-d", "--dry-run", is_flag=True, help="Print table to screen and bypass file save") +@click.option("-o", "--output", default="output.csv", help="The filepath where you would like to save the file", type=str) +@click.option("--log-level", default="INFO", + type=click.Choice(LOG_LEVELS, case_sensitive=False), + help="loguru log level (default: INFO)") +def expunge_command(file, output, log_level, dry_run): + """Expunge FILE and save to OUTPUT.""" + configure_logging(log_level) + + # make sure the extension is either a csv or parquet format + check_extension(output) + + logger.info("Expunging data for {}", file) + + df = safe_load(file) + show_summary = dry_run or log_level == "INFO" + + if show_summary: + logger.info("Original flag summary:") + echo_flag_table(df) + + df_expunged = expunge_dataframe(df) + + if show_summary: + logger.info("New flag summary:") + echo_flag_table(df_expunged) + + if not dry_run: + save_file(df, output) + + +@click.command("clean") +@click.argument("file", nargs=1, type=click.Path()) +@click.option("-o", "--output", default="output.csv", help="The filepath where you would like to save the file", type=str) +@click.option("--log-level", default="INFO", + type=click.Choice(LOG_LEVELS, case_sensitive=False), + help="loguru log level (default: INFO)") +def clean_command(file, output, log_level): + """Clean FILE and save to OUTPUT.""" + configure_logging(log_level) + + # make sure the extension is either a csv or parquet format + check_extension(output) + + logger.info("Cleaning data for {}", file) + df = safe_load(file) + df = clean_dataframe(df) + # save the file + save_file(df, output) + +# add the commands one-by-one +main.add_command(concat_command) +main.add_command(merge_command) +main.add_command(resample_command) +main.add_command(expunge_command) +main.add_command(flag_command) +main.add_command(clean_command) diff --git a/quantaq_cli/console/__init__.py b/quantaq_cli/console/__init__.py deleted file mode 100644 index 3106175..0000000 --- a/quantaq_cli/console/__init__.py +++ /dev/null @@ -1,126 +0,0 @@ -import pkg_resources -import rich_click as click -from quantaq_cli.variables import SUPPORTED_MODELS - -CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help']) - -__version__ = pkg_resources.get_distribution('quantaq_cli').version - - -@click.group(context_settings=CONTEXT_SETTINGS) -@click.version_option(__version__) -@click.pass_context -def main(ctx): - pass - - -@click.command("concat", short_help="concatenate files together") -@click.argument("files", nargs=-1, type=click.Path()) -@click.option("-o", "--output", default="output.csv", help="The filepath where you would like to save the file", type=str) -@click.option("-v", "--verbose", is_flag=True, help="Enable verbose mode (debugging)") -@click.option("-l", "--logs", is_flag=True, help="Parse and save locally-saved log files.") -def concat(files, output, verbose, logs, **kwargs): - """Concatenate FILES together and save to OUTPUT. - - FILES is the collection or list of files that you are concatenating together. They - can be provided as a list or by using a wildcard and providing the path with wildcard. - """ - from .commands.concat import concat_command, concat_logs_command - - if not logs: - concat_command(files, output, verbose=verbose, **kwargs) - else: - concat_logs_command(files, output, verbose=verbose, **kwargs) - - -@click.command("merge", short_help="merge two files together on their timestamp") -@click.argument("files", nargs=-1, type=click.Path()) -@click.option("-ts", "--tscol", default="timestamp_iso", help="The column by which to join the files", type=str) -@click.option("-o", "--output", default="output.csv", help="The filepath where you would like to save the file", type=str) -@click.option("-v", "--verbose", is_flag=True, help="Enable verbose mode (debugging)") -def merge(files, tscol, output, verbose, **kwargs): - """Merge FILES together and save to OUTPUT. - """ - from .commands.merge import merge_command - - merge_command(files, output, tscol=tscol, verbose=verbose, **kwargs) - - -@click.command("resample", short_help="up/down sample data") -@click.argument("file", nargs=1, type=click.Path()) -@click.argument("rule", nargs=1, type=str) -@click.option("-o", "--output", default="output.csv", help="The filepath where you would like to save the file", type=str) -@click.option("--on", default="timestamp", help="Name of the datetime column to resample over.", type=str) -@click.option("--by", default=None, help="Optional column(s) to group by first") -@click.option("--wind", default=("wx_u", "wx_v", "wx_ws", "wx_wd"), help="``(u, v, speed, direction)`` column names") -@click.option("--numeric_how", default="mean", help="Aggregation for numeric columns.") -@click.option("--nonnumeric_how", default="first", help="Aggregation for non-numeric columns.") -@click.option("-v", "--verbose", is_flag=True, help="Enable verbose mode (debugging)") -def resample(file, rule, output, verbose, **kwargs): - """Resample FILE at INTERVAL and save to OUTPUT. - """ - from .commands.resample import resample_command - - resample_command(file, rule, output, verbose=verbose, **kwargs) - - -@click.command("expunge", short_help="NaN flagged values") -@click.argument("file", nargs=1, type=click.Path()) -@click.option("-d", "--dry-run", is_flag=True, help="Print table to screen and bypass file save") -@click.option("-t", "--table", is_flag=True, help="Print as a dict instead of as a table") -@click.option("-o", "--output", default="output.csv", help="The filepath where you would like to save the file", type=str) -@click.option("-f", "--flag", default="flag", help="The name of the flag column", type=str) -@click.option("-v", "--verbose", is_flag=True, help="Enable verbose mode (debugging)") -@click.option("-m", "--model", default="modulair_pm", help="The device model type. One of {}".format(SUPPORTED_MODELS)) -def expunge(file, dry_run, table, output, flag, verbose, model, **kwargs): - """Expunge (NaN flagged values) FILE and save to OUTPUT. - """ - from .commands.expunge import expunge_command - - expunge_command(file, output, flagcol=flag, dry_run=dry_run, verbose=verbose, model=model, table=table, **kwargs) - - -@click.command("flag", short_help="flag data based on specific criteria") -@click.argument("file", nargs=1, type=click.Path()) -@click.argument("column", nargs=1, type=str) -@click.argument("comparator", nargs=1, type=str) -@click.argument("value", nargs=1, type=float) -@click.option("-f", "--flag", default="FLAG_ROW", help="One of [FLAG_OPC, FLAG_CO, FLAG_NO, FLAG_NO2, FLAG_O3, FLAG_CO2, FLAG_ROW]") -@click.option("-o", "--output", default="output.csv", help="The filepath where you would like to save the file", type=str) -@click.option("-v", "--verbose", is_flag=True, help="Enable verbose mode (debugging)") -@click.option("-m", "--model", default="modulair_pm", help="The device model type. One of {}".format(SUPPORTED_MODELS)) -def flag(file, column, comparator, value, flag, output, verbose, model, **kwargs): - """Set a FLAG based on user input or statistical method. - - Four arguments are required: - 1. FILE -> the path to the file of interest - 2. COLUMN -> the exact name of the column - 3. COMPARATOR -> one of ['lt', 'gt', 'eq', 'le', 'ge'] - 4. VALUE -> the value by which to filter - """ - from .commands.flag import flag_command - - flag_command(file, column, comparator, value, output, flag=flag, verbose=verbose, model=model) - - -@click.command("clean") -@click.argument("filepath", nargs=1, type=click.Path()) -@click.argument("savepath", nargs=1, type=click.Path()) -def clean(filepath, savepath, **kwargs): - """Clean FILEPATH and save to SAVEPATH. - - Remove corrupt data and force columns to be the - desired column type based on the specific column. - """ - from .commands.munge import clean_file - - clean_file(filepath, savepath, **kwargs) - - -# add the commands one-by-one -main.add_command(concat) -main.add_command(merge) -main.add_command(resample) -main.add_command(expunge) -main.add_command(flag) -main.add_command(clean) \ No newline at end of file diff --git a/quantaq_cli/console/commands/concat.py b/quantaq_cli/console/commands/concat.py deleted file mode 100644 index bbc8ac3..0000000 --- a/quantaq_cli/console/commands/concat.py +++ /dev/null @@ -1,140 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -from pathlib import Path -import pandas as pd -import numpy as np -import re -import click - -from ...exceptions import InvalidFileExtension - - -def concat_command(files, output, **kwargs): - verbose = kwargs.pop("verbose", False) - - # make sure the extension is csv - output = Path(output) - if output.suffix not in (".csv", ".feather"): - raise InvalidFileExtension("Invalid file extension") - - save_as_csv = True if output.suffix == ".csv" else False - - # concat everything in filepath - if verbose: - click.secho("Files to read: {}".format(files), fg='green') - - # read all files - data = [] - with click.progressbar(files, label="Parsing files") as bar: - for f in bar: - tmp = pd.read_csv(f, nrows=1, header=None) - - # hack to support new products with a different file format - if tmp.iloc[0, 0] == 'deviceModel': - tmp = pd.read_csv(f, skiprows=3) - elif tmp.shape[1] == 2: - tmp = pd.read_csv(f, skiprows=1) - else: - tmp = pd.read_csv(f) - - data.append(tmp) - - # concat all of the files together - df = pd.concat(data, sort=False) - - # try sorting based on a time column - if "timestamp_iso" in df.columns: - df = df.sort_values(by='timestamp_iso') - elif "timestamp" in df.columns: - df = df.sort_values(by='timestamp') - - if df.empty: - raise Exception("No data") - - # save the file - if verbose: - click.secho("Saving file to {}".format(output), fg='green') - - if save_as_csv: - df.to_csv(output) - else: - df.reset_index().to_feather(output) - - -def concat_logs_command(files, output, **kwargs): - verbose = kwargs.pop("verbose", False) - - # make sure the extension is txt - output = Path(output) - if output.suffix not in (".csv", ".feather"): - raise InvalidFileExtension("Invalid file extension") - - save_as_csv = True if output.suffix == ".csv" else False - - # concat everything in filepath - if verbose: - click.secho("Files to read: {}".format(files), fg='green') - - # read all files - data = [] - with click.progressbar(files, label="Parsing files") as bar: - for each in bar: - with open(each, "r", errors='ignore') as f: - for line in f: - line = line.split(":") - - x, y = line[0], line[1:] - - y = ":".join(y).strip() - - try: - millis, location, level = re.split("[ ]", x) - except: - continue - - location = location[1:-1] - - data.append(dict(millis=int(millis), location=location, level=level, message=y)) - - # concat all results - data = pd.DataFrame(data) - - # group data - data["group"] = (data.millis - data.millis.shift(1) < -1000).cumsum() - data["timestamp_iso"] = np.nan - - rv = [] - - for _, grp in data.groupby("group"): - t0 = None - - idx = grp[grp["message"].str.contains("Current time", regex=False)] - if not idx.empty: - t0 = pd.to_datetime(":".join(idx.message.values[0].split(":")[1:])) - else: - idx = grp[grp["message"].str.contains("Time from RTC", regex=False)] - if not idx.empty: - t0 = pd.to_datetime(idx.message.values[0][18:]) - - if t0: - millis0 = idx["millis"].values[0] - - grp.loc[:, "timestamp_iso"] = grp["millis"].apply(lambda x: t0 + pd.Timedelta(x - millis0, unit='millis')) - - rv.append(grp) - - rv = pd.concat(rv) - del rv["group"] - - if rv.empty: - raise Exception("No data") - - # save the file - if verbose: - click.secho("Saving file to {}".format(output), fg='green') - - if save_as_csv: - rv.to_csv(output) - else: - rv.reset_index().to_feather(output) diff --git a/quantaq_cli/console/commands/expunge.py b/quantaq_cli/console/commands/expunge.py deleted file mode 100644 index 6b62f7a..0000000 --- a/quantaq_cli/console/commands/expunge.py +++ /dev/null @@ -1,88 +0,0 @@ -from pathlib import Path -import pandas as pd -import numpy as np -import click -from terminaltables import SingleTable - -from ...exceptions import InvalidFileExtension, InvalidDeviceModel -from ...utilities import safe_load -from ...variables import FLAGS, SUPPORTED_MODELS - - -def expunge_command(file, output, **kwargs): - verbose = kwargs.pop("verbose", False) - dry_run = kwargs.pop("dry_run", False) - flagcol = kwargs.pop("flagcol", "flag") - model = kwargs.pop("model", "modulair_pm") - table = kwargs.pop("table", False) - - # make sure the extension is either a csv or feather format - output = Path(output) - if output.suffix not in (".csv", ".feather"): - raise InvalidFileExtension("Invalid file extension") - - # ensure the model is valid - if model not in SUPPORTED_MODELS: - raise InvalidDeviceModel("Invalid device model. Must be one of {}".format(SUPPORTED_MODELS)) - - save_as_csv = True if output.suffix == ".csv" else False - - # concat everything in filepath - if verbose: - click.secho("File to read: {}".format(file), fg='green') - - # load the file - df = safe_load(file) - - if verbose: - click.echo("Expunging data for {}".format(model)) - - # init an array to hold the table data - data = [] - data.append(["FLAG", "FLAG VALUE", "# OCCURENCES", "% DATA"]) - - # get the flags (in the future, this will come from the file itself) - list_of_flags = FLAGS.get(model) - - # force the flag column to be an int - df[flagcol] = df[flagcol].astype(int, errors='ignore') - - # Drop NaNs - df = df.dropna(how='any', subset=[flagcol]) - - for label, value, cols in list_of_flags: - mask = df[flagcol] & value == value - n_affected = mask.sum() - pct_affected = round((n_affected / df.shape[0]) * 100.0, 2) - - # NaN the necessary columns - if cols is None: - cols = df.columns - elif len(cols) > 0: - cols = [c for c in cols if c in df.columns] - - # set the mask - df.loc[mask, cols] = np.nan - - # add a row to the output table - data.append([label, value, n_affected, pct_affected]) - - if dry_run or verbose: - tbl = SingleTable(data) - tbl.title = "Flag Breakdown".upper() - - if table: - click.echo(tbl.table) - else: - for item in data: - click.echo(item) - - # save the file (if not a dry run) - if not dry_run: - if verbose: - click.secho("Saving file to {}".format(output), fg='green') - - if save_as_csv: - df.to_csv(output) - else: - df.reset_index().to_feather(output) diff --git a/quantaq_cli/console/commands/flag.py b/quantaq_cli/console/commands/flag.py deleted file mode 100644 index 9b5e17f..0000000 --- a/quantaq_cli/console/commands/flag.py +++ /dev/null @@ -1,76 +0,0 @@ -from pathlib import Path -import pandas as pd -import numpy as np -import click -from terminaltables import SingleTable - -from ...exceptions import InvalidFileExtension, InvalidArgument, InvalidDeviceModel -from ...utilities import safe_load -from ...variables import FLAGS, SUPPORTED_MODELS - -import operator - -ops = { - 'eq': operator.eq, - 'lt': operator.lt, - 'le': operator.le, - 'gt': operator.gt, - 'ge': operator.ge - } - - -def flag_command(file, column, comparator, value, output, **kwargs): - verbose = kwargs.pop("verbose", False) - flag = kwargs.pop("flag", "FLAG_ROW") - model = kwargs.pop("model", "modulair_pm") - - # make sure the extension is either a csv or feather format - output = Path(output) - if output.suffix not in (".csv", ".feather"): - raise InvalidFileExtension("Invalid file extension") - - # ensure the model is valid - if model not in SUPPORTED_MODELS: - raise InvalidDeviceModel("Invalid device model. Must be one of {}".format(SUPPORTED_MODELS)) - - save_as_csv = True if output.suffix == ".csv" else False - - # concat everything in filepath - if verbose: - click.secho("File to read: {}".format(file), fg='green') - - # load the file - df = safe_load(file) - - # is the in df.columns? - if not column in df.columns: - raise InvalidArgument("Bad column name") - - # is the comparator valid? - if not comparator in ops.keys(): - raise InvalidArgument("Bad comparator") - - # create flag column if it doesn't exist - if "flag" not in df.columns: - df["flag"] = 0 - - # get the flag value - flag_value = 0 - flag_list = FLAGS.get(model) - for label, v, _ in flag_list: - if label == flag: - flag_value = v - break - - # create a mask and set the flag accordingly - mask = ops[comparator](df[column], value) - df.loc[mask, "flag"] = df[mask]["flag"] | flag_value - - # save the file - if verbose: - click.secho("Saving file to {}".format(output), fg='green') - - if save_as_csv: - df.to_csv(output) - else: - df.reset_index().to_feather(output) \ No newline at end of file diff --git a/quantaq_cli/console/commands/merge.py b/quantaq_cli/console/commands/merge.py deleted file mode 100644 index 7e45a74..0000000 --- a/quantaq_cli/console/commands/merge.py +++ /dev/null @@ -1,68 +0,0 @@ -from pathlib import Path -import pandas as pd -from pandas.api.types import is_datetime64_any_dtype, is_timedelta64_dtype -import numpy as np -import click - -from ...exceptions import InvalidFileExtension -from ...utilities import safe_load - - -def merge_command(files, output, **kwargs): - verbose = kwargs.pop("verbose", False) - tscol = kwargs.pop("tscol", "timestamp_iso") - - # create an array of timestamp column names to try - tscols = [tscol, "timestamp", "timestamp_local"] - - # make sure the extension is either a csv or feather format - output = Path(output) - if output.suffix not in (".csv", ".feather"): - raise InvalidFileExtension("Invalid file extension") - - save_as_csv = True if output.suffix == ".csv" else False - - # concat everything in filepath - if verbose: - click.secho("Files to read: {}".format(files), fg='green') - - df = pd.DataFrame() - with click.progressbar(files, label="Parsing files") as bar: - for f in bar: - tmp = safe_load(f) - - # check for the column name and set to best guess - for c in tscols: - if c in tmp.columns: - tscol = c - break - - if not tscol in tmp.columns: - click.secho("Time tscol was not found in the file; skipping file.", fg='red') - continue - - # convert the timestamp column to a pandas datetime - if not (is_datetime64_any_dtype(tmp[tscol]) or is_timedelta64_dtype(tmp[tscol])): - tmp[tscol] = tmp[tscol].apply(lambda x: pd.to_datetime(x, errors='coerce')) - - # drop the bad rows - tmp = tmp.dropna(how='any', subset=[tscol]) - - # localize the timezone if needed - tmp[tscol] = tmp[tscol].apply(lambda x: x.tz_localize("UTC") if not x.tzinfo else x) - - # set the index - tmp.set_index(tscol, inplace=True) - - # merge with the other files - df = pd.merge(df, tmp, left_index=True, right_index=True, how='outer') - - # save the file - if verbose: - click.secho("Saving file to {}".format(output), fg='green') - - if save_as_csv: - df.to_csv(output) - else: - df.reset_index().to_feather(output) - diff --git a/quantaq_cli/console/commands/munge.py b/quantaq_cli/console/commands/munge.py deleted file mode 100644 index ff18c79..0000000 --- a/quantaq_cli/console/commands/munge.py +++ /dev/null @@ -1,111 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -from pathlib import Path -import pandas as pd -import numpy as np -# import re -import click - -from ...exceptions import InvalidFileExtension - - -COLUMN_DEFINITIONS = [ - ('bin0', np.float32), - ('bin1', np.float32), - ('bin2', np.float32), - ('bin3', np.float32), - ('bin4', np.float32), - ('bin5', np.float32), - ('bin6', np.float32), - ('bin7', np.float32), - ('bin8', np.float32), - ('bin9', np.float32), - ('bin10', np.float32), - ('bin11', np.float32), - ('bin12', np.float32), - ('bin13', np.float32), - ('bin14', np.float32), - ('bin15', np.float32), - ('bin16', np.float32), - ('bin17', np.float32), - ('bin18', np.float32), - ('bin19', np.float32), - ('bin20', np.float32), - ('bin21', np.float32), - ('bin22', np.float32), - ('bin23', np.float32), - ('bin1MToF', np.float32), - ('bin3MToF', np.float32), - ('bin5MToF', np.float32), - ('bin7MToF', np.float32), - ('sample_period', np.float32), - ('sample_flow', np.float32), - ('opc_temp', np.float32), - ('opc_rh', np.float32), - ('opc_pm1', np.float32), - ('opc_pm25', np.float32), - ('opc_pm10', np.float32), - ('laser_status', np.int16), - ('pm1_std', np.float32), - ('pm25_std', np.float32), - ('pm10_std', np.float32), - ('pm1_env', np.float32), - ('pm25_env', np.float32), - ('pm10_env', np.float32), - ('neph_bin0', np.float32), - ('neph_bin1', np.float32), - ('neph_bin2', np.float32), - ('neph_bin3', np.float32), - ('neph_bin4', np.float32), - ('neph_bin5', np.float32), - ('sample_rh', np.float32), - ('sample_temp', np.float32), - ('sample_pres', np.float32), - ('fw', np.int16), - ('flag', np.int16), - ('connection_status', np.int16), - ('iteration', np.int16), -] - - -def clean_file(filepath, savepath, **kwargs): - """_summary_ - """ - # make sure the extension is csv - output = Path(savepath) - if output.suffix not in (".csv"): - raise InvalidFileExtension("Invalid file extension") - - # Load the data - df = pd.read_csv(filepath, on_bad_lines='skip', encoding='unicode_escape', low_memory=False) - - # Fix the timestamp column(s) - for c in ('timestamp', 'timestamp_local', 'timestamp_iso'): - if c in df.columns: - df[c] = pd.to_datetime(df[c], errors='coerce') - - # Set the index - for c in ('timestamp', 'timestamp_iso'): - if c in df.columns: - df = df.set_index(c) - break - - # Force everything to be numeric - df = df.apply(pd.to_numeric, errors='coerce') - - # Drop the NaNs - df = df.dropna(how='any') - - # Clean up any unneeded columns - for c in df.columns: - if "Unnamed" in c: - del df[c] - - # Reduce memory use by cleaning up all the column types - for cname, ctype in COLUMN_DEFINITIONS: - if cname in df.columns: - df[cname] = df[cname].astype(ctype) - - # Save the file - df.to_csv(savepath) diff --git a/quantaq_cli/log.py b/quantaq_cli/log.py new file mode 100644 index 0000000..fe9588f --- /dev/null +++ b/quantaq_cli/log.py @@ -0,0 +1,40 @@ +import logging +import sys + +from loguru import logger + + +# loguru levels, ordered low -> high +LOG_LEVELS = ["TRACE", "DEBUG", "INFO", "SUCCESS", "WARNING", "ERROR", "CRITICAL"] + +class _InterceptHandler(logging.Handler): + """Route standard logging calls through loguru.""" + def emit(self, record): + try: + level = logger.level(record.levelname).name + except ValueError: + level = record.levelno + frame, depth = logging.currentframe(), 2 + while frame.f_code.co_filename == logging.__file__: + frame = frame.f_back + depth += 1 + logger.opt(depth=depth, exception=record.exc_info).log(level, record.getMessage()) + +_NOISY_LOGGERS = ("matplotlib", "urllib3") + +def configure_logging(level: str = "INFO") -> None: + """Reset loguru to log to stderr at the given level. + + # example usage: + from quantaq_py.concat import concat_files + from quantaq_py.log import configure_logging + + configure_logging("DEBUG") + df = concat_files(my_files) + """ + logger.remove() + logger.add(sys.stderr, level=level.upper()) + logging.basicConfig(handlers=[_InterceptHandler()], level=0, force=True) + for name in _NOISY_LOGGERS: + logging.getLogger(name).setLevel(logging.WARNING) + \ No newline at end of file diff --git a/quantaq_cli/schema.py b/quantaq_cli/schema.py new file mode 100644 index 0000000..162a818 --- /dev/null +++ b/quantaq_cli/schema.py @@ -0,0 +1,190 @@ +import numpy as np +import pandera.pandas as pa + +# Default dtypes from database / cloudAPI data +COLUMN_DEFINITIONS = [ + # --- OPC colunms --- + ('bin0', np.float64), + ('bin1', np.float64), + ('bin2', np.float64), + ('bin3', np.float64), + ('bin4', np.float64), + ('bin5', np.float64), + ('bin6', np.float64), + ('bin7', np.float64), + ('bin8', np.float64), + ('bin9', np.float64), + ('bin10', np.float64), + ('bin11', np.float64), + ('bin12', np.float64), + ('bin13', np.float64), + ('bin14', np.float64), + ('bin15', np.float64), + ('bin16', np.float64), + ('bin17', np.float64), + ('bin18', np.float64), + ('bin19', np.float64), + ('bin20', np.float64), + ('bin21', np.float64), + ('bin22', np.float64), + ('bin23', np.float64), + ('opc.bin0', np.float64), + ('opc.bin1', np.float64), + ('opc.bin2', np.float64), + ('opc.bin3', np.float64), + ('opc.bin4', np.float64), + ('opc.bin5', np.float64), + ('opc.bin6', np.float64), + ('opc.bin7', np.float64), + ('opc.bin8', np.float64), + ('opc.bin9', np.float64), + ('opc.bin10', np.float64), + ('opc.bin11', np.float64), + ('opc.bin12', np.float64), + ('opc.bin13', np.float64), + ('opc.bin14', np.float64), + ('opc.bin15', np.float64), + ('opc.bin16', np.float64), + ('opc.bin17', np.float64), + ('opc.bin18', np.float64), + ('opc.bin19', np.float64), + ('opc.bin20', np.float64), + ('opc.bin21', np.float64), + ('opc.bin22', np.float64), + ('opc.bin23', np.float64), + ('bin1MToF', np.float64), + ('bin3MToF', np.float64), + ('bin5MToF', np.float64), + ('bin7MToF', np.float64), + ('sample_period', np.float64), + ('opc_sample_period', np.float64), + ('sample_flow', np.float64), + ('opc_sample_flow', np.float64), + ('opc_temp', np.float64), + ('opc_rh', np.float64), + ('opc_pm1', np.float64), + ('opc_pm25', np.float64), + ('opc_pm10', np.float64), + ('opcn3_pm1', np.float64), + ('opcn3_pm25', np.float64), + ('opcn3_pm10', np.float64), + ('laser_status', np.int16), + ('opc_laser_status', np.int16), + + # --- Nephelometer columns --- + ('pm1_std', np.float64), + ('pm25_std', np.float64), + ('pm10_std', np.float64), + ('pm1_env', np.float64), + ('pm25_env', np.float64), + ('pm10_env', np.float64), + ('neph_pm1_std', np.float64), + ('neph_pm25_std', np.float64), + ('neph_pm10_std', np.float64), + ('neph_pm1_env', np.float64), + ('neph_pm25_env', np.float64), + ('neph_pm10_env', np.float64), + ('neph_bin0', np.float64), + ('neph_bin1', np.float64), + ('neph_bin2', np.float64), + ('neph_bin3', np.float64), + ('neph_bin4', np.float64), + ('neph_bin5', np.float64), + + # --- RH / Temp / Pressure columns --- + ('sample_rh', np.float64), + ('sample_temp', np.float64), + ('sample_pres', np.float64), + ('rh', np.float64), + ('temp', np.float64), + + # --- CO columns --- + ('co', np.float64), + ('co_we', np.float64), + ('co_ae', np.float64), + ('co_diff', np.float64), + ('gases.co.we', np.float64), + ('gases.co.ae', np.float64), + ('gases.co.diff', np.float64), + + # --- NO columns --- + ('no', np.float64), + ('no_we', np.float64), + ('no_ae', np.float64), + ('no_diff', np.float64), + ('gases.no.we', np.float64), + ('gases.no.ae', np.float64), + ('gases.no.diff', np.float64), + + # --- NO2 columns --- + ('no2', np.float64), + ('no2_we', np.float64), + ('no2_ae', np.float64), + ('no2_diff', np.float64), + ('gases.no2.we', np.float64), + ('gases.no2.ae', np.float64), + ('gases.no2.diff', np.float64), + + # --- O3 columns --- + ('o3', np.float64), + ('ox_we', np.float64), + ('ox_ae', np.float64), + ('ox_diff', np.float64), + ('o3_we', np.float64), + ('o3_ae', np.float64), + ('o3_diff', np.float64), + ('gases.o3.we', np.float64), + ('gases.o3.ae', np.float64), + ('gases.o3.diff', np.float64), + + # --- CO2 columns --- + ('co2_raw', np.float64), + ('co2', np.float64), + + # --- SO2 columns --- + ('so2_we', np.float64), + ('so2_ae', np.float64), + ('so2_diff', np.float64), + ('so2', np.float64), + + # --- H2S columns --- + ('h2s_we', np.float64), + ('h2s_ae', np.float64), + ('h2s_diff', np.float64), + ('h2s', np.float64), + + # --- Battery columns --- + ('bat_voltage', np.float64), + ('soc', np.float64), + ('vbat', np.float64), + + # --- Device / metadata columns --- + ('fw', np.int16), + ('flag', np.int64), + ('connection_status', np.int16), + ('iteration', np.int16), +] + +def build_dtype_schema(column_definitions, nullable=True, required=False): + """Build a Pandera DataFrameSchema from a list of column definitions. + + Args: + column_definitions (list of tuples): A list of tuples where + each tuple contains the column name and its + corresponding data type. + nullable (bool): Whether the columns are nullable. Default + is True. + required (bool): Whether the columns are required. Default + is False. + index_dtype (type, optional): The data type of the index. + If None, no index is specified. Default is None. + """ + columns = { + name: pa.Column(dtype, nullable=nullable, required=required) + for name, dtype in column_definitions + } + + # index = None means no index is specified + # strict = False allows missing and extra columns in the DataFrame + schema = pa.DataFrameSchema(columns, index=None, strict=False) + return schema diff --git a/quantaq_cli/console/commands/__init__.py b/quantaq_cli/toolkit/__init__.py similarity index 100% rename from quantaq_cli/console/commands/__init__.py rename to quantaq_cli/toolkit/__init__.py diff --git a/quantaq_cli/toolkit/concat.py b/quantaq_cli/toolkit/concat.py new file mode 100644 index 0000000..83b9ee5 --- /dev/null +++ b/quantaq_cli/toolkit/concat.py @@ -0,0 +1,34 @@ +from loguru import logger +import pandas as pd + +from quantaq_cli.utilities import safe_load, fix_timestamps + +def concat_files(files): + """Concatenate multiple files into a single DataFrame and sort based on a + timestamp column. + + Args: + files (list): List of file paths to concatenate. + + Returns: + pd.DataFrame: Concatenated and sorted DataFrame. + """ + data = [] + logger.info("Parsing {} files", len(files)) + for f in files: + logger.debug("Parsing {}", f) + tmp = safe_load(f) + data.append(tmp) + + # concat all of the files together + df = pd.concat(data, sort=False) + + if df.empty: + error = ValueError(f"No data found after parsing {len(files)} files: {files}") + logger.error(error) + raise error + + # sort based on a time column + df = fix_timestamps(df, sort_values=True) + + return df diff --git a/quantaq_cli/toolkit/expunge.py b/quantaq_cli/toolkit/expunge.py new file mode 100644 index 0000000..67ad8b2 --- /dev/null +++ b/quantaq_cli/toolkit/expunge.py @@ -0,0 +1,41 @@ +import numpy as np +from loguru import logger + +from quantaq_cli.utilities import determine_timestamp_column +from quantaq_cli.variables import FLAG_DEFINITIONS + + +def expunge_dataframe(df): + """Expunge a DataFrame based on values in the flag column. + + Args: + df (pd.DataFrame): DataFrame to expunge. + """ + # get the flags (in the future, this will come from the file itself) + list_of_flags = FLAG_DEFINITIONS + + # force the flag column to be an int + df["flag"] = df["flag"].astype(int, errors='ignore') + + # Drop nan flags (should never happen) + if df["flag"].isna().any(): + logger.warning("Dropping {} rows with NaN flags", df["flag"].isna().sum()) + df = df.dropna(how='any', subset=["flag"]) + + for label, value, cols in list_of_flags: + mask = df["flag"] & value == value + if not mask.any(): + continue + + # NaN the necessary columns + if cols == "all_columns": + tscol = determine_timestamp_column(df) + cols_to_keep = {tscol, "sn", "flag"} + cols = [c for c in df.columns if c not in cols_to_keep] + elif len(cols) > 0: + cols = [c for c in cols if c in df.columns] + + # set the mask + df.loc[mask, cols] = np.nan + + return df diff --git a/quantaq_cli/toolkit/flag.py b/quantaq_cli/toolkit/flag.py new file mode 100644 index 0000000..8d6274e --- /dev/null +++ b/quantaq_cli/toolkit/flag.py @@ -0,0 +1,147 @@ +from pathlib import Path + +from loguru import logger +import pandas as pd +import rich +from rich.table import Table + +from quantaq_cli.variables import FLAG_DEFINITIONS, SUPPORTED_MODELS, SUPPORTED_SOURCES +from quantaq_cli.variables import Range, Gap, flag_name_to_criteria +from quantaq_cli.utilities import fix_timestamps, determine_timestamp_column +from quantaq_cli.utilities import infer_data_source, infer_data_model + + +def _add_flag(df, flag_name, flag_value, criterion): + """Add a specific flag to a DataFrame based on a given criterion. + + For each row that meets the specified criterion, this function modifies the 'flag' + column by applying a bitwise OR operation with the given flag value. + + Args: + df (pd.DataFrame): DataFrame to which the flag will be added. + flag_name (str): Name of the flag to be added. + flag_value (int): Bitmask value of the flag to be added. + criterion (Range or Gap): Logic based on which the flag will be added. + + Returns: + pd.DataFrame: DataFrame with the flag added. + """ + if isinstance(criterion, Range): + if criterion.column in df.columns: + col = df[criterion.column] + mask = (col < criterion.lo) | (col > criterion.hi) + if not mask.sum(): + return df + df.loc[mask, "flag"] |= flag_value + logger.info( + f"Flagged: {flag_name} (flag {flag_value}) --> {mask.sum()} rows", + ) + + elif isinstance(criterion, Gap): + # sort based on a time column + df = fix_timestamps(df, sort_values=True) + tscol = determine_timestamp_column(df) + + # Create a column to hold the time diff + df["tdiff"] = df[tscol].diff().dt.total_seconds() + + # If we're missing enough data, apply the startup flag. + startup_mask = df["tdiff"] > criterion.gap_in_seconds + starts = df.loc[startup_mask] + postgap_delta = pd.Timedelta(seconds=criterion.post_gap_flag_length_seconds) + + for _, row in starts.iterrows(): + # Flag everything between the startup flag's timestamp up to the gap. + mask = (df[tscol] >= row[tscol]) & ( + df[tscol] <= (row[tscol] + postgap_delta) + ) + df.loc[mask, "flag"] |= flag_value + logger.info( + f"Flagged: {flag_name} (flag {flag_value}) --> {mask.sum()} rows", + ) + + # Delete the tdiff col + del df["tdiff"] + + return df + +def flag_summary(df): + """Create a table with a summary of flags. + + Args: + df (pd.DataFrame): DataFrame with flags to summarize. + + Returns: + pd.DataFrame: A new DataFrame, suitable for human consumption. + """ + + # create flag column if it doesn't exist + if "flag" not in df.columns: + df["flag"] = 0 + + # force the flag column to be an int + df["flag"] = df["flag"].astype(int, errors='ignore') + + rows = [] + for name, value, cols in FLAG_DEFINITIONS: + mask = df["flag"] & value + num_naffected = mask.astype(bool).sum() + percent_affected = f"{100 * num_naffected / df.shape[0]:.1f}" + rows.append([name, int(value), num_naffected, percent_affected]) + + explained_df = pd.DataFrame( + rows, + columns=["FLAG", "FLAG VALUE", "# OCCURENCES", "% DATA"], + ).set_index("FLAG") + return explained_df + +def echo_flag_table(df): + """Print a table of flag statistics for a DataFrame. + + Args: + df (pd.DataFrame): DataFrame with flags to summarize. + """ + explained_df = flag_summary(df) + + table = Table() + for column in ["FLAG", *explained_df.columns]: + table.add_column( + column, + justify="right" if column != "FLAG" else "left", + style="bold", + ) + for row in explained_df.itertuples(): + table.add_row(*map(str, row)) + rich.print(table) + +def flag_dataframe(df): + """Re-flags a DataFrame by iterating through the FLAG_DEFINITIONS and calling + the _add_flag() function one-by-one. + + Args: + df (pd.DataFrame): DataFrame to be flagged (or re-flagged). + + Returns: + pd.DataFrame: The flagged DataFrame. + """ + df = df.copy() + + model = infer_data_model(df) + source = infer_data_source(df) + + # get flag criteria (this also checks if model and data source is valid) + name_to_criteria = flag_name_to_criteria(source, model).items() + + # create flag column if it doesn't exist + if "flag" not in df.columns: + df["flag"] = 0 + + # get the flag values for each flag name + FLAG_VALUES = {flag.name: flag.value for flag in FLAG_DEFINITIONS} + + # set the flag for each flag_name and their respective crtieria + for flag_name, criteria in name_to_criteria: + flag_value = FLAG_VALUES[flag_name] + for criterion in criteria: + df = _add_flag(df, flag_name, flag_value, criterion) + return df diff --git a/quantaq_cli/toolkit/merge.py b/quantaq_cli/toolkit/merge.py new file mode 100644 index 0000000..00b449d --- /dev/null +++ b/quantaq_cli/toolkit/merge.py @@ -0,0 +1,76 @@ +from loguru import logger +import pandas as pd + +from quantaq_cli.utilities import safe_load, fix_timestamps + + +def merge_files(files, tscol="timestamp", suffixes=('_left', '_right'), keep="both"): + """Merge two files on a timestamp column. + + Args: + files (list): List of file paths to merge. + tscol (str, optional): Name of the timestamp column. Default is "timestamp". + suffixes (tuple, optional): A length-2 sequence where each element is + a string indicating the suffix to add to overlapping column names + in the left and right DataFrames, respectively. Default is + ("_left", "_right"). + keep (str, optional): Which side to keep for columns that overlap + between files: "both" keeps both suffixed columns, "left" keeps + only the left/earlier file's version, "right" keeps only the + right/later file's version. Default is "both". + + Note! + If keep != "both" and you don't want to rename the columns to keep, the + suffix for columns to keep can be an empty string (i.e., suffixes=('', '_drop')). + + Returns: + pd.DataFrame: the merged DataFrame + """ + if len(files)>2: + error = ValueError("Attempting to merge >2 files at a time.") + logger.error(error) + raise error + + if keep not in ("both", "left", "right"): + error = ValueError(f"keep must be one of 'both', 'left', 'right'; got {keep!r}") + logger.error(error) + raise error + + # create an array of timestamp column names to try + tscols = [tscol, "timestamp", "timestamp_local"] + + df = pd.DataFrame() + logger.info("Parsing {} files", len(files)) + + # Find the best timestamp column from the first file, and use it for merging with the second file. + for f in files: + logger.debug("Parsing {}", f) + tmp = safe_load(f) + + # check for the column name and set to best guess + for c in tscols: + if c in tmp.columns: + tscol = c + break + + if not tscol in tmp.columns: + logger.debug("Time {} was not found in the file; skipping file.", tscol) + continue + + # Fix timestamps, if needed + tmp = fix_timestamps(tmp, set_index=True, sort_values=True, localize_tz=True) + + # merge with the other files + df = pd.merge(df, tmp, left_index=True, right_index=True, how='outer', suffixes=suffixes) + + # resolve overlapping columns down to one side, if desired + if keep != "both": + left_suffix, right_suffix = suffixes + drop_suffix, _ = ( + (right_suffix, left_suffix) if keep == "left" else (left_suffix, right_suffix) + ) + df = df.loc[:, ~df.columns.str.endswith(drop_suffix)] + + df = df.reset_index() # bring timestamp back as a column named `tscol` + + return df diff --git a/quantaq_cli/toolkit/munge.py b/quantaq_cli/toolkit/munge.py new file mode 100644 index 0000000..a5387fd --- /dev/null +++ b/quantaq_cli/toolkit/munge.py @@ -0,0 +1,34 @@ +import numpy as np +from pathlib import Path +import pandas as pd +from loguru import logger + +from quantaq_cli.exceptions import InvalidFileExtension +from quantaq_cli.utilities import fix_timestamps, drop_unnamed + + +def clean_dataframe(df): + """Load a dataframe, set timestamp to sorted, timezone-aware datetime index, + drop rows where all columns are NaN, remove unnamed columns. + + Args: + df (pd.DataFrame): DataFrame to clean. + """ + + # Fix the timestamp columns -- only if needed + df = fix_timestamps(df, set_index=True, sort_values=True, localize_tz=True) + + # Force everything to be numeric + #df = df.apply(pd.to_numeric, errors='coerce') # is this necessary? + + # Drop the NaNs + #df = df.dropna(how='any') # drop rows if ANY column is nan + all_nan_mask = df.isnull().all(axis=1) + if all_nan_mask.any(): + logger.warning("Dropping {} rows with all NaN values", all_nan_mask.sum()) + df = df.dropna(how='all') # drop rows if ALL columns are nan + + # Remove unnamed columns + df = drop_unnamed(df) + + return df diff --git a/quantaq_cli/console/commands/resample.py b/quantaq_cli/toolkit/resample.py similarity index 78% rename from quantaq_cli/console/commands/resample.py rename to quantaq_cli/toolkit/resample.py index e15c565..8a76d91 100644 --- a/quantaq_cli/console/commands/resample.py +++ b/quantaq_cli/toolkit/resample.py @@ -5,7 +5,7 @@ from loguru import logger import numpy as np import pandas as pd -from pandas.api.types import is_numeric_dtype +from pandas.api.types import is_numeric_dtype, is_datetime64_any_dtype from quantaq_cli.exceptions import InvalidFileExtension from quantaq_cli.utilities import safe_load @@ -77,8 +77,10 @@ def resample_dataframe( on: Name of the datetime column to resample over. by: Optional column(s) to group by first (e.g. ``"sn"``), so each device/location is resampled independently. - wind: ``(u, v, speed, direction)`` column names. When the u/v columns - are present, the speed/direction columns are NOT scalar-averaged; + wind: ``(u, v, speed, direction)`` column names. The u/v columns don't + need to be present in the dataframe, but the column names still need to be + specified here. When the u/v columns are present in the dataframe, + the speed/direction columns are NOT scalar-averaged; they are derived from the averaged u/v components instead (see ``_vector_wind``). If only speed/direction are present, the u/v components are first created from them (see ``_components_from_polar``). @@ -89,8 +91,8 @@ def resample_dataframe( Returns: A new frame with ``on`` (and any ``by`` keys) as columns. """ - if type(df[on]) != np.datetime64: - df[on] = df[on].map(pd.to_datetime) + if not is_datetime64_any_dtype(df[on]): + df[on] = pd.to_datetime(df[on]) keys = [by] if isinstance(by, str) else list(by or []) @@ -160,49 +162,3 @@ def resample_dataframe( len(df), len(out), rule, f" grouped by {keys}" if keys else "", ) return out - -def resample_command(file, rule, output, **kwargs): - verbose = kwargs.pop("verbose", False) - on = kwargs.pop("on", "timestamp") - by = kwargs.pop("by", None) - wind = kwargs.pop("wind", WIND_COLUMNS) - numeric_how = kwargs.pop("numeric_how", "mean") - nonnumeric_how = kwargs.pop("nonnumeric_how", "first") - - # make sure the extension is either a csv or feather format - output = Path(output) - if output.suffix not in (".csv", ".feather"): - raise InvalidFileExtension("Invalid file extension") - - save_as_csv = True if output.suffix == ".csv" else False - - # concat everything in filepath - if verbose: - click.secho("Files to read: {}".format(file), fg='green') - - # load the file - df = safe_load(file) - - # if column to resample over needs to be made a datetime obj, do so - if on not in df.columns: - raise Exception("Invalid column name for the timestamp") - - # resample - df = resample_dataframe( - df, - rule, - on=on, - by=by, - wind=wind, - numeric_how=numeric_how, - nonnumeric_how=nonnumeric_how, - ) - - # save the file - if verbose: - click.secho("Saving file to {}".format(output), fg='green') - - if save_as_csv: - df.to_csv(output) - else: - df.reset_index().to_feather(output) diff --git a/quantaq_cli/utilities.py b/quantaq_cli/utilities.py index ee49395..e3058d6 100644 --- a/quantaq_cli/utilities.py +++ b/quantaq_cli/utilities.py @@ -1,33 +1,227 @@ -import pandas as pd from pathlib import Path +from loguru import logger +import pandas as pd +import pandera.pandas as pa + from quantaq_cli.exceptions import InvalidFileExtension +from quantaq_cli.schema import build_dtype_schema, COLUMN_DEFINITIONS + +def drop_unnamed(df): + """Drop unnamed columns. + + Args: + df (pd.DataFrame): DataFrame to prune columns of. + """ + + unnamed = [c for c in df.columns if str(c).startswith("Unnamed:")] + if unnamed: + df.drop(columns=unnamed, inplace=True) + return df + +def infer_data_source(df, tscol=None): + """Determine the data source (rawSD, cloudAPI, or database) from the + sampling frequency in the dataframe. + + Args: + df (pd.DataFrame): DataFrame to check. + tscol (str): the timestamp column used to infer the sampling frequency. + + Returns: + str: the data source (i.e. "rawsd", "cloudapi", or "database") + """ + + df = fix_timestamps(df, sort_values=True) + tscol = tscol if tscol is not None else determine_timestamp_column(df) + + # Grab the tdiff between consecutive rows + df["tdiff"] = df[tscol].diff().dt.total_seconds() + + # normalize=True converts counts to fraction of non-nan entries + tdiffs = df["tdiff"].dropna() + tdiff_counts = tdiffs.value_counts(normalize=True) + + # if multiple tdiffs are found, log them and their frequencies + if len(tdiffs.unique()) > 1: + breakdown = ", ".join(f"{frac:.1%}: {tdiff}s" for tdiff, frac in tdiff_counts.items()) + logger.warning("Found mixed sampling frequencies: [{}]", breakdown) + + dominant_tdiff = tdiff_counts.idxmax() + + mostly_1min = dominant_tdiff == 60.0 + mostly_5sec = dominant_tdiff == 5.0 + mostly_10sec = dominant_tdiff == 10.0 + + if mostly_1min: + logger.info(f"Reading mostly {dominant_tdiff}s data --> inferring database or cloud API") + if "api_received_at" in df.columns: + return "cloudapi" + else: + return "database" + elif mostly_5sec: + logger.info(f"Reading mostly {dominant_tdiff}s data --> inferring rawSD") + return "rawsd" + elif mostly_10sec: + logger.info(f"Reading mostly {dominant_tdiff}s data --> inferring rawSD for modulair-ufp") + return "rawsd" + else: + error = NotImplementedError(f"Unrecognized dominant sampling intervals: {dominant_tdiff}") + logger.error(error) + raise error + +def infer_data_model(df): + """Infers the device model from the serial number in a dataframe. + + Args: + df (pd.DataFrame): DataFrame to check. + + Returns: + str: the device model / data model + """ + if "sn" not in df.columns: + error = ValueError("No serial number column found in dataframe, set `add_sn_column=True` when calling `safe_load`.") + logger.error(error) + raise error + sn_array = df['sn'].unique() + if len(sn_array) > 1: + error = ValueError(f"Found {len(sn_array)} unique serial numbers: {sn_array}") + logger.error(error) + raise error + device_sn = sn_array.item() + device_model = sn_to_model(device_sn) + return device_model + +def sn_to_model(device_sn): + """Map a device serial number to its model string. + + MOD-00246 -> modulair + MOD-PM-00933 -> modulair-pm + MOD-X-00993 -> modulair-x + MOD-X-PM-01685 -> modulair-x-pm + MOD-UFP-01685 -> modulair-ufp + Args: + device_sn (str): a device serial number (i.e. 'MOD-X-PM-01685') + + Returns: + str: name of the device model / data model (i.e. 'modulair-x-pm') + """ + prefix, _, _ = device_sn.rpartition("-") + return prefix.lower().replace("mod", "modulair", 1) + +def safe_load(fpath, coerce_dtypes=True): + """Load a CSV or parquet file. + + Args: + fpath (str or Path): Path to the CSV or parquet file. + coerce_dtypes (bool): Whether to coerce dtypes to expected types. + Default is True. -def safe_load(fpath, **kwargs): - """Load and return a file + Returns: + pd.DataFrame: Loaded DataFrame. """ + p = Path(fpath) if p.suffix == ".csv": as_csv = True - elif p.suffix == ".feather": + elif p.suffix == ".parquet": as_csv = False else: - raise InvalidFileExtension + error = InvalidFileExtension(f"Invalid file extension; got {p.suffix!r}") + logger.error(error) + raise error - tmp = pd.read_csv(fpath, nrows=1, header=None) if as_csv else pd.read_feather(fpath) + tmp = pd.read_csv(fpath, nrows=1, header=None) if as_csv else pd.read_parquet(fpath) - if tmp.iloc[0, 0] == "deviceModel": # hack to deal with modulair format - tmp = pd.read_csv(fpath, skiprows=3) if as_csv else pd.read_feather(fpath, skiprows=3) - elif tmp.shape[1] == 2: # hack to deal with bad header format - tmp = pd.read_csv(fpath, skiprows=1) if as_csv else pd.read_feather(fpath, skiprows=1) - else: - tmp = pd.read_csv(fpath) if as_csv else pd.read_feather(fpath) + if as_csv and tmp.iloc[0, 0] == "deviceModel": # hack to deal with modulair format + logger.info("Reading rawSD card data {}", fpath) + + tmp = pd.read_csv(fpath, skiprows=3) + + # Always add the sn as a column for rawSD data + tmp2 = pd.read_csv(fpath, nrows=3, header=None) + serial_number = tmp2.iloc[2, 1] + tmp['sn'] = serial_number + logger.info("Added serial number {} to column `sn` ", serial_number) + + elif as_csv and tmp.shape[1] == 2: # hack to deal with bad header format + tmp = pd.read_csv(fpath, skiprows=1) + elif as_csv: + tmp = pd.read_csv(fpath) # drop the extra column if it was added - unnamed = [c for c in tmp.columns if str(c).startswith("Unnamed:")] - if unnamed: - tmp.drop(columns=unnamed, inplace=True) + tmp = drop_unnamed(tmp) + + # Check dtypes + schema_field_dtypes = build_dtype_schema(COLUMN_DEFINITIONS) + try: + # print all dtype errors instead of raising on the first error + schema_field_dtypes.validate(tmp, lazy=True) + except pa.errors.SchemaErrors as err: + logger.error("Dtype validation failed for file {}.", fpath) + logger.error("{}", err.failure_cases.to_string()) + if coerce_dtypes: + logger.warning("Coercing dtypes to expected types for file {}.", fpath) + dtype_map = { + col: dtype for col, dtype in COLUMN_DEFINITIONS + if col in tmp.columns + } + tmp = tmp.astype(dtype_map) + + return tmp + +def determine_timestamp_column(df): + """Find the best column to use for timestamps. + + Args: + df (pd.DataFrame): DataFrame to check. + + Returns: + str: Name of the timestamp column. + """ + for col in ("timestamp_iso", "timestamp", "timestamp_local"): + if col in df.columns: + return col + + error = ValueError(f"Couldn't find a timestamp column: {df.columns}") + logger.error(error) + raise error + +def fix_timestamps(df, set_index=False, sort_values=False, localize_tz=False): + """Fix the timestamps (convert to datetime index, sort by + timestamp, drop nans.) + + Args: + df (pd.DataFrame): DataFrame to fix. + set_index (bool): Whether to set the best timestamp column + as the DataFrame's index. Default is False. + sort_values (bool): Whether to sort the DataFrame by the + best timestamp column. Default is False. + localize_tz (bool): Whether to localize naive timestamps + to UTC. Default is False. + """ + # Convert timestamp columns to datetime, if needed + for c in ('timestamp', 'timestamp_local', 'timestamp_iso'): + if c in df.columns and not pd.api.types.is_datetime64_any_dtype(df[c]): + df[c] = pd.to_datetime(df[c], errors='coerce') + + # Set index to best timestamp column, if not already set + tscol = determine_timestamp_column(df) + + # Sort the dataframe by the best timestamp column + if sort_values: + df = df.sort_values(by=tscol) + + # localize the timezone if needed (should not do for timestamp_local) + if localize_tz and tscol in ("timestamp", "timestamp_iso"): + df[tscol] = df[tscol].apply(lambda x: x.tz_localize("UTC") if not x.tzinfo else x) + + # Drop rows with NaN/NaT datetime indices + df = df.dropna(how='any', subset=[tscol]) + + if set_index: + if df.index.name != tscol: + df = df.set_index(tscol) - return tmp \ No newline at end of file + return df diff --git a/quantaq_cli/variables.py b/quantaq_cli/variables.py index ff9a5eb..795489f 100644 --- a/quantaq_cli/variables.py +++ b/quantaq_cli/variables.py @@ -1,56 +1,159 @@ -""" -Flags are in format (name, value, columns to NaN) -""" -FLAGS = dict() - -FLAGS["v100"] = [ - ("FLAG_STARTUP", 1, []), - ("FLAG_OPC", 2, ["bin0", "bin1", "bin2", "bin3", "bin4", "bin5", "opc_flow"]), - ("FLAG_TOTAL_COUNTS", 4, ["voc_raw", "pressure", "temp_manifold", "rh_manifold", "temp_box", - "dew_point", "noise", "solar", "wind_dir", "wind_speed", - "sample_time", "opc_flow", "manifold_temp", "manifold_rh"]), - ("FLAG_CO", 8, ["co_we", "co_ae"]), - ("FLAG_NO", 16, ["no_we", "no_ae"]), - ("FLAG_NO2", 32, ["no2_we", "no2_ae"]), - ("FLAG_O3", 64, ["o3_we", "o3_ae"]), - ("FLAG_OPC_RECORD_NUM", 128, ["bin0", "bin1", "bin2", "bin3", "bin4", "bin5", "opc_flow"]), - ("FLAG_CO2", 256 , ["co2_raw"]), - # ("FLAG_PP", 512, ), - ("FLAG_ROW", 1024, None) -] - -# flags for the v200 are the same as the v100 -FLAGS["v200"] = FLAGS["v100"] - -FLAGS["modulair_pm"] = [ - ("FLAG_STARTUP", 1, []), - ("FLAG_OPC", 2, ["bin0", "bin1", "bin2", "bin3", "bin4", "bin5", "bin6", "bin7", "bin8", "bin9", - "bin10", "bin11", "bin12", "bin13", "bin14", "bin15", "bin16", "bin17", "bin18", "bin19", - "bin20", "bin21", "bin22", "bin23", "bin1MToF", "bin3MToF", "bin5MToF", "bin7MToF", - "sample_period", "sample_flow", "opc_temp", "opc_rh", "opc_pm1", "opc_pm25", "opc_pm10", "laser_status"]), - ("FLAG_NEPH", 4, ["pm1_std", "pm25_std", "pm10_std", "pm1_env", "pm25_env", "pm10_env", - "neph_bin0", "neph_bin1", "neph_bin2", "neph_bin3", "neph_bin4", "neph_bin5"]), - ("FLAG_RHTP", 8, ["sample_rh", "sample_temp", "sample_pres"]), - ("FLAG_ROW", 1024, None) -] - -FLAGS["modulair"] = [ - ("FLAG_STARTUP", 1, []), - ("FLAG_OPC", 2, ["bin0", "bin1", "bin2", "bin3", "bin4", "bin5", "bin6", "bin7", "bin8", "bin9", - "bin10", "bin11", "bin12", "bin13", "bin14", "bin15", "bin16", "bin17", "bin18", "bin19", - "bin20", "bin21", "bin22", "bin23", "bin1MToF", "bin3MToF", "bin5MToF", "bin7MToF", - "sample_period", "sample_flow", "opc_temp", "opc_rh", "opc_pm1", "opc_pm25", "opc_pm10", "laser_status"]), - ("FLAG_NEPH", 4, ["pm1_std", "pm25_std", "pm10_std", "pm1_env", "pm25_env", "pm10_env", - "neph_bin0", "neph_bin1", "neph_bin2", "neph_bin3", "neph_bin4", "neph_bin5"]), - ("FLAG_RHT", 8, ["sample_rh", "sample_temp"]), - ("FLAG_CO", 16, ["co_we", "co_ae", "co_diff"]), - ("FLAG_NO", 32, ["no_we", "no_ae", "no_diff"]), - ("FLAG_NO2", 64, ["no2_we", "no2_ae", "no2_diff"]), - ("FLAG_O3", 128, ["ox_we", "ox_ae", "ox_diff", "o3_diff"]), - ("FLAG_CO2", 256, ["co2_raw"]), - ("FLAG_SO2", 512, ["so2_we", "so2_ae", "so2_diff"]), - ("FLAG_H2S", 1024, ["h2s_we", "h2s_ae", "h2s_diff"]), - ("FLAG_BAT", 2048, ["bat_voltage", "soc", "vbat"]), -] - -SUPPORTED_MODELS = FLAGS.keys() \ No newline at end of file +from collections import namedtuple + +from loguru import logger + +Flag = namedtuple("Flag", ["name", "value", "nan_columns"]) + +# Columns to Nan across all schema types (db, rawsd, cloudapi) +_OPC_COLUMNS = [ + "bin0", "bin1", "bin2", "bin3", "bin4", "bin5", "bin6", "bin7", "bin8", "bin9", + "bin10", "bin11", "bin12", "bin13", "bin14", "bin15", "bin16", "bin17", "bin18", + "bin19", "bin20", "bin21", "bin22", "bin23", + "opc.bin0", "opc.bin1", "opc.bin2", "opc.bin3", "opc.bin4", "opc.bin5", + "opc.bin6", "opc.bin7", "opc.bin8", "opc.bin9", "opc.bin10", "opc.bin11", + "opc.bin12", "opc.bin13", "opc.bin14", "opc.bin15", "opc.bin16", "opc.bin17", + "opc.bin18", "opc.bin19", "opc.bin20", "opc.bin21", "opc.bin22", "opc.bin23", + "bin1MToF", "bin3MToF", "bin5MToF", "bin7MToF", + "sample_period", "opc_sample_period", + "sample_flow", "opc_sample_flow", + "opc_pm1", "opc_pm25", "opc_pm10", + "opcn3_pm1", "opcn3_pm25", "opcn3_pm10", + "laser_status", "opc_laser_status", + "opc_temp", "opc_rh", +] + +_NEPH_COLUMNS = [ + "pm1_std", "pm25_std", "pm10_std", + "pm1_env", "pm25_env", "pm10_env", + "neph_pm1_std", "neph_pm25_std", "neph_pm10_std", + "neph_pm1_env", "neph_pm25_env", "neph_pm10_env", + "neph_bin0", "neph_bin1", "neph_bin2", "neph_bin3", "neph_bin4", "neph_bin5", +] + +_RHTP_COLUMNS = [ + "sample_rh", "sample_temp", "sample_pres", "rh", "temp" +] + +_CO_COLUMNS = [ + "co", + "co_we", "co_ae", "co_diff", + "gases.co.we", "gases.co.ae", "gases.co.diff" +] + +_NO_COLUMNS = [ + "no", + "no_we", "no_ae", "no_diff", + "gases.no.we", "gases.no.ae", "gases.no.diff" +] + +_NO2_COLUMNS = [ + "no2", + "no2_we", "no2_ae", "no2_diff", + "gases.no2.we", "gases.no2.ae", "gases.no2.diff" +] + +_O3_COLUMNS = [ + "o3", + "ox_we", "ox_ae", "ox_diff", + "o3_we", "o3_ae", "o3_diff", + "gases.o3.we", "gases.o3.ae", "gases.o3.diff" +] + +# Flag Name, Flag Bitmask Value, Columns to Nan +FLAG_DEFINITIONS = [ + Flag("FLAG_STARTUP", 1, "all_columns"), + Flag("FLAG_OPC", 2, _OPC_COLUMNS), + Flag("FLAG_NEPH", 4, _NEPH_COLUMNS), + Flag("FLAG_RHTP", 8, _RHTP_COLUMNS), + Flag("FLAG_CO", 16, _CO_COLUMNS), + Flag("FLAG_NO", 32, _NO_COLUMNS), + Flag("FLAG_NO2", 64, _NO2_COLUMNS), + Flag("FLAG_O3", 128, _O3_COLUMNS), + Flag("FLAG_CO2", 256, ["co2_raw", "co2"]), + Flag("FLAG_SO2", 512, ["so2_we", "so2_ae", "so2_diff", "so2"]), + Flag("FLAG_H2S", 1024, ["h2s_we", "h2s_ae", "h2s_diff", "h2s"]), + Flag("FLAG_BAT", 2048, ["bat_voltage", "soc", "vbat"]), +] + +SUPPORTED_MODELS = ("modulair", "modulair-x", "modulair-pm", "modulair-x-pm") + +# Types of flag criteria +Range = namedtuple("Range", ["column", "lo", "hi"]) +Gap = namedtuple("Gap", ["gap_in_seconds", "post_gap_flag_length_seconds"]) + +FLAG_CRITERIA = { + "database": { + "default": { + "FLAG_STARTUP": [ + Gap(60 * 60, 60 * 60)], + "FLAG_CO": [ + Range("co_ae", 535.0, 800.0), + Range("gases.co.ae", 535.0, 800.0) + ], + "FLAG_NO": [ + Range("no_ae", 640.0, 900.0), + Range("gases.no.ae", 640.0, 900.0) + ], + "FLAG_NO2": [ + Range("no2_ae", 1600.0, 1700.0), + Range("gases.no2.ae", 1600.0, 1700.0) + ], + "FLAG_O3": [ + Range("o3_ae", 1600.0, 1700.0), + Range("gases.o3.ae", 1600.0, 1700.0), + ], + "FLAG_CO2": [ + Range("co2_raw", 1000.0, 5000.0)], + "FLAG_OPC": [ + Range("bin0", 0.0, 1e6), + Range("opc.bin0", 0.0, 1e6) + ], + #"FLAG_NEPH": [], + "FLAG_RHTP": [ + Range("sample_rh", 0.0, 100.0), + Range("sample_temp", -60.0, 85.0), + Range("rh", 0.0, 100.0), + Range("temp", -60.0, 85.0), + ]}, + }, + "rawsd": {} # different logic applies + } + +# Assume all quant-aq products share the same database flagging criteria. +for _model in SUPPORTED_MODELS: + FLAG_CRITERIA["database"][_model] = FLAG_CRITERIA["database"]["default"] + +# Assume cloudapi uses the same flag criteria as database +# (besides name of column to be flagged) +FLAG_CRITERIA["cloudapi"] = FLAG_CRITERIA["database"] + +SUPPORTED_SOURCES = tuple(FLAG_CRITERIA.keys()) + +def flag_name_to_criteria(source, model): + """Return the flag criteria for a given data source and data model. + + Args: + source (str): the data source (in SUPPORTED_SOURCES) + model (str): the device model (in SUPPORTED_MODELS) + + Returns: + dict: Mapping of flag name to flag criteria. + + """ + if source not in SUPPORTED_SOURCES: + error = ValueError(f"Unsupported source: {source!r}") + logger.error(error) + raise error + + if model not in SUPPORTED_MODELS: + error = ValueError(f"Unsupported model: {model!r}") + logger.error(error) + raise error + + if source == 'rawsd': + error = NotImplementedError(f"{source!r} flag criteria are not yet defined.") + logger.error(error) + raise error + + by_model = FLAG_CRITERIA[source] + return by_model[model] diff --git a/tests/files/arisense/SN000-063-db-file1.csv b/tests/files/arisense/SN000-063-db-file1.csv deleted file mode 100644 index 73fc94a..0000000 --- a/tests/files/arisense/SN000-063-db-file1.csv +++ /dev/null @@ -1,52 +0,0 @@ -,id,timestamp,timestamp_local,sn,temp_box,temp_manifold,rh_manifold,pressure,dew_point,noise,solar,wind_dir,wind_speed,opc_flow,co2_raw,voc_raw,co_we,co_ae,no_we,no_ae,no2_we,no2_ae,o3_we,o3_ae,bin0,bin1,bin2,bin3,bin4,bin5,bin6,bin7,bin8,bin9,bin10,bin11,bin12,bin13,bin14,sample_time,lat,lon,flag,device_state -0,7313814,2019-12-13T20:25:07Z,2019-12-13T15:25:07Z,SN000-063,39,36.6,13.3,102123,4.1,1399.3,0.8,61.8,0,0.1,666,0,762,590.9,735.8,693.4,1870.1,1905,1861.3,1873,2.536,0.163,0.052,0.021,0.005,0,0,0,0,0,0,0,0,0,0,10,42.528877,-71.272903,1,CALIBRATION -1,7313805,2019-12-13T20:24:07Z,2019-12-13T15:24:07Z,SN000-063,39.1,36.7,13.3,102124,4.1,1408.5,1,61.8,0,0.1,653.2,0,764.8,587.1,736.7,693.5,1869.4,1905.3,1859.9,1873.4,2.415,0.152,0.047,0.022,0.004,0,0,0,0,0,0,0,0,0,0,10,42.528877,-71.272903,1,CALIBRATION -2,7313799,2019-12-13T20:23:07Z,2019-12-13T15:23:07Z,SN000-063,39.3,36.9,13.6,102127,4.5,1346.7,1,62,0,0.1,663.5,0,766.3,586.9,737.4,693.9,1869,1905.6,1859,1873.3,2.328,0.141,0.045,0.023,0.004,0,0,0,0,0,0,0,0,0,0,10,42.528877,-71.272903,9,CALIBRATION -3,7313792,2019-12-13T20:22:07Z,2019-12-13T15:22:07Z,SN000-063,39.4,37,14.4,102123,5.5,1355.7,1,59.1,0,0.1,603.8,0,770.1,590.4,738.7,694.3,1868.7,1905.5,1858.1,1873.4,2.58,0.16,0.051,0.024,0.005,0,0,0,0,0,0,0,0,0,0,10,42.528877,-71.272903,0,CALIBRATION -4,7313789,2019-12-13T20:21:07Z,2019-12-13T15:21:07Z,SN000-063,39.5,37.1,15,101916,6.2,1407.3,1,63.5,0,0.1,566.2,0,765.3,592.6,733.1,694.7,1873.2,1905.8,1866.4,1873.4,3.584,0.229,0.085,0.039,0.005,0,0,0,0,0,0,0,0,0,0,10,42.528877,-71.272903,0,CALIBRATION -5,7313652,2019-12-13T20:20:07Z,2019-12-13T15:20:07Z,SN000-063,39.6,37.3,13.8,101884,5.1,1381.7,1,62.5,0,0.1,583.2,0,763.4,585.7,735.2,695.3,1871.4,1906,1864.1,1873.1,2.899,0.198,0.07,0.035,0.007,0,0,0,0,0,0,0,0,0,0,10,42.528877,-71.272903,0,CALIBRATION -6,7313641,2019-12-13T20:19:07Z,2019-12-13T15:19:07Z,SN000-063,39.7,37.4,13.3,102126,4.7,1423.7,1,59.3,0,0.1,626,0,771.4,585.5,740.5,695.5,1868,1905.9,1857.2,1873.5,2.203,0.144,0.047,0.024,0.005,0,0,0,0,0,0,0,0,0,0,10,42.528877,-71.272903,0,CALIBRATION -7,7313634,2019-12-13T20:18:07Z,2019-12-13T15:18:07Z,SN000-063,39.9,37.5,13.8,102122,5.2,1372,1,64.5,0,0.1,638.5,0,777.7,585.2,741.8,695.6,1867.5,1906.2,1855.7,1873,2.228,0.144,0.048,0.023,0.006,0,0,0,0,0,0,0,0,0,0,10,42.528877,-71.272903,0,CALIBRATION -8,7313625,2019-12-13T20:17:07Z,2019-12-13T15:17:07Z,SN000-063,40,37.7,13.9,102084,5.5,1377.3,0.8,59.3,0,0.1,654.8,0,779.5,583,741.5,696,1867.5,1906.8,1856.3,1873.1,2.282,0.152,0.053,0.026,0.005,0.001,0,0,0,0,0,0,0,0,0,10,42.528877,-71.272903,0,CALIBRATION -9,7313619,2019-12-13T20:16:07Z,2019-12-13T15:16:07Z,SN000-063,40.1,37.8,14.3,102122,6.1,1417.2,0.8,63.4,0,0.1,622,0,780.5,577.6,742.9,696.3,1866,1906.7,1853.1,1873,2.173,0.138,0.045,0.023,0.005,0,0,0,0,0,0,0,0,0,0,10,42.528877,-71.272903,0,CALIBRATION -10,7313474,2019-12-13T20:15:07Z,2019-12-13T15:15:07Z,SN000-063,40.3,38,16.5,102023,8.2,1398.8,1,61.3,0,0.1,550.8,0,790.1,581.5,740.4,696.5,1869.4,1907.4,1858.1,1873.5,3.007,0.211,0.074,0.037,0.004,0,0,0,0,0,0,0,0,0,0,10,42.528877,-71.272903,0,CALIBRATION -11,7313468,2019-12-13T20:14:07Z,2019-12-13T15:14:07Z,SN000-063,40.4,38.1,18.2,101957,9.8,1417,1,58.3,0,0.1,545,0,815.5,588,738.4,696.9,1874.6,1907.3,1866.8,1873.4,3.467,0.237,0.092,0.042,0.004,0,0,0,0,0,0,0,0,0,0,10,42.528877,-71.272903,0,CALIBRATION -12,7313462,2019-12-13T20:13:07Z,2019-12-13T15:13:07Z,SN000-063,40.5,38.2,18.5,102060,10.1,1373,0.8,62.6,0,0.1,535.8,0,806.7,588.4,741.7,697.7,1879.1,1907.7,1873.2,1873.2,3.404,0.233,0.089,0.042,0.004,0,0,0,0,0,0,0,0,0,0,10,42.528877,-71.272903,0,CALIBRATION -13,7313456,2019-12-13T20:12:07Z,2019-12-13T15:12:07Z,SN000-063,40.7,38.4,18.4,102058,10.2,1379.3,1,62.3,0,0.1,537,0,816.1,590.8,747.1,697.9,1879.8,1907.7,1874.1,1873,3.202,0.245,0.09,0.043,0.003,0,0,0,0,0,0,0,0,0,0,10,42.528877,-71.272903,0,CALIBRATION -14,7313451,2019-12-13T20:11:07Z,2019-12-13T15:11:07Z,SN000-063,40.8,38.5,18.3,102054,10.2,1416.3,0.8,57,0,0.1,534,0,866.7,590,749.8,698.4,1880.2,1907.9,1874.4,1873.1,3.253,0.24,0.086,0.043,0.004,0,0,0,0,0,0,0,0,0,0,10,42.528877,-71.272903,0,CALIBRATION -15,7313306,2019-12-13T20:10:07Z,2019-12-13T15:10:07Z,SN000-063,41,38.7,18.2,102056,10.3,1389.7,1,64.9,0,0.1,530.5,0,972.1,592.8,757.6,698.7,1881.4,1908.1,1875.7,1872.6,3.207,0.237,0.085,0.042,0.003,0,0,0,0,0,0,0,0,0,0,10,42.528877,-71.272903,0,CALIBRATION -16,7313297,2019-12-13T20:09:07Z,2019-12-13T15:09:07Z,SN000-063,41.1,38.8,18.2,102065,10.4,1420.8,1,61,0,0.1,537,0,1042.6,594.5,765.6,699.4,1882.7,1908.6,1876.9,1873.1,3.112,0.23,0.087,0.044,0.004,0,0,0,0,0,0,0,0,0,0,10,42.528877,-71.272903,0,CALIBRATION -17,7313289,2019-12-13T20:08:07Z,2019-12-13T15:08:07Z,SN000-063,41.2,38.9,18.1,102064,10.4,1365.2,1,61.5,0,0.1,528.8,0,1111.3,594.6,769,699.6,1881.2,1908.4,1874.7,1872.7,3.037,0.24,0.086,0.04,0.004,0,0,0,0,0,0,0,0,0,0,10,42.528877,-71.272903,0,CALIBRATION -18,7313280,2019-12-13T20:07:07Z,2019-12-13T15:07:07Z,SN000-063,41.4,39.1,18.1,102070,10.5,1367.5,1,61.9,0,0.1,546.2,0,1247.4,599,777.4,700.4,1877.2,1908.6,1869.7,1872.8,3.009,0.237,0.088,0.042,0.004,0,0,0,0,0,0,0,0,0,0,10,42.528877,-71.272903,0,CALIBRATION -19,7313274,2019-12-13T20:06:07Z,2019-12-13T15:06:07Z,SN000-063,41.5,39.2,18.1,102072,10.6,1410.7,1,63,0,0.1,537.5,0,1300.5,600,785.1,700.6,1873.8,1908.7,1865.6,1872.7,3.093,0.241,0.093,0.042,0.004,0,0,0,0,0,0,0,0,0,0,10,42.528877,-71.272903,0,CALIBRATION -20,7313118,2019-12-13T20:05:07Z,2019-12-13T15:05:07Z,SN000-063,41.7,39.4,18,102074,10.7,1392.7,1,63.5,0,0.1,530,0,1257.7,599,784.7,700.9,1873,1909.1,1864.2,1872.9,3.248,0.242,0.093,0.044,0.005,0,0,0,0,0,0,0,0,0,0,10,42.528877,-71.272903,0,CALIBRATION -21,7313111,2019-12-13T20:04:07Z,2019-12-13T15:04:07Z,SN000-063,41.9,39.5,17.9,102076,10.7,1417.8,0.8,61.9,0,0.1,536.5,0,1172.7,599.8,779.9,701.3,1871.8,1909.3,1862.2,1872.3,3.253,0.247,0.096,0.045,0.004,0,0,0,0,0,0,0,0,0,0,10,42.528877,-71.272903,0,CALIBRATION -22,7313105,2019-12-13T20:03:07Z,2019-12-13T15:03:07Z,SN000-063,42,39.7,17.9,102071,10.8,1372.8,0.8,61.6,0,0.1,526.8,0,1141.3,601.3,774.6,701.7,1870.6,1909.4,1861.1,1872.5,3.257,0.244,0.088,0.043,0.003,0,0,0,0,0,0,0,0,0,0,10,42.528877,-71.272903,0,CALIBRATION -23,7313100,2019-12-13T20:02:07Z,2019-12-13T15:02:07Z,SN000-063,42.1,39.8,17.8,102069,10.9,1375.7,1,57.7,0,0.1,535.5,0,1160.3,604.8,774,702.1,1870.7,1909.7,1860.8,1872.4,3.303,0.245,0.093,0.042,0.004,0,0,0,0,0,0,0,0,0,0,10,42.528877,-71.272903,0,CALIBRATION -24,7313096,2019-12-13T20:01:07Z,2019-12-13T15:01:07Z,SN000-063,42.3,40,17.7,102072,10.9,1440,1,65.1,0,0.1,533.8,0,1193,603.7,771.6,702.5,1871.5,1909.7,1861.5,1872.2,3.475,0.256,0.097,0.046,0.004,0,0,0,0,0,0,0,0,0,0,10,42.528877,-71.272903,0,CALIBRATION -25,7312950,2019-12-13T20:00:07Z,2019-12-13T15:00:07Z,SN000-063,42.5,40.2,17.7,102072,11.1,1430.3,1,58,0,0.1,542.2,0,1184.2,607.5,768.1,703.1,1871.8,1910.1,1861.8,1872.8,3.653,0.261,0.101,0.049,0.004,0,0,0,0,0,0,0,0,0,0,10,42.528877,-71.272903,0,CALIBRATION -26,7312941,2019-12-13T19:59:07Z,2019-12-13T14:59:07Z,SN000-063,42.6,40.3,17.7,102068,11.1,1419.7,0.7,60.8,0,0.1,537,0,1122.3,606.9,771,703.5,1871.6,1910.3,1861.3,1872.1,3.843,0.269,0.101,0.05,0.004,0,0,0,0,0,0,0,0,0,0,10,42.528877,-71.272903,0,CALIBRATION -27,7312932,2019-12-13T19:58:07Z,2019-12-13T14:58:07Z,SN000-063,42.7,40.5,17.6,102065,11.2,1369.2,0.8,63.3,0,0.1,529.5,0,991.7,604.2,778.7,704,1870.8,1910.6,1859.6,1872.3,3.751,0.252,0.086,0.04,0.004,0,0,0,0,0,0,0,0,0,0,10,42.528877,-71.272903,0,CALIBRATION -28,7312925,2019-12-13T19:57:07Z,2019-12-13T14:57:07Z,SN000-063,42.9,40.6,17.6,102063,11.3,1368.7,1,59.2,0,0.1,539.8,0,953.2,610.3,785.8,704.6,1870.7,1910.8,1859.7,1872.2,3.654,0.264,0.088,0.039,0.004,0,0,0,0,0,0,0,0,0,0,10,42.528877,-71.272903,0,CALIBRATION -29,7312920,2019-12-13T19:56:07Z,2019-12-13T14:56:07Z,SN000-063,43.1,40.8,17.5,102057,11.4,1422.2,1,59.7,0,0.1,531.8,0,1029.1,612.4,785.6,705.2,1872.1,1911.2,1860.6,1872.2,3.684,0.26,0.082,0.041,0.003,0,0,0,0,0,0,0,0,0,0,10,42.528877,-71.272903,0,CALIBRATION -30,7312763,2019-12-13T19:55:07Z,2019-12-13T14:55:07Z,SN000-063,43.2,40.9,17.5,102058,11.5,1404.3,1,58.6,0,0.1,535.8,0,1175.5,614,778.5,705.4,1876.2,1911.3,1866.1,1872.2,3.799,0.27,0.09,0.039,0.004,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -31,7312757,2019-12-13T19:54:07Z,2019-12-13T14:54:07Z,SN000-063,43.4,41.1,17.4,102062,11.5,1402,1,60.8,0,0.1,533.2,0,1245,617.6,772.1,706.1,1880.3,1911.3,1870.4,1872.3,3.759,0.273,0.089,0.037,0.004,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -32,7312751,2019-12-13T19:53:07Z,2019-12-13T14:53:07Z,SN000-063,43.6,41.3,17.4,102060,11.7,1379.3,1,64,0,0.1,532.2,0,1227.3,616.3,775.6,706.6,1879.9,1912,1869.4,1871.9,3.74,0.266,0.085,0.037,0.004,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -33,7312745,2019-12-13T19:52:07Z,2019-12-13T14:52:07Z,SN000-063,43.7,41.4,17.3,102062,11.7,1381.8,0.7,58,0,0.1,532.2,0,1189,619.1,785.3,706.8,1879.5,1912.1,1868.4,1872.3,3.861,0.273,0.084,0.036,0.004,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -34,7312741,2019-12-13T19:51:07Z,2019-12-13T14:51:07Z,SN000-063,43.9,41.6,17.3,102062,11.8,1426,1,61.1,0,0.1,523,0,1143.9,619.1,795.9,707.4,1878.5,1912.6,1866.6,1872.4,3.866,0.271,0.082,0.035,0.004,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -35,7312592,2019-12-13T19:50:07Z,2019-12-13T14:50:07Z,SN000-063,44.1,41.7,17.2,102066,11.9,1398.8,1,63.7,0,0.1,534,0,1093.4,621,798.5,708,1877.1,1912.7,1864.4,1872.1,3.922,0.262,0.088,0.037,0.004,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -36,7312583,2019-12-13T19:49:07Z,2019-12-13T14:49:07Z,SN000-063,44.2,41.9,17.2,102070,12.1,1417.7,1,62,0,0.1,537.5,0,979.5,620.2,804.4,708.4,1873,1912.7,1858.7,1872.3,3.969,0.267,0.085,0.038,0.004,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -37,7312573,2019-12-13T19:48:07Z,2019-12-13T14:48:07Z,SN000-063,44.4,42.1,17.3,102067,12.2,1365.2,1,58.7,0,0.1,533.2,0,940.8,621.8,809.3,709,1868.5,1913.3,1853.3,1872.6,3.838,0.27,0.089,0.037,0.005,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -38,7312565,2019-12-13T19:47:07Z,2019-12-13T14:47:07Z,SN000-063,44.6,42.2,17.3,102068,12.3,1400.8,1,61.5,0,0.1,541.2,0,1003.5,626,807.5,709.7,1868.8,1913.7,1853.1,1872.4,3.783,0.272,0.085,0.038,0.004,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -39,7312558,2019-12-13T19:46:07Z,2019-12-13T14:46:07Z,SN000-063,44.7,42.4,17.3,102067,12.5,1428.5,1,59.2,0,0.1,526.5,0,1123.5,626,799.8,710,1871,1913.6,1855.4,1872.4,3.738,0.274,0.084,0.036,0.004,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -40,7312414,2019-12-13T19:45:07Z,2019-12-13T14:45:07Z,SN000-063,44.9,42.6,17.4,102059,12.7,1406.7,0.8,59.6,0,0.1,528,0,1180.3,628.1,786,710.5,1873.8,1914.4,1858.1,1872.3,3.748,0.277,0.084,0.035,0.003,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -41,7312407,2019-12-13T19:44:07Z,2019-12-13T14:44:07Z,SN000-063,45.1,42.7,17.4,102058,12.9,1416.2,1,62,0,0.1,527.8,0,1150.8,627.1,790.2,711,1873.5,1914.9,1857.6,1872.7,3.839,0.298,0.093,0.039,0.003,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -42,7312399,2019-12-13T19:43:07Z,2019-12-13T14:43:07Z,SN000-063,45.2,42.9,17.4,102050,13,1376.2,1,60.5,0,0.1,529.5,0,1087.1,626,800.7,711.5,1873.8,1914.6,1857.7,1873.1,3.935,0.312,0.096,0.038,0.004,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -43,7312393,2019-12-13T19:42:07Z,2019-12-13T14:42:07Z,SN000-063,45.4,43,17.5,102050,13.2,1386.5,0.8,59.6,0,0.1,543.8,0,1073.1,625.5,814.6,712.1,1874.2,1915.7,1857,1873,3.953,0.299,0.097,0.041,0.004,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -44,7312386,2019-12-13T19:41:07Z,2019-12-13T14:41:07Z,SN000-063,45.6,43.2,17.7,102053,13.5,1430.8,0.7,63.4,0,0.1,528.2,0,1142.3,627.5,815.6,712.5,1873.8,1915.8,1856.2,1873,3.78,0.291,0.089,0.037,0.004,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -45,7312231,2019-12-13T19:40:07Z,2019-12-13T14:40:07Z,SN000-063,45.7,43.4,17.7,102053,13.6,1403.8,1,61.4,0,0.1,526,0,1284.7,627.1,817.5,712.7,1873.1,1915.7,1854.4,1873.2,3.479,0.271,0.088,0.036,0.004,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -46,7312222,2019-12-13T19:39:07Z,2019-12-13T14:39:07Z,SN000-063,45.9,43.5,17.9,102054,13.9,1418.7,0.8,59.9,0,0.1,524,0,1344.3,623.6,819,713.2,1872.6,1916.3,1853.1,1873.8,3.443,0.265,0.077,0.035,0.004,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -47,7312215,2019-12-13T19:38:07Z,2019-12-13T14:38:07Z,SN000-063,46.1,43.6,18,102060,14.2,1376.3,1,61.5,0,0.1,525.5,0,1258.2,619.7,818,713.5,1872.4,1916.7,1852.1,1874.1,3.399,0.259,0.08,0.035,0.004,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -48,7312209,2019-12-13T19:37:07Z,2019-12-13T14:37:07Z,SN000-063,46.3,43.8,18.4,102064,14.6,1383.5,1,60.8,0,0.1,542,0,1069.2,614,812.2,714.2,1872.5,1917.5,1851.2,1874.3,3.366,0.254,0.08,0.036,0.003,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -49,7312205,2019-12-13T19:36:07Z,2019-12-13T14:36:07Z,SN000-063,46.4,43.9,18.7,102068,14.9,1426.8,1,58.6,0,0.1,523,0,977.6,609.5,800.6,713,1872.2,1918,1850.2,1874.7,3.286,0.25,0.081,0.037,0.004,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -50,7312053,2019-12-13T19:35:07Z,2019-12-13T14:35:07Z,SN000-063,46.6,44.1,19.1,102069,15.4,1413.2,1,56.4,0,0.1,525.8,0,1030,602.2,803.2,714.4,1870.7,1918.6,1847.7,1874.9,3.25,0.255,0.079,0.034,0.003,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION \ No newline at end of file diff --git a/tests/files/arisense/SN000-063-db-file2.csv b/tests/files/arisense/SN000-063-db-file2.csv deleted file mode 100644 index be36449..0000000 --- a/tests/files/arisense/SN000-063-db-file2.csv +++ /dev/null @@ -1,52 +0,0 @@ -deviceID,123121nlk -,id,timestamp,timestamp_local,sn,temp_box,temp_manifold,rh_manifold,pressure,dew_point,noise,solar,wind_dir,wind_speed,opc_flow,co2_raw,voc_raw,co_we,co_ae,no_we,no_ae,no2_we,no2_ae,o3_we,o3_ae,bin0,bin1,bin2,bin3,bin4,bin5,bin6,bin7,bin8,bin9,bin10,bin11,bin12,bin13,bin14,sample_time,lat,lon,flag,device_state -51,7312046,2019-12-13T19:34:07Z,2019-12-13T14:34:07Z,SN000-063,46.7,44.2,19.6,102069,15.9,1433.7,0.8,60.4,0,0.1,529.2,0,1128,594.8,807.4,714.7,1866.5,1918.9,1841,1875.2,3.195,0.24,0.077,0.038,0.004,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -52,7312041,2019-12-13T19:33:07Z,2019-12-13T14:33:07Z,SN000-063,46.9,44.3,20.2,102072,16.4,1389.7,1,63.4,0,0.1,524,0,1176.3,580.6,811.7,714.7,1862,1919.4,1834.2,1875.8,3.115,0.238,0.078,0.038,0.004,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -53,7312035,2019-12-13T19:32:07Z,2019-12-13T14:32:07Z,SN000-063,47,44.5,21.1,102082,17.3,1378,1,61.9,0,0.1,523,0,1139.5,563.7,806.9,715,1862,1920.3,1833,1876.4,3.116,0.242,0.074,0.039,0.003,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -54,7312030,2019-12-13T19:31:07Z,2019-12-13T14:31:07Z,SN000-063,47.2,44.6,22.6,102081,18.4,1405.8,0.8,56.7,0,0.1,524.8,0,1032.1,542.2,795.1,714.8,1860.7,1921.2,1829.4,1876.4,3.192,0.238,0.079,0.038,0.004,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -55,7311887,2019-12-13T19:30:07Z,2019-12-13T14:30:07Z,SN000-063,47.3,44.7,25.3,102082,20.4,1368.8,0.8,64.1,0,0.1,521.2,0,986.2,518.5,780,715.1,1857.4,1921.8,1823.9,1876.4,3.081,0.256,0.077,0.043,0.004,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -56,7311880,2019-12-13T19:29:07Z,2019-12-13T14:29:07Z,SN000-063,47.4,44.9,30.9,102090,23.8,1414.8,1,64,0,0.1,518,0,1027,512.5,779.4,715.1,1858.3,1922.9,1823.9,1876.6,3.011,0.233,0.072,0.043,0.004,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -57,7311870,2019-12-13T19:28:07Z,2019-12-13T14:28:07Z,SN000-063,47.5,45,39.3,102105,28,1379,1,56.9,0,0.1,505.5,0,1077.1,546.3,756.6,717.5,1883.4,1924.2,1866.4,1878.3,2.504,0.185,0.051,0.027,0.002,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -58,7311862,2019-12-13T19:27:07Z,2019-12-13T14:27:07Z,SN000-063,47.6,45.1,41.1,102163,28.8,1380.3,1,62.3,0,0.1,518.8,0,1079.6,549.6,740.4,718.6,1895.4,1924.3,1891.2,1878.2,2.136,0.158,0.043,0.023,0.001,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -59,7311856,2019-12-13T19:26:07Z,2019-12-13T14:26:07Z,SN000-063,47.7,45.1,41,102159,28.8,1424.7,0.8,59.2,0,0.1,513.2,0,1079.9,550.8,740.5,719.4,1895.5,1924.3,1891.6,1878,2.111,0.159,0.042,0.021,0.001,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -60,7311710,2019-12-13T19:25:07Z,2019-12-13T14:25:07Z,SN000-063,47.7,45.2,40.8,102152,28.8,1398.3,1,59.2,0,0.1,527.5,0,1078.9,551.1,741.2,720.2,1895.4,1924.7,1891.4,1877.7,2.15,0.154,0.043,0.023,0.001,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -61,7311703,2019-12-13T19:24:07Z,2019-12-13T14:24:07Z,SN000-063,47.8,45.3,40.7,102152,28.9,1423.5,0.8,62.8,0,0.1,533.2,0,1080.1,551.2,742,721.1,1895.5,1924.6,1891.3,1877.9,2.137,0.153,0.04,0.02,0.001,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -62,7311696,2019-12-13T19:23:07Z,2019-12-13T14:23:07Z,SN000-063,47.9,45.4,40.6,102148,28.9,1374.5,1,62.7,0,0.1,527.2,0,1079.2,550.7,742.2,722,1895.6,1924.6,1891.9,1877.9,2.137,0.156,0.043,0.021,0.001,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -63,7311690,2019-12-13T19:22:07Z,2019-12-13T14:22:07Z,SN000-063,48,45.5,40.5,102148,28.9,1380.5,0.8,64.3,0,0.1,540.2,0,1078.8,553.7,742.8,722.8,1895.7,1924.5,1891.8,1877.8,2.181,0.165,0.049,0.024,0.002,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -64,7311684,2019-12-13T19:21:07Z,2019-12-13T14:21:07Z,SN000-063,48.1,45.5,40.3,102144,28.9,1428.2,1,59.8,0,0.1,541,0,1078.1,553.6,743.3,723.6,1895.8,1925,1892.1,1877.7,2.172,0.162,0.048,0.025,0.002,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -65,7311538,2019-12-13T19:20:07Z,2019-12-13T14:20:07Z,SN000-063,48.1,45.6,40.2,102139,28.9,1403.8,1,58,0,0.1,550.2,0,1077.7,553.7,743.9,724.6,1895.7,1924.7,1892.3,1877.4,2.186,0.161,0.046,0.023,0.001,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -66,7311529,2019-12-13T19:19:07Z,2019-12-13T14:19:07Z,SN000-063,48.2,45.7,40,102144,28.9,1430.3,0.8,61,0,0.1,555.2,0,1078.2,553.7,744.5,725.4,1895.7,1924.9,1892.3,1877.4,2.176,0.16,0.048,0.025,0.001,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -67,7311521,2019-12-13T19:18:07Z,2019-12-13T14:18:07Z,SN000-063,48.3,45.8,39.9,102154,28.9,1380.3,1,62,0,0.1,559.8,0,1078.9,552.6,745.3,726.5,1895.7,1925.3,1892.2,1877.3,2.199,0.166,0.045,0.025,0.001,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -68,7311513,2019-12-13T19:17:07Z,2019-12-13T14:17:07Z,SN000-063,48.4,45.9,39.8,102148,28.9,1372.8,1,60.5,0,0.1,571.2,0,1079,554.4,745.6,727.3,1896.2,1925.3,1892.9,1877.6,2.226,0.163,0.045,0.025,0.002,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -69,7311508,2019-12-13T19:16:07Z,2019-12-13T14:16:07Z,SN000-063,48.5,46,39.6,102151,29,1423,0.8,60.9,0,0.1,572,0,1078.7,553,746.2,728.4,1896.1,1925.2,1893.3,1876.7,2.193,0.157,0.045,0.024,0.001,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -70,7311364,2019-12-13T19:15:07Z,2019-12-13T14:15:07Z,SN000-063,48.6,46,39.5,102150,29,1395.5,0.8,58.4,0,0.1,577.8,0,1079.5,555.5,746.9,729.5,1896.3,1925.2,1893.7,1877.2,2.225,0.158,0.047,0.022,0.001,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -71,7311357,2019-12-13T19:14:07Z,2019-12-13T14:14:07Z,SN000-063,48.7,46.1,39.4,102148,29,1417.5,0.8,60.1,0,0.1,603.2,0,1079.1,556.3,747.4,730.5,1896.7,1925.3,1894.7,1876.8,2.192,0.157,0.04,0.02,0.001,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -72,7311350,2019-12-13T19:13:07Z,2019-12-13T14:13:07Z,SN000-063,48.7,46.2,39.3,102150,29.1,1369.8,1,64.9,0,0.1,610.5,0,1079.2,557.3,747.9,731.5,1897,1925.7,1895.7,1877,2.189,0.157,0.044,0.019,0.001,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -73,7311344,2019-12-13T19:12:07Z,2019-12-13T14:12:07Z,SN000-063,48.9,46.3,39.3,102151,29.1,1376.7,1,64.8,0,0.1,625.5,0,1077.9,558.3,748.1,732.6,1897.6,1925.5,1898.5,1876.9,2.167,0.154,0.042,0.02,0.001,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -74,7311339,2019-12-13T19:11:07Z,2019-12-13T14:11:07Z,SN000-063,48.9,46.4,39.1,102150,29.1,1427.7,1,57.9,0,0.1,643.5,0,1077.5,559.9,749.1,734.1,1897.9,1925.9,1901.2,1876.5,2.184,0.156,0.042,0.021,0.001,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -75,7311194,2019-12-13T19:10:07Z,2019-12-13T14:10:07Z,SN000-063,49,46.5,38.9,102146,29.1,1401.8,1,59.9,0,0.1,661.8,0,1077.3,561.6,750.3,735.1,1898.1,1926.2,1904.7,1876.6,2.198,0.172,0.05,0.024,0.001,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -76,7311181,2019-12-13T19:09:07Z,2019-12-13T14:09:07Z,SN000-063,49.2,46.6,38.6,102157,29.1,1420.5,1,57.9,0,0.1,673.5,0,1074.6,561.6,751.4,736.3,1898.1,1926.3,1909.8,1876.5,2.235,0.171,0.045,0.022,0.001,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -77,7311174,2019-12-13T19:08:07Z,2019-12-13T14:08:07Z,SN000-063,49.2,46.7,38.3,102155,29,1378.3,1,63.3,0,0.1,681.5,0,1074.7,560.7,753.7,737.3,1897.2,1926.2,1915.4,1876.5,2.314,0.175,0.05,0.023,0.001,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -78,7311167,2019-12-13T19:07:07Z,2019-12-13T14:07:07Z,SN000-063,49.3,46.8,38.2,102154,29.1,1383.7,1,63.3,0,0.1,718,0,1073.8,564,754.8,738.6,1897.3,1926.3,1926,1876.2,2.289,0.17,0.049,0.022,0.001,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -79,7311162,2019-12-13T19:06:07Z,2019-12-13T14:06:07Z,SN000-063,49.4,46.9,38,102156,29.1,1431,1,55.9,0,0.1,720.2,0,1072.8,563.2,754.8,740,1897.5,1926.9,1931.3,1876.3,2.29,0.17,0.045,0.022,0.001,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -80,7311024,2019-12-13T19:05:07Z,2019-12-13T14:05:07Z,SN000-063,49.6,47,37.9,102164,29.1,1405.3,1,58.8,0,0.1,744.2,0,1074.4,566.4,756.7,741.4,1896.2,1926.6,1911.5,1876.1,2.27,0.169,0.047,0.019,0.001,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -81,7311018,2019-12-13T19:04:07Z,2019-12-13T14:04:07Z,SN000-063,49.7,47.1,37.7,102162,29.1,1421.5,1,60.7,0,0.1,659.8,0,1071.1,567.9,766.8,742.7,1891.3,1926.6,1887.1,1876.1,2.269,0.174,0.045,0.022,0.001,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -82,7311011,2019-12-13T19:03:07Z,2019-12-13T14:03:07Z,SN000-063,49.8,47.2,37.6,102169,29.1,1380.7,1,61.7,0,0.1,477.8,0,1064.8,567.9,768.6,744,1891.2,1926.9,1886.7,1875.9,2.313,0.181,0.048,0.023,0.001,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -83,7311004,2019-12-13T19:02:07Z,2019-12-13T14:02:07Z,SN000-063,49.9,47.3,37.3,102163,29.1,1404.2,0.8,62.5,0,0.1,481.5,0,1063.2,567.5,769.7,745.3,1890.8,1927.2,1886.6,1876.2,2.385,0.194,0.05,0.025,0.001,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -84,7310998,2019-12-13T19:01:07Z,2019-12-13T14:01:07Z,SN000-063,50,47.4,37.1,102166,29.1,1478.8,1,63.4,0,0.1,465,0,1062,568,771.1,746.8,1890.6,1927.5,1886.6,1875.8,2.383,0.195,0.053,0.025,0.002,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -85,7310868,2019-12-13T19:00:07Z,2019-12-13T14:00:07Z,SN000-063,50.1,47.5,37,102163,29.1,1440.7,1,55.7,0,0.1,470.2,0,1062.6,571.8,772.9,748.4,1890.2,1927.6,1885.6,1875.9,2.403,0.203,0.052,0.028,0.002,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -86,7310858,2019-12-13T18:59:07Z,2019-12-13T13:59:07Z,SN000-063,50.2,47.6,36.8,102164,29.2,1434,1,55,0,0.1,475.5,0,1062,572.7,773.7,749.7,1890.5,1927.8,1886,1875.6,2.435,0.2,0.057,0.027,0.002,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -87,7310849,2019-12-13T18:58:07Z,2019-12-13T13:58:07Z,SN000-063,50.4,47.7,36.7,102169,29.2,1382,0.8,62.8,0,0.1,473,0,1060.9,572.4,775.1,751.1,1890.2,1927.9,1885.6,1875.4,2.425,0.202,0.052,0.025,0.002,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -88,7310842,2019-12-13T18:57:07Z,2019-12-13T13:57:07Z,SN000-063,50.5,47.8,36.5,102170,29.2,1382.5,1,58.5,0,0.1,473,0,1061.3,574.4,776.2,752.6,1890.2,1928.1,1885.7,1875.8,2.401,0.196,0.056,0.025,0.001,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -89,7310836,2019-12-13T18:56:07Z,2019-12-13T13:56:07Z,SN000-063,50.6,47.9,36.3,102174,29.2,1431.3,1,63.8,0,0.1,471.2,0,1061.4,574.8,777.5,754.3,1890.2,1928.7,1885.7,1875.4,2.401,0.197,0.051,0.024,0.002,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -90,7310693,2019-12-13T18:55:07Z,2019-12-13T13:55:07Z,SN000-063,50.7,48,36.2,102183,29.2,1405.2,1,59.6,0,0.1,468.8,0,1061.2,576.9,778.4,755.6,1890.5,1928.7,1886.3,1875.7,2.414,0.198,0.05,0.024,0.001,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -91,7310688,2019-12-13T18:54:07Z,2019-12-13T13:54:07Z,SN000-063,50.8,48.1,36,102184,29.2,1422.3,0.8,56,0,0.1,469,0,1061.4,579.3,779.6,757.5,1890.4,1928.8,1886.5,1875.6,2.462,0.206,0.05,0.025,0.001,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -92,7310682,2019-12-13T18:53:07Z,2019-12-13T13:53:07Z,SN000-063,51,48.2,35.7,102187,29.2,1385.8,1,60.6,0,0.1,469.8,0,1061.3,579,780.6,758.9,1890.7,1929.1,1886.8,1875.7,2.468,0.213,0.058,0.029,0.002,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -93,7310676,2019-12-13T18:52:07Z,2019-12-13T13:52:07Z,SN000-063,51.1,48.3,35.5,102183,29.2,1384.2,1,60.4,0,0.1,466,0,1061.4,582.4,781.5,760.3,1890.7,1929.5,1886.9,1875.5,2.444,0.209,0.056,0.025,0.001,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -94,7310671,2019-12-13T18:51:07Z,2019-12-13T13:51:07Z,SN000-063,51.2,48.5,35.3,102188,29.1,1432.2,0.8,59.9,0,0.1,473,0,1062.6,585.4,782.9,762.1,1891.1,1929.6,1887.5,1875.8,2.416,0.2,0.053,0.024,0.002,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -95,7310515,2019-12-13T18:50:07Z,2019-12-13T13:50:07Z,SN000-063,51.4,48.6,35.1,102191,29.2,1413.2,1,63,0,0.1,469.2,0,1062.7,586.2,783.3,763.5,1892.1,1930,1888.7,1875.5,2.386,0.201,0.053,0.026,0.002,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -96,7310507,2019-12-13T18:49:07Z,2019-12-13T13:49:07Z,SN000-063,51.5,48.7,34.9,102192,29.1,1437.8,0.8,60.9,0,0.1,469.2,0,1064.2,588.5,784.2,765.1,1892.8,1930.2,1889.6,1875.7,2.361,0.192,0.053,0.023,0.001,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -97,7310499,2019-12-13T18:48:07Z,2019-12-13T13:48:07Z,SN000-063,51.6,48.8,34.6,102192,29.1,1392.5,1,57.4,0,0.1,467.5,0,1065.8,591.7,785.1,766.6,1893.2,1930.1,1890.6,1875.5,2.358,0.199,0.053,0.024,0.002,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -98,7310494,2019-12-13T18:47:07Z,2019-12-13T13:47:07Z,SN000-063,51.8,48.9,34.3,102190,29,1434,0.8,61.5,0,0.1,475,0,1066.4,593.6,785.5,768,1894.3,1931,1892.1,1875.8,2.372,0.2,0.053,0.024,0.001,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -99,7310490,2019-12-13T18:46:07Z,2019-12-13T13:46:07Z,SN000-063,51.9,49,34,102194,28.9,1439.7,1,58.1,0,0.1,467,0,1066.5,597.9,787.1,769.6,1895.3,1931,1893.5,1875.7,2.328,0.195,0.051,0.023,0.001,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION -100,7310347,2019-12-13T18:45:07Z,2019-12-13T13:45:07Z,SN000-063,52,49.1,33.6,102206,28.8,1415.7,0.8,61.1,0,0.1,467,0,1068,600.9,787.3,770.4,1896.2,1931.4,1894.8,1875.6,2.278,0.194,0.051,0.025,0.001,0,0,0,0,0,0,0,0,0,0,10,42.517986,-71.273705,0,CALIBRATION \ No newline at end of file diff --git a/tests/files/arisense/ref/ref.csv b/tests/files/arisense/ref/ref.csv deleted file mode 100644 index fddf80c..0000000 --- a/tests/files/arisense/ref/ref.csv +++ /dev/null @@ -1,100 +0,0 @@ -,timestamp,caps_no2,co2,no,no2,co,o3 -0,12/7/19 0:00,9.487,525.119,2.494,10.139,211.889,-4.12 -1,12/7/19 0:01,9.64,523.499,2.484,10.189,216.5,-3.889 -2,12/7/19 0:02,9.585,523.361,2.476,10.239,219,-3.767 -3,12/7/19 0:03,9.429,522.993,2.47,10.279,217.75,-3.383 -4,12/7/19 0:04,9.321,523.596,2.478,10.297,222.333,-3.671 -5,12/7/19 0:05,9.237,524.776,2.458,10.338,221.455,-3.838 -6,12/7/19 0:06,9.308,524.883,2.462,10.348,223.4,-3.72 -7,12/7/19 0:07,9.203,525.741,2.474,10.349,221.857,-3.833 -8,12/7/19 0:08,9.149,529.484,2.48,10.322,218.25,-3.66 -9,12/7/19 0:09,9.202,530.092,2.518,10.257,221.625,-3.788 -10,12/7/19 0:10,9.138,530.74,2.541,10.192,222,-3.46 -11,12/7/19 0:11,9.147,530.308,2.548,10.15,216.9,-3.675 -12,12/7/19 0:12,5.808,530.81,2.55,10.133,212.727,-3.733 -13,12/7/19 0:13,5.165,528.401,2.561,10.116,218.818,-3.733 -14,12/7/19 0:14,9.312,528.273,2.577,10.112,224.143,-3.922 -15,12/7/19 0:15,9.339,527.302,2.578,10.124,219.333,-3.857 -16,12/7/19 0:16,9.273,529.196,2.576,10.143,217.25,-4.117 -17,12/7/19 0:17,9.321,528.775,2.57,10.156,214.545,-3.457 -18,12/7/19 0:18,9.364,526.389,2.581,10.163,216.273,-3.371 -19,12/7/19 0:19,9.271,524.916,2.584,10.182,216.556,-3.54 -20,12/7/19 0:20,9.244,525.108,2.605,10.181,225.417,-3.786 -21,12/7/19 0:21,9.307,523.754,2.619,10.2,225.444,-3.829 -22,12/7/19 0:22,9.224,525.409,2.629,10.198,224.222,-3.343 -23,12/7/19 0:23,9.3,524.883,2.662,10.153,221.833,-3.443 -24,12/7/19 0:24,9.22,524.599,2.679,10.131,222,-4.088 -25,12/7/19 0:25,9.315,524.584,2.683,10.128,213.6,-4.029 -26,12/7/19 0:26,9.198,527.845,2.689,10.142,207.667,-3.986 -27,12/7/19 0:27,9.206,526.776,2.698,10.138,216,-4.08 -28,12/7/19 0:28,5.898,524.952,2.708,10.133,218.583,-4.088 -29,12/7/19 0:29,4.625,524.182,2.717,10.116,220.636,-3.833 -30,12/7/19 0:30,9.288,525.985,2.723,10.145,222.167,-3.85 -31,12/7/19 0:31,9.275,525.573,2.708,10.206,224.9,-3.986 -32,12/7/19 0:32,9.315,526.398,2.703,10.251,225.778,-3.9 -33,12/7/19 0:33,9.308,526.296,2.717,10.257,232.111,-3.613 -34,12/7/19 0:34,9.281,524.911,2.72,10.252,231.444,-3.587 -35,12/7/19 0:35,9.392,524.952,2.733,10.264,227.364,-3.55 -36,12/7/19 0:36,9.307,524.155,2.73,10.286,218.8,-3.667 -37,12/7/19 0:37,9.34,522.093,2.733,10.326,221.182,-3.456 -38,12/7/19 0:38,9.308,522.038,2.751,10.301,228.6,-4.236 -39,12/7/19 0:39,9.367,523.54,2.774,10.304,232.667,-4.567 -40,12/7/19 0:40,9.315,522.649,2.776,10.312,230.727,-3.514 -41,12/7/19 0:41,9.271,522.519,2.778,10.331,228.778,-3.556 -42,12/7/19 0:42,9.274,526.485,2.79,10.336,230.636,-3.956 -43,12/7/19 0:43,9.303,531.872,2.804,10.327,232.833,-3.56 -44,12/7/19 0:44,6.516,533.27,2.825,10.298,238.8,-3.97 -45,12/7/19 0:45,4.988,537.818,2.839,10.297,235.444,-4.3 -46,12/7/19 0:46,9.411,530.991,2.838,10.34,238.8,-3.96 -47,12/7/19 0:47,9.373,526.616,2.848,10.361,239.3,-3.88 -48,12/7/19 0:48,9.432,522.518,2.873,10.349,241.273,-3.543 -49,12/7/19 0:49,9.424,520.561,2.879,10.36,229.182,-3.8 -50,12/7/19 0:50,9.38,520.22,2.886,10.317,222.091,-4.113 -51,12/7/19 0:51,9.435,522.541,2.896,10.33,230.3,-3.975 -52,12/7/19 0:52,9.385,524.183,2.913,10.35,235.3,-4.013 -53,12/7/19 0:53,9.402,525.546,2.926,10.347,242.2,-4.09 -54,12/7/19 0:54,9.381,524.207,2.955,10.296,239.727,-3.9 -55,12/7/19 0:55,9.376,524.362,2.971,10.265,241.8,-4.136 -56,12/7/19 0:56,9.452,522.519,2.987,10.246,245.333,-4.257 -57,12/7/19 0:57,9.477,520.653,3.016,10.224,249.111,-4.06 -58,12/7/19 0:58,9.444,519.946,3.044,10.243,242.333,-3.927 -59,12/7/19 0:59,9.455,520.792,3.059,10.244,246.5,-3.714 -60,12/7/19 1:00,7.601,521.384,3.08,10.252,250.545,-3.82 -61,12/7/19 1:01,4.92,518.457,3.084,10.269,256.556,-3.733 -62,12/7/19 1:02,9.529,516.413,3.086,10.278,257.222,-3.929 -63,12/7/19 1:03,9.608,514.887,3.095,10.305,254.3,-4.278 -64,12/7/19 1:04,9.577,513.361,3.118,10.33,248.667,-3.922 -65,12/7/19 1:05,9.486,512.72,3.135,10.337,243.182,-3.6 -66,12/7/19 1:06,9.41,511.539,3.147,10.362,237.25,-3.786 -67,12/7/19 1:07,9.368,510.553,3.173,10.335,242,-4.17 -68,12/7/19 1:08,9.359,509.408,3.192,10.314,243.667,-4.156 -69,12/7/19 1:09,9.327,508.55,3.217,10.279,245.2,-4 -70,12/7/19 1:10,9.361,508.188,3.227,10.256,247.889,-3.7 -71,12/7/19 1:11,9.31,507.087,3.25,10.229,243.2,-3.678 -72,12/7/19 1:12,9.315,506.303,3.252,10.215,247,-3.7 -73,12/7/19 1:13,9.36,505.456,3.27,10.225,248.7,-3.763 -74,12/7/19 1:14,9.286,504.924,3.298,10.193,252.375,-3.817 -75,12/7/19 1:15,9.249,504.261,3.307,10.209,252,-3.529 -76,12/7/19 1:16,6.743,503.41,3.312,10.2,249.571,-3.45 -77,12/7/19 1:17,3.762,502.712,3.325,10.194,245,-3.929 -78,12/7/19 1:18,9.276,502.044,3.344,10.208,249.455,-4.017 -79,12/7/19 1:19,9.321,501.562,3.354,10.213,257.909,-3.717 -80,12/7/19 1:20,9.353,501.12,3.373,10.209,257.6,-3.913 -81,12/7/19 1:21,9.358,500.773,3.373,10.196,259.182,-4.117 -82,12/7/19 1:22,9.386,500.295,3.389,10.194,249.3,-4.143 -83,12/7/19 1:23,9.301,499.853,3.408,10.184,236.833,-3.671 -84,12/7/19 1:24,9.276,499.301,3.426,10.19,232.091,-3.55 -85,12/7/19 1:25,9.29,498.877,3.45,10.195,234.273,-3.65 -86,12/7/19 1:26,9.26,498.483,3.472,10.187,240.545,-3.933 -87,12/7/19 1:27,9.323,498.15,3.499,10.144,242.25,-3.909 -88,12/7/19 1:28,9.3,499.35,3.53,10.126,239.778,-4.3 -89,12/7/19 1:29,9.301,504.028,3.545,10.135,242.3,-4.278 -90,12/7/19 1:30,9.313,506.079,3.566,10.114,242.818,-4.05 -91,12/7/19 1:31,9.294,507.859,3.595,10.103,241,-4.075 -92,12/7/19 1:32,7.411,506.398,3.618,10.134,246.778,-3.75 -93,12/7/19 1:33,3.887,504.423,3.64,10.132,250.455,-3.425 -94,12/7/19 1:34,9.32,506.174,3.672,10.145,243.889,-3.883 -95,12/7/19 1:35,9.37,506.367,3.7,10.182,238.5,-4.45 -96,12/7/19 1:36,9.455,507.188,3.732,10.179,244.7,-4.256 -97,12/7/19 1:37,9.477,507.388,3.79,10.173,255.167,-3.817 -98,12/7/19 1:38,9.48,509.554,3.822,10.199,257.286,-3.64 diff --git a/tests/files/modulair-ufp/MOD-UFP-00002-rawsd-mixed-tdiffs.csv b/tests/files/modulair-ufp/MOD-UFP-00002-rawsd-mixed-tdiffs.csv new file mode 100644 index 0000000..3879357 --- /dev/null +++ b/tests/files/modulair-ufp/MOD-UFP-00002-rawsd-mixed-tdiffs.csv @@ -0,0 +1,495 @@ +deviceModel,MODULAIR-UFP +deviceID,0a10aced202194944a04af94 +deviceSN,MOD-UFP-00002 +timestamp,fw,flag,soc,sample_temp,sample_rh,wx_ws,wx_wd,wx_ws_scalar,wx_u,wx_v,wx_pressure,wx_temp,wx_rh,wx_dew_point,cpc_elapsed_seconds,cpc_serial_number,cpc_particle_number_conc,cpc_particle_number_conc_corr,cpc_sample_number,cpc_flag,cpc_pressure_at_beginning,cpc_pressure_at_end,cpc_pressure_ambient,cpc_temperature_ambient,cpc_temperature_at_input,cpc_humidity_at_input,cpc_dew_point_at_input,cpc_temperature_at_output,cpc_humidity_at_output,cpc_dew_point_at_output,cpc_particle_count,cpc_particle_count_corr,cpc_flush_time_ms,cpc_humidification_time_ms,cpc_expansion_time_start,cpc_expansion_time_end,cpc_dead_time_corr_factor,cpc_power_to_pump,cpc_k_factor, +2026-04-17T00:00:01Z,14,0,100.0,16.6,58.5,1.070,116.00,1.070,0.9617,-0.4691,1006.00,9.00,90.20,7.50,3132362,242,14485.0,15324.0,49184,3,3464.0,2714.0,1007.4,22.2,17.3,51.8,7.3,20.6,55.0,11.2,6244.0,7872.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:00:11Z,14,0,100.0,16.6,58.5,1.580,83.00,1.580,1.5682,0.1926,1006.00,9.00,90.10,7.50,3132372,242,15415.0,16365.0,49185,3,3444.0,2717.0,1007.4,22.2,17.3,51.8,7.3,20.6,54.9,11.2,6486.0,8120.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:00:21Z,14,0,100.0,16.6,58.5,0.680,77.00,0.680,0.6626,0.1530,1006.00,9.00,90.10,7.50,3132382,242,12703.0,13348.0,49186,3,3483.0,2717.0,1007.4,22.2,17.3,51.8,7.2,20.6,54.9,11.2,5804.0,7050.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:00:31Z,14,0,100.0,16.6,58.5,1.040,108.00,1.040,0.9891,-0.3214,1006.00,9.00,90.10,7.50,3132392,242,11621.0,12161.0,49187,3,3431.0,2703.0,1007.4,22.2,17.3,51.8,7.3,20.6,54.9,11.2,5137.0,6130.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:00:41Z,14,0,100.0,16.6,58.5,1.150,113.00,1.150,1.0586,-0.4493,1006.00,9.00,90.10,7.50,3132402,242,12341.0,12950.0,49188,3,3465.0,2712.0,1007.6,22.2,17.3,51.8,7.3,20.6,55.0,11.2,5563.0,6732.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:00:51Z,14,0,100.0,16.6,58.5,1.160,104.00,1.160,1.1255,-0.2806,1006.10,9.00,90.00,7.50,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan, +2026-04-17T00:01:01Z,14,0,100.0,16.6,58.5,1.510,126.00,1.510,1.2216,-0.8876,1006.10,9.00,90.00,7.50,3132412,242,14146.0,14946.0,49189,3,3407.0,2704.0,1007.5,22.2,17.3,51.8,7.3,20.6,54.9,11.2,5853.0,7205.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:01:11Z,14,0,100.0,16.6,58.6,1.650,115.00,1.650,1.4954,-0.6973,1006.00,9.00,90.00,7.50,3132422,242,14771.0,15643.0,49190,3,3455.0,2711.0,1007.5,22.2,17.3,51.8,7.3,20.5,54.9,11.2,6366.0,7962.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:01:21Z,14,0,100.0,16.6,58.5,1.130,147.00,1.130,0.6154,-0.9477,1006.10,9.00,90.00,7.50,3132432,242,13321.0,14030.0,49191,3,3457.0,2713.0,1007.4,22.2,17.3,51.9,7.3,20.6,55.0,11.2,5810.0,7181.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:01:31Z,14,0,100.0,16.6,58.5,3.330,99.00,3.330,3.2890,-0.5209,1006.10,9.00,90.00,7.50,3132442,242,13430.0,14151.0,49192,3,3450.0,2709.0,1007.5,22.1,17.3,51.9,7.3,20.6,55.0,11.2,5864.0,7210.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:01:41Z,14,0,100.0,16.6,58.6,1.800,131.00,1.800,1.3585,-1.1809,1006.10,8.90,90.00,7.50,3132452,242,13497.0,14225.0,49193,3,3460.0,2720.0,1007.6,22.2,17.3,51.8,7.3,20.6,55.0,11.2,5917.0,7235.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:01:51Z,14,0,100.0,16.6,58.6,1.020,119.00,1.020,0.8921,-0.4945,1006.10,8.90,90.00,7.50,3132462,242,9854.0,10242.0,49194,3,3476.0,2719.0,1007.4,22.2,17.2,51.8,7.2,20.5,55.0,11.2,4654.0,5405.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:02:51Z,14,0,100.0,16.6,58.6,1.410,109.00,1.410,1.3332,-0.4591,1006.10,9.00,90.10,7.50,3132523,242,12402.0,13017.0,49200,3,3440.0,2716.0,1007.5,22.1,17.2,51.9,7.2,20.5,55.0,11.2,5416.0,6505.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:03:51Z,14,0,100.0,16.5,58.7,1.650,85.00,1.650,1.6437,0.1438,1006.10,9.00,90.00,7.50,3132583,242,11500.0,12029.0,49206,3,3454.0,2704.0,1007.6,22.1,17.2,52.0,7.2,20.5,55.0,11.1,5216.0,6248.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:04:51Z,14,0,100.0,16.5,58.8,1.280,219.00,1.280,-0.8055,-0.9947,1006.00,9.00,89.90,7.50,3132643,242,21883.0,23798.0,49212,3,3461.0,2713.0,1007.5,22.1,17.2,52.0,7.2,20.5,55.0,11.1,8444.0,11859.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:05:01Z,14,0,100.0,16.5,58.8,1.910,109.00,1.910,1.8059,-0.6218,1006.00,9.00,89.90,7.50,3132653,242,18904.0,20333.0,49213,3,3497.0,2724.0,1007.6,22.1,17.1,52.0,7.2,20.5,55.1,11.1,7861.0,10586.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:05:11Z,14,0,100.0,16.5,58.8,0.910,65.00,0.910,0.8247,0.3846,1006.10,9.00,89.90,7.50,3132663,242,16434.0,17514.0,49214,3,3432.0,2711.0,1007.6,22.1,17.1,52.0,7.2,20.4,55.0,11.1,6685.0,8584.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:05:21Z,14,0,100.0,16.5,58.8,1.040,134.00,1.040,0.7481,-0.7224,1006.10,9.00,89.90,7.50,3132673,242,16372.0,17444.0,49215,3,3457.0,2716.0,1007.4,22.1,17.1,52.0,7.2,20.5,55.1,11.1,6816.0,8790.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:05:31Z,14,0,100.0,16.5,58.8,0.980,72.00,0.980,0.9320,0.3028,1006.10,9.00,89.90,7.50,3132683,242,22550.0,24584.0,49216,3,3461.0,2714.0,1007.5,22.0,17.1,52.0,7.2,20.5,55.1,11.1,8584.0,12204.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:05:41Z,14,0,100.0,16.5,58.8,0.110,313.00,0.110,-0.0804,0.0750,1006.10,9.00,89.90,7.50,3132694,242,15893.0,16903.0,49217,3,3414.0,2702.0,1007.5,22.0,17.2,52.0,7.2,20.4,55.1,11.1,6458.0,8198.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:05:51Z,14,0,100.0,16.5,58.8,1.010,118.00,1.010,0.8918,-0.4742,1006.10,9.00,89.90,7.50,3132704,242,16239.0,17293.0,49218,3,3430.0,2706.0,1007.4,22.0,17.2,52.0,7.2,20.4,55.1,11.1,6668.0,8519.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:06:01Z,14,0,100.0,16.5,58.8,1.310,112.00,1.310,1.2146,-0.4907,1006.10,9.00,89.80,7.40,3132714,242,15741.0,16732.0,49219,3,3484.0,2726.0,1007.4,22.0,17.1,52.1,7.2,20.5,55.1,11.1,6769.0,8645.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:06:11Z,14,0,100.0,16.5,58.8,1.550,89.00,1.550,1.5498,0.0271,1006.10,8.90,89.80,7.40,3132724,242,16013.0,17038.0,49220,3,3473.0,2718.0,1007.6,22.0,17.1,52.0,7.2,20.4,55.1,11.1,6848.0,8758.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:06:21Z,14,0,100.0,16.5,58.8,1.550,104.00,1.550,1.5040,-0.3750,1006.10,8.90,89.80,7.40,3132734,242,14026.0,14812.0,49221,3,3432.0,2698.0,1007.6,22.0,17.1,52.0,7.2,20.4,55.1,11.1,6026.0,7458.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:06:31Z,14,0,100.0,16.5,58.8,1.160,115.00,1.160,1.0513,-0.4902,1006.10,8.90,89.80,7.40,3132744,242,14102.0,14897.0,49222,3,3468.0,2714.0,1007.5,22.0,17.1,52.0,7.2,20.4,55.1,11.1,6218.0,7704.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:06:41Z,14,0,100.0,16.5,58.8,1.340,124.00,1.340,1.1109,-0.7493,1006.10,9.00,89.80,7.40,3132754,242,17324.0,18524.0,49223,3,3407.0,2704.0,1007.4,22.0,17.1,52.1,7.2,20.4,55.1,11.1,6845.0,8824.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:06:51Z,14,0,100.0,16.5,58.8,2.240,138.00,2.240,1.4989,-1.6646,1006.10,8.90,89.80,7.40,3132764,242,17837.0,19109.0,49224,3,3427.0,2711.0,1007.6,22.0,17.1,52.1,7.2,20.4,55.1,11.1,7102.0,9252.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:07:01Z,14,0,100.0,16.4,58.8,1.780,106.00,1.780,1.7110,-0.4906,1006.20,8.90,89.80,7.40,3132774,242,15485.0,16444.0,49225,3,3457.0,2711.0,1007.5,22.0,17.1,52.1,7.2,20.4,55.1,11.1,6561.0,8369.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:07:11Z,14,0,100.0,16.5,58.8,2.230,163.00,2.230,0.6520,-2.1326,1006.20,8.90,89.70,7.40,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan, +2026-04-17T00:07:21Z,14,0,100.0,16.4,58.9,1.220,102.00,1.220,1.1933,-0.2537,1006.20,8.90,89.80,7.40,3132794,242,15104.0,16016.0,49227,3,3442.0,2718.0,1007.5,22.0,17.1,52.1,7.2,20.4,55.1,11.1,6329.0,7923.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:07:31Z,14,0,100.0,16.4,58.9,1.580,130.00,1.580,1.2104,-1.0156,1006.20,8.90,89.80,7.40,3132804,242,15100.0,16012.0,49228,3,3478.0,2718.0,1007.7,22.0,17.1,52.1,7.2,20.4,55.1,11.1,6604.0,8313.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:07:41Z,14,0,100.0,16.4,58.9,1.210,66.00,1.210,1.1054,0.4922,1006.20,8.90,89.80,7.40,3132814,242,17614.0,18855.0,49229,3,3459.0,2713.0,1007.6,22.0,17.1,52.1,7.1,20.4,55.0,11.0,7237.0,9519.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:07:51Z,14,0,100.0,16.4,58.9,0.880,93.00,0.880,0.8788,-0.0461,1006.20,8.90,89.80,7.40,3132824,242,17336.0,18538.0,49230,3,3473.0,2717.0,1007.5,22.0,17.1,52.1,7.2,20.4,55.1,11.1,7143.0,9495.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:08:01Z,14,0,100.0,16.4,58.9,1.600,108.00,1.600,1.5217,-0.4944,1006.20,8.90,89.80,7.40,3132834,242,17906.0,19188.0,49231,3,3412.0,2704.0,1007.5,22.0,17.1,52.2,7.2,20.4,55.1,11.1,7014.0,9185.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:08:11Z,14,0,100.0,16.4,58.9,1.520,134.00,1.520,1.0934,-1.0559,1006.20,8.90,89.80,7.40,3132844,242,19481.0,20999.0,49232,3,3423.0,2704.0,1007.7,22.0,17.1,52.1,7.2,20.4,55.1,11.0,7551.0,10146.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:08:21Z,14,0,100.0,16.4,58.9,1.840,128.00,1.840,1.4499,-1.1328,1006.20,8.90,89.80,7.40,3132855,242,17555.0,18787.0,49233,3,3449.0,2722.0,1007.6,22.0,17.1,52.1,7.2,20.4,55.1,11.1,7109.0,9245.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:08:31Z,14,0,100.0,16.4,58.9,3.680,126.00,3.680,2.9772,-2.1630,1006.20,8.90,89.80,7.40,3132865,242,17054.0,18217.0,49234,3,3441.0,2717.0,1007.5,22.0,17.0,52.1,7.1,20.3,55.1,11.0,6940.0,8945.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:08:41Z,14,0,100.0,16.4,58.9,3.500,133.00,3.500,2.5597,-2.3870,1006.20,8.90,89.80,7.40,3132875,242,15902.0,16913.0,49235,3,3427.0,2711.0,1007.5,22.0,17.0,52.2,7.2,20.4,55.1,11.0,6516.0,8249.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:08:51Z,14,0,100.0,16.4,58.9,1.270,159.00,1.270,0.4551,-1.1856,1006.20,8.90,89.80,7.40,3132885,242,15194.0,16117.0,49236,3,3444.0,2713.0,1007.5,22.0,17.0,52.2,7.1,20.4,55.1,11.0,6379.0,8047.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:09:01Z,14,0,100.0,16.4,58.8,1.460,90.00,1.460,1.4600,0.0000,1006.20,8.90,89.80,7.40,3132895,242,16083.0,17117.0,49237,3,3438.0,2723.0,1007.5,22.0,17.0,52.2,7.2,20.3,55.1,11.0,6562.0,8331.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:09:11Z,14,0,100.0,16.4,58.8,1.920,123.00,1.920,1.6102,-1.0457,1006.20,8.90,89.80,7.40,3132905,242,16246.0,17301.0,49238,3,3427.0,2709.0,1007.6,22.0,17.0,52.2,7.1,20.3,55.1,11.0,6621.0,8450.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:09:21Z,14,0,100.0,16.4,58.9,1.110,182.00,1.110,-0.0387,-1.1093,1006.20,8.90,89.80,7.40,3132915,242,14745.0,15614.0,49239,3,3437.0,2698.0,1007.6,22.0,17.0,52.2,7.1,20.3,55.2,11.0,6277.0,7894.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:09:31Z,14,0,100.0,16.4,58.8,1.030,145.00,1.030,0.5908,-0.8437,1006.20,8.90,89.80,7.40,3132925,242,16538.0,17632.0,49240,3,3430.0,2709.0,1007.6,22.0,17.0,52.2,7.2,20.3,55.2,11.0,6748.0,8638.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:09:41Z,14,0,100.0,16.4,58.8,1.330,75.00,1.330,1.2847,0.3442,1006.20,8.90,89.90,7.40,3132935,242,18245.0,19576.0,49241,3,3451.0,2717.0,1007.6,21.9,17.0,52.2,7.1,20.3,55.1,11.0,7357.0,9701.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:09:51Z,14,0,100.0,16.4,58.9,1.710,162.00,1.710,0.5284,-1.6263,1006.20,8.80,89.90,7.40,3132945,242,16922.0,18067.0,49242,3,3459.0,2712.0,1007.6,21.9,17.0,52.2,7.1,20.3,55.2,11.0,7023.0,9157.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:10:01Z,14,0,100.0,16.3,58.9,1.230,75.00,1.230,1.1881,0.3183,1006.20,8.90,89.90,7.40,3132955,242,15770.0,16764.0,49243,3,3455.0,2713.0,1007.5,21.9,17.0,52.2,7.1,20.3,55.2,11.0,6620.0,8478.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:10:11Z,14,0,100.0,16.4,58.9,1.250,93.00,1.250,1.2483,-0.0654,1006.20,8.90,89.90,7.40,3132965,242,16801.0,17930.0,49244,3,3473.0,2719.0,1007.6,21.9,17.0,52.2,7.1,20.3,55.1,11.0,7071.0,9177.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:10:21Z,14,0,100.0,16.3,58.9,1.800,139.00,1.800,1.1809,-1.3585,1006.10,8.90,89.90,7.40,3132975,242,16116.0,17154.0,49245,3,3433.0,2699.0,1007.6,21.9,17.0,52.2,7.1,20.3,55.2,11.0,6692.0,8569.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:10:31Z,14,0,100.0,16.4,58.9,0.930,120.00,0.930,0.8054,-0.4650,1006.10,8.80,89.90,7.40,3132985,242,17181.0,18361.0,49246,3,3466.0,2712.0,1007.6,21.9,17.0,52.2,7.1,20.3,55.1,11.0,7151.0,9384.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:10:41Z,14,0,100.0,16.3,59.0,1.500,150.00,1.500,0.7500,-1.2990,1006.10,8.80,89.90,7.30,3132995,242,18072.0,19378.0,49247,3,3419.0,2704.0,1007.4,21.9,17.0,52.2,7.1,20.3,55.2,11.0,7133.0,9362.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:10:51Z,14,0,100.0,16.3,59.0,1.870,122.00,1.870,1.5858,-0.9909,1006.10,8.80,89.90,7.30,3133005,242,18162.0,19481.0,49248,3,3450.0,2718.0,1007.5,21.9,17.0,52.2,7.1,20.3,55.2,11.0,7293.0,9632.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:11:01Z,14,0,100.0,16.3,58.9,2.100,94.00,2.100,2.0949,-0.1465,1006.10,8.80,89.90,7.30,3133015,242,18229.0,19558.0,49249,3,3440.0,2722.0,1007.4,21.9,17.0,52.2,7.1,20.3,55.2,11.0,7204.0,9483.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:11:11Z,14,0,100.0,16.3,58.9,1.800,129.00,1.800,1.3989,-1.1328,1006.10,8.80,89.90,7.30,3133026,242,21928.0,23851.0,49250,3,3431.0,2706.0,1007.5,21.9,17.0,52.3,7.1,20.2,55.2,11.0,8240.0,11518.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:11:21Z,14,0,100.0,16.3,59.0,2.240,127.00,2.240,1.7889,-1.3481,1006.10,8.80,89.90,7.30,3133036,242,19770.0,21333.0,49251,3,3447.0,2723.0,1007.6,21.9,17.0,52.3,7.1,20.3,55.2,11.0,7650.0,10369.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:11:31Z,14,0,100.0,16.3,59.0,2.120,107.00,2.120,2.0274,-0.6198,1006.10,8.80,89.90,7.30,3133046,242,21557.0,23415.0,49252,3,3461.0,2714.0,1007.5,21.9,17.0,52.3,7.1,20.3,55.2,11.0,8343.0,11666.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:11:41Z,14,0,100.0,16.3,59.0,1.690,120.00,1.690,1.4636,-0.8450,1006.10,8.80,89.90,7.30,3133056,242,20876.0,22619.0,49253,3,3412.0,2703.0,1007.6,21.9,17.0,52.3,7.1,20.3,55.2,11.0,7789.0,10722.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:11:51Z,14,0,100.0,16.3,59.0,0.970,98.00,0.970,0.9606,-0.1350,1006.10,8.80,90.00,7.30,3133066,242,19982.0,21579.0,49254,3,3464.0,2714.0,1007.5,21.9,16.9,52.3,7.1,20.3,55.2,11.0,7966.0,10857.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:12:01Z,14,0,100.0,16.3,58.9,1.330,117.00,1.330,1.1850,-0.6038,1006.10,8.80,89.90,7.30,3133076,242,20578.0,22271.0,49255,3,3445.0,2721.0,1007.5,21.9,16.9,52.3,7.1,20.3,55.2,11.0,7950.0,10794.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:12:11Z,14,0,100.0,16.3,58.9,2.380,157.00,2.380,0.9299,-2.1908,1006.10,8.80,90.00,7.30,3133086,242,19150.0,20616.0,49256,3,3470.0,2714.0,1007.5,21.9,17.0,52.3,7.1,20.3,55.2,11.0,7745.0,10489.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:12:21Z,14,0,100.0,16.3,58.9,1.900,117.00,1.900,1.6929,-0.8626,1006.10,8.80,89.90,7.30,3133096,242,21421.0,23256.0,49257,3,3413.0,2707.0,1007.5,21.9,16.9,52.3,7.1,20.2,55.2,11.0,7938.0,10957.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:12:31Z,14,0,100.0,16.3,58.9,1.160,98.00,1.160,1.1487,-0.1614,1006.10,8.80,90.00,7.30,3133106,242,20422.0,22090.0,49258,3,3450.0,2708.0,1007.6,21.9,16.9,52.3,7.1,20.2,55.2,10.9,7968.0,10978.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:12:41Z,14,0,100.0,16.3,58.9,1.220,79.00,1.220,1.1976,0.2328,1006.10,8.80,90.00,7.30,3133116,242,21370.0,23196.0,49259,3,3450.0,2718.0,1007.4,21.9,16.9,52.3,7.1,20.2,55.2,11.0,8194.0,11334.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:12:51Z,14,0,100.0,16.3,59.0,2.160,99.00,2.160,2.1334,-0.3379,1006.10,8.80,90.00,7.30,3133126,242,19078.0,20533.0,49260,3,3459.0,2712.0,1007.5,21.8,16.9,52.3,7.1,20.2,55.2,10.9,7688.0,10325.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:13:01Z,14,0,100.0,16.3,59.0,1.020,93.00,1.020,1.0186,-0.0534,1006.10,8.80,90.00,7.30,3133136,242,18799.0,20212.0,49261,3,3457.0,2711.0,1007.5,21.8,16.9,52.3,7.1,20.3,55.2,11.0,7576.0,10160.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:13:11Z,14,0,100.0,16.3,59.0,1.260,113.00,1.260,1.1598,-0.4923,1006.10,8.80,90.10,7.30,3133146,242,18396.0,19749.0,49262,3,3426.0,2702.0,1007.4,21.8,16.9,52.3,7.1,20.2,55.2,10.9,7317.0,9650.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:13:21Z,14,0,100.0,16.3,59.1,1.320,109.00,1.320,1.2481,-0.4297,1006.10,8.80,90.00,7.30,3133156,242,21032.0,22801.0,49263,3,3456.0,2723.0,1007.6,21.8,16.9,52.4,7.1,20.2,55.2,11.0,8053.0,11168.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:13:31Z,14,0,100.0,16.3,59.0,0.580,57.00,0.580,0.4864,0.3159,1006.10,8.80,90.00,7.30,3133166,242,19941.0,21531.0,49264,3,3468.0,2719.0,1007.4,21.8,16.9,52.4,7.1,20.2,55.2,11.0,7891.0,10822.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:13:41Z,14,0,100.0,16.3,59.0,0.370,160.00,0.370,0.1265,-0.3477,1006.10,8.80,90.10,7.30,3133176,242,20135.0,21756.0,49265,3,3444.0,2726.0,1007.4,21.8,16.9,52.4,7.0,20.2,55.2,10.9,7784.0,10475.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:13:51Z,14,0,100.0,16.3,59.1,1.420,130.00,1.420,1.0878,-0.9128,1006.10,8.80,90.00,7.30,3133187,242,20009.0,21610.0,49266,3,3461.0,2712.0,1007.5,21.8,16.9,52.4,7.1,20.2,55.2,10.9,7969.0,10858.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:14:01Z,14,0,100.0,16.2,59.1,0.880,104.00,0.880,0.8539,-0.2129,1006.10,8.80,90.10,7.30,3133197,242,19322.0,20815.0,49267,3,3418.0,2706.0,1007.6,21.8,16.9,52.4,7.1,20.2,55.3,10.9,7478.0,9966.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:14:11Z,14,0,100.0,16.2,59.1,1.320,119.00,1.320,1.1545,-0.6399,1006.10,8.80,90.10,7.30,3133207,242,18296.0,19634.0,49268,3,3426.0,2703.0,1007.6,21.8,16.9,52.4,7.1,20.2,55.3,10.9,7266.0,9583.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:14:21Z,14,0,100.0,16.3,59.1,0.760,172.00,0.760,0.1058,-0.7526,1006.10,8.80,90.00,7.30,3133217,242,19897.0,21480.0,49269,3,3446.0,2719.0,1007.5,21.8,16.9,52.4,7.1,20.2,55.2,10.9,7739.0,10480.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:14:31Z,14,0,100.0,16.2,59.1,1.310,107.00,1.310,1.2528,-0.3830,1006.10,8.80,90.00,7.30,3133227,242,18873.0,20297.0,49270,3,3498.0,2727.0,1007.4,21.8,16.9,52.4,7.1,20.2,55.3,10.9,7671.0,10543.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:14:41Z,14,0,100.0,16.2,59.1,1.420,168.00,1.420,0.2952,-1.3890,1006.10,8.80,90.10,7.30,3133237,242,20479.0,22156.0,49271,3,3440.0,2702.0,1007.4,21.8,16.9,52.4,7.1,20.2,55.3,10.9,7922.0,10950.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:14:51Z,14,0,100.0,16.2,59.1,1.650,152.00,1.650,0.7746,-1.4569,1006.10,8.80,90.00,7.30,3133247,242,19147.0,20613.0,49272,3,3430.0,2716.0,1007.4,21.8,16.9,52.4,7.1,20.2,55.3,10.9,7416.0,9905.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:15:01Z,14,0,100.0,16.2,59.1,0.380,68.00,0.380,0.3523,0.1424,1006.10,8.80,90.00,7.30,3133257,242,20463.0,22137.0,49273,3,3450.0,2714.0,1007.4,21.8,16.9,52.5,7.1,20.2,55.3,10.9,7980.0,10912.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:15:11Z,14,8,100.0,0.0,0.0,1.200,97.00,1.200,1.1911,-0.1462,1006.10,8.80,90.10,7.30,3133267,242,20645.0,22349.0,49274,3,3423.0,2706.0,1007.5,21.8,16.9,52.5,7.1,20.2,55.3,10.9,7817.0,10724.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:15:21Z,14,0,100.0,16.2,59.2,1.090,104.00,1.090,1.0576,-0.2637,1006.10,8.80,90.10,7.30,3133277,242,22382.0,24385.0,49275,3,3445.0,2719.0,1007.5,21.8,16.9,52.5,7.1,20.2,55.3,10.9,8343.0,11773.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:15:31Z,14,0,100.0,16.2,59.2,0.640,84.00,0.640,0.6365,0.0669,1006.10,8.80,90.00,7.30,3133287,242,19766.0,21328.0,49276,3,3431.0,2707.0,1007.4,21.8,16.9,52.5,7.1,20.2,55.3,10.9,7708.0,10369.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:15:41Z,14,0,100.0,16.2,59.2,0.500,123.00,0.500,0.4193,-0.2723,1006.10,8.80,90.00,7.30,3133297,242,19650.0,21194.0,49277,3,3451.0,2716.0,1007.4,21.8,16.9,52.5,7.1,20.2,55.4,10.9,7710.0,10465.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:15:51Z,14,0,100.0,16.2,59.2,0.300,85.00,0.300,0.2989,0.0261,1006.10,8.80,90.10,7.30,3133307,242,20871.0,22613.0,49278,3,3461.0,2714.0,1007.4,21.8,16.9,52.5,7.1,20.2,55.4,11.0,8116.0,11296.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:16:01Z,14,0,100.0,16.2,59.3,0.890,116.00,0.890,0.7999,-0.3902,1006.10,8.80,90.10,7.30,3133317,242,20909.0,22657.0,49279,3,3447.0,2722.0,1007.4,21.7,16.8,52.5,7.1,20.2,55.3,10.9,7980.0,10983.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:16:11Z,14,0,100.0,16.2,59.2,1.300,122.00,1.300,1.1025,-0.6889,1006.10,8.80,90.10,7.40,3133327,242,25115.0,27638.0,49280,3,3468.0,2713.0,1007.5,21.7,16.8,52.5,7.1,20.2,55.4,10.9,9119.0,13738.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:16:21Z,14,0,100.0,16.2,59.3,0.800,74.00,0.800,0.7690,0.2205,1006.10,8.80,90.10,7.40,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan, +2026-04-17T00:16:31Z,14,0,100.0,16.2,59.3,1.910,101.00,1.910,1.8749,-0.3644,1006.10,8.80,90.10,7.40,3133337,242,27267.0,30240.0,49281,3,3416.0,2707.0,1007.4,21.7,16.8,52.5,7.1,20.1,55.4,10.9,9159.0,14007.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:16:41Z,14,0,100.0,16.2,59.3,1.150,123.00,1.150,0.9645,-0.6263,1006.10,8.80,90.10,7.30,3133348,242,28036.0,31180.0,49282,3,3456.0,2711.0,1007.4,21.8,16.8,52.5,7.1,20.1,55.4,10.9,9587.0,15134.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:16:51Z,14,0,100.0,16.2,59.3,1.440,135.00,1.440,1.0182,-1.0182,1006.10,8.80,90.10,7.30,3133358,242,28630.0,31908.0,49283,3,3474.0,2719.0,1007.4,21.8,16.8,52.5,7.1,20.1,55.4,10.9,9866.0,15662.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:17:01Z,14,0,100.0,16.2,59.4,2.250,136.00,2.250,1.5630,-1.6185,1006.10,8.80,90.10,7.30,3133368,242,28743.0,32047.0,49284,3,3430.0,2704.0,1007.6,21.7,16.8,52.5,7.1,20.1,55.4,10.9,9597.0,15117.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:17:11Z,14,0,100.0,16.2,59.3,1.550,123.00,1.550,1.2999,-0.8442,1006.10,8.80,90.10,7.30,3133378,242,29152.0,32551.0,49285,3,3446.0,2719.0,1007.5,21.7,16.8,52.5,7.1,20.1,55.4,10.9,9722.0,15355.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:17:21Z,14,0,100.0,16.2,59.3,0.750,127.00,0.750,0.5990,-0.4514,1006.10,8.80,90.10,7.30,3133388,242,28679.0,31968.0,49286,3,3432.0,2706.0,1007.4,21.7,16.8,52.6,7.1,20.1,55.4,10.9,9587.0,15086.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:17:31Z,14,0,100.0,16.2,59.3,1.330,110.00,1.330,1.2498,-0.4549,1006.10,8.80,90.10,7.30,3133398,242,28416.0,31645.0,49287,3,3486.0,2728.0,1007.4,21.7,16.8,52.6,7.1,20.1,55.4,10.9,9845.0,15606.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:17:41Z,14,0,100.0,16.2,59.3,0.640,203.00,0.640,-0.2501,-0.5891,1006.10,8.80,90.10,7.30,3133408,242,28001.0,31137.0,49288,3,3461.0,2714.0,1007.4,21.7,16.8,52.6,7.1,20.1,55.4,10.9,9662.0,15155.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:17:51Z,14,0,100.0,16.2,59.3,2.390,145.00,2.390,1.3708,-1.9578,1006.10,8.80,90.10,7.40,3133418,242,27570.0,30610.0,49289,3,3445.0,2719.0,1007.4,21.7,16.8,52.6,7.1,20.1,55.4,10.9,9427.0,14503.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:18:01Z,14,0,100.0,16.2,59.4,1.690,125.00,1.690,1.3844,-0.9693,1006.10,8.80,90.10,7.40,3133428,242,26547.0,29365.0,49290,3,3470.0,2713.0,1007.5,21.7,16.8,52.6,7.1,20.1,55.4,10.9,9462.0,14559.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:18:11Z,14,0,100.0,16.2,59.4,2.190,104.00,2.190,2.1249,-0.5298,1006.10,8.80,90.10,7.40,3133438,242,26759.0,29623.0,49291,3,3413.0,2704.0,1007.4,21.7,16.8,52.6,7.0,20.1,55.4,10.9,9088.0,13747.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:18:21Z,14,0,100.0,16.1,59.3,1.980,127.00,1.980,1.5813,-1.1916,1006.10,8.80,90.10,7.40,3133448,242,25037.0,27544.0,49292,3,3425.0,2708.0,1007.5,21.8,16.8,52.6,7.1,20.1,55.5,10.9,8779.0,13006.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:18:31Z,14,0,100.0,16.1,59.4,0.760,107.00,0.760,0.7268,-0.2222,1006.10,8.80,90.10,7.40,3133458,242,25749.0,28401.0,49293,3,3445.0,2719.0,1007.4,21.7,16.8,52.7,7.1,20.1,55.5,10.9,9021.0,13545.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:18:41Z,14,0,100.0,16.1,59.4,1.190,100.00,1.190,1.1719,-0.2066,1006.10,8.80,90.10,7.40,3133468,242,24454.0,26845.0,49294,3,3457.0,2703.0,1007.4,21.7,16.8,52.7,7.1,20.1,55.5,10.9,8994.0,13360.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:18:51Z,14,0,100.0,16.1,59.4,0.580,97.00,0.580,0.5757,-0.0707,1006.10,8.80,90.10,7.40,3133478,242,23728.0,25980.0,49295,3,3476.0,2719.0,1007.5,21.7,16.8,52.7,7.0,20.1,55.5,10.9,8891.0,13014.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:19:01Z,14,0,100.0,16.2,59.3,1.470,81.00,1.470,1.4519,0.2300,1006.10,8.80,90.10,7.40,3133488,242,25406.0,27987.0,49296,3,3430.0,2717.0,1007.3,21.7,16.8,52.7,7.1,20.0,55.5,10.8,8879.0,13126.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:19:11Z,14,0,100.0,16.1,59.4,0.950,144.00,0.950,0.5584,-0.7686,1006.10,8.80,90.10,7.40,3133498,242,21382.0,23210.0,49297,3,3450.0,2714.0,1007.3,21.7,16.8,52.7,7.1,20.1,55.5,10.9,8198.0,11404.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:19:21Z,14,0,100.0,16.1,59.4,1.070,107.00,1.070,1.0232,-0.3128,1006.10,8.90,90.10,7.40,3133509,242,22286.0,24272.0,49298,3,3422.0,2704.0,1007.5,21.7,16.7,52.7,7.0,20.1,55.5,10.9,8261.0,11593.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:19:31Z,14,0,100.0,16.1,59.5,1.430,73.00,1.430,1.3675,0.4181,1006.00,8.90,90.10,7.40,3133519,242,22779.0,24854.0,49299,3,3444.0,2721.0,1007.4,21.7,16.7,52.7,7.0,20.1,55.5,10.9,8419.0,11933.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:19:41Z,14,0,100.0,16.1,59.4,1.010,144.00,1.010,0.5937,-0.8171,1006.00,8.90,90.10,7.40,3133529,242,21635.0,23507.0,49300,3,3470.0,2713.0,1007.4,21.7,16.8,52.7,7.1,20.1,55.6,10.9,8387.0,11866.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:19:51Z,14,0,100.0,16.1,59.5,1.050,121.00,1.050,0.9000,-0.5408,1006.00,8.90,90.10,7.40,3133539,242,22710.0,24772.0,49301,3,3451.0,2726.0,1007.4,21.7,16.8,52.7,7.1,20.1,55.6,10.9,8368.0,11929.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:20:01Z,14,0,100.0,16.1,59.5,1.600,111.00,1.600,1.4937,-0.5734,1006.10,8.90,90.10,7.40,3133549,242,24165.0,26500.0,49302,3,3473.0,2725.0,1007.3,21.7,16.8,52.8,7.1,20.1,55.5,10.9,8898.0,13098.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:20:11Z,14,0,100.0,16.1,59.5,1.920,127.00,1.920,1.5334,-1.1555,1006.10,8.90,90.00,7.40,3133559,242,24300.0,26661.0,49303,3,3408.0,2704.0,1007.4,21.7,16.8,52.7,7.1,20.0,55.5,10.9,8575.0,12395.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:20:21Z,14,0,100.0,16.1,59.5,1.300,119.00,1.300,1.1370,-0.6303,1006.00,8.90,90.00,7.40,3133569,242,22965.0,25074.0,49304,3,3466.0,2713.0,1007.5,21.7,16.8,52.8,7.1,20.1,55.6,10.9,8678.0,12528.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:20:31Z,14,0,100.0,16.1,59.5,2.660,128.00,2.660,2.0961,-1.6377,1006.00,8.80,90.00,7.40,3133579,242,22117.0,24073.0,49305,3,3451.0,2721.0,1007.4,21.7,16.7,52.8,7.0,20.0,55.6,10.9,8347.0,11698.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:20:41Z,14,0,100.0,16.1,59.5,1.250,120.00,1.250,1.0825,-0.6250,1006.00,8.80,90.00,7.40,3133589,242,20528.0,22213.0,49306,3,3477.0,2722.0,1007.3,21.7,16.7,52.8,7.0,20.0,55.6,10.8,8070.0,11231.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:20:51Z,14,0,100.0,16.1,59.5,1.920,115.00,1.920,1.7401,-0.8114,1006.00,8.80,89.90,7.30,3133599,242,21102.0,22883.0,49307,3,3411.0,2706.0,1007.3,21.7,16.7,52.8,7.0,20.0,55.6,10.9,7796.0,10780.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:21:01Z,14,0,100.0,16.1,59.5,1.680,115.00,1.680,1.5226,-0.7100,1006.00,8.80,89.90,7.30,3133609,242,21024.0,22792.0,49308,3,3425.0,2708.0,1007.4,21.7,16.7,52.8,7.0,20.0,55.6,10.8,7887.0,10922.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:21:11Z,14,0,100.0,16.1,59.6,1.950,121.00,1.950,1.6715,-1.0043,1006.00,8.80,89.90,7.30,3133619,242,21310.0,23126.0,49309,3,3444.0,2719.0,1007.3,21.7,16.7,52.8,7.1,20.0,55.6,10.9,8077.0,11196.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:21:21Z,14,0,100.0,16.1,59.6,1.630,91.00,1.630,1.6298,-0.0284,1006.00,8.80,90.00,7.30,3133629,242,20845.0,22583.0,49310,3,3456.0,2711.0,1007.3,21.7,16.7,52.8,7.0,20.0,55.5,10.8,8092.0,11253.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:21:31Z,14,0,100.0,16.1,59.5,1.850,132.00,1.850,1.3748,-1.2379,1006.00,8.80,90.00,7.30,3133639,242,20547.0,22235.0,49311,3,3435.0,2699.0,1007.4,21.7,16.7,52.8,7.0,20.0,55.6,10.8,7959.0,10957.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:21:41Z,14,0,100.0,16.1,59.5,0.940,127.00,0.940,0.7507,-0.5657,1006.00,8.80,90.00,7.30,3133649,242,20592.0,22288.0,49312,3,3456.0,2706.0,1007.3,21.6,16.7,52.8,7.0,20.0,55.6,10.8,8046.0,11191.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:21:52Z,14,0,100.0,16.1,59.5,1.040,111.00,1.040,0.9709,-0.3727,1006.00,8.80,90.00,7.30,3133659,242,21184.0,22979.0,49313,3,3447.0,2721.0,1007.4,21.6,16.7,52.8,7.0,20.0,55.6,10.8,8066.0,11144.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:22:02Z,14,0,100.0,16.1,59.5,1.630,128.00,1.630,1.2845,-1.0035,1006.00,8.80,90.00,7.30,3133669,242,20672.0,22381.0,49314,3,3428.0,2717.0,1007.3,21.6,16.7,52.9,7.0,19.9,55.6,10.8,7770.0,10650.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:22:12Z,14,0,100.0,16.1,59.5,1.990,108.00,1.990,1.8926,-0.6149,1006.00,8.80,90.00,7.30,3133680,242,21567.0,23427.0,49315,3,3471.0,2721.0,1007.3,21.6,16.7,52.9,7.0,20.0,55.6,10.8,8304.0,11721.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:22:22Z,14,0,100.0,16.1,59.6,1.190,115.00,1.190,1.0785,-0.5029,1006.00,8.80,90.10,7.40,3133690,242,21241.0,23045.0,49316,3,3473.0,2721.0,1007.3,21.6,16.7,52.9,7.0,20.0,55.6,10.8,8249.0,11574.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:22:32Z,14,0,100.0,16.1,59.5,1.050,102.00,1.050,1.0271,-0.2183,1006.00,8.80,90.10,7.40,3133700,242,19481.0,20999.0,49317,3,3431.0,2703.0,1007.3,21.6,16.7,52.9,7.0,20.0,55.6,10.8,7560.0,10277.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:22:42Z,14,0,100.0,16.1,59.5,1.150,129.00,1.150,0.8937,-0.7237,1006.00,8.80,90.10,7.40,3133710,242,22975.0,25086.0,49318,3,3452.0,2717.0,1007.5,21.6,16.7,52.9,7.0,20.0,55.7,10.8,8474.0,12234.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:22:52Z,14,0,100.0,16.1,59.6,0.560,151.00,0.560,0.2715,-0.4898,1006.00,8.80,90.10,7.40,3133720,242,23090.0,25222.0,49319,3,3479.0,2722.0,1007.4,21.6,16.7,52.9,7.0,20.0,55.6,10.8,8723.0,12664.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:23:02Z,14,0,100.0,16.1,59.6,0.570,136.00,0.570,0.3960,-0.4100,1006.00,8.80,90.10,7.40,3133730,242,22741.0,24809.0,49320,3,3470.0,2719.0,1007.3,21.6,16.7,52.9,7.0,20.0,55.7,10.8,8564.0,12376.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:23:12Z,14,0,100.0,16.1,59.6,0.400,78.00,0.400,0.3913,0.0832,1006.00,8.80,90.10,7.40,3133740,242,23049.0,25174.0,49321,3,3540.0,2738.0,1007.3,21.5,16.7,52.9,7.0,19.9,55.7,10.8,9239.0,13395.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:23:22Z,14,0,100.0,16.1,59.6,0.590,345.00,0.590,-0.1527,0.5699,1006.00,8.80,90.10,7.40,3133750,242,23077.0,25207.0,49322,3,3474.0,2717.0,1007.5,21.6,16.7,52.9,7.0,20.0,55.6,10.8,8727.0,12656.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:23:32Z,14,0,100.0,16.0,59.6,0.390,77.00,0.390,0.3800,0.0877,1006.00,8.80,90.10,7.40,3133760,242,24440.0,26829.0,49323,3,3426.0,2711.0,1007.4,21.6,16.7,53.0,7.0,19.9,55.6,10.8,8752.0,12661.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:23:42Z,14,0,100.0,16.1,59.7,0.810,100.00,0.810,0.7977,-0.1407,1006.00,8.80,90.10,7.40,3133770,242,22428.0,24440.0,49324,3,3479.0,2716.0,1007.4,21.6,16.7,53.0,7.0,19.9,55.7,10.8,8645.0,12399.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:23:52Z,14,0,100.0,16.1,59.6,0.630,120.00,0.630,0.5456,-0.3150,1006.00,8.80,90.10,7.40,3133780,242,24053.0,26367.0,49325,3,3452.0,2713.0,1007.5,21.6,16.7,53.0,7.0,19.9,55.7,10.8,8808.0,12878.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:24:02Z,14,0,100.0,16.0,59.7,1.510,38.00,1.510,0.9296,1.1899,1006.00,8.80,90.10,7.40,3133790,242,25643.0,28273.0,49326,3,3435.0,2707.0,1007.3,21.6,16.7,53.0,7.0,19.9,55.7,10.8,9023.0,13527.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:24:12Z,14,0,100.0,16.0,59.7,0.970,62.00,0.970,0.8565,0.4554,1006.00,8.80,90.10,7.40,3133800,242,23773.0,26033.0,49327,3,3468.0,2719.0,1007.3,21.6,16.7,53.0,7.0,19.9,55.7,10.8,8781.0,12903.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:24:22Z,14,0,100.0,16.0,59.7,1.120,76.00,1.120,1.0867,0.2710,1006.00,8.80,90.00,7.40,3133810,242,28466.0,31707.0,49328,3,3412.0,2706.0,1007.3,21.6,16.6,53.0,7.0,19.9,55.8,10.8,9326.0,14562.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:24:32Z,14,0,100.0,16.0,59.8,0.740,85.00,0.740,0.7372,0.0645,1006.00,8.90,90.10,7.40,3133820,242,27490.0,30512.0,49329,3,3425.0,2708.0,1007.4,21.6,16.7,53.0,7.0,19.9,55.7,10.8,9320.0,14281.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:24:42Z,14,0,100.0,16.0,59.8,0.460,98.00,0.460,0.4555,-0.0640,1006.00,8.90,90.10,7.40,3133831,242,27128.0,30071.0,49330,3,3470.0,2719.0,1007.5,21.6,16.7,53.0,7.0,19.9,55.7,10.8,9465.0,14760.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:24:52Z,14,0,100.0,16.0,59.8,0.260,261.00,0.260,-0.2568,-0.0407,1006.00,8.90,90.10,7.40,3133841,242,28139.0,31306.0,49331,3,3484.0,2730.0,1007.3,21.6,16.6,53.0,7.0,19.9,55.7,10.8,9797.0,15374.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:25:02Z,14,0,100.0,16.0,59.8,0.300,83.00,0.300,0.2978,0.0366,1006.00,8.90,90.00,7.40,3133851,242,27134.0,30079.0,49332,3,3484.0,2716.0,1007.4,21.6,16.6,53.0,7.0,19.9,55.8,10.8,9655.0,15099.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:25:12Z,14,0,100.0,16.0,59.9,0.420,130.00,0.420,0.3217,-0.2700,1006.00,8.90,90.10,7.40,3133861,242,27929.0,31049.0,49333,3,3445.0,2719.0,1007.5,21.6,16.6,53.1,7.0,19.9,55.7,10.8,9436.0,14690.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:25:22Z,14,0,100.0,16.0,59.8,0.880,125.00,0.880,0.7209,-0.5047,1006.00,8.90,90.00,7.40,3133871,242,29733.0,33269.0,49334,3,3427.0,2703.0,1007.5,21.6,16.6,53.1,7.0,19.9,55.8,10.8,9794.0,15596.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:25:32Z,14,0,100.0,16.0,59.8,0.950,114.00,0.950,0.8679,-0.3864,1006.00,8.90,90.00,7.40,3133881,242,30471.0,34184.0,49335,3,3446.0,2718.0,1007.4,21.6,16.6,53.1,7.0,19.9,55.7,10.8,9981.0,16073.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:25:42Z,14,0,100.0,16.0,59.9,0.660,47.00,0.660,0.4827,0.4501,1006.00,8.90,90.00,7.40,3133891,242,29115.0,32505.0,49336,3,3446.0,2713.0,1007.3,21.6,16.6,53.1,7.0,19.9,55.8,10.8,9750.0,15464.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:25:52Z,14,0,100.0,16.0,59.8,0.700,104.00,0.700,0.6792,-0.1693,1006.00,8.90,90.00,7.40,3133901,242,27368.0,30364.0,49337,3,3451.0,2718.0,1007.4,21.6,16.6,53.1,7.0,19.9,55.7,10.8,9403.0,14536.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:26:02Z,14,0,100.0,16.0,59.8,0.940,107.00,0.940,0.8989,-0.2748,1006.00,8.90,90.00,7.40,3133911,242,32173.0,36313.0,49338,3,3471.0,2718.0,1007.3,21.6,16.6,53.1,7.0,19.9,55.7,10.8,10271.0,17556.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:26:12Z,14,0,100.0,16.0,59.9,1.820,121.00,1.820,1.5600,-0.9374,1006.00,8.90,90.00,7.40,3133921,242,38379.0,44270.0,49339,3,3469.0,2718.0,1007.3,21.6,16.6,53.1,7.0,19.9,55.7,10.8,10961.0,20885.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:26:22Z,14,0,100.0,16.0,59.9,1.060,94.00,1.060,1.0574,-0.0739,1006.00,8.90,90.00,7.40,3133931,242,38736.0,44737.0,49340,3,3454.0,2708.0,1007.4,21.6,16.6,53.1,7.0,19.9,55.8,10.8,10938.0,20938.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:26:32Z,14,0,100.0,16.0,59.9,1.100,102.00,1.100,1.0760,-0.2287,1006.00,8.90,90.00,7.40,3133941,242,42376.0,49558.0,49341,3,3474.0,2717.0,1007.3,21.6,16.6,53.1,7.0,19.9,55.8,10.8,11422.0,23245.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:26:42Z,14,0,100.0,16.0,59.9,0.810,95.00,0.810,0.8069,-0.0706,1006.00,8.90,90.00,7.40,3133951,242,40277.0,46765.0,49342,3,3469.0,2715.0,1007.4,21.6,16.6,53.1,7.0,19.9,55.9,10.8,11226.0,22003.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:26:52Z,14,0,100.0,16.0,59.9,0.550,123.00,0.550,0.4613,-0.2996,1006.00,8.90,90.00,7.40,3133961,242,38661.0,44639.0,49343,3,3417.0,2700.0,1007.4,21.6,16.6,53.1,7.0,19.9,55.8,10.8,10783.0,20085.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:27:02Z,14,0,100.0,16.0,59.9,0.310,15.00,0.310,0.0802,0.2994,1006.00,8.90,90.00,7.40,3133971,242,35225.0,40188.0,49344,3,3469.0,2714.0,1007.3,21.6,16.6,53.1,7.0,19.9,55.9,10.8,10665.0,19271.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:27:12Z,14,0,100.0,16.0,59.9,2.350,134.00,2.350,1.6904,-1.6324,1006.00,8.90,90.00,7.40,3133981,242,38318.0,44191.0,49345,3,3419.0,2704.0,1007.2,21.5,16.6,53.2,7.0,19.9,55.9,10.8,10643.0,19854.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:27:22Z,14,0,100.0,16.0,59.9,2.290,130.00,2.290,1.7542,-1.4720,1006.00,8.90,89.90,7.40,3133991,242,45074.0,53200.0,49346,3,3440.0,2716.0,1007.4,21.6,16.6,53.2,7.0,19.9,55.9,10.8,11249.0,23645.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:27:32Z,14,0,100.0,16.0,59.9,2.260,112.00,2.260,2.0954,-0.8466,1006.00,8.90,89.90,7.40,3134002,242,41448.0,48319.0,49347,3,3462.0,2711.0,1007.2,21.6,16.6,53.2,7.0,19.9,55.9,10.8,11124.0,22558.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:27:42Z,14,0,100.0,16.0,60.0,2.560,145.00,2.560,1.4684,-2.0970,1006.00,8.90,89.90,7.40,3134012,242,43217.0,50687.0,49348,3,3491.0,2729.0,1007.4,21.6,16.6,53.2,7.0,19.9,55.9,10.8,11414.0,23861.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:27:52Z,14,0,100.0,16.0,60.0,1.150,108.00,1.150,1.0937,-0.3554,1006.00,8.90,89.90,7.40,3134022,242,43625.0,51237.0,49349,3,3483.0,2721.0,1007.3,21.6,16.6,53.2,7.0,19.9,55.9,10.8,11605.0,24089.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:28:02Z,14,0,100.0,16.0,59.9,0.570,70.00,0.570,0.5356,0.1950,1006.00,8.90,89.90,7.40,3134032,242,42521.0,49753.0,49350,3,3464.0,2716.0,1007.3,21.6,16.6,53.2,7.0,19.9,55.9,10.8,11074.0,23047.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:28:12Z,14,0,100.0,16.0,60.0,1.110,76.00,1.110,1.0770,0.2685,1006.00,8.80,89.90,7.40,3134042,242,46631.0,55328.0,49351,3,3433.0,2708.0,1007.3,21.6,16.6,53.2,7.0,19.8,55.9,10.8,11244.0,24498.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:28:22Z,14,0,100.0,16.0,60.0,1.920,125.00,1.920,1.5728,-1.1013,1006.00,8.80,89.90,7.40,3134052,242,47593.0,56653.0,49352,3,3451.0,2724.0,1007.5,21.6,16.6,53.2,7.0,19.9,55.9,10.8,11303.0,25068.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:28:32Z,14,0,100.0,16.0,60.0,1.840,120.00,1.840,1.5935,-0.9200,1006.00,8.80,89.90,7.30,3134062,242,46034.0,54510.0,49353,3,3436.0,2716.0,1007.4,21.6,16.6,53.2,7.0,19.8,55.9,10.7,11214.0,24016.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:28:42Z,14,0,100.0,16.0,59.9,1.420,143.00,1.420,0.8546,-1.1341,1006.00,8.80,89.90,7.30,3134072,242,43952.0,51679.0,49354,3,3449.0,2721.0,1007.3,21.6,16.6,53.2,7.0,19.8,55.9,10.8,11193.0,23186.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:28:52Z,14,0,100.0,16.0,60.0,1.050,126.00,1.050,0.8495,-0.6172,1006.00,8.80,89.90,7.30,3134082,242,41887.0,48905.0,49355,3,3463.0,2720.0,1007.3,21.5,16.6,53.2,7.0,19.8,55.9,10.8,11055.0,22553.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:29:02Z,14,0,100.0,16.0,60.0,0.600,121.00,0.600,0.5143,-0.3090,1006.00,8.80,90.00,7.30,3134092,242,40536.0,47108.0,49356,3,3442.0,2703.0,1007.3,21.5,16.6,53.3,7.0,19.8,55.9,10.8,10889.0,21707.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:29:12Z,14,0,100.0,16.0,60.0,0.890,107.00,0.890,0.8511,-0.2602,1006.00,8.80,90.00,7.40,3134102,242,44209.0,52026.0,49357,3,3437.0,2709.0,1007.3,21.5,16.6,53.3,7.0,19.8,55.9,10.8,11292.0,23322.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:29:22Z,14,0,100.0,16.0,60.0,0.700,95.00,0.700,0.6973,-0.0610,1006.00,8.80,90.00,7.40,3134112,242,43519.0,51094.0,49358,3,3451.0,2723.0,1007.5,21.5,16.6,53.3,7.0,19.8,55.9,10.8,11114.0,22954.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:29:32Z,14,0,100.0,16.0,60.0,1.590,104.00,1.590,1.5428,-0.3847,1006.00,8.80,90.00,7.40,3134122,242,41908.0,48933.0,49359,3,3475.0,2719.0,1007.3,21.5,16.6,53.3,7.0,19.8,55.9,10.7,11284.0,22959.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:29:42Z,14,0,100.0,16.0,60.0,1.240,101.00,1.240,1.2172,-0.2366,1006.00,8.80,90.00,7.40,3134132,242,41933.0,48966.0,49360,3,3462.0,2716.0,1007.4,21.5,16.6,53.3,7.0,19.8,55.9,10.8,11076.0,22666.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:29:52Z,14,0,100.0,16.0,60.0,1.500,115.00,1.500,1.3595,-0.6339,1006.00,8.90,90.00,7.40,3134142,242,42479.0,49696.0,49361,3,3473.0,2717.0,1007.3,21.5,16.6,53.3,7.0,19.8,55.9,10.8,11347.0,23270.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:30:02Z,14,0,100.0,16.0,60.0,1.370,83.00,1.370,1.3598,0.1670,1006.00,8.80,90.00,7.40,3134152,242,41724.0,48687.0,49362,3,3419.0,2706.0,1007.5,21.5,16.6,53.3,7.0,19.8,55.9,10.7,10861.0,21552.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:30:12Z,14,0,100.0,16.0,60.0,1.280,63.00,1.280,1.1405,0.5811,1006.10,8.90,90.00,7.40,3134163,242,39545.0,45800.0,49363,3,3474.0,2717.0,1007.4,21.5,16.6,53.3,7.0,19.8,55.9,10.8,11077.0,21690.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:30:22Z,14,0,100.0,16.0,60.0,0.940,69.00,0.940,0.8776,0.3369,1006.10,8.90,90.00,7.40,3134173,242,39382.0,45585.0,49364,3,3426.0,2708.0,1007.4,21.5,16.5,53.4,7.0,19.8,55.9,10.7,10658.0,20488.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:30:32Z,14,0,100.0,16.0,60.1,0.390,65.00,0.390,0.3535,0.1648,1006.10,8.90,90.00,7.40,3134183,242,39938.0,46318.0,49365,3,3466.0,2712.0,1007.5,21.5,16.5,53.3,7.0,19.8,56.0,10.8,11085.0,21817.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:30:42Z,14,0,100.0,16.0,60.1,0.620,39.00,0.620,0.3902,0.4818,1006.10,8.90,90.10,7.40,3134193,242,42621.0,49887.0,49366,3,3447.0,2719.0,1007.6,21.5,16.6,53.3,7.0,19.8,56.0,10.8,11134.0,22478.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:30:52Z,14,0,100.0,15.9,60.2,0.230,17.00,0.230,0.0672,0.2200,1006.10,8.90,90.00,7.40,3134203,242,41935.0,48969.0,49367,3,3468.0,2712.0,1007.6,21.5,16.5,53.3,7.0,19.8,56.0,10.8,11209.0,22966.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:31:02Z,14,0,100.0,15.9,60.2,0.440,73.00,0.440,0.4208,0.1286,1006.10,8.90,90.00,7.40,3134213,242,43127.0,50566.0,49368,3,3416.0,2702.0,1007.5,21.5,16.5,53.4,7.0,19.8,56.0,10.8,11093.0,22308.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:31:12Z,14,0,100.0,15.9,60.2,1.010,59.00,1.010,0.8657,0.5202,1006.20,8.90,90.00,7.40,3134223,242,41604.0,48527.0,49369,3,3428.0,2702.0,1007.6,21.5,16.5,53.4,7.0,19.8,56.0,10.7,11088.0,21881.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:31:22Z,14,0,100.0,15.9,60.2,1.320,56.00,1.320,1.0943,0.7381,1006.20,8.90,90.00,7.40,3134233,242,42889.0,50246.0,49370,3,3445.0,2718.0,1007.5,21.5,16.5,53.4,7.0,19.8,55.9,10.7,11291.0,22590.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:31:32Z,14,0,100.0,15.9,60.2,1.280,51.00,1.280,0.9947,0.8055,1006.20,8.90,90.00,7.40,3134243,242,34430.0,39171.0,49371,3,3432.0,2706.0,1007.7,21.5,16.5,53.4,7.0,19.8,56.0,10.7,10469.0,18106.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:31:42Z,14,0,100.0,15.9,60.2,0.920,77.00,0.920,0.8964,0.2070,1006.20,8.90,90.00,7.40,3134253,242,32527.0,36759.0,49372,3,3451.0,2714.0,1007.6,21.5,16.5,53.4,7.0,19.8,56.0,10.8,10375.0,17365.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:31:52Z,14,0,100.0,15.9,60.2,1.000,78.00,1.000,0.9781,0.2079,1006.30,8.90,90.00,7.40,3134263,242,37099.0,42604.0,49373,3,3430.0,2716.0,1007.5,21.5,16.5,53.4,7.0,19.7,56.0,10.7,10637.0,19190.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:32:02Z,14,0,100.0,15.9,60.3,0.830,16.00,0.830,0.2288,0.7978,1006.30,8.90,90.00,7.40,3134273,242,38732.0,44732.0,49374,3,3451.0,2714.0,1007.5,21.5,16.5,53.4,7.0,19.8,56.0,10.7,10868.0,20680.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:32:12Z,14,0,100.0,15.9,60.3,0.780,9.00,0.780,0.1220,0.7704,1006.30,8.90,90.00,7.40,3134283,242,37182.0,42712.0,49375,3,3461.0,2712.0,1007.6,21.5,16.5,53.4,7.0,19.8,56.0,10.7,10853.0,20174.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:32:22Z,14,0,100.0,15.9,60.3,0.760,38.00,0.760,0.4679,0.5989,1006.30,8.90,90.00,7.40,3134293,242,36932.0,42387.0,49376,3,3412.0,2698.0,1007.7,21.5,16.5,53.4,7.0,19.8,56.0,10.7,10482.0,19100.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:32:32Z,14,0,100.0,15.9,60.3,1.460,4.00,1.460,0.1018,1.4564,1006.30,8.90,90.00,7.40,3134303,242,39850.0,46202.0,49377,3,3428.0,2703.0,1007.7,21.5,16.5,53.4,7.0,19.8,56.0,10.7,11020.0,20927.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:32:42Z,14,0,100.0,15.9,60.3,0.840,7.00,0.840,0.1024,0.8337,1006.30,8.90,90.00,7.40,3134313,242,31197.0,35090.0,49378,3,3445.0,2719.0,1007.7,21.5,16.5,53.4,7.0,19.8,56.0,10.7,9990.0,16406.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:32:52Z,14,0,100.0,15.9,60.4,0.930,349.00,0.930,-0.1775,0.9129,1006.30,8.80,90.00,7.40,3134323,242,23770.0,26030.0,49379,3,3471.0,2712.0,1007.7,21.5,16.5,53.4,7.0,19.7,56.0,10.7,8891.0,13069.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:33:02Z,14,0,100.0,16.0,60.3,0.870,327.00,0.870,-0.4738,0.7296,1006.30,8.80,90.00,7.30,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan, +2026-04-17T00:33:12Z,14,0,100.0,15.9,60.3,0.890,85.00,0.890,0.8866,0.0776,1006.30,8.80,90.00,7.40,3134334,242,18651.0,20042.0,49380,3,3428.0,2709.0,1007.8,21.5,16.5,53.5,7.0,19.8,56.0,10.7,7322.0,9713.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:33:22Z,14,0,100.0,15.9,60.4,1.630,97.00,1.630,1.6179,-0.1986,1006.30,8.80,90.00,7.30,3134344,242,20935.0,22688.0,49381,3,3444.0,2712.0,1007.6,21.5,16.5,53.5,7.0,19.7,56.1,10.7,8035.0,11101.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:33:32Z,14,0,100.0,15.9,60.4,1.150,45.00,1.150,0.8132,0.8132,1006.40,8.80,90.10,7.30,3134354,242,16151.0,17194.0,49382,3,3446.0,2719.0,1007.8,21.5,16.5,53.5,7.0,19.7,56.1,10.7,6643.0,8504.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:33:42Z,14,0,100.0,15.9,60.4,1.400,70.00,1.400,1.3156,0.4788,1006.40,8.80,90.10,7.30,3134364,242,21860.0,23771.0,49383,3,3455.0,2709.0,1007.8,21.5,16.5,53.5,7.0,19.7,56.0,10.7,8379.0,11811.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:33:52Z,14,0,100.0,15.9,60.4,0.400,50.00,0.400,0.3064,0.2571,1006.40,8.80,90.20,7.30,3134374,242,18563.0,19941.0,49384,3,3430.0,2697.0,1007.8,21.5,16.5,53.5,7.0,19.7,56.0,10.7,7373.0,9855.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:34:02Z,14,0,100.0,15.9,60.4,0.750,359.00,0.750,-0.0131,0.7499,1006.40,8.80,90.20,7.40,3134384,242,19634.0,21175.0,49385,3,3425.0,2702.0,1007.8,21.5,16.5,53.5,7.0,19.7,56.1,10.7,7623.0,10281.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:34:12Z,14,8,100.0,0.0,0.0,1.400,22.00,1.400,0.5244,1.2981,1006.40,8.80,90.20,7.40,3134394,242,19009.0,20454.0,49386,3,3440.0,2719.0,1007.6,21.5,16.5,53.5,7.0,19.7,56.0,10.7,7435.0,9928.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:34:22Z,14,0,100.0,15.9,60.4,1.110,21.00,1.110,0.3978,1.0363,1006.40,8.80,90.20,7.30,3134404,242,29710.0,33240.0,49387,3,3426.0,2703.0,1007.8,21.5,16.5,53.5,7.0,19.7,56.1,10.7,9706.0,15557.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:34:32Z,14,0,100.0,15.9,60.4,1.890,39.00,1.890,1.1894,1.4688,1006.40,8.80,90.20,7.30,3134414,242,20602.0,22299.0,49388,3,3446.0,2721.0,1007.6,21.5,16.5,53.5,7.0,19.7,56.1,10.7,7904.0,10820.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:34:42Z,14,0,100.0,15.9,60.4,1.340,32.00,1.340,0.7101,1.1364,1006.40,8.80,90.20,7.30,3134424,242,15479.0,16437.0,49389,3,3462.0,2712.0,1007.9,21.5,16.5,53.5,7.0,19.7,56.0,10.7,6601.0,8408.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:34:52Z,14,0,100.0,15.9,60.4,2.340,10.00,2.340,0.4063,2.3045,1006.40,8.70,90.30,7.30,3134434,242,13097.0,13783.0,49390,3,3449.0,2719.0,1007.8,21.5,16.5,53.5,7.0,19.7,56.0,10.7,5682.0,6925.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:35:02Z,14,0,100.0,15.9,60.4,1.180,48.00,1.180,0.8769,0.7896,1006.40,8.70,90.40,7.30,3134444,242,11093.0,11585.0,49391,3,3464.0,2711.0,1007.8,21.5,16.5,53.5,7.0,19.7,56.0,10.7,5112.0,6050.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:35:12Z,14,0,100.0,15.9,60.4,1.620,48.00,1.620,1.2039,1.0840,1006.40,8.70,90.40,7.30,3134454,242,15943.0,16959.0,49392,3,3421.0,2706.0,1007.7,21.5,16.5,53.5,7.0,19.7,56.0,10.7,6506.0,8257.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:35:22Z,14,0,100.0,15.9,60.4,1.440,49.00,1.440,1.0868,0.9447,1006.40,8.70,90.40,7.30,3134464,242,11380.0,11898.0,49393,3,3466.0,2709.0,1007.8,21.5,16.5,53.5,7.0,19.7,56.0,10.7,5236.0,6240.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:35:32Z,14,0,100.0,15.9,60.4,2.450,57.00,2.450,2.0547,1.3344,1006.40,8.70,90.50,7.30,3134474,242,9840.0,10227.0,49394,3,3442.0,2716.0,1007.7,21.5,16.5,53.6,7.0,19.7,56.0,10.7,4476.0,5175.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:35:42Z,14,0,100.0,15.9,60.5,0.730,48.00,0.730,0.5425,0.4885,1006.40,8.70,90.60,7.30,3134484,242,8087.0,8348.0,49395,3,3425.0,2707.0,1007.8,21.4,16.5,53.6,7.0,19.7,56.0,10.7,3738.0,4206.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:35:52Z,14,0,100.0,15.9,60.5,1.850,84.00,1.850,1.8399,0.1934,1006.40,8.70,90.60,7.30,3134495,242,14319.0,15139.0,49396,3,3444.0,2714.0,1007.7,21.4,16.5,53.6,7.0,19.7,56.1,10.7,6099.0,7572.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:36:02Z,14,0,100.0,15.9,60.5,0.950,72.00,0.950,0.9035,0.2936,1006.40,8.70,90.70,7.30,3134505,242,13505.0,14234.0,49397,3,3437.0,2713.0,1007.8,21.5,16.5,53.6,7.0,19.7,56.1,10.7,5780.0,7082.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:36:12Z,14,0,100.0,15.9,60.5,0.730,100.00,0.730,0.7189,-0.1268,1006.40,8.70,90.70,7.30,3134515,242,11665.0,12209.0,49398,3,3468.0,2729.0,1007.6,21.4,16.5,53.6,7.0,19.7,56.0,10.7,5255.0,6245.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:36:22Z,14,0,100.0,15.9,60.5,0.740,119.00,0.740,0.6472,-0.3588,1006.30,8.70,90.70,7.30,3134525,242,14086.0,14879.0,49399,3,3473.0,2716.0,1007.8,21.4,16.5,53.6,7.0,19.7,56.1,10.6,6238.0,7723.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:36:32Z,14,0,100.0,15.9,60.5,0.790,94.00,0.790,0.7881,-0.0551,1006.30,8.70,90.70,7.30,3134535,242,15309.0,16246.0,49400,3,3432.0,2697.0,1007.8,21.4,16.5,53.6,7.0,19.7,56.1,10.7,6398.0,8150.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:36:42Z,14,0,100.0,15.9,60.5,1.040,81.00,1.040,1.0272,0.1627,1006.30,8.70,90.70,7.30,3134545,242,12511.0,13137.0,49401,3,3460.0,2709.0,1007.8,21.4,16.5,53.6,7.0,19.7,56.1,10.7,5596.0,6805.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:36:52Z,14,0,100.0,15.9,60.6,0.720,35.00,0.720,0.4130,0.5898,1006.30,8.70,90.70,7.30,3134555,242,9633.0,10004.0,49402,3,3416.0,2702.0,1007.7,21.4,16.5,53.6,7.0,19.7,56.1,10.7,4317.0,4982.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:37:02Z,14,0,100.0,15.9,60.6,2.030,84.00,2.030,2.0189,0.2122,1006.30,8.60,90.80,7.30,3134565,242,7862.0,8109.0,49403,3,3451.0,2700.0,1007.7,21.4,16.5,53.7,7.0,19.7,56.1,10.7,3787.0,4277.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:37:12Z,14,0,100.0,15.8,60.6,2.060,70.00,2.060,1.9358,0.7046,1006.30,8.60,90.80,7.30,3134575,242,5383.0,5498.0,49404,3,3444.0,2714.0,1007.6,21.4,16.5,53.6,7.0,19.7,56.1,10.7,2634.0,2847.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:37:22Z,14,0,100.0,15.9,60.5,1.810,86.00,1.810,1.8056,0.1263,1006.30,8.60,90.90,7.30,3134585,242,5934.0,6074.0,49405,3,3451.0,2706.0,1007.6,21.4,16.5,53.7,7.0,19.7,56.1,10.7,2934.0,3203.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:37:32Z,14,0,100.0,15.9,60.5,1.540,64.00,1.540,1.3841,0.6751,1006.30,8.60,91.00,7.30,3134595,242,6339.0,6499.0,49406,3,3428.0,2695.0,1007.7,21.4,16.5,53.7,7.0,19.7,56.1,10.7,3056.0,3366.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:37:42Z,14,0,100.0,15.9,60.5,1.670,101.00,1.670,1.6393,-0.3187,1006.30,8.60,91.00,7.30,3134605,242,6394.0,6557.0,49407,3,3425.0,2699.0,1007.6,21.4,16.4,53.7,7.0,19.7,56.1,10.7,3048.0,3363.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:37:52Z,14,0,100.0,15.9,60.5,1.300,88.00,1.300,1.2992,0.0454,1006.30,8.60,91.00,7.30,3134615,242,6180.0,6332.0,49408,3,3446.0,2717.0,1007.6,21.4,16.5,53.7,7.0,19.7,56.1,10.7,2976.0,3264.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:38:02Z,14,0,100.0,15.9,60.5,1.480,83.00,1.480,1.4690,0.1804,1006.20,8.60,91.10,7.30,3134625,242,6142.0,6292.0,49409,3,3454.0,2700.0,1007.6,21.4,16.4,53.7,7.0,19.6,56.1,10.7,3041.0,3355.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:38:12Z,14,0,100.0,15.8,60.5,1.670,81.00,1.670,1.6494,0.2612,1006.20,8.60,91.00,7.30,3134635,242,9932.0,10326.0,49410,3,3444.0,2719.0,1007.6,21.4,16.4,53.7,7.0,19.7,56.1,10.7,4500.0,5216.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:38:22Z,14,0,100.0,15.9,60.5,1.730,91.00,1.730,1.7297,-0.0302,1006.20,8.60,91.00,7.30,3134645,242,6898.0,7088.0,49411,3,3445.0,2716.0,1007.6,21.4,16.5,53.7,7.0,19.6,56.1,10.6,3299.0,3643.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:38:32Z,14,0,100.0,15.9,60.5,1.760,96.00,1.760,1.7504,-0.1840,1006.20,8.60,91.10,7.30,3134656,242,5806.0,5940.0,49412,3,3441.0,2700.0,1007.6,21.4,16.4,53.7,7.0,19.7,56.2,10.7,2853.0,3117.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:38:42Z,14,0,100.0,15.8,60.5,1.790,105.00,1.790,1.7290,-0.4633,1006.20,8.60,91.10,7.30,3134666,242,6500.0,6669.0,49413,3,3428.0,2704.0,1007.5,21.4,16.4,53.8,7.0,19.6,56.1,10.6,3085.0,3410.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:38:52Z,14,0,100.0,15.8,60.6,0.910,87.00,0.910,0.9088,0.0476,1006.20,8.60,91.10,7.30,3134676,242,6551.0,6722.0,49414,3,3485.0,2723.0,1007.5,21.4,16.4,53.7,7.0,19.7,56.1,10.7,3258.0,3617.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:39:02Z,14,0,100.0,15.8,60.5,1.030,83.00,1.030,1.0223,0.1255,1006.20,8.60,91.10,7.30,3134686,242,8077.0,8337.0,49415,3,3468.0,2718.0,1007.5,21.4,16.4,53.7,7.0,19.6,56.2,10.6,3868.0,4389.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:39:12Z,14,0,100.0,15.8,60.6,1.530,53.00,1.530,1.2219,0.9208,1006.20,8.60,91.20,7.30,3134696,242,7081.0,7281.0,49416,3,3432.0,2702.0,1007.5,21.4,16.4,53.8,7.0,19.6,56.2,10.7,3368.0,3745.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:39:22Z,14,0,100.0,15.8,60.5,2.520,60.00,2.520,2.1824,1.2600,1006.20,8.60,91.20,7.30,3134706,242,8093.0,8354.0,49417,3,3465.0,2716.0,1007.4,21.4,16.4,53.8,7.0,19.7,56.2,10.7,3872.0,4392.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:39:32Z,14,0,100.0,15.8,60.6,1.680,111.00,1.680,1.5684,-0.6021,1006.20,8.60,91.20,7.30,3134716,242,10205.0,10621.0,49418,3,3411.0,2704.0,1007.6,21.4,16.4,53.8,7.0,19.6,56.2,10.7,4498.0,5227.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:39:42Z,14,0,100.0,15.9,60.6,0.990,126.00,0.990,0.8009,-0.5819,1006.20,8.60,91.20,7.30,3134726,242,8637.0,8935.0,49419,3,3427.0,2708.0,1007.5,21.4,16.4,53.8,7.0,19.6,56.2,10.6,3949.0,4499.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:39:52Z,14,0,100.0,15.8,60.6,0.250,121.00,0.250,0.2143,-0.1288,1006.20,8.60,91.20,7.30,3134736,242,9044.0,9371.0,49420,3,3447.0,2719.0,1007.5,21.4,16.4,53.8,7.0,19.6,56.2,10.7,4155.0,4770.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:40:02Z,14,0,100.0,15.8,60.5,0.350,324.00,0.350,-0.2057,0.2832,1006.20,8.60,91.20,7.30,3134746,242,8451.0,8736.0,49421,3,3431.0,2711.0,1007.6,21.4,16.4,53.8,7.0,19.6,56.2,10.6,3885.0,4408.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:40:12Z,14,0,100.0,15.8,60.6,0.780,92.00,0.780,0.7795,-0.0272,1006.20,8.60,91.20,7.40,3134756,242,8025.0,8282.0,49422,3,3483.0,2716.0,1007.6,21.4,16.4,53.8,7.0,19.6,56.2,10.7,3937.0,4459.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:40:22Z,14,0,100.0,15.8,60.6,0.740,90.00,0.740,0.7400,0.0000,1006.20,8.60,91.30,7.40,3134766,242,8435.0,8719.0,49423,3,3481.0,2716.0,1007.5,21.4,16.4,53.8,7.0,19.6,56.2,10.7,4112.0,4675.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:40:32Z,14,0,100.0,15.8,60.6,0.560,51.00,0.560,0.4352,0.3524,1006.20,8.60,91.20,7.40,3134776,242,8208.0,8477.0,49424,3,3452.0,2708.0,1007.6,21.4,16.4,53.8,7.0,19.6,56.2,10.7,3899.0,4424.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:40:42Z,14,0,100.0,15.8,60.6,0.470,83.00,0.470,0.4665,0.0573,1006.20,8.70,91.20,7.40,3134786,242,10353.0,10781.0,49425,3,3462.0,2708.0,1007.6,21.4,16.4,53.9,7.0,19.6,56.2,10.7,4820.0,5655.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:40:52Z,14,0,100.0,15.8,60.7,0.830,114.00,0.830,0.7582,-0.3376,1006.20,8.70,91.30,7.40,3134796,242,11441.0,11964.0,49426,3,3408.0,2699.0,1007.6,21.4,16.4,53.9,7.1,19.6,56.2,10.7,4958.0,5876.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:41:02Z,14,0,100.0,15.8,60.7,0.810,71.00,0.810,0.7659,0.2637,1006.20,8.70,91.30,7.40,3134806,242,9446.0,9802.0,49427,3,3423.0,2703.0,1007.6,21.4,16.4,53.9,7.0,19.6,56.3,10.6,4275.0,4927.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:41:12Z,14,0,100.0,15.8,60.7,0.490,341.00,0.490,-0.1595,0.4633,1006.20,8.70,91.30,7.40,3134816,242,10704.0,11162.0,49428,3,3437.0,2721.0,1007.5,21.4,16.4,53.9,7.0,19.6,56.3,10.7,4744.0,5553.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:41:22Z,14,0,100.0,15.8,60.7,0.750,75.00,0.750,0.7244,0.1941,1006.20,8.70,91.20,7.40,3134827,242,12662.0,13303.0,49429,3,3438.0,2716.0,1007.6,21.4,16.4,53.9,7.0,19.6,56.3,10.6,5475.0,6623.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:41:32Z,14,0,100.0,15.8,60.7,1.720,74.00,1.720,1.6534,0.4741,1006.20,8.70,91.30,7.40,3134837,242,10680.0,11136.0,49430,3,3425.0,2719.0,1007.4,21.4,16.4,53.9,7.0,19.6,56.3,10.7,4679.0,5463.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:41:42Z,14,0,100.0,15.8,60.7,1.380,62.00,1.380,1.2185,0.6479,1006.20,8.70,91.30,7.40,3134847,242,11141.0,11637.0,49431,3,3462.0,2713.0,1007.6,21.4,16.4,53.9,7.0,19.6,56.3,10.7,5097.0,6045.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:41:52Z,14,0,100.0,15.8,60.7,0.760,59.00,0.760,0.6514,0.3914,1006.20,8.70,91.30,7.40,3134857,242,9405.0,9758.0,49432,3,3437.0,2719.0,1007.4,21.4,16.4,53.9,7.0,19.6,56.3,10.7,4278.0,4893.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:42:02Z,14,0,100.0,15.8,60.7,1.660,49.00,1.660,1.2528,1.0891,1006.20,8.70,91.20,7.40,3134867,242,9012.0,9336.0,49433,3,3425.0,2706.0,1007.6,21.3,16.4,53.9,7.0,19.6,56.3,10.7,4101.0,4694.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:42:12Z,14,0,100.0,15.8,60.7,1.440,101.00,1.440,1.4135,-0.2748,1006.20,8.70,91.30,7.40,3134877,242,7443.0,7664.0,49434,3,3475.0,2719.0,1007.5,21.3,16.4,53.9,7.0,19.6,56.4,10.7,3629.0,4077.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:42:22Z,14,0,100.0,15.8,60.7,1.440,87.00,1.440,1.4380,0.0754,1006.20,8.70,91.30,7.40,3134887,242,8006.0,8262.0,49435,3,3447.0,2709.0,1007.5,21.3,16.4,53.9,7.0,19.6,56.4,10.7,3793.0,4281.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:42:32Z,14,0,100.0,15.8,60.7,0.560,349.00,0.560,-0.1069,0.5497,1006.20,8.70,91.30,7.40,3134897,242,7553.0,7781.0,49436,3,3426.0,2700.0,1007.5,21.3,16.4,54.0,7.0,19.6,56.3,10.7,3540.0,3973.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:42:42Z,14,0,100.0,15.8,60.7,1.000,74.00,1.000,0.9613,0.2756,1006.20,8.70,91.30,7.40,3134907,242,15158.0,16077.0,49437,3,3462.0,2719.0,1007.4,21.3,16.4,54.0,7.1,19.6,56.3,10.7,6442.0,8160.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:42:52Z,14,0,100.0,15.8,60.7,1.870,66.00,1.870,1.7083,0.7606,1006.20,8.70,91.30,7.40,3134917,242,12915.0,13582.0,49438,3,3417.0,2707.0,1007.4,21.3,16.4,54.0,7.0,19.6,56.4,10.7,5483.0,6644.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:43:02Z,14,0,100.0,15.8,60.8,2.310,58.00,2.310,1.9590,1.2241,1006.20,8.60,91.40,7.40,3134927,242,8292.0,8567.0,49439,3,3455.0,2708.0,1007.7,21.3,16.4,54.0,7.0,19.6,56.4,10.7,3952.0,4487.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:43:12Z,14,0,100.0,15.8,60.8,0.880,44.00,0.880,0.6113,0.6330,1006.20,8.60,91.40,7.40,3134937,242,8093.0,8354.0,49440,3,3443.0,2719.0,1007.5,21.3,16.4,54.0,7.0,19.6,56.3,10.6,3766.0,4245.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:43:22Z,14,0,100.0,15.8,60.8,1.110,71.00,1.110,1.0495,0.3614,1006.20,8.60,91.40,7.40,3134947,242,8921.0,9239.0,49441,3,3459.0,2709.0,1007.7,21.3,16.4,54.0,7.0,19.6,56.3,10.7,4221.0,4847.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:43:32Z,14,0,100.0,15.8,60.8,2.060,65.00,2.060,1.8670,0.8706,1006.20,8.60,91.40,7.40,3134957,242,7941.0,8193.0,49442,3,3464.0,2723.0,1007.6,21.3,16.4,54.0,7.0,19.6,56.3,10.6,3798.0,4263.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:43:42Z,14,0,100.0,15.8,60.8,1.760,39.00,1.760,1.1076,1.3678,1006.20,8.60,91.40,7.40,3134967,242,8368.0,8648.0,49443,3,3447.0,2699.0,1007.7,21.3,16.4,54.0,7.0,19.6,56.3,10.6,3993.0,4534.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:43:52Z,14,0,100.0,15.8,60.8,2.120,84.00,2.120,2.1084,0.2216,1006.20,8.60,91.40,7.40,3134977,242,8180.0,8447.0,49444,3,3442.0,2717.0,1007.5,21.3,16.4,54.0,7.0,19.6,56.4,10.7,3804.0,4297.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:44:02Z,14,0,100.0,15.8,60.8,1.760,89.00,1.760,1.7597,0.0307,1006.20,8.60,91.40,7.40,3134988,242,8014.0,8270.0,49445,3,3426.0,2707.0,1007.6,21.3,16.3,54.1,7.0,19.6,56.3,10.6,3705.0,4174.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:44:12Z,14,0,100.0,15.8,60.8,1.220,85.00,1.220,1.2154,0.1063,1006.20,8.60,91.50,7.40,3134998,242,7297.0,7509.0,49446,3,3444.0,2721.0,1007.6,21.3,16.4,54.1,7.0,19.6,56.3,10.7,3437.0,3822.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:44:22Z,14,0,100.0,15.8,60.8,2.280,60.00,2.280,1.9745,1.1400,1006.20,8.60,91.50,7.40,3135008,242,7280.0,7491.0,49447,3,3459.0,2712.0,1007.5,21.3,16.3,54.1,7.0,19.6,56.4,10.7,3515.0,3940.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:44:32Z,14,0,100.0,15.8,60.8,1.850,89.00,1.850,1.8497,0.0323,1006.20,8.60,91.50,7.40,3135018,242,7628.0,7860.0,49448,3,3450.0,2714.0,1007.7,21.3,16.4,54.1,7.0,19.6,56.4,10.6,3622.0,4067.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:44:42Z,14,0,100.0,15.8,60.8,2.330,26.00,2.330,1.0214,2.0942,1006.20,8.60,91.50,7.40,3135028,242,7420.0,7640.0,49449,3,3475.0,2713.0,1007.6,21.3,16.4,54.1,7.0,19.5,56.4,10.6,3649.0,4096.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:44:52Z,14,0,100.0,15.8,60.8,1.450,56.00,1.450,1.2021,0.8108,1006.20,8.60,91.60,7.40,3135038,242,9009.0,9333.0,49450,3,3431.0,2697.0,1007.7,21.3,16.3,54.1,7.0,19.5,56.4,10.6,4173.0,4790.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:45:02Z,14,0,100.0,15.8,60.8,0.200,350.00,0.200,-0.0347,0.1970,1006.20,8.70,91.60,7.40,3135048,242,11320.0,11832.0,49451,3,3464.0,2715.0,1007.6,21.3,16.3,54.1,7.0,19.6,56.4,10.7,5154.0,6142.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:45:12Z,14,0,100.0,15.8,60.8,1.610,40.00,1.610,1.0349,1.2333,1006.20,8.70,91.60,7.40,3135058,242,11364.0,11880.0,49452,3,3406.0,2699.0,1007.5,21.3,16.3,54.1,7.0,19.5,56.4,10.6,4925.0,5821.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:45:22Z,14,0,100.0,15.8,60.9,1.300,61.00,1.300,1.1370,0.6303,1006.20,8.70,91.60,7.40,3135068,242,10900.0,11375.0,49453,3,3426.0,2716.0,1007.5,21.3,16.3,54.1,7.0,19.5,56.4,10.6,4769.0,5607.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:45:32Z,14,0,100.0,15.8,60.9,0.610,61.00,0.610,0.5335,0.2957,1006.20,8.70,91.60,7.40,3135078,242,11907.0,12474.0,49454,3,3449.0,2713.0,1007.5,21.3,16.3,54.1,7.0,19.6,56.4,10.7,5303.0,6349.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:45:42Z,14,0,100.0,15.8,60.9,0.560,89.00,0.560,0.5599,0.0098,1006.20,8.70,91.50,7.40,3135088,242,10785.0,11250.0,49455,3,3449.0,2709.0,1007.6,21.3,16.3,54.2,7.0,19.5,56.4,10.6,4895.0,5782.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:45:52Z,14,0,100.0,15.8,60.9,0.680,101.00,0.680,0.6675,-0.1298,1006.20,8.70,91.60,7.50,3135098,242,15227.0,16154.0,49456,3,3445.0,2729.0,1007.6,21.3,16.3,54.1,7.0,19.5,56.4,10.6,6301.0,7898.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:46:02Z,14,0,100.0,15.7,60.9,0.970,78.00,0.970,0.9488,0.2017,1006.20,8.70,91.50,7.40,3135108,242,9869.0,10258.0,49457,3,3452.0,2708.0,1007.5,21.3,16.3,54.2,7.1,19.5,56.5,10.6,4569.0,5320.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:46:12Z,14,0,100.0,15.8,60.9,1.050,70.00,1.050,0.9867,0.3591,1006.20,8.70,91.50,7.50,3135118,242,11352.0,11867.0,49458,3,3455.0,2721.0,1007.6,21.3,16.3,54.2,7.0,19.5,56.5,10.7,5057.0,6036.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:46:22Z,14,0,100.0,15.8,61.0,1.760,69.00,1.760,1.6431,0.6307,1006.20,8.70,91.50,7.40,3135128,242,9937.0,10331.0,49459,3,3464.0,2713.0,1007.6,21.3,16.4,54.2,7.1,19.5,56.5,10.7,4631.0,5406.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:46:33Z,14,0,100.0,15.8,60.9,1.170,87.00,1.170,1.1684,0.0612,1006.20,8.70,91.50,7.50,3135138,242,12182.0,12775.0,49460,3,3417.0,2702.0,1007.6,21.3,16.3,54.2,7.0,19.5,56.5,10.7,5255.0,6310.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:46:43Z,14,0,100.0,15.8,61.0,1.080,94.00,1.080,1.0774,-0.0753,1006.20,8.70,91.50,7.50,3135148,242,12370.0,12982.0,49461,3,3426.0,2702.0,1007.7,21.3,16.3,54.2,7.1,19.5,56.5,10.6,5386.0,6487.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:46:53Z,14,0,100.0,15.8,61.0,1.360,90.00,1.360,1.3600,0.0000,1006.20,8.70,91.50,7.50,3135159,242,11199.0,11700.0,49462,3,3437.0,2718.0,1007.5,21.3,16.3,54.2,7.0,19.5,56.5,10.6,4948.0,5834.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:47:03Z,14,0,100.0,15.8,61.0,1.030,76.00,1.030,0.9994,0.2492,1006.20,8.70,91.50,7.50,3135169,242,13750.0,14506.0,49463,3,3469.0,2715.0,1007.7,21.3,16.3,54.2,7.0,19.5,56.5,10.6,6065.0,7510.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:47:13Z,14,0,100.0,15.7,61.0,0.490,39.00,0.490,0.3084,0.3808,1006.20,8.70,91.50,7.50,3135179,242,14409.0,15239.0,49464,3,3425.0,2711.0,1007.5,21.3,16.3,54.2,7.0,19.5,56.4,10.6,5999.0,7454.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:47:23Z,14,0,100.0,15.8,61.0,1.080,61.00,1.080,0.9446,0.5236,1006.20,8.70,91.50,7.50,3135189,242,13217.0,13915.0,49465,3,3465.0,2711.0,1007.7,21.3,16.3,54.2,7.1,19.5,56.5,10.6,5875.0,7219.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:47:33Z,14,0,100.0,15.8,61.0,1.770,78.00,1.770,1.7313,0.3680,1006.20,8.80,91.50,7.50,3135199,242,14680.0,15542.0,49466,3,3437.0,2718.0,1007.5,21.3,16.3,54.2,7.0,19.5,56.5,10.7,6118.0,7647.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:47:43Z,14,0,100.0,15.7,61.0,1.660,94.00,1.660,1.6560,-0.1158,1006.30,8.70,91.50,7.50,3135209,242,13306.0,14014.0,49467,3,3447.0,2703.0,1007.7,21.3,16.3,54.3,7.1,19.5,56.5,10.6,5838.0,7171.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:47:53Z,14,0,100.0,15.7,61.0,0.680,90.00,0.680,0.6800,0.0000,1006.30,8.70,91.40,7.50,3135219,242,10999.0,11482.0,49468,3,3474.0,2724.0,1007.5,21.3,16.3,54.3,7.0,19.5,56.6,10.7,5049.0,5977.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:48:03Z,14,0,100.0,15.8,61.0,2.220,92.00,2.220,2.2186,-0.0775,1006.20,8.70,91.40,7.50,3135229,242,11074.0,11564.0,49469,3,3451.0,2712.0,1007.5,21.3,16.3,54.3,7.0,19.5,56.6,10.7,4988.0,5929.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:48:13Z,14,0,100.0,15.8,61.1,2.020,106.00,2.020,1.9417,-0.5568,1006.20,8.70,91.40,7.50,3135239,242,8632.0,8930.0,49470,3,3442.0,2718.0,1007.5,21.3,16.3,54.3,7.0,19.5,56.5,10.6,3987.0,4528.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:48:23Z,14,0,100.0,15.8,61.1,1.430,68.00,1.430,1.3259,0.5357,1006.20,8.70,91.40,7.50,3135249,242,8722.0,9026.0,49471,3,3469.0,2717.0,1007.5,21.3,16.3,54.3,7.1,19.5,56.5,10.6,4153.0,4752.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:48:33Z,14,0,100.0,15.8,61.0,2.360,75.00,2.360,2.2796,0.6108,1006.20,8.70,91.30,7.40,3135259,242,8330.0,8607.0,49472,3,3424.0,2708.0,1007.5,21.3,16.3,54.3,7.0,19.5,56.5,10.6,3797.0,4321.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:48:43Z,14,0,100.0,15.8,61.1,1.580,92.00,1.580,1.5790,-0.0551,1006.20,8.70,91.40,7.40,3135269,242,7494.0,7718.0,49473,3,3428.0,2704.0,1007.5,21.3,16.3,54.3,7.0,19.5,56.5,10.6,3483.0,3931.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:48:53Z,14,0,100.0,15.7,61.1,1.680,60.00,1.680,1.4549,0.8400,1006.20,8.70,91.40,7.40,3135279,242,10122.0,10531.0,49474,3,3444.0,2719.0,1007.6,21.3,16.3,54.3,7.0,19.5,56.5,10.6,4563.0,5316.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:49:03Z,14,0,100.0,15.7,61.1,2.010,96.00,2.010,1.9990,-0.2101,1006.20,8.70,91.40,7.40,3135289,242,9666.0,10039.0,49475,3,3465.0,2712.0,1007.6,21.3,16.3,54.3,7.0,19.5,56.6,10.7,4529.0,5273.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:49:13Z,14,0,100.0,15.7,61.1,1.550,63.00,1.550,1.3811,0.7037,1006.20,8.70,91.40,7.40,3135299,242,6759.0,6941.0,49476,3,3495.0,2724.0,1007.7,21.3,16.3,54.3,7.0,19.5,56.6,10.6,3364.0,3775.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:49:23Z,14,0,100.0,15.7,61.1,2.480,55.00,2.480,2.0315,1.4225,1006.20,8.70,91.50,7.40,3135309,242,6871.0,7059.0,49477,3,3422.0,2699.0,1007.6,21.3,16.3,54.3,7.0,19.5,56.5,10.6,3247.0,3599.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:49:33Z,14,0,100.0,15.7,61.1,1.760,67.00,1.760,1.6201,0.6877,1006.20,8.70,91.50,7.40,3135320,242,7831.0,8076.0,49478,3,3445.0,2712.0,1007.7,21.3,16.3,54.3,7.0,19.5,56.6,10.6,3713.0,4158.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:49:43Z,14,0,100.0,15.8,61.1,1.960,75.00,1.960,1.8932,0.5073,1006.20,8.70,91.50,7.40,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan, +2026-04-17T00:49:53Z,14,0,100.0,15.7,61.1,1.010,92.00,1.010,1.0094,-0.0352,1006.20,8.70,91.50,7.50,3135330,242,7055.0,7254.0,49479,3,3457.0,2707.0,1007.7,21.3,16.3,54.4,7.0,19.5,56.6,10.6,3442.0,3833.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:50:03Z,14,0,100.0,15.7,61.1,1.240,27.00,1.240,0.5629,1.1048,1006.20,8.70,91.50,7.40,3135340,242,5959.0,6101.0,49480,3,3411.0,2701.0,1007.7,21.3,16.3,54.4,7.1,19.5,56.6,10.6,2811.0,3065.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:50:13Z,14,0,100.0,15.7,61.1,2.300,81.00,2.300,2.2717,0.3598,1006.20,8.70,91.50,7.40,3135350,242,5233.0,5342.0,49481,3,3421.0,2702.0,1007.6,21.3,16.3,54.4,7.0,19.5,56.6,10.6,2517.0,2726.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:50:23Z,14,0,100.0,15.7,61.1,2.330,79.00,2.330,2.2872,0.4446,1006.20,8.70,91.60,7.40,3135360,242,5979.0,6121.0,49482,3,3457.0,2723.0,1007.5,21.2,16.3,54.4,7.1,19.5,56.6,10.6,2911.0,3180.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:50:33Z,14,0,100.0,15.7,61.2,1.790,84.00,1.790,1.7802,0.1871,1006.20,8.70,91.60,7.40,3135370,242,6712.0,6892.0,49483,3,3468.0,2716.0,1007.5,21.3,16.3,54.4,7.1,19.5,56.6,10.6,3290.0,3657.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:50:43Z,14,0,100.0,15.7,61.1,1.850,91.00,1.850,1.8497,-0.0323,1006.20,8.70,91.60,7.40,3135380,242,6029.0,6174.0,49484,3,3449.0,2720.0,1007.7,21.2,16.3,54.4,7.1,19.5,56.6,10.6,2901.0,3184.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:50:53Z,14,0,100.0,15.7,61.1,1.840,87.00,1.840,1.8375,0.0963,1006.20,8.70,91.60,7.40,3135390,242,5463.0,5582.0,49485,3,3469.0,2712.0,1007.6,21.2,16.3,54.4,7.0,19.5,56.6,10.6,2754.0,2996.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:51:03Z,14,0,100.0,15.7,61.1,1.470,75.00,1.470,1.4199,0.3805,1006.20,8.70,91.60,7.40,3135400,242,5865.0,6002.0,49486,3,3406.0,2695.0,1007.6,21.2,16.3,54.4,7.0,19.5,56.6,10.6,2773.0,3021.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:51:13Z,14,0,100.0,15.7,61.2,1.450,94.00,1.450,1.4465,-0.1011,1006.20,8.70,91.60,7.40,3135410,242,6021.0,6166.0,49487,3,3418.0,2702.0,1007.7,21.2,16.3,54.5,7.1,19.5,56.6,10.6,2860.0,3123.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:51:23Z,14,0,100.0,15.7,61.1,2.680,77.00,2.680,2.6113,0.6029,1006.20,8.70,91.60,7.40,3135420,242,6090.0,6238.0,49488,3,3444.0,2716.0,1007.5,21.2,16.3,54.5,7.1,19.5,56.6,10.6,2934.0,3212.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:51:33Z,14,0,100.0,15.7,61.2,1.460,63.00,1.460,1.3009,0.6628,1006.20,8.60,91.60,7.40,3135430,242,5824.0,5959.0,49489,3,3459.0,2707.0,1007.6,21.2,16.3,54.5,7.1,19.4,56.6,10.6,2843.0,3173.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:51:43Z,14,0,100.0,15.7,61.2,1.790,69.00,1.790,1.6711,0.6415,1006.20,8.60,91.60,7.40,3135440,242,6297.0,6455.0,49490,3,3441.0,2716.0,1007.5,21.2,16.2,54.4,7.0,19.5,56.6,10.6,3021.0,3308.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:51:53Z,14,0,100.0,15.7,61.2,1.460,82.00,1.460,1.4458,0.2032,1006.20,8.60,91.60,7.40,3135450,242,6716.0,6896.0,49491,3,3432.0,2709.0,1007.5,21.2,16.3,54.5,7.1,19.4,56.6,10.6,3173.0,3518.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:52:03Z,14,0,100.0,15.7,61.2,1.320,98.00,1.320,1.3072,-0.1837,1006.20,8.60,91.60,7.40,3135460,242,6446.0,6612.0,49492,3,3441.0,2714.0,1007.6,21.2,16.2,54.5,7.1,19.5,56.6,10.6,3090.0,3395.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:52:13Z,14,0,100.0,15.7,61.2,1.550,110.00,1.550,1.4565,-0.5301,1006.20,8.70,91.60,7.40,3135470,242,8848.0,9161.0,49493,3,3421.0,2700.0,1007.7,21.2,16.2,54.5,7.0,19.4,56.6,10.6,4050.0,4621.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:52:23Z,14,0,100.0,15.7,61.2,1.450,93.00,1.450,1.4480,-0.0759,1006.20,8.70,91.70,7.50,3135481,242,8479.0,8766.0,49494,3,3436.0,2718.0,1007.4,21.2,16.3,54.5,7.1,19.4,56.6,10.6,3899.0,4411.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:52:33Z,14,0,100.0,15.7,61.2,1.250,80.00,1.250,1.2310,0.2171,1006.20,8.70,91.70,7.50,3135491,242,8387.0,8668.0,49495,3,3460.0,2713.0,1007.5,21.2,16.3,54.5,7.1,19.5,56.6,10.6,3994.0,4539.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:52:43Z,14,0,100.0,15.7,61.2,1.020,84.00,1.020,1.0144,0.1066,1006.20,8.70,91.70,7.50,3135501,242,7915.0,8165.0,49496,3,3441.0,2722.0,1007.5,21.2,16.2,54.5,7.0,19.4,56.7,10.6,3662.0,4123.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:52:53Z,14,0,100.0,15.7,61.2,1.340,108.00,1.340,1.2744,-0.4141,1006.20,8.70,91.70,7.50,3135511,242,6578.0,6751.0,49497,3,3468.0,2712.0,1007.5,21.2,16.2,54.5,7.1,19.5,56.7,10.6,3246.0,3603.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:53:03Z,14,0,100.0,15.7,61.2,2.030,96.00,2.030,2.0189,-0.2122,1006.20,8.70,91.70,7.50,3135521,242,10470.0,10908.0,49498,3,3440.0,2716.0,1007.5,21.2,16.2,54.6,7.1,19.4,56.6,10.6,4694.0,5492.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:53:13Z,14,0,100.0,15.7,61.2,1.890,105.00,1.890,1.8256,-0.4892,1006.20,8.70,91.70,7.50,3135531,242,21788.0,23686.0,49499,3,3461.0,2717.0,1007.6,21.2,16.2,54.5,7.1,19.4,56.7,10.6,8321.0,11743.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:53:23Z,14,0,100.0,15.7,61.2,1.870,88.00,1.870,1.8689,0.0653,1006.20,8.70,91.70,7.50,3135541,242,15314.0,16252.0,49500,3,3497.0,2718.0,1007.4,21.1,16.2,54.5,7.0,19.4,56.7,10.6,6795.0,8644.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:53:33Z,14,0,100.0,15.7,61.2,1.620,90.00,1.620,1.6200,0.0000,1006.20,8.70,91.70,7.50,3135551,242,15644.0,16622.0,49501,3,3540.0,2746.0,1007.6,21.2,16.3,54.6,7.1,19.5,56.7,10.6,7014.0,8998.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:53:43Z,14,0,100.0,15.7,61.2,2.770,63.00,2.770,2.4681,1.2576,1006.20,8.70,91.70,7.50,3135561,242,9569.0,9935.0,49502,3,3486.0,2726.0,1007.5,21.2,16.2,54.6,7.1,19.4,56.7,10.6,4535.0,5269.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:53:53Z,14,0,100.0,15.7,61.3,1.190,48.00,1.190,0.8843,0.7963,1006.20,8.70,91.70,7.50,3135571,242,13787.0,14547.0,49503,3,3445.0,2713.0,1007.4,21.2,16.2,54.6,7.1,19.4,56.7,10.6,5924.0,7312.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:54:03Z,14,0,100.0,15.7,61.2,1.620,47.00,1.620,1.1848,1.1048,1006.20,8.70,91.70,7.50,3135581,242,10340.0,10767.0,49504,3,3412.0,2707.0,1007.4,21.2,16.2,54.6,7.1,19.4,56.7,10.6,4512.0,5282.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:54:13Z,14,0,100.0,15.7,61.2,1.150,23.00,1.150,0.4493,1.0586,1006.20,8.70,91.70,7.50,3135591,242,7510.0,7735.0,49505,3,3457.0,2706.0,1007.4,21.2,16.2,54.6,7.1,19.4,56.7,10.6,3637.0,4087.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:54:23Z,14,0,100.0,15.7,61.3,0.710,82.00,0.710,0.7031,0.0988,1006.20,8.70,91.70,7.50,3135601,242,14021.0,14807.0,49506,3,3446.0,2721.0,1007.6,21.2,16.2,54.6,7.0,19.4,56.7,10.6,5960.0,7364.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:54:33Z,14,0,100.0,15.7,61.3,0.210,19.00,0.210,0.0684,0.1986,1006.20,8.70,91.70,7.50,3135611,242,14394.0,15222.0,49507,3,3426.0,2711.0,1007.6,21.2,16.2,54.6,7.1,19.4,56.7,10.6,6009.0,7456.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:54:43Z,14,0,100.0,15.6,61.3,0.840,78.00,0.840,0.8216,0.1746,1006.20,8.70,91.70,7.50,3135621,242,20827.0,22562.0,49508,3,3449.0,2706.0,1007.6,21.2,16.2,54.6,7.1,19.4,56.7,10.6,8072.0,11210.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:54:53Z,14,0,100.0,15.7,61.3,0.530,90.00,0.530,0.5300,0.0000,1006.20,8.70,91.70,7.50,3135632,242,10277.0,10699.0,49509,3,3445.0,2702.0,1007.6,21.2,16.2,54.7,7.1,19.4,56.7,10.6,4696.0,5532.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:55:03Z,14,0,100.0,15.7,61.3,1.950,73.00,1.950,1.8648,0.5701,1006.20,8.70,91.70,7.50,3135642,242,12722.0,13369.0,49510,3,3442.0,2717.0,1007.4,21.2,16.2,54.6,7.1,19.4,56.8,10.6,5551.0,6683.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:55:13Z,14,0,100.0,15.7,61.3,2.060,49.00,2.060,1.5547,1.3515,1006.20,8.70,91.70,7.50,3135652,242,19787.0,21353.0,49511,3,3455.0,2718.0,1007.4,21.2,16.2,54.6,7.1,19.4,56.8,10.6,7735.0,10566.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:55:23Z,14,0,100.0,15.6,61.3,2.280,80.00,2.280,2.2454,0.3959,1006.20,8.70,91.70,7.50,3135662,242,7606.0,7837.0,49512,3,3476.0,2716.0,1007.5,21.2,16.2,54.7,7.1,19.4,56.8,10.6,3721.0,4188.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:55:33Z,14,0,100.0,15.6,61.4,2.250,51.00,2.250,1.7486,1.4160,1006.20,8.70,91.70,7.50,3135672,242,10189.0,10604.0,49513,3,3438.0,2717.0,1007.6,21.2,16.2,54.7,7.1,19.4,56.7,10.6,4572.0,5322.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:55:43Z,14,0,100.0,15.7,61.4,2.060,62.00,2.060,1.8189,0.9671,1006.20,8.70,91.70,7.50,3135682,242,7090.0,7291.0,49514,3,3444.0,2713.0,1007.5,21.2,16.2,54.7,7.1,19.4,56.7,10.6,3375.0,3755.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:55:53Z,14,0,100.0,15.7,61.4,1.590,62.00,1.590,1.4039,0.7465,1006.20,8.70,91.70,7.50,3135692,242,5565.0,5688.0,49515,3,3469.0,2716.0,1007.5,21.2,16.2,54.7,7.0,19.4,56.7,10.6,2783.0,3036.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:56:03Z,14,0,100.0,15.7,61.4,1.980,67.00,1.980,1.8226,0.7736,1006.20,8.70,91.70,7.50,3135702,242,5024.0,5124.0,49516,3,3456.0,2708.0,1007.5,21.2,16.2,54.7,7.1,19.4,56.7,10.6,2519.0,2723.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:56:13Z,14,0,100.0,15.7,61.4,1.400,61.00,1.400,1.2245,0.6787,1006.20,8.70,91.70,7.50,3135712,242,4911.0,5007.0,49517,3,3442.0,2709.0,1007.5,21.2,16.2,54.7,7.1,19.4,56.7,10.6,2418.0,2608.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:56:23Z,14,0,100.0,15.7,61.4,1.050,56.00,1.050,0.8705,0.5872,1006.20,8.70,91.70,7.50,3135722,242,6115.0,6264.0,49518,3,3436.0,2714.0,1007.4,21.2,16.2,54.7,7.1,19.4,56.8,10.6,2922.0,3199.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:56:33Z,14,0,100.0,15.6,61.4,1.480,110.00,1.480,1.3907,-0.5062,1006.20,8.70,91.80,7.50,3135732,242,7859.0,8106.0,49519,3,3444.0,2711.0,1007.5,21.2,16.2,54.7,7.1,19.4,56.8,10.6,3690.0,4174.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:56:43Z,14,0,100.0,15.7,61.4,1.130,91.00,1.130,1.1298,-0.0197,1006.20,8.70,91.80,7.50,3135742,242,13252.0,13954.0,49520,3,3437.0,2704.0,1007.4,21.2,16.2,54.7,7.1,19.4,56.8,10.6,5733.0,7038.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:56:53Z,14,0,100.0,15.7,61.4,2.100,66.00,2.100,1.9184,0.8541,1006.20,8.70,91.80,7.50,3135752,242,9776.0,10158.0,49521,3,3427.0,2707.0,1007.4,21.2,16.2,54.8,7.1,19.4,56.8,10.6,4411.0,5100.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:57:03Z,14,0,100.0,15.7,61.4,1.770,65.00,1.770,1.6042,0.7480,1006.20,8.70,91.80,7.50,3135762,242,6915.0,7106.0,49522,3,3451.0,2716.0,1007.6,21.2,16.2,54.7,7.1,19.4,56.8,10.6,3319.0,3682.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:57:13Z,14,0,100.0,15.6,61.4,1.460,86.00,1.460,1.4564,0.1018,1006.20,8.70,91.80,7.50,3135772,242,6085.0,6233.0,49523,3,3451.0,2702.0,1007.5,21.2,16.2,54.7,7.1,19.4,56.8,10.6,3000.0,3302.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:57:23Z,14,0,100.0,15.6,61.5,1.280,83.00,1.280,1.2705,0.1560,1006.20,8.70,91.80,7.50,3135782,242,6590.0,6763.0,49524,3,3446.0,2720.0,1007.6,21.2,16.2,54.8,7.1,19.4,56.8,10.6,3143.0,3466.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:57:33Z,14,0,100.0,15.6,61.4,2.060,65.00,2.060,1.8670,0.8706,1006.20,8.70,91.70,7.50,3135792,242,5562.0,5685.0,49525,3,3438.0,2707.0,1007.5,21.2,16.2,54.8,7.1,19.4,56.8,10.6,2697.0,2946.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:57:43Z,14,0,100.0,15.6,61.5,1.970,39.00,1.970,1.2398,1.5310,1006.20,8.70,91.70,7.50,3135803,242,6367.0,6529.0,49526,3,3441.0,2716.0,1007.6,21.1,16.2,54.8,7.1,19.4,56.8,10.6,3052.0,3344.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:57:53Z,14,0,100.0,15.7,61.4,1.180,49.00,1.180,0.8906,0.7741,1006.20,8.70,91.70,7.50,3135813,242,5456.0,5575.0,49527,3,3465.0,2708.0,1007.7,21.2,16.2,54.8,7.1,19.4,56.8,10.6,2752.0,2992.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:58:03Z,14,0,100.0,15.6,61.5,0.370,357.00,0.370,-0.0194,0.3695,1006.20,8.70,91.80,7.50,3135823,242,5783.0,5916.0,49528,3,3456.0,2719.0,1007.5,21.1,16.2,54.8,7.1,19.4,56.8,10.6,2837.0,3088.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:58:13Z,14,0,100.0,15.6,61.4,1.010,46.00,1.010,0.7265,0.7016,1006.20,8.70,91.80,7.50,3135833,242,5690.0,5819.0,49529,3,3446.0,2702.0,1007.6,21.1,16.2,54.8,7.1,19.3,56.8,10.6,2814.0,3067.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:58:23Z,14,0,100.0,15.6,61.5,1.300,62.00,1.300,1.1478,0.6103,1006.20,8.70,91.70,7.50,3135843,242,5727.0,5858.0,49530,3,3438.0,2716.0,1007.5,21.1,16.2,54.8,7.1,19.4,56.8,10.6,2752.0,2996.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:58:33Z,14,0,100.0,15.6,61.5,0.880,71.00,0.880,0.8321,0.2865,1006.20,8.70,91.70,7.50,3135853,242,5546.0,5669.0,49531,3,3468.0,2713.0,1007.4,21.1,16.2,54.8,7.0,19.4,56.8,10.6,2783.0,3034.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:58:43Z,14,0,100.0,15.6,61.5,1.710,85.00,1.710,1.7035,0.1490,1006.20,8.70,91.80,7.50,3135863,242,5885.0,6023.0,49532,3,3412.0,2698.0,1007.6,21.1,16.2,54.8,7.1,19.4,56.8,10.6,2790.0,3044.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:58:53Z,14,0,100.0,15.6,61.5,1.620,101.00,1.620,1.5902,-0.3091,1006.20,8.70,91.70,7.50,3135873,242,7718.0,7956.0,49533,3,3459.0,2709.0,1007.7,21.1,16.2,54.8,7.1,19.4,56.8,10.6,3745.0,4193.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:59:03Z,14,0,100.0,15.6,61.5,1.850,93.00,1.850,1.8475,-0.0968,1006.20,8.70,91.70,7.50,3135883,242,7276.0,7487.0,49534,3,3413.0,2701.0,1007.6,21.1,16.2,54.8,7.1,19.4,56.8,10.6,3364.0,3753.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:59:13Z,14,0,100.0,15.6,61.5,0.540,65.00,0.540,0.4894,0.2282,1006.20,8.70,91.70,7.50,3135893,242,6590.0,6763.0,49535,3,3459.0,2714.0,1007.5,21.1,16.2,54.9,7.1,19.4,56.9,10.6,3212.0,3557.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:59:23Z,14,0,100.0,15.6,61.6,1.180,58.00,1.180,1.0007,0.6253,1006.20,8.70,91.70,7.50,3135903,242,6344.0,6504.0,49536,3,3440.0,2721.0,1007.4,21.1,16.1,54.9,7.1,19.4,56.9,10.6,3013.0,3305.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:59:33Z,14,0,100.0,15.6,61.5,0.740,62.00,0.740,0.6534,0.3474,1006.20,8.70,91.70,7.50,3135913,242,11965.0,12537.0,49537,3,3456.0,2713.0,1007.5,21.1,16.2,54.9,7.1,19.4,56.8,10.6,5364.0,6441.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:59:43Z,14,0,100.0,15.6,61.6,0.760,63.00,0.760,0.6772,0.3450,1006.20,8.70,91.70,7.50,3135923,242,12226.0,12823.0,49538,3,3413.0,2708.0,1007.5,21.1,16.2,54.9,7.1,19.4,56.8,10.6,5203.0,6245.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:59:53Z,14,0,100.0,15.6,61.6,0.820,76.00,0.820,0.7956,0.1984,1006.20,8.70,91.70,7.50,3135933,242,11104.0,11597.0,49539,3,3450.0,2703.0,1007.6,21.1,16.2,54.9,7.1,19.3,56.9,10.6,5057.0,6009.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:00:03Z,14,0,100.0,15.6,61.6,1.160,85.00,1.160,1.1556,0.1011,1006.20,8.70,91.70,7.50,3135943,242,12219.0,12816.0,49540,3,3437.0,2721.0,1007.4,21.1,16.2,54.9,7.1,19.4,56.9,10.6,5279.0,6339.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:00:13Z,14,0,100.0,15.6,61.6,2.010,55.00,2.010,1.6465,1.1529,1006.20,8.70,91.70,7.50,3135953,242,9900.0,10292.0,49541,3,3427.0,2706.0,1007.6,21.1,16.2,54.9,7.1,19.3,56.9,10.6,4459.0,5171.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:00:23Z,14,0,100.0,15.6,61.6,1.340,55.00,1.340,1.0977,0.7686,1006.20,8.70,91.70,7.50,3135964,242,7780.0,8022.0,49542,3,3442.0,2712.0,1007.5,21.1,16.2,54.9,7.1,19.3,56.9,10.6,3669.0,4115.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:00:33Z,14,0,100.0,15.6,61.6,2.200,93.00,2.200,2.1970,-0.1151,1006.20,8.70,91.70,7.50,3135974,242,7517.0,7743.0,49543,3,3445.0,2702.0,1007.6,21.1,16.2,54.9,7.1,19.3,56.9,10.6,3594.0,4046.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:00:43Z,14,0,100.0,15.6,61.6,1.090,97.00,1.090,1.0819,-0.1328,1006.20,8.70,91.70,7.50,3135984,242,9318.0,9665.0,49544,3,3441.0,2717.0,1007.4,21.1,16.1,54.9,7.1,19.4,56.9,10.6,4258.0,4888.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:00:53Z,14,0,100.0,15.6,61.7,1.380,95.00,1.380,1.3747,-0.1203,1006.20,8.70,91.60,7.50,3135994,242,8474.0,8761.0,49545,3,3464.0,2717.0,1007.4,21.1,16.1,54.9,7.1,19.3,56.9,10.6,4017.0,4587.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:01:03Z,14,0,100.0,15.6,61.7,1.440,72.00,1.440,1.3695,0.4450,1006.20,8.70,91.60,7.50,3136004,242,10110.0,10518.0,49546,3,3409.0,2706.0,1007.5,21.1,16.2,54.9,7.1,19.3,56.9,10.6,4410.0,5149.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:01:13Z,14,0,100.0,15.6,61.7,1.860,67.00,1.860,1.7121,0.7268,1006.20,8.70,91.60,7.50,3136014,242,9751.0,10131.0,49547,3,3468.0,2716.0,1007.4,21.1,16.1,54.9,7.0,19.4,56.9,10.6,4567.0,5313.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:01:23Z,14,0,100.0,15.6,61.7,1.560,62.00,1.560,1.3774,0.7324,1006.20,8.70,91.60,7.50,3136024,242,8370.0,8650.0,49548,3,3413.0,2702.0,1007.4,21.1,16.2,54.9,7.1,19.3,56.9,10.6,3796.0,4312.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:01:33Z,14,0,100.0,15.6,61.7,1.320,37.00,1.320,0.7944,1.0542,1006.20,8.70,91.60,7.50,3136034,242,7504.0,7729.0,49549,3,3449.0,2708.0,1007.5,21.1,16.2,55.0,7.1,19.3,56.9,10.6,3594.0,4029.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:01:43Z,14,0,100.0,15.6,61.7,1.630,78.00,1.630,1.5944,0.3389,1006.20,8.70,91.60,7.50,3136044,242,8003.0,8259.0,49550,3,3447.0,2711.0,1007.6,21.1,16.1,55.0,7.1,19.3,56.9,10.5,3779.0,4267.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:01:53Z,14,0,100.0,15.6,61.7,1.490,67.00,1.490,1.3716,0.5822,1006.20,8.70,91.60,7.50,3136054,242,8509.0,8798.0,49551,3,3471.0,2726.0,1007.5,21.1,16.1,55.0,7.1,19.3,56.9,10.6,4042.0,4593.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:02:03Z,14,0,100.0,15.6,61.7,0.940,109.00,0.940,0.8888,-0.3060,1006.10,8.80,91.60,7.50,3136064,242,10188.0,10603.0,49552,3,3485.0,2718.0,1007.6,21.1,16.1,55.0,7.1,19.3,56.9,10.6,4813.0,5661.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:02:13Z,14,0,100.0,15.6,61.7,0.710,93.00,0.710,0.7090,-0.0372,1006.10,8.80,91.60,7.50,3136074,242,11536.0,12068.0,49553,3,3445.0,2709.0,1007.6,21.1,16.1,55.0,7.1,19.3,57.0,10.6,5144.0,6151.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:02:23Z,14,0,100.0,15.6,61.8,1.230,39.00,1.230,0.7741,0.9559,1006.20,8.80,91.60,7.60,3136084,242,11943.0,12513.0,49554,3,3421.0,2711.0,1007.4,21.1,16.1,55.0,7.1,19.3,57.0,10.5,5154.0,6144.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:02:33Z,14,0,100.0,15.6,61.7,0.840,92.00,0.840,0.8395,-0.0293,1006.20,8.80,91.60,7.60,3136094,242,9168.0,9504.0,49555,3,3445.0,2722.0,1007.4,21.1,16.1,55.0,7.1,19.3,57.0,10.6,4193.0,4803.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:02:43Z,14,0,100.0,15.6,61.8,1.790,89.00,1.790,1.7897,0.0312,1006.20,8.80,91.60,7.60,3136104,242,12162.0,12753.0,49556,3,3489.0,2728.0,1007.4,21.1,16.1,55.0,7.1,19.3,57.0,10.6,5535.0,6706.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:02:53Z,14,0,100.0,15.6,61.8,1.830,106.00,1.830,1.7591,-0.5044,1006.20,8.80,91.50,7.50,3136114,242,7324.0,7538.0,49557,3,3431.0,2695.0,1007.6,21.1,16.1,55.0,7.1,19.3,56.9,10.6,3488.0,3905.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:03:03Z,14,0,100.0,15.6,61.8,2.660,80.00,2.660,2.6196,0.4619,1006.20,8.80,91.50,7.50,3136124,242,8305.0,8580.0,49558,3,3527.0,2732.0,1007.4,21.1,16.2,55.0,7.1,19.3,57.0,10.6,4194.0,4784.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:03:13Z,14,0,100.0,15.6,61.8,2.240,73.00,2.240,2.1421,0.6549,1006.20,8.80,91.50,7.50,3136135,242,7395.0,7613.0,49559,3,3442.0,2722.0,1007.3,21.1,16.1,55.0,7.1,19.3,56.9,10.5,3453.0,3858.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:03:23Z,14,0,100.0,15.6,61.7,2.450,59.00,2.450,2.1001,1.2618,1006.10,8.80,91.50,7.50,3136145,242,7256.0,7466.0,49560,3,3441.0,2717.0,1007.6,21.1,16.1,55.0,7.1,19.3,56.9,10.6,3421.0,3806.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:03:33Z,14,0,100.0,15.6,61.7,1.370,34.00,1.370,0.7661,1.1358,1006.10,8.80,91.50,7.50,3136155,242,7656.0,7890.0,49561,3,3435.0,2701.0,1007.6,21.1,16.1,55.0,7.1,19.3,56.9,10.6,3628.0,4071.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:03:43Z,14,0,100.0,15.6,61.7,1.320,38.00,1.320,0.8127,1.0402,1006.10,8.80,91.50,7.50,3136165,242,8127.0,8391.0,49562,3,3425.0,2702.0,1007.6,21.1,16.1,55.0,7.1,19.3,57.0,10.5,3768.0,4257.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:03:53Z,14,0,100.0,15.6,61.7,1.220,45.00,1.220,0.8627,0.8627,1006.10,8.80,91.50,7.50,3136175,242,8404.0,8686.0,49563,3,3445.0,2721.0,1007.6,21.1,16.1,55.0,7.1,19.3,57.0,10.6,3894.0,4408.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:04:03Z,14,0,100.0,15.6,61.8,1.120,36.00,1.120,0.6583,0.9061,1006.10,8.80,91.50,7.50,3136185,242,8751.0,9057.0,49564,3,3475.0,2714.0,1007.5,21.1,16.1,55.0,7.1,19.3,56.9,10.5,4183.0,4825.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:04:13Z,14,0,100.0,15.6,61.8,1.950,78.00,1.950,1.9074,0.4054,1006.10,8.80,91.50,7.50,3136195,242,8838.0,9150.0,49565,3,3445.0,2711.0,1007.4,21.1,16.1,55.1,7.1,19.3,57.0,10.6,4066.0,4700.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:04:23Z,14,0,100.0,15.6,61.8,1.630,33.00,1.630,0.8878,1.3670,1006.10,8.80,91.50,7.50,3136205,242,21823.0,23727.0,49566,3,3446.0,2722.0,1007.5,21.1,16.1,55.1,7.1,19.3,57.0,10.5,8164.0,11447.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:04:33Z,14,0,100.0,15.6,61.8,1.770,67.00,1.770,1.6293,0.6916,1006.10,8.80,91.50,7.60,3136215,242,38698.0,44688.0,49567,3,3446.0,2726.0,1007.5,21.1,16.1,55.1,7.1,19.3,57.0,10.6,10756.0,20186.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:04:43Z,14,0,100.0,15.6,61.8,1.380,48.00,1.380,1.0255,0.9234,1006.10,8.80,91.50,7.60,3136225,242,35389.0,40398.0,49568,3,3479.0,2717.0,1007.4,21.1,16.1,55.1,7.1,19.3,57.0,10.5,10781.0,19538.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:04:53Z,14,0,100.0,15.6,61.8,1.350,90.00,1.350,1.3500,0.0000,1006.10,8.80,91.50,7.60,3136235,242,22206.0,24178.0,49569,3,3430.0,2700.0,1007.5,21.1,16.1,55.1,7.1,19.3,57.0,10.6,8268.0,11744.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:05:03Z,14,0,100.0,15.6,61.8,1.830,79.00,1.830,1.7964,0.3492,1006.10,8.80,91.50,7.50,3136245,242,11753.0,12305.0,49570,3,3422.0,2703.0,1007.5,21.1,16.1,55.1,7.1,19.2,57.0,10.5,5128.0,6122.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:05:13Z,14,0,100.0,15.6,61.8,1.050,78.00,1.050,1.0271,0.2183,1006.10,8.80,91.40,7.50,3136255,242,11089.0,11580.0,49571,3,3441.0,2724.0,1007.4,21.1,16.1,55.1,7.1,19.3,57.0,10.6,4885.0,5761.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:05:23Z,14,0,100.0,15.6,61.8,1.530,59.00,1.530,1.3115,0.7880,1006.10,8.70,91.50,7.50,3136265,242,10706.0,11164.0,49572,3,3425.0,2709.0,1007.4,21.1,16.1,55.1,7.1,19.3,57.0,10.5,4727.0,5554.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:05:33Z,14,0,100.0,15.6,61.8,0.670,47.00,0.670,0.4900,0.4569,1006.10,8.70,91.40,7.50,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan, +2026-04-17T01:05:43Z,14,0,100.0,15.6,61.9,1.500,81.00,1.500,1.4815,0.2347,1006.10,8.70,91.50,7.50,3136275,242,8663.0,8963.0,49573,3,3442.0,2723.0,1007.5,21.1,16.1,55.1,7.1,19.3,57.0,10.5,3971.0,4513.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:05:53Z,14,0,100.0,15.6,61.9,1.620,68.00,1.620,1.5020,0.6069,1006.10,8.70,91.50,7.50,3136285,242,8077.0,8337.0,49574,3,3474.0,2719.0,1007.4,21.1,16.1,55.1,7.1,19.3,57.0,10.6,3901.0,4419.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:06:03Z,14,0,100.0,15.6,61.9,2.790,71.00,2.790,2.6380,0.9083,1006.10,8.70,91.50,7.50,3136296,242,6571.0,6743.0,49575,3,3449.0,2721.0,1007.5,21.1,16.1,55.1,7.1,19.3,57.0,10.5,3147.0,3466.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:06:13Z,14,0,100.0,15.6,61.9,2.090,41.00,2.090,1.3712,1.5773,1006.10,8.70,91.60,7.50,3136306,242,6263.0,6419.0,49576,3,3461.0,2708.0,1007.5,21.1,16.1,55.1,7.1,19.3,57.0,10.6,3094.0,3417.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:06:23Z,14,0,100.0,15.6,61.9,0.830,349.00,0.830,-0.1584,0.8148,1006.00,8.70,91.60,7.50,3136316,242,13584.0,14322.0,49577,3,3415.0,2703.0,1007.5,21.1,16.1,55.1,7.1,19.3,57.0,10.5,5698.0,7007.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:06:33Z,14,0,100.0,15.6,61.9,0.840,61.00,0.840,0.7347,0.4072,1006.00,8.70,91.60,7.50,3136326,242,7112.0,7314.0,49578,3,3419.0,2704.0,1007.5,21.1,16.1,55.2,7.1,19.3,57.0,10.5,3316.0,3684.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:06:43Z,14,0,100.0,15.5,61.9,1.330,69.00,1.330,1.2417,0.4766,1006.10,8.70,91.60,7.50,3136336,242,5757.0,5889.0,49579,3,3444.0,2717.0,1007.3,21.1,16.1,55.1,7.1,19.3,57.0,10.6,2783.0,3033.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:06:53Z,14,0,100.0,15.5,61.9,1.260,83.00,1.260,1.2506,0.1536,1006.10,8.70,91.70,7.50,3136346,242,10112.0,10521.0,49580,3,3449.0,2708.0,1007.5,21.1,16.1,55.2,7.1,19.3,57.0,10.5,4641.0,5429.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:07:03Z,14,0,100.0,15.6,61.9,0.550,67.00,0.550,0.5063,0.2149,1006.00,8.70,91.70,7.50,3136356,242,8917.0,9235.0,49581,3,3445.0,2724.0,1007.5,21.1,16.1,55.1,7.1,19.3,57.0,10.5,4081.0,4658.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:07:13Z,14,0,100.0,15.6,61.9,2.080,66.00,2.080,1.9002,0.8460,1006.00,8.70,91.70,7.50,3136366,242,7897.0,8146.0,49582,3,3478.0,2716.0,1007.5,21.1,16.1,55.2,7.1,19.2,57.0,10.5,3840.0,4360.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:07:23Z,14,0,100.0,15.6,61.9,2.820,50.00,2.820,2.1602,1.8127,1006.00,8.70,91.70,7.50,3136376,242,7332.0,7547.0,49583,3,3451.0,2717.0,1007.5,21.1,16.1,55.2,7.1,19.3,57.0,10.5,3489.0,3899.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:07:33Z,14,0,100.0,15.6,61.9,1.160,66.00,1.160,1.0597,0.4718,1006.00,8.70,91.60,7.40,3136386,242,6192.0,6345.0,49584,3,3469.0,2714.0,1007.5,21.1,16.1,55.2,7.1,19.2,56.9,10.5,3081.0,3387.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:07:43Z,14,0,100.0,15.6,61.9,1.150,95.00,1.150,1.1456,-0.1002,1006.00,8.70,91.70,7.50,3136396,242,5569.0,5693.0,49585,3,3428.0,2700.0,1007.3,21.1,16.1,55.2,7.1,19.2,57.0,10.5,2696.0,2938.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:07:53Z,14,0,100.0,15.5,61.9,0.990,80.00,0.990,0.9750,0.1719,1006.00,8.70,91.70,7.50,3136406,242,5773.0,5906.0,49586,3,3465.0,2713.0,1007.4,21.1,16.1,55.2,7.1,19.3,57.0,10.5,2875.0,3146.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:08:03Z,14,0,100.0,15.6,61.9,1.120,91.00,1.120,1.1198,-0.0195,1006.00,8.70,91.70,7.50,3136416,242,6803.0,6988.0,49587,3,3404.0,2697.0,1007.4,21.1,16.1,55.2,7.1,19.2,56.9,10.5,3142.0,3485.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:08:13Z,14,0,100.0,15.6,61.9,1.040,82.00,1.040,1.0299,0.1447,1006.00,8.70,91.70,7.50,3136426,242,6322.0,6481.0,49588,3,3418.0,2709.0,1007.3,21.1,16.1,55.2,7.1,19.2,57.0,10.5,2962.0,3248.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:08:23Z,14,0,100.0,15.6,61.9,1.130,76.00,1.130,1.0964,0.2734,1006.00,8.70,91.80,7.50,3136436,242,6091.0,6239.0,49589,3,3455.0,2713.0,1007.3,21.1,16.1,55.2,7.1,19.3,57.0,10.5,2976.0,3275.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:08:33Z,14,0,100.0,15.6,61.9,1.650,72.00,1.650,1.5692,0.5099,1006.10,8.70,91.70,7.50,3136446,242,7305.0,7518.0,49590,3,3426.0,2703.0,1007.4,21.1,16.1,55.2,7.1,19.2,57.0,10.5,3421.0,3827.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:08:44Z,14,0,100.0,15.5,62.0,0.970,89.00,0.970,0.9699,0.0169,1006.10,8.70,91.70,7.50,3136456,242,6646.0,6822.0,49591,3,3440.0,2714.0,1007.4,21.1,16.1,55.2,7.1,19.2,57.0,10.5,3167.0,3496.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:08:54Z,14,0,100.0,15.6,61.9,0.740,4.00,0.740,0.0516,0.7382,1006.10,8.70,91.80,7.50,3136467,242,6143.0,6293.0,49592,3,3414.0,2699.0,1007.5,21.1,16.0,55.2,7.1,19.2,57.0,10.5,2883.0,3182.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:09:04Z,14,0,100.0,15.6,62.0,0.630,58.00,0.630,0.5343,0.3338,1006.10,8.70,91.70,7.50,3136477,242,6667.0,6844.0,49593,3,3440.0,2717.0,1007.4,21.0,16.1,55.2,7.1,19.2,57.0,10.5,3167.0,3493.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:09:14Z,14,0,100.0,15.6,61.9,0.850,82.00,0.850,0.8417,0.1183,1006.10,8.70,91.70,7.50,3136487,242,10731.0,11191.0,49594,3,3447.0,2716.0,1007.4,21.1,16.1,55.2,7.1,19.2,57.0,10.5,4828.0,5684.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:09:24Z,14,0,100.0,15.5,61.9,0.670,55.00,0.670,0.5488,0.3843,1006.10,8.70,91.80,7.50,3136497,242,8365.0,8644.0,49595,3,3447.0,2717.0,1007.6,21.1,16.1,55.3,7.1,19.3,57.1,10.6,3913.0,4424.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:09:34Z,14,0,100.0,15.5,61.9,1.960,50.00,1.960,1.5014,1.2599,1006.10,8.70,91.70,7.50,3136507,242,6764.0,6947.0,49596,3,3457.0,2711.0,1007.5,21.1,16.1,55.3,7.1,19.3,57.0,10.5,3289.0,3656.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:09:44Z,14,0,100.0,15.5,61.9,1.960,47.00,1.960,1.4335,1.3367,1006.10,8.70,91.70,7.50,3136517,242,6820.0,7006.0,49597,3,3407.0,2702.0,1007.4,21.0,16.1,55.3,7.1,19.2,57.0,10.5,3154.0,3484.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:09:54Z,14,0,100.0,15.5,62.0,1.420,74.00,1.420,1.3650,0.3914,1006.10,8.70,91.80,7.50,3136527,242,13516.0,14246.0,49598,3,3427.0,2711.0,1007.6,21.1,16.1,55.3,7.1,19.2,57.0,10.5,5718.0,7011.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:10:04Z,14,0,100.0,15.5,62.0,0.220,357.00,0.220,-0.0115,0.2197,1006.10,8.70,91.70,7.50,3136537,242,9076.0,9405.0,49599,3,3444.0,2713.0,1007.4,21.1,16.1,55.3,7.1,19.2,57.1,10.5,4190.0,4807.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:10:14Z,14,0,100.0,15.5,62.0,1.640,63.00,1.640,1.4613,0.7445,1006.10,8.70,91.70,7.50,3136547,242,10113.0,10522.0,49600,3,3445.0,2718.0,1007.4,21.0,16.1,55.3,7.1,19.2,57.0,10.5,4555.0,5327.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:10:24Z,14,0,100.0,15.6,62.1,2.100,75.00,2.100,2.0284,0.5435,1006.10,8.60,91.70,7.40,3136557,242,8967.0,9288.0,49601,3,3445.0,2719.0,1007.6,21.1,16.0,55.3,7.1,19.2,57.0,10.5,4107.0,4716.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:10:34Z,14,0,100.0,15.5,62.0,1.360,45.00,1.360,0.9617,0.9617,1006.10,8.60,91.70,7.40,3136567,242,8277.0,8551.0,49602,3,3421.0,2699.0,1007.5,21.0,16.0,55.3,7.1,19.2,57.0,10.5,3832.0,4330.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:10:44Z,14,0,100.0,15.5,62.0,0.800,66.00,0.800,0.7308,0.3254,1006.10,8.60,91.70,7.40,3136577,242,11440.0,11963.0,49603,3,3449.0,2717.0,1007.5,21.0,16.0,55.3,7.1,19.2,57.0,10.5,5098.0,6067.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:10:54Z,14,0,100.0,15.5,62.0,0.930,332.00,0.930,-0.4366,0.8211,1006.10,8.70,91.80,7.50,3136587,242,11956.0,12527.0,49604,3,3419.0,2713.0,1007.4,21.0,16.1,55.3,7.1,19.2,57.0,10.5,5133.0,6116.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:11:04Z,14,0,100.0,15.5,62.0,1.240,75.00,1.240,1.1977,0.3209,1006.10,8.70,91.80,7.50,3136597,242,10688.0,11144.0,49605,3,3435.0,2704.0,1007.4,21.0,16.0,55.3,7.1,19.2,57.0,10.5,4796.0,5661.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:11:14Z,14,0,100.0,15.5,62.0,1.200,72.00,1.200,1.1413,0.3708,1006.10,8.70,91.80,7.50,3136607,242,11468.0,11994.0,49606,3,3434.0,2711.0,1007.4,21.0,16.0,55.3,7.1,19.2,57.0,10.5,5040.0,6008.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:11:24Z,14,0,100.0,15.5,62.0,2.750,47.00,2.750,2.0112,1.8755,1006.10,8.60,91.80,7.50,3136617,242,12922.0,13589.0,49607,3,3444.0,2719.0,1007.5,21.0,16.0,55.3,7.1,19.2,57.1,10.5,5587.0,6787.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:11:34Z,14,0,100.0,15.5,62.1,2.450,46.00,2.450,1.7624,1.7019,1006.10,8.60,91.80,7.40,3136628,242,10538.0,10982.0,49608,3,3459.0,2709.0,1007.6,21.0,16.0,55.3,7.1,19.2,57.0,10.5,4859.0,5726.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:11:44Z,14,0,100.0,15.5,62.0,0.590,21.00,0.590,0.2114,0.5508,1006.10,8.60,91.80,7.40,3136638,242,7747.0,7987.0,49609,3,3440.0,2718.0,1007.4,21.0,16.1,55.3,7.1,19.2,57.0,10.5,3608.0,4053.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:11:54Z,14,0,100.0,15.5,62.1,1.320,57.00,1.320,1.1070,0.7189,1006.10,8.60,91.90,7.50,3136648,242,10228.0,10646.0,49610,3,3468.0,2721.0,1007.4,21.0,16.0,55.3,7.1,19.2,57.1,10.5,4710.0,5536.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:12:04Z,14,0,100.0,15.5,62.1,0.600,351.00,0.600,-0.0939,0.5926,1006.10,8.60,91.90,7.50,3136658,242,10040.0,10443.0,49611,3,3412.0,2702.0,1007.6,21.0,16.0,55.3,7.1,19.2,57.0,10.5,4416.0,5164.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:12:14Z,14,0,100.0,15.5,62.1,1.870,43.00,1.870,1.2753,1.3676,1006.10,8.70,91.90,7.50,3136668,242,10468.0,10906.0,49612,3,3464.0,2716.0,1007.5,21.0,16.0,55.3,7.1,19.2,57.0,10.5,4820.0,5673.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:12:24Z,14,0,100.0,15.5,62.1,1.280,335.00,1.280,-0.5410,1.1601,1006.10,8.70,91.90,7.50,3136678,242,11786.0,12341.0,49613,3,3445.0,2729.0,1007.5,21.0,16.0,55.3,7.1,19.2,57.1,10.5,5105.0,6114.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:12:34Z,14,0,100.0,15.5,62.1,0.780,8.00,0.780,0.1086,0.7724,1006.10,8.70,91.90,7.50,3136688,242,10480.0,10919.0,49614,3,3427.0,2712.0,1007.5,21.0,16.0,55.3,7.1,19.2,57.1,10.5,4646.0,5429.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:12:44Z,14,0,100.0,15.5,62.1,0.980,66.00,0.980,0.8953,0.3986,1006.10,8.70,91.90,7.50,3136698,242,8541.0,8832.0,49615,3,3451.0,2707.0,1007.5,21.0,16.0,55.3,7.1,19.2,57.1,10.5,4042.0,4604.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:12:54Z,14,0,100.0,15.5,62.2,1.470,78.00,1.470,1.4379,0.3056,1006.10,8.70,91.90,7.50,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan, +2026-04-17T01:13:04Z,14,0,100.0,15.5,62.1,1.300,59.00,1.300,1.1143,0.6695,1006.10,8.70,91.80,7.50,3136718,242,12194.0,12788.0,49617,3,3404.0,2702.0,1007.5,21.0,16.0,55.4,7.1,19.2,57.1,10.5,5173.0,6202.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:13:14Z,14,0,100.0,15.5,62.2,0.590,65.00,0.590,0.5347,0.2493,1006.10,8.70,91.90,7.50,3136728,242,9355.0,9705.0,49618,3,3468.0,2717.0,1007.4,21.0,16.0,55.4,7.1,19.2,57.1,10.5,4400.0,5091.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:13:24Z,14,0,100.0,15.5,62.1,1.150,74.00,1.150,1.1055,0.3170,1006.10,8.70,91.90,7.50,3136738,242,11079.0,11569.0,49619,3,3445.0,2719.0,1007.6,21.0,16.0,55.4,7.1,19.2,57.1,10.5,4914.0,5827.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:13:34Z,14,0,100.0,15.5,62.1,1.380,72.00,1.380,1.3125,0.4264,1006.10,8.70,91.80,7.50,3136748,242,9832.0,10218.0,49620,3,3459.0,2709.0,1007.6,21.0,16.0,55.4,7.1,19.2,57.1,10.5,4574.0,5342.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:13:44Z,14,0,100.0,15.5,62.1,0.750,78.00,0.750,0.7336,0.1559,1006.10,8.70,91.80,7.50,3136758,242,11783.0,12338.0,49621,3,3403.0,2700.0,1007.4,21.0,16.0,55.4,7.1,19.2,57.1,10.5,5023.0,6002.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:13:54Z,14,0,100.0,15.5,62.2,0.700,358.00,0.700,-0.0244,0.6996,1006.10,8.70,91.80,7.50,3136768,242,12710.0,13356.0,49622,3,3427.0,2709.0,1007.4,21.0,16.0,55.4,7.1,19.2,57.1,10.5,5451.0,6612.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:14:04Z,14,0,100.0,15.5,62.2,0.900,9.00,0.900,0.1408,0.8889,1006.10,8.70,91.80,7.50,3136778,242,10533.0,10976.0,49623,3,3445.0,2718.0,1007.5,21.0,16.0,55.4,7.1,19.2,57.1,10.5,4733.0,5548.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:14:14Z,14,0,100.0,15.5,62.2,1.360,62.00,1.360,1.2008,0.6385,1006.10,8.70,91.80,7.50,3136789,242,12281.0,12884.0,49624,3,3423.0,2704.0,1007.4,21.0,16.0,55.4,7.1,19.2,57.1,10.5,5326.0,6398.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:14:24Z,14,0,100.0,15.5,62.2,0.630,357.00,0.630,-0.0330,0.6291,1006.10,8.70,91.80,7.50,3136799,242,15163.0,16082.0,49625,3,3441.0,2718.0,1007.5,21.0,16.0,55.4,7.1,19.2,57.1,10.5,6322.0,7943.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:14:34Z,14,0,100.0,15.5,62.2,0.990,69.00,0.990,0.9242,0.3548,1006.10,8.70,91.80,7.50,3136809,242,8107.0,8369.0,49626,3,3440.0,2699.0,1007.6,21.0,16.0,55.4,7.1,19.2,57.1,10.5,3837.0,4352.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:14:44Z,14,0,100.0,15.5,62.2,0.770,62.00,0.770,0.6799,0.3615,1006.10,8.70,91.80,7.50,3136819,242,11540.0,12072.0,49627,3,3443.0,2727.0,1007.4,21.0,16.0,55.4,7.1,19.2,57.1,10.5,5043.0,5987.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:14:54Z,14,0,100.0,15.5,62.2,0.610,77.00,0.610,0.5944,0.1372,1006.10,8.70,91.80,7.50,3136829,242,9904.0,10296.0,49628,3,3465.0,2717.0,1007.4,21.0,16.0,55.4,7.1,19.2,57.2,10.5,4601.0,5368.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:15:04Z,14,0,100.0,15.5,62.2,1.780,348.00,1.780,-0.3701,1.7411,1006.10,8.70,91.80,7.50,3136839,242,12320.0,12927.0,49629,3,3440.0,2717.0,1007.4,21.0,16.0,55.4,7.1,19.2,57.2,10.5,5370.0,6454.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:15:14Z,14,0,100.0,15.5,62.2,0.710,69.00,0.710,0.6628,0.2544,1006.10,8.70,91.80,7.50,3136849,242,6883.0,7072.0,49630,3,3459.0,2708.0,1007.5,21.0,16.0,55.4,7.1,19.2,57.1,10.5,3368.0,3745.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:15:24Z,14,0,100.0,15.5,62.2,0.320,40.00,0.320,0.2057,0.2451,1006.10,8.70,91.80,7.50,3136859,242,8033.0,8291.0,49631,3,3408.0,2703.0,1007.5,21.0,16.0,55.4,7.1,19.2,57.1,10.5,3643.0,4103.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:15:34Z,14,0,100.0,15.5,62.2,0.450,72.00,0.450,0.4280,0.1391,1006.10,8.70,91.80,7.50,3136869,242,9014.0,9339.0,49632,3,3456.0,2712.0,1007.5,21.0,16.0,55.5,7.1,19.2,57.1,10.5,4228.0,4859.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:15:44Z,14,0,100.0,15.5,62.2,0.200,89.00,0.200,0.2000,0.0035,1006.10,8.70,91.80,7.50,3136879,242,8888.0,9203.0,49633,3,3452.0,2708.0,1007.5,21.0,16.0,55.5,7.1,19.2,57.1,10.5,4168.0,4791.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:15:54Z,14,0,100.0,15.5,62.2,1.150,98.00,1.150,1.1388,-0.1600,1006.10,8.70,91.80,7.50,3136889,242,9925.0,10319.0,49634,3,3464.0,2723.0,1007.4,21.0,16.0,55.5,7.1,19.2,57.1,10.5,4571.0,5329.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:16:04Z,14,0,100.0,15.5,62.2,1.030,78.00,1.030,1.0075,0.2141,1006.10,8.70,91.80,7.50,3136899,242,10458.0,10895.0,49635,3,3476.0,2716.0,1007.6,21.0,16.0,55.5,7.1,19.2,57.1,10.5,4906.0,5758.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:16:14Z,14,0,100.0,15.5,62.2,0.660,90.00,0.660,0.6600,0.0000,1006.10,8.70,91.80,7.50,3136909,242,10704.0,11162.0,49636,3,3470.0,2716.0,1007.6,21.0,16.0,55.5,7.1,19.2,57.1,10.5,4951.0,5847.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:16:24Z,14,0,100.0,15.5,62.2,1.150,76.00,1.150,1.1158,0.2782,1006.10,8.70,91.80,7.50,3136919,242,10318.0,10743.0,49637,3,3455.0,2714.0,1007.4,21.0,16.0,55.5,7.1,19.2,57.1,10.5,4705.0,5540.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:16:34Z,14,0,100.0,15.5,62.2,1.320,83.00,1.320,1.3102,0.1609,1006.10,8.70,91.80,7.50,3136929,242,9606.0,9975.0,49638,3,3425.0,2702.0,1007.5,21.0,16.0,55.5,7.1,19.2,57.1,10.5,4348.0,5032.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:16:44Z,14,0,100.0,15.5,62.3,2.000,68.00,2.000,1.8544,0.7492,1006.10,8.70,91.80,7.50,3136939,242,9916.0,10309.0,49639,3,3437.0,2718.0,1007.4,21.0,16.0,55.5,7.1,19.2,57.1,10.5,4456.0,5166.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:16:54Z,14,0,100.0,15.5,62.2,1.100,74.00,1.100,1.0574,0.3032,1006.10,8.70,91.80,7.50,3136949,242,11227.0,11731.0,49640,3,3425.0,2711.0,1007.4,21.0,16.0,55.5,7.1,19.1,57.1,10.5,4919.0,5808.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:17:04Z,14,0,100.0,15.5,62.3,1.910,58.00,1.910,1.6198,1.0121,1006.10,8.70,91.80,7.50,3136960,242,5703.0,5833.0,49641,3,3451.0,2722.0,1007.6,21.0,16.0,55.5,7.1,19.2,57.1,10.5,2767.0,3012.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:17:14Z,14,0,100.0,15.5,62.2,1.460,13.00,1.460,0.3284,1.4226,1006.10,8.70,91.80,7.50,3136970,242,5870.0,6007.0,49642,3,3459.0,2708.0,1007.5,21.0,16.0,55.5,7.1,19.2,57.1,10.5,2917.0,3194.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:17:24Z,14,0,100.0,15.5,62.3,0.450,333.00,0.450,-0.2043,0.4010,1006.10,8.70,91.80,7.50,3136980,242,20129.0,21749.0,49643,3,3437.0,2721.0,1007.4,21.0,16.0,55.5,7.1,19.2,57.1,10.5,7716.0,10443.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:17:34Z,14,0,100.0,15.5,62.3,1.140,68.00,1.140,1.0570,0.4271,1006.10,8.70,91.80,7.50,3136990,242,20257.0,21898.0,49644,3,3469.0,2724.0,1007.4,21.0,16.0,55.5,7.1,19.2,57.1,10.5,7892.0,10935.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:17:44Z,14,0,100.0,15.5,62.3,0.770,94.00,0.770,0.7681,-0.0537,1006.10,8.70,91.90,7.50,3137000,242,17670.0,18918.0,49645,3,3422.0,2708.0,1007.4,21.0,16.0,55.5,7.1,19.2,57.1,10.5,6970.0,9141.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:17:54Z,14,0,100.0,15.5,62.3,1.190,59.00,1.190,1.0200,0.6129,1006.10,8.60,91.90,7.50,3137010,242,12297.0,12901.0,49646,3,3425.0,2710.0,1007.5,21.0,16.0,55.5,7.1,19.2,57.1,10.5,5311.0,6370.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:18:04Z,14,0,100.0,15.5,62.3,2.400,66.00,2.400,2.1925,0.9762,1006.10,8.60,91.90,7.50,3137020,242,6366.0,6528.0,49647,3,3449.0,2716.0,1007.5,21.0,16.0,55.5,7.1,19.2,57.1,10.5,3068.0,3381.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:18:14Z,14,0,100.0,15.5,62.3,0.990,27.00,0.990,0.4495,0.8821,1006.10,8.60,91.90,7.50,3137030,242,23150.0,25293.0,49648,3,3421.0,2703.0,1007.5,21.0,16.0,55.5,7.1,19.1,57.2,10.5,8376.0,12042.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:18:24Z,14,0,100.0,15.5,62.4,0.900,52.00,0.900,0.7092,0.5541,1006.10,8.60,91.90,7.50,3137040,242,17392.0,18601.0,49649,3,3438.0,2723.0,1007.4,21.0,16.0,55.6,7.1,19.2,57.2,10.5,6932.0,9010.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:18:34Z,14,0,100.0,15.5,62.4,0.930,349.00,0.930,-0.1775,0.9129,1006.10,8.60,92.00,7.50,3137050,242,13642.0,14386.0,49650,3,3454.0,2713.0,1007.4,21.0,16.0,55.5,7.1,19.1,57.2,10.5,5946.0,7325.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:18:44Z,14,0,100.0,15.5,62.4,0.890,74.00,0.890,0.8555,0.2453,1006.10,8.70,92.00,7.50,3137060,242,6933.0,7125.0,49651,3,3437.0,2716.0,1007.4,21.0,16.0,55.6,7.1,19.2,57.2,10.5,3266.0,3622.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:18:54Z,14,0,100.0,15.5,62.4,1.510,90.00,1.510,1.5100,0.0000,1006.10,8.70,92.00,7.50,3137070,242,9954.0,10350.0,49652,3,3468.0,2716.0,1007.4,21.0,16.0,55.6,7.1,19.2,57.2,10.5,4635.0,5424.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:19:04Z,14,0,100.0,15.5,62.4,1.110,113.00,1.110,1.0218,-0.4337,1006.10,8.70,91.90,7.50,3137080,242,8354.0,8633.0,49653,3,3437.0,2718.0,1007.4,21.0,16.0,55.5,7.1,19.2,57.2,10.5,3841.0,4352.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:19:14Z,14,0,100.0,15.5,62.3,1.030,51.00,1.030,0.8005,0.6482,1006.10,8.70,92.00,7.50,3137090,242,8584.0,8878.0,49654,3,3460.0,2714.0,1007.4,21.0,16.0,55.6,7.1,19.2,57.2,10.5,4055.0,4640.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:19:24Z,14,0,100.0,15.5,62.3,0.880,107.00,0.880,0.8415,-0.2573,1006.10,8.70,91.90,7.50,3137100,242,9419.0,9773.0,49655,3,3414.0,2703.0,1007.5,21.0,16.0,55.6,7.1,19.2,57.2,10.5,4166.0,4852.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:19:34Z,14,0,100.0,15.5,62.4,0.560,28.00,0.560,0.2629,0.4945,1006.10,8.70,92.00,7.50,3137110,242,9142.0,9476.0,49656,3,3418.0,2699.0,1007.5,21.0,16.0,55.6,7.1,19.2,57.2,10.5,4152.0,4762.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:19:44Z,14,0,100.0,15.5,62.4,0.660,67.00,0.660,0.6075,0.2579,1006.10,8.70,91.90,7.50,3137121,242,7501.0,7726.0,49657,3,3438.0,2714.0,1007.4,21.0,16.0,55.6,7.1,19.1,57.2,10.5,3521.0,3935.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:19:54Z,14,0,100.0,15.5,62.4,0.640,18.00,0.640,0.1978,0.6087,1006.10,8.70,91.90,7.50,3137131,242,7804.0,8047.0,49658,3,3437.0,2708.0,1007.4,21.0,16.0,55.6,7.1,19.1,57.2,10.5,3671.0,4122.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:20:04Z,14,0,100.0,15.5,62.4,0.320,326.00,0.320,-0.1789,0.2653,1006.10,8.70,91.90,7.50,3137141,242,5513.0,5634.0,49659,3,3441.0,2709.0,1007.5,21.0,16.0,55.6,7.1,19.2,57.3,10.5,2688.0,2924.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:20:14Z,14,0,100.0,15.5,62.4,0.260,61.00,0.260,0.2274,0.1261,1006.10,8.70,91.90,7.50,3137151,242,6346.0,6507.0,49660,3,3417.0,2702.0,1007.6,21.0,16.0,55.6,7.1,19.1,57.2,10.4,2994.0,3287.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:20:24Z,14,0,100.0,15.5,62.4,0.370,153.00,0.370,0.1680,-0.3297,1006.10,8.70,91.90,7.50,3137161,242,6650.0,6826.0,49661,3,3441.0,2721.0,1007.5,21.0,16.0,55.6,7.1,19.2,57.2,10.5,3136.0,3469.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:20:34Z,14,0,100.0,15.5,62.4,0.290,200.00,0.290,-0.0992,-0.2725,1006.10,8.70,91.90,7.50,3137171,242,8788.0,9096.0,49662,3,3428.0,2704.0,1007.4,21.0,16.0,55.6,7.1,19.1,57.2,10.4,4021.0,4610.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:20:44Z,14,0,100.0,15.5,62.4,0.450,80.00,0.450,0.4432,0.0781,1006.10,8.70,91.90,7.50,3137181,242,8409.0,8691.0,49663,3,3435.0,2716.0,1007.4,21.0,16.0,55.6,7.1,19.1,57.2,10.5,3864.0,4381.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:20:54Z,14,0,100.0,15.5,62.5,0.660,13.00,0.660,0.1485,0.6431,1006.10,8.70,91.90,7.50,3137191,242,8531.0,8822.0,49664,3,3457.0,2711.0,1007.5,21.0,16.0,55.6,7.1,19.2,57.2,10.5,4027.0,4611.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:21:04Z,14,0,100.0,15.5,62.5,1.590,65.00,1.590,1.4410,0.6720,1006.10,8.70,91.90,7.50,3137201,242,10625.0,11076.0,49665,3,3435.0,2721.0,1007.4,21.0,16.0,55.7,7.1,19.1,57.3,10.5,4703.0,5497.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:21:14Z,14,0,100.0,15.5,62.5,1.660,70.00,1.660,1.5599,0.5678,1006.10,8.70,91.90,7.50,3137211,242,5066.0,5168.0,49666,3,3459.0,2712.0,1007.4,21.0,16.0,55.6,7.1,19.2,57.2,10.5,2536.0,2742.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:21:24Z,14,0,100.0,15.5,62.5,0.500,95.00,0.500,0.4981,-0.0436,1006.10,8.70,91.90,7.50,3137221,242,6365.0,6527.0,49667,3,3437.0,2718.0,1007.5,21.0,16.0,55.7,7.1,19.2,57.2,10.5,3020.0,3316.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:21:34Z,14,0,100.0,15.5,62.5,0.920,79.00,0.920,0.9031,0.1755,1006.10,8.70,91.90,7.50,3137231,242,23638.0,25873.0,49668,3,3462.0,2718.0,1007.4,21.0,16.0,55.7,7.1,19.1,57.2,10.5,8674.0,12743.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:21:44Z,14,0,100.0,15.5,62.5,0.760,87.00,0.760,0.7590,0.0398,1006.10,8.70,91.80,7.50,3137241,242,8881.0,9196.0,49669,3,3411.0,2710.0,1007.4,21.0,16.0,55.7,7.1,19.1,57.2,10.5,3946.0,4511.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:21:54Z,14,0,100.0,15.5,62.4,0.900,58.00,0.900,0.7632,0.4769,1006.10,8.70,91.90,7.50,3137251,242,11346.0,11860.0,49670,3,3466.0,2714.0,1007.4,21.0,16.0,55.7,7.1,19.2,57.2,10.5,5160.0,6182.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:22:04Z,14,0,100.0,15.5,62.5,0.850,85.00,0.850,0.8468,0.0741,1006.10,8.70,91.90,7.50,3137261,242,9219.0,9558.0,49671,3,3441.0,2718.0,1007.6,21.0,16.0,55.7,7.1,19.1,57.2,10.5,4210.0,4829.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:22:14Z,14,0,100.0,15.5,62.5,0.980,85.00,0.980,0.9763,0.0854,1006.10,8.70,91.90,7.50,3137271,242,9861.0,10249.0,49672,3,3456.0,2708.0,1007.5,21.0,16.0,55.7,7.1,19.1,57.3,10.5,4594.0,5344.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:22:24Z,14,0,100.0,15.5,62.5,1.250,68.00,1.250,1.1590,0.4683,1006.10,8.70,91.90,7.50,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan, +2026-04-17T01:22:34Z,14,0,100.0,15.5,62.5,1.750,63.00,1.750,1.5593,0.7945,1006.10,8.70,91.90,7.50,3137282,242,9227.0,9567.0,49673,3,3402.0,2698.0,1007.4,21.0,16.0,55.7,7.1,19.1,57.2,10.5,4117.0,4707.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:22:44Z,14,0,100.0,15.5,62.5,1.440,74.00,1.440,1.3842,0.3969,1006.10,8.70,91.90,7.50,3137292,242,14628.0,15483.0,49674,3,3455.0,2717.0,1007.4,21.0,16.0,55.7,7.1,19.1,57.2,10.4,6222.0,7822.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:22:54Z,14,0,100.0,15.5,62.5,1.680,92.00,1.680,1.6790,-0.0586,1006.10,8.70,91.90,7.50,3137302,242,12253.0,12853.0,49675,3,3449.0,2709.0,1007.5,21.0,16.0,55.7,7.1,19.1,57.2,10.5,5412.0,6569.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:23:04Z,14,0,100.0,15.5,62.5,1.360,104.00,1.360,1.3196,-0.3290,1006.10,8.70,91.90,7.50,3137312,242,21013.0,22779.0,49676,3,3451.0,2718.0,1007.5,21.0,16.0,55.7,7.1,19.1,57.3,10.5,7954.0,11159.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:23:14Z,14,0,100.0,15.5,62.5,1.470,86.00,1.470,1.4664,0.1025,1006.10,8.70,91.90,7.50,3137322,242,7807.0,8050.0,49677,3,3430.0,2699.0,1007.4,21.0,16.0,55.7,7.1,19.1,57.3,10.5,3662.0,4135.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:23:24Z,14,0,100.0,15.5,62.5,1.450,77.00,1.450,1.4128,0.3262,1006.10,8.60,91.90,7.50,3137332,242,16215.0,17266.0,49678,3,3447.0,2702.0,1007.5,21.0,15.9,55.7,7.1,19.1,57.2,10.4,6762.0,8752.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:23:34Z,14,0,100.0,15.5,62.5,1.310,66.00,1.310,1.1967,0.5328,1006.10,8.60,91.90,7.50,3137342,242,12765.0,13416.0,49679,3,3524.0,2732.0,1007.5,20.9,15.9,55.7,7.1,19.1,57.2,10.4,5995.0,7325.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:23:44Z,14,0,100.0,15.5,62.5,1.320,82.00,1.320,1.3072,0.1837,1006.10,8.60,91.90,7.50,3137352,242,13340.0,14051.0,49680,3,3431.0,2716.0,1007.4,21.0,16.0,55.7,7.1,19.1,57.2,10.5,5654.0,6911.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:23:54Z,14,0,100.0,15.5,62.5,1.900,92.00,1.900,1.8988,-0.0663,1006.10,8.60,91.90,7.50,3137362,242,8487.0,8775.0,49681,3,3441.0,2713.0,1007.4,21.0,16.0,55.7,7.1,19.1,57.2,10.5,3927.0,4477.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:24:04Z,14,0,100.0,15.5,62.5,1.930,95.00,1.930,1.9227,-0.1682,1006.10,8.60,91.90,7.50,3137372,242,8763.0,9070.0,49682,3,3468.0,2714.0,1007.5,21.0,16.0,55.7,7.1,19.1,57.2,10.4,4179.0,4787.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:24:14Z,14,0,100.0,15.5,62.4,1.770,81.00,1.770,1.7482,0.2769,1006.10,8.60,91.90,7.40,3137382,242,6901.0,7091.0,49683,3,3419.0,2706.0,1007.5,21.0,16.0,55.7,7.1,19.1,57.2,10.4,3209.0,3565.0,1760.0,8000.0,48,192,300.0,100.0,1.4, diff --git a/tests/files/modulair-ufp/MOD-UFP-00002-rawsd.csv b/tests/files/modulair-ufp/MOD-UFP-00002-rawsd.csv new file mode 100644 index 0000000..718cf83 --- /dev/null +++ b/tests/files/modulair-ufp/MOD-UFP-00002-rawsd.csv @@ -0,0 +1,510 @@ +deviceModel,MODULAIR-UFP +deviceID,0a10aced202194944a04af94 +deviceSN,MOD-UFP-00002 +timestamp,fw,flag,soc,sample_temp,sample_rh,wx_ws,wx_wd,wx_ws_scalar,wx_u,wx_v,wx_pressure,wx_temp,wx_rh,wx_dew_point,cpc_elapsed_seconds,cpc_serial_number,cpc_particle_number_conc,cpc_particle_number_conc_corr,cpc_sample_number,cpc_flag,cpc_pressure_at_beginning,cpc_pressure_at_end,cpc_pressure_ambient,cpc_temperature_ambient,cpc_temperature_at_input,cpc_humidity_at_input,cpc_dew_point_at_input,cpc_temperature_at_output,cpc_humidity_at_output,cpc_dew_point_at_output,cpc_particle_count,cpc_particle_count_corr,cpc_flush_time_ms,cpc_humidification_time_ms,cpc_expansion_time_start,cpc_expansion_time_end,cpc_dead_time_corr_factor,cpc_power_to_pump,cpc_k_factor, +2026-04-17T00:00:01Z,14,0,100.0,16.6,58.5,1.070,116.00,1.070,0.9617,-0.4691,1006.00,9.00,90.20,7.50,3132362,242,14485.0,15324.0,49184,3,3464.0,2714.0,1007.4,22.2,17.3,51.8,7.3,20.6,55.0,11.2,6244.0,7872.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:00:11Z,14,0,100.0,16.6,58.5,1.580,83.00,1.580,1.5682,0.1926,1006.00,9.00,90.10,7.50,3132372,242,15415.0,16365.0,49185,3,3444.0,2717.0,1007.4,22.2,17.3,51.8,7.3,20.6,54.9,11.2,6486.0,8120.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:00:21Z,14,0,100.0,16.6,58.5,0.680,77.00,0.680,0.6626,0.1530,1006.00,9.00,90.10,7.50,3132382,242,12703.0,13348.0,49186,3,3483.0,2717.0,1007.4,22.2,17.3,51.8,7.2,20.6,54.9,11.2,5804.0,7050.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:00:31Z,14,0,100.0,16.6,58.5,1.040,108.00,1.040,0.9891,-0.3214,1006.00,9.00,90.10,7.50,3132392,242,11621.0,12161.0,49187,3,3431.0,2703.0,1007.4,22.2,17.3,51.8,7.3,20.6,54.9,11.2,5137.0,6130.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:00:41Z,14,0,100.0,16.6,58.5,1.150,113.00,1.150,1.0586,-0.4493,1006.00,9.00,90.10,7.50,3132402,242,12341.0,12950.0,49188,3,3465.0,2712.0,1007.6,22.2,17.3,51.8,7.3,20.6,55.0,11.2,5563.0,6732.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:00:51Z,14,0,100.0,16.6,58.5,1.160,104.00,1.160,1.1255,-0.2806,1006.10,9.00,90.00,7.50,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan, +2026-04-17T00:01:01Z,14,0,100.0,16.6,58.5,1.510,126.00,1.510,1.2216,-0.8876,1006.10,9.00,90.00,7.50,3132412,242,14146.0,14946.0,49189,3,3407.0,2704.0,1007.5,22.2,17.3,51.8,7.3,20.6,54.9,11.2,5853.0,7205.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:01:11Z,14,0,100.0,16.6,58.6,1.650,115.00,1.650,1.4954,-0.6973,1006.00,9.00,90.00,7.50,3132422,242,14771.0,15643.0,49190,3,3455.0,2711.0,1007.5,22.2,17.3,51.8,7.3,20.5,54.9,11.2,6366.0,7962.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:01:21Z,14,0,100.0,16.6,58.5,1.130,147.00,1.130,0.6154,-0.9477,1006.10,9.00,90.00,7.50,3132432,242,13321.0,14030.0,49191,3,3457.0,2713.0,1007.4,22.2,17.3,51.9,7.3,20.6,55.0,11.2,5810.0,7181.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:01:31Z,14,0,100.0,16.6,58.5,3.330,99.00,3.330,3.2890,-0.5209,1006.10,9.00,90.00,7.50,3132442,242,13430.0,14151.0,49192,3,3450.0,2709.0,1007.5,22.1,17.3,51.9,7.3,20.6,55.0,11.2,5864.0,7210.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:01:41Z,14,0,100.0,16.6,58.6,1.800,131.00,1.800,1.3585,-1.1809,1006.10,8.90,90.00,7.50,3132452,242,13497.0,14225.0,49193,3,3460.0,2720.0,1007.6,22.2,17.3,51.8,7.3,20.6,55.0,11.2,5917.0,7235.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:01:51Z,14,0,100.0,16.6,58.6,1.020,119.00,1.020,0.8921,-0.4945,1006.10,8.90,90.00,7.50,3132462,242,9854.0,10242.0,49194,3,3476.0,2719.0,1007.4,22.2,17.2,51.8,7.2,20.5,55.0,11.2,4654.0,5405.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:02:01Z,14,0,100.0,16.6,58.6,0.730,107.00,0.730,0.6981,-0.2134,1006.10,8.90,90.00,7.50,3132472,242,10869.0,11341.0,49195,3,3452.0,2712.0,1007.6,22.1,17.2,51.9,7.3,20.6,54.9,11.2,4943.0,5827.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:02:11Z,14,0,100.0,16.6,58.6,2.100,48.00,2.100,1.5606,1.4052,1006.10,8.90,90.10,7.50,3132482,242,11002.0,11486.0,49196,3,3470.0,2713.0,1007.5,22.1,17.2,51.9,7.2,20.6,55.0,11.2,5084.0,6034.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:02:21Z,14,0,100.0,16.6,58.6,1.240,125.00,1.240,1.0157,-0.7112,1006.10,8.90,90.10,7.50,3132492,242,11317.0,11829.0,49197,3,3407.0,2699.0,1007.5,22.1,17.2,51.9,7.2,20.6,55.0,11.2,4936.0,5805.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:02:31Z,14,0,100.0,16.6,58.6,0.610,156.00,0.610,0.2481,-0.5573,1006.10,9.00,90.10,7.50,3132502,242,11796.0,12352.0,49198,3,3455.0,2703.0,1007.6,22.1,17.2,51.9,7.2,20.5,55.0,11.2,5351.0,6426.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:02:41Z,14,0,100.0,16.6,58.6,1.400,91.00,1.400,1.3998,-0.0244,1006.10,9.00,90.10,7.50,3132512,242,12799.0,13454.0,49199,3,3449.0,2721.0,1007.6,22.1,17.2,51.9,7.2,20.5,55.0,11.2,5584.0,6750.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:02:51Z,14,0,100.0,16.6,58.6,1.410,109.00,1.410,1.3332,-0.4591,1006.10,9.00,90.10,7.50,3132523,242,12402.0,13017.0,49200,3,3440.0,2716.0,1007.5,22.1,17.2,51.9,7.2,20.5,55.0,11.2,5416.0,6505.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:03:01Z,14,0,100.0,16.6,58.6,0.790,91.00,0.790,0.7899,-0.0138,1006.10,9.00,90.10,7.50,3132533,242,11674.0,12219.0,49201,3,3430.0,2709.0,1007.5,22.1,17.2,51.9,7.2,20.5,55.0,11.2,5210.0,6098.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:03:11Z,14,0,100.0,16.6,58.7,0.970,136.00,0.970,0.6738,-0.6978,1006.10,9.00,90.00,7.50,3132543,242,10619.0,11070.0,49202,3,3446.0,2716.0,1007.4,22.1,17.2,51.9,7.2,20.5,55.0,11.1,4809.0,5617.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:03:21Z,14,0,100.0,16.5,58.6,0.980,68.00,0.980,0.9086,0.3671,1006.10,9.00,90.00,7.50,3132553,242,11045.0,11532.0,49203,3,3445.0,2718.0,1007.4,22.1,17.2,51.9,7.2,20.5,55.0,11.2,4939.0,5818.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:03:31Z,14,0,100.0,16.6,58.7,1.330,86.00,1.330,1.3268,0.0928,1006.10,8.90,90.00,7.50,3132563,242,11120.0,11614.0,49204,3,3435.0,2707.0,1007.4,22.1,17.2,51.9,7.2,20.5,55.0,11.1,4960.0,5866.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:03:41Z,14,0,100.0,16.5,58.7,1.940,128.00,1.940,1.5287,-1.1944,1006.10,9.00,90.00,7.50,3132573,242,11974.0,12547.0,49205,3,3470.0,2717.0,1007.4,22.1,17.2,51.9,7.2,20.5,55.0,11.2,5443.0,6533.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:03:51Z,14,0,100.0,16.5,58.7,1.650,85.00,1.650,1.6437,0.1438,1006.10,9.00,90.00,7.50,3132583,242,11500.0,12029.0,49206,3,3454.0,2704.0,1007.6,22.1,17.2,52.0,7.2,20.5,55.0,11.1,5216.0,6248.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:04:01Z,14,0,100.0,16.5,58.7,1.020,94.00,1.020,1.0175,-0.0712,1006.10,9.00,90.00,7.50,3132593,242,12660.0,13301.0,49207,3,3452.0,2716.0,1007.6,22.1,17.2,52.0,7.2,20.5,55.1,11.2,5583.0,6750.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:04:11Z,14,0,100.0,16.5,58.7,1.520,87.00,1.520,1.5179,0.0796,1006.10,9.00,90.00,7.50,3132603,242,12050.0,12630.0,49208,3,3470.0,2719.0,1007.4,22.1,17.2,52.0,7.2,20.5,55.0,11.2,5461.0,6557.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:04:21Z,14,0,100.0,16.5,58.7,0.690,77.00,0.690,0.6723,0.1552,1006.10,8.90,89.90,7.50,3132613,242,13135.0,13825.0,49209,3,3418.0,2704.0,1007.6,22.1,17.2,52.0,7.2,20.5,55.0,11.1,5588.0,6794.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:04:31Z,14,0,100.0,16.5,58.7,0.420,137.00,0.420,0.2864,-0.3072,1006.10,8.90,89.90,7.50,3132623,242,11451.0,11975.0,49210,3,3456.0,2702.0,1007.5,22.1,17.2,52.0,7.2,20.5,55.0,11.1,5242.0,6255.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:04:41Z,14,0,100.0,16.5,58.8,0.360,218.00,0.360,-0.2216,-0.2837,1006.10,8.90,89.90,7.50,3132633,242,24347.0,26718.0,49211,3,3449.0,2723.0,1007.6,22.1,17.2,52.0,7.2,20.5,55.0,11.1,8747.0,12805.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:04:51Z,14,0,100.0,16.5,58.8,1.280,219.00,1.280,-0.8055,-0.9947,1006.00,9.00,89.90,7.50,3132643,242,21883.0,23798.0,49212,3,3461.0,2713.0,1007.5,22.1,17.2,52.0,7.2,20.5,55.0,11.1,8444.0,11859.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:05:01Z,14,0,100.0,16.5,58.8,1.910,109.00,1.910,1.8059,-0.6218,1006.00,9.00,89.90,7.50,3132653,242,18904.0,20333.0,49213,3,3497.0,2724.0,1007.6,22.1,17.1,52.0,7.2,20.5,55.1,11.1,7861.0,10586.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:05:11Z,14,0,100.0,16.5,58.8,0.910,65.00,0.910,0.8247,0.3846,1006.10,9.00,89.90,7.50,3132663,242,16434.0,17514.0,49214,3,3432.0,2711.0,1007.6,22.1,17.1,52.0,7.2,20.4,55.0,11.1,6685.0,8584.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:05:21Z,14,0,100.0,16.5,58.8,1.040,134.00,1.040,0.7481,-0.7224,1006.10,9.00,89.90,7.50,3132673,242,16372.0,17444.0,49215,3,3457.0,2716.0,1007.4,22.1,17.1,52.0,7.2,20.5,55.1,11.1,6816.0,8790.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:05:31Z,14,0,100.0,16.5,58.8,0.980,72.00,0.980,0.9320,0.3028,1006.10,9.00,89.90,7.50,3132683,242,22550.0,24584.0,49216,3,3461.0,2714.0,1007.5,22.0,17.1,52.0,7.2,20.5,55.1,11.1,8584.0,12204.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:05:41Z,14,0,100.0,16.5,58.8,0.110,313.00,0.110,-0.0804,0.0750,1006.10,9.00,89.90,7.50,3132694,242,15893.0,16903.0,49217,3,3414.0,2702.0,1007.5,22.0,17.2,52.0,7.2,20.4,55.1,11.1,6458.0,8198.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:05:51Z,14,0,100.0,16.5,58.8,1.010,118.00,1.010,0.8918,-0.4742,1006.10,9.00,89.90,7.50,3132704,242,16239.0,17293.0,49218,3,3430.0,2706.0,1007.4,22.0,17.2,52.0,7.2,20.4,55.1,11.1,6668.0,8519.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:06:01Z,14,0,100.0,16.5,58.8,1.310,112.00,1.310,1.2146,-0.4907,1006.10,9.00,89.80,7.40,3132714,242,15741.0,16732.0,49219,3,3484.0,2726.0,1007.4,22.0,17.1,52.1,7.2,20.5,55.1,11.1,6769.0,8645.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:06:11Z,14,0,100.0,16.5,58.8,1.550,89.00,1.550,1.5498,0.0271,1006.10,8.90,89.80,7.40,3132724,242,16013.0,17038.0,49220,3,3473.0,2718.0,1007.6,22.0,17.1,52.0,7.2,20.4,55.1,11.1,6848.0,8758.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:06:21Z,14,0,100.0,16.5,58.8,1.550,104.00,1.550,1.5040,-0.3750,1006.10,8.90,89.80,7.40,3132734,242,14026.0,14812.0,49221,3,3432.0,2698.0,1007.6,22.0,17.1,52.0,7.2,20.4,55.1,11.1,6026.0,7458.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:06:31Z,14,0,100.0,16.5,58.8,1.160,115.00,1.160,1.0513,-0.4902,1006.10,8.90,89.80,7.40,3132744,242,14102.0,14897.0,49222,3,3468.0,2714.0,1007.5,22.0,17.1,52.0,7.2,20.4,55.1,11.1,6218.0,7704.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:06:41Z,14,0,100.0,16.5,58.8,1.340,124.00,1.340,1.1109,-0.7493,1006.10,9.00,89.80,7.40,3132754,242,17324.0,18524.0,49223,3,3407.0,2704.0,1007.4,22.0,17.1,52.1,7.2,20.4,55.1,11.1,6845.0,8824.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:06:51Z,14,0,100.0,16.5,58.8,2.240,138.00,2.240,1.4989,-1.6646,1006.10,8.90,89.80,7.40,3132764,242,17837.0,19109.0,49224,3,3427.0,2711.0,1007.6,22.0,17.1,52.1,7.2,20.4,55.1,11.1,7102.0,9252.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:07:01Z,14,0,100.0,16.4,58.8,1.780,106.00,1.780,1.7110,-0.4906,1006.20,8.90,89.80,7.40,3132774,242,15485.0,16444.0,49225,3,3457.0,2711.0,1007.5,22.0,17.1,52.1,7.2,20.4,55.1,11.1,6561.0,8369.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:07:11Z,14,0,100.0,16.5,58.8,2.230,163.00,2.230,0.6520,-2.1326,1006.20,8.90,89.70,7.40,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan, +2026-04-17T00:07:21Z,14,0,100.0,16.4,58.9,1.220,102.00,1.220,1.1933,-0.2537,1006.20,8.90,89.80,7.40,3132794,242,15104.0,16016.0,49227,3,3442.0,2718.0,1007.5,22.0,17.1,52.1,7.2,20.4,55.1,11.1,6329.0,7923.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:07:31Z,14,0,100.0,16.4,58.9,1.580,130.00,1.580,1.2104,-1.0156,1006.20,8.90,89.80,7.40,3132804,242,15100.0,16012.0,49228,3,3478.0,2718.0,1007.7,22.0,17.1,52.1,7.2,20.4,55.1,11.1,6604.0,8313.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:07:41Z,14,0,100.0,16.4,58.9,1.210,66.00,1.210,1.1054,0.4922,1006.20,8.90,89.80,7.40,3132814,242,17614.0,18855.0,49229,3,3459.0,2713.0,1007.6,22.0,17.1,52.1,7.1,20.4,55.0,11.0,7237.0,9519.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:07:51Z,14,0,100.0,16.4,58.9,0.880,93.00,0.880,0.8788,-0.0461,1006.20,8.90,89.80,7.40,3132824,242,17336.0,18538.0,49230,3,3473.0,2717.0,1007.5,22.0,17.1,52.1,7.2,20.4,55.1,11.1,7143.0,9495.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:08:01Z,14,0,100.0,16.4,58.9,1.600,108.00,1.600,1.5217,-0.4944,1006.20,8.90,89.80,7.40,3132834,242,17906.0,19188.0,49231,3,3412.0,2704.0,1007.5,22.0,17.1,52.2,7.2,20.4,55.1,11.1,7014.0,9185.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:08:11Z,14,0,100.0,16.4,58.9,1.520,134.00,1.520,1.0934,-1.0559,1006.20,8.90,89.80,7.40,3132844,242,19481.0,20999.0,49232,3,3423.0,2704.0,1007.7,22.0,17.1,52.1,7.2,20.4,55.1,11.0,7551.0,10146.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:08:21Z,14,0,100.0,16.4,58.9,1.840,128.00,1.840,1.4499,-1.1328,1006.20,8.90,89.80,7.40,3132855,242,17555.0,18787.0,49233,3,3449.0,2722.0,1007.6,22.0,17.1,52.1,7.2,20.4,55.1,11.1,7109.0,9245.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:08:31Z,14,0,100.0,16.4,58.9,3.680,126.00,3.680,2.9772,-2.1630,1006.20,8.90,89.80,7.40,3132865,242,17054.0,18217.0,49234,3,3441.0,2717.0,1007.5,22.0,17.0,52.1,7.1,20.3,55.1,11.0,6940.0,8945.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:08:41Z,14,0,100.0,16.4,58.9,3.500,133.00,3.500,2.5597,-2.3870,1006.20,8.90,89.80,7.40,3132875,242,15902.0,16913.0,49235,3,3427.0,2711.0,1007.5,22.0,17.0,52.2,7.2,20.4,55.1,11.0,6516.0,8249.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:08:51Z,14,0,100.0,16.4,58.9,1.270,159.00,1.270,0.4551,-1.1856,1006.20,8.90,89.80,7.40,3132885,242,15194.0,16117.0,49236,3,3444.0,2713.0,1007.5,22.0,17.0,52.2,7.1,20.4,55.1,11.0,6379.0,8047.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:09:01Z,14,0,100.0,16.4,58.8,1.460,90.00,1.460,1.4600,0.0000,1006.20,8.90,89.80,7.40,3132895,242,16083.0,17117.0,49237,3,3438.0,2723.0,1007.5,22.0,17.0,52.2,7.2,20.3,55.1,11.0,6562.0,8331.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:09:11Z,14,0,100.0,16.4,58.8,1.920,123.00,1.920,1.6102,-1.0457,1006.20,8.90,89.80,7.40,3132905,242,16246.0,17301.0,49238,3,3427.0,2709.0,1007.6,22.0,17.0,52.2,7.1,20.3,55.1,11.0,6621.0,8450.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:09:21Z,14,0,100.0,16.4,58.9,1.110,182.00,1.110,-0.0387,-1.1093,1006.20,8.90,89.80,7.40,3132915,242,14745.0,15614.0,49239,3,3437.0,2698.0,1007.6,22.0,17.0,52.2,7.1,20.3,55.2,11.0,6277.0,7894.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:09:31Z,14,0,100.0,16.4,58.8,1.030,145.00,1.030,0.5908,-0.8437,1006.20,8.90,89.80,7.40,3132925,242,16538.0,17632.0,49240,3,3430.0,2709.0,1007.6,22.0,17.0,52.2,7.2,20.3,55.2,11.0,6748.0,8638.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:09:41Z,14,0,100.0,16.4,58.8,1.330,75.00,1.330,1.2847,0.3442,1006.20,8.90,89.90,7.40,3132935,242,18245.0,19576.0,49241,3,3451.0,2717.0,1007.6,21.9,17.0,52.2,7.1,20.3,55.1,11.0,7357.0,9701.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:09:51Z,14,0,100.0,16.4,58.9,1.710,162.00,1.710,0.5284,-1.6263,1006.20,8.80,89.90,7.40,3132945,242,16922.0,18067.0,49242,3,3459.0,2712.0,1007.6,21.9,17.0,52.2,7.1,20.3,55.2,11.0,7023.0,9157.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:10:01Z,14,0,100.0,16.3,58.9,1.230,75.00,1.230,1.1881,0.3183,1006.20,8.90,89.90,7.40,3132955,242,15770.0,16764.0,49243,3,3455.0,2713.0,1007.5,21.9,17.0,52.2,7.1,20.3,55.2,11.0,6620.0,8478.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:10:11Z,14,0,100.0,16.4,58.9,1.250,93.00,1.250,1.2483,-0.0654,1006.20,8.90,89.90,7.40,3132965,242,16801.0,17930.0,49244,3,3473.0,2719.0,1007.6,21.9,17.0,52.2,7.1,20.3,55.1,11.0,7071.0,9177.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:10:21Z,14,0,100.0,16.3,58.9,1.800,139.00,1.800,1.1809,-1.3585,1006.10,8.90,89.90,7.40,3132975,242,16116.0,17154.0,49245,3,3433.0,2699.0,1007.6,21.9,17.0,52.2,7.1,20.3,55.2,11.0,6692.0,8569.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:10:31Z,14,0,100.0,16.4,58.9,0.930,120.00,0.930,0.8054,-0.4650,1006.10,8.80,89.90,7.40,3132985,242,17181.0,18361.0,49246,3,3466.0,2712.0,1007.6,21.9,17.0,52.2,7.1,20.3,55.1,11.0,7151.0,9384.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:10:41Z,14,0,100.0,16.3,59.0,1.500,150.00,1.500,0.7500,-1.2990,1006.10,8.80,89.90,7.30,3132995,242,18072.0,19378.0,49247,3,3419.0,2704.0,1007.4,21.9,17.0,52.2,7.1,20.3,55.2,11.0,7133.0,9362.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:10:51Z,14,0,100.0,16.3,59.0,1.870,122.00,1.870,1.5858,-0.9909,1006.10,8.80,89.90,7.30,3133005,242,18162.0,19481.0,49248,3,3450.0,2718.0,1007.5,21.9,17.0,52.2,7.1,20.3,55.2,11.0,7293.0,9632.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:11:01Z,14,0,100.0,16.3,58.9,2.100,94.00,2.100,2.0949,-0.1465,1006.10,8.80,89.90,7.30,3133015,242,18229.0,19558.0,49249,3,3440.0,2722.0,1007.4,21.9,17.0,52.2,7.1,20.3,55.2,11.0,7204.0,9483.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:11:11Z,14,0,100.0,16.3,58.9,1.800,129.00,1.800,1.3989,-1.1328,1006.10,8.80,89.90,7.30,3133026,242,21928.0,23851.0,49250,3,3431.0,2706.0,1007.5,21.9,17.0,52.3,7.1,20.2,55.2,11.0,8240.0,11518.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:11:21Z,14,0,100.0,16.3,59.0,2.240,127.00,2.240,1.7889,-1.3481,1006.10,8.80,89.90,7.30,3133036,242,19770.0,21333.0,49251,3,3447.0,2723.0,1007.6,21.9,17.0,52.3,7.1,20.3,55.2,11.0,7650.0,10369.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:11:31Z,14,0,100.0,16.3,59.0,2.120,107.00,2.120,2.0274,-0.6198,1006.10,8.80,89.90,7.30,3133046,242,21557.0,23415.0,49252,3,3461.0,2714.0,1007.5,21.9,17.0,52.3,7.1,20.3,55.2,11.0,8343.0,11666.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:11:41Z,14,0,100.0,16.3,59.0,1.690,120.00,1.690,1.4636,-0.8450,1006.10,8.80,89.90,7.30,3133056,242,20876.0,22619.0,49253,3,3412.0,2703.0,1007.6,21.9,17.0,52.3,7.1,20.3,55.2,11.0,7789.0,10722.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:11:51Z,14,0,100.0,16.3,59.0,0.970,98.00,0.970,0.9606,-0.1350,1006.10,8.80,90.00,7.30,3133066,242,19982.0,21579.0,49254,3,3464.0,2714.0,1007.5,21.9,16.9,52.3,7.1,20.3,55.2,11.0,7966.0,10857.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:12:01Z,14,0,100.0,16.3,58.9,1.330,117.00,1.330,1.1850,-0.6038,1006.10,8.80,89.90,7.30,3133076,242,20578.0,22271.0,49255,3,3445.0,2721.0,1007.5,21.9,16.9,52.3,7.1,20.3,55.2,11.0,7950.0,10794.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:12:11Z,14,0,100.0,16.3,58.9,2.380,157.00,2.380,0.9299,-2.1908,1006.10,8.80,90.00,7.30,3133086,242,19150.0,20616.0,49256,3,3470.0,2714.0,1007.5,21.9,17.0,52.3,7.1,20.3,55.2,11.0,7745.0,10489.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:12:21Z,14,0,100.0,16.3,58.9,1.900,117.00,1.900,1.6929,-0.8626,1006.10,8.80,89.90,7.30,3133096,242,21421.0,23256.0,49257,3,3413.0,2707.0,1007.5,21.9,16.9,52.3,7.1,20.2,55.2,11.0,7938.0,10957.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:12:31Z,14,0,100.0,16.3,58.9,1.160,98.00,1.160,1.1487,-0.1614,1006.10,8.80,90.00,7.30,3133106,242,20422.0,22090.0,49258,3,3450.0,2708.0,1007.6,21.9,16.9,52.3,7.1,20.2,55.2,10.9,7968.0,10978.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:12:41Z,14,0,100.0,16.3,58.9,1.220,79.00,1.220,1.1976,0.2328,1006.10,8.80,90.00,7.30,3133116,242,21370.0,23196.0,49259,3,3450.0,2718.0,1007.4,21.9,16.9,52.3,7.1,20.2,55.2,11.0,8194.0,11334.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:12:51Z,14,0,100.0,16.3,59.0,2.160,99.00,2.160,2.1334,-0.3379,1006.10,8.80,90.00,7.30,3133126,242,19078.0,20533.0,49260,3,3459.0,2712.0,1007.5,21.8,16.9,52.3,7.1,20.2,55.2,10.9,7688.0,10325.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:13:01Z,14,0,100.0,16.3,59.0,1.020,93.00,1.020,1.0186,-0.0534,1006.10,8.80,90.00,7.30,3133136,242,18799.0,20212.0,49261,3,3457.0,2711.0,1007.5,21.8,16.9,52.3,7.1,20.3,55.2,11.0,7576.0,10160.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:13:11Z,14,0,100.0,16.3,59.0,1.260,113.00,1.260,1.1598,-0.4923,1006.10,8.80,90.10,7.30,3133146,242,18396.0,19749.0,49262,3,3426.0,2702.0,1007.4,21.8,16.9,52.3,7.1,20.2,55.2,10.9,7317.0,9650.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:13:21Z,14,0,100.0,16.3,59.1,1.320,109.00,1.320,1.2481,-0.4297,1006.10,8.80,90.00,7.30,3133156,242,21032.0,22801.0,49263,3,3456.0,2723.0,1007.6,21.8,16.9,52.4,7.1,20.2,55.2,11.0,8053.0,11168.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:13:31Z,14,0,100.0,16.3,59.0,0.580,57.00,0.580,0.4864,0.3159,1006.10,8.80,90.00,7.30,3133166,242,19941.0,21531.0,49264,3,3468.0,2719.0,1007.4,21.8,16.9,52.4,7.1,20.2,55.2,11.0,7891.0,10822.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:13:41Z,14,0,100.0,16.3,59.0,0.370,160.00,0.370,0.1265,-0.3477,1006.10,8.80,90.10,7.30,3133176,242,20135.0,21756.0,49265,3,3444.0,2726.0,1007.4,21.8,16.9,52.4,7.0,20.2,55.2,10.9,7784.0,10475.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:13:51Z,14,0,100.0,16.3,59.1,1.420,130.00,1.420,1.0878,-0.9128,1006.10,8.80,90.00,7.30,3133187,242,20009.0,21610.0,49266,3,3461.0,2712.0,1007.5,21.8,16.9,52.4,7.1,20.2,55.2,10.9,7969.0,10858.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:14:01Z,14,0,100.0,16.2,59.1,0.880,104.00,0.880,0.8539,-0.2129,1006.10,8.80,90.10,7.30,3133197,242,19322.0,20815.0,49267,3,3418.0,2706.0,1007.6,21.8,16.9,52.4,7.1,20.2,55.3,10.9,7478.0,9966.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:14:11Z,14,0,100.0,16.2,59.1,1.320,119.00,1.320,1.1545,-0.6399,1006.10,8.80,90.10,7.30,3133207,242,18296.0,19634.0,49268,3,3426.0,2703.0,1007.6,21.8,16.9,52.4,7.1,20.2,55.3,10.9,7266.0,9583.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:14:21Z,14,0,100.0,16.3,59.1,0.760,172.00,0.760,0.1058,-0.7526,1006.10,8.80,90.00,7.30,3133217,242,19897.0,21480.0,49269,3,3446.0,2719.0,1007.5,21.8,16.9,52.4,7.1,20.2,55.2,10.9,7739.0,10480.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:14:31Z,14,0,100.0,16.2,59.1,1.310,107.00,1.310,1.2528,-0.3830,1006.10,8.80,90.00,7.30,3133227,242,18873.0,20297.0,49270,3,3498.0,2727.0,1007.4,21.8,16.9,52.4,7.1,20.2,55.3,10.9,7671.0,10543.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:14:41Z,14,0,100.0,16.2,59.1,1.420,168.00,1.420,0.2952,-1.3890,1006.10,8.80,90.10,7.30,3133237,242,20479.0,22156.0,49271,3,3440.0,2702.0,1007.4,21.8,16.9,52.4,7.1,20.2,55.3,10.9,7922.0,10950.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:14:51Z,14,0,100.0,16.2,59.1,1.650,152.00,1.650,0.7746,-1.4569,1006.10,8.80,90.00,7.30,3133247,242,19147.0,20613.0,49272,3,3430.0,2716.0,1007.4,21.8,16.9,52.4,7.1,20.2,55.3,10.9,7416.0,9905.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:15:01Z,14,0,100.0,16.2,59.1,0.380,68.00,0.380,0.3523,0.1424,1006.10,8.80,90.00,7.30,3133257,242,20463.0,22137.0,49273,3,3450.0,2714.0,1007.4,21.8,16.9,52.5,7.1,20.2,55.3,10.9,7980.0,10912.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:15:11Z,14,8,100.0,0.0,0.0,1.200,97.00,1.200,1.1911,-0.1462,1006.10,8.80,90.10,7.30,3133267,242,20645.0,22349.0,49274,3,3423.0,2706.0,1007.5,21.8,16.9,52.5,7.1,20.2,55.3,10.9,7817.0,10724.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:15:21Z,14,0,100.0,16.2,59.2,1.090,104.00,1.090,1.0576,-0.2637,1006.10,8.80,90.10,7.30,3133277,242,22382.0,24385.0,49275,3,3445.0,2719.0,1007.5,21.8,16.9,52.5,7.1,20.2,55.3,10.9,8343.0,11773.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:15:31Z,14,0,100.0,16.2,59.2,0.640,84.00,0.640,0.6365,0.0669,1006.10,8.80,90.00,7.30,3133287,242,19766.0,21328.0,49276,3,3431.0,2707.0,1007.4,21.8,16.9,52.5,7.1,20.2,55.3,10.9,7708.0,10369.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:15:41Z,14,0,100.0,16.2,59.2,0.500,123.00,0.500,0.4193,-0.2723,1006.10,8.80,90.00,7.30,3133297,242,19650.0,21194.0,49277,3,3451.0,2716.0,1007.4,21.8,16.9,52.5,7.1,20.2,55.4,10.9,7710.0,10465.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:15:51Z,14,0,100.0,16.2,59.2,0.300,85.00,0.300,0.2989,0.0261,1006.10,8.80,90.10,7.30,3133307,242,20871.0,22613.0,49278,3,3461.0,2714.0,1007.4,21.8,16.9,52.5,7.1,20.2,55.4,11.0,8116.0,11296.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:16:01Z,14,0,100.0,16.2,59.3,0.890,116.00,0.890,0.7999,-0.3902,1006.10,8.80,90.10,7.30,3133317,242,20909.0,22657.0,49279,3,3447.0,2722.0,1007.4,21.7,16.8,52.5,7.1,20.2,55.3,10.9,7980.0,10983.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:16:11Z,14,0,100.0,16.2,59.2,1.300,122.00,1.300,1.1025,-0.6889,1006.10,8.80,90.10,7.40,3133327,242,25115.0,27638.0,49280,3,3468.0,2713.0,1007.5,21.7,16.8,52.5,7.1,20.2,55.4,10.9,9119.0,13738.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:16:21Z,14,0,100.0,16.2,59.3,0.800,74.00,0.800,0.7690,0.2205,1006.10,8.80,90.10,7.40,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan, +2026-04-17T00:16:31Z,14,0,100.0,16.2,59.3,1.910,101.00,1.910,1.8749,-0.3644,1006.10,8.80,90.10,7.40,3133337,242,27267.0,30240.0,49281,3,3416.0,2707.0,1007.4,21.7,16.8,52.5,7.1,20.1,55.4,10.9,9159.0,14007.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:16:41Z,14,0,100.0,16.2,59.3,1.150,123.00,1.150,0.9645,-0.6263,1006.10,8.80,90.10,7.30,3133348,242,28036.0,31180.0,49282,3,3456.0,2711.0,1007.4,21.8,16.8,52.5,7.1,20.1,55.4,10.9,9587.0,15134.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:16:51Z,14,0,100.0,16.2,59.3,1.440,135.00,1.440,1.0182,-1.0182,1006.10,8.80,90.10,7.30,3133358,242,28630.0,31908.0,49283,3,3474.0,2719.0,1007.4,21.8,16.8,52.5,7.1,20.1,55.4,10.9,9866.0,15662.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:17:01Z,14,0,100.0,16.2,59.4,2.250,136.00,2.250,1.5630,-1.6185,1006.10,8.80,90.10,7.30,3133368,242,28743.0,32047.0,49284,3,3430.0,2704.0,1007.6,21.7,16.8,52.5,7.1,20.1,55.4,10.9,9597.0,15117.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:17:11Z,14,0,100.0,16.2,59.3,1.550,123.00,1.550,1.2999,-0.8442,1006.10,8.80,90.10,7.30,3133378,242,29152.0,32551.0,49285,3,3446.0,2719.0,1007.5,21.7,16.8,52.5,7.1,20.1,55.4,10.9,9722.0,15355.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:17:21Z,14,0,100.0,16.2,59.3,0.750,127.00,0.750,0.5990,-0.4514,1006.10,8.80,90.10,7.30,3133388,242,28679.0,31968.0,49286,3,3432.0,2706.0,1007.4,21.7,16.8,52.6,7.1,20.1,55.4,10.9,9587.0,15086.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:17:31Z,14,0,100.0,16.2,59.3,1.330,110.00,1.330,1.2498,-0.4549,1006.10,8.80,90.10,7.30,3133398,242,28416.0,31645.0,49287,3,3486.0,2728.0,1007.4,21.7,16.8,52.6,7.1,20.1,55.4,10.9,9845.0,15606.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:17:41Z,14,0,100.0,16.2,59.3,0.640,203.00,0.640,-0.2501,-0.5891,1006.10,8.80,90.10,7.30,3133408,242,28001.0,31137.0,49288,3,3461.0,2714.0,1007.4,21.7,16.8,52.6,7.1,20.1,55.4,10.9,9662.0,15155.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:17:51Z,14,0,100.0,16.2,59.3,2.390,145.00,2.390,1.3708,-1.9578,1006.10,8.80,90.10,7.40,3133418,242,27570.0,30610.0,49289,3,3445.0,2719.0,1007.4,21.7,16.8,52.6,7.1,20.1,55.4,10.9,9427.0,14503.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:18:01Z,14,0,100.0,16.2,59.4,1.690,125.00,1.690,1.3844,-0.9693,1006.10,8.80,90.10,7.40,3133428,242,26547.0,29365.0,49290,3,3470.0,2713.0,1007.5,21.7,16.8,52.6,7.1,20.1,55.4,10.9,9462.0,14559.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:18:11Z,14,0,100.0,16.2,59.4,2.190,104.00,2.190,2.1249,-0.5298,1006.10,8.80,90.10,7.40,3133438,242,26759.0,29623.0,49291,3,3413.0,2704.0,1007.4,21.7,16.8,52.6,7.0,20.1,55.4,10.9,9088.0,13747.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:18:21Z,14,0,100.0,16.1,59.3,1.980,127.00,1.980,1.5813,-1.1916,1006.10,8.80,90.10,7.40,3133448,242,25037.0,27544.0,49292,3,3425.0,2708.0,1007.5,21.8,16.8,52.6,7.1,20.1,55.5,10.9,8779.0,13006.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:18:31Z,14,0,100.0,16.1,59.4,0.760,107.00,0.760,0.7268,-0.2222,1006.10,8.80,90.10,7.40,3133458,242,25749.0,28401.0,49293,3,3445.0,2719.0,1007.4,21.7,16.8,52.7,7.1,20.1,55.5,10.9,9021.0,13545.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:18:41Z,14,0,100.0,16.1,59.4,1.190,100.00,1.190,1.1719,-0.2066,1006.10,8.80,90.10,7.40,3133468,242,24454.0,26845.0,49294,3,3457.0,2703.0,1007.4,21.7,16.8,52.7,7.1,20.1,55.5,10.9,8994.0,13360.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:18:51Z,14,0,100.0,16.1,59.4,0.580,97.00,0.580,0.5757,-0.0707,1006.10,8.80,90.10,7.40,3133478,242,23728.0,25980.0,49295,3,3476.0,2719.0,1007.5,21.7,16.8,52.7,7.0,20.1,55.5,10.9,8891.0,13014.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:19:01Z,14,0,100.0,16.2,59.3,1.470,81.00,1.470,1.4519,0.2300,1006.10,8.80,90.10,7.40,3133488,242,25406.0,27987.0,49296,3,3430.0,2717.0,1007.3,21.7,16.8,52.7,7.1,20.0,55.5,10.8,8879.0,13126.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:19:11Z,14,0,100.0,16.1,59.4,0.950,144.00,0.950,0.5584,-0.7686,1006.10,8.80,90.10,7.40,3133498,242,21382.0,23210.0,49297,3,3450.0,2714.0,1007.3,21.7,16.8,52.7,7.1,20.1,55.5,10.9,8198.0,11404.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:19:21Z,14,0,100.0,16.1,59.4,1.070,107.00,1.070,1.0232,-0.3128,1006.10,8.90,90.10,7.40,3133509,242,22286.0,24272.0,49298,3,3422.0,2704.0,1007.5,21.7,16.7,52.7,7.0,20.1,55.5,10.9,8261.0,11593.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:19:31Z,14,0,100.0,16.1,59.5,1.430,73.00,1.430,1.3675,0.4181,1006.00,8.90,90.10,7.40,3133519,242,22779.0,24854.0,49299,3,3444.0,2721.0,1007.4,21.7,16.7,52.7,7.0,20.1,55.5,10.9,8419.0,11933.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:19:41Z,14,0,100.0,16.1,59.4,1.010,144.00,1.010,0.5937,-0.8171,1006.00,8.90,90.10,7.40,3133529,242,21635.0,23507.0,49300,3,3470.0,2713.0,1007.4,21.7,16.8,52.7,7.1,20.1,55.6,10.9,8387.0,11866.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:19:51Z,14,0,100.0,16.1,59.5,1.050,121.00,1.050,0.9000,-0.5408,1006.00,8.90,90.10,7.40,3133539,242,22710.0,24772.0,49301,3,3451.0,2726.0,1007.4,21.7,16.8,52.7,7.1,20.1,55.6,10.9,8368.0,11929.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:20:01Z,14,0,100.0,16.1,59.5,1.600,111.00,1.600,1.4937,-0.5734,1006.10,8.90,90.10,7.40,3133549,242,24165.0,26500.0,49302,3,3473.0,2725.0,1007.3,21.7,16.8,52.8,7.1,20.1,55.5,10.9,8898.0,13098.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:20:11Z,14,0,100.0,16.1,59.5,1.920,127.00,1.920,1.5334,-1.1555,1006.10,8.90,90.00,7.40,3133559,242,24300.0,26661.0,49303,3,3408.0,2704.0,1007.4,21.7,16.8,52.7,7.1,20.0,55.5,10.9,8575.0,12395.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:20:21Z,14,0,100.0,16.1,59.5,1.300,119.00,1.300,1.1370,-0.6303,1006.00,8.90,90.00,7.40,3133569,242,22965.0,25074.0,49304,3,3466.0,2713.0,1007.5,21.7,16.8,52.8,7.1,20.1,55.6,10.9,8678.0,12528.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:20:31Z,14,0,100.0,16.1,59.5,2.660,128.00,2.660,2.0961,-1.6377,1006.00,8.80,90.00,7.40,3133579,242,22117.0,24073.0,49305,3,3451.0,2721.0,1007.4,21.7,16.7,52.8,7.0,20.0,55.6,10.9,8347.0,11698.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:20:41Z,14,0,100.0,16.1,59.5,1.250,120.00,1.250,1.0825,-0.6250,1006.00,8.80,90.00,7.40,3133589,242,20528.0,22213.0,49306,3,3477.0,2722.0,1007.3,21.7,16.7,52.8,7.0,20.0,55.6,10.8,8070.0,11231.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:20:51Z,14,0,100.0,16.1,59.5,1.920,115.00,1.920,1.7401,-0.8114,1006.00,8.80,89.90,7.30,3133599,242,21102.0,22883.0,49307,3,3411.0,2706.0,1007.3,21.7,16.7,52.8,7.0,20.0,55.6,10.9,7796.0,10780.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:21:01Z,14,0,100.0,16.1,59.5,1.680,115.00,1.680,1.5226,-0.7100,1006.00,8.80,89.90,7.30,3133609,242,21024.0,22792.0,49308,3,3425.0,2708.0,1007.4,21.7,16.7,52.8,7.0,20.0,55.6,10.8,7887.0,10922.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:21:11Z,14,0,100.0,16.1,59.6,1.950,121.00,1.950,1.6715,-1.0043,1006.00,8.80,89.90,7.30,3133619,242,21310.0,23126.0,49309,3,3444.0,2719.0,1007.3,21.7,16.7,52.8,7.1,20.0,55.6,10.9,8077.0,11196.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:21:21Z,14,0,100.0,16.1,59.6,1.630,91.00,1.630,1.6298,-0.0284,1006.00,8.80,90.00,7.30,3133629,242,20845.0,22583.0,49310,3,3456.0,2711.0,1007.3,21.7,16.7,52.8,7.0,20.0,55.5,10.8,8092.0,11253.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:21:31Z,14,0,100.0,16.1,59.5,1.850,132.00,1.850,1.3748,-1.2379,1006.00,8.80,90.00,7.30,3133639,242,20547.0,22235.0,49311,3,3435.0,2699.0,1007.4,21.7,16.7,52.8,7.0,20.0,55.6,10.8,7959.0,10957.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:21:41Z,14,0,100.0,16.1,59.5,0.940,127.00,0.940,0.7507,-0.5657,1006.00,8.80,90.00,7.30,3133649,242,20592.0,22288.0,49312,3,3456.0,2706.0,1007.3,21.6,16.7,52.8,7.0,20.0,55.6,10.8,8046.0,11191.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:21:52Z,14,0,100.0,16.1,59.5,1.040,111.00,1.040,0.9709,-0.3727,1006.00,8.80,90.00,7.30,3133659,242,21184.0,22979.0,49313,3,3447.0,2721.0,1007.4,21.6,16.7,52.8,7.0,20.0,55.6,10.8,8066.0,11144.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:22:02Z,14,0,100.0,16.1,59.5,1.630,128.00,1.630,1.2845,-1.0035,1006.00,8.80,90.00,7.30,3133669,242,20672.0,22381.0,49314,3,3428.0,2717.0,1007.3,21.6,16.7,52.9,7.0,19.9,55.6,10.8,7770.0,10650.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:22:12Z,14,0,100.0,16.1,59.5,1.990,108.00,1.990,1.8926,-0.6149,1006.00,8.80,90.00,7.30,3133680,242,21567.0,23427.0,49315,3,3471.0,2721.0,1007.3,21.6,16.7,52.9,7.0,20.0,55.6,10.8,8304.0,11721.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:22:22Z,14,0,100.0,16.1,59.6,1.190,115.00,1.190,1.0785,-0.5029,1006.00,8.80,90.10,7.40,3133690,242,21241.0,23045.0,49316,3,3473.0,2721.0,1007.3,21.6,16.7,52.9,7.0,20.0,55.6,10.8,8249.0,11574.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:22:32Z,14,0,100.0,16.1,59.5,1.050,102.00,1.050,1.0271,-0.2183,1006.00,8.80,90.10,7.40,3133700,242,19481.0,20999.0,49317,3,3431.0,2703.0,1007.3,21.6,16.7,52.9,7.0,20.0,55.6,10.8,7560.0,10277.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:22:42Z,14,0,100.0,16.1,59.5,1.150,129.00,1.150,0.8937,-0.7237,1006.00,8.80,90.10,7.40,3133710,242,22975.0,25086.0,49318,3,3452.0,2717.0,1007.5,21.6,16.7,52.9,7.0,20.0,55.7,10.8,8474.0,12234.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:22:52Z,14,0,100.0,16.1,59.6,0.560,151.00,0.560,0.2715,-0.4898,1006.00,8.80,90.10,7.40,3133720,242,23090.0,25222.0,49319,3,3479.0,2722.0,1007.4,21.6,16.7,52.9,7.0,20.0,55.6,10.8,8723.0,12664.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:23:02Z,14,0,100.0,16.1,59.6,0.570,136.00,0.570,0.3960,-0.4100,1006.00,8.80,90.10,7.40,3133730,242,22741.0,24809.0,49320,3,3470.0,2719.0,1007.3,21.6,16.7,52.9,7.0,20.0,55.7,10.8,8564.0,12376.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:23:12Z,14,0,100.0,16.1,59.6,0.400,78.00,0.400,0.3913,0.0832,1006.00,8.80,90.10,7.40,3133740,242,23049.0,25174.0,49321,3,3540.0,2738.0,1007.3,21.5,16.7,52.9,7.0,19.9,55.7,10.8,9239.0,13395.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:23:22Z,14,0,100.0,16.1,59.6,0.590,345.00,0.590,-0.1527,0.5699,1006.00,8.80,90.10,7.40,3133750,242,23077.0,25207.0,49322,3,3474.0,2717.0,1007.5,21.6,16.7,52.9,7.0,20.0,55.6,10.8,8727.0,12656.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:23:32Z,14,0,100.0,16.0,59.6,0.390,77.00,0.390,0.3800,0.0877,1006.00,8.80,90.10,7.40,3133760,242,24440.0,26829.0,49323,3,3426.0,2711.0,1007.4,21.6,16.7,53.0,7.0,19.9,55.6,10.8,8752.0,12661.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:23:42Z,14,0,100.0,16.1,59.7,0.810,100.00,0.810,0.7977,-0.1407,1006.00,8.80,90.10,7.40,3133770,242,22428.0,24440.0,49324,3,3479.0,2716.0,1007.4,21.6,16.7,53.0,7.0,19.9,55.7,10.8,8645.0,12399.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:23:52Z,14,0,100.0,16.1,59.6,0.630,120.00,0.630,0.5456,-0.3150,1006.00,8.80,90.10,7.40,3133780,242,24053.0,26367.0,49325,3,3452.0,2713.0,1007.5,21.6,16.7,53.0,7.0,19.9,55.7,10.8,8808.0,12878.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:24:02Z,14,0,100.0,16.0,59.7,1.510,38.00,1.510,0.9296,1.1899,1006.00,8.80,90.10,7.40,3133790,242,25643.0,28273.0,49326,3,3435.0,2707.0,1007.3,21.6,16.7,53.0,7.0,19.9,55.7,10.8,9023.0,13527.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:24:12Z,14,0,100.0,16.0,59.7,0.970,62.00,0.970,0.8565,0.4554,1006.00,8.80,90.10,7.40,3133800,242,23773.0,26033.0,49327,3,3468.0,2719.0,1007.3,21.6,16.7,53.0,7.0,19.9,55.7,10.8,8781.0,12903.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:24:22Z,14,0,100.0,16.0,59.7,1.120,76.00,1.120,1.0867,0.2710,1006.00,8.80,90.00,7.40,3133810,242,28466.0,31707.0,49328,3,3412.0,2706.0,1007.3,21.6,16.6,53.0,7.0,19.9,55.8,10.8,9326.0,14562.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:24:32Z,14,0,100.0,16.0,59.8,0.740,85.00,0.740,0.7372,0.0645,1006.00,8.90,90.10,7.40,3133820,242,27490.0,30512.0,49329,3,3425.0,2708.0,1007.4,21.6,16.7,53.0,7.0,19.9,55.7,10.8,9320.0,14281.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:24:42Z,14,0,100.0,16.0,59.8,0.460,98.00,0.460,0.4555,-0.0640,1006.00,8.90,90.10,7.40,3133831,242,27128.0,30071.0,49330,3,3470.0,2719.0,1007.5,21.6,16.7,53.0,7.0,19.9,55.7,10.8,9465.0,14760.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:24:52Z,14,0,100.0,16.0,59.8,0.260,261.00,0.260,-0.2568,-0.0407,1006.00,8.90,90.10,7.40,3133841,242,28139.0,31306.0,49331,3,3484.0,2730.0,1007.3,21.6,16.6,53.0,7.0,19.9,55.7,10.8,9797.0,15374.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:25:02Z,14,0,100.0,16.0,59.8,0.300,83.00,0.300,0.2978,0.0366,1006.00,8.90,90.00,7.40,3133851,242,27134.0,30079.0,49332,3,3484.0,2716.0,1007.4,21.6,16.6,53.0,7.0,19.9,55.8,10.8,9655.0,15099.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:25:12Z,14,0,100.0,16.0,59.9,0.420,130.00,0.420,0.3217,-0.2700,1006.00,8.90,90.10,7.40,3133861,242,27929.0,31049.0,49333,3,3445.0,2719.0,1007.5,21.6,16.6,53.1,7.0,19.9,55.7,10.8,9436.0,14690.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:25:22Z,14,0,100.0,16.0,59.8,0.880,125.00,0.880,0.7209,-0.5047,1006.00,8.90,90.00,7.40,3133871,242,29733.0,33269.0,49334,3,3427.0,2703.0,1007.5,21.6,16.6,53.1,7.0,19.9,55.8,10.8,9794.0,15596.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:25:32Z,14,0,100.0,16.0,59.8,0.950,114.00,0.950,0.8679,-0.3864,1006.00,8.90,90.00,7.40,3133881,242,30471.0,34184.0,49335,3,3446.0,2718.0,1007.4,21.6,16.6,53.1,7.0,19.9,55.7,10.8,9981.0,16073.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:25:42Z,14,0,100.0,16.0,59.9,0.660,47.00,0.660,0.4827,0.4501,1006.00,8.90,90.00,7.40,3133891,242,29115.0,32505.0,49336,3,3446.0,2713.0,1007.3,21.6,16.6,53.1,7.0,19.9,55.8,10.8,9750.0,15464.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:25:52Z,14,0,100.0,16.0,59.8,0.700,104.00,0.700,0.6792,-0.1693,1006.00,8.90,90.00,7.40,3133901,242,27368.0,30364.0,49337,3,3451.0,2718.0,1007.4,21.6,16.6,53.1,7.0,19.9,55.7,10.8,9403.0,14536.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:26:02Z,14,0,100.0,16.0,59.8,0.940,107.00,0.940,0.8989,-0.2748,1006.00,8.90,90.00,7.40,3133911,242,32173.0,36313.0,49338,3,3471.0,2718.0,1007.3,21.6,16.6,53.1,7.0,19.9,55.7,10.8,10271.0,17556.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:26:12Z,14,0,100.0,16.0,59.9,1.820,121.00,1.820,1.5600,-0.9374,1006.00,8.90,90.00,7.40,3133921,242,38379.0,44270.0,49339,3,3469.0,2718.0,1007.3,21.6,16.6,53.1,7.0,19.9,55.7,10.8,10961.0,20885.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:26:22Z,14,0,100.0,16.0,59.9,1.060,94.00,1.060,1.0574,-0.0739,1006.00,8.90,90.00,7.40,3133931,242,38736.0,44737.0,49340,3,3454.0,2708.0,1007.4,21.6,16.6,53.1,7.0,19.9,55.8,10.8,10938.0,20938.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:26:32Z,14,0,100.0,16.0,59.9,1.100,102.00,1.100,1.0760,-0.2287,1006.00,8.90,90.00,7.40,3133941,242,42376.0,49558.0,49341,3,3474.0,2717.0,1007.3,21.6,16.6,53.1,7.0,19.9,55.8,10.8,11422.0,23245.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:26:42Z,14,0,100.0,16.0,59.9,0.810,95.00,0.810,0.8069,-0.0706,1006.00,8.90,90.00,7.40,3133951,242,40277.0,46765.0,49342,3,3469.0,2715.0,1007.4,21.6,16.6,53.1,7.0,19.9,55.9,10.8,11226.0,22003.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:26:52Z,14,0,100.0,16.0,59.9,0.550,123.00,0.550,0.4613,-0.2996,1006.00,8.90,90.00,7.40,3133961,242,38661.0,44639.0,49343,3,3417.0,2700.0,1007.4,21.6,16.6,53.1,7.0,19.9,55.8,10.8,10783.0,20085.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:27:02Z,14,0,100.0,16.0,59.9,0.310,15.00,0.310,0.0802,0.2994,1006.00,8.90,90.00,7.40,3133971,242,35225.0,40188.0,49344,3,3469.0,2714.0,1007.3,21.6,16.6,53.1,7.0,19.9,55.9,10.8,10665.0,19271.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:27:12Z,14,0,100.0,16.0,59.9,2.350,134.00,2.350,1.6904,-1.6324,1006.00,8.90,90.00,7.40,3133981,242,38318.0,44191.0,49345,3,3419.0,2704.0,1007.2,21.5,16.6,53.2,7.0,19.9,55.9,10.8,10643.0,19854.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:27:22Z,14,0,100.0,16.0,59.9,2.290,130.00,2.290,1.7542,-1.4720,1006.00,8.90,89.90,7.40,3133991,242,45074.0,53200.0,49346,3,3440.0,2716.0,1007.4,21.6,16.6,53.2,7.0,19.9,55.9,10.8,11249.0,23645.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:27:32Z,14,0,100.0,16.0,59.9,2.260,112.00,2.260,2.0954,-0.8466,1006.00,8.90,89.90,7.40,3134002,242,41448.0,48319.0,49347,3,3462.0,2711.0,1007.2,21.6,16.6,53.2,7.0,19.9,55.9,10.8,11124.0,22558.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:27:42Z,14,0,100.0,16.0,60.0,2.560,145.00,2.560,1.4684,-2.0970,1006.00,8.90,89.90,7.40,3134012,242,43217.0,50687.0,49348,3,3491.0,2729.0,1007.4,21.6,16.6,53.2,7.0,19.9,55.9,10.8,11414.0,23861.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:27:52Z,14,0,100.0,16.0,60.0,1.150,108.00,1.150,1.0937,-0.3554,1006.00,8.90,89.90,7.40,3134022,242,43625.0,51237.0,49349,3,3483.0,2721.0,1007.3,21.6,16.6,53.2,7.0,19.9,55.9,10.8,11605.0,24089.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:28:02Z,14,0,100.0,16.0,59.9,0.570,70.00,0.570,0.5356,0.1950,1006.00,8.90,89.90,7.40,3134032,242,42521.0,49753.0,49350,3,3464.0,2716.0,1007.3,21.6,16.6,53.2,7.0,19.9,55.9,10.8,11074.0,23047.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:28:12Z,14,0,100.0,16.0,60.0,1.110,76.00,1.110,1.0770,0.2685,1006.00,8.80,89.90,7.40,3134042,242,46631.0,55328.0,49351,3,3433.0,2708.0,1007.3,21.6,16.6,53.2,7.0,19.8,55.9,10.8,11244.0,24498.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:28:22Z,14,0,100.0,16.0,60.0,1.920,125.00,1.920,1.5728,-1.1013,1006.00,8.80,89.90,7.40,3134052,242,47593.0,56653.0,49352,3,3451.0,2724.0,1007.5,21.6,16.6,53.2,7.0,19.9,55.9,10.8,11303.0,25068.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:28:32Z,14,0,100.0,16.0,60.0,1.840,120.00,1.840,1.5935,-0.9200,1006.00,8.80,89.90,7.30,3134062,242,46034.0,54510.0,49353,3,3436.0,2716.0,1007.4,21.6,16.6,53.2,7.0,19.8,55.9,10.7,11214.0,24016.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:28:42Z,14,0,100.0,16.0,59.9,1.420,143.00,1.420,0.8546,-1.1341,1006.00,8.80,89.90,7.30,3134072,242,43952.0,51679.0,49354,3,3449.0,2721.0,1007.3,21.6,16.6,53.2,7.0,19.8,55.9,10.8,11193.0,23186.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:28:52Z,14,0,100.0,16.0,60.0,1.050,126.00,1.050,0.8495,-0.6172,1006.00,8.80,89.90,7.30,3134082,242,41887.0,48905.0,49355,3,3463.0,2720.0,1007.3,21.5,16.6,53.2,7.0,19.8,55.9,10.8,11055.0,22553.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:29:02Z,14,0,100.0,16.0,60.0,0.600,121.00,0.600,0.5143,-0.3090,1006.00,8.80,90.00,7.30,3134092,242,40536.0,47108.0,49356,3,3442.0,2703.0,1007.3,21.5,16.6,53.3,7.0,19.8,55.9,10.8,10889.0,21707.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:29:12Z,14,0,100.0,16.0,60.0,0.890,107.00,0.890,0.8511,-0.2602,1006.00,8.80,90.00,7.40,3134102,242,44209.0,52026.0,49357,3,3437.0,2709.0,1007.3,21.5,16.6,53.3,7.0,19.8,55.9,10.8,11292.0,23322.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:29:22Z,14,0,100.0,16.0,60.0,0.700,95.00,0.700,0.6973,-0.0610,1006.00,8.80,90.00,7.40,3134112,242,43519.0,51094.0,49358,3,3451.0,2723.0,1007.5,21.5,16.6,53.3,7.0,19.8,55.9,10.8,11114.0,22954.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:29:32Z,14,0,100.0,16.0,60.0,1.590,104.00,1.590,1.5428,-0.3847,1006.00,8.80,90.00,7.40,3134122,242,41908.0,48933.0,49359,3,3475.0,2719.0,1007.3,21.5,16.6,53.3,7.0,19.8,55.9,10.7,11284.0,22959.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:29:42Z,14,0,100.0,16.0,60.0,1.240,101.00,1.240,1.2172,-0.2366,1006.00,8.80,90.00,7.40,3134132,242,41933.0,48966.0,49360,3,3462.0,2716.0,1007.4,21.5,16.6,53.3,7.0,19.8,55.9,10.8,11076.0,22666.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:29:52Z,14,0,100.0,16.0,60.0,1.500,115.00,1.500,1.3595,-0.6339,1006.00,8.90,90.00,7.40,3134142,242,42479.0,49696.0,49361,3,3473.0,2717.0,1007.3,21.5,16.6,53.3,7.0,19.8,55.9,10.8,11347.0,23270.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:30:02Z,14,0,100.0,16.0,60.0,1.370,83.00,1.370,1.3598,0.1670,1006.00,8.80,90.00,7.40,3134152,242,41724.0,48687.0,49362,3,3419.0,2706.0,1007.5,21.5,16.6,53.3,7.0,19.8,55.9,10.7,10861.0,21552.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:30:12Z,14,0,100.0,16.0,60.0,1.280,63.00,1.280,1.1405,0.5811,1006.10,8.90,90.00,7.40,3134163,242,39545.0,45800.0,49363,3,3474.0,2717.0,1007.4,21.5,16.6,53.3,7.0,19.8,55.9,10.8,11077.0,21690.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:30:22Z,14,0,100.0,16.0,60.0,0.940,69.00,0.940,0.8776,0.3369,1006.10,8.90,90.00,7.40,3134173,242,39382.0,45585.0,49364,3,3426.0,2708.0,1007.4,21.5,16.5,53.4,7.0,19.8,55.9,10.7,10658.0,20488.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:30:32Z,14,0,100.0,16.0,60.1,0.390,65.00,0.390,0.3535,0.1648,1006.10,8.90,90.00,7.40,3134183,242,39938.0,46318.0,49365,3,3466.0,2712.0,1007.5,21.5,16.5,53.3,7.0,19.8,56.0,10.8,11085.0,21817.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:30:42Z,14,0,100.0,16.0,60.1,0.620,39.00,0.620,0.3902,0.4818,1006.10,8.90,90.10,7.40,3134193,242,42621.0,49887.0,49366,3,3447.0,2719.0,1007.6,21.5,16.6,53.3,7.0,19.8,56.0,10.8,11134.0,22478.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:30:52Z,14,0,100.0,15.9,60.2,0.230,17.00,0.230,0.0672,0.2200,1006.10,8.90,90.00,7.40,3134203,242,41935.0,48969.0,49367,3,3468.0,2712.0,1007.6,21.5,16.5,53.3,7.0,19.8,56.0,10.8,11209.0,22966.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:31:02Z,14,0,100.0,15.9,60.2,0.440,73.00,0.440,0.4208,0.1286,1006.10,8.90,90.00,7.40,3134213,242,43127.0,50566.0,49368,3,3416.0,2702.0,1007.5,21.5,16.5,53.4,7.0,19.8,56.0,10.8,11093.0,22308.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:31:12Z,14,0,100.0,15.9,60.2,1.010,59.00,1.010,0.8657,0.5202,1006.20,8.90,90.00,7.40,3134223,242,41604.0,48527.0,49369,3,3428.0,2702.0,1007.6,21.5,16.5,53.4,7.0,19.8,56.0,10.7,11088.0,21881.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:31:22Z,14,0,100.0,15.9,60.2,1.320,56.00,1.320,1.0943,0.7381,1006.20,8.90,90.00,7.40,3134233,242,42889.0,50246.0,49370,3,3445.0,2718.0,1007.5,21.5,16.5,53.4,7.0,19.8,55.9,10.7,11291.0,22590.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:31:32Z,14,0,100.0,15.9,60.2,1.280,51.00,1.280,0.9947,0.8055,1006.20,8.90,90.00,7.40,3134243,242,34430.0,39171.0,49371,3,3432.0,2706.0,1007.7,21.5,16.5,53.4,7.0,19.8,56.0,10.7,10469.0,18106.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:31:42Z,14,0,100.0,15.9,60.2,0.920,77.00,0.920,0.8964,0.2070,1006.20,8.90,90.00,7.40,3134253,242,32527.0,36759.0,49372,3,3451.0,2714.0,1007.6,21.5,16.5,53.4,7.0,19.8,56.0,10.8,10375.0,17365.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:31:52Z,14,0,100.0,15.9,60.2,1.000,78.00,1.000,0.9781,0.2079,1006.30,8.90,90.00,7.40,3134263,242,37099.0,42604.0,49373,3,3430.0,2716.0,1007.5,21.5,16.5,53.4,7.0,19.7,56.0,10.7,10637.0,19190.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:32:02Z,14,0,100.0,15.9,60.3,0.830,16.00,0.830,0.2288,0.7978,1006.30,8.90,90.00,7.40,3134273,242,38732.0,44732.0,49374,3,3451.0,2714.0,1007.5,21.5,16.5,53.4,7.0,19.8,56.0,10.7,10868.0,20680.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:32:12Z,14,0,100.0,15.9,60.3,0.780,9.00,0.780,0.1220,0.7704,1006.30,8.90,90.00,7.40,3134283,242,37182.0,42712.0,49375,3,3461.0,2712.0,1007.6,21.5,16.5,53.4,7.0,19.8,56.0,10.7,10853.0,20174.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:32:22Z,14,0,100.0,15.9,60.3,0.760,38.00,0.760,0.4679,0.5989,1006.30,8.90,90.00,7.40,3134293,242,36932.0,42387.0,49376,3,3412.0,2698.0,1007.7,21.5,16.5,53.4,7.0,19.8,56.0,10.7,10482.0,19100.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:32:32Z,14,0,100.0,15.9,60.3,1.460,4.00,1.460,0.1018,1.4564,1006.30,8.90,90.00,7.40,3134303,242,39850.0,46202.0,49377,3,3428.0,2703.0,1007.7,21.5,16.5,53.4,7.0,19.8,56.0,10.7,11020.0,20927.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:32:42Z,14,0,100.0,15.9,60.3,0.840,7.00,0.840,0.1024,0.8337,1006.30,8.90,90.00,7.40,3134313,242,31197.0,35090.0,49378,3,3445.0,2719.0,1007.7,21.5,16.5,53.4,7.0,19.8,56.0,10.7,9990.0,16406.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:32:52Z,14,0,100.0,15.9,60.4,0.930,349.00,0.930,-0.1775,0.9129,1006.30,8.80,90.00,7.40,3134323,242,23770.0,26030.0,49379,3,3471.0,2712.0,1007.7,21.5,16.5,53.4,7.0,19.7,56.0,10.7,8891.0,13069.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:33:02Z,14,0,100.0,16.0,60.3,0.870,327.00,0.870,-0.4738,0.7296,1006.30,8.80,90.00,7.30,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan, +2026-04-17T00:33:12Z,14,0,100.0,15.9,60.3,0.890,85.00,0.890,0.8866,0.0776,1006.30,8.80,90.00,7.40,3134334,242,18651.0,20042.0,49380,3,3428.0,2709.0,1007.8,21.5,16.5,53.5,7.0,19.8,56.0,10.7,7322.0,9713.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:33:22Z,14,0,100.0,15.9,60.4,1.630,97.00,1.630,1.6179,-0.1986,1006.30,8.80,90.00,7.30,3134344,242,20935.0,22688.0,49381,3,3444.0,2712.0,1007.6,21.5,16.5,53.5,7.0,19.7,56.1,10.7,8035.0,11101.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:33:32Z,14,0,100.0,15.9,60.4,1.150,45.00,1.150,0.8132,0.8132,1006.40,8.80,90.10,7.30,3134354,242,16151.0,17194.0,49382,3,3446.0,2719.0,1007.8,21.5,16.5,53.5,7.0,19.7,56.1,10.7,6643.0,8504.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:33:42Z,14,0,100.0,15.9,60.4,1.400,70.00,1.400,1.3156,0.4788,1006.40,8.80,90.10,7.30,3134364,242,21860.0,23771.0,49383,3,3455.0,2709.0,1007.8,21.5,16.5,53.5,7.0,19.7,56.0,10.7,8379.0,11811.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:33:52Z,14,0,100.0,15.9,60.4,0.400,50.00,0.400,0.3064,0.2571,1006.40,8.80,90.20,7.30,3134374,242,18563.0,19941.0,49384,3,3430.0,2697.0,1007.8,21.5,16.5,53.5,7.0,19.7,56.0,10.7,7373.0,9855.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:34:02Z,14,0,100.0,15.9,60.4,0.750,359.00,0.750,-0.0131,0.7499,1006.40,8.80,90.20,7.40,3134384,242,19634.0,21175.0,49385,3,3425.0,2702.0,1007.8,21.5,16.5,53.5,7.0,19.7,56.1,10.7,7623.0,10281.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:34:12Z,14,8,100.0,0.0,0.0,1.400,22.00,1.400,0.5244,1.2981,1006.40,8.80,90.20,7.40,3134394,242,19009.0,20454.0,49386,3,3440.0,2719.0,1007.6,21.5,16.5,53.5,7.0,19.7,56.0,10.7,7435.0,9928.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:34:22Z,14,0,100.0,15.9,60.4,1.110,21.00,1.110,0.3978,1.0363,1006.40,8.80,90.20,7.30,3134404,242,29710.0,33240.0,49387,3,3426.0,2703.0,1007.8,21.5,16.5,53.5,7.0,19.7,56.1,10.7,9706.0,15557.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:34:32Z,14,0,100.0,15.9,60.4,1.890,39.00,1.890,1.1894,1.4688,1006.40,8.80,90.20,7.30,3134414,242,20602.0,22299.0,49388,3,3446.0,2721.0,1007.6,21.5,16.5,53.5,7.0,19.7,56.1,10.7,7904.0,10820.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:34:42Z,14,0,100.0,15.9,60.4,1.340,32.00,1.340,0.7101,1.1364,1006.40,8.80,90.20,7.30,3134424,242,15479.0,16437.0,49389,3,3462.0,2712.0,1007.9,21.5,16.5,53.5,7.0,19.7,56.0,10.7,6601.0,8408.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:34:52Z,14,0,100.0,15.9,60.4,2.340,10.00,2.340,0.4063,2.3045,1006.40,8.70,90.30,7.30,3134434,242,13097.0,13783.0,49390,3,3449.0,2719.0,1007.8,21.5,16.5,53.5,7.0,19.7,56.0,10.7,5682.0,6925.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:35:02Z,14,0,100.0,15.9,60.4,1.180,48.00,1.180,0.8769,0.7896,1006.40,8.70,90.40,7.30,3134444,242,11093.0,11585.0,49391,3,3464.0,2711.0,1007.8,21.5,16.5,53.5,7.0,19.7,56.0,10.7,5112.0,6050.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:35:12Z,14,0,100.0,15.9,60.4,1.620,48.00,1.620,1.2039,1.0840,1006.40,8.70,90.40,7.30,3134454,242,15943.0,16959.0,49392,3,3421.0,2706.0,1007.7,21.5,16.5,53.5,7.0,19.7,56.0,10.7,6506.0,8257.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:35:22Z,14,0,100.0,15.9,60.4,1.440,49.00,1.440,1.0868,0.9447,1006.40,8.70,90.40,7.30,3134464,242,11380.0,11898.0,49393,3,3466.0,2709.0,1007.8,21.5,16.5,53.5,7.0,19.7,56.0,10.7,5236.0,6240.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:35:32Z,14,0,100.0,15.9,60.4,2.450,57.00,2.450,2.0547,1.3344,1006.40,8.70,90.50,7.30,3134474,242,9840.0,10227.0,49394,3,3442.0,2716.0,1007.7,21.5,16.5,53.6,7.0,19.7,56.0,10.7,4476.0,5175.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:35:42Z,14,0,100.0,15.9,60.5,0.730,48.00,0.730,0.5425,0.4885,1006.40,8.70,90.60,7.30,3134484,242,8087.0,8348.0,49395,3,3425.0,2707.0,1007.8,21.4,16.5,53.6,7.0,19.7,56.0,10.7,3738.0,4206.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:35:52Z,14,0,100.0,15.9,60.5,1.850,84.00,1.850,1.8399,0.1934,1006.40,8.70,90.60,7.30,3134495,242,14319.0,15139.0,49396,3,3444.0,2714.0,1007.7,21.4,16.5,53.6,7.0,19.7,56.1,10.7,6099.0,7572.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:36:02Z,14,0,100.0,15.9,60.5,0.950,72.00,0.950,0.9035,0.2936,1006.40,8.70,90.70,7.30,3134505,242,13505.0,14234.0,49397,3,3437.0,2713.0,1007.8,21.5,16.5,53.6,7.0,19.7,56.1,10.7,5780.0,7082.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:36:12Z,14,0,100.0,15.9,60.5,0.730,100.00,0.730,0.7189,-0.1268,1006.40,8.70,90.70,7.30,3134515,242,11665.0,12209.0,49398,3,3468.0,2729.0,1007.6,21.4,16.5,53.6,7.0,19.7,56.0,10.7,5255.0,6245.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:36:22Z,14,0,100.0,15.9,60.5,0.740,119.00,0.740,0.6472,-0.3588,1006.30,8.70,90.70,7.30,3134525,242,14086.0,14879.0,49399,3,3473.0,2716.0,1007.8,21.4,16.5,53.6,7.0,19.7,56.1,10.6,6238.0,7723.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:36:32Z,14,0,100.0,15.9,60.5,0.790,94.00,0.790,0.7881,-0.0551,1006.30,8.70,90.70,7.30,3134535,242,15309.0,16246.0,49400,3,3432.0,2697.0,1007.8,21.4,16.5,53.6,7.0,19.7,56.1,10.7,6398.0,8150.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:36:42Z,14,0,100.0,15.9,60.5,1.040,81.00,1.040,1.0272,0.1627,1006.30,8.70,90.70,7.30,3134545,242,12511.0,13137.0,49401,3,3460.0,2709.0,1007.8,21.4,16.5,53.6,7.0,19.7,56.1,10.7,5596.0,6805.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:36:52Z,14,0,100.0,15.9,60.6,0.720,35.00,0.720,0.4130,0.5898,1006.30,8.70,90.70,7.30,3134555,242,9633.0,10004.0,49402,3,3416.0,2702.0,1007.7,21.4,16.5,53.6,7.0,19.7,56.1,10.7,4317.0,4982.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:37:02Z,14,0,100.0,15.9,60.6,2.030,84.00,2.030,2.0189,0.2122,1006.30,8.60,90.80,7.30,3134565,242,7862.0,8109.0,49403,3,3451.0,2700.0,1007.7,21.4,16.5,53.7,7.0,19.7,56.1,10.7,3787.0,4277.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:37:12Z,14,0,100.0,15.8,60.6,2.060,70.00,2.060,1.9358,0.7046,1006.30,8.60,90.80,7.30,3134575,242,5383.0,5498.0,49404,3,3444.0,2714.0,1007.6,21.4,16.5,53.6,7.0,19.7,56.1,10.7,2634.0,2847.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:37:22Z,14,0,100.0,15.9,60.5,1.810,86.00,1.810,1.8056,0.1263,1006.30,8.60,90.90,7.30,3134585,242,5934.0,6074.0,49405,3,3451.0,2706.0,1007.6,21.4,16.5,53.7,7.0,19.7,56.1,10.7,2934.0,3203.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:37:32Z,14,0,100.0,15.9,60.5,1.540,64.00,1.540,1.3841,0.6751,1006.30,8.60,91.00,7.30,3134595,242,6339.0,6499.0,49406,3,3428.0,2695.0,1007.7,21.4,16.5,53.7,7.0,19.7,56.1,10.7,3056.0,3366.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:37:42Z,14,0,100.0,15.9,60.5,1.670,101.00,1.670,1.6393,-0.3187,1006.30,8.60,91.00,7.30,3134605,242,6394.0,6557.0,49407,3,3425.0,2699.0,1007.6,21.4,16.4,53.7,7.0,19.7,56.1,10.7,3048.0,3363.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:37:52Z,14,0,100.0,15.9,60.5,1.300,88.00,1.300,1.2992,0.0454,1006.30,8.60,91.00,7.30,3134615,242,6180.0,6332.0,49408,3,3446.0,2717.0,1007.6,21.4,16.5,53.7,7.0,19.7,56.1,10.7,2976.0,3264.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:38:02Z,14,0,100.0,15.9,60.5,1.480,83.00,1.480,1.4690,0.1804,1006.20,8.60,91.10,7.30,3134625,242,6142.0,6292.0,49409,3,3454.0,2700.0,1007.6,21.4,16.4,53.7,7.0,19.6,56.1,10.7,3041.0,3355.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:38:12Z,14,0,100.0,15.8,60.5,1.670,81.00,1.670,1.6494,0.2612,1006.20,8.60,91.00,7.30,3134635,242,9932.0,10326.0,49410,3,3444.0,2719.0,1007.6,21.4,16.4,53.7,7.0,19.7,56.1,10.7,4500.0,5216.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:38:22Z,14,0,100.0,15.9,60.5,1.730,91.00,1.730,1.7297,-0.0302,1006.20,8.60,91.00,7.30,3134645,242,6898.0,7088.0,49411,3,3445.0,2716.0,1007.6,21.4,16.5,53.7,7.0,19.6,56.1,10.6,3299.0,3643.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:38:32Z,14,0,100.0,15.9,60.5,1.760,96.00,1.760,1.7504,-0.1840,1006.20,8.60,91.10,7.30,3134656,242,5806.0,5940.0,49412,3,3441.0,2700.0,1007.6,21.4,16.4,53.7,7.0,19.7,56.2,10.7,2853.0,3117.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:38:42Z,14,0,100.0,15.8,60.5,1.790,105.00,1.790,1.7290,-0.4633,1006.20,8.60,91.10,7.30,3134666,242,6500.0,6669.0,49413,3,3428.0,2704.0,1007.5,21.4,16.4,53.8,7.0,19.6,56.1,10.6,3085.0,3410.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:38:52Z,14,0,100.0,15.8,60.6,0.910,87.00,0.910,0.9088,0.0476,1006.20,8.60,91.10,7.30,3134676,242,6551.0,6722.0,49414,3,3485.0,2723.0,1007.5,21.4,16.4,53.7,7.0,19.7,56.1,10.7,3258.0,3617.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:39:02Z,14,0,100.0,15.8,60.5,1.030,83.00,1.030,1.0223,0.1255,1006.20,8.60,91.10,7.30,3134686,242,8077.0,8337.0,49415,3,3468.0,2718.0,1007.5,21.4,16.4,53.7,7.0,19.6,56.2,10.6,3868.0,4389.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:39:12Z,14,0,100.0,15.8,60.6,1.530,53.00,1.530,1.2219,0.9208,1006.20,8.60,91.20,7.30,3134696,242,7081.0,7281.0,49416,3,3432.0,2702.0,1007.5,21.4,16.4,53.8,7.0,19.6,56.2,10.7,3368.0,3745.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:39:22Z,14,0,100.0,15.8,60.5,2.520,60.00,2.520,2.1824,1.2600,1006.20,8.60,91.20,7.30,3134706,242,8093.0,8354.0,49417,3,3465.0,2716.0,1007.4,21.4,16.4,53.8,7.0,19.7,56.2,10.7,3872.0,4392.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:39:32Z,14,0,100.0,15.8,60.6,1.680,111.00,1.680,1.5684,-0.6021,1006.20,8.60,91.20,7.30,3134716,242,10205.0,10621.0,49418,3,3411.0,2704.0,1007.6,21.4,16.4,53.8,7.0,19.6,56.2,10.7,4498.0,5227.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:39:42Z,14,0,100.0,15.9,60.6,0.990,126.00,0.990,0.8009,-0.5819,1006.20,8.60,91.20,7.30,3134726,242,8637.0,8935.0,49419,3,3427.0,2708.0,1007.5,21.4,16.4,53.8,7.0,19.6,56.2,10.6,3949.0,4499.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:39:52Z,14,0,100.0,15.8,60.6,0.250,121.00,0.250,0.2143,-0.1288,1006.20,8.60,91.20,7.30,3134736,242,9044.0,9371.0,49420,3,3447.0,2719.0,1007.5,21.4,16.4,53.8,7.0,19.6,56.2,10.7,4155.0,4770.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:40:02Z,14,0,100.0,15.8,60.5,0.350,324.00,0.350,-0.2057,0.2832,1006.20,8.60,91.20,7.30,3134746,242,8451.0,8736.0,49421,3,3431.0,2711.0,1007.6,21.4,16.4,53.8,7.0,19.6,56.2,10.6,3885.0,4408.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:40:12Z,14,0,100.0,15.8,60.6,0.780,92.00,0.780,0.7795,-0.0272,1006.20,8.60,91.20,7.40,3134756,242,8025.0,8282.0,49422,3,3483.0,2716.0,1007.6,21.4,16.4,53.8,7.0,19.6,56.2,10.7,3937.0,4459.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:40:22Z,14,0,100.0,15.8,60.6,0.740,90.00,0.740,0.7400,0.0000,1006.20,8.60,91.30,7.40,3134766,242,8435.0,8719.0,49423,3,3481.0,2716.0,1007.5,21.4,16.4,53.8,7.0,19.6,56.2,10.7,4112.0,4675.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:40:32Z,14,0,100.0,15.8,60.6,0.560,51.00,0.560,0.4352,0.3524,1006.20,8.60,91.20,7.40,3134776,242,8208.0,8477.0,49424,3,3452.0,2708.0,1007.6,21.4,16.4,53.8,7.0,19.6,56.2,10.7,3899.0,4424.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:40:42Z,14,0,100.0,15.8,60.6,0.470,83.00,0.470,0.4665,0.0573,1006.20,8.70,91.20,7.40,3134786,242,10353.0,10781.0,49425,3,3462.0,2708.0,1007.6,21.4,16.4,53.9,7.0,19.6,56.2,10.7,4820.0,5655.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:40:52Z,14,0,100.0,15.8,60.7,0.830,114.00,0.830,0.7582,-0.3376,1006.20,8.70,91.30,7.40,3134796,242,11441.0,11964.0,49426,3,3408.0,2699.0,1007.6,21.4,16.4,53.9,7.1,19.6,56.2,10.7,4958.0,5876.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:41:02Z,14,0,100.0,15.8,60.7,0.810,71.00,0.810,0.7659,0.2637,1006.20,8.70,91.30,7.40,3134806,242,9446.0,9802.0,49427,3,3423.0,2703.0,1007.6,21.4,16.4,53.9,7.0,19.6,56.3,10.6,4275.0,4927.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:41:12Z,14,0,100.0,15.8,60.7,0.490,341.00,0.490,-0.1595,0.4633,1006.20,8.70,91.30,7.40,3134816,242,10704.0,11162.0,49428,3,3437.0,2721.0,1007.5,21.4,16.4,53.9,7.0,19.6,56.3,10.7,4744.0,5553.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:41:22Z,14,0,100.0,15.8,60.7,0.750,75.00,0.750,0.7244,0.1941,1006.20,8.70,91.20,7.40,3134827,242,12662.0,13303.0,49429,3,3438.0,2716.0,1007.6,21.4,16.4,53.9,7.0,19.6,56.3,10.6,5475.0,6623.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:41:32Z,14,0,100.0,15.8,60.7,1.720,74.00,1.720,1.6534,0.4741,1006.20,8.70,91.30,7.40,3134837,242,10680.0,11136.0,49430,3,3425.0,2719.0,1007.4,21.4,16.4,53.9,7.0,19.6,56.3,10.7,4679.0,5463.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:41:42Z,14,0,100.0,15.8,60.7,1.380,62.00,1.380,1.2185,0.6479,1006.20,8.70,91.30,7.40,3134847,242,11141.0,11637.0,49431,3,3462.0,2713.0,1007.6,21.4,16.4,53.9,7.0,19.6,56.3,10.7,5097.0,6045.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:41:52Z,14,0,100.0,15.8,60.7,0.760,59.00,0.760,0.6514,0.3914,1006.20,8.70,91.30,7.40,3134857,242,9405.0,9758.0,49432,3,3437.0,2719.0,1007.4,21.4,16.4,53.9,7.0,19.6,56.3,10.7,4278.0,4893.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:42:02Z,14,0,100.0,15.8,60.7,1.660,49.00,1.660,1.2528,1.0891,1006.20,8.70,91.20,7.40,3134867,242,9012.0,9336.0,49433,3,3425.0,2706.0,1007.6,21.3,16.4,53.9,7.0,19.6,56.3,10.7,4101.0,4694.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:42:12Z,14,0,100.0,15.8,60.7,1.440,101.00,1.440,1.4135,-0.2748,1006.20,8.70,91.30,7.40,3134877,242,7443.0,7664.0,49434,3,3475.0,2719.0,1007.5,21.3,16.4,53.9,7.0,19.6,56.4,10.7,3629.0,4077.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:42:22Z,14,0,100.0,15.8,60.7,1.440,87.00,1.440,1.4380,0.0754,1006.20,8.70,91.30,7.40,3134887,242,8006.0,8262.0,49435,3,3447.0,2709.0,1007.5,21.3,16.4,53.9,7.0,19.6,56.4,10.7,3793.0,4281.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:42:32Z,14,0,100.0,15.8,60.7,0.560,349.00,0.560,-0.1069,0.5497,1006.20,8.70,91.30,7.40,3134897,242,7553.0,7781.0,49436,3,3426.0,2700.0,1007.5,21.3,16.4,54.0,7.0,19.6,56.3,10.7,3540.0,3973.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:42:42Z,14,0,100.0,15.8,60.7,1.000,74.00,1.000,0.9613,0.2756,1006.20,8.70,91.30,7.40,3134907,242,15158.0,16077.0,49437,3,3462.0,2719.0,1007.4,21.3,16.4,54.0,7.1,19.6,56.3,10.7,6442.0,8160.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:42:52Z,14,0,100.0,15.8,60.7,1.870,66.00,1.870,1.7083,0.7606,1006.20,8.70,91.30,7.40,3134917,242,12915.0,13582.0,49438,3,3417.0,2707.0,1007.4,21.3,16.4,54.0,7.0,19.6,56.4,10.7,5483.0,6644.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:43:02Z,14,0,100.0,15.8,60.8,2.310,58.00,2.310,1.9590,1.2241,1006.20,8.60,91.40,7.40,3134927,242,8292.0,8567.0,49439,3,3455.0,2708.0,1007.7,21.3,16.4,54.0,7.0,19.6,56.4,10.7,3952.0,4487.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:43:12Z,14,0,100.0,15.8,60.8,0.880,44.00,0.880,0.6113,0.6330,1006.20,8.60,91.40,7.40,3134937,242,8093.0,8354.0,49440,3,3443.0,2719.0,1007.5,21.3,16.4,54.0,7.0,19.6,56.3,10.6,3766.0,4245.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:43:22Z,14,0,100.0,15.8,60.8,1.110,71.00,1.110,1.0495,0.3614,1006.20,8.60,91.40,7.40,3134947,242,8921.0,9239.0,49441,3,3459.0,2709.0,1007.7,21.3,16.4,54.0,7.0,19.6,56.3,10.7,4221.0,4847.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:43:32Z,14,0,100.0,15.8,60.8,2.060,65.00,2.060,1.8670,0.8706,1006.20,8.60,91.40,7.40,3134957,242,7941.0,8193.0,49442,3,3464.0,2723.0,1007.6,21.3,16.4,54.0,7.0,19.6,56.3,10.6,3798.0,4263.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:43:42Z,14,0,100.0,15.8,60.8,1.760,39.00,1.760,1.1076,1.3678,1006.20,8.60,91.40,7.40,3134967,242,8368.0,8648.0,49443,3,3447.0,2699.0,1007.7,21.3,16.4,54.0,7.0,19.6,56.3,10.6,3993.0,4534.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:43:52Z,14,0,100.0,15.8,60.8,2.120,84.00,2.120,2.1084,0.2216,1006.20,8.60,91.40,7.40,3134977,242,8180.0,8447.0,49444,3,3442.0,2717.0,1007.5,21.3,16.4,54.0,7.0,19.6,56.4,10.7,3804.0,4297.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:44:02Z,14,0,100.0,15.8,60.8,1.760,89.00,1.760,1.7597,0.0307,1006.20,8.60,91.40,7.40,3134988,242,8014.0,8270.0,49445,3,3426.0,2707.0,1007.6,21.3,16.3,54.1,7.0,19.6,56.3,10.6,3705.0,4174.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:44:12Z,14,0,100.0,15.8,60.8,1.220,85.00,1.220,1.2154,0.1063,1006.20,8.60,91.50,7.40,3134998,242,7297.0,7509.0,49446,3,3444.0,2721.0,1007.6,21.3,16.4,54.1,7.0,19.6,56.3,10.7,3437.0,3822.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:44:22Z,14,0,100.0,15.8,60.8,2.280,60.00,2.280,1.9745,1.1400,1006.20,8.60,91.50,7.40,3135008,242,7280.0,7491.0,49447,3,3459.0,2712.0,1007.5,21.3,16.3,54.1,7.0,19.6,56.4,10.7,3515.0,3940.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:44:32Z,14,0,100.0,15.8,60.8,1.850,89.00,1.850,1.8497,0.0323,1006.20,8.60,91.50,7.40,3135018,242,7628.0,7860.0,49448,3,3450.0,2714.0,1007.7,21.3,16.4,54.1,7.0,19.6,56.4,10.6,3622.0,4067.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:44:42Z,14,0,100.0,15.8,60.8,2.330,26.00,2.330,1.0214,2.0942,1006.20,8.60,91.50,7.40,3135028,242,7420.0,7640.0,49449,3,3475.0,2713.0,1007.6,21.3,16.4,54.1,7.0,19.5,56.4,10.6,3649.0,4096.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:44:52Z,14,0,100.0,15.8,60.8,1.450,56.00,1.450,1.2021,0.8108,1006.20,8.60,91.60,7.40,3135038,242,9009.0,9333.0,49450,3,3431.0,2697.0,1007.7,21.3,16.3,54.1,7.0,19.5,56.4,10.6,4173.0,4790.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:45:02Z,14,0,100.0,15.8,60.8,0.200,350.00,0.200,-0.0347,0.1970,1006.20,8.70,91.60,7.40,3135048,242,11320.0,11832.0,49451,3,3464.0,2715.0,1007.6,21.3,16.3,54.1,7.0,19.6,56.4,10.7,5154.0,6142.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:45:12Z,14,0,100.0,15.8,60.8,1.610,40.00,1.610,1.0349,1.2333,1006.20,8.70,91.60,7.40,3135058,242,11364.0,11880.0,49452,3,3406.0,2699.0,1007.5,21.3,16.3,54.1,7.0,19.5,56.4,10.6,4925.0,5821.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:45:22Z,14,0,100.0,15.8,60.9,1.300,61.00,1.300,1.1370,0.6303,1006.20,8.70,91.60,7.40,3135068,242,10900.0,11375.0,49453,3,3426.0,2716.0,1007.5,21.3,16.3,54.1,7.0,19.5,56.4,10.6,4769.0,5607.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:45:32Z,14,0,100.0,15.8,60.9,0.610,61.00,0.610,0.5335,0.2957,1006.20,8.70,91.60,7.40,3135078,242,11907.0,12474.0,49454,3,3449.0,2713.0,1007.5,21.3,16.3,54.1,7.0,19.6,56.4,10.7,5303.0,6349.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:45:42Z,14,0,100.0,15.8,60.9,0.560,89.00,0.560,0.5599,0.0098,1006.20,8.70,91.50,7.40,3135088,242,10785.0,11250.0,49455,3,3449.0,2709.0,1007.6,21.3,16.3,54.2,7.0,19.5,56.4,10.6,4895.0,5782.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:45:52Z,14,0,100.0,15.8,60.9,0.680,101.00,0.680,0.6675,-0.1298,1006.20,8.70,91.60,7.50,3135098,242,15227.0,16154.0,49456,3,3445.0,2729.0,1007.6,21.3,16.3,54.1,7.0,19.5,56.4,10.6,6301.0,7898.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:46:02Z,14,0,100.0,15.7,60.9,0.970,78.00,0.970,0.9488,0.2017,1006.20,8.70,91.50,7.40,3135108,242,9869.0,10258.0,49457,3,3452.0,2708.0,1007.5,21.3,16.3,54.2,7.1,19.5,56.5,10.6,4569.0,5320.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:46:12Z,14,0,100.0,15.8,60.9,1.050,70.00,1.050,0.9867,0.3591,1006.20,8.70,91.50,7.50,3135118,242,11352.0,11867.0,49458,3,3455.0,2721.0,1007.6,21.3,16.3,54.2,7.0,19.5,56.5,10.7,5057.0,6036.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:46:22Z,14,0,100.0,15.8,61.0,1.760,69.00,1.760,1.6431,0.6307,1006.20,8.70,91.50,7.40,3135128,242,9937.0,10331.0,49459,3,3464.0,2713.0,1007.6,21.3,16.4,54.2,7.1,19.5,56.5,10.7,4631.0,5406.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:46:33Z,14,0,100.0,15.8,60.9,1.170,87.00,1.170,1.1684,0.0612,1006.20,8.70,91.50,7.50,3135138,242,12182.0,12775.0,49460,3,3417.0,2702.0,1007.6,21.3,16.3,54.2,7.0,19.5,56.5,10.7,5255.0,6310.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:46:43Z,14,0,100.0,15.8,61.0,1.080,94.00,1.080,1.0774,-0.0753,1006.20,8.70,91.50,7.50,3135148,242,12370.0,12982.0,49461,3,3426.0,2702.0,1007.7,21.3,16.3,54.2,7.1,19.5,56.5,10.6,5386.0,6487.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:46:53Z,14,0,100.0,15.8,61.0,1.360,90.00,1.360,1.3600,0.0000,1006.20,8.70,91.50,7.50,3135159,242,11199.0,11700.0,49462,3,3437.0,2718.0,1007.5,21.3,16.3,54.2,7.0,19.5,56.5,10.6,4948.0,5834.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:47:03Z,14,0,100.0,15.8,61.0,1.030,76.00,1.030,0.9994,0.2492,1006.20,8.70,91.50,7.50,3135169,242,13750.0,14506.0,49463,3,3469.0,2715.0,1007.7,21.3,16.3,54.2,7.0,19.5,56.5,10.6,6065.0,7510.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:47:13Z,14,0,100.0,15.7,61.0,0.490,39.00,0.490,0.3084,0.3808,1006.20,8.70,91.50,7.50,3135179,242,14409.0,15239.0,49464,3,3425.0,2711.0,1007.5,21.3,16.3,54.2,7.0,19.5,56.4,10.6,5999.0,7454.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:47:23Z,14,0,100.0,15.8,61.0,1.080,61.00,1.080,0.9446,0.5236,1006.20,8.70,91.50,7.50,3135189,242,13217.0,13915.0,49465,3,3465.0,2711.0,1007.7,21.3,16.3,54.2,7.1,19.5,56.5,10.6,5875.0,7219.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:47:33Z,14,0,100.0,15.8,61.0,1.770,78.00,1.770,1.7313,0.3680,1006.20,8.80,91.50,7.50,3135199,242,14680.0,15542.0,49466,3,3437.0,2718.0,1007.5,21.3,16.3,54.2,7.0,19.5,56.5,10.7,6118.0,7647.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:47:43Z,14,0,100.0,15.7,61.0,1.660,94.00,1.660,1.6560,-0.1158,1006.30,8.70,91.50,7.50,3135209,242,13306.0,14014.0,49467,3,3447.0,2703.0,1007.7,21.3,16.3,54.3,7.1,19.5,56.5,10.6,5838.0,7171.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:47:53Z,14,0,100.0,15.7,61.0,0.680,90.00,0.680,0.6800,0.0000,1006.30,8.70,91.40,7.50,3135219,242,10999.0,11482.0,49468,3,3474.0,2724.0,1007.5,21.3,16.3,54.3,7.0,19.5,56.6,10.7,5049.0,5977.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:48:03Z,14,0,100.0,15.8,61.0,2.220,92.00,2.220,2.2186,-0.0775,1006.20,8.70,91.40,7.50,3135229,242,11074.0,11564.0,49469,3,3451.0,2712.0,1007.5,21.3,16.3,54.3,7.0,19.5,56.6,10.7,4988.0,5929.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:48:13Z,14,0,100.0,15.8,61.1,2.020,106.00,2.020,1.9417,-0.5568,1006.20,8.70,91.40,7.50,3135239,242,8632.0,8930.0,49470,3,3442.0,2718.0,1007.5,21.3,16.3,54.3,7.0,19.5,56.5,10.6,3987.0,4528.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:48:23Z,14,0,100.0,15.8,61.1,1.430,68.00,1.430,1.3259,0.5357,1006.20,8.70,91.40,7.50,3135249,242,8722.0,9026.0,49471,3,3469.0,2717.0,1007.5,21.3,16.3,54.3,7.1,19.5,56.5,10.6,4153.0,4752.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:48:33Z,14,0,100.0,15.8,61.0,2.360,75.00,2.360,2.2796,0.6108,1006.20,8.70,91.30,7.40,3135259,242,8330.0,8607.0,49472,3,3424.0,2708.0,1007.5,21.3,16.3,54.3,7.0,19.5,56.5,10.6,3797.0,4321.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:48:43Z,14,0,100.0,15.8,61.1,1.580,92.00,1.580,1.5790,-0.0551,1006.20,8.70,91.40,7.40,3135269,242,7494.0,7718.0,49473,3,3428.0,2704.0,1007.5,21.3,16.3,54.3,7.0,19.5,56.5,10.6,3483.0,3931.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:48:53Z,14,0,100.0,15.7,61.1,1.680,60.00,1.680,1.4549,0.8400,1006.20,8.70,91.40,7.40,3135279,242,10122.0,10531.0,49474,3,3444.0,2719.0,1007.6,21.3,16.3,54.3,7.0,19.5,56.5,10.6,4563.0,5316.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:49:03Z,14,0,100.0,15.7,61.1,2.010,96.00,2.010,1.9990,-0.2101,1006.20,8.70,91.40,7.40,3135289,242,9666.0,10039.0,49475,3,3465.0,2712.0,1007.6,21.3,16.3,54.3,7.0,19.5,56.6,10.7,4529.0,5273.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:49:13Z,14,0,100.0,15.7,61.1,1.550,63.00,1.550,1.3811,0.7037,1006.20,8.70,91.40,7.40,3135299,242,6759.0,6941.0,49476,3,3495.0,2724.0,1007.7,21.3,16.3,54.3,7.0,19.5,56.6,10.6,3364.0,3775.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:49:23Z,14,0,100.0,15.7,61.1,2.480,55.00,2.480,2.0315,1.4225,1006.20,8.70,91.50,7.40,3135309,242,6871.0,7059.0,49477,3,3422.0,2699.0,1007.6,21.3,16.3,54.3,7.0,19.5,56.5,10.6,3247.0,3599.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:49:33Z,14,0,100.0,15.7,61.1,1.760,67.00,1.760,1.6201,0.6877,1006.20,8.70,91.50,7.40,3135320,242,7831.0,8076.0,49478,3,3445.0,2712.0,1007.7,21.3,16.3,54.3,7.0,19.5,56.6,10.6,3713.0,4158.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:49:43Z,14,0,100.0,15.8,61.1,1.960,75.00,1.960,1.8932,0.5073,1006.20,8.70,91.50,7.40,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan, +2026-04-17T00:49:53Z,14,0,100.0,15.7,61.1,1.010,92.00,1.010,1.0094,-0.0352,1006.20,8.70,91.50,7.50,3135330,242,7055.0,7254.0,49479,3,3457.0,2707.0,1007.7,21.3,16.3,54.4,7.0,19.5,56.6,10.6,3442.0,3833.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:50:03Z,14,0,100.0,15.7,61.1,1.240,27.00,1.240,0.5629,1.1048,1006.20,8.70,91.50,7.40,3135340,242,5959.0,6101.0,49480,3,3411.0,2701.0,1007.7,21.3,16.3,54.4,7.1,19.5,56.6,10.6,2811.0,3065.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:50:13Z,14,0,100.0,15.7,61.1,2.300,81.00,2.300,2.2717,0.3598,1006.20,8.70,91.50,7.40,3135350,242,5233.0,5342.0,49481,3,3421.0,2702.0,1007.6,21.3,16.3,54.4,7.0,19.5,56.6,10.6,2517.0,2726.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:50:23Z,14,0,100.0,15.7,61.1,2.330,79.00,2.330,2.2872,0.4446,1006.20,8.70,91.60,7.40,3135360,242,5979.0,6121.0,49482,3,3457.0,2723.0,1007.5,21.2,16.3,54.4,7.1,19.5,56.6,10.6,2911.0,3180.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:50:33Z,14,0,100.0,15.7,61.2,1.790,84.00,1.790,1.7802,0.1871,1006.20,8.70,91.60,7.40,3135370,242,6712.0,6892.0,49483,3,3468.0,2716.0,1007.5,21.3,16.3,54.4,7.1,19.5,56.6,10.6,3290.0,3657.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:50:43Z,14,0,100.0,15.7,61.1,1.850,91.00,1.850,1.8497,-0.0323,1006.20,8.70,91.60,7.40,3135380,242,6029.0,6174.0,49484,3,3449.0,2720.0,1007.7,21.2,16.3,54.4,7.1,19.5,56.6,10.6,2901.0,3184.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:50:53Z,14,0,100.0,15.7,61.1,1.840,87.00,1.840,1.8375,0.0963,1006.20,8.70,91.60,7.40,3135390,242,5463.0,5582.0,49485,3,3469.0,2712.0,1007.6,21.2,16.3,54.4,7.0,19.5,56.6,10.6,2754.0,2996.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:51:03Z,14,0,100.0,15.7,61.1,1.470,75.00,1.470,1.4199,0.3805,1006.20,8.70,91.60,7.40,3135400,242,5865.0,6002.0,49486,3,3406.0,2695.0,1007.6,21.2,16.3,54.4,7.0,19.5,56.6,10.6,2773.0,3021.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:51:13Z,14,0,100.0,15.7,61.2,1.450,94.00,1.450,1.4465,-0.1011,1006.20,8.70,91.60,7.40,3135410,242,6021.0,6166.0,49487,3,3418.0,2702.0,1007.7,21.2,16.3,54.5,7.1,19.5,56.6,10.6,2860.0,3123.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:51:23Z,14,0,100.0,15.7,61.1,2.680,77.00,2.680,2.6113,0.6029,1006.20,8.70,91.60,7.40,3135420,242,6090.0,6238.0,49488,3,3444.0,2716.0,1007.5,21.2,16.3,54.5,7.1,19.5,56.6,10.6,2934.0,3212.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:51:33Z,14,0,100.0,15.7,61.2,1.460,63.00,1.460,1.3009,0.6628,1006.20,8.60,91.60,7.40,3135430,242,5824.0,5959.0,49489,3,3459.0,2707.0,1007.6,21.2,16.3,54.5,7.1,19.4,56.6,10.6,2843.0,3173.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:51:43Z,14,0,100.0,15.7,61.2,1.790,69.00,1.790,1.6711,0.6415,1006.20,8.60,91.60,7.40,3135440,242,6297.0,6455.0,49490,3,3441.0,2716.0,1007.5,21.2,16.2,54.4,7.0,19.5,56.6,10.6,3021.0,3308.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:51:53Z,14,0,100.0,15.7,61.2,1.460,82.00,1.460,1.4458,0.2032,1006.20,8.60,91.60,7.40,3135450,242,6716.0,6896.0,49491,3,3432.0,2709.0,1007.5,21.2,16.3,54.5,7.1,19.4,56.6,10.6,3173.0,3518.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:52:03Z,14,0,100.0,15.7,61.2,1.320,98.00,1.320,1.3072,-0.1837,1006.20,8.60,91.60,7.40,3135460,242,6446.0,6612.0,49492,3,3441.0,2714.0,1007.6,21.2,16.2,54.5,7.1,19.5,56.6,10.6,3090.0,3395.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:52:13Z,14,0,100.0,15.7,61.2,1.550,110.00,1.550,1.4565,-0.5301,1006.20,8.70,91.60,7.40,3135470,242,8848.0,9161.0,49493,3,3421.0,2700.0,1007.7,21.2,16.2,54.5,7.0,19.4,56.6,10.6,4050.0,4621.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:52:23Z,14,0,100.0,15.7,61.2,1.450,93.00,1.450,1.4480,-0.0759,1006.20,8.70,91.70,7.50,3135481,242,8479.0,8766.0,49494,3,3436.0,2718.0,1007.4,21.2,16.3,54.5,7.1,19.4,56.6,10.6,3899.0,4411.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:52:33Z,14,0,100.0,15.7,61.2,1.250,80.00,1.250,1.2310,0.2171,1006.20,8.70,91.70,7.50,3135491,242,8387.0,8668.0,49495,3,3460.0,2713.0,1007.5,21.2,16.3,54.5,7.1,19.5,56.6,10.6,3994.0,4539.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:52:43Z,14,0,100.0,15.7,61.2,1.020,84.00,1.020,1.0144,0.1066,1006.20,8.70,91.70,7.50,3135501,242,7915.0,8165.0,49496,3,3441.0,2722.0,1007.5,21.2,16.2,54.5,7.0,19.4,56.7,10.6,3662.0,4123.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:52:53Z,14,0,100.0,15.7,61.2,1.340,108.00,1.340,1.2744,-0.4141,1006.20,8.70,91.70,7.50,3135511,242,6578.0,6751.0,49497,3,3468.0,2712.0,1007.5,21.2,16.2,54.5,7.1,19.5,56.7,10.6,3246.0,3603.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:53:03Z,14,0,100.0,15.7,61.2,2.030,96.00,2.030,2.0189,-0.2122,1006.20,8.70,91.70,7.50,3135521,242,10470.0,10908.0,49498,3,3440.0,2716.0,1007.5,21.2,16.2,54.6,7.1,19.4,56.6,10.6,4694.0,5492.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:53:13Z,14,0,100.0,15.7,61.2,1.890,105.00,1.890,1.8256,-0.4892,1006.20,8.70,91.70,7.50,3135531,242,21788.0,23686.0,49499,3,3461.0,2717.0,1007.6,21.2,16.2,54.5,7.1,19.4,56.7,10.6,8321.0,11743.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:53:23Z,14,0,100.0,15.7,61.2,1.870,88.00,1.870,1.8689,0.0653,1006.20,8.70,91.70,7.50,3135541,242,15314.0,16252.0,49500,3,3497.0,2718.0,1007.4,21.1,16.2,54.5,7.0,19.4,56.7,10.6,6795.0,8644.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:53:33Z,14,0,100.0,15.7,61.2,1.620,90.00,1.620,1.6200,0.0000,1006.20,8.70,91.70,7.50,3135551,242,15644.0,16622.0,49501,3,3540.0,2746.0,1007.6,21.2,16.3,54.6,7.1,19.5,56.7,10.6,7014.0,8998.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:53:43Z,14,0,100.0,15.7,61.2,2.770,63.00,2.770,2.4681,1.2576,1006.20,8.70,91.70,7.50,3135561,242,9569.0,9935.0,49502,3,3486.0,2726.0,1007.5,21.2,16.2,54.6,7.1,19.4,56.7,10.6,4535.0,5269.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:53:53Z,14,0,100.0,15.7,61.3,1.190,48.00,1.190,0.8843,0.7963,1006.20,8.70,91.70,7.50,3135571,242,13787.0,14547.0,49503,3,3445.0,2713.0,1007.4,21.2,16.2,54.6,7.1,19.4,56.7,10.6,5924.0,7312.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:54:03Z,14,0,100.0,15.7,61.2,1.620,47.00,1.620,1.1848,1.1048,1006.20,8.70,91.70,7.50,3135581,242,10340.0,10767.0,49504,3,3412.0,2707.0,1007.4,21.2,16.2,54.6,7.1,19.4,56.7,10.6,4512.0,5282.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:54:13Z,14,0,100.0,15.7,61.2,1.150,23.00,1.150,0.4493,1.0586,1006.20,8.70,91.70,7.50,3135591,242,7510.0,7735.0,49505,3,3457.0,2706.0,1007.4,21.2,16.2,54.6,7.1,19.4,56.7,10.6,3637.0,4087.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:54:23Z,14,0,100.0,15.7,61.3,0.710,82.00,0.710,0.7031,0.0988,1006.20,8.70,91.70,7.50,3135601,242,14021.0,14807.0,49506,3,3446.0,2721.0,1007.6,21.2,16.2,54.6,7.0,19.4,56.7,10.6,5960.0,7364.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:54:33Z,14,0,100.0,15.7,61.3,0.210,19.00,0.210,0.0684,0.1986,1006.20,8.70,91.70,7.50,3135611,242,14394.0,15222.0,49507,3,3426.0,2711.0,1007.6,21.2,16.2,54.6,7.1,19.4,56.7,10.6,6009.0,7456.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:54:43Z,14,0,100.0,15.6,61.3,0.840,78.00,0.840,0.8216,0.1746,1006.20,8.70,91.70,7.50,3135621,242,20827.0,22562.0,49508,3,3449.0,2706.0,1007.6,21.2,16.2,54.6,7.1,19.4,56.7,10.6,8072.0,11210.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:54:53Z,14,0,100.0,15.7,61.3,0.530,90.00,0.530,0.5300,0.0000,1006.20,8.70,91.70,7.50,3135632,242,10277.0,10699.0,49509,3,3445.0,2702.0,1007.6,21.2,16.2,54.7,7.1,19.4,56.7,10.6,4696.0,5532.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:55:03Z,14,0,100.0,15.7,61.3,1.950,73.00,1.950,1.8648,0.5701,1006.20,8.70,91.70,7.50,3135642,242,12722.0,13369.0,49510,3,3442.0,2717.0,1007.4,21.2,16.2,54.6,7.1,19.4,56.8,10.6,5551.0,6683.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:55:13Z,14,0,100.0,15.7,61.3,2.060,49.00,2.060,1.5547,1.3515,1006.20,8.70,91.70,7.50,3135652,242,19787.0,21353.0,49511,3,3455.0,2718.0,1007.4,21.2,16.2,54.6,7.1,19.4,56.8,10.6,7735.0,10566.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:55:23Z,14,0,100.0,15.6,61.3,2.280,80.00,2.280,2.2454,0.3959,1006.20,8.70,91.70,7.50,3135662,242,7606.0,7837.0,49512,3,3476.0,2716.0,1007.5,21.2,16.2,54.7,7.1,19.4,56.8,10.6,3721.0,4188.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:55:33Z,14,0,100.0,15.6,61.4,2.250,51.00,2.250,1.7486,1.4160,1006.20,8.70,91.70,7.50,3135672,242,10189.0,10604.0,49513,3,3438.0,2717.0,1007.6,21.2,16.2,54.7,7.1,19.4,56.7,10.6,4572.0,5322.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:55:43Z,14,0,100.0,15.7,61.4,2.060,62.00,2.060,1.8189,0.9671,1006.20,8.70,91.70,7.50,3135682,242,7090.0,7291.0,49514,3,3444.0,2713.0,1007.5,21.2,16.2,54.7,7.1,19.4,56.7,10.6,3375.0,3755.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:55:53Z,14,0,100.0,15.7,61.4,1.590,62.00,1.590,1.4039,0.7465,1006.20,8.70,91.70,7.50,3135692,242,5565.0,5688.0,49515,3,3469.0,2716.0,1007.5,21.2,16.2,54.7,7.0,19.4,56.7,10.6,2783.0,3036.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:56:03Z,14,0,100.0,15.7,61.4,1.980,67.00,1.980,1.8226,0.7736,1006.20,8.70,91.70,7.50,3135702,242,5024.0,5124.0,49516,3,3456.0,2708.0,1007.5,21.2,16.2,54.7,7.1,19.4,56.7,10.6,2519.0,2723.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:56:13Z,14,0,100.0,15.7,61.4,1.400,61.00,1.400,1.2245,0.6787,1006.20,8.70,91.70,7.50,3135712,242,4911.0,5007.0,49517,3,3442.0,2709.0,1007.5,21.2,16.2,54.7,7.1,19.4,56.7,10.6,2418.0,2608.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:56:23Z,14,0,100.0,15.7,61.4,1.050,56.00,1.050,0.8705,0.5872,1006.20,8.70,91.70,7.50,3135722,242,6115.0,6264.0,49518,3,3436.0,2714.0,1007.4,21.2,16.2,54.7,7.1,19.4,56.8,10.6,2922.0,3199.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:56:33Z,14,0,100.0,15.6,61.4,1.480,110.00,1.480,1.3907,-0.5062,1006.20,8.70,91.80,7.50,3135732,242,7859.0,8106.0,49519,3,3444.0,2711.0,1007.5,21.2,16.2,54.7,7.1,19.4,56.8,10.6,3690.0,4174.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:56:43Z,14,0,100.0,15.7,61.4,1.130,91.00,1.130,1.1298,-0.0197,1006.20,8.70,91.80,7.50,3135742,242,13252.0,13954.0,49520,3,3437.0,2704.0,1007.4,21.2,16.2,54.7,7.1,19.4,56.8,10.6,5733.0,7038.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:56:53Z,14,0,100.0,15.7,61.4,2.100,66.00,2.100,1.9184,0.8541,1006.20,8.70,91.80,7.50,3135752,242,9776.0,10158.0,49521,3,3427.0,2707.0,1007.4,21.2,16.2,54.8,7.1,19.4,56.8,10.6,4411.0,5100.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:57:03Z,14,0,100.0,15.7,61.4,1.770,65.00,1.770,1.6042,0.7480,1006.20,8.70,91.80,7.50,3135762,242,6915.0,7106.0,49522,3,3451.0,2716.0,1007.6,21.2,16.2,54.7,7.1,19.4,56.8,10.6,3319.0,3682.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:57:13Z,14,0,100.0,15.6,61.4,1.460,86.00,1.460,1.4564,0.1018,1006.20,8.70,91.80,7.50,3135772,242,6085.0,6233.0,49523,3,3451.0,2702.0,1007.5,21.2,16.2,54.7,7.1,19.4,56.8,10.6,3000.0,3302.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:57:23Z,14,0,100.0,15.6,61.5,1.280,83.00,1.280,1.2705,0.1560,1006.20,8.70,91.80,7.50,3135782,242,6590.0,6763.0,49524,3,3446.0,2720.0,1007.6,21.2,16.2,54.8,7.1,19.4,56.8,10.6,3143.0,3466.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:57:33Z,14,0,100.0,15.6,61.4,2.060,65.00,2.060,1.8670,0.8706,1006.20,8.70,91.70,7.50,3135792,242,5562.0,5685.0,49525,3,3438.0,2707.0,1007.5,21.2,16.2,54.8,7.1,19.4,56.8,10.6,2697.0,2946.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:57:43Z,14,0,100.0,15.6,61.5,1.970,39.00,1.970,1.2398,1.5310,1006.20,8.70,91.70,7.50,3135803,242,6367.0,6529.0,49526,3,3441.0,2716.0,1007.6,21.1,16.2,54.8,7.1,19.4,56.8,10.6,3052.0,3344.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:57:53Z,14,0,100.0,15.7,61.4,1.180,49.00,1.180,0.8906,0.7741,1006.20,8.70,91.70,7.50,3135813,242,5456.0,5575.0,49527,3,3465.0,2708.0,1007.7,21.2,16.2,54.8,7.1,19.4,56.8,10.6,2752.0,2992.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:58:03Z,14,0,100.0,15.6,61.5,0.370,357.00,0.370,-0.0194,0.3695,1006.20,8.70,91.80,7.50,3135823,242,5783.0,5916.0,49528,3,3456.0,2719.0,1007.5,21.1,16.2,54.8,7.1,19.4,56.8,10.6,2837.0,3088.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:58:13Z,14,0,100.0,15.6,61.4,1.010,46.00,1.010,0.7265,0.7016,1006.20,8.70,91.80,7.50,3135833,242,5690.0,5819.0,49529,3,3446.0,2702.0,1007.6,21.1,16.2,54.8,7.1,19.3,56.8,10.6,2814.0,3067.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:58:23Z,14,0,100.0,15.6,61.5,1.300,62.00,1.300,1.1478,0.6103,1006.20,8.70,91.70,7.50,3135843,242,5727.0,5858.0,49530,3,3438.0,2716.0,1007.5,21.1,16.2,54.8,7.1,19.4,56.8,10.6,2752.0,2996.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:58:33Z,14,0,100.0,15.6,61.5,0.880,71.00,0.880,0.8321,0.2865,1006.20,8.70,91.70,7.50,3135853,242,5546.0,5669.0,49531,3,3468.0,2713.0,1007.4,21.1,16.2,54.8,7.0,19.4,56.8,10.6,2783.0,3034.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:58:43Z,14,0,100.0,15.6,61.5,1.710,85.00,1.710,1.7035,0.1490,1006.20,8.70,91.80,7.50,3135863,242,5885.0,6023.0,49532,3,3412.0,2698.0,1007.6,21.1,16.2,54.8,7.1,19.4,56.8,10.6,2790.0,3044.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:58:53Z,14,0,100.0,15.6,61.5,1.620,101.00,1.620,1.5902,-0.3091,1006.20,8.70,91.70,7.50,3135873,242,7718.0,7956.0,49533,3,3459.0,2709.0,1007.7,21.1,16.2,54.8,7.1,19.4,56.8,10.6,3745.0,4193.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:59:03Z,14,0,100.0,15.6,61.5,1.850,93.00,1.850,1.8475,-0.0968,1006.20,8.70,91.70,7.50,3135883,242,7276.0,7487.0,49534,3,3413.0,2701.0,1007.6,21.1,16.2,54.8,7.1,19.4,56.8,10.6,3364.0,3753.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:59:13Z,14,0,100.0,15.6,61.5,0.540,65.00,0.540,0.4894,0.2282,1006.20,8.70,91.70,7.50,3135893,242,6590.0,6763.0,49535,3,3459.0,2714.0,1007.5,21.1,16.2,54.9,7.1,19.4,56.9,10.6,3212.0,3557.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:59:23Z,14,0,100.0,15.6,61.6,1.180,58.00,1.180,1.0007,0.6253,1006.20,8.70,91.70,7.50,3135903,242,6344.0,6504.0,49536,3,3440.0,2721.0,1007.4,21.1,16.1,54.9,7.1,19.4,56.9,10.6,3013.0,3305.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:59:33Z,14,0,100.0,15.6,61.5,0.740,62.00,0.740,0.6534,0.3474,1006.20,8.70,91.70,7.50,3135913,242,11965.0,12537.0,49537,3,3456.0,2713.0,1007.5,21.1,16.2,54.9,7.1,19.4,56.8,10.6,5364.0,6441.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:59:43Z,14,0,100.0,15.6,61.6,0.760,63.00,0.760,0.6772,0.3450,1006.20,8.70,91.70,7.50,3135923,242,12226.0,12823.0,49538,3,3413.0,2708.0,1007.5,21.1,16.2,54.9,7.1,19.4,56.8,10.6,5203.0,6245.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T00:59:53Z,14,0,100.0,15.6,61.6,0.820,76.00,0.820,0.7956,0.1984,1006.20,8.70,91.70,7.50,3135933,242,11104.0,11597.0,49539,3,3450.0,2703.0,1007.6,21.1,16.2,54.9,7.1,19.3,56.9,10.6,5057.0,6009.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:00:03Z,14,0,100.0,15.6,61.6,1.160,85.00,1.160,1.1556,0.1011,1006.20,8.70,91.70,7.50,3135943,242,12219.0,12816.0,49540,3,3437.0,2721.0,1007.4,21.1,16.2,54.9,7.1,19.4,56.9,10.6,5279.0,6339.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:00:13Z,14,0,100.0,15.6,61.6,2.010,55.00,2.010,1.6465,1.1529,1006.20,8.70,91.70,7.50,3135953,242,9900.0,10292.0,49541,3,3427.0,2706.0,1007.6,21.1,16.2,54.9,7.1,19.3,56.9,10.6,4459.0,5171.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:00:23Z,14,0,100.0,15.6,61.6,1.340,55.00,1.340,1.0977,0.7686,1006.20,8.70,91.70,7.50,3135964,242,7780.0,8022.0,49542,3,3442.0,2712.0,1007.5,21.1,16.2,54.9,7.1,19.3,56.9,10.6,3669.0,4115.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:00:33Z,14,0,100.0,15.6,61.6,2.200,93.00,2.200,2.1970,-0.1151,1006.20,8.70,91.70,7.50,3135974,242,7517.0,7743.0,49543,3,3445.0,2702.0,1007.6,21.1,16.2,54.9,7.1,19.3,56.9,10.6,3594.0,4046.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:00:43Z,14,0,100.0,15.6,61.6,1.090,97.00,1.090,1.0819,-0.1328,1006.20,8.70,91.70,7.50,3135984,242,9318.0,9665.0,49544,3,3441.0,2717.0,1007.4,21.1,16.1,54.9,7.1,19.4,56.9,10.6,4258.0,4888.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:00:53Z,14,0,100.0,15.6,61.7,1.380,95.00,1.380,1.3747,-0.1203,1006.20,8.70,91.60,7.50,3135994,242,8474.0,8761.0,49545,3,3464.0,2717.0,1007.4,21.1,16.1,54.9,7.1,19.3,56.9,10.6,4017.0,4587.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:01:03Z,14,0,100.0,15.6,61.7,1.440,72.00,1.440,1.3695,0.4450,1006.20,8.70,91.60,7.50,3136004,242,10110.0,10518.0,49546,3,3409.0,2706.0,1007.5,21.1,16.2,54.9,7.1,19.3,56.9,10.6,4410.0,5149.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:01:13Z,14,0,100.0,15.6,61.7,1.860,67.00,1.860,1.7121,0.7268,1006.20,8.70,91.60,7.50,3136014,242,9751.0,10131.0,49547,3,3468.0,2716.0,1007.4,21.1,16.1,54.9,7.0,19.4,56.9,10.6,4567.0,5313.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:01:23Z,14,0,100.0,15.6,61.7,1.560,62.00,1.560,1.3774,0.7324,1006.20,8.70,91.60,7.50,3136024,242,8370.0,8650.0,49548,3,3413.0,2702.0,1007.4,21.1,16.2,54.9,7.1,19.3,56.9,10.6,3796.0,4312.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:01:33Z,14,0,100.0,15.6,61.7,1.320,37.00,1.320,0.7944,1.0542,1006.20,8.70,91.60,7.50,3136034,242,7504.0,7729.0,49549,3,3449.0,2708.0,1007.5,21.1,16.2,55.0,7.1,19.3,56.9,10.6,3594.0,4029.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:01:43Z,14,0,100.0,15.6,61.7,1.630,78.00,1.630,1.5944,0.3389,1006.20,8.70,91.60,7.50,3136044,242,8003.0,8259.0,49550,3,3447.0,2711.0,1007.6,21.1,16.1,55.0,7.1,19.3,56.9,10.5,3779.0,4267.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:01:53Z,14,0,100.0,15.6,61.7,1.490,67.00,1.490,1.3716,0.5822,1006.20,8.70,91.60,7.50,3136054,242,8509.0,8798.0,49551,3,3471.0,2726.0,1007.5,21.1,16.1,55.0,7.1,19.3,56.9,10.6,4042.0,4593.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:02:03Z,14,0,100.0,15.6,61.7,0.940,109.00,0.940,0.8888,-0.3060,1006.10,8.80,91.60,7.50,3136064,242,10188.0,10603.0,49552,3,3485.0,2718.0,1007.6,21.1,16.1,55.0,7.1,19.3,56.9,10.6,4813.0,5661.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:02:13Z,14,0,100.0,15.6,61.7,0.710,93.00,0.710,0.7090,-0.0372,1006.10,8.80,91.60,7.50,3136074,242,11536.0,12068.0,49553,3,3445.0,2709.0,1007.6,21.1,16.1,55.0,7.1,19.3,57.0,10.6,5144.0,6151.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:02:23Z,14,0,100.0,15.6,61.8,1.230,39.00,1.230,0.7741,0.9559,1006.20,8.80,91.60,7.60,3136084,242,11943.0,12513.0,49554,3,3421.0,2711.0,1007.4,21.1,16.1,55.0,7.1,19.3,57.0,10.5,5154.0,6144.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:02:33Z,14,0,100.0,15.6,61.7,0.840,92.00,0.840,0.8395,-0.0293,1006.20,8.80,91.60,7.60,3136094,242,9168.0,9504.0,49555,3,3445.0,2722.0,1007.4,21.1,16.1,55.0,7.1,19.3,57.0,10.6,4193.0,4803.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:02:43Z,14,0,100.0,15.6,61.8,1.790,89.00,1.790,1.7897,0.0312,1006.20,8.80,91.60,7.60,3136104,242,12162.0,12753.0,49556,3,3489.0,2728.0,1007.4,21.1,16.1,55.0,7.1,19.3,57.0,10.6,5535.0,6706.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:02:53Z,14,0,100.0,15.6,61.8,1.830,106.00,1.830,1.7591,-0.5044,1006.20,8.80,91.50,7.50,3136114,242,7324.0,7538.0,49557,3,3431.0,2695.0,1007.6,21.1,16.1,55.0,7.1,19.3,56.9,10.6,3488.0,3905.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:03:03Z,14,0,100.0,15.6,61.8,2.660,80.00,2.660,2.6196,0.4619,1006.20,8.80,91.50,7.50,3136124,242,8305.0,8580.0,49558,3,3527.0,2732.0,1007.4,21.1,16.2,55.0,7.1,19.3,57.0,10.6,4194.0,4784.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:03:13Z,14,0,100.0,15.6,61.8,2.240,73.00,2.240,2.1421,0.6549,1006.20,8.80,91.50,7.50,3136135,242,7395.0,7613.0,49559,3,3442.0,2722.0,1007.3,21.1,16.1,55.0,7.1,19.3,56.9,10.5,3453.0,3858.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:03:23Z,14,0,100.0,15.6,61.7,2.450,59.00,2.450,2.1001,1.2618,1006.10,8.80,91.50,7.50,3136145,242,7256.0,7466.0,49560,3,3441.0,2717.0,1007.6,21.1,16.1,55.0,7.1,19.3,56.9,10.6,3421.0,3806.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:03:33Z,14,0,100.0,15.6,61.7,1.370,34.00,1.370,0.7661,1.1358,1006.10,8.80,91.50,7.50,3136155,242,7656.0,7890.0,49561,3,3435.0,2701.0,1007.6,21.1,16.1,55.0,7.1,19.3,56.9,10.6,3628.0,4071.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:03:43Z,14,0,100.0,15.6,61.7,1.320,38.00,1.320,0.8127,1.0402,1006.10,8.80,91.50,7.50,3136165,242,8127.0,8391.0,49562,3,3425.0,2702.0,1007.6,21.1,16.1,55.0,7.1,19.3,57.0,10.5,3768.0,4257.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:03:53Z,14,0,100.0,15.6,61.7,1.220,45.00,1.220,0.8627,0.8627,1006.10,8.80,91.50,7.50,3136175,242,8404.0,8686.0,49563,3,3445.0,2721.0,1007.6,21.1,16.1,55.0,7.1,19.3,57.0,10.6,3894.0,4408.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:04:03Z,14,0,100.0,15.6,61.8,1.120,36.00,1.120,0.6583,0.9061,1006.10,8.80,91.50,7.50,3136185,242,8751.0,9057.0,49564,3,3475.0,2714.0,1007.5,21.1,16.1,55.0,7.1,19.3,56.9,10.5,4183.0,4825.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:04:13Z,14,0,100.0,15.6,61.8,1.950,78.00,1.950,1.9074,0.4054,1006.10,8.80,91.50,7.50,3136195,242,8838.0,9150.0,49565,3,3445.0,2711.0,1007.4,21.1,16.1,55.1,7.1,19.3,57.0,10.6,4066.0,4700.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:04:23Z,14,0,100.0,15.6,61.8,1.630,33.00,1.630,0.8878,1.3670,1006.10,8.80,91.50,7.50,3136205,242,21823.0,23727.0,49566,3,3446.0,2722.0,1007.5,21.1,16.1,55.1,7.1,19.3,57.0,10.5,8164.0,11447.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:04:33Z,14,0,100.0,15.6,61.8,1.770,67.00,1.770,1.6293,0.6916,1006.10,8.80,91.50,7.60,3136215,242,38698.0,44688.0,49567,3,3446.0,2726.0,1007.5,21.1,16.1,55.1,7.1,19.3,57.0,10.6,10756.0,20186.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:04:43Z,14,0,100.0,15.6,61.8,1.380,48.00,1.380,1.0255,0.9234,1006.10,8.80,91.50,7.60,3136225,242,35389.0,40398.0,49568,3,3479.0,2717.0,1007.4,21.1,16.1,55.1,7.1,19.3,57.0,10.5,10781.0,19538.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:04:53Z,14,0,100.0,15.6,61.8,1.350,90.00,1.350,1.3500,0.0000,1006.10,8.80,91.50,7.60,3136235,242,22206.0,24178.0,49569,3,3430.0,2700.0,1007.5,21.1,16.1,55.1,7.1,19.3,57.0,10.6,8268.0,11744.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:05:03Z,14,0,100.0,15.6,61.8,1.830,79.00,1.830,1.7964,0.3492,1006.10,8.80,91.50,7.50,3136245,242,11753.0,12305.0,49570,3,3422.0,2703.0,1007.5,21.1,16.1,55.1,7.1,19.2,57.0,10.5,5128.0,6122.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:05:13Z,14,0,100.0,15.6,61.8,1.050,78.00,1.050,1.0271,0.2183,1006.10,8.80,91.40,7.50,3136255,242,11089.0,11580.0,49571,3,3441.0,2724.0,1007.4,21.1,16.1,55.1,7.1,19.3,57.0,10.6,4885.0,5761.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:05:23Z,14,0,100.0,15.6,61.8,1.530,59.00,1.530,1.3115,0.7880,1006.10,8.70,91.50,7.50,3136265,242,10706.0,11164.0,49572,3,3425.0,2709.0,1007.4,21.1,16.1,55.1,7.1,19.3,57.0,10.5,4727.0,5554.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:05:33Z,14,0,100.0,15.6,61.8,0.670,47.00,0.670,0.4900,0.4569,1006.10,8.70,91.40,7.50,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan, +2026-04-17T01:05:43Z,14,0,100.0,15.6,61.9,1.500,81.00,1.500,1.4815,0.2347,1006.10,8.70,91.50,7.50,3136275,242,8663.0,8963.0,49573,3,3442.0,2723.0,1007.5,21.1,16.1,55.1,7.1,19.3,57.0,10.5,3971.0,4513.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:05:53Z,14,0,100.0,15.6,61.9,1.620,68.00,1.620,1.5020,0.6069,1006.10,8.70,91.50,7.50,3136285,242,8077.0,8337.0,49574,3,3474.0,2719.0,1007.4,21.1,16.1,55.1,7.1,19.3,57.0,10.6,3901.0,4419.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:06:03Z,14,0,100.0,15.6,61.9,2.790,71.00,2.790,2.6380,0.9083,1006.10,8.70,91.50,7.50,3136296,242,6571.0,6743.0,49575,3,3449.0,2721.0,1007.5,21.1,16.1,55.1,7.1,19.3,57.0,10.5,3147.0,3466.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:06:13Z,14,0,100.0,15.6,61.9,2.090,41.00,2.090,1.3712,1.5773,1006.10,8.70,91.60,7.50,3136306,242,6263.0,6419.0,49576,3,3461.0,2708.0,1007.5,21.1,16.1,55.1,7.1,19.3,57.0,10.6,3094.0,3417.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:06:23Z,14,0,100.0,15.6,61.9,0.830,349.00,0.830,-0.1584,0.8148,1006.00,8.70,91.60,7.50,3136316,242,13584.0,14322.0,49577,3,3415.0,2703.0,1007.5,21.1,16.1,55.1,7.1,19.3,57.0,10.5,5698.0,7007.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:06:33Z,14,0,100.0,15.6,61.9,0.840,61.00,0.840,0.7347,0.4072,1006.00,8.70,91.60,7.50,3136326,242,7112.0,7314.0,49578,3,3419.0,2704.0,1007.5,21.1,16.1,55.2,7.1,19.3,57.0,10.5,3316.0,3684.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:06:43Z,14,0,100.0,15.5,61.9,1.330,69.00,1.330,1.2417,0.4766,1006.10,8.70,91.60,7.50,3136336,242,5757.0,5889.0,49579,3,3444.0,2717.0,1007.3,21.1,16.1,55.1,7.1,19.3,57.0,10.6,2783.0,3033.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:06:53Z,14,0,100.0,15.5,61.9,1.260,83.00,1.260,1.2506,0.1536,1006.10,8.70,91.70,7.50,3136346,242,10112.0,10521.0,49580,3,3449.0,2708.0,1007.5,21.1,16.1,55.2,7.1,19.3,57.0,10.5,4641.0,5429.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:07:03Z,14,0,100.0,15.6,61.9,0.550,67.00,0.550,0.5063,0.2149,1006.00,8.70,91.70,7.50,3136356,242,8917.0,9235.0,49581,3,3445.0,2724.0,1007.5,21.1,16.1,55.1,7.1,19.3,57.0,10.5,4081.0,4658.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:07:13Z,14,0,100.0,15.6,61.9,2.080,66.00,2.080,1.9002,0.8460,1006.00,8.70,91.70,7.50,3136366,242,7897.0,8146.0,49582,3,3478.0,2716.0,1007.5,21.1,16.1,55.2,7.1,19.2,57.0,10.5,3840.0,4360.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:07:23Z,14,0,100.0,15.6,61.9,2.820,50.00,2.820,2.1602,1.8127,1006.00,8.70,91.70,7.50,3136376,242,7332.0,7547.0,49583,3,3451.0,2717.0,1007.5,21.1,16.1,55.2,7.1,19.3,57.0,10.5,3489.0,3899.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:07:33Z,14,0,100.0,15.6,61.9,1.160,66.00,1.160,1.0597,0.4718,1006.00,8.70,91.60,7.40,3136386,242,6192.0,6345.0,49584,3,3469.0,2714.0,1007.5,21.1,16.1,55.2,7.1,19.2,56.9,10.5,3081.0,3387.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:07:43Z,14,0,100.0,15.6,61.9,1.150,95.00,1.150,1.1456,-0.1002,1006.00,8.70,91.70,7.50,3136396,242,5569.0,5693.0,49585,3,3428.0,2700.0,1007.3,21.1,16.1,55.2,7.1,19.2,57.0,10.5,2696.0,2938.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:07:53Z,14,0,100.0,15.5,61.9,0.990,80.00,0.990,0.9750,0.1719,1006.00,8.70,91.70,7.50,3136406,242,5773.0,5906.0,49586,3,3465.0,2713.0,1007.4,21.1,16.1,55.2,7.1,19.3,57.0,10.5,2875.0,3146.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:08:03Z,14,0,100.0,15.6,61.9,1.120,91.00,1.120,1.1198,-0.0195,1006.00,8.70,91.70,7.50,3136416,242,6803.0,6988.0,49587,3,3404.0,2697.0,1007.4,21.1,16.1,55.2,7.1,19.2,56.9,10.5,3142.0,3485.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:08:13Z,14,0,100.0,15.6,61.9,1.040,82.00,1.040,1.0299,0.1447,1006.00,8.70,91.70,7.50,3136426,242,6322.0,6481.0,49588,3,3418.0,2709.0,1007.3,21.1,16.1,55.2,7.1,19.2,57.0,10.5,2962.0,3248.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:08:23Z,14,0,100.0,15.6,61.9,1.130,76.00,1.130,1.0964,0.2734,1006.00,8.70,91.80,7.50,3136436,242,6091.0,6239.0,49589,3,3455.0,2713.0,1007.3,21.1,16.1,55.2,7.1,19.3,57.0,10.5,2976.0,3275.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:08:33Z,14,0,100.0,15.6,61.9,1.650,72.00,1.650,1.5692,0.5099,1006.10,8.70,91.70,7.50,3136446,242,7305.0,7518.0,49590,3,3426.0,2703.0,1007.4,21.1,16.1,55.2,7.1,19.2,57.0,10.5,3421.0,3827.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:08:44Z,14,0,100.0,15.5,62.0,0.970,89.00,0.970,0.9699,0.0169,1006.10,8.70,91.70,7.50,3136456,242,6646.0,6822.0,49591,3,3440.0,2714.0,1007.4,21.1,16.1,55.2,7.1,19.2,57.0,10.5,3167.0,3496.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:08:54Z,14,0,100.0,15.6,61.9,0.740,4.00,0.740,0.0516,0.7382,1006.10,8.70,91.80,7.50,3136467,242,6143.0,6293.0,49592,3,3414.0,2699.0,1007.5,21.1,16.0,55.2,7.1,19.2,57.0,10.5,2883.0,3182.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:09:04Z,14,0,100.0,15.6,62.0,0.630,58.00,0.630,0.5343,0.3338,1006.10,8.70,91.70,7.50,3136477,242,6667.0,6844.0,49593,3,3440.0,2717.0,1007.4,21.0,16.1,55.2,7.1,19.2,57.0,10.5,3167.0,3493.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:09:14Z,14,0,100.0,15.6,61.9,0.850,82.00,0.850,0.8417,0.1183,1006.10,8.70,91.70,7.50,3136487,242,10731.0,11191.0,49594,3,3447.0,2716.0,1007.4,21.1,16.1,55.2,7.1,19.2,57.0,10.5,4828.0,5684.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:09:24Z,14,0,100.0,15.5,61.9,0.670,55.00,0.670,0.5488,0.3843,1006.10,8.70,91.80,7.50,3136497,242,8365.0,8644.0,49595,3,3447.0,2717.0,1007.6,21.1,16.1,55.3,7.1,19.3,57.1,10.6,3913.0,4424.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:09:34Z,14,0,100.0,15.5,61.9,1.960,50.00,1.960,1.5014,1.2599,1006.10,8.70,91.70,7.50,3136507,242,6764.0,6947.0,49596,3,3457.0,2711.0,1007.5,21.1,16.1,55.3,7.1,19.3,57.0,10.5,3289.0,3656.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:09:44Z,14,0,100.0,15.5,61.9,1.960,47.00,1.960,1.4335,1.3367,1006.10,8.70,91.70,7.50,3136517,242,6820.0,7006.0,49597,3,3407.0,2702.0,1007.4,21.0,16.1,55.3,7.1,19.2,57.0,10.5,3154.0,3484.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:09:54Z,14,0,100.0,15.5,62.0,1.420,74.00,1.420,1.3650,0.3914,1006.10,8.70,91.80,7.50,3136527,242,13516.0,14246.0,49598,3,3427.0,2711.0,1007.6,21.1,16.1,55.3,7.1,19.2,57.0,10.5,5718.0,7011.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:10:04Z,14,0,100.0,15.5,62.0,0.220,357.00,0.220,-0.0115,0.2197,1006.10,8.70,91.70,7.50,3136537,242,9076.0,9405.0,49599,3,3444.0,2713.0,1007.4,21.1,16.1,55.3,7.1,19.2,57.1,10.5,4190.0,4807.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:10:14Z,14,0,100.0,15.5,62.0,1.640,63.00,1.640,1.4613,0.7445,1006.10,8.70,91.70,7.50,3136547,242,10113.0,10522.0,49600,3,3445.0,2718.0,1007.4,21.0,16.1,55.3,7.1,19.2,57.0,10.5,4555.0,5327.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:10:24Z,14,0,100.0,15.6,62.1,2.100,75.00,2.100,2.0284,0.5435,1006.10,8.60,91.70,7.40,3136557,242,8967.0,9288.0,49601,3,3445.0,2719.0,1007.6,21.1,16.0,55.3,7.1,19.2,57.0,10.5,4107.0,4716.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:10:34Z,14,0,100.0,15.5,62.0,1.360,45.00,1.360,0.9617,0.9617,1006.10,8.60,91.70,7.40,3136567,242,8277.0,8551.0,49602,3,3421.0,2699.0,1007.5,21.0,16.0,55.3,7.1,19.2,57.0,10.5,3832.0,4330.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:10:44Z,14,0,100.0,15.5,62.0,0.800,66.00,0.800,0.7308,0.3254,1006.10,8.60,91.70,7.40,3136577,242,11440.0,11963.0,49603,3,3449.0,2717.0,1007.5,21.0,16.0,55.3,7.1,19.2,57.0,10.5,5098.0,6067.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:10:54Z,14,0,100.0,15.5,62.0,0.930,332.00,0.930,-0.4366,0.8211,1006.10,8.70,91.80,7.50,3136587,242,11956.0,12527.0,49604,3,3419.0,2713.0,1007.4,21.0,16.1,55.3,7.1,19.2,57.0,10.5,5133.0,6116.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:11:04Z,14,0,100.0,15.5,62.0,1.240,75.00,1.240,1.1977,0.3209,1006.10,8.70,91.80,7.50,3136597,242,10688.0,11144.0,49605,3,3435.0,2704.0,1007.4,21.0,16.0,55.3,7.1,19.2,57.0,10.5,4796.0,5661.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:11:14Z,14,0,100.0,15.5,62.0,1.200,72.00,1.200,1.1413,0.3708,1006.10,8.70,91.80,7.50,3136607,242,11468.0,11994.0,49606,3,3434.0,2711.0,1007.4,21.0,16.0,55.3,7.1,19.2,57.0,10.5,5040.0,6008.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:11:24Z,14,0,100.0,15.5,62.0,2.750,47.00,2.750,2.0112,1.8755,1006.10,8.60,91.80,7.50,3136617,242,12922.0,13589.0,49607,3,3444.0,2719.0,1007.5,21.0,16.0,55.3,7.1,19.2,57.1,10.5,5587.0,6787.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:11:34Z,14,0,100.0,15.5,62.1,2.450,46.00,2.450,1.7624,1.7019,1006.10,8.60,91.80,7.40,3136628,242,10538.0,10982.0,49608,3,3459.0,2709.0,1007.6,21.0,16.0,55.3,7.1,19.2,57.0,10.5,4859.0,5726.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:11:44Z,14,0,100.0,15.5,62.0,0.590,21.00,0.590,0.2114,0.5508,1006.10,8.60,91.80,7.40,3136638,242,7747.0,7987.0,49609,3,3440.0,2718.0,1007.4,21.0,16.1,55.3,7.1,19.2,57.0,10.5,3608.0,4053.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:11:54Z,14,0,100.0,15.5,62.1,1.320,57.00,1.320,1.1070,0.7189,1006.10,8.60,91.90,7.50,3136648,242,10228.0,10646.0,49610,3,3468.0,2721.0,1007.4,21.0,16.0,55.3,7.1,19.2,57.1,10.5,4710.0,5536.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:12:04Z,14,0,100.0,15.5,62.1,0.600,351.00,0.600,-0.0939,0.5926,1006.10,8.60,91.90,7.50,3136658,242,10040.0,10443.0,49611,3,3412.0,2702.0,1007.6,21.0,16.0,55.3,7.1,19.2,57.0,10.5,4416.0,5164.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:12:14Z,14,0,100.0,15.5,62.1,1.870,43.00,1.870,1.2753,1.3676,1006.10,8.70,91.90,7.50,3136668,242,10468.0,10906.0,49612,3,3464.0,2716.0,1007.5,21.0,16.0,55.3,7.1,19.2,57.0,10.5,4820.0,5673.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:12:24Z,14,0,100.0,15.5,62.1,1.280,335.00,1.280,-0.5410,1.1601,1006.10,8.70,91.90,7.50,3136678,242,11786.0,12341.0,49613,3,3445.0,2729.0,1007.5,21.0,16.0,55.3,7.1,19.2,57.1,10.5,5105.0,6114.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:12:34Z,14,0,100.0,15.5,62.1,0.780,8.00,0.780,0.1086,0.7724,1006.10,8.70,91.90,7.50,3136688,242,10480.0,10919.0,49614,3,3427.0,2712.0,1007.5,21.0,16.0,55.3,7.1,19.2,57.1,10.5,4646.0,5429.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:12:44Z,14,0,100.0,15.5,62.1,0.980,66.00,0.980,0.8953,0.3986,1006.10,8.70,91.90,7.50,3136698,242,8541.0,8832.0,49615,3,3451.0,2707.0,1007.5,21.0,16.0,55.3,7.1,19.2,57.1,10.5,4042.0,4604.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:12:54Z,14,0,100.0,15.5,62.2,1.470,78.00,1.470,1.4379,0.3056,1006.10,8.70,91.90,7.50,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan, +2026-04-17T01:13:04Z,14,0,100.0,15.5,62.1,1.300,59.00,1.300,1.1143,0.6695,1006.10,8.70,91.80,7.50,3136718,242,12194.0,12788.0,49617,3,3404.0,2702.0,1007.5,21.0,16.0,55.4,7.1,19.2,57.1,10.5,5173.0,6202.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:13:14Z,14,0,100.0,15.5,62.2,0.590,65.00,0.590,0.5347,0.2493,1006.10,8.70,91.90,7.50,3136728,242,9355.0,9705.0,49618,3,3468.0,2717.0,1007.4,21.0,16.0,55.4,7.1,19.2,57.1,10.5,4400.0,5091.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:13:24Z,14,0,100.0,15.5,62.1,1.150,74.00,1.150,1.1055,0.3170,1006.10,8.70,91.90,7.50,3136738,242,11079.0,11569.0,49619,3,3445.0,2719.0,1007.6,21.0,16.0,55.4,7.1,19.2,57.1,10.5,4914.0,5827.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:13:34Z,14,0,100.0,15.5,62.1,1.380,72.00,1.380,1.3125,0.4264,1006.10,8.70,91.80,7.50,3136748,242,9832.0,10218.0,49620,3,3459.0,2709.0,1007.6,21.0,16.0,55.4,7.1,19.2,57.1,10.5,4574.0,5342.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:13:44Z,14,0,100.0,15.5,62.1,0.750,78.00,0.750,0.7336,0.1559,1006.10,8.70,91.80,7.50,3136758,242,11783.0,12338.0,49621,3,3403.0,2700.0,1007.4,21.0,16.0,55.4,7.1,19.2,57.1,10.5,5023.0,6002.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:13:54Z,14,0,100.0,15.5,62.2,0.700,358.00,0.700,-0.0244,0.6996,1006.10,8.70,91.80,7.50,3136768,242,12710.0,13356.0,49622,3,3427.0,2709.0,1007.4,21.0,16.0,55.4,7.1,19.2,57.1,10.5,5451.0,6612.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:14:04Z,14,0,100.0,15.5,62.2,0.900,9.00,0.900,0.1408,0.8889,1006.10,8.70,91.80,7.50,3136778,242,10533.0,10976.0,49623,3,3445.0,2718.0,1007.5,21.0,16.0,55.4,7.1,19.2,57.1,10.5,4733.0,5548.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:14:14Z,14,0,100.0,15.5,62.2,1.360,62.00,1.360,1.2008,0.6385,1006.10,8.70,91.80,7.50,3136789,242,12281.0,12884.0,49624,3,3423.0,2704.0,1007.4,21.0,16.0,55.4,7.1,19.2,57.1,10.5,5326.0,6398.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:14:24Z,14,0,100.0,15.5,62.2,0.630,357.00,0.630,-0.0330,0.6291,1006.10,8.70,91.80,7.50,3136799,242,15163.0,16082.0,49625,3,3441.0,2718.0,1007.5,21.0,16.0,55.4,7.1,19.2,57.1,10.5,6322.0,7943.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:14:34Z,14,0,100.0,15.5,62.2,0.990,69.00,0.990,0.9242,0.3548,1006.10,8.70,91.80,7.50,3136809,242,8107.0,8369.0,49626,3,3440.0,2699.0,1007.6,21.0,16.0,55.4,7.1,19.2,57.1,10.5,3837.0,4352.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:14:44Z,14,0,100.0,15.5,62.2,0.770,62.00,0.770,0.6799,0.3615,1006.10,8.70,91.80,7.50,3136819,242,11540.0,12072.0,49627,3,3443.0,2727.0,1007.4,21.0,16.0,55.4,7.1,19.2,57.1,10.5,5043.0,5987.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:14:54Z,14,0,100.0,15.5,62.2,0.610,77.00,0.610,0.5944,0.1372,1006.10,8.70,91.80,7.50,3136829,242,9904.0,10296.0,49628,3,3465.0,2717.0,1007.4,21.0,16.0,55.4,7.1,19.2,57.2,10.5,4601.0,5368.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:15:04Z,14,0,100.0,15.5,62.2,1.780,348.00,1.780,-0.3701,1.7411,1006.10,8.70,91.80,7.50,3136839,242,12320.0,12927.0,49629,3,3440.0,2717.0,1007.4,21.0,16.0,55.4,7.1,19.2,57.2,10.5,5370.0,6454.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:15:14Z,14,0,100.0,15.5,62.2,0.710,69.00,0.710,0.6628,0.2544,1006.10,8.70,91.80,7.50,3136849,242,6883.0,7072.0,49630,3,3459.0,2708.0,1007.5,21.0,16.0,55.4,7.1,19.2,57.1,10.5,3368.0,3745.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:15:24Z,14,0,100.0,15.5,62.2,0.320,40.00,0.320,0.2057,0.2451,1006.10,8.70,91.80,7.50,3136859,242,8033.0,8291.0,49631,3,3408.0,2703.0,1007.5,21.0,16.0,55.4,7.1,19.2,57.1,10.5,3643.0,4103.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:15:34Z,14,0,100.0,15.5,62.2,0.450,72.00,0.450,0.4280,0.1391,1006.10,8.70,91.80,7.50,3136869,242,9014.0,9339.0,49632,3,3456.0,2712.0,1007.5,21.0,16.0,55.5,7.1,19.2,57.1,10.5,4228.0,4859.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:15:44Z,14,0,100.0,15.5,62.2,0.200,89.00,0.200,0.2000,0.0035,1006.10,8.70,91.80,7.50,3136879,242,8888.0,9203.0,49633,3,3452.0,2708.0,1007.5,21.0,16.0,55.5,7.1,19.2,57.1,10.5,4168.0,4791.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:15:54Z,14,0,100.0,15.5,62.2,1.150,98.00,1.150,1.1388,-0.1600,1006.10,8.70,91.80,7.50,3136889,242,9925.0,10319.0,49634,3,3464.0,2723.0,1007.4,21.0,16.0,55.5,7.1,19.2,57.1,10.5,4571.0,5329.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:16:04Z,14,0,100.0,15.5,62.2,1.030,78.00,1.030,1.0075,0.2141,1006.10,8.70,91.80,7.50,3136899,242,10458.0,10895.0,49635,3,3476.0,2716.0,1007.6,21.0,16.0,55.5,7.1,19.2,57.1,10.5,4906.0,5758.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:16:14Z,14,0,100.0,15.5,62.2,0.660,90.00,0.660,0.6600,0.0000,1006.10,8.70,91.80,7.50,3136909,242,10704.0,11162.0,49636,3,3470.0,2716.0,1007.6,21.0,16.0,55.5,7.1,19.2,57.1,10.5,4951.0,5847.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:16:24Z,14,0,100.0,15.5,62.2,1.150,76.00,1.150,1.1158,0.2782,1006.10,8.70,91.80,7.50,3136919,242,10318.0,10743.0,49637,3,3455.0,2714.0,1007.4,21.0,16.0,55.5,7.1,19.2,57.1,10.5,4705.0,5540.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:16:34Z,14,0,100.0,15.5,62.2,1.320,83.00,1.320,1.3102,0.1609,1006.10,8.70,91.80,7.50,3136929,242,9606.0,9975.0,49638,3,3425.0,2702.0,1007.5,21.0,16.0,55.5,7.1,19.2,57.1,10.5,4348.0,5032.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:16:44Z,14,0,100.0,15.5,62.3,2.000,68.00,2.000,1.8544,0.7492,1006.10,8.70,91.80,7.50,3136939,242,9916.0,10309.0,49639,3,3437.0,2718.0,1007.4,21.0,16.0,55.5,7.1,19.2,57.1,10.5,4456.0,5166.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:16:54Z,14,0,100.0,15.5,62.2,1.100,74.00,1.100,1.0574,0.3032,1006.10,8.70,91.80,7.50,3136949,242,11227.0,11731.0,49640,3,3425.0,2711.0,1007.4,21.0,16.0,55.5,7.1,19.1,57.1,10.5,4919.0,5808.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:17:04Z,14,0,100.0,15.5,62.3,1.910,58.00,1.910,1.6198,1.0121,1006.10,8.70,91.80,7.50,3136960,242,5703.0,5833.0,49641,3,3451.0,2722.0,1007.6,21.0,16.0,55.5,7.1,19.2,57.1,10.5,2767.0,3012.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:17:14Z,14,0,100.0,15.5,62.2,1.460,13.00,1.460,0.3284,1.4226,1006.10,8.70,91.80,7.50,3136970,242,5870.0,6007.0,49642,3,3459.0,2708.0,1007.5,21.0,16.0,55.5,7.1,19.2,57.1,10.5,2917.0,3194.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:17:24Z,14,0,100.0,15.5,62.3,0.450,333.00,0.450,-0.2043,0.4010,1006.10,8.70,91.80,7.50,3136980,242,20129.0,21749.0,49643,3,3437.0,2721.0,1007.4,21.0,16.0,55.5,7.1,19.2,57.1,10.5,7716.0,10443.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:17:34Z,14,0,100.0,15.5,62.3,1.140,68.00,1.140,1.0570,0.4271,1006.10,8.70,91.80,7.50,3136990,242,20257.0,21898.0,49644,3,3469.0,2724.0,1007.4,21.0,16.0,55.5,7.1,19.2,57.1,10.5,7892.0,10935.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:17:44Z,14,0,100.0,15.5,62.3,0.770,94.00,0.770,0.7681,-0.0537,1006.10,8.70,91.90,7.50,3137000,242,17670.0,18918.0,49645,3,3422.0,2708.0,1007.4,21.0,16.0,55.5,7.1,19.2,57.1,10.5,6970.0,9141.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:17:54Z,14,0,100.0,15.5,62.3,1.190,59.00,1.190,1.0200,0.6129,1006.10,8.60,91.90,7.50,3137010,242,12297.0,12901.0,49646,3,3425.0,2710.0,1007.5,21.0,16.0,55.5,7.1,19.2,57.1,10.5,5311.0,6370.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:18:04Z,14,0,100.0,15.5,62.3,2.400,66.00,2.400,2.1925,0.9762,1006.10,8.60,91.90,7.50,3137020,242,6366.0,6528.0,49647,3,3449.0,2716.0,1007.5,21.0,16.0,55.5,7.1,19.2,57.1,10.5,3068.0,3381.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:18:14Z,14,0,100.0,15.5,62.3,0.990,27.00,0.990,0.4495,0.8821,1006.10,8.60,91.90,7.50,3137030,242,23150.0,25293.0,49648,3,3421.0,2703.0,1007.5,21.0,16.0,55.5,7.1,19.1,57.2,10.5,8376.0,12042.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:18:24Z,14,0,100.0,15.5,62.4,0.900,52.00,0.900,0.7092,0.5541,1006.10,8.60,91.90,7.50,3137040,242,17392.0,18601.0,49649,3,3438.0,2723.0,1007.4,21.0,16.0,55.6,7.1,19.2,57.2,10.5,6932.0,9010.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:18:34Z,14,0,100.0,15.5,62.4,0.930,349.00,0.930,-0.1775,0.9129,1006.10,8.60,92.00,7.50,3137050,242,13642.0,14386.0,49650,3,3454.0,2713.0,1007.4,21.0,16.0,55.5,7.1,19.1,57.2,10.5,5946.0,7325.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:18:44Z,14,0,100.0,15.5,62.4,0.890,74.00,0.890,0.8555,0.2453,1006.10,8.70,92.00,7.50,3137060,242,6933.0,7125.0,49651,3,3437.0,2716.0,1007.4,21.0,16.0,55.6,7.1,19.2,57.2,10.5,3266.0,3622.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:18:54Z,14,0,100.0,15.5,62.4,1.510,90.00,1.510,1.5100,0.0000,1006.10,8.70,92.00,7.50,3137070,242,9954.0,10350.0,49652,3,3468.0,2716.0,1007.4,21.0,16.0,55.6,7.1,19.2,57.2,10.5,4635.0,5424.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:19:04Z,14,0,100.0,15.5,62.4,1.110,113.00,1.110,1.0218,-0.4337,1006.10,8.70,91.90,7.50,3137080,242,8354.0,8633.0,49653,3,3437.0,2718.0,1007.4,21.0,16.0,55.5,7.1,19.2,57.2,10.5,3841.0,4352.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:19:14Z,14,0,100.0,15.5,62.3,1.030,51.00,1.030,0.8005,0.6482,1006.10,8.70,92.00,7.50,3137090,242,8584.0,8878.0,49654,3,3460.0,2714.0,1007.4,21.0,16.0,55.6,7.1,19.2,57.2,10.5,4055.0,4640.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:19:24Z,14,0,100.0,15.5,62.3,0.880,107.00,0.880,0.8415,-0.2573,1006.10,8.70,91.90,7.50,3137100,242,9419.0,9773.0,49655,3,3414.0,2703.0,1007.5,21.0,16.0,55.6,7.1,19.2,57.2,10.5,4166.0,4852.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:19:34Z,14,0,100.0,15.5,62.4,0.560,28.00,0.560,0.2629,0.4945,1006.10,8.70,92.00,7.50,3137110,242,9142.0,9476.0,49656,3,3418.0,2699.0,1007.5,21.0,16.0,55.6,7.1,19.2,57.2,10.5,4152.0,4762.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:19:44Z,14,0,100.0,15.5,62.4,0.660,67.00,0.660,0.6075,0.2579,1006.10,8.70,91.90,7.50,3137121,242,7501.0,7726.0,49657,3,3438.0,2714.0,1007.4,21.0,16.0,55.6,7.1,19.1,57.2,10.5,3521.0,3935.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:19:54Z,14,0,100.0,15.5,62.4,0.640,18.00,0.640,0.1978,0.6087,1006.10,8.70,91.90,7.50,3137131,242,7804.0,8047.0,49658,3,3437.0,2708.0,1007.4,21.0,16.0,55.6,7.1,19.1,57.2,10.5,3671.0,4122.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:20:04Z,14,0,100.0,15.5,62.4,0.320,326.00,0.320,-0.1789,0.2653,1006.10,8.70,91.90,7.50,3137141,242,5513.0,5634.0,49659,3,3441.0,2709.0,1007.5,21.0,16.0,55.6,7.1,19.2,57.3,10.5,2688.0,2924.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:20:14Z,14,0,100.0,15.5,62.4,0.260,61.00,0.260,0.2274,0.1261,1006.10,8.70,91.90,7.50,3137151,242,6346.0,6507.0,49660,3,3417.0,2702.0,1007.6,21.0,16.0,55.6,7.1,19.1,57.2,10.4,2994.0,3287.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:20:24Z,14,0,100.0,15.5,62.4,0.370,153.00,0.370,0.1680,-0.3297,1006.10,8.70,91.90,7.50,3137161,242,6650.0,6826.0,49661,3,3441.0,2721.0,1007.5,21.0,16.0,55.6,7.1,19.2,57.2,10.5,3136.0,3469.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:20:34Z,14,0,100.0,15.5,62.4,0.290,200.00,0.290,-0.0992,-0.2725,1006.10,8.70,91.90,7.50,3137171,242,8788.0,9096.0,49662,3,3428.0,2704.0,1007.4,21.0,16.0,55.6,7.1,19.1,57.2,10.4,4021.0,4610.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:20:44Z,14,0,100.0,15.5,62.4,0.450,80.00,0.450,0.4432,0.0781,1006.10,8.70,91.90,7.50,3137181,242,8409.0,8691.0,49663,3,3435.0,2716.0,1007.4,21.0,16.0,55.6,7.1,19.1,57.2,10.5,3864.0,4381.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:20:54Z,14,0,100.0,15.5,62.5,0.660,13.00,0.660,0.1485,0.6431,1006.10,8.70,91.90,7.50,3137191,242,8531.0,8822.0,49664,3,3457.0,2711.0,1007.5,21.0,16.0,55.6,7.1,19.2,57.2,10.5,4027.0,4611.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:21:04Z,14,0,100.0,15.5,62.5,1.590,65.00,1.590,1.4410,0.6720,1006.10,8.70,91.90,7.50,3137201,242,10625.0,11076.0,49665,3,3435.0,2721.0,1007.4,21.0,16.0,55.7,7.1,19.1,57.3,10.5,4703.0,5497.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:21:14Z,14,0,100.0,15.5,62.5,1.660,70.00,1.660,1.5599,0.5678,1006.10,8.70,91.90,7.50,3137211,242,5066.0,5168.0,49666,3,3459.0,2712.0,1007.4,21.0,16.0,55.6,7.1,19.2,57.2,10.5,2536.0,2742.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:21:24Z,14,0,100.0,15.5,62.5,0.500,95.00,0.500,0.4981,-0.0436,1006.10,8.70,91.90,7.50,3137221,242,6365.0,6527.0,49667,3,3437.0,2718.0,1007.5,21.0,16.0,55.7,7.1,19.2,57.2,10.5,3020.0,3316.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:21:34Z,14,0,100.0,15.5,62.5,0.920,79.00,0.920,0.9031,0.1755,1006.10,8.70,91.90,7.50,3137231,242,23638.0,25873.0,49668,3,3462.0,2718.0,1007.4,21.0,16.0,55.7,7.1,19.1,57.2,10.5,8674.0,12743.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:21:44Z,14,0,100.0,15.5,62.5,0.760,87.00,0.760,0.7590,0.0398,1006.10,8.70,91.80,7.50,3137241,242,8881.0,9196.0,49669,3,3411.0,2710.0,1007.4,21.0,16.0,55.7,7.1,19.1,57.2,10.5,3946.0,4511.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:21:54Z,14,0,100.0,15.5,62.4,0.900,58.00,0.900,0.7632,0.4769,1006.10,8.70,91.90,7.50,3137251,242,11346.0,11860.0,49670,3,3466.0,2714.0,1007.4,21.0,16.0,55.7,7.1,19.2,57.2,10.5,5160.0,6182.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:22:04Z,14,0,100.0,15.5,62.5,0.850,85.00,0.850,0.8468,0.0741,1006.10,8.70,91.90,7.50,3137261,242,9219.0,9558.0,49671,3,3441.0,2718.0,1007.6,21.0,16.0,55.7,7.1,19.1,57.2,10.5,4210.0,4829.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:22:14Z,14,0,100.0,15.5,62.5,0.980,85.00,0.980,0.9763,0.0854,1006.10,8.70,91.90,7.50,3137271,242,9861.0,10249.0,49672,3,3456.0,2708.0,1007.5,21.0,16.0,55.7,7.1,19.1,57.3,10.5,4594.0,5344.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:22:24Z,14,0,100.0,15.5,62.5,1.250,68.00,1.250,1.1590,0.4683,1006.10,8.70,91.90,7.50,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan, +2026-04-17T01:22:34Z,14,0,100.0,15.5,62.5,1.750,63.00,1.750,1.5593,0.7945,1006.10,8.70,91.90,7.50,3137282,242,9227.0,9567.0,49673,3,3402.0,2698.0,1007.4,21.0,16.0,55.7,7.1,19.1,57.2,10.5,4117.0,4707.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:22:44Z,14,0,100.0,15.5,62.5,1.440,74.00,1.440,1.3842,0.3969,1006.10,8.70,91.90,7.50,3137292,242,14628.0,15483.0,49674,3,3455.0,2717.0,1007.4,21.0,16.0,55.7,7.1,19.1,57.2,10.4,6222.0,7822.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:22:54Z,14,0,100.0,15.5,62.5,1.680,92.00,1.680,1.6790,-0.0586,1006.10,8.70,91.90,7.50,3137302,242,12253.0,12853.0,49675,3,3449.0,2709.0,1007.5,21.0,16.0,55.7,7.1,19.1,57.2,10.5,5412.0,6569.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:23:04Z,14,0,100.0,15.5,62.5,1.360,104.00,1.360,1.3196,-0.3290,1006.10,8.70,91.90,7.50,3137312,242,21013.0,22779.0,49676,3,3451.0,2718.0,1007.5,21.0,16.0,55.7,7.1,19.1,57.3,10.5,7954.0,11159.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:23:14Z,14,0,100.0,15.5,62.5,1.470,86.00,1.470,1.4664,0.1025,1006.10,8.70,91.90,7.50,3137322,242,7807.0,8050.0,49677,3,3430.0,2699.0,1007.4,21.0,16.0,55.7,7.1,19.1,57.3,10.5,3662.0,4135.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:23:24Z,14,0,100.0,15.5,62.5,1.450,77.00,1.450,1.4128,0.3262,1006.10,8.60,91.90,7.50,3137332,242,16215.0,17266.0,49678,3,3447.0,2702.0,1007.5,21.0,15.9,55.7,7.1,19.1,57.2,10.4,6762.0,8752.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:23:34Z,14,0,100.0,15.5,62.5,1.310,66.00,1.310,1.1967,0.5328,1006.10,8.60,91.90,7.50,3137342,242,12765.0,13416.0,49679,3,3524.0,2732.0,1007.5,20.9,15.9,55.7,7.1,19.1,57.2,10.4,5995.0,7325.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:23:44Z,14,0,100.0,15.5,62.5,1.320,82.00,1.320,1.3072,0.1837,1006.10,8.60,91.90,7.50,3137352,242,13340.0,14051.0,49680,3,3431.0,2716.0,1007.4,21.0,16.0,55.7,7.1,19.1,57.2,10.5,5654.0,6911.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:23:54Z,14,0,100.0,15.5,62.5,1.900,92.00,1.900,1.8988,-0.0663,1006.10,8.60,91.90,7.50,3137362,242,8487.0,8775.0,49681,3,3441.0,2713.0,1007.4,21.0,16.0,55.7,7.1,19.1,57.2,10.5,3927.0,4477.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:24:04Z,14,0,100.0,15.5,62.5,1.930,95.00,1.930,1.9227,-0.1682,1006.10,8.60,91.90,7.50,3137372,242,8763.0,9070.0,49682,3,3468.0,2714.0,1007.5,21.0,16.0,55.7,7.1,19.1,57.2,10.4,4179.0,4787.0,1760.0,8000.0,48,192,300.0,100.0,1.4, +2026-04-17T01:24:14Z,14,0,100.0,15.5,62.4,1.770,81.00,1.770,1.7482,0.2769,1006.10,8.60,91.90,7.40,3137382,242,6901.0,7091.0,49683,3,3419.0,2706.0,1007.5,21.0,16.0,55.7,7.1,19.1,57.2,10.4,3209.0,3565.0,1760.0,8000.0,48,192,300.0,100.0,1.4, diff --git a/tests/files/modulair/MOD-00256-db-cleaned-file1.parquet b/tests/files/modulair/MOD-00256-db-cleaned-file1.parquet new file mode 100644 index 0000000..b8e7cd7 Binary files /dev/null and b/tests/files/modulair/MOD-00256-db-cleaned-file1.parquet differ diff --git a/tests/files/modulair/MOD-00256-db-cleaned-file2.parquet b/tests/files/modulair/MOD-00256-db-cleaned-file2.parquet new file mode 100644 index 0000000..5a00eff Binary files /dev/null and b/tests/files/modulair/MOD-00256-db-cleaned-file2.parquet differ diff --git a/tests/files/modulair/MOD-00256-db-raw.parquet b/tests/files/modulair/MOD-00256-db-raw.parquet new file mode 100644 index 0000000..b8e7cd7 Binary files /dev/null and b/tests/files/modulair/MOD-00256-db-raw.parquet differ diff --git a/tests/files/modulair/ref/bos_roxbury-cleaned.parquet b/tests/files/modulair/ref/bos_roxbury-cleaned.parquet new file mode 100644 index 0000000..46a834b Binary files /dev/null and b/tests/files/modulair/ref/bos_roxbury-cleaned.parquet differ diff --git a/tests/test_clean.py b/tests/test_clean.py index 9a4083c..59540de 100644 --- a/tests/test_clean.py +++ b/tests/test_clean.py @@ -6,7 +6,7 @@ import shutil, tempfile import pandas as pd -from quantaq_cli.console import clean +from quantaq_cli.cli import clean_command class SetupTestCase(unittest.TestCase): @@ -17,11 +17,12 @@ def setUp(self): def tearDown(self): shutil.rmtree(self.test_dir) - def test_clean_file_arisense_db(self): + def test_clean_file_modulairpm_rawsd(self): runner = CliRunner() - result = runner.invoke(clean, + result = runner.invoke(clean_command, [ - os.path.join(self.test_files_dir, "arisense/SN000-063-db-file1.csv"), + os.path.join(self.test_files_dir, "modulair-pm/MOD-PM-00001-rawsd-file1.csv"), + "-o", os.path.join(self.test_dir, "output.csv"), ], catch_exceptions=False @@ -37,11 +38,12 @@ def test_clean_file_arisense_db(self): # is it a csv? self.assertEqual(p.suffix, ".csv") - def test_clean_file_modulairpm_rawsd(self): + def test_clean_file_modulairx_cloudapi(self): runner = CliRunner() - result = runner.invoke(clean, + result = runner.invoke(clean_command, [ - os.path.join(self.test_files_dir, "modulair-pm/MOD-PM-00001-rawsd-file1.csv"), + os.path.join(self.test_files_dir, "modulair-x/MOD-X-00993-cloudapi-file1.csv"), + "-o", os.path.join(self.test_dir, "output.csv"), ], catch_exceptions=False @@ -57,12 +59,13 @@ def test_clean_file_modulairpm_rawsd(self): # is it a csv? self.assertEqual(p.suffix, ".csv") - def test_clean_file_modulairx_cloudapi(self): + def test_clean_file_modulair_db_parquet(self): runner = CliRunner() - result = runner.invoke(clean, + result = runner.invoke(clean_command, [ - os.path.join(self.test_files_dir, "modulair-x/MOD-X-00993-cloudapi-file1.csv"), - os.path.join(self.test_dir, "output.csv"), + os.path.join(self.test_files_dir, "modulair/MOD-00256-db-raw.parquet"), + "-o", + os.path.join(self.test_dir, "output.parquet"), ], catch_exceptions=False ) @@ -71,9 +74,8 @@ def test_clean_file_modulairx_cloudapi(self): self.assertEqual(result.exit_code, 0) # make sure the file exists - p = Path(self.test_dir + "/output.csv") + p = Path(self.test_dir + "/output.parquet") self.assertTrue(p.exists()) - # is it a csv? - self.assertEqual(p.suffix, ".csv") - \ No newline at end of file + # is it a parquet? + self.assertEqual(p.suffix, ".parquet") diff --git a/tests/test_concat.py b/tests/test_concat.py index 14c8d25..2b3999f 100644 --- a/tests/test_concat.py +++ b/tests/test_concat.py @@ -6,8 +6,8 @@ import shutil, tempfile import pandas as pd -from quantaq_cli.console import concat - +from quantaq_cli.cli import concat_command +from quantaq_cli.utilities import safe_load class SetupTestCase(unittest.TestCase): def setUp(self): @@ -17,25 +17,22 @@ def setUp(self): def tearDown(self): shutil.rmtree(self.test_dir) - def test_concat_files_csv_arisense_db(self): + def test_concat_files_modulairx_rawsd(self): runner = CliRunner() - result = runner.invoke(concat, + result = runner.invoke(concat_command, [ "-o", os.path.join(self.test_dir, "output.csv"), - "-v", - os.path.join(self.test_files_dir, "arisense/SN000-063-db-file1.csv"), - os.path.join(self.test_files_dir, "arisense/SN000-063-db-file2.csv"), - ], - catch_exceptions=False + "--log-level", + "DEBUG", + os.path.join(self.test_files_dir, "modulair-x/MOD-X-00891-rawsd-file1.csv"), + os.path.join(self.test_files_dir, "modulair-x/MOD-X-00891-rawsd-file2.csv"), + ], catch_exceptions=False ) # did it succeed? self.assertEqual(result.exit_code, 0) - # did it output the correct text? - self.assertTrue("Saving file" in result.output) - # make sure the file exists p = Path(self.test_dir + "/output.csv") self.assertTrue(p.exists()) @@ -44,68 +41,23 @@ def test_concat_files_csv_arisense_db(self): self.assertEqual(p.suffix, ".csv") # are the number of lines correct? - df1 = pd.read_csv(os.path.join(self.test_files_dir, "arisense/SN000-063-db-file1.csv")) - df2 = pd.read_csv(os.path.join(self.test_files_dir, "arisense/SN000-063-db-file2.csv"), skiprows=1) - df3 = pd.read_csv(os.path.join(self.test_dir, "output.csv")).sort_values('timestamp') + df1 = safe_load(os.path.join(self.test_files_dir, "modulair-x/MOD-X-00891-rawsd-file1.csv")) + df2 = safe_load(os.path.join(self.test_files_dir, "modulair-x/MOD-X-00891-rawsd-file2.csv")) + df3 = safe_load(os.path.join(self.test_dir, "output.csv")) self.assertEqual(df1.shape[0] + df2.shape[0], df3.shape[0]) - # Are the timestamps correct? - for i, (_, r) in enumerate(df2.sort_values('timestamp').head().iterrows()): - self.assertEqual(r['timestamp'], df3.loc[i, "timestamp"]) - - def test_concat_logfiles(self): - runner = CliRunner() - result = runner.invoke(concat, - [ - "-o", - os.path.join(self.test_dir, "output.csv"), - "-l", - os.path.join(self.test_files_dir, "modulair-pm/logs/000001.txt"), - os.path.join(self.test_files_dir, "modulair-pm/logs/000002.txt"), - ], - catch_exceptions=False - ) - - # did it succeed? - print (result.stdout) - self.assertEqual(result.exit_code, 0) - - def test_concat_files_feather_arisense_db(self): - runner = CliRunner() - result = runner.invoke(concat, - [ - "-o", - os.path.join(self.test_dir, "output.feather"), - "-v", - os.path.join(self.test_files_dir, "arisense/SN000-063-db-file1.csv"), - os.path.join(self.test_files_dir, "arisense/SN000-063-db-file2.csv"), - ] - ) - - # did it succeed? - self.assertEqual(result.exit_code, 0) - - # did it output the correct text? - self.assertTrue("Saving file" in result.output) - - # make sure the file exists - p = Path(self.test_dir + "/output.feather") - self.assertTrue(p.exists()) - - # is it a csv? - self.assertEqual(p.suffix, ".feather") - - def test_concat_files_modulairx_rawsd(self): + def test_concat_files_modulairpm_rawsd(self): runner = CliRunner() - result = runner.invoke(concat, + result = runner.invoke(concat_command, [ "-o", os.path.join(self.test_dir, "output.csv"), - "-v", - os.path.join(self.test_files_dir, "modulair-x/MOD-X-00891-rawsd-file1.csv"), - os.path.join(self.test_files_dir, "modulair-x/MOD-X-00891-rawsd-file2.csv"), - ] + "--log-level", + "DEBUG", + os.path.join(self.test_files_dir, "modulair-pm/MOD-PM-00001-rawsd-file1.csv"), + os.path.join(self.test_files_dir, "modulair-pm/MOD-PM-00001-rawsd-file2.csv"), + ], catch_exceptions=False ) # did it succeed? @@ -119,22 +71,23 @@ def test_concat_files_modulairx_rawsd(self): self.assertEqual(p.suffix, ".csv") # are the number of lines correct? - df1 = pd.read_csv(os.path.join(self.test_files_dir, "modulair-x/MOD-X-00891-rawsd-file1.csv"), skiprows=3) - df2 = pd.read_csv(os.path.join(self.test_files_dir, "modulair-x/MOD-X-00891-rawsd-file2.csv"), skiprows=3) - df3 = pd.read_csv(os.path.join(self.test_dir, "output.csv")) + df1 = safe_load(os.path.join(self.test_files_dir, "modulair-pm/MOD-PM-00001-rawsd-file1.csv")) + df2 = safe_load(os.path.join(self.test_files_dir, "modulair-pm/MOD-PM-00001-rawsd-file2.csv")) + df3 = safe_load(os.path.join(self.test_dir, "output.csv")) self.assertEqual(df1.shape[0] + df2.shape[0], df3.shape[0]) - def test_concat_files_modulairpm_rawsd(self): + def test_concat_files_modulairx_cloudapi(self): runner = CliRunner() - result = runner.invoke(concat, + result = runner.invoke(concat_command, [ "-o", os.path.join(self.test_dir, "output.csv"), - "-v", - os.path.join(self.test_files_dir, "modulair-pm/MOD-PM-00001-rawsd-file1.csv"), - os.path.join(self.test_files_dir, "modulair-pm/MOD-PM-00001-rawsd-file2.csv"), - ] + "--log-level", + "DEBUG", + os.path.join(self.test_files_dir, "modulair-x/MOD-X-00993-cloudapi-file1.csv"), + os.path.join(self.test_files_dir, "modulair-x/MOD-X-00993-cloudapi-file2.csv"), + ], catch_exceptions=False ) # did it succeed? @@ -148,37 +101,38 @@ def test_concat_files_modulairpm_rawsd(self): self.assertEqual(p.suffix, ".csv") # are the number of lines correct? - df1 = pd.read_csv(os.path.join(self.test_files_dir, "modulair-pm/MOD-PM-00001-rawsd-file1.csv"), skiprows=3) - df2 = pd.read_csv(os.path.join(self.test_files_dir, "modulair-pm/MOD-PM-00001-rawsd-file2.csv"), skiprows=3) - df3 = pd.read_csv(os.path.join(self.test_dir, "output.csv")) + df1 = safe_load(os.path.join(self.test_files_dir, "modulair-x/MOD-X-00993-cloudapi-file1.csv")) + df2 = safe_load(os.path.join(self.test_files_dir, "modulair-x/MOD-X-00993-cloudapi-file2.csv")) + df3 = safe_load(os.path.join(self.test_dir, "output.csv")) self.assertEqual(df1.shape[0] + df2.shape[0], df3.shape[0]) - def test_concat_files_modulairx_cloudapi(self): + def test_concat_files_modulair_db_parquet(self): runner = CliRunner() - result = runner.invoke(concat, + result = runner.invoke(concat_command, [ "-o", - os.path.join(self.test_dir, "output.csv"), - "-v", - os.path.join(self.test_files_dir, "modulair-x/MOD-X-00993-cloudapi-file1.csv"), - os.path.join(self.test_files_dir, "modulair-x/MOD-X-00993-cloudapi-file2.csv"), - ] + os.path.join(self.test_dir, "output.parquet"), + "--log-level", + "DEBUG", + os.path.join(self.test_files_dir, "modulair/MOD-00256-db-cleaned-file1.parquet"), + os.path.join(self.test_files_dir, "modulair/MOD-00256-db-cleaned-file2.parquet"), + ], catch_exceptions=False ) # did it succeed? self.assertEqual(result.exit_code, 0) # make sure the file exists - p = Path(self.test_dir + "/output.csv") + p = Path(self.test_dir + "/output.parquet") self.assertTrue(p.exists()) - # is it a csv? - self.assertEqual(p.suffix, ".csv") + # is it a parquet? + self.assertEqual(p.suffix, ".parquet") # are the number of lines correct? - df1 = pd.read_csv(os.path.join(self.test_files_dir, "modulair-x/MOD-X-00993-cloudapi-file1.csv")) - df2 = pd.read_csv(os.path.join(self.test_files_dir, "modulair-x/MOD-X-00993-cloudapi-file2.csv")) - df3 = pd.read_csv(os.path.join(self.test_dir, "output.csv")) + df1 = safe_load(os.path.join(self.test_files_dir, "modulair/MOD-00256-db-cleaned-file1.parquet")) + df2 = safe_load(os.path.join(self.test_files_dir, "modulair/MOD-00256-db-cleaned-file2.parquet")) + df3 = safe_load(os.path.join(self.test_dir, "output.parquet")) self.assertEqual(df1.shape[0] + df2.shape[0], df3.shape[0]) diff --git a/tests/test_expunge.py b/tests/test_expunge.py index 7e7f454..2413a45 100644 --- a/tests/test_expunge.py +++ b/tests/test_expunge.py @@ -1,14 +1,17 @@ +import os +import shutil +import tempfile import unittest -from click.testing import CliRunner from os import path from pathlib import Path -import os -import shutil, tempfile -import pandas as pd -import numpy as np -from quantaq_cli.console import expunge +from click.testing import CliRunner +import numpy as np +import pandas as pd +from pandas.testing import assert_frame_equal +from quantaq_cli import expunge_dataframe, flag_summary +from quantaq_cli.cli import expunge_command class SetupTestCase(unittest.TestCase): def setUp(self): @@ -18,15 +21,16 @@ def setUp(self): def tearDown(self): shutil.rmtree(self.test_dir) - def test_expunge_csv_arisense_db(self): + def test_expunge_csv_modulairpm_rawsd(self): runner = CliRunner() - result = runner.invoke(expunge, + result = runner.invoke(expunge_command, [ "-o", os.path.join(self.test_dir, "output.csv"), - "-v", - os.path.join(self.test_files_dir, "arisense/SN000-063-db-file1.csv"), - ] + "--log-level", + "DEBUG", + os.path.join(self.test_files_dir, "modulair-pm/MOD-PM-00001-rawsd-file1.csv"), + ], catch_exceptions=False ) # did it succeed? @@ -42,78 +46,16 @@ def test_expunge_csv_arisense_db(self): # is it a csv? self.assertEqual(p.suffix, ".csv") - def test_expunge_dryrun(self): - runner = CliRunner() - result = runner.invoke(expunge, - [ - "-o", - os.path.join(self.test_dir, "output.feather"), - "--dry-run", - "--table", - os.path.join(self.test_files_dir, "arisense/SN000-063-db-file1.csv"), - ] - ) - - # did it succeed? - self.assertEqual(result.exit_code, 0) - - # did it output the correct text? - self.assertTrue("FLAG BREAKDOWN" in result.output) - - # make sure the file does not exist - p = Path(self.test_dir + "/output.feather") - self.assertFalse(p.exists()) - - def test_expunge_dict(self): - runner = CliRunner() - result = runner.invoke(expunge, - [ - "-o", - os.path.join(self.test_dir, "output.feather"), - "--dry-run", - os.path.join(self.test_files_dir, "arisense/SN000-063-db-file1.csv"), - ] - ) - - # did it succeed? - self.assertEqual(result.exit_code, 0) - - # did it output the correct text? - self.assertFalse("FLAG BREAKDOWN" in result.output) - - def test_expunge_feather_arisense_db(self): - runner = CliRunner() - result = runner.invoke(expunge, - [ - "-o", - os.path.join(self.test_dir, "output.feather"), - os.path.join(self.test_files_dir, "arisense/SN000-063-db-file1.csv"), - ] - ) - - # did it succeed? - self.assertEqual(result.exit_code, 0) - - - # did it output the correct text? - self.assertFalse("FLAG BREAKDOWN" in result.output) - - # make sure the file does not exist - p = Path(self.test_dir + "/output.feather") - self.assertTrue(p.exists()) - - # is it a csv? - self.assertEqual(p.suffix, ".feather") - - def test_expunge_csv_modulairpm_rawsd(self): + def test_expunge_csv_modulair_db(self): runner = CliRunner() - result = runner.invoke(expunge, + result = runner.invoke(expunge_command, [ "-o", os.path.join(self.test_dir, "output.csv"), - "-v", - os.path.join(self.test_files_dir, "modulair-pm/MOD-PM-00001-rawsd-file1.csv"), - ] + "--log-level", + "DEBUG", + os.path.join(self.test_files_dir, "modulair/MOD-00014-db-raw.csv"), + ], catch_exceptions=False ) # did it succeed? @@ -129,15 +71,16 @@ def test_expunge_csv_modulairpm_rawsd(self): # is it a csv? self.assertEqual(p.suffix, ".csv") - def test_expunge_csv_modulair_db(self): + def test_expunge_csv_modulairx_rawsd(self): runner = CliRunner() - result = runner.invoke(expunge, + result = runner.invoke(expunge_command, [ "-o", os.path.join(self.test_dir, "output.csv"), - "-v", - os.path.join(self.test_files_dir, "modulair/MOD-00014-db-raw.csv"), - ] + "--log-level", + "DEBUG", + os.path.join(self.test_files_dir, "modulair-x/MOD-X-00891-rawsd-file1.csv"), + ], catch_exceptions=False ) # did it succeed? @@ -153,15 +96,16 @@ def test_expunge_csv_modulair_db(self): # is it a csv? self.assertEqual(p.suffix, ".csv") - def test_expunge_csv_modulairx_rawsd(self): + def test_expunge_csv_modulairx_cloudapi(self): runner = CliRunner() - result = runner.invoke(expunge, + result = runner.invoke(expunge_command, [ "-o", os.path.join(self.test_dir, "output.csv"), - "-v", - os.path.join(self.test_files_dir, "modulair-x/MOD-X-00891-rawsd-file1.csv"), - ] + "--log-level", + "DEBUG", + os.path.join(self.test_files_dir, "modulair-x/MOD-X-00993-cloudapi-file1.csv"), + ], catch_exceptions=False ) # did it succeed? @@ -177,15 +121,211 @@ def test_expunge_csv_modulairx_rawsd(self): # is it a csv? self.assertEqual(p.suffix, ".csv") - def test_expunge_csv_modulairx_cloudapi(self): +def test_expunge_dataframe_noop(): + """Ensure expunge_dataframe doesn't change data that doesn't meet new flags.""" + sample_df = pd.DataFrame( + [ + { + "timestamp": pd.to_datetime("2023-03-10T17:41:24Z"), + "rh": 77.6, + "temp": -10.4, + "pm1_env": 10.6, + "pm25_env": 25.0, + "pm10_env": 32.4, + "neph_bin0": 1590.375, + "co_we": 758.8, + "co_ae": 656.8, + "co_diff": 102.0, + "flag": 0, + "sn" : 'MOD-00001', + }, + ], + ) + + flagged = expunge_dataframe(sample_df) + + assert_frame_equal(flagged, sample_df) + + +def test_expunge_dataframe_irrelevant_flag(): + """Ensure expunge_dataframe doesn't change data with irrelevant flags. + + In this case, the flags don't apply to the current columns. + """ + sample_df = pd.DataFrame( + [ + { + "timestamp": pd.to_datetime("2023-03-10T17:41:24Z"), + "rh": 77.6, + "temp": -10.4, + "pm1_env": 10.6, + "pm25_env": 25.0, + "pm10_env": 32.4, + "neph_bin0": 1590.375, + "co_we": 758.8, + "co_ae": 656.8, + "co_diff": 102.0, + "flag": 128, # FLAG_O3 -- doesn't change any current values + "sn" : 'MOD-00001', + }, + ], + ) + + flagged = expunge_dataframe(sample_df) + + assert_frame_equal(flagged, sample_df) + + +def test_expunge_dataframe_expunges_rht(): + """Ensure expunge_dataframe expunges values correctly for FLAG_RHT.""" + sample_df = pd.DataFrame( + [ + { + "timestamp": pd.to_datetime("2023-03-10T17:41:24Z"), + "rh": 20000, # too high! + "temp": -10.4, + "pm1_env": 10.6, + "pm25_env": 25.0, + "pm10_env": 32.4, + "neph_bin0": 1590.375, + "co_we": 758.8, + "co_ae": 656.8, + "co_diff": 102.0, + "flag": 8, # FLAG_RHT + "sn" : 'MOD-00001', + }, + ], + ) + + flagged = expunge_dataframe(sample_df) + + # Ensure rh and temp are expunged. + expected = sample_df.copy().assign(rh=np.nan, temp=np.nan) + assert_frame_equal(flagged, expected, check_dtype=False) + + +def test_expunge_dataframe_expunges_startup(): + """Ensure expunge_dataframe expunges all columns correctly for FLAG_STARTUP.""" + sample_df = pd.DataFrame( + [ + { + "timestamp": pd.to_datetime("2023-03-10T17:41:24Z"), + "sn": "MOD-12345", + "rh": 20000., # too high! + "temp": -10.4, + "pm1_env": 10.6, + "pm25_env": 25.0, + "pm10_env": 32.4, + "neph_bin0": 1590.375, + "co_we": 758.8, + "co_ae": 656.8, + "co_diff": 102.0, + "flag": 1, # FLAG_STARTUP + }, + ], + ) + + flagged = expunge_dataframe(sample_df) + + # Ensure most columns are expunged but key metadata is unaffected. + expected = pd.DataFrame( + [ + { + "timestamp": pd.to_datetime("2023-03-10T17:41:24Z"), + "sn": "MOD-12345", + "rh": np.nan, + "temp": np.nan, + "pm1_env": np.nan, + "pm25_env": np.nan, + "pm10_env": np.nan, + "neph_bin0": np.nan, + "co_we": np.nan, + "co_ae": np.nan, + "co_diff": np.nan, + "flag": 1, # FLAG_STARTUP + }, + ], + ) + assert_frame_equal(flagged, expected) + + +def test_flag_summary_basic(): + """Simple check to confirm flag_summary correctness.""" + sample_df = pd.DataFrame( + [ + { + "flag": 1 | 4, # FLAG_STARTUP | FLAG_NEPH + }, + { + "flag": 1 | 32 | 64, # FLAG_STARTUP | FLAG_NO | FLAG_NO2, + }, + { + "flag": 0, + }, + ], + ) + summary = flag_summary(sample_df) + + expected = pd.DataFrame( + { + "FLAG VALUE": { + "FLAG_BAT": 2048, + "FLAG_CO": 16, + "FLAG_CO2": 256, + "FLAG_H2S": 1024, + "FLAG_NEPH": 4, + "FLAG_NO": 32, + "FLAG_NO2": 64, + "FLAG_O3": 128, + "FLAG_OPC": 2, + "FLAG_RHTP": 8, + "FLAG_SO2": 512, + "FLAG_STARTUP": 1, + }, + "# OCCURENCES": { + "FLAG_BAT": 0, + "FLAG_CO": 0, + "FLAG_CO2": 0, + "FLAG_H2S": 0, + "FLAG_NEPH": 1, + "FLAG_NO": 1, + "FLAG_NO2": 1, + "FLAG_O3": 0, + "FLAG_OPC": 0, + "FLAG_RHTP": 0, + "FLAG_SO2": 0, + "FLAG_STARTUP": 2, + }, + "% DATA": { + "FLAG_BAT": "0.0", + "FLAG_CO": "0.0", + "FLAG_CO2": "0.0", + "FLAG_H2S": "0.0", + "FLAG_NEPH": "33.3", + "FLAG_NO": "33.3", + "FLAG_NO2": "33.3", + "FLAG_O3": "0.0", + "FLAG_OPC": "0.0", + "FLAG_RHTP": "0.0", + "FLAG_SO2": "0.0", + "FLAG_STARTUP": "66.7", + }, + }, + ) + expected.index.name = "FLAG" + + assert_frame_equal(summary.sort_index(), expected.sort_index()) + + def test_expunge_modulair_db_parquet(self): runner = CliRunner() - result = runner.invoke(expunge, + result = runner.invoke(expunge_command, [ "-o", - os.path.join(self.test_dir, "output.csv"), - "-v", - os.path.join(self.test_files_dir, "modulair-x/MOD-X-00993-cloudapi-file1.csv"), - ] + os.path.join(self.test_dir, "output.parquet"), + "--log-level", + "DEBUG", + os.path.join(self.test_files_dir, "modulair/MOD-00256-db-raw.parquet"), + ], catch_exceptions=False ) # did it succeed? @@ -195,8 +335,8 @@ def test_expunge_csv_modulairx_cloudapi(self): self.assertTrue("Saving file" in result.output) # make sure the file exists - p = Path(self.test_dir + "/output.csv") + p = Path(self.test_dir + "/output.parquet") self.assertTrue(p.exists()) # is it a csv? - self.assertEqual(p.suffix, ".csv") + self.assertEqual(p.suffix, ".parquet") diff --git a/tests/test_flag.py b/tests/test_flag.py index 6a48d2c..df3ed56 100644 --- a/tests/test_flag.py +++ b/tests/test_flag.py @@ -1,12 +1,13 @@ +import os +import shutil +import tempfile import unittest -from click.testing import CliRunner -from os import path from pathlib import Path -import os -import shutil, tempfile + import pandas as pd +from click.testing import CliRunner -from quantaq_cli.console import flag +from quantaq_cli.cli import flag_command class SetupTestCase(unittest.TestCase): def setUp(self): @@ -16,18 +17,16 @@ def setUp(self): def tearDown(self): shutil.rmtree(self.test_dir) - def test_flag_files_arisense_db(self): + def test_flag_files_modulair_db(self): runner = CliRunner() - result = runner.invoke(flag, + result = runner.invoke(flag_command, [ "-o", os.path.join(self.test_dir, "output.csv"), - "-v", - os.path.join(self.test_files_dir, "arisense/SN000-063-db-file1.csv"), - "co_we", - "lt", - "205.0" - ] + "--log-level", + "DEBUG", + os.path.join(self.test_files_dir, "modulair/MOD-00014-db-raw.csv"), + ], catch_exceptions=False ) # did it succeed? @@ -43,72 +42,41 @@ def test_flag_files_arisense_db(self): # is it a csv? self.assertEqual(p.suffix, ".csv") - def test_flag_files_feather(self): - runner = CliRunner() - result = runner.invoke(flag, - [ - "-o", - os.path.join(self.test_dir, "output.feather"), - "-v", - os.path.join(self.test_files_dir, "arisense/SN000-063-db-file1.csv"), - "co_we", - "gt", - "505.0" - ] - ) - - # did it succeed? - self.assertEqual(result.exit_code, 0) - - # did it output the correct text? - self.assertTrue("File to read" in result.output) - - # make sure the file exists - p = Path(self.test_dir + "/output.feather") - self.assertTrue(p.exists()) - - # is it a csv? - self.assertEqual(p.suffix, ".feather") - - def test_flag_files_modulair_db(self): - runner = CliRunner() - result = runner.invoke(flag, - [ - "-o", - os.path.join(self.test_dir, "output.csv"), - "-v", - os.path.join(self.test_files_dir, "modulair/MOD-00014-db-raw.csv"), - "co_we", - "lt", - "205.0" - ] - ) + #def test_flag_files_modulairx_rawsd(self): + # NOTE: not currently implemented + # runner = CliRunner() + # result = runner.invoke(flag_command, + # [ + # "-o", + # os.path.join(self.test_dir, "output.csv"), + # "-v", + # os.path.join(self.test_files_dir, "modulair-x/MOD-X-00891-rawsd-file1.csv"), + # ], catch_exceptions=False + # ) # did it succeed? - self.assertEqual(result.exit_code, 0) + # self.assertEqual(result.exit_code, 0)# - # did it output the correct text? - self.assertTrue("File to read" in result.output) + # # did it output the correct text? + # self.assertTrue("File to read" in result.output) - # make sure the file exists - p = Path(self.test_dir + "/output.csv") - self.assertTrue(p.exists()) + # # make sure the file exists + # p = Path(self.test_dir + "/output.csv") + # self.assertTrue(p.exists()) - # is it a csv? - self.assertEqual(p.suffix, ".csv") + # # is it a csv? + # self.assertEqual(p.suffix, ".csv") - def test_flag_files_modulairx_rawsd(self): + def test_flag_files_modulairx_cloudapi(self): runner = CliRunner() - result = runner.invoke(flag, - [ + result = runner.invoke(flag_command, + [ "-o", os.path.join(self.test_dir, "output.csv"), - "-v", - os.path.join(self.test_files_dir, "modulair-x/MOD-X-00891-rawsd-file1.csv"), - "co_we", - "lt", - "205.0" - ] + "--log-level", + "DEBUG", + os.path.join(self.test_files_dir, "modulair-x/MOD-X-00993-cloudapi-file1.csv"), + ], catch_exceptions=False ) # did it succeed? @@ -124,18 +92,16 @@ def test_flag_files_modulairx_rawsd(self): # is it a csv? self.assertEqual(p.suffix, ".csv") - def test_flag_files_modulairx_cloudapi(self): + def test_flag_files_modulair_db_parquet(self): runner = CliRunner() - result = runner.invoke(flag, - [ + result = runner.invoke(flag_command, + [ "-o", - os.path.join(self.test_dir, "output.csv"), - "-v", - os.path.join(self.test_files_dir, "modulair-x/MOD-X-00993-cloudapi-file1.csv"), - "co_we", - "lt", - "205.0" - ] + os.path.join(self.test_dir, "output.parquet"), + "--log-level", + "DEBUG", + os.path.join(self.test_files_dir, "modulair/MOD-00256-db-raw.parquet"), + ], catch_exceptions=False ) # did it succeed? @@ -145,8 +111,8 @@ def test_flag_files_modulairx_cloudapi(self): self.assertTrue("File to read" in result.output) # make sure the file exists - p = Path(self.test_dir + "/output.csv") + p = Path(self.test_dir + "/output.parquet") self.assertTrue(p.exists()) - # is it a csv? - self.assertEqual(p.suffix, ".csv") + # is it a parquet? + self.assertEqual(p.suffix, ".parquet") diff --git a/tests/test_merge.py b/tests/test_merge.py index 2e8d1c3..ba401cf 100644 --- a/tests/test_merge.py +++ b/tests/test_merge.py @@ -1,12 +1,14 @@ -import unittest -from click.testing import CliRunner +import os from os import path from pathlib import Path -import os -import shutil, tempfile +import shutil +import tempfile +import unittest + +from click.testing import CliRunner import pandas as pd -from quantaq_cli.console import merge, concat +from quantaq_cli.cli import concat_command, merge_command from quantaq_cli.utilities import safe_load @@ -20,11 +22,12 @@ def tearDown(self): def test_merge_files_modulair_db(self): runner = CliRunner() - result = runner.invoke(merge, + result = runner.invoke(merge_command, [ "-o", os.path.join(self.test_dir, "output.csv"), - "-v", + "--log-level", + "DEBUG", os.path.join(self.test_files_dir, "modulair/MOD-00014-db-raw.csv"), os.path.join(self.test_files_dir, "modulair/MOD-00014-db-final.csv"), ], @@ -47,19 +50,20 @@ def test_merge_files_modulair_db(self): # are the number of lines correct? df1 = safe_load(os.path.join(self.test_files_dir, "modulair/MOD-00014-db-raw.csv")) df2 = safe_load(os.path.join(self.test_files_dir, "modulair/MOD-00014-db-final.csv")) - df3 = safe_load(os.path.join(self.test_dir, "output.csv")) + df3 = safe_load(os.path.join(self.test_dir, "output.csv")) self.assertEqual(df1.shape[1] + df2.shape[1] - 1, df3.shape[1]) - - def test_merge_files_feather(self): + + def test_merge_files_modulair_db_parquet(self): runner = CliRunner() - result = runner.invoke(merge, + result = runner.invoke(merge_command, [ "-o", - os.path.join(self.test_dir, "output.feather"), - "-v", - os.path.join(self.test_files_dir, "arisense/SN000-063-db-file1.csv"), - os.path.join(self.test_files_dir, "arisense/ref/ref.csv"), + os.path.join(self.test_dir, "output.parquet"), + "--log-level", + "DEBUG", + os.path.join(self.test_files_dir, "modulair/MOD-00256-db-cleaned-file1.parquet"), + os.path.join(self.test_files_dir, "modulair/ref/bos_roxbury-cleaned.parquet"), ], catch_exceptions=False ) @@ -71,58 +75,64 @@ def test_merge_files_feather(self): self.assertTrue("Saving file" in result.output) # make sure the file exists - p = Path(self.test_dir + "/output.feather") + p = Path(self.test_dir + "/output.parquet") self.assertTrue(p.exists()) - # is it a csv? - self.assertEqual(p.suffix, ".feather") + # is it a parquet? + self.assertEqual(p.suffix, ".parquet") - def test_concat_then_merge(self): - runner = CliRunner() - res1 = runner.invoke(concat, - [ - "-o", - os.path.join(self.test_dir, "concat1.csv"), - os.path.join(self.test_files_dir, "modulair-pm/MOD-PM-00001-rawsd-file1.csv"), - os.path.join(self.test_files_dir, "modulair-pm/MOD-PM-00001-rawsd-file2.csv"), - ], - catch_exceptions=False - ) - - self.assertEqual(res1.exit_code, 0) - - res2 = runner.invoke(concat, - [ - "-o", - os.path.join(self.test_dir, "concat2.csv"), - "-l", - os.path.join(self.test_files_dir, "modulair-pm/logs/000001.txt"), - os.path.join(self.test_files_dir, "modulair-pm/logs/000002.txt"), - ], - catch_exceptions=False - ) - - self.assertEqual(res2.exit_code, 0) - - res3 = runner.invoke(merge, - [ - "-o", - os.path.join(self.test_dir, "final.csv"), - os.path.join(self.test_dir, "concat1.csv"), - os.path.join(self.test_dir, "concat2.csv"), - ], - catch_exceptions=False - ) + # are the number of lines correct? + df1 = safe_load(os.path.join(self.test_files_dir, "modulair/MOD-00256-db-cleaned-file1.parquet")) + df2 = safe_load(os.path.join(self.test_files_dir, "modulair/ref/bos_roxbury-cleaned.parquet")) + df3 = safe_load(os.path.join(self.test_dir, "output.parquet")) + + self.assertEqual(df1.shape[1] + df2.shape[1] - 1, df3.shape[1]) - self.assertEqual(res3.exit_code, 0) + #def test_concat_then_merge(self): + # runner = CliRunner() + # res1 = runner.invoke(concat_command, + # [ + # "-o", + # os.path.join(self.test_dir, "concat1.csv"), + # os.path.join(self.test_files_dir, "modulair-pm/MOD-PM-00001-rawsd-file1.csv"), + # os.path.join(self.test_files_dir, "modulair-pm/MOD-PM-00001-rawsd-file2.csv"), + # ], catch_exceptions=False + # ) + + # self.assertEqual(res1.exit_code, 0) + + # res2 = runner.invoke(concat_command, + # [ + # "-o", + # os.path.join(self.test_dir, "concat2.csv"), + # "-l", + # os.path.join(self.test_files_dir, "modulair-pm/logs/000001.txt"), + # os.path.join(self.test_files_dir, "modulair-pm/logs/000002.txt"), + # ], catch_exceptions=False + # ) + + # self.assertEqual(res2.exit_code, 0) + + # res3 = runner.invoke(merge_command, + # [ + # "-o", + # os.path.join(self.test_dir, "final.csv"), + # os.path.join(self.test_dir, "concat1.csv"), + # os.path.join(self.test_dir, "concat2.csv"), + # ], + # catch_exceptions=False + # ) + + # self.assertEqual(res3.exit_code, 0) def test_merge_files_modulairx_rawsd(self): runner = CliRunner() - result = runner.invoke(merge, + result = runner.invoke(merge_command, [ "-o", os.path.join(self.test_dir, "output.csv"), - "-v", + "--log-level", + "DEBUG", os.path.join(self.test_files_dir, "modulair-x/MOD-X-00891-rawsd-file1.csv"), os.path.join(self.test_files_dir, "modulair-x/MOD-X-00891-rawsd-file2.csv"), ], @@ -145,18 +155,18 @@ def test_merge_files_modulairx_rawsd(self): # are the number of lines correct? df1 = safe_load(os.path.join(self.test_files_dir, "modulair-x/MOD-X-00891-rawsd-file1.csv")) df2 = safe_load(os.path.join(self.test_files_dir, "modulair-x/MOD-X-00891-rawsd-file2.csv")) - df3 = safe_load(os.path.join(self.test_dir, "output.csv")) + df3 = safe_load(os.path.join(self.test_dir, "output.csv")) - print(df1.shape[1], df2.shape[1], df3.shape[1], flush=True) self.assertEqual(df1.shape[1] + df2.shape[1] - 1, df3.shape[1]) def test_merge_files_modulairx_cloudapi(self): runner = CliRunner() - result = runner.invoke(merge, + result = runner.invoke(merge_command, [ "-o", os.path.join(self.test_dir, "output.csv"), - "-v", + "--log-level", + "DEBUG", os.path.join(self.test_files_dir, "modulair-x/MOD-X-00993-cloudapi-file1.csv"), os.path.join(self.test_files_dir, "modulair-x/MOD-X-00993-cloudapi-file2.csv"), ], @@ -179,8 +189,7 @@ def test_merge_files_modulairx_cloudapi(self): # are the number of lines correct? df1 = safe_load(os.path.join(self.test_files_dir, "modulair-x/MOD-X-00993-cloudapi-file1.csv")) df2 = safe_load(os.path.join(self.test_files_dir, "modulair-x/MOD-X-00993-cloudapi-file2.csv")) - df3 = safe_load(os.path.join(self.test_dir, "output.csv")) + df3 = safe_load(os.path.join(self.test_dir, "output.csv")) - print(df1.shape[1], df2.shape[1], df3.shape[1], flush=True) self.assertEqual(df1.shape[1] + df2.shape[1] - 1, df3.shape[1]) \ No newline at end of file diff --git a/tests/test_resample.py b/tests/test_resample.py index 4c84c00..1df1c67 100644 --- a/tests/test_resample.py +++ b/tests/test_resample.py @@ -10,8 +10,8 @@ from click.testing import CliRunner from loguru import logger -from quantaq_cli.console import resample -from quantaq_cli.console.commands.resample import resample_dataframe, WIND_COLUMNS +from quantaq_cli.toolkit.resample import resample_dataframe +from quantaq_cli.cli import resample_command from quantaq_cli.utilities import safe_load @@ -23,15 +23,16 @@ def setUp(self): def tearDown(self): shutil.rmtree(self.test_dir) - def test_resample_files_csv(self): + def test_resample_modulair_db(self): runner = CliRunner() - result = runner.invoke(resample, + result = runner.invoke(resample_command, [ "-o", os.path.join(self.test_dir, "output.csv"), - "-v", - os.path.join(self.test_files_dir, "arisense/ref/ref.csv"), - "10min", + "--log-level", + "DEBUG", + os.path.join(self.test_files_dir, "modulair/MOD-00014-db-raw.csv"), + "1h", ], catch_exceptions=False ) @@ -54,49 +55,20 @@ def test_resample_files_csv(self): idx = df.timestamp.values - self.assertEqual((idx[1] - idx[0]) / np.timedelta64(1, 's'), 600.0) - - def test_resample_files_feather(self): - runner = CliRunner() - result = runner.invoke(resample, - [ - "-o", - os.path.join(self.test_dir, "output.feather"), - "-v", - os.path.join(self.test_files_dir, "arisense/ref/ref.csv"), - "10min", - ], catch_exceptions=False - ) - - # did it succeed? - self.assertEqual(result.exit_code, 0) - - # did it output the correct text? - self.assertTrue("Saving file" in result.output) - - # make sure the file exists - p = Path(self.test_dir + "/output.feather") - self.assertTrue(p.exists()) - - # is it a csv? - self.assertEqual(p.suffix, ".feather") - - # are the number of lines correct? - df = pd.read_feather(os.path.join(self.test_dir, "output.feather")) - - idx = df.timestamp.values - - self.assertEqual((idx[1] - idx[0]) / np.timedelta64(1, 's'), 600.0) + self.assertEqual((idx[1] - idx[0]) / np.timedelta64(1, 's'), 3600.0) - def test_resample_modulair_db(self): + def test_resample_modulairpm_rawsd(self): runner = CliRunner() - result = runner.invoke(resample, + result = runner.invoke(resample_command, [ "-o", os.path.join(self.test_dir, "output.csv"), - "-v", - os.path.join(self.test_files_dir, "modulair/MOD-00014-db-raw.csv"), - "1h", + "--log-level", + "DEBUG", + os.path.join(self.test_files_dir, "modulair-pm/MOD-PM-00001-rawsd-file1.csv"), + "10min", + "--on", + "timestamp_iso" ], catch_exceptions=False ) @@ -115,23 +87,22 @@ def test_resample_modulair_db(self): # are the number of lines correct? df = pd.read_csv(os.path.join(self.test_dir, "output.csv")) - df['timestamp'] = df['timestamp'].map(pd.to_datetime) + df['timestamp_iso'] = df['timestamp_iso'].map(pd.to_datetime) - idx = df.timestamp.values + idx = df.timestamp_iso.values - self.assertEqual((idx[1] - idx[0]) / np.timedelta64(1, 's'), 3600.0) + self.assertEqual((idx[1] - idx[0]) / np.timedelta64(1, 's'), 600.0) - def test_resample_modulairpm_rawsd(self): + def test_resample_modulairx_rawsd(self): runner = CliRunner() - result = runner.invoke(resample, + result = runner.invoke(resample_command, [ "-o", os.path.join(self.test_dir, "output.csv"), - "-v", - os.path.join(self.test_files_dir, "modulair-pm/MOD-PM-00001-rawsd-file1.csv"), + "--log-level", + "DEBUG", + os.path.join(self.test_files_dir, "modulair-x/MOD-X-00891-rawsd-file1.csv"), "10min", - "--on", - "timestamp_iso" ], catch_exceptions=False ) @@ -150,20 +121,21 @@ def test_resample_modulairpm_rawsd(self): # are the number of lines correct? df = pd.read_csv(os.path.join(self.test_dir, "output.csv")) - df['timestamp_iso'] = df['timestamp_iso'].map(pd.to_datetime) + df['timestamp'] = df['timestamp'].map(pd.to_datetime) - idx = df.timestamp_iso.values + idx = df.timestamp.values self.assertEqual((idx[1] - idx[0]) / np.timedelta64(1, 's'), 600.0) - def test_resample_modulairx_rawsd(self): + def test_resample_modulairx_cloudapi(self): runner = CliRunner() - result = runner.invoke(resample, + result = runner.invoke(resample_command, [ "-o", os.path.join(self.test_dir, "output.csv"), - "-v", - os.path.join(self.test_files_dir, "modulair-x/MOD-X-00891-rawsd-file1.csv"), + "--log-level", + "DEBUG", + os.path.join(self.test_files_dir, "modulair-x/MOD-X-00993-cloudapi-file1.csv"), "10min", ], catch_exceptions=False ) @@ -189,15 +161,16 @@ def test_resample_modulairx_rawsd(self): self.assertEqual((idx[1] - idx[0]) / np.timedelta64(1, 's'), 600.0) - def test_resample_modulairx_cloudapi(self): + def test_resample_modulair_db_parquet(self): runner = CliRunner() - result = runner.invoke(resample, + result = runner.invoke(resample_command, [ "-o", - os.path.join(self.test_dir, "output.csv"), - "-v", - os.path.join(self.test_files_dir, "modulair-x/MOD-X-00993-cloudapi-file1.csv"), - "10min", + os.path.join(self.test_dir, "output.parquet"), + "--log-level", + "DEBUG", + os.path.join(self.test_files_dir, "modulair/MOD-00256-db-cleaned-file1.parquet"), + "1D", ], catch_exceptions=False ) @@ -208,19 +181,19 @@ def test_resample_modulairx_cloudapi(self): self.assertTrue("Saving file" in result.output) # make sure the file exists - p = Path(self.test_dir + "/output.csv") + p = Path(self.test_dir + "/output.parquet") self.assertTrue(p.exists()) - # is it a csv? - self.assertEqual(p.suffix, ".csv") + # is it a parquet? + self.assertEqual(p.suffix, ".parquet") # are the number of lines correct? - df = pd.read_csv(os.path.join(self.test_dir, "output.csv")) + df = pd.read_parquet(os.path.join(self.test_dir, "output.parquet")) df['timestamp'] = df['timestamp'].map(pd.to_datetime) idx = df.timestamp.values - self.assertEqual((idx[1] - idx[0]) / np.timedelta64(1, 's'), 600.0) + self.assertEqual((idx[1] - idx[0]) / np.timedelta64(1, 's'), 86400.0) def test_resample_dataframe_nan_winds(self): """Test for edge case in case u/v cols exist but have nans. diff --git a/tests/test_utilities.py b/tests/test_utilities.py new file mode 100644 index 0000000..2d2d049 --- /dev/null +++ b/tests/test_utilities.py @@ -0,0 +1,80 @@ +import os +import shutil +import tempfile +import unittest + +import numpy as np + +from quantaq_cli.utilities import safe_load +from quantaq_cli.utilities import sn_to_model, infer_data_model, infer_data_source + +class SetupTestCase(unittest.TestCase): + def setUp(self): + self.test_dir = tempfile.mkdtemp() + self.test_files_dir = os.path.join(os.getcwd(), "tests/files") + + def tearDown(self): + shutil.rmtree(self.test_dir) + + def test_sn_to_model(self): + cases = [ + ("MOD-00246", "modulair"), + ("MOD-PM-00933", "modulair-pm"), + ("MOD-X-00993", "modulair-x"), + ("MOD-X-PM-01685", "modulair-x-pm"), + ("MOD-UFP-01685", "modulair-ufp"), + ] + for sn, expected in cases: + with self.subTest(sn=sn): + self.assertEqual(sn_to_model(sn), expected) + + def test_infer_data_model(self): + df1 = safe_load(os.path.join( + self.test_files_dir, "modulair-pm/MOD-PM-00001-rawsd-file1.csv")) + df2 = safe_load(os.path.join( + self.test_files_dir, "modulair/MOD-00014-db-raw.csv")) + df3 = safe_load(os.path.join( + self.test_files_dir, "modulair-x/MOD-X-00993-cloudapi-file1.csv")) + df4 = safe_load(os.path.join( + self.test_files_dir, "modulair/MOD-00256-db-cleaned-file1.parquet")) + df5 = safe_load(os.path.join( + self.test_files_dir, "modulair-ufp/MOD-UFP-00002-rawsd.csv")) + + cases = [ + (df1, "modulair-pm"), + (df2, "modulair"), + (df3, "modulair-x"), + (df4, "modulair"), + (df5, "modulair-ufp"), + ] + + for df, expected in cases: + with self.subTest(expected=expected): + self.assertEqual(infer_data_model(df), expected) + + def test_infer_data_source(self): + df1 = safe_load(os.path.join( + self.test_files_dir, "modulair-pm/MOD-PM-00001-rawsd-file1.csv")) + df2 = safe_load(os.path.join( + self.test_files_dir, "modulair/MOD-00014-db-raw.csv")) + df3 = safe_load(os.path.join( + self.test_files_dir, "modulair-x/MOD-X-00993-cloudapi-file1.csv")) + df4 = safe_load(os.path.join( + self.test_files_dir, "modulair/MOD-00256-db-cleaned-file1.parquet")) + df5 = safe_load(os.path.join( + self.test_files_dir, "modulair-ufp/MOD-UFP-00002-rawsd.csv")) + df6 = safe_load(os.path.join( + self.test_files_dir, "modulair-ufp/MOD-UFP-00002-rawsd-mixed-tdiffs.csv")) + + cases = [ + (df1, "rawsd"), + (df2, "database"), + (df3, "cloudapi"), + (df4, "database"), + (df5, "rawsd"), + (df6, "rawsd"), + ] + + for df, expected in cases: + with self.subTest(expected=expected): + self.assertEqual(infer_data_source(df), expected)