diff --git a/.gitignore b/.gitignore index 8ec5ae8..20a694b 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,5 @@ import_graph.svg tmp/ *.xlsx +# Keep the example input +!examples/example_input_excel.xlsx diff --git a/Pipfile b/Pipfile deleted file mode 100644 index fd1d27a..0000000 --- a/Pipfile +++ /dev/null @@ -1,33 +0,0 @@ -[[source]] -url = "https://pypi.org/simple" -verify_ssl = true -name = "pypi" - -[packages] -pydantic = "*" -pandas = "*" -requests = "*" -dotenv = "*" -pyyaml = "*" -pydantic-settings = "*" -pyetm = {file = ".", editable = true} -xlsxwriter = "*" -openpyxl = "*" - -[dev-packages] -pytest = "*" -pylint = "*" -requests-mock = "*" -ipykernel = "*" -notebook = "*" -pytest-cov = "*" -pydeps = "*" - -[requires] -python_version = "3.12" - -[scripts] -test = "python -m pytest" -test_with_coverage = "python -m pytest --cov=pyetm tests/ --cov-report=term-missing" -linter = "python -m pylint pyetm" -deptree = "pydeps src/pyetm --show-cycles --max-bacon=2 -o import_graph.svg -T svg" diff --git a/Pipfile.lock b/Pipfile.lock deleted file mode 100644 index c2ab727..0000000 --- a/Pipfile.lock +++ /dev/null @@ -1,1993 +0,0 @@ -{ - "_meta": { - "hash": { - "sha256": "9c4a4dd242a69bb0fa72de6d543863742a6ac38a51db7cf772696af377dfa7bf" - }, - "pipfile-spec": 6, - "requires": { - "python_version": "3.12" - }, - "sources": [ - { - "name": "pypi", - "url": "https://pypi.org/simple", - "verify_ssl": true - } - ] - }, - "default": { - "annotated-types": { - "hashes": [ - "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", - "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89" - ], - "markers": "python_version >= '3.8'", - "version": "==0.7.0" - }, - "certifi": { - "hashes": [ - "sha256:2e0c7ce7cb5d8f8634ca55d2ba7e6ec2689a2fd6537d8dec1296a477a4910057", - "sha256:d747aa5a8b9bbbb1bb8c22bb13e22bd1f18e9796defa16bab421f7f7a317323b" - ], - "markers": "python_version >= '3.7'", - "version": "==2025.6.15" - }, - "charset-normalizer": { - "hashes": [ - "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4", - "sha256:046595208aae0120559a67693ecc65dd75d46f7bf687f159127046628178dc45", - "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", - "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0", - "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7", - "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d", - "sha256:1b1bde144d98e446b056ef98e59c256e9294f6b74d7af6846bf5ffdafd687a7d", - "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", - "sha256:1cad5f45b3146325bb38d6855642f6fd609c3f7cad4dbaf75549bf3b904d3184", - "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db", - "sha256:24498ba8ed6c2e0b56d4acbf83f2d989720a93b41d712ebd4f4979660db4417b", - "sha256:25a23ea5c7edc53e0f29bae2c44fcb5a1aa10591aae107f2a2b2583a9c5cbc64", - "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", - "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8", - "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", - "sha256:36b31da18b8890a76ec181c3cf44326bf2c48e36d393ca1b72b3f484113ea344", - "sha256:3c21d4fca343c805a52c0c78edc01e3477f6dd1ad7c47653241cf2a206d4fc58", - "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", - "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471", - "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", - "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", - "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836", - "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", - "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", - "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c", - "sha256:6333b3aa5a12c26b2a4d4e7335a28f1475e0e5e17d69d55141ee3cab736f66d1", - "sha256:65c981bdbd3f57670af8b59777cbfae75364b483fa8a9f420f08094531d54a01", - "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366", - "sha256:6a0289e4589e8bdfef02a80478f1dfcb14f0ab696b5a00e1f4b8a14a307a3c58", - "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5", - "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", - "sha256:6fc1f5b51fa4cecaa18f2bd7a003f3dd039dd615cd69a2afd6d3b19aed6775f2", - "sha256:70f7172939fdf8790425ba31915bfbe8335030f05b9913d7ae00a87d4395620a", - "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597", - "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", - "sha256:75d10d37a47afee94919c4fab4c22b9bc2a8bf7d4f46f87363bcf0573f3ff4f5", - "sha256:76af085e67e56c8816c3ccf256ebd136def2ed9654525348cfa744b6802b69eb", - "sha256:770cab594ecf99ae64c236bc9ee3439c3f46be49796e265ce0cc8bc17b10294f", - "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0", - "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941", - "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", - "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86", - "sha256:8272b73e1c5603666618805fe821edba66892e2870058c94c53147602eab29c7", - "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7", - "sha256:844da2b5728b5ce0e32d863af26f32b5ce61bc4273a9c720a9f3aa9df73b1455", - "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6", - "sha256:915f3849a011c1f593ab99092f3cecfcb4d65d8feb4a64cf1bf2d22074dc0ec4", - "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", - "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3", - "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", - "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6", - "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", - "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", - "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", - "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645", - "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", - "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12", - "sha256:b2680962a4848b3c4f155dc2ee64505a9c57186d0d56b43123b17ca3de18f0fa", - "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd", - "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef", - "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f", - "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2", - "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", - "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5", - "sha256:c9e36a97bee9b86ef9a1cf7bb96747eb7a15c2f22bdb5b516434b00f2a599f02", - "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", - "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", - "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e", - "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", - "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd", - "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a", - "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", - "sha256:dc7039885fa1baf9be153a0626e337aa7ec8bf96b0128605fb0d77788ddc1681", - "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba", - "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", - "sha256:e45ba65510e2647721e35323d6ef54c7974959f6081b58d4ef5d87c60c84919a", - "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28", - "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", - "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82", - "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a", - "sha256:e8323a9b031aa0393768b87f04b4164a40037fb2a3c11ac06a03ffecd3618027", - "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7", - "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518", - "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", - "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", - "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9", - "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544", - "sha256:f4074c5a429281bf056ddd4c5d3b740ebca4d43ffffe2ef4bf4d2d05114299da", - "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509", - "sha256:fb707f3e15060adf5b7ada797624a6c6e0138e2a26baa089df64c68ee98e040f", - "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", - "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f" - ], - "markers": "python_version >= '3.7'", - "version": "==3.4.2" - }, - "dotenv": { - "hashes": [ - "sha256:29cf74a087b31dafdb5a446b6d7e11cbce8ed2741540e2339c69fbef92c94ce9" - ], - "index": "pypi", - "version": "==0.9.9" - }, - "et-xmlfile": { - "hashes": [ - "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa", - "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54" - ], - "markers": "python_version >= '3.8'", - "version": "==2.0.0" - }, - "idna": { - "hashes": [ - "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", - "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3" - ], - "markers": "python_version >= '3.6'", - "version": "==3.10" - }, - "numpy": { - "hashes": [ - "sha256:0025048b3c1557a20bc80d06fdeb8cc7fc193721484cca82b2cfa072fec71a93", - "sha256:010ce9b4f00d5c036053ca684c77441f2f2c934fd23bee058b4d6f196efd8280", - "sha256:0bb3a4a61e1d327e035275d2a993c96fa786e4913aa089843e6a2d9dd205c66a", - "sha256:0c4d9e0a8368db90f93bd192bfa771ace63137c3488d198ee21dfb8e7771916e", - "sha256:15aa4c392ac396e2ad3d0a2680c0f0dee420f9fed14eef09bdb9450ee6dcb7b7", - "sha256:18703df6c4a4fee55fd3d6e5a253d01c5d33a295409b03fda0c86b3ca2ff41a1", - "sha256:1ec9ae20a4226da374362cca3c62cd753faf2f951440b0e3b98e93c235441d2b", - "sha256:23ab05b2d241f76cb883ce8b9a93a680752fbfcbd51c50eff0b88b979e471d8c", - "sha256:25a1992b0a3fdcdaec9f552ef10d8103186f5397ab45e2d25f8ac51b1a6b97e8", - "sha256:2959d8f268f3d8ee402b04a9ec4bb7604555aeacf78b360dc4ec27f1d508177d", - "sha256:2a809637460e88a113e186e87f228d74ae2852a2e0c44de275263376f17b5bdc", - "sha256:2fb86b7e58f9ac50e1e9dd1290154107e47d1eef23a0ae9145ded06ea606f992", - "sha256:36890eb9e9d2081137bd78d29050ba63b8dab95dff7912eadf1185e80074b2a0", - "sha256:39bff12c076812595c3a306f22bfe49919c5513aa1e0e70fac756a0be7c2a2b8", - "sha256:467db865b392168ceb1ef1ffa6f5a86e62468c43e0cfb4ab6da667ede10e58db", - "sha256:4e602e1b8682c2b833af89ba641ad4176053aaa50f5cacda1a27004352dde943", - "sha256:5902660491bd7a48b2ec16c23ccb9124b8abfd9583c5fdfa123fe6b421e03de1", - "sha256:5ccb7336eaf0e77c1635b232c141846493a588ec9ea777a7c24d7166bb8533ae", - "sha256:5f1b8f26d1086835f442286c1d9b64bb3974b0b1e41bb105358fd07d20872952", - "sha256:6269b9edfe32912584ec496d91b00b6d34282ca1d07eb10e82dfc780907d6c2e", - "sha256:6ea9e48336a402551f52cd8f593343699003d2353daa4b72ce8d34f66b722070", - "sha256:762e0c0c6b56bdedfef9a8e1d4538556438288c4276901ea008ae44091954e29", - "sha256:7be91b2239af2658653c5bb6f1b8bccafaf08226a258caf78ce44710a0160d30", - "sha256:7dea630156d39b02a63c18f508f85010230409db5b2927ba59c8ba4ab3e8272e", - "sha256:867ef172a0976aaa1f1d1b63cf2090de8b636a7674607d514505fb7276ab08fc", - "sha256:8d5ee6eec45f08ce507a6570e06f2f879b374a552087a4179ea7838edbcbfa42", - "sha256:8e333040d069eba1652fb08962ec5b76af7f2c7bce1df7e1418c8055cf776f25", - "sha256:a5ee121b60aa509679b682819c602579e1df14a5b07fe95671c8849aad8f2115", - "sha256:a780033466159c2270531e2b8ac063704592a0bc62ec4a1b991c7c40705eb0e8", - "sha256:a894f3816eb17b29e4783e5873f92faf55b710c2519e5c351767c51f79d8526d", - "sha256:a8b740f5579ae4585831b3cf0e3b0425c667274f82a484866d2adf9570539369", - "sha256:ad506d4b09e684394c42c966ec1527f6ebc25da7f4da4b1b056606ffe446b8a3", - "sha256:afed2ce4a84f6b0fc6c1ce734ff368cbf5a5e24e8954a338f3bdffa0718adffb", - "sha256:b0b5397374f32ec0649dd98c652a1798192042e715df918c20672c62fb52d4b8", - "sha256:bada6058dd886061f10ea15f230ccf7dfff40572e99fef440a4a857c8728c9c0", - "sha256:c4913079974eeb5c16ccfd2b1f09354b8fed7e0d6f2cab933104a09a6419b1ee", - "sha256:c5bdf2015ccfcee8253fb8be695516ac4457c743473a43290fd36eba6a1777eb", - "sha256:c6e0bf9d1a2f50d2b65a7cf56db37c095af17b59f6c132396f7c6d5dd76484df", - "sha256:ce2ce9e5de4703a673e705183f64fd5da5bf36e7beddcb63a25ee2286e71ca48", - "sha256:cfecc7822543abdea6de08758091da655ea2210b8ffa1faf116b940693d3df76", - "sha256:d4580adadc53311b163444f877e0789f1c8861e2698f6b2a4ca852fda154f3ff", - "sha256:d70f20df7f08b90a2062c1f07737dd340adccf2068d0f1b9b3d56e2038979fee", - "sha256:e344eb79dab01f1e838ebb67aab09965fb271d6da6b00adda26328ac27d4a66e", - "sha256:e610832418a2bc09d974cc9fecebfa51e9532d6190223bc5ef6a7402ebf3b5cb", - "sha256:e772dda20a6002ef7061713dc1e2585bc1b534e7909b2030b5a46dae8ff077ab", - "sha256:e7cbf5a5eafd8d230a3ce356d892512185230e4781a361229bd902ff403bc660", - "sha256:eabd7e8740d494ce2b4ea0ff05afa1b7b291e978c0ae075487c51e8bd93c0c68", - "sha256:ebb8603d45bc86bbd5edb0d63e52c5fd9e7945d3a503b77e486bd88dde67a19b", - "sha256:ec0bdafa906f95adc9a0c6f26a4871fa753f25caaa0e032578a30457bff0af6a", - "sha256:eccb9a159db9aed60800187bc47a6d3451553f0e1b08b068d8b277ddfbb9b244", - "sha256:ee8340cb48c9b7a5899d1149eece41ca535513a9698098edbade2a8e7a84da77" - ], - "markers": "python_version >= '3.11'", - "version": "==2.3.1" - }, - "openpyxl": { - "hashes": [ - "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2", - "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050" - ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==3.1.5" - }, - "pandas": { - "hashes": [ - "sha256:034abd6f3db8b9880aaee98f4f5d4dbec7c4829938463ec046517220b2f8574e", - "sha256:094e271a15b579650ebf4c5155c05dcd2a14fd4fdd72cf4854b2f7ad31ea30be", - "sha256:14a0cc77b0f089d2d2ffe3007db58f170dae9b9f54e569b299db871a3ab5bf46", - "sha256:1a881bc1309f3fce34696d07b00f13335c41f5f5a8770a33b09ebe23261cfc67", - "sha256:1d2b33e68d0ce64e26a4acc2e72d747292084f4e8db4c847c6f5f6cbe56ed6d8", - "sha256:213cd63c43263dbb522c1f8a7c9d072e25900f6975596f883f4bebd77295d4f3", - "sha256:23c2b2dc5213810208ca0b80b8666670eb4660bbfd9d45f58592cc4ddcfd62e1", - "sha256:2c7e2fc25f89a49a11599ec1e76821322439d90820108309bf42130d2f36c983", - "sha256:2eb4728a18dcd2908c7fccf74a982e241b467d178724545a48d0caf534b38ebf", - "sha256:34600ab34ebf1131a7613a260a61dbe8b62c188ec0ea4c296da7c9a06b004133", - "sha256:39ff73ec07be5e90330cc6ff5705c651ace83374189dcdcb46e6ff54b4a72cd6", - "sha256:404d681c698e3c8a40a61d0cd9412cc7364ab9a9cc6e144ae2992e11a2e77a20", - "sha256:40cecc4ea5abd2921682b57532baea5588cc5f80f0231c624056b146887274d2", - "sha256:430a63bae10b5086995db1b02694996336e5a8ac9a96b4200572b413dfdfccb9", - "sha256:4930255e28ff5545e2ca404637bcc56f031893142773b3468dc021c6c32a1390", - "sha256:6021910b086b3ca756755e86ddc64e0ddafd5e58e076c72cb1585162e5ad259b", - "sha256:625466edd01d43b75b1883a64d859168e4556261a5035b32f9d743b67ef44634", - "sha256:75651c14fde635e680496148a8526b328e09fe0572d9ae9b638648c46a544ba3", - "sha256:84141f722d45d0c2a89544dd29d35b3abfc13d2250ed7e68394eda7564bd6324", - "sha256:8adff9f138fc614347ff33812046787f7d43b3cef7c0f0171b3340cae333f6ca", - "sha256:951805d146922aed8357e4cc5671b8b0b9be1027f0619cea132a9f3f65f2f09c", - "sha256:9efc0acbbffb5236fbdf0409c04edce96bec4bdaa649d49985427bd1ec73e085", - "sha256:9ff730713d4c4f2f1c860e36c005c7cefc1c7c80c21c0688fd605aa43c9fcf09", - "sha256:a6872d695c896f00df46b71648eea332279ef4077a409e2fe94220208b6bb675", - "sha256:b198687ca9c8529662213538a9bb1e60fa0bf0f6af89292eb68fea28743fcd5a", - "sha256:b9d8c3187be7479ea5c3d30c32a5d73d62a621166675063b2edd21bc47614027", - "sha256:ba24af48643b12ffe49b27065d3babd52702d95ab70f50e1b34f71ca703e2c0d", - "sha256:bb32dc743b52467d488e7a7c8039b821da2826a9ba4f85b89ea95274f863280f", - "sha256:bb3be958022198531eb7ec2008cfc78c5b1eed51af8600c6c5d9160d89d8d249", - "sha256:bf5be867a0541a9fb47a4be0c5790a4bccd5b77b92f0a59eeec9375fafc2aa14", - "sha256:c06f6f144ad0a1bf84699aeea7eff6068ca5c63ceb404798198af7eb86082e33", - "sha256:c6da97aeb6a6d233fb6b17986234cc723b396b50a3c6804776351994f2a658fd", - "sha256:e0f51973ba93a9f97185049326d75b942b9aeb472bec616a129806facb129ebb", - "sha256:e1991bbb96f4050b09b5f811253c4f3cf05ee89a589379aa36cd623f21a31d6f", - "sha256:e5f08eb9a445d07720776df6e641975665c9ea12c9d8a331e0f6890f2dcd76ef", - "sha256:e78ad363ddb873a631e92a3c063ade1ecfb34cae71e9a2be6ad100f875ac1042", - "sha256:ed16339bc354a73e0a609df36d256672c7d296f3f767ac07257801aa064ff73c", - "sha256:f4dd97c19bd06bc557ad787a15b6489d2614ddaab5d104a0310eb314c724b2d2", - "sha256:f925f1ef673b4bd0271b1809b72b3270384f2b7d9d14a189b12b7fc02574d575", - "sha256:f95a2aef32614ed86216d3c450ab12a4e82084e8102e355707a1d96e33d51c34", - "sha256:fa07e138b3f6c04addfeaf56cc7fdb96c3b68a3fe5e5401251f231fce40a0d7a", - "sha256:fa35c266c8cd1a67d75971a1912b185b492d257092bdd2709bbdebe574ed228d" - ], - "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==2.3.0" - }, - "pydantic": { - "hashes": [ - "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db", - "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b" - ], - "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==2.11.7" - }, - "pydantic-core": { - "hashes": [ - "sha256:0069c9acc3f3981b9ff4cdfaf088e98d83440a4c7ea1bc07460af3d4dc22e72d", - "sha256:031c57d67ca86902726e0fae2214ce6770bbe2f710dc33063187a68744a5ecac", - "sha256:0405262705a123b7ce9f0b92f123334d67b70fd1f20a9372b907ce1080c7ba02", - "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", - "sha256:09fb9dd6571aacd023fe6aaca316bd01cf60ab27240d7eb39ebd66a3a15293b4", - "sha256:0a39979dcbb70998b0e505fb1556a1d550a0781463ce84ebf915ba293ccb7e22", - "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", - "sha256:0e03262ab796d986f978f79c943fc5f620381be7287148b8010b4097f79a39ec", - "sha256:0e5b2671f05ba48b94cb90ce55d8bdcaaedb8ba00cc5359f6810fc918713983d", - "sha256:0e6116757f7959a712db11f3e9c0a99ade00a5bbedae83cb801985aa154f071b", - "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", - "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", - "sha256:1a8695a8d00c73e50bff9dfda4d540b7dee29ff9b8053e38380426a85ef10052", - "sha256:1e063337ef9e9820c77acc768546325ebe04ee38b08703244c1309cccc4f1bab", - "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", - "sha256:2058a32994f1fde4ca0480ab9d1e75a0e8c87c22b53a3ae66554f9af78f2fe8c", - "sha256:235f45e5dbcccf6bd99f9f472858849f73d11120d76ea8707115415f8e5ebebf", - "sha256:2807668ba86cb38c6817ad9bc66215ab8584d1d304030ce4f0887336f28a5e27", - "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", - "sha256:2b3d326aaef0c0399d9afffeb6367d5e26ddc24d351dbc9c636840ac355dc5d8", - "sha256:2bfb5112df54209d820d7bf9317c7a6c9025ea52e49f46b6a2060104bba37de7", - "sha256:2f82865531efd18d6e07a04a17331af02cb7a651583c418df8266f17a63c6612", - "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1", - "sha256:3a1c81334778f9e3af2f8aeb7a960736e5cab1dfebfb26aabca09afd2906c039", - "sha256:3abcd9392a36025e3bd55f9bd38d908bd17962cc49bc6da8e7e96285336e2bca", - "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", - "sha256:3dc625f4aa79713512d1976fe9f0bc99f706a9dee21dfd1810b4bbbf228d0e8a", - "sha256:3eb3fe62804e8f859c49ed20a8451342de53ed764150cb14ca71357c765dc2a6", - "sha256:44857c3227d3fb5e753d5fe4a3420d6376fa594b07b621e220cd93703fe21782", - "sha256:4b25d91e288e2c4e0662b8038a28c6a07eaac3e196cfc4ff69de4ea3db992a1b", - "sha256:4c5b0a576fb381edd6d27f0a85915c6daf2f8138dc5c267a57c08a62900758c7", - "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", - "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", - "sha256:53a57d2ed685940a504248187d5685e49eb5eef0f696853647bf37c418c538f7", - "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b", - "sha256:5c4aa4e82353f65e548c476b37e64189783aa5384903bfea4f41580f255fddfa", - "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", - "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea", - "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", - "sha256:6368900c2d3ef09b69cb0b913f9f8263b03786e5b2a387706c5afb66800efd51", - "sha256:64632ff9d614e5eecfb495796ad51b0ed98c453e447a76bcbeeb69615079fc7e", - "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", - "sha256:6b99022f1d19bc32a4c2a0d544fc9a76e3be90f0b3f4af413f87d38749300e65", - "sha256:6bdfe4b3789761f3bcb4b1ddf33355a71079858958e3a552f16d5af19768fef2", - "sha256:6fa6dfc3e4d1f734a34710f391ae822e0a8eb8559a85c6979e14e65ee6ba2954", - "sha256:73662edf539e72a9440129f231ed3757faab89630d291b784ca99237fb94db2b", - "sha256:73cf6373c21bc80b2e0dc88444f41ae60b2f070ed02095754eb5a01df12256de", - "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", - "sha256:7f92c15cd1e97d4b12acd1cc9004fa092578acfa57b67ad5e43a197175d01a64", - "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb", - "sha256:83aa99b1285bc8f038941ddf598501a86f1536789740991d7d8756e34f1e74d9", - "sha256:87acbfcf8e90ca885206e98359d7dca4bcbb35abdc0ff66672a293e1d7a19101", - "sha256:87b31b6846e361ef83fedb187bb5b4372d0da3f7e28d85415efa92d6125d6e6d", - "sha256:881b21b5549499972441da4758d662aeea93f1923f953e9cbaff14b8b9565aef", - "sha256:8d55ab81c57b8ff8548c3e4947f119551253f4e3787a7bbc0b6b3ca47498a9d3", - "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1", - "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", - "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88", - "sha256:970919794d126ba8645f3837ab6046fb4e72bbc057b3709144066204c19a455d", - "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290", - "sha256:9fcd347d2cc5c23b06de6d3b7b8275be558a0c90549495c699e379a80bf8379e", - "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", - "sha256:a11c8d26a50bfab49002947d3d237abe4d9e4b5bdc8846a63537b6488e197808", - "sha256:a144d4f717285c6d9234a66778059f33a89096dfb9b39117663fd8413d582dcc", - "sha256:a2b911a5b90e0374d03813674bf0a5fbbb7741570dcd4b4e85a2e48d17def29d", - "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", - "sha256:aa9d91b338f2df0508606f7009fde642391425189bba6d8c653afd80fd6bb64e", - "sha256:b0379a2b24882fef529ec3b4987cb5d003b9cda32256024e6fe1586ac45fc640", - "sha256:bc7aee6f634a6f4a95676fcb5d6559a2c2a390330098dba5e5a5f28a2e4ada30", - "sha256:bdc25f3681f7b78572699569514036afe3c243bc3059d3942624e936ec93450e", - "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", - "sha256:c20c462aa4434b33a2661701b861604913f912254e441ab8d78d30485736115a", - "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", - "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f", - "sha256:c54c939ee22dc8e2d545da79fc5381f1c020d6d3141d3bd747eab59164dc89fb", - "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", - "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab", - "sha256:d3f26877a748dc4251cfcfda9dfb5f13fcb034f5308388066bcfe9031b63ae7d", - "sha256:d53b22f2032c42eaaf025f7c40c2e3b94568ae077a606f006d206a463bc69572", - "sha256:d87c561733f66531dced0da6e864f44ebf89a8fba55f31407b00c2f7f9449593", - "sha256:d946c8bf0d5c24bf4fe333af284c59a19358aa3ec18cb3dc4370080da1e8ad29", - "sha256:dac89aea9af8cd672fa7b510e7b8c33b0bba9a43186680550ccf23020f32d535", - "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1", - "sha256:dc46a01bf8d62f227d5ecee74178ffc448ff4e5197c756331f71efcc66dc980f", - "sha256:dd14041875d09cc0f9308e37a6f8b65f5585cf2598a53aa0123df8b129d481f8", - "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf", - "sha256:e799c050df38a639db758c617ec771fd8fb7a5f8eaaa4b27b101f266b216a246", - "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", - "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011", - "sha256:eb9b459ca4df0e5c87deb59d37377461a538852765293f9e6ee834f0435a93b9", - "sha256:efec8db3266b76ef9607c2c4c419bdb06bf335ae433b80816089ea7585816f6a", - "sha256:f481959862f57f29601ccced557cc2e817bce7533ab8e01a797a48b49c9692b3", - "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", - "sha256:f889f7a40498cc077332c7ab6b4608d296d852182211787d4f3ee377aaae66e8", - "sha256:f8de619080e944347f5f20de29a975c2d815d9ddd8be9b9b7268e2e3ef68605a", - "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2", - "sha256:fa754d1850735a0b0e03bcffd9d4b4343eb417e47196e4485d9cca326073a42c", - "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6", - "sha256:fe5b32187cbc0c862ee201ad66c30cf218e5ed468ec8dc1cf49dec66e160cc4d" - ], - "markers": "python_version >= '3.9'", - "version": "==2.33.2" - }, - "pydantic-settings": { - "hashes": [ - "sha256:06f0062169818d0f5524420a360d632d5857b83cffd4d42fe29597807a1614ee", - "sha256:a60952460b99cf661dc25c29c0ef171721f98bfcb52ef8d9ea4c943d7c8cc796" - ], - "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==2.10.1" - }, - "pyetm": { - "editable": true, - "file": "." - }, - "python-dateutil": { - "hashes": [ - "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", - "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", - "version": "==2.9.0.post0" - }, - "python-dotenv": { - "hashes": [ - "sha256:31f23644fe2602f88ff55e1f5c79ba497e01224ee7737937930c448e4d0e24dc", - "sha256:a8a6399716257f45be6a007360200409fce5cda2661e3dec71d23dc15f6189ab" - ], - "markers": "python_version >= '3.9'", - "version": "==1.1.1" - }, - "pytz": { - "hashes": [ - "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", - "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00" - ], - "version": "==2025.2" - }, - "pyyaml": { - "hashes": [ - "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff", - "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", - "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", - "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e", - "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", - "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", - "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", - "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", - "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", - "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", - "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a", - "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", - "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", - "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8", - "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", - "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19", - "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", - "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a", - "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", - "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", - "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", - "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631", - "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d", - "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", - "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", - "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", - "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", - "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", - "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", - "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706", - "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", - "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", - "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", - "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083", - "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", - "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", - "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", - "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f", - "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725", - "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", - "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", - "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", - "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", - "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", - "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5", - "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d", - "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290", - "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", - "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", - "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", - "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", - "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12", - "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4" - ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==6.0.2" - }, - "requests": { - "hashes": [ - "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", - "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422" - ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==2.32.4" - }, - "six": { - "hashes": [ - "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", - "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", - "version": "==1.17.0" - }, - "typing-extensions": { - "hashes": [ - "sha256:8676b788e32f02ab42d9e7c61324048ae4c6d844a399eebace3d4979d75ceef4", - "sha256:a1514509136dd0b477638fc68d6a91497af5076466ad0fa6c338e44e359944af" - ], - "markers": "python_version >= '3.9'", - "version": "==4.14.0" - }, - "typing-inspection": { - "hashes": [ - "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", - "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28" - ], - "markers": "python_version >= '3.9'", - "version": "==0.4.1" - }, - "tzdata": { - "hashes": [ - "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", - "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9" - ], - "markers": "python_version >= '2'", - "version": "==2025.2" - }, - "urllib3": { - "hashes": [ - "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", - "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc" - ], - "markers": "python_version >= '3.9'", - "version": "==2.5.0" - }, - "xlsxwriter": { - "hashes": [ - "sha256:4f4824234e1eaf9d95df9a8fe974585ff91d0f5e3d3f12ace5b71e443c1c6abd", - "sha256:7e88469d607cdc920151c0ab3ce9cf1a83992d4b7bc730c5ffdd1a12115a7dbe" - ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==3.2.5" - } - }, - "develop": { - "anyio": { - "hashes": [ - "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", - "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c" - ], - "markers": "python_version >= '3.9'", - "version": "==4.9.0" - }, - "appnope": { - "hashes": [ - "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", - "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c" - ], - "markers": "python_version >= '3.6'", - "version": "==0.1.4" - }, - "argon2-cffi": { - "hashes": [ - "sha256:694ae5cc8a42f4c4e2bf2ca0e64e51e23a040c6a517a85074683d3959e1346c1", - "sha256:fdc8b074db390fccb6eb4a3604ae7231f219aa669a2652e0f20e16ba513d5741" - ], - "markers": "python_version >= '3.8'", - "version": "==25.1.0" - }, - "argon2-cffi-bindings": { - "hashes": [ - "sha256:20ef543a89dee4db46a1a6e206cd015360e5a75822f76df533845c3cbaf72670", - "sha256:2c3e3cc67fdb7d82c4718f19b4e7a87123caf8a93fde7e23cf66ac0337d3cb3f", - "sha256:3b9ef65804859d335dc6b31582cad2c5166f0c3e7975f324d9ffaa34ee7e6583", - "sha256:3e385d1c39c520c08b53d63300c3ecc28622f076f4c2b0e6d7e796e9f6502194", - "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c", - "sha256:5e00316dabdaea0b2dd82d141cc66889ced0cdcbfa599e8b471cf22c620c329a", - "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082", - "sha256:6a22ad9800121b71099d0fb0a65323810a15f2e292f2ba450810a7316e128ee5", - "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f", - "sha256:93f9bf70084f97245ba10ee36575f0c3f1e7d7724d67d8e5b08e61787c320ed7", - "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d", - "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f", - "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae", - "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3", - "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86", - "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367", - "sha256:d4966ef5848d820776f5f562a7d45fdd70c2f330c961d0d745b784034bd9f48d", - "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93", - "sha256:ed2937d286e2ad0cc79a7087d3c272832865f779430e0cc2b4f3718d3159b0cb", - "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e", - "sha256:f9f8b450ed0547e3d473fdc8612083fd08dd2120d6ac8f73828df9b7d45bb351" - ], - "markers": "python_version >= '3.6'", - "version": "==21.2.0" - }, - "arrow": { - "hashes": [ - "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80", - "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85" - ], - "markers": "python_version >= '3.8'", - "version": "==1.3.0" - }, - "astroid": { - "hashes": [ - "sha256:104fb9cb9b27ea95e847a94c003be03a9e039334a8ebca5ee27dafaf5c5711eb", - "sha256:c332157953060c6deb9caa57303ae0d20b0fbdb2e59b4a4f2a6ba49d0a7961ce" - ], - "markers": "python_full_version >= '3.9.0'", - "version": "==3.3.10" - }, - "asttokens": { - "hashes": [ - "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", - "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2" - ], - "markers": "python_version >= '3.8'", - "version": "==3.0.0" - }, - "async-lru": { - "hashes": [ - "sha256:481d52ccdd27275f42c43a928b4a50c3bfb2d67af4e78b170e3e0bb39c66e5bb", - "sha256:ab95404d8d2605310d345932697371a5f40def0487c03d6d0ad9138de52c9943" - ], - "markers": "python_version >= '3.9'", - "version": "==2.0.5" - }, - "attrs": { - "hashes": [ - "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", - "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b" - ], - "markers": "python_version >= '3.8'", - "version": "==25.3.0" - }, - "babel": { - "hashes": [ - "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", - "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2" - ], - "markers": "python_version >= '3.8'", - "version": "==2.17.0" - }, - "beautifulsoup4": { - "hashes": [ - "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b", - "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195" - ], - "markers": "python_full_version >= '3.7.0'", - "version": "==4.13.4" - }, - "bleach": { - "extras": [ - "css" - ], - "hashes": [ - "sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e", - "sha256:123e894118b8a599fd80d3ec1a6d4cc7ce4e5882b1317a7e1ba69b56e95f991f" - ], - "markers": "python_version >= '3.9'", - "version": "==6.2.0" - }, - "certifi": { - "hashes": [ - "sha256:2e0c7ce7cb5d8f8634ca55d2ba7e6ec2689a2fd6537d8dec1296a477a4910057", - "sha256:d747aa5a8b9bbbb1bb8c22bb13e22bd1f18e9796defa16bab421f7f7a317323b" - ], - "markers": "python_version >= '3.7'", - "version": "==2025.6.15" - }, - "cffi": { - "hashes": [ - "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", - "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", - "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1", - "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", - "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", - "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", - "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8", - "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36", - "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17", - "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", - "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc", - "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", - "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", - "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", - "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", - "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", - "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", - "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6", - "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", - "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b", - "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", - "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", - "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c", - "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", - "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", - "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", - "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8", - "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1", - "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", - "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", - "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", - "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595", - "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0", - "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", - "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", - "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", - "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", - "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", - "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", - "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16", - "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", - "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e", - "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", - "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964", - "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", - "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576", - "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", - "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3", - "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662", - "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", - "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", - "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", - "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", - "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", - "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", - "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", - "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", - "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9", - "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7", - "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", - "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a", - "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", - "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", - "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", - "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", - "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87", - "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b" - ], - "markers": "python_version >= '3.8'", - "version": "==1.17.1" - }, - "charset-normalizer": { - "hashes": [ - "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4", - "sha256:046595208aae0120559a67693ecc65dd75d46f7bf687f159127046628178dc45", - "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", - "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0", - "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7", - "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d", - "sha256:1b1bde144d98e446b056ef98e59c256e9294f6b74d7af6846bf5ffdafd687a7d", - "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", - "sha256:1cad5f45b3146325bb38d6855642f6fd609c3f7cad4dbaf75549bf3b904d3184", - "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db", - "sha256:24498ba8ed6c2e0b56d4acbf83f2d989720a93b41d712ebd4f4979660db4417b", - "sha256:25a23ea5c7edc53e0f29bae2c44fcb5a1aa10591aae107f2a2b2583a9c5cbc64", - "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", - "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8", - "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", - "sha256:36b31da18b8890a76ec181c3cf44326bf2c48e36d393ca1b72b3f484113ea344", - "sha256:3c21d4fca343c805a52c0c78edc01e3477f6dd1ad7c47653241cf2a206d4fc58", - "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", - "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471", - "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", - "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", - "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836", - "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", - "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", - "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c", - "sha256:6333b3aa5a12c26b2a4d4e7335a28f1475e0e5e17d69d55141ee3cab736f66d1", - "sha256:65c981bdbd3f57670af8b59777cbfae75364b483fa8a9f420f08094531d54a01", - "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366", - "sha256:6a0289e4589e8bdfef02a80478f1dfcb14f0ab696b5a00e1f4b8a14a307a3c58", - "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5", - "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", - "sha256:6fc1f5b51fa4cecaa18f2bd7a003f3dd039dd615cd69a2afd6d3b19aed6775f2", - "sha256:70f7172939fdf8790425ba31915bfbe8335030f05b9913d7ae00a87d4395620a", - "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597", - "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", - "sha256:75d10d37a47afee94919c4fab4c22b9bc2a8bf7d4f46f87363bcf0573f3ff4f5", - "sha256:76af085e67e56c8816c3ccf256ebd136def2ed9654525348cfa744b6802b69eb", - "sha256:770cab594ecf99ae64c236bc9ee3439c3f46be49796e265ce0cc8bc17b10294f", - "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0", - "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941", - "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", - "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86", - "sha256:8272b73e1c5603666618805fe821edba66892e2870058c94c53147602eab29c7", - "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7", - "sha256:844da2b5728b5ce0e32d863af26f32b5ce61bc4273a9c720a9f3aa9df73b1455", - "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6", - "sha256:915f3849a011c1f593ab99092f3cecfcb4d65d8feb4a64cf1bf2d22074dc0ec4", - "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", - "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3", - "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", - "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6", - "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", - "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", - "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", - "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645", - "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", - "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12", - "sha256:b2680962a4848b3c4f155dc2ee64505a9c57186d0d56b43123b17ca3de18f0fa", - "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd", - "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef", - "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f", - "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2", - "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", - "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5", - "sha256:c9e36a97bee9b86ef9a1cf7bb96747eb7a15c2f22bdb5b516434b00f2a599f02", - "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", - "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", - "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e", - "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", - "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd", - "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a", - "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", - "sha256:dc7039885fa1baf9be153a0626e337aa7ec8bf96b0128605fb0d77788ddc1681", - "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba", - "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", - "sha256:e45ba65510e2647721e35323d6ef54c7974959f6081b58d4ef5d87c60c84919a", - "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28", - "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", - "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82", - "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a", - "sha256:e8323a9b031aa0393768b87f04b4164a40037fb2a3c11ac06a03ffecd3618027", - "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7", - "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518", - "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", - "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", - "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9", - "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544", - "sha256:f4074c5a429281bf056ddd4c5d3b740ebca4d43ffffe2ef4bf4d2d05114299da", - "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509", - "sha256:fb707f3e15060adf5b7ada797624a6c6e0138e2a26baa089df64c68ee98e040f", - "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", - "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f" - ], - "markers": "python_version >= '3.7'", - "version": "==3.4.2" - }, - "comm": { - "hashes": [ - "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e", - "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3" - ], - "markers": "python_version >= '3.8'", - "version": "==0.2.2" - }, - "coverage": { - "extras": [ - "toml" - ], - "hashes": [ - "sha256:02532fd3290bb8fa6bec876520842428e2a6ed6c27014eca81b031c2d30e3f71", - "sha256:0a4be2a28656afe279b34d4f91c3e26eccf2f85500d4a4ff0b1f8b54bf807338", - "sha256:0b3496922cb5f4215bf5caaef4cf12364a26b0be82e9ed6d050f3352cf2d7ef0", - "sha256:0c804506d624e8a20fb3108764c52e0eef664e29d21692afa375e0dd98dc384f", - "sha256:0f16649a7330ec307942ed27d06ee7e7a38417144620bb3d6e9a18ded8a2d3e5", - "sha256:16aa0830d0c08a2c40c264cef801db8bc4fc0e1892782e45bcacbd5889270509", - "sha256:18a0912944d70aaf5f399e350445738a1a20b50fbea788f640751c2ed9208b6c", - "sha256:1c503289ffef1d5105d91bbb4d62cbe4b14bec4d13ca225f9c73cde9bb46207d", - "sha256:2241ad5dbf79ae1d9c08fe52b36d03ca122fb9ac6bca0f34439e99f8327ac89f", - "sha256:25308bd3d00d5eedd5ae7d4357161f4df743e3c0240fa773ee1b0f75e6c7c0f1", - "sha256:2a876e4c3e5a2a1715a6608906aa5a2e0475b9c0f68343c2ada98110512ab1d8", - "sha256:2d04b16a6062516df97969f1ae7efd0de9c31eb6ebdceaa0d213b21c0ca1a683", - "sha256:30f445f85c353090b83e552dcbbdad3ec84c7967e108c3ae54556ca69955563e", - "sha256:31324f18d5969feef7344a932c32428a2d1a3e50b15a6404e97cba1cc9b2c631", - "sha256:34ed2186fe52fcc24d4561041979a0dec69adae7bce2ae8d1c49eace13e55c43", - "sha256:37ab6be0859141b53aa89412a82454b482c81cf750de4f29223d52268a86de67", - "sha256:37ae0383f13cbdcf1e5e7014489b0d71cc0106458878ccde52e8a12ced4298ed", - "sha256:382e7ddd5289f140259b610e5f5c58f713d025cb2f66d0eb17e68d0a94278875", - "sha256:3bb5838701ca68b10ebc0937dbd0eb81974bac54447c55cd58dea5bca8451029", - "sha256:437c576979e4db840539674e68c84b3cda82bc824dd138d56bead1435f1cb5d7", - "sha256:49f1d0788ba5b7ba65933f3a18864117c6506619f5ca80326b478f72acf3f385", - "sha256:52e92b01041151bf607ee858e5a56c62d4b70f4dac85b8c8cb7fb8a351ab2c10", - "sha256:535fde4001b2783ac80865d90e7cc7798b6b126f4cd8a8c54acfe76804e54e58", - "sha256:56f5eb308b17bca3bbff810f55ee26d51926d9f89ba92707ee41d3c061257e55", - "sha256:5add197315a054e92cee1b5f686a2bcba60c4c3e66ee3de77ace6c867bdee7cb", - "sha256:5f646a99a8c2b3ff4c6a6e081f78fad0dde275cd59f8f49dc4eab2e394332e74", - "sha256:600a1d4106fe66f41e5d0136dfbc68fe7200a5cbe85610ddf094f8f22e1b0300", - "sha256:60c458224331ee3f1a5b472773e4a085cc27a86a0b48205409d364272d67140d", - "sha256:64bdd969456e2d02a8b08aa047a92d269c7ac1f47e0c977675d550c9a0863643", - "sha256:66b974b145aa189516b6bf2d8423e888b742517d37872f6ee4c5be0073bd9a3c", - "sha256:684e2110ed84fd1ca5f40e89aa44adf1729dc85444004111aa01866507adf363", - "sha256:68cd53aec6f45b8e4724c0950ce86eacb775c6be01ce6e3669fe4f3a21e768ed", - "sha256:69aa417a030bf11ec46149636314c24c8d60fadb12fc0ee8f10fda0d918c879d", - "sha256:6ad935f0016be24c0e97fc8c40c465f9c4b85cbbe6eac48934c0dc4d2568321e", - "sha256:6b55ad10a35a21b8015eabddc9ba31eb590f54adc9cd39bcf09ff5349fd52125", - "sha256:6cf43c78c4282708a28e466316935ec7489a9c487518a77fa68f716c67909cec", - "sha256:6f424507f57878e424d9a95dc4ead3fbdd72fd201e404e861e465f28ea469951", - "sha256:70760b4c5560be6ca70d11f8988ee6542b003f982b32f83d5ac0b72476607b70", - "sha256:73e9439310f65d55a5a1e0564b48e34f5369bee943d72c88378f2d576f5a5751", - "sha256:7931b9e249edefb07cd6ae10c702788546341d5fe44db5b6108a25da4dca513f", - "sha256:81f34346dd63010453922c8e628a52ea2d2ccd73cb2487f7700ac531b247c8a5", - "sha256:888f8eee13f2377ce86d44f338968eedec3291876b0b8a7289247ba52cb984cd", - "sha256:95335095b6c7b1cc14c3f3f17d5452ce677e8490d101698562b2ffcacc304c8d", - "sha256:9565c3ab1c93310569ec0d86b017f128f027cab0b622b7af288696d7ed43a16d", - "sha256:95c765060e65c692da2d2f51a9499c5e9f5cf5453aeaf1420e3fc847cc060582", - "sha256:9969ef1e69b8c8e1e70d591f91bbc37fc9a3621e447525d1602801a24ceda898", - "sha256:9ca8e220006966b4a7b68e8984a6aee645a0384b0769e829ba60281fe61ec4f7", - "sha256:a39d18b3f50cc121d0ce3838d32d58bd1d15dab89c910358ebefc3665712256c", - "sha256:a66e8f628b71f78c0e0342003d53b53101ba4e00ea8dabb799d9dba0abbbcebe", - "sha256:a8de12b4b87c20de895f10567639c0797b621b22897b0af3ce4b4e204a743626", - "sha256:af41da5dca398d3474129c58cb2b106a5d93bbb196be0d307ac82311ca234342", - "sha256:b30a25f814591a8c0c5372c11ac8967f669b97444c47fd794926e175c4047ece", - "sha256:ba383dc6afd5ec5b7a0d0c23d38895db0e15bcba7fb0fa8901f245267ac30d86", - "sha256:bb4fbcab8764dc072cb651a4bcda4d11fb5658a1d8d68842a862a6610bd8cfa3", - "sha256:be9e3f68ca9edb897c2184ad0eee815c635565dbe7a0e7e814dc1f7cbab92c0a", - "sha256:bfa447506c1a52271f1b0de3f42ea0fa14676052549095e378d5bff1c505ff7b", - "sha256:cc94d7c5e8423920787c33d811c0be67b7be83c705f001f7180c7b186dcf10ca", - "sha256:cea0a27a89e6432705fffc178064503508e3c0184b4f061700e771a09de58187", - "sha256:cf95981b126f23db63e9dbe4cf65bd71f9a6305696fa5e2262693bc4e2183f5b", - "sha256:d4fe2348cc6ec372e25adec0219ee2334a68d2f5222e0cba9c0d613394e12d86", - "sha256:db0f04118d1db74db6c9e1cb1898532c7dcc220f1d2718f058601f7c3f499514", - "sha256:dd24bd8d77c98557880def750782df77ab2b6885a18483dc8588792247174b32", - "sha256:e1b5191d1648acc439b24721caab2fd0c86679d8549ed2c84d5a7ec1bedcc244", - "sha256:e5532482344186c543c37bfad0ee6069e8ae4fc38d073b8bc836fc8f03c9e250", - "sha256:e980b53a959fa53b6f05343afbd1e6f44a23ed6c23c4b4c56c6662bbb40c82ce", - "sha256:ef64c27bc40189f36fcc50c3fb8f16ccda73b6a0b80d9bd6e6ce4cffcd810bbd", - "sha256:f05031cf21699785cd47cb7485f67df619e7bcdae38e0fde40d23d3d0210d3c3" - ], - "markers": "python_version >= '3.9'", - "version": "==7.9.1" - }, - "debugpy": { - "hashes": [ - "sha256:0f920c7f9af409d90f5fd26e313e119d908b0dd2952c2393cd3247a462331f15", - "sha256:1b2ac8c13b2645e0b1eaf30e816404990fbdb168e193322be8f545e8c01644a9", - "sha256:281d44d248a0e1791ad0eafdbbd2912ff0de9eec48022a5bfbc332957487ed3f", - "sha256:329a15d0660ee09fec6786acdb6e0443d595f64f5d096fc3e3ccf09a4259033f", - "sha256:3784ec6e8600c66cbdd4ca2726c72d8ca781e94bce2f396cc606d458146f8f4e", - "sha256:3d937d93ae4fa51cdc94d3e865f535f185d5f9748efb41d0d49e33bf3365bd79", - "sha256:413512d35ff52c2fb0fd2d65e69f373ffd24f0ecb1fac514c04a668599c5ce7f", - "sha256:4c9156f7524a0d70b7a7e22b2e311d8ba76a15496fb00730e46dcdeedb9e1eea", - "sha256:5349b7c3735b766a281873fbe32ca9cca343d4cc11ba4a743f84cb854339ff35", - "sha256:5aa56ef8538893e4502a7d79047fe39b1dae08d9ae257074c6464a7b290b806f", - "sha256:5cd9a579d553b6cb9759a7908a41988ee6280b961f24f63336835d9418216a20", - "sha256:684eaf43c95a3ec39a96f1f5195a7ff3d4144e4a18d69bb66beeb1a6de605d6e", - "sha256:7118d462fe9724c887d355eef395fae68bc764fd862cdca94e70dcb9ade8a23d", - "sha256:7816acea4a46d7e4e50ad8d09d963a680ecc814ae31cdef3622eb05ccacf7b01", - "sha256:7cd287184318416850aa8b60ac90105837bb1e59531898c07569d197d2ed5322", - "sha256:8899c17920d089cfa23e6005ad9f22582fd86f144b23acb9feeda59e84405b84", - "sha256:93fee753097e85623cab1c0e6a68c76308cd9f13ffdf44127e6fab4fbf024339", - "sha256:b1528cfee6c1b1c698eb10b6b096c598738a8238822d218173d21c3086de8123", - "sha256:b44985f97cc3dd9d52c42eb59ee9d7ee0c4e7ecd62bca704891f997de4cef23d", - "sha256:c442f20577b38cc7a9aafecffe1094f78f07fb8423c3dddb384e6b8f49fd2987", - "sha256:c99295c76161ad8d507b413cd33422d7c542889fbb73035889420ac1fad354f2", - "sha256:cf431c343a99384ac7eab2f763980724834f933a271e90496944195318c619e2", - "sha256:d235e4fa78af2de4e5609073972700523e372cf5601742449970110d565ca28c", - "sha256:d5582bcbe42917bc6bbe5c12db1bffdf21f6bfc28d4554b738bf08d50dc0c8c3", - "sha256:f117dedda6d969c5c9483e23f573b38f4e39412845c7bc487b6f2648df30fe84", - "sha256:f6bb5c0dcf80ad5dbc7b7d6eac484e2af34bdacdf81df09b6a3e62792b722826" - ], - "markers": "python_version >= '3.8'", - "version": "==1.8.14" - }, - "decorator": { - "hashes": [ - "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", - "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a" - ], - "markers": "python_version >= '3.8'", - "version": "==5.2.1" - }, - "defusedxml": { - "hashes": [ - "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", - "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==0.7.1" - }, - "dill": { - "hashes": [ - "sha256:0633f1d2df477324f53a895b02c901fb961bdbf65a17122586ea7019292cbcf0", - "sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049" - ], - "markers": "python_version >= '3.8'", - "version": "==0.4.0" - }, - "executing": { - "hashes": [ - "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa", - "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755" - ], - "markers": "python_version >= '3.8'", - "version": "==2.2.0" - }, - "fastjsonschema": { - "hashes": [ - "sha256:794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4", - "sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667" - ], - "version": "==2.21.1" - }, - "fqdn": { - "hashes": [ - "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f", - "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", - "version": "==1.5.1" - }, - "h11": { - "hashes": [ - "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", - "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86" - ], - "markers": "python_version >= '3.8'", - "version": "==0.16.0" - }, - "httpcore": { - "hashes": [ - "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", - "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8" - ], - "markers": "python_version >= '3.8'", - "version": "==1.0.9" - }, - "httpx": { - "hashes": [ - "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", - "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad" - ], - "markers": "python_version >= '3.8'", - "version": "==0.28.1" - }, - "idna": { - "hashes": [ - "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", - "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3" - ], - "markers": "python_version >= '3.6'", - "version": "==3.10" - }, - "iniconfig": { - "hashes": [ - "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", - "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760" - ], - "markers": "python_version >= '3.8'", - "version": "==2.1.0" - }, - "ipykernel": { - "hashes": [ - "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5", - "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215" - ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==6.29.5" - }, - "ipython": { - "hashes": [ - "sha256:1a0b6dd9221a1f5dddf725b57ac0cb6fddc7b5f470576231ae9162b9b3455a04", - "sha256:79eb896f9f23f50ad16c3bc205f686f6e030ad246cc309c6279a242b14afe9d8" - ], - "markers": "python_version >= '3.11'", - "version": "==9.3.0" - }, - "ipython-pygments-lexers": { - "hashes": [ - "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", - "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c" - ], - "markers": "python_version >= '3.8'", - "version": "==1.1.1" - }, - "isoduration": { - "hashes": [ - "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9", - "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042" - ], - "markers": "python_version >= '3.7'", - "version": "==20.11.0" - }, - "isort": { - "hashes": [ - "sha256:1cb5df28dfbc742e490c5e41bad6da41b805b0a8be7bc93cd0fb2a8a890ac450", - "sha256:2dc5d7f65c9678d94c88dfc29161a320eec67328bc97aad576874cb4be1e9615" - ], - "markers": "python_full_version >= '3.9.0'", - "version": "==6.0.1" - }, - "jedi": { - "hashes": [ - "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", - "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9" - ], - "markers": "python_version >= '3.6'", - "version": "==0.19.2" - }, - "jinja2": { - "hashes": [ - "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", - "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67" - ], - "markers": "python_version >= '3.7'", - "version": "==3.1.6" - }, - "json5": { - "hashes": [ - "sha256:0b4b6ff56801a1c7dc817b0241bca4ce474a0e6a163bfef3fc594d3fd263ff3a", - "sha256:6d37aa6c08b0609f16e1ec5ff94697e2cbbfbad5ac112afa05794da9ab7810db" - ], - "markers": "python_full_version >= '3.8.0'", - "version": "==0.12.0" - }, - "jsonpointer": { - "hashes": [ - "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942", - "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef" - ], - "markers": "python_version >= '3.7'", - "version": "==3.0.0" - }, - "jsonschema": { - "extras": [ - "format-nongpl" - ], - "hashes": [ - "sha256:0b4e8069eb12aedfa881333004bccaec24ecef5a8a6a4b6df142b2cc9599d196", - "sha256:a462455f19f5faf404a7902952b6f0e3ce868f3ee09a359b05eca6673bd8412d" - ], - "markers": "python_version >= '3.9'", - "version": "==4.24.0" - }, - "jsonschema-specifications": { - "hashes": [ - "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af", - "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608" - ], - "markers": "python_version >= '3.9'", - "version": "==2025.4.1" - }, - "jupyter-client": { - "hashes": [ - "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419", - "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f" - ], - "markers": "python_version >= '3.8'", - "version": "==8.6.3" - }, - "jupyter-core": { - "hashes": [ - "sha256:0a5f9706f70e64786b75acba995988915ebd4601c8a52e534a40b51c95f59941", - "sha256:c28d268fc90fb53f1338ded2eb410704c5449a358406e8a948b75706e24863d0" - ], - "markers": "python_version >= '3.8'", - "version": "==5.8.1" - }, - "jupyter-events": { - "hashes": [ - "sha256:6464b2fa5ad10451c3d35fabc75eab39556ae1e2853ad0c0cc31b656731a97fb", - "sha256:fc3fce98865f6784c9cd0a56a20644fc6098f21c8c33834a8d9fe383c17e554b" - ], - "markers": "python_version >= '3.9'", - "version": "==0.12.0" - }, - "jupyter-lsp": { - "hashes": [ - "sha256:45fbddbd505f3fbfb0b6cb2f1bc5e15e83ab7c79cd6e89416b248cb3c00c11da", - "sha256:793147a05ad446f809fd53ef1cd19a9f5256fd0a2d6b7ce943a982cb4f545001" - ], - "markers": "python_version >= '3.8'", - "version": "==2.2.5" - }, - "jupyter-server": { - "hashes": [ - "sha256:3d8db5be3bc64403b1c65b400a1d7f4647a5ce743f3b20dbdefe8ddb7b55af9e", - "sha256:65d4b44fdf2dcbbdfe0aa1ace4a842d4aaf746a2b7b168134d5aaed35621b7f6" - ], - "markers": "python_version >= '3.9'", - "version": "==2.16.0" - }, - "jupyter-server-terminals": { - "hashes": [ - "sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa", - "sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269" - ], - "markers": "python_version >= '3.8'", - "version": "==0.5.3" - }, - "jupyterlab": { - "hashes": [ - "sha256:164302f6d4b6c44773dfc38d585665a4db401a16e5296c37df5cba63904fbdea", - "sha256:a94c32fd7f8b93e82a49dc70a6ec45a5c18281ca2a7228d12765e4e210e5bca2" - ], - "markers": "python_version >= '3.9'", - "version": "==4.4.3" - }, - "jupyterlab-pygments": { - "hashes": [ - "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d", - "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780" - ], - "markers": "python_version >= '3.8'", - "version": "==0.3.0" - }, - "jupyterlab-server": { - "hashes": [ - "sha256:e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4", - "sha256:eb36caca59e74471988f0ae25c77945610b887f777255aa21f8065def9e51ed4" - ], - "markers": "python_version >= '3.8'", - "version": "==2.27.3" - }, - "markupsafe": { - "hashes": [ - "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", - "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", - "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0", - "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", - "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", - "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13", - "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", - "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", - "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", - "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", - "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0", - "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b", - "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579", - "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", - "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", - "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff", - "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", - "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", - "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", - "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb", - "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", - "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", - "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a", - "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", - "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a", - "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", - "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8", - "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", - "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", - "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144", - "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f", - "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", - "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", - "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", - "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", - "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158", - "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", - "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", - "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", - "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171", - "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", - "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", - "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", - "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d", - "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", - "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", - "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", - "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", - "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29", - "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", - "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", - "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c", - "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", - "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", - "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", - "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a", - "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178", - "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", - "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", - "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", - "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50" - ], - "markers": "python_version >= '3.9'", - "version": "==3.0.2" - }, - "matplotlib-inline": { - "hashes": [ - "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", - "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca" - ], - "markers": "python_version >= '3.8'", - "version": "==0.1.7" - }, - "mccabe": { - "hashes": [ - "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", - "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" - ], - "markers": "python_version >= '3.6'", - "version": "==0.7.0" - }, - "mistune": { - "hashes": [ - "sha256:1a32314113cff28aa6432e99e522677c8587fd83e3d51c29b82a52409c842bd9", - "sha256:a7035c21782b2becb6be62f8f25d3df81ccb4d6fa477a6525b15af06539f02a0" - ], - "markers": "python_version >= '3.8'", - "version": "==3.1.3" - }, - "nbclient": { - "hashes": [ - "sha256:4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d", - "sha256:90b7fc6b810630db87a6d0c2250b1f0ab4cf4d3c27a299b0cde78a4ed3fd9193" - ], - "markers": "python_full_version >= '3.9.0'", - "version": "==0.10.2" - }, - "nbconvert": { - "hashes": [ - "sha256:1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b", - "sha256:576a7e37c6480da7b8465eefa66c17844243816ce1ccc372633c6b71c3c0f582" - ], - "markers": "python_version >= '3.8'", - "version": "==7.16.6" - }, - "nbformat": { - "hashes": [ - "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a", - "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b" - ], - "markers": "python_version >= '3.8'", - "version": "==5.10.4" - }, - "nest-asyncio": { - "hashes": [ - "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", - "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c" - ], - "markers": "python_version >= '3.5'", - "version": "==1.6.0" - }, - "notebook": { - "hashes": [ - "sha256:9cdeee954e04101cadb195d90e2ab62b7c9286c1d4f858bf3bb54e40df16c0c3", - "sha256:a1567481cd3853f2610ee0ecf5dfa12bb508e878ee8f92152c134ef7f0568a76" - ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==7.4.3" - }, - "notebook-shim": { - "hashes": [ - "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef", - "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb" - ], - "markers": "python_version >= '3.7'", - "version": "==0.2.4" - }, - "overrides": { - "hashes": [ - "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a", - "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49" - ], - "markers": "python_version >= '3.6'", - "version": "==7.7.0" - }, - "packaging": { - "hashes": [ - "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", - "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f" - ], - "markers": "python_version >= '3.8'", - "version": "==25.0" - }, - "pandocfilters": { - "hashes": [ - "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e", - "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.5.1" - }, - "parso": { - "hashes": [ - "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", - "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d" - ], - "markers": "python_version >= '3.6'", - "version": "==0.8.4" - }, - "pexpect": { - "hashes": [ - "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", - "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f" - ], - "markers": "sys_platform != 'win32' and sys_platform != 'emscripten'", - "version": "==4.9.0" - }, - "platformdirs": { - "hashes": [ - "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", - "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4" - ], - "markers": "python_version >= '3.9'", - "version": "==4.3.8" - }, - "pluggy": { - "hashes": [ - "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", - "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746" - ], - "markers": "python_version >= '3.9'", - "version": "==1.6.0" - }, - "prometheus-client": { - "hashes": [ - "sha256:190f1331e783cf21eb60bca559354e0a4d4378facecf78f5428c39b675d20d28", - "sha256:cca895342e308174341b2cbf99a56bef291fbc0ef7b9e5412a0f26d653ba7094" - ], - "markers": "python_version >= '3.9'", - "version": "==0.22.1" - }, - "prompt-toolkit": { - "hashes": [ - "sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07", - "sha256:931a162e3b27fc90c86f1b48bb1fb2c528c2761475e57c9c06de13311c7b54ed" - ], - "markers": "python_version >= '3.8'", - "version": "==3.0.51" - }, - "psutil": { - "hashes": [ - "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25", - "sha256:1e744154a6580bc968a0195fd25e80432d3afec619daf145b9e5ba16cc1d688e", - "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91", - "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da", - "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34", - "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553", - "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456", - "sha256:84df4eb63e16849689f76b1ffcb36db7b8de703d1bc1fe41773db487621b6c17", - "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993", - "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99" - ], - "markers": "python_version >= '3.6'", - "version": "==7.0.0" - }, - "ptyprocess": { - "hashes": [ - "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", - "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220" - ], - "version": "==0.7.0" - }, - "pure-eval": { - "hashes": [ - "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", - "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42" - ], - "version": "==0.2.3" - }, - "pycparser": { - "hashes": [ - "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", - "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc" - ], - "markers": "python_version >= '3.8'", - "version": "==2.22" - }, - "pydeps": { - "hashes": [ - "sha256:7c86ee63c9ee6ddd088c840364981c5aa214a994d323bb7fa4724fca30829bee", - "sha256:a57415a8fae2ff6840a199b7dfcfecb90c37e4b9b54b58a111808a3440bc03bc" - ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==3.0.1" - }, - "pygments": { - "hashes": [ - "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", - "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b" - ], - "markers": "python_version >= '3.8'", - "version": "==2.19.2" - }, - "pylint": { - "hashes": [ - "sha256:2b11de8bde49f9c5059452e0c310c079c746a0a8eeaa789e5aa966ecc23e4559", - "sha256:43860aafefce92fca4cf6b61fe199cdc5ae54ea28f9bf4cd49de267b5195803d" - ], - "index": "pypi", - "markers": "python_full_version >= '3.9.0'", - "version": "==3.3.7" - }, - "pytest": { - "hashes": [ - "sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7", - "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c" - ], - "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==8.4.1" - }, - "pytest-cov": { - "hashes": [ - "sha256:25cc6cc0a5358204b8108ecedc51a9b57b34cc6b8c967cc2c01a4e00d8a67da2", - "sha256:f5bc4c23f42f1cdd23c70b1dab1bbaef4fc505ba950d53e0081d0730dd7e86d5" - ], - "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==6.2.1" - }, - "python-dateutil": { - "hashes": [ - "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", - "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", - "version": "==2.9.0.post0" - }, - "python-json-logger": { - "hashes": [ - "sha256:12b7e74b17775e7d565129296105bbe3910842d9d0eb083fc83a6a617aa8df84", - "sha256:dd980fae8cffb24c13caf6e158d3d61c0d6d22342f932cb6e9deedab3d35eec7" - ], - "markers": "python_version >= '3.8'", - "version": "==3.3.0" - }, - "pyyaml": { - "hashes": [ - "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff", - "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", - "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", - "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e", - "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", - "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", - "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", - "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", - "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", - "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", - "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a", - "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", - "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", - "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8", - "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", - "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19", - "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", - "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a", - "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", - "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", - "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", - "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631", - "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d", - "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", - "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", - "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", - "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", - "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", - "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", - "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706", - "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", - "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", - "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", - "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083", - "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", - "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", - "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", - "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f", - "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725", - "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", - "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", - "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", - "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", - "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", - "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5", - "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d", - "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290", - "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", - "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", - "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", - "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", - "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12", - "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4" - ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==6.0.2" - }, - "pyzmq": { - "hashes": [ - "sha256:00387d12a8af4b24883895f7e6b9495dc20a66027b696536edac35cb988c38f3", - "sha256:04cd50ef3b28e35ced65740fb9956a5b3f77a6ff32fcd887e3210433f437dd0f", - "sha256:0546a720c1f407b2172cb04b6b094a78773491497e3644863cf5c96c42df8cff", - "sha256:096af9e133fec3a72108ddefba1e42985cb3639e9de52cfd336b6fc23aa083e9", - "sha256:100f6e5052ba42b2533011d34a018a5ace34f8cac67cb03cfa37c8bdae0ca617", - "sha256:10f70c1d9a446a85013a36871a296007f6fe4232b530aa254baf9da3f8328bc0", - "sha256:111db5f395e09f7e775f759d598f43cb815fc58e0147623c4816486e1a39dc22", - "sha256:14fe7aaac86e4e93ea779a821967360c781d7ac5115b3f1a171ced77065a0174", - "sha256:15f39d50bd6c9091c67315ceb878a4f531957b121d2a05ebd077eb35ddc5efed", - "sha256:1958947983fef513e6e98eff9cb487b60bf14f588dc0e6bf35fa13751d2c8251", - "sha256:20d5cb29e8c5f76a127c75b6e7a77e846bc4b655c373baa098c26a61b7ecd0ef", - "sha256:21457825249b2a53834fa969c69713f8b5a79583689387a5e7aed880963ac564", - "sha256:2524c40891be6a3106885a3935d58452dd83eb7a5742a33cc780a1ad4c49dec0", - "sha256:26b72c5ae20bf59061c3570db835edb81d1e0706ff141747055591c4b41193f8", - "sha256:26d542258c7a1f35a9cff3d887687d3235006134b0ac1c62a6fe1ad3ac10440e", - "sha256:29f44e3c26b9783816ba9ce274110435d8f5b19bbd82f7a6c7612bb1452a3597", - "sha256:2c386339d7e3f064213aede5d03d054b237937fbca6dd2197ac8cf3b25a6b14e", - "sha256:39ddd3ba0a641f01d8f13a3cfd4c4924eb58e660d8afe87e9061d6e8ca6f7ac3", - "sha256:42c7555123679637c99205b1aa9e8f7d90fe29d4c243c719e347d4852545216c", - "sha256:4c19d39c04c29a6619adfeb19e3735c421b3bfee082f320662f52e59c47202ba", - "sha256:4e7d0a8d460fba526cc047333bdcbf172a159b8bd6be8c3eb63a416ff9ba1477", - "sha256:50360fb2a056ffd16e5f4177eee67f1dd1017332ea53fb095fe7b5bf29c70246", - "sha256:51f5726de3532b8222e569990c8aa34664faa97038304644679a51d906e60c6e", - "sha256:53a48f0228eab6cbf69fde3aa3c03cbe04e50e623ef92ae395fce47ef8a76152", - "sha256:55a0155b148fe0428285a30922f7213539aa84329a5ad828bca4bbbc665c70a4", - "sha256:56e46bbb85d52c1072b3f809cc1ce77251d560bc036d3a312b96db1afe76db2e", - "sha256:5b10bd6f008937705cf6e7bf8b6ece5ca055991e3eb130bca8023e20b86aa9a3", - "sha256:5cd11d46d7b7e5958121b3eaf4cd8638eff3a720ec527692132f05a57f14341d", - "sha256:5d5ef4718ecab24f785794e0e7536436698b459bfbc19a1650ef55280119d93b", - "sha256:60e8cc82d968174650c1860d7b716366caab9973787a1c060cf8043130f7d0f7", - "sha256:63af72b2955fc77caf0a77444baa2431fcabb4370219da38e1a9f8d12aaebe28", - "sha256:656c1866505a5735d0660b7da6d7147174bbf59d4975fc2b7f09f43c9bc25745", - "sha256:661942bc7cd0223d569d808f2e5696d9cc120acc73bf3e88a1f1be7ab648a7e4", - "sha256:67855c14173aec36395d7777aaba3cc527b393821f30143fd20b98e1ff31fd38", - "sha256:67bfbcbd0a04c575e8103a6061d03e393d9f80ffdb9beb3189261e9e9bc5d5e9", - "sha256:6a56e3e5bd2d62a01744fd2f1ce21d760c7c65f030e9522738d75932a14ab62a", - "sha256:6ad0562d4e6abb785be3e4dd68599c41be821b521da38c402bc9ab2a8e7ebc7e", - "sha256:6b0397b0be277b46762956f576e04dc06ced265759e8c2ff41a0ee1aa0064198", - "sha256:6e435540fa1da54667f0026cf1e8407fe6d8a11f1010b7f06b0b17214ebfcf5e", - "sha256:7011ade88c8e535cf140f8d1a59428676fbbce7c6e54fefce58bf117aefb6667", - "sha256:74175b9e12779382432dd1d1f5960ebe7465d36649b98a06c6b26be24d173fab", - "sha256:7cdf07fe0a557b131366f80727ec8ccc4b70d89f1e3f920d94a594d598d754f0", - "sha256:8617c7d43cd8ccdb62aebe984bfed77ca8f036e6c3e46dd3dddda64b10f0ab7a", - "sha256:88b4e43cab04c3c0f0d55df3b1eef62df2b629a1a369b5289a58f6fa8b07c4f4", - "sha256:8c86ea8fe85e2eb0ffa00b53192c401477d5252f6dd1db2e2ed21c1c30d17e5e", - "sha256:8ca7e6a0388dd9e1180b14728051068f4efe83e0d2de058b5ff92c63f399a73f", - "sha256:90252fa2ff3a104219db1f5ced7032a7b5fc82d7c8d2fec2b9a3e6fd4e25576b", - "sha256:9df43a2459cd3a3563404c1456b2c4c69564daa7dbaf15724c09821a3329ce46", - "sha256:a20528da85c7ac7a19b7384e8c3f8fa707841fd85afc4ed56eda59d93e3d98ad", - "sha256:a979b7cf9e33d86c4949df527a3018767e5f53bc3b02adf14d4d8db1db63ccc0", - "sha256:ae2b34bcfaae20c064948a4113bf8709eee89fd08317eb293ae4ebd69b4d9740", - "sha256:b1f08eeb9ce1510e6939b6e5dcd46a17765e2333daae78ecf4606808442e52cf", - "sha256:b801c2e40c5aa6072c2f4876de8dccd100af6d9918d4d0d7aa54a1d982fd4f44", - "sha256:b973ee650e8f442ce482c1d99ca7ab537c69098d53a3d046676a484fd710c87a", - "sha256:bf6c6b061efd00404b9750e2cfbd9507492c8d4b3721ded76cb03786131be2ed", - "sha256:c0dc628b5493f9a8cd9844b8bee9732ef587ab00002157c9329e4fc0ef4d3afa", - "sha256:c0ed2c1f335ba55b5fdc964622254917d6b782311c50e138863eda409fbb3b6d", - "sha256:c2dace4a7041cca2fba5357a2d7c97c5effdf52f63a1ef252cfa496875a3762d", - "sha256:c36ad534c0c29b4afa088dc53543c525b23c0797e01b69fef59b1a9c0e38b688", - "sha256:c45fee3968834cd291a13da5fac128b696c9592a9493a0f7ce0b47fa03cc574d", - "sha256:c5817641eebb391a2268c27fecd4162448e03538387093cdbd8bf3510c316b38", - "sha256:c644aaacc01d0df5c7072826df45e67301f191c55f68d7b2916d83a9ddc1b551", - "sha256:c8878011653dcdc27cc2c57e04ff96f0471e797f5c19ac3d7813a245bcb24371", - "sha256:cae73bb6898c4e045fbed5024cb587e4110fddb66f6163bcab5f81f9d4b9c496", - "sha256:cb0ac5179cba4b2f94f1aa208fbb77b62c4c9bf24dd446278b8b602cf85fcda3", - "sha256:cbabc59dcfaac66655c040dfcb8118f133fb5dde185e5fc152628354c1598e52", - "sha256:cd1dc59763effd1576f8368047c9c31468fce0af89d76b5067641137506792ae", - "sha256:cf209a6dc4b420ed32a7093642843cbf8703ed0a7d86c16c0b98af46762ebefb", - "sha256:d8229f2efece6a660ee211d74d91dbc2a76b95544d46c74c615e491900dc107f", - "sha256:d8c6de908465697a8708e4d6843a1e884f567962fc61eb1706856545141d0cbb", - "sha256:dc1091f59143b471d19eb64f54bae4f54bcf2a466ffb66fe45d94d8d734eb495", - "sha256:dce4199bf5f648a902ce37e7b3afa286f305cd2ef7a8b6ec907470ccb6c8b371", - "sha256:e40609380480b3d12c30f841323f42451c755b8fece84235236f5fe5ffca8c1c", - "sha256:e8c4adce8e37e75c4215297d7745551b8dcfa5f728f23ce09bf4e678a9399413", - "sha256:e918d70862d4cfd4b1c187310015646a14e1f5917922ab45b29f28f345eeb6be", - "sha256:ea6d441c513bf18c578c73c323acf7b4184507fc244762193aa3a871333c9045", - "sha256:ee05728c0b0b2484a9fc20466fa776fffb65d95f7317a3419985b8c908563861", - "sha256:f4162dbbd9c5c84fb930a36f290b08c93e35fce020d768a16fc8891a2f72bab8", - "sha256:f7bbe9e1ed2c8d3da736a15694d87c12493e54cc9dc9790796f0321794bbc91f" - ], - "markers": "python_version >= '3.8'", - "version": "==27.0.0" - }, - "referencing": { - "hashes": [ - "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", - "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0" - ], - "markers": "python_version >= '3.9'", - "version": "==0.36.2" - }, - "requests": { - "hashes": [ - "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", - "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422" - ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==2.32.4" - }, - "requests-mock": { - "hashes": [ - "sha256:b1e37054004cdd5e56c84454cc7df12b25f90f382159087f4b6915aaeef39563", - "sha256:e9e12e333b525156e82a3c852f22016b9158220d2f47454de9cae8a77d371401" - ], - "index": "pypi", - "markers": "python_version >= '3.5'", - "version": "==1.12.1" - }, - "rfc3339-validator": { - "hashes": [ - "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b", - "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==0.1.4" - }, - "rfc3986-validator": { - "hashes": [ - "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9", - "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==0.1.1" - }, - "rpds-py": { - "hashes": [ - "sha256:0317177b1e8691ab5879f4f33f4b6dc55ad3b344399e23df2e499de7b10a548d", - "sha256:036ded36bedb727beeabc16dc1dad7cb154b3fa444e936a03b67a86dc6a5066e", - "sha256:048893e902132fd6548a2e661fb38bf4896a89eea95ac5816cf443524a85556f", - "sha256:0701942049095741a8aeb298a31b203e735d1c61f4423511d2b1a41dcd8a16da", - "sha256:083a9513a33e0b92cf6e7a6366036c6bb43ea595332c1ab5c8ae329e4bcc0a9c", - "sha256:09eab132f41bf792c7a0ea1578e55df3f3e7f61888e340779b06050a9a3f16e9", - "sha256:0e6a327af8ebf6baba1c10fadd04964c1965d375d318f4435d5f3f9651550f4a", - "sha256:0eb90e94f43e5085623932b68840b6f379f26db7b5c2e6bcef3179bd83c9330f", - "sha256:114a07e85f32b125404f28f2ed0ba431685151c037a26032b213c882f26eb908", - "sha256:115874ae5e2fdcfc16b2aedc95b5eef4aebe91b28e7e21951eda8a5dc0d3461b", - "sha256:140f61d9bed7839446bdd44852e30195c8e520f81329b4201ceead4d64eb3a9f", - "sha256:1521031351865e0181bc585147624d66b3b00a84109b57fcb7a779c3ec3772cd", - "sha256:1c0c434a53714358532d13539272db75a5ed9df75a4a090a753ac7173ec14e11", - "sha256:1d1fadd539298e70cac2f2cb36f5b8a65f742b9b9f1014dd4ea1f7785e2470bf", - "sha256:1de336a4b164c9188cb23f3703adb74a7623ab32d20090d0e9bf499a2203ad65", - "sha256:1ee3e26eb83d39b886d2cb6e06ea701bba82ef30a0de044d34626ede51ec98b0", - "sha256:245550f5a1ac98504147cba96ffec8fabc22b610742e9150138e5d60774686d7", - "sha256:2a40046a529cc15cef88ac5ab589f83f739e2d332cb4d7399072242400ed68c9", - "sha256:2c2cd1a4b0c2b8c5e31ffff50d09f39906fe351389ba143c195566056c13a7ea", - "sha256:2cb9e5b5e26fc02c8a4345048cd9998c2aca7c2712bd1b36da0c72ee969a3523", - "sha256:33358883a4490287e67a2c391dfaea4d9359860281db3292b6886bf0be3d8692", - "sha256:35634369325906bcd01577da4c19e3b9541a15e99f31e91a02d010816b49bfda", - "sha256:35a8d1a24b5936b35c5003313bc177403d8bdef0f8b24f28b1c4a255f94ea992", - "sha256:3af5b4cc10fa41e5bc64e5c198a1b2d2864337f8fcbb9a67e747e34002ce812b", - "sha256:3bcce0edc1488906c2d4c75c94c70a0417e83920dd4c88fec1078c94843a6ce9", - "sha256:3c5b317ecbd8226887994852e85de562f7177add602514d4ac40f87de3ae45a8", - "sha256:3c6564c0947a7f52e4792983f8e6cf9bac140438ebf81f527a21d944f2fd0a40", - "sha256:3ebd879ab996537fc510a2be58c59915b5dd63bccb06d1ef514fee787e05984a", - "sha256:3f0b1798cae2bbbc9b9db44ee068c556d4737911ad53a4e5093d09d04b3bbc24", - "sha256:401ca1c4a20cc0510d3435d89c069fe0a9ae2ee6495135ac46bdd49ec0495763", - "sha256:454601988aab2c6e8fd49e7634c65476b2b919647626208e376afcd22019eeb8", - "sha256:4593c4eae9b27d22df41cde518b4b9e4464d139e4322e2127daa9b5b981b76be", - "sha256:45e484db65e5380804afbec784522de84fa95e6bb92ef1bd3325d33d13efaebd", - "sha256:48d64155d02127c249695abb87d39f0faf410733428d499867606be138161d65", - "sha256:4fbb0dbba559959fcb5d0735a0f87cdbca9e95dac87982e9b95c0f8f7ad10255", - "sha256:4fd52d3455a0aa997734f3835cbc4c9f32571345143960e7d7ebfe7b5fbfa3b2", - "sha256:50f2c501a89c9a5f4e454b126193c5495b9fb441a75b298c60591d8a2eb92e1b", - "sha256:58f77c60956501a4a627749a6dcb78dac522f249dd96b5c9f1c6af29bfacfb66", - "sha256:5a3ddb74b0985c4387719fc536faced33cadf2172769540c62e2a94b7b9be1c4", - "sha256:5c4a128527fe415d73cf1f70a9a688d06130d5810be69f3b553bf7b45e8acf79", - "sha256:5d473be2b13600b93a5675d78f59e63b51b1ba2d0476893415dfbb5477e65b31", - "sha256:5d9e40f32745db28c1ef7aad23f6fc458dc1e29945bd6781060f0d15628b8ddf", - "sha256:5f048bbf18b1f9120685c6d6bb70cc1a52c8cc11bdd04e643d28d3be0baf666d", - "sha256:605ffe7769e24b1800b4d024d24034405d9404f0bc2f55b6db3362cd34145a6f", - "sha256:6099263f526efff9cf3883dfef505518730f7a7a93049b1d90d42e50a22b4793", - "sha256:659d87430a8c8c704d52d094f5ba6fa72ef13b4d385b7e542a08fc240cb4a559", - "sha256:666fa7b1bd0a3810a7f18f6d3a25ccd8866291fbbc3c9b912b917a6715874bb9", - "sha256:68f6f060f0bbdfb0245267da014d3a6da9be127fe3e8cc4a68c6f833f8a23bb1", - "sha256:6d273f136e912aa101a9274c3145dcbddbe4bac560e77e6d5b3c9f6e0ed06d34", - "sha256:6d50841c425d16faf3206ddbba44c21aa3310a0cebc3c1cdfc3e3f4f9f6f5728", - "sha256:771c16060ff4e79584dc48902a91ba79fd93eade3aa3a12d6d2a4aadaf7d542b", - "sha256:785ffacd0ee61c3e60bdfde93baa6d7c10d86f15655bd706c89da08068dc5038", - "sha256:796ad874c89127c91970652a4ee8b00d56368b7e00d3477f4415fe78164c8000", - "sha256:79dc317a5f1c51fd9c6a0c4f48209c6b8526d0524a6904fc1076476e79b00f98", - "sha256:7c9409b47ba0650544b0bb3c188243b83654dfe55dcc173a86832314e1a6a35d", - "sha256:7d779b325cc8238227c47fbc53964c8cc9a941d5dbae87aa007a1f08f2f77b23", - "sha256:816568614ecb22b18a010c7a12559c19f6fe993526af88e95a76d5a60b8b75fb", - "sha256:8378fa4a940f3fb509c081e06cb7f7f2adae8cf46ef258b0e0ed7519facd573e", - "sha256:85608eb70a659bf4c1142b2781083d4b7c0c4e2c90eff11856a9754e965b2540", - "sha256:85fc223d9c76cabe5d0bff82214459189720dc135db45f9f66aa7cffbf9ff6c1", - "sha256:88ec04afe0c59fa64e2f6ea0dd9657e04fc83e38de90f6de201954b4d4eb59bd", - "sha256:8960b6dac09b62dac26e75d7e2c4a22efb835d827a7278c34f72b2b84fa160e3", - "sha256:89706d0683c73a26f76a5315d893c051324d771196ae8b13e6ffa1ffaf5e574f", - "sha256:89c24300cd4a8e4a51e55c31a8ff3918e6651b241ee8876a42cc2b2a078533ba", - "sha256:8c742af695f7525e559c16f1562cf2323db0e3f0fbdcabdf6865b095256b2d40", - "sha256:8dbd586bfa270c1103ece2109314dd423df1fa3d9719928b5d09e4840cec0d72", - "sha256:8eb8c84ecea987a2523e057c0d950bcb3f789696c0499290b8d7b3107a719d78", - "sha256:921954d7fbf3fccc7de8f717799304b14b6d9a45bbeec5a8d7408ccbf531faf5", - "sha256:9a46c2fb2545e21181445515960006e85d22025bd2fe6db23e76daec6eb689fe", - "sha256:9c006f3aadeda131b438c3092124bd196b66312f0caa5823ef09585a669cf449", - "sha256:9ceca1cf097ed77e1a51f1dbc8d174d10cb5931c188a4505ff9f3e119dfe519b", - "sha256:9e5fc7484fa7dce57e25063b0ec9638ff02a908304f861d81ea49273e43838c1", - "sha256:9f2f48ab00181600ee266a095fe815134eb456163f7d6699f525dee471f312cf", - "sha256:9fca84a15333e925dd59ce01da0ffe2ffe0d6e5d29a9eeba2148916d1824948c", - "sha256:a49e1d7a4978ed554f095430b89ecc23f42014a50ac385eb0c4d163ce213c325", - "sha256:a58d1ed49a94d4183483a3ce0af22f20318d4a1434acee255d683ad90bf78129", - "sha256:a61d0b2c7c9a0ae45732a77844917b427ff16ad5464b4d4f5e4adb955f582890", - "sha256:a714bf6e5e81b0e570d01f56e0c89c6375101b8463999ead3a93a5d2a4af91fa", - "sha256:a7b74e92a3b212390bdce1d93da9f6488c3878c1d434c5e751cbc202c5e09500", - "sha256:a8bd2f19e312ce3e1d2c635618e8a8d8132892bb746a7cf74780a489f0f6cdcb", - "sha256:b0be9965f93c222fb9b4cc254235b3b2b215796c03ef5ee64f995b1b69af0762", - "sha256:b24bf3cd93d5b6ecfbedec73b15f143596c88ee249fa98cefa9a9dc9d92c6f28", - "sha256:b5ffe453cde61f73fea9430223c81d29e2fbf412a6073951102146c84e19e34c", - "sha256:bc120d1132cff853ff617754196d0ac0ae63befe7c8498bd67731ba368abe451", - "sha256:bd035756830c712b64725a76327ce80e82ed12ebab361d3a1cdc0f51ea21acb0", - "sha256:bffcf57826d77a4151962bf1701374e0fc87f536e56ec46f1abdd6a903354042", - "sha256:c2013ee878c76269c7b557a9a9c042335d732e89d482606990b70a839635feb7", - "sha256:c4feb9211d15d9160bc85fa72fed46432cdc143eb9cf6d5ca377335a921ac37b", - "sha256:c8980cde3bb8575e7c956a530f2c217c1d6aac453474bf3ea0f9c89868b531b6", - "sha256:c98f126c4fc697b84c423e387337d5b07e4a61e9feac494362a59fd7a2d9ed80", - "sha256:ccc6f3ddef93243538be76f8e47045b4aad7a66a212cd3a0f23e34469473d36b", - "sha256:ccfa689b9246c48947d31dd9d8b16d89a0ecc8e0e26ea5253068efb6c542b76e", - "sha256:cda776f1967cb304816173b30994faaf2fd5bcb37e73118a47964a02c348e1bc", - "sha256:ce4c8e485a3c59593f1a6f683cf0ea5ab1c1dc94d11eea5619e4fb5228b40fbd", - "sha256:d3c10228d6cf6fe2b63d2e7985e94f6916fa46940df46b70449e9ff9297bd3d1", - "sha256:d4ca54b9cf9d80b4016a67a0193ebe0bcf29f6b0a96f09db942087e294d3d4c2", - "sha256:d4cb2b3ddc16710548801c6fcc0cfcdeeff9dafbc983f77265877793f2660309", - "sha256:d50e4864498a9ab639d6d8854b25e80642bd362ff104312d9770b05d66e5fb13", - "sha256:d74ec9bc0e2feb81d3f16946b005748119c0f52a153f6db6a29e8cd68636f295", - "sha256:d8222acdb51a22929c3b2ddb236b69c59c72af4019d2cba961e2f9add9b6e634", - "sha256:db58483f71c5db67d643857404da360dce3573031586034b7d59f245144cc192", - "sha256:dc3c1ff0abc91444cd20ec643d0f805df9a3661fcacf9c95000329f3ddf268a4", - "sha256:dd326a81afe332ede08eb39ab75b301d5676802cdffd3a8f287a5f0b694dc3f5", - "sha256:dec21e02e6cc932538b5203d3a8bd6aa1480c98c4914cb88eea064ecdbc6396a", - "sha256:e1dafef8df605fdb46edcc0bf1573dea0d6d7b01ba87f85cd04dc855b2b4479e", - "sha256:e2f6a2347d3440ae789505693a02836383426249d5293541cd712e07e7aecf54", - "sha256:e37caa8cdb3b7cf24786451a0bdb853f6347b8b92005eeb64225ae1db54d1c2b", - "sha256:e43a005671a9ed5a650f3bc39e4dbccd6d4326b24fb5ea8be5f3a43a6f576c72", - "sha256:e5e2f7280d8d0d3ef06f3ec1b4fd598d386cc6f0721e54f09109a8132182fbfe", - "sha256:e87798852ae0b37c88babb7f7bbbb3e3fecc562a1c340195b44c7e24d403e380", - "sha256:ee86d81551ec68a5c25373c5643d343150cc54672b5e9a0cafc93c1870a53954", - "sha256:f251bf23deb8332823aef1da169d5d89fa84c89f67bdfb566c49dea1fccfd50d", - "sha256:f3d86373ff19ca0441ebeb696ef64cb58b8b5cbacffcda5a0ec2f3911732a194", - "sha256:f4ad628b5174d5315761b67f212774a32f5bad5e61396d38108bd801c0a8f5d9", - "sha256:f70316f760174ca04492b5ab01be631a8ae30cadab1d1081035136ba12738cfa", - "sha256:f73ce1512e04fbe2bc97836e89830d6b4314c171587a99688082d090f934d20a", - "sha256:ff7c23ba0a88cb7b104281a99476cccadf29de2a0ef5ce864959a52675b1ca83" - ], - "markers": "python_version >= '3.9'", - "version": "==0.25.1" - }, - "send2trash": { - "hashes": [ - "sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9", - "sha256:b18e7a3966d99871aefeb00cfbcfdced55ce4871194810fc71f4aa484b953abf" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==1.8.3" - }, - "setuptools": { - "hashes": [ - "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", - "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c" - ], - "markers": "python_version >= '3.9'", - "version": "==80.9.0" - }, - "six": { - "hashes": [ - "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", - "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", - "version": "==1.17.0" - }, - "sniffio": { - "hashes": [ - "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", - "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc" - ], - "markers": "python_version >= '3.7'", - "version": "==1.3.1" - }, - "soupsieve": { - "hashes": [ - "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4", - "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a" - ], - "markers": "python_version >= '3.8'", - "version": "==2.7" - }, - "stack-data": { - "hashes": [ - "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", - "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695" - ], - "version": "==0.6.3" - }, - "stdlib-list": { - "hashes": [ - "sha256:9029ea5e3dfde8cd4294cfd4d1797be56a67fc4693c606181730148c3fd1da29", - "sha256:95ebd1d73da9333bba03ccc097f5bac05e3aa03e6822a0c0290f87e1047f1857" - ], - "markers": "python_version >= '3.9'", - "version": "==0.11.1" - }, - "terminado": { - "hashes": [ - "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0", - "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e" - ], - "markers": "python_version >= '3.8'", - "version": "==0.18.1" - }, - "tinycss2": { - "hashes": [ - "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7", - "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289" - ], - "markers": "python_version >= '3.8'", - "version": "==1.4.0" - }, - "tomlkit": { - "hashes": [ - "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1", - "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0" - ], - "markers": "python_version >= '3.8'", - "version": "==0.13.3" - }, - "tornado": { - "hashes": [ - "sha256:02420a0eb7bf617257b9935e2b754d1b63897525d8a289c9d65690d580b4dcf7", - "sha256:13ce6e3396c24e2808774741331638ee6c2f50b114b97a55c5b442df65fd9692", - "sha256:253b76040ee3bab8bcf7ba9feb136436a3787208717a1fb9f2c16b744fba7331", - "sha256:308473f4cc5a76227157cdf904de33ac268af770b2c5f05ca6c1161d82fdd95e", - "sha256:5cae6145f4cdf5ab24744526cc0f55a17d76f02c98f4cff9daa08ae9a217448a", - "sha256:84ceece391e8eb9b2b95578db65e920d2a61070260594819589609ba9bc6308c", - "sha256:908e7d64567cecd4c2b458075589a775063453aeb1d2a1853eedb806922f568b", - "sha256:9e9ca370f717997cb85606d074b0e5b247282cf5e2e1611568b8821afe0342d6", - "sha256:b77e9dfa7ed69754a54c89d82ef746398be82f749df69c4d3abe75c4d1ff4888", - "sha256:caec6314ce8a81cf69bd89909f4b633b9f523834dc1a352021775d45e51d9401", - "sha256:d50065ba7fd11d3bd41bcad0825227cc9a95154bad83239357094c36708001f7", - "sha256:e0a36e1bc684dca10b1aa75a31df8bdfed656831489bc1e6a6ebed05dc1ec365" - ], - "markers": "python_version >= '3.9'", - "version": "==6.5.1" - }, - "traitlets": { - "hashes": [ - "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", - "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f" - ], - "markers": "python_version >= '3.8'", - "version": "==5.14.3" - }, - "types-python-dateutil": { - "hashes": [ - "sha256:13e80d6c9c47df23ad773d54b2826bd52dbbb41be87c3f339381c1700ad21ee5", - "sha256:2b2b3f57f9c6a61fba26a9c0ffb9ea5681c9b83e69cd897c6b5f668d9c0cab93" - ], - "markers": "python_version >= '3.9'", - "version": "==2.9.0.20250516" - }, - "typing-extensions": { - "hashes": [ - "sha256:8676b788e32f02ab42d9e7c61324048ae4c6d844a399eebace3d4979d75ceef4", - "sha256:a1514509136dd0b477638fc68d6a91497af5076466ad0fa6c338e44e359944af" - ], - "markers": "python_version >= '3.9'", - "version": "==4.14.0" - }, - "uri-template": { - "hashes": [ - "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7", - "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363" - ], - "markers": "python_version >= '3.7'", - "version": "==1.3.0" - }, - "urllib3": { - "hashes": [ - "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", - "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc" - ], - "markers": "python_version >= '3.9'", - "version": "==2.5.0" - }, - "wcwidth": { - "hashes": [ - "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", - "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5" - ], - "version": "==0.2.13" - }, - "webcolors": { - "hashes": [ - "sha256:515291393b4cdf0eb19c155749a096f779f7d909f7cceea072791cb9095b92e9", - "sha256:ecb3d768f32202af770477b8b65f318fa4f566c22948673a977b00d589dd80f6" - ], - "markers": "python_version >= '3.9'", - "version": "==24.11.1" - }, - "webencodings": { - "hashes": [ - "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", - "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923" - ], - "version": "==0.5.1" - }, - "websocket-client": { - "hashes": [ - "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526", - "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da" - ], - "markers": "python_version >= '3.8'", - "version": "==1.8.0" - } - } -} diff --git a/README.md b/README.md index 385b7ff..b0a1ca4 100644 --- a/README.md +++ b/README.md @@ -1,80 +1,143 @@ # pyetm -This package provides a set of tools for interaction with the Energy Transition Model's API. Learn more -about the Energy Transition Model [here](https://energytransitionmodel.com/). The -package is designed to be a modular tool that advanced users can incorporate into their workflows. The -complete documentation is available [via the ETM documentation page](https://docs.energytransitionmodel.com/main/pyetm/introduction). +This package provides a set of tools for interaction with the Energy Transition Model's API. +Learn more about the Energy Transition Model [here](https://energytransitionmodel.com/). + +The package is designed to be a modular tool that advanced users can incorporate into their scenario workflows. +The complete documentation is available [via the ETM documentation page](https://docs.energytransitionmodel.com/main/pyetm/introduction). + +--- ## Installation -You can clone the pyetm from [our Github](https://github.com/quintel/pyetm). The package is also -available via pip like any other python package - install it and use it in your project! -``` +You can install **pyetm** directly from PyPI: +```bash pip install pyetm ``` -## Just running the Jupyter Notebooks - or a beginner friendly guide to PyETM -If you are not planning on developing the tool, but would like to open and run our Jupyter notebooks -in VS Code, follow the beginner friendly guide at [Running notebooks](running_notebooks.md). +Or clone from [our GitHub repository](https://github.com/quintel/pyetm) if you want the latest development version: +```bash +git clone https://github.com/quintel/pyetm.git +cd pyetm +``` -## Getting started -Make sure you have [Python 3](https://www.python.org/downloads/) installed. Then, install all required -libraries by opening a terminal/command-prompt window in the `pyetm` folder (or navigate to this folder -in the terminal using `cd "path/to/scenario-tools-folder"`). All following examples of running the tool -expect you to be in this folder. +--- -#### Using pipenv -It is recommended (but not required) that you use [`pipenv`](https://pipenv.pypa.io/en/latest/) for -running these tools. When using `pipenv` it will create a virtual environment for you. A virtual -environment helps with keeping the libraries you install here separate of your global libraries (in -other words your `pyetm` will be in a stable and isolated environment and are thus less -likely to break when updating things elsewhere on your computer). +## Running Jupyter Notebooks (Beginner Friendly) -You can install `pipenv` with `pip` or `pip3` if you don't have it installed yet. -``` -pip3 install pipenv -``` +If you only want to open and run our Jupyter notebooks in VS Code without developing the package, +follow the beginner guide here: [Running notebooks](running_notebooks.md). -Then you can create a new environment and install all the libraries in one go by running: -``` -pipenv install -``` +--- -If you plan to develop with the tool, install the dev dependencies too: -``` -pipenv install --dev +## Development Setup (Using Poetry) + +We recommend using [Poetry](https://python-poetry.org/) to manage dependencies and virtual environments. +Poetry ensures all dependencies are installed in an isolated environment, keeping your system clean. + +### Python +Make sure you have **Python 3.12** or later installed: +- **Windows**: [Download from python.org](https://www.python.org/downloads/windows/) +- **macOS**: Install via [Homebrew](https://brew.sh/) + ```bash + brew install python@3.12 + ``` +- **Linux**: Use your package manager or install from source. + +Check your version: +```bash +python3 --version ``` -#### Configuring your settings +--- -You can set your API token and the base url for your requests (depending which -[environment](https://docs.energytransitionmodel.com/api/intro#environments) you want to interact with) -either directly in the ENV or via a config.yml file. +### Poetry +Follow the [official instructions](https://python-poetry.org/docs/#installation): -##### config.yml -pyetm uses a `config.yml` file in the project root to store your personal settings: +```bash +curl -sSL https://install.python-poetry.org | python3 - +``` -1. Duplicate the example file provided (`examples/config.example.yml`) and rename it to `config.yml`. -2. Open `config.yml` and fill in your values: - - **etm_api_token**: Your personal ETM API token (overridden by the `$ETM_API_TOKEN` environment variable if set). - - **base_url**: The API base URL for the target environment (overridden by the `$BASE_URL` environment - variable if set) e.g., default pro, a stable engine at `https://2025-01.engine.energytransitionmodel.com/api/v3`, - or beta at `https://beta.engine.energytransitionmodel.com/api/v3`. - - **local_engine_url** and **local_model_url**: URLs for a local ETM instance, if running locally. - - **proxy_servers**: (Optional) HTTP/HTTPS proxy URLs, if required by your network. - - **csv_separator** and **decimal_separator**: Defaults are `,` and `.`; adjust if your CSV exports - use different separators. +After installation, ensure Poetry is available: +```bash +poetry --version +``` -Your `config.yml` should reside in the root `pyetm/` folder. -##### ENV variables -If you use pyetm as a package, you may want to set your ENV variables using a custom flow. In that -case, the variables you need to set are: +#### Install Dependencies - $ETM_API_TOKEN - Your api token (specific to the environment you are interacting with) - $BASE_URL - The base url of the environment you are interacting with. - $LOCAL_ENGINE_URL - The local url of the engine if running locally. - $LOCAL_MODEL_URL - The local url of the model if running locally. +Navigate to the `pyetm` folder and install all dependencies: +```bash +cd pyetm +poetry install +``` +This will: +- Create a virtual environment +- Install runtime dependencies +If you want development dependencies (testing, linting, etc.) then append the +"--with dev" flag to the install command. + + +#### Activating the Environment +You can either: +- Run commands inside Poetry’s environment: + ```bash + poetry run pytest + poetry run pyetm + ``` +- Or activate the shell: + ```bash + eval $(poetry env activate) + ``` + Then run commands normally: + ```bash + pytest + pyetm + ``` + + +## Configuring Your Settings + +You can configure your API token and base URL either with a **config.yml** file or environment variables. You can now simply set an `environment` and the base URL will be inferred for you. + +### Option 1: `config.yml` +1. Duplicate the example file (`examples/example.config.yml`) and rename it to `config.yml`. +2. Edit `config.yml`: + - **etm_api_token**: Your ETM API token (overridden by `$ETM_API_TOKEN` if set). + - **environment**: pro (default), beta, local, or a stable tag like `2025-01`. When set, `base_url` is inferred automatically. + - (optional) **base_url**: API base URL (overridden by `$BASE_URL` if set). If both `environment` and `base_url` are set, `base_url` wins. + Examples if you need a direct override: + - `https://engine.energytransitionmodel.com/api/v3` (pro) + - `https://beta.engine.energytransitionmodel.com/api/v3` (beta) + - `https://2025-01.engine.energytransitionmodel.com/api/v3` (stable tag) + - **proxy_servers**: (Optional) HTTP/HTTPS proxy URLs. + - **csv_separator** and **decimal_separator**: Defaults are `,` and `.`. + +Place `config.yml` in the project root (`pyetm/` folder). + +### Option 2: Environment Variables +If you prefer, set these environment variables: +```bash +ETM_API_TOKEN= +ENVIRONMENT= +# or provide a direct override instead of ENVIRONMENT +BASE_URL= +``` -#TODO - check links +--- + +## Cross-Platform Notes +- **Windows**: + - Use `py` instead of `python3` if `python3` is not recognized. + - In PowerShell, set environment variables with: + ```powershell + $env:ETM_API_TOKEN="your-token" + ``` +- **macOS/Linux**: + - Use `python3` in commands. + - Set environment variables with: + ```bash + export ETM_API_TOKEN="your-token" + export ENVIRONMENT=beta # or pro/local/2025-01 + ``` diff --git a/examples/.gitkeep b/examples/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/examples/advanced_examples/advanced_scenario_example.ipynb b/examples/advanced_examples/advanced_scenario_example.ipynb deleted file mode 100644 index e9baefc..0000000 --- a/examples/advanced_examples/advanced_scenario_example.ipynb +++ /dev/null @@ -1,689 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "ddbe7ab2", - "metadata": {}, - "source": [ - "# Advanced Scenario Examples\n", - "\n", - "This notebook demonstrates how to use the `Scenario` object within the pyetm package to retrieve and \n", - "inspect data from an ETM scenario. These examples are slightly more advanced, including analytics and\n", - "data operations on the scenario object and its sub-models.\n", - "\n", - "Make sure you have a valid `ETM_API_TOKEN` set in your environment.\n", - "\n", - "## Structure\n", - "\n", - "This notebook is organized into two main sections:\n", - "1. **Setup & Initialization** - Run these cells first to set up your environment and load a scenario\n", - "2. **Exploration Examples** - After setup is complete, these cells can be run in any order to explore different aspects of scenario data" - ] - }, - { - "cell_type": "markdown", - "id": "setup_header", - "metadata": {}, - "source": [ - "## Setup & Initialization\n", - "\n", - "**Run these cells first!** The following cells set up your environment and load a scenario. Complete this section before exploring the examples below." - ] - }, - { - "cell_type": "markdown", - "id": "5ba2f542", - "metadata": {}, - "source": [ - "##### Environment Setup" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "dfa34991", - "metadata": {}, - "outputs": [], - "source": [ - "from example_helpers import setup_notebook\n", - "from pyetm.models import Scenario\n", - "\n", - "setup_notebook()" - ] - }, - { - "cell_type": "markdown", - "id": "f579be0a", - "metadata": {}, - "source": [ - "##### Load a scenario\n", - "\n", - "This cell connects to a specific scenario using its session ID and loads all its data.\n", - "\n", - "The scenario object will contain inputs, outputs, custom curves, and other configuration data." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6a514b5d", - "metadata": {}, - "outputs": [], - "source": [ - "# Connect to your scenario by supplying the session ID\n", - "scenario = Scenario.load(2690288)\n", - "\n", - "print(f\" Scenario {scenario.id} loaded successfully\")\n", - "print(f\" Total inputs: {len(scenario.inputs)}\")\n", - "print(f\" User-modified inputs: {len(scenario.user_values())}\")\n", - "print(\"\\n Setup complete! You can now run any of the exploration examples below in any order.\")" - ] - }, - { - "cell_type": "markdown", - "id": "exploration_header", - "metadata": {}, - "source": [ - "## Exploration Examples\n", - "\n", - "**The cells below can be run in any order** after completing the setup section above. Each cell demonstrates different ways to explore and analyze scenario data using the pyetm package to connect to the Energy Transition Model's API." - ] - }, - { - "cell_type": "markdown", - "id": "basic_properties_section", - "metadata": {}, - "source": [ - "### Basic Scenario Properties" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "basic_properties", - "metadata": {}, - "outputs": [], - "source": [ - "# Display basic scenario properties\n", - "# These properties define the fundamental characteristics of the scenario\n", - "\n", - "print(f\"Scenario ID: {scenario.id}\")\n", - "print(f\"Area Code: {scenario.area_code}\")\n", - "print(f\"End Year: {scenario.end_year}\")\n", - "print(f\"Start Year: {scenario.start_year}\")\n", - "print(f\"Created: {scenario.created_at}\")\n", - "print(f\"Updated: {scenario.updated_at}\")\n", - "print(f\"Private: {scenario.private}\")\n", - "print(f\"Template: {scenario.template}\")\n", - "print(f\"Source: {scenario.source}\")\n", - "print(f\"URL: {scenario.url}\")\n", - "print(f\"Keep Compatible: {scenario.keep_compatible}\")\n", - "print(f\"Scaling: {scenario.scaling}\")\n", - "print(f\"Version: {scenario.version}\")\n", - "\n", - "# Show metadata if available\n", - "if scenario.metadata:\n", - " print(\"\\nMetadata:\")\n", - " print(scenario.metadata)\n", - "else:\n", - " print(\"\\nNo additional metadata available\")" - ] - }, - { - "cell_type": "markdown", - "id": "7418c5e1", - "metadata": {}, - "source": [ - "### Complete Scenario Metadata Export\n", - "\n", - "The `model_dump()` method provides a complete export of all scenario metadata in a structured format. This includes all properties and their current values." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "972bd7c5", - "metadata": {}, - "outputs": [], - "source": [ - "# Export complete scenario metadata\n", - "# model_dump() returns a comprehensive dictionary containing all scenario metadata\n", - "\n", - "full_data = scenario.model_dump()\n", - "print(f\"Complete scenario metadata ({len(full_data)} fields):\")\n", - "print(\"\\n\" + \"-\"*70)\n", - "print(full_data)" - ] - }, - { - "cell_type": "markdown", - "id": "user_values_section", - "metadata": {}, - "source": [ - "### Exploring User-Modified Values\n", - "\n", - "The `user_values()` method returns a dictionary of all inputs that have been modified from their default values." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "user_values_example", - "metadata": {}, - "outputs": [], - "source": [ - "# Display all user-modified input values\n", - "# This shows only the inputs that have been changed from their default values\n", - "# The format is {input_key: user_value}\n", - "\n", - "user_values = scenario.user_values()\n", - "print(f\"Found {len(user_values)} user-modified inputs:\")\n", - "print(\"\\n\" + \"-\"*70)\n", - "print(user_values)" - ] - }, - { - "cell_type": "markdown", - "id": "input_analysis_section", - "metadata": {}, - "source": [ - "### Analyzing Input Properties\n", - "\n", - "Each input in a scenario has various properties that define its behavior:\n", - "- `key`: Unique identifier for the input\n", - "- `unit`: The unit of measurement (e.g., 'MW', '%', 'PJ')\n", - "- `disabled`: Whether the input is currently disabled\n", - "- `user`: The value set by the user (if any)\n", - "- `default`: The default value for this input\n", - "\n", - "Additional properties for specific input types:\n", - "- **Float inputs**: `min` and `max` values defining valid ranges\n", - "- **Enumerable inputs**: `permitted_values` showing available options" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "input_collection_overview", - "metadata": {}, - "outputs": [], - "source": [ - "# Overview of the input collection\n", - "# The inputs property provides access to all scenario inputs through an InputCollection\n", - "\n", - "print(f\"Input Collection Overview:\")\n", - "print(f\" Total inputs: {len(scenario.inputs)}\")\n", - "print(f\" Input collection type: {type(scenario.inputs)}\")\n", - "print(f\" User-modified inputs: {len([inp for inp in scenario.inputs if inp.user is not None])}\")\n", - "print(f\" Disabled inputs: {len([inp for inp in scenario.inputs if inp.disabled])}\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6c4825ba", - "metadata": {}, - "outputs": [], - "source": [ - "# Analyze units used across all inputs\n", - "# This gives you an overview of what types of measurements are used in the scenario\n", - "\n", - "# Count inputs by unit type\n", - "unit_counts = {}\n", - "for input in scenario.inputs:\n", - " unit = input.unit or 'No unit'\n", - " unit_counts[unit] = unit_counts.get(unit, 0) + 1\n", - "\n", - "total_inputs = len(scenario.inputs)\n", - "print(f\"Found {len(unit_counts)} different units used across {total_inputs:,} inputs:\")\n", - "print(\"\\n\" + \"-\"*70)\n", - "\n", - "# Sort by count (most common first) and show percentages\n", - "sorted_units = sorted(unit_counts.items(), key=lambda x: x[1], reverse=True)\n", - "for unit, count in sorted_units:\n", - " percentage = (count / total_inputs) * 100\n", - " print(f\"{unit:15}: {count:4,} inputs ({percentage:5.1f}%)\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "38fd7d1c", - "metadata": {}, - "outputs": [], - "source": [ - "# Identify disabled inputs\n", - "# Disabled inputs are those that do not impact the scenario because of a coupling,\n", - "# or if you are not the owner/editor of the scenario\n", - "\n", - "disabled_inputs = [input.key for input in scenario.inputs if input.disabled]\n", - "print(f\"Found {len(disabled_inputs)} disabled inputs:\")\n", - "print(\"\\n\" + \"-\"*70)\n", - "print(disabled_inputs)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f44d29ef", - "metadata": {}, - "outputs": [], - "source": [ - "# Display default values for all inputs\n", - "# Default values represent the baseline scenario before user modifications\n", - "\n", - "default_values = { input.key: input.default for input in scenario.inputs }\n", - "print(f\"Default values for {len(default_values)} inputs:\")\n", - "print(\"\\n\" + \"-\"*70)\n", - "print(default_values)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d980ed9b", - "metadata": {}, - "outputs": [], - "source": [ - "# Explore Float input constraints\n", - "# Float inputs have minimum and maximum values that define valid ranges\n", - "# This information helps to understand input range-limitations and validation rules\n", - "\n", - "from pyetm.models.inputs import FloatInput\n", - "\n", - "float_inputs = [input for input in scenario.inputs if isinstance(input, FloatInput)]\n", - "print(f\"Found {len(float_inputs)} float inputs:\")\n", - "print(\"\\n\" + \"-\"*70)\n", - "\n", - "float_details = [input.model_dump() for input in float_inputs]\n", - "print(float_details)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "enumerable_inputs", - "metadata": {}, - "outputs": [], - "source": [ - "# Explore Enumerable input options\n", - "# Some inputs have a limited set of permitted values (like dropdown selections)\n", - "# This is useful for understanding available choices for categorical inputs\n", - "\n", - "from pyetm.models.inputs import EnumInput\n", - "\n", - "enum_inputs = [input for input in scenario.inputs if isinstance(input, EnumInput)]\n", - "print(f\"Found {len(enum_inputs)} enumerable inputs:\")\n", - "print(\"\\n\" + \"-\"*70)\n", - "\n", - "enum_details = [input.model_dump() for input in enum_inputs]\n", - "print(enum_details)" - ] - }, - { - "cell_type": "markdown", - "id": "curves_section", - "metadata": {}, - "source": [ - "### Working with Custom Curves\n", - "\n", - "Custom curves represent time-series data that can be attached to specific inputs. These are typically used for:\n", - "- Load profiles (electricity demand over time)\n", - "- Production profiles (renewable energy output patterns)\n", - "- Availability curves (when technologies are available)\n", - "- Price curves (energy prices over time)\n", - "\n", - "The curves contain hourly data points for an entire year (8760 hours)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "custom_curves_overview", - "metadata": {}, - "outputs": [], - "source": [ - "# Overview of custom curves collection\n", - "# Custom curves are hourly time-series data used to define dynamic behaviour across a year\n", - "\n", - "print(f\"Custom Curves Collection Overview:\")\n", - "print(f\" Collection type: {type(scenario.custom_curves)}\")\n", - "\n", - "# Show attached custom curves\n", - "attached_curves = list(scenario.custom_curves.attached_keys())\n", - "print(f\"\\nAttached custom curves ({len(attached_curves)}):\")\n", - "for i, curve_key in enumerate(attached_curves[:10]):\n", - " print(f\" {i+1}. {curve_key}\")\n", - "if len(attached_curves) > 10:\n", - " print(f\" ... and {len(attached_curves) - 10} more\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f18f67df", - "metadata": {}, - "outputs": [], - "source": [ - "# Example: Display data from a specific curve\n", - "# This shows how to access the actual time-series data from a custom curve\n", - "# The custom_curve_series() method returns the hourly values for the specified curve\n", - "# The curve is stored as a pandas Series\n", - "\n", - "curve_key = 'interconnector_1_import_availability'\n", - "if curve_key in scenario.custom_curves.attached_keys():\n", - " curve_data = scenario.custom_curve_series(curve_key)\n", - " print(f\"Curve data for '{curve_key}':\")\n", - " print(f\" Data points: {len(curve_data)}\")\n", - " print(f\" First 10 values: {curve_data.head(10).tolist()}\")\n", - " print(f\" Data type: {type(curve_data)}\")\n", - " print(f\" Min value: {curve_data.min()}\")\n", - " print(f\" Max value: {curve_data.max()}\")\n", - " print(f\" Mean value: {curve_data.mean():.4f}\")\n", - "else:\n", - " print(f\"Curve '{curve_key}' not found in this scenario.\")\n", - " print(\"Available curves:\", list(scenario.custom_curves.attached_keys()))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "all_custom_curves_analysis", - "metadata": {}, - "outputs": [], - "source": [ - "# Analyze all custom curves in the scenario\n", - "# This iterates through max 5 attached curves and provides summary statistics\n", - "\n", - "print(\"Analysis of all custom curves in the scenario:\")\n", - "print(\"\\n\" + \"-\"*70)\n", - "\n", - "curve_count = 0\n", - "for curve_series in scenario.custom_curves_series():\n", - " curve_count += 1\n", - " print(f\"\\nCurve {curve_count}:\")\n", - " print(f\" Length: {len(curve_series)}\")\n", - " print(f\" Min: {curve_series.min():.4f}\")\n", - " print(f\" Max: {curve_series.max():.4f}\")\n", - " print(f\" Mean: {curve_series.mean():.4f}\")\n", - " print(f\" Standard deviation: {curve_series.std():.4f}\")\n", - "\n", - " # Stop after first 5 to avoid overwhelming output\n", - " if curve_count >= 5:\n", - " total_curves = len(list(scenario.custom_curves.attached_keys()))\n", - " if total_curves > 5:\n", - " print(f\"\\n... {total_curves - 5} more curves\")\n", - " break\n", - "\n", - "if curve_count == 0:\n", - " print(\"No custom curves found in this scenario.\")" - ] - }, - { - "cell_type": "markdown", - "id": "output_curves_section", - "metadata": {}, - "source": [ - "### Working with Output Curves\n", - "\n", - "Output curves represent time-series data for energy carriers (electricity, heat, gas, etc.) within the energy system. \n", - "\n", - "Each output curve represents an export from your scenario, so they are actually sets of curves, stored as a dataframe where each column is a curve and the index is a time series for each hour." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "output_curves_overview", - "metadata": {}, - "outputs": [], - "source": [ - "# Overview of output curves collection\n", - "# Output curves represent energy flows and storage for different energy carriers\n", - "\n", - "print(f\"Output Curves Collection Overview:\")\n", - "print(f\" Collection type: {type(scenario.output_curves)}\")\n", - "\n", - "# Show first 10 available output curve types\n", - "attached_output_curves = list(scenario.output_curves.attached_keys())\n", - "print(f\"\\nAttached output curves ({len(attached_output_curves)}):\")\n", - "for i, curve_key in enumerate(attached_output_curves[:10]):\n", - " print(f\" {i+1}. {curve_key}\")\n", - "if len(attached_output_curves) > 10:\n", - " print(f\" ... {len(attached_output_curves) - 10} more\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "all_output_curves_analysis", - "metadata": {}, - "outputs": [], - "source": [ - "# Analyze all output curves in the scenario\n", - "# This provides a comprehensive overview of output curve behaviour and format\n", - "\n", - "print(\"Analysis of all output curves in the scenario:\")\n", - "print(\"\\n\" + \"-\"*70)\n", - "\n", - "curve_count = 0\n", - "attached_curve_keys = list(scenario.output_curves.attached_keys())\n", - "for curve_data in scenario.all_output_curves():\n", - " curve_name = attached_curve_keys[curve_count] if curve_count < len(attached_curve_keys) else f\"Unknown Curve {curve_count + 1}\"\n", - " curve_count += 1\n", - " print(f\"\\n{curve_name}:\")\n", - "\n", - " if curve_data is not None and not curve_data.empty:\n", - " print(f\" Shape (rows × columns): {curve_data.shape}\")\n", - " print(f\" Columns: {list(curve_data.columns)}\")\n", - "\n", - " # For DataFrames, show summary stats differently\n", - " numeric_cols = curve_data.select_dtypes(include=[float, int]).columns\n", - " if len(numeric_cols) > 0:\n", - " print(f\" Summary for numeric columns:\")\n", - " for col in numeric_cols[:3]: # Show first 3 columns to avoid clutter\n", - " col_data = curve_data[col]\n", - " print(f\" {col}:\")\n", - " print(f\" Min: {float(col_data.min()):.4f}\")\n", - " print(f\" Max: {float(col_data.max()):.4f}\")\n", - " print(f\" Mean: {float(col_data.mean()):.4f}\")\n", - " print(f\" Std: {float(col_data.std()):.4f}\")\n", - " if len(numeric_cols) > 3:\n", - " print(f\" ... and {len(numeric_cols) - 3} more columns\")\n", - " else:\n", - " print(f\" No numeric data available\")\n", - " else:\n", - " print(f\" No data available\")\n", - "\n", - " # Stop after first 5 to avoid overwhelming output\n", - " if curve_count >= 5:\n", - " total_curves = len(attached_curve_keys)\n", - " if total_curves > 5:\n", - " print(f\"\\n... and {total_curves - 5} more output curve exports\")\n", - " break\n", - "\n", - "if curve_count == 0:\n", - " print(\"No output curves found in this scenario.\")" - ] - }, - { - "cell_type": "markdown", - "id": "sortables_section", - "metadata": {}, - "source": [ - "### Exploring Sortables\n", - "\n", - "Sortables represent ordered lists of technologies or components within the energy system. They define priority orders for:\n", - "- Merit order\n", - "- Forecast order\n", - "- Heat network order\n", - "- Hydrogen supply/demand\n", - "\n", - "The order of items in sortables affects how the energy system model calculates results." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "sortables_overview", - "metadata": {}, - "outputs": [], - "source": [ - "# Overview of sortables collection\n", - "# Sortables define ordering and priority for various energy system components\n", - "\n", - "print(f\"Sortables Overview:\")\n", - "print(f\" Data type: {type(scenario.sortables)}\")\n", - "\n", - "# Show all sortables\n", - "sortable_keys = list(scenario.sortables.as_dict().keys())\n", - "print(f\"\\nSortables ({len(sortable_keys)}):\")\n", - "for i, sortable_key in enumerate(sortable_keys):\n", - " print(f\" {i+1}. {sortable_key}\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4c90688f", - "metadata": {}, - "outputs": [], - "source": [ - "# Display sortable configurations\n", - "# Sortables define the order/priority of different technologies in the energy system\n", - "# For example, merit order determines which power plants are dispatched first\n", - "# The order directly affects energy system calculations and results\n", - "\n", - "sortables_data = scenario.sortables.as_dict()\n", - "print(f\"Found {len(sortables_data)} sortable orders:\")\n", - "print(\"\\n\" + \"-\"*70)\n", - "print(sortables_data)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "sortables_detailed_analysis", - "metadata": {}, - "outputs": [], - "source": [ - "# Analysis of each sortable category\n", - "# This examines the structure and content of each sortable configuration\n", - "\n", - "sortables_data = scenario.sortables.as_dict()\n", - "print(\"Detailed analysis of sortables:\")\n", - "print(\"\\n\" + \"-\"*70)\n", - "\n", - "for category, sortables in sortables_data.items():\n", - " print(f\"\\n{category.upper()}:\")\n", - "\n", - " if sortables:\n", - " print(f\" Number of items: {len(sortables)}\")\n", - " print(f\" Sortables:\")\n", - " for i, order in enumerate(sortables):\n", - " print(f\" {i+1}. {order}\")" - ] - }, - { - "cell_type": "markdown", - "id": "f1f53bd1", - "metadata": {}, - "source": [ - "### Working with Gqueries\n", - "\n", - "Gqueries allow you to extract specific calculated values from the ETM.\n", - "\n", - "You can request multiple queries and execute them together for efficiency." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6942e344", - "metadata": {}, - "outputs": [], - "source": [ - "scenario.add_queries([\n", - " \"dashboard_emissions\",\n", - " \"dashboard_total_costs\",\n", - " \"dashboard_renewability\"\n", - "])\n", - "\n", - "print(f\"Added {len(scenario._queries.query_keys())} queries:\")\n", - "for i, query in enumerate(scenario._queries.query_keys(), 1):\n", - " print(f\" {i}. {query}\")\n", - "\n", - "print(f\"\\nQueries ready: {scenario._queries.is_ready()}\")\n", - "\n", - "print(\"Gqueries Overview:\")\n", - "print(f\" Queries requested: {scenario.queries_requested()}\")\n", - "\n", - "if scenario.queries_requested():\n", - " print(f\" Query keys: {scenario._queries.query_keys()}\")\n", - " print(f\" Queries ready: {scenario._queries.is_ready()}\")\n", - "\n", - " # Get results if available\n", - " results = scenario.results()\n", - " if results is not None and not results.empty:\n", - " print(f\"\\nQuery Results:\")\n", - " print(f\" Results shape: {results.shape}\")\n", - " print(f\" Columns: {list(results.columns)}\")\n", - " print(f\" \")\n", - " print(results.head())\n", - " else:\n", - " print(\"\\nNo query results available\")" - ] - }, - { - "cell_type": "markdown", - "id": "warnings_errors_section", - "metadata": {}, - "source": [ - "### Handling Warnings and Errors\n", - "\n", - "The scenario object can accumulate warnings during data fetching and processing. These warnings provide important information about non-breaking issues with data quality, your API configuration, or service-level issues." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "warnings_analysis", - "metadata": {}, - "outputs": [], - "source": [ - "# Check for warnings and errors in the scenario\n", - "# Warnings can accumulate from API calls, data validation, or processing issues\n", - "\n", - "# Check if the scenario object has any warnings\n", - "if hasattr(scenario, 'warnings') and scenario.warnings:\n", - " print(f\" Total warnings: {len(scenario.warnings)}\")\n", - " print(\"\\nWarnings:\")\n", - " for i, warning in enumerate(scenario.warnings, 1):\n", - " print(f\" {i}. {warning}\")\n", - "else:\n", - " print(f\" No warnings found\")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "pyetm-qKH2ozgc", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/examples/create_and_update_a_scenario.ipynb b/examples/create_and_update_a_scenario.ipynb deleted file mode 100644 index 0fa51bd..0000000 --- a/examples/create_and_update_a_scenario.ipynb +++ /dev/null @@ -1,181 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "d9bff682", - "metadata": {}, - "source": [ - "Creating / Updating a scenario flow:\n", - "\n", - "#TODO: Expand descriptions etc, this is just to show the funnctionality" - ] - }, - { - "cell_type": "markdown", - "id": "21347fc1", - "metadata": {}, - "source": [ - "# SETUP" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3ada4b30", - "metadata": {}, - "outputs": [], - "source": [ - "from example_helpers import setup_notebook\n", - "from pyetm.models import Scenario\n", - "\n", - "setup_notebook()" - ] - }, - { - "cell_type": "markdown", - "id": "84571cab", - "metadata": {}, - "source": [ - "Create a new scenario:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4770e6a9", - "metadata": {}, - "outputs": [], - "source": [ - "# scenario = Scenario.new(\"nl\", 2050, True)\n", - "\n", - "scenario = Scenario.new(\n", - " area_code=\"nl2019\",\n", - " end_year=2050,\n", - " private=False,\n", - " keep_compatible=False,\n", - " source=\"pyetm\")" - ] - }, - { - "cell_type": "markdown", - "id": "07461117", - "metadata": {}, - "source": [ - "Update inputs for a scenario:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5a1549ac", - "metadata": {}, - "outputs": [], - "source": [ - "scenario.update_user_values({\n", - " \"co_firing_biocoal_share\": 80.0,\n", - " \"external_coupling_industry_chemical_other_burner_crude_oil_share\": \"hello\"\n", - "})\n" - ] - }, - { - "cell_type": "markdown", - "id": "af9d11bd", - "metadata": {}, - "source": [ - "View the changes (so you know it happened):" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7fc4dc21", - "metadata": {}, - "outputs": [], - "source": [ - "print(f\"Area: {scenario.area_code}\")\n", - "print(f\"End year: {scenario.end_year}\")\n", - "print(f\"Start year: {scenario.start_year}\")\n", - "print(f\"Version: {scenario.version}\")\n", - "user_vals = scenario.user_values()\n", - "print(f\"Modified inputs: {len(user_vals)}\")\n", - "print(f\"First input: {list(user_vals.keys())[0]} = {list(user_vals.values())[0]}\")\n", - "print(f\"Second input: {list(user_vals.keys())[1]} = {list(user_vals.values())[1]}\")" - ] - }, - { - "cell_type": "markdown", - "id": "4dba3824", - "metadata": {}, - "source": [ - "Update the metadata for the scenario:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c6a65f6a", - "metadata": {}, - "outputs": [], - "source": [ - "scenario.update_metadata(\n", - " private= True,\n", - " keep_compatible= True,\n", - " source= \"test_change_source\",\n", - " end_year= 2040\n", - ")\n", - "\n", - "# You can also update the metadata attribute\n", - "scenario.update_metadata(\n", - " metadata= {\n", - " \"title\": \"Test scenario!\",\n", - " \"description\": \"Updated scenario description\",\n", - " \"author\": \"Ernie\"\n", - " }\n", - "})\n", - "\n", - "print(scenario.private)" - ] - }, - { - "cell_type": "markdown", - "id": "3cd56ce2", - "metadata": {}, - "source": [ - "You can also remove inputs, which means the default value is then used." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "98ab2f5c", - "metadata": {}, - "outputs": [], - "source": [ - "scenario.remove_user_values([\"co_firing_biocoal_share\"])\n", - "user_vals = scenario.user_values()\n", - "print(f\"Modified inputs: {len(user_vals)}\")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "pyetm-qKH2ozgc", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/examples/full_multi_scenario_flow.ipynb b/examples/create_or_query_scenarios.ipynb similarity index 83% rename from examples/full_multi_scenario_flow.ipynb rename to examples/create_or_query_scenarios.ipynb index 4dd758a..a661cee 100644 --- a/examples/full_multi_scenario_flow.ipynb +++ b/examples/create_or_query_scenarios.ipynb @@ -31,9 +31,7 @@ "\n", "In the example, there are two scenarios, with short names scen_a and scen_b. You can use short names in the parameters sheet to specify which inputs belong to which scenario. Because scen_a has no scenario_id, it is being created. It will be created with all the metadata included in the sheet, plus any of the inputs under the column with its short_name and any sortables and curves specified in the sheets named beside the sortables and custom_curves rows. The same goes for scen_b, but because it has a scenario_id (2690555) that scenario will be loaded, and then updated with anything as set in the excel.\n", "\n", - "**TODO**: Figure out how to manage the fact that for this example whatever scenario 2690555 is will be constantly updated etc by everyone who wants to try running the script on pro/beta. At the moment its just a local scenario.\n", - "\n", - "Everything in the ETM is structured via scenarios, and so is pyetm." + "**TODO**: Figure out how to manage the fact that for this example whatever scenario 2690555 is will be constantly updated etc by everyone who wants to try running this script on pro/beta. At the moment its just a local scenario." ] }, { @@ -45,7 +43,8 @@ "source": [ "from pyetm.models.scenarios import Scenarios\n", "\n", - "scenarios = Scenarios.from_excel(\"my_input_excel.xlsx\")" + "scenarios = Scenarios.from_excel(\"example_input_excel.xlsx\")\n", + "#scenario_a = Scenario.load(123456789) #TODO: Also load a scenario" ] }, { @@ -136,7 +135,7 @@ "id": "86643b22", "metadata": {}, "source": [ - "We can directly modify any of the attributes using Pandas, or we can re-export the scenarios to excel and make modifications that way." + "We can directly modify any of the attributes using Pandas, or we can re-export the scenarios to excel and make modifications that way. When exporting to excel, more data will be available than was in the input, because the ETM results will be included by default. The 'output curves' will be stored in a separate excel workbook, separated by carrier type. By default everything is included, but you can also specify what you want." ] }, { @@ -146,7 +145,11 @@ "metadata": {}, "outputs": [], "source": [ - "scenarios.to_excel(\"my_excel.xlsx\")" + "# Export the scenarios to excel\n", + "scenarios.to_excel(\"export.xlsx\") # This will create export.xlsx and export_output_curves.xlsx.\n", + "\n", + "# There are also options - decide whether to include the output_curves, specify where you want them and specify which carriers you're interested in.\n", + "scenarios.to_excel((\"export_with_options.xlsx\"), export_output_curves=True, output_curves_path=\"output_curves.xlsx\", carriers=[\"electricity\", \"heat\", \"hydrogen\"])" ] } ], diff --git a/examples/example.config.yml b/examples/example.config.yml index 75d6259..23a9221 100644 --- a/examples/example.config.yml +++ b/examples/example.config.yml @@ -10,13 +10,19 @@ # etm_api_token: your.token.here +# Select the environment; base_url will be inferred automatically if set. +# Supported: pro (default), beta, local, or a stable tag like 2025-01 +environment: pro + + # Override the API base URL - here you can set which environment of the ETM you want to interact with. # Options include the default (pro), https://2025-01.engine.energytransitionmodel.com/api/v3 (a stable version) or # https://beta.engine.energytransitionmodel.com/api/v3 (the staging environment), or http://localhost:3000/api/v3 # (your local environment). # For more information, see: https://docs.energytransitionmodel.com/api/intro#environments # -BASE_URL: https://engine.energytransitionmodel.com/api/v3 +# Optional override: specify base_url directly instead of using 'environment'. E.g. +# base_url: https://engine.energytransitionmodel.com/api/v3 #TODO: Setup so the below is actually used # URLs of your proxy server addresses (replace the examples below by your own settings) diff --git a/examples/example_input_excel.xlsx b/examples/example_input_excel.xlsx new file mode 100644 index 0000000..7248474 Binary files /dev/null and b/examples/example_input_excel.xlsx differ diff --git a/examples/excel_to_scenarios.ipynb b/examples/excel_to_scenarios.ipynb deleted file mode 100644 index 20e681b..0000000 --- a/examples/excel_to_scenarios.ipynb +++ /dev/null @@ -1,1474 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "70d54062", - "metadata": {}, - "source": [ - "This notebook is for demonstrating and testing the excel to scenarios flow.\n", - "\n", - "Currently can only handle metadata and inputs." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "4866f9d1", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Environment setup complete\n", - " Using ETM API at http://localhost:3000/api/v3\n", - " Token loaded? True\n", - "API connection ready\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/louisparkes-talbot/Desktop/local_model/pyetm/src/pyetm/models/scenario.py:206: FutureWarning: Downcasting object dtype arrays on .fillna, .ffill, .bfill is deprecated and will change in a future version. Call result.infer_objects(copy=False) instead. To opt-in to the future behavior, set `pd.set_option('future.no_silent_downcasting', True)`\n", - " self.update_user_values(series.fillna(\"reset\").to_dict())\n" - ] - }, - { - "data": { - "text/plain": [ - "{'total_scenarios': 2,\n", - " 'inputs': {'scenario_count': 2},\n", - " 'sortables': {'scenario_count': 2},\n", - " 'custom_curves': {'scenario_count': 2},\n", - " 'output_curves': {'scenario_count': 2},\n", - " 'scenario_ids': [2690555, 2690637]}" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from example_helpers import setup_notebook\n", - "from pyetm.models.scenario_packer import ScenarioPacker\n", - "\n", - "setup_notebook()\n", - "packer = ScenarioPacker.from_excel(\"my_input_excel.xlsx\")\n", - "packer.get_summary()" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "8205cd53", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
scen_ascen_b
useruser
inputunit
climate_relevant_co2_biomass_gas_future%30.035.0
climate_relevant_co2_biomass_gas_present%20.0None
climate_relevant_co2_biomass_liquid_future%30.0None
climate_relevant_co2_biomass_liquid_present%20.0None
climate_relevant_co2_biomass_solid_future%30.0None
............
capacity_of_energy_battery_wind_turbine_inlandMWNaN0.0
capacity_of_energy_power_hybrid_wind_turbine_offshoreMWNaNNone
capacity_of_energy_power_wind_turbine_coastalMWNaN0.0
capacity_of_energy_power_wind_turbine_inlandMWNaN20000.0
capacity_of_energy_power_wind_turbine_offshoreMWNaN52000.0
\n", - "

1318 rows × 2 columns

\n", - "
" - ], - "text/plain": [ - " scen_a scen_b\n", - " user user\n", - "input unit \n", - "climate_relevant_co2_biomass_gas_future % 30.0 35.0\n", - "climate_relevant_co2_biomass_gas_present % 20.0 None\n", - "climate_relevant_co2_biomass_liquid_future % 30.0 None\n", - "climate_relevant_co2_biomass_liquid_present % 20.0 None\n", - "climate_relevant_co2_biomass_solid_future % 30.0 None\n", - "... ... ...\n", - "capacity_of_energy_battery_wind_turbine_inland MW NaN 0.0\n", - "capacity_of_energy_power_hybrid_wind_turbine_of... MW NaN None\n", - "capacity_of_energy_power_wind_turbine_coastal MW NaN 0.0\n", - "capacity_of_energy_power_wind_turbine_inland MW NaN 20000.0\n", - "capacity_of_energy_power_wind_turbine_offshore MW NaN 52000.0\n", - "\n", - "[1318 rows x 2 columns]" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "packer.inputs()" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "cd08ff26", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
A: Create from excelB: Load a scenario by id
forecast_storagehydrogen_supplyhydrogen_demandspace_heatingheat_network_ltheat_network_mtheat_network_htforecast_storagehydrogen_supplyhydrogen_demandspace_heatingheat_network_ltheat_network_mtheat_network_ht
sortables
0households_flexibility_p2p_electricityenergy_hydrogen_storage_depleted_gas_fieldenergy_hydrogen_storage_depleted_gas_fieldhouseholds_space_heater_district_heating_lt_st...energy_heat_network_storage_lt_steam_hot_waterenergy_heat_network_storage_mt_steam_hot_waterenergy_heat_network_storage_ht_steam_hot_waterenergy_flexibility_pumped_storage_electricityenergy_hydrogen_storage_depleted_gas_fieldenergy_hydrogen_storage_depleted_gas_fieldhouseholds_space_heater_district_heating_lt_st...energy_heat_network_storage_lt_steam_hot_waterenergy_heat_network_storage_mt_steam_hot_waterenergy_heat_network_storage_ht_steam_hot_water
1energy_flexibility_mv_batteries_electricityenergy_hydrogen_storage_salt_cavernenergy_hydrogen_storage_salt_cavernhouseholds_space_heater_heatpump_surface_water...energy_heat_boiler_lt_electricityenergy_heat_boiler_mt_electricityenergy_heat_boiler_ht_electricitytransport_van_flexibility_p2p_electricityenergy_hydrogen_storage_salt_cavernenergy_hydrogen_storage_salt_cavernhouseholds_space_heater_heatpump_surface_water...energy_heat_boiler_lt_electricityenergy_heat_boiler_mt_electricityenergy_heat_boiler_ht_electricity
2transport_car_flexibility_p2p_electricityenergy_hydrogen_autothermal_reformer_dispatchableNonehouseholds_space_heater_heatpump_air_water_ele...energy_heat_burner_lt_hydrogenenergy_heat_burner_mt_coalenergy_heat_burner_ht_coaltransport_truck_flexibility_p2p_electricityenergy_hydrogen_autothermal_reformer_dispatchableNonehouseholds_space_heater_heatpump_air_water_ele...energy_heat_burner_lt_hydrogenenergy_heat_burner_mt_coalenergy_heat_burner_ht_coal
3energy_flexibility_flow_batteries_electricityenergy_hydrogen_steam_methane_reformer_dispatc...Nonehouseholds_space_heater_heatpump_ground_water_...energy_heat_heatpump_water_water_lt_electricityenergy_heat_burner_mt_crude_oilenergy_heat_burner_ht_crude_oiltransport_bus_flexibility_p2p_electricityenergy_hydrogen_steam_methane_reformer_dispatc...Nonehouseholds_space_heater_heatpump_ground_water_...energy_heat_heatpump_water_water_lt_electricityenergy_heat_burner_mt_crude_oilenergy_heat_burner_ht_crude_oil
4energy_flexibility_hv_opac_electricityenergy_hydrogen_ammonia_reformer_dispatchableNonehouseholds_space_heater_heatpump_pvt_electricityenergy_heat_heatpump_surface_water_water_ts_lt...energy_heat_burner_mt_hydrogenenergy_heat_burner_ht_hydrogenenergy_flexibility_hv_opac_electricityenergy_hydrogen_ammonia_reformer_dispatchableNonehouseholds_space_heater_heatpump_pvt_electricityenergy_heat_heatpump_surface_water_water_ts_lt...energy_heat_burner_mt_hydrogenenergy_heat_burner_ht_hydrogen
5transport_bus_flexibility_p2p_electricityNoneNonehouseholds_space_heater_district_heating_mt_st...energy_heat_heatpump_waste_water_water_ts_lt_e...energy_heat_burner_mt_network_gasenergy_heat_burner_ht_network_gasenergy_flexibility_flow_batteries_electricityNoneNonehouseholds_space_heater_district_heating_mt_st...energy_heat_heatpump_waste_water_water_ts_lt_e...energy_heat_burner_mt_network_gasenergy_heat_burner_ht_network_gas
6transport_truck_flexibility_p2p_electricityNoneNonehouseholds_space_heater_hybrid_heatpump_air_wa...energy_heat_heatpump_drink_water_water_ts_lt_e...energy_heat_burner_mt_waste_mixenergy_heat_burner_ht_waste_mixtransport_car_flexibility_p2p_electricityNoneNonehouseholds_space_heater_hybrid_heatpump_air_wa...energy_heat_heatpump_drink_water_water_ts_lt_e...energy_heat_burner_mt_waste_mixenergy_heat_burner_ht_waste_mix
7transport_van_flexibility_p2p_electricityNoneNonehouseholds_space_heater_hybrid_hydrogen_heatpu...Noneenergy_heat_burner_mt_wood_pelletsenergy_heat_burner_ht_wood_pelletsenergy_flexibility_mv_batteries_electricityNoneNonehouseholds_space_heater_hybrid_hydrogen_heatpu...Noneenergy_heat_burner_mt_wood_pelletsenergy_heat_burner_ht_wood_pellets
8energy_flexibility_pumped_storage_electricityNoneNonehouseholds_space_heater_hybrid_crude_oil_heatp...Noneenergy_heat_heatpump_water_water_mt_electricityenergy_heat_heatpump_water_water_ht_electricityhouseholds_flexibility_p2p_electricityNoneNonehouseholds_space_heater_hybrid_crude_oil_heatp...Noneenergy_heat_heatpump_water_water_mt_electricityenergy_heat_heatpump_water_water_ht_electricity
9NoneNoneNonehouseholds_space_heater_district_heating_ht_st...Noneenergy_heat_heatpump_surface_water_water_ts_mt...NoneNoneNoneNonehouseholds_space_heater_district_heating_ht_st...Noneenergy_heat_heatpump_surface_water_water_ts_mt...None
10NoneNoneNonehouseholds_space_heater_electricityNoneenergy_heat_heatpump_waste_water_water_ts_mt_e...NoneNoneNoneNonehouseholds_space_heater_electricityNoneenergy_heat_heatpump_waste_water_water_ts_mt_e...None
11NoneNoneNonehouseholds_space_heater_combined_network_gasNoneenergy_heat_heatpump_drink_water_water_ts_mt_e...NoneNoneNoneNonehouseholds_space_heater_combined_network_gasNoneenergy_heat_heatpump_drink_water_water_ts_mt_e...None
12NoneNoneNonehouseholds_space_heater_combined_hydrogenNoneNoneNoneNoneNoneNonehouseholds_space_heater_combined_hydrogenNoneNoneNone
13NoneNoneNonehouseholds_space_heater_wood_pelletsNoneNoneNoneNoneNoneNonehouseholds_space_heater_wood_pelletsNoneNoneNone
14NoneNoneNonehouseholds_space_heater_network_gasNoneNoneNoneNoneNoneNonehouseholds_space_heater_network_gasNoneNoneNone
15NoneNoneNonehouseholds_space_heater_coalNoneNoneNoneNoneNoneNonehouseholds_space_heater_coalNoneNoneNone
16NoneNoneNonehouseholds_space_heater_crude_oilNoneNoneNoneNoneNoneNonehouseholds_space_heater_crude_oilNoneNoneNone
\n", - "
" - ], - "text/plain": [ - " A: Create from excel \\\n", - " forecast_storage \n", - "sortables \n", - "0 households_flexibility_p2p_electricity \n", - "1 energy_flexibility_mv_batteries_electricity \n", - "2 transport_car_flexibility_p2p_electricity \n", - "3 energy_flexibility_flow_batteries_electricity \n", - "4 energy_flexibility_hv_opac_electricity \n", - "5 transport_bus_flexibility_p2p_electricity \n", - "6 transport_truck_flexibility_p2p_electricity \n", - "7 transport_van_flexibility_p2p_electricity \n", - "8 energy_flexibility_pumped_storage_electricity \n", - "9 None \n", - "10 None \n", - "11 None \n", - "12 None \n", - "13 None \n", - "14 None \n", - "15 None \n", - "16 None \n", - "\n", - " \\\n", - " hydrogen_supply \n", - "sortables \n", - "0 energy_hydrogen_storage_depleted_gas_field \n", - "1 energy_hydrogen_storage_salt_cavern \n", - "2 energy_hydrogen_autothermal_reformer_dispatchable \n", - "3 energy_hydrogen_steam_methane_reformer_dispatc... \n", - "4 energy_hydrogen_ammonia_reformer_dispatchable \n", - "5 None \n", - "6 None \n", - "7 None \n", - "8 None \n", - "9 None \n", - "10 None \n", - "11 None \n", - "12 None \n", - "13 None \n", - "14 None \n", - "15 None \n", - "16 None \n", - "\n", - " \\\n", - " hydrogen_demand \n", - "sortables \n", - "0 energy_hydrogen_storage_depleted_gas_field \n", - "1 energy_hydrogen_storage_salt_cavern \n", - "2 None \n", - "3 None \n", - "4 None \n", - "5 None \n", - "6 None \n", - "7 None \n", - "8 None \n", - "9 None \n", - "10 None \n", - "11 None \n", - "12 None \n", - "13 None \n", - "14 None \n", - "15 None \n", - "16 None \n", - "\n", - " \\\n", - " space_heating \n", - "sortables \n", - "0 households_space_heater_district_heating_lt_st... \n", - "1 households_space_heater_heatpump_surface_water... \n", - "2 households_space_heater_heatpump_air_water_ele... \n", - "3 households_space_heater_heatpump_ground_water_... \n", - "4 households_space_heater_heatpump_pvt_electricity \n", - "5 households_space_heater_district_heating_mt_st... \n", - "6 households_space_heater_hybrid_heatpump_air_wa... \n", - "7 households_space_heater_hybrid_hydrogen_heatpu... \n", - "8 households_space_heater_hybrid_crude_oil_heatp... \n", - "9 households_space_heater_district_heating_ht_st... \n", - "10 households_space_heater_electricity \n", - "11 households_space_heater_combined_network_gas \n", - "12 households_space_heater_combined_hydrogen \n", - "13 households_space_heater_wood_pellets \n", - "14 households_space_heater_network_gas \n", - "15 households_space_heater_coal \n", - "16 households_space_heater_crude_oil \n", - "\n", - " \\\n", - " heat_network_lt \n", - "sortables \n", - "0 energy_heat_network_storage_lt_steam_hot_water \n", - "1 energy_heat_boiler_lt_electricity \n", - "2 energy_heat_burner_lt_hydrogen \n", - "3 energy_heat_heatpump_water_water_lt_electricity \n", - "4 energy_heat_heatpump_surface_water_water_ts_lt... \n", - "5 energy_heat_heatpump_waste_water_water_ts_lt_e... \n", - "6 energy_heat_heatpump_drink_water_water_ts_lt_e... \n", - "7 None \n", - "8 None \n", - "9 None \n", - "10 None \n", - "11 None \n", - "12 None \n", - "13 None \n", - "14 None \n", - "15 None \n", - "16 None \n", - "\n", - " \\\n", - " heat_network_mt \n", - "sortables \n", - "0 energy_heat_network_storage_mt_steam_hot_water \n", - "1 energy_heat_boiler_mt_electricity \n", - "2 energy_heat_burner_mt_coal \n", - "3 energy_heat_burner_mt_crude_oil \n", - "4 energy_heat_burner_mt_hydrogen \n", - "5 energy_heat_burner_mt_network_gas \n", - "6 energy_heat_burner_mt_waste_mix \n", - "7 energy_heat_burner_mt_wood_pellets \n", - "8 energy_heat_heatpump_water_water_mt_electricity \n", - "9 energy_heat_heatpump_surface_water_water_ts_mt... \n", - "10 energy_heat_heatpump_waste_water_water_ts_mt_e... \n", - "11 energy_heat_heatpump_drink_water_water_ts_mt_e... \n", - "12 None \n", - "13 None \n", - "14 None \n", - "15 None \n", - "16 None \n", - "\n", - " \\\n", - " heat_network_ht \n", - "sortables \n", - "0 energy_heat_network_storage_ht_steam_hot_water \n", - "1 energy_heat_boiler_ht_electricity \n", - "2 energy_heat_burner_ht_coal \n", - "3 energy_heat_burner_ht_crude_oil \n", - "4 energy_heat_burner_ht_hydrogen \n", - "5 energy_heat_burner_ht_network_gas \n", - "6 energy_heat_burner_ht_waste_mix \n", - "7 energy_heat_burner_ht_wood_pellets \n", - "8 energy_heat_heatpump_water_water_ht_electricity \n", - "9 None \n", - "10 None \n", - "11 None \n", - "12 None \n", - "13 None \n", - "14 None \n", - "15 None \n", - "16 None \n", - "\n", - " B: Load a scenario by id \\\n", - " forecast_storage \n", - "sortables \n", - "0 energy_flexibility_pumped_storage_electricity \n", - "1 transport_van_flexibility_p2p_electricity \n", - "2 transport_truck_flexibility_p2p_electricity \n", - "3 transport_bus_flexibility_p2p_electricity \n", - "4 energy_flexibility_hv_opac_electricity \n", - "5 energy_flexibility_flow_batteries_electricity \n", - "6 transport_car_flexibility_p2p_electricity \n", - "7 energy_flexibility_mv_batteries_electricity \n", - "8 households_flexibility_p2p_electricity \n", - "9 None \n", - "10 None \n", - "11 None \n", - "12 None \n", - "13 None \n", - "14 None \n", - "15 None \n", - "16 None \n", - "\n", - " \\\n", - " hydrogen_supply \n", - "sortables \n", - "0 energy_hydrogen_storage_depleted_gas_field \n", - "1 energy_hydrogen_storage_salt_cavern \n", - "2 energy_hydrogen_autothermal_reformer_dispatchable \n", - "3 energy_hydrogen_steam_methane_reformer_dispatc... \n", - "4 energy_hydrogen_ammonia_reformer_dispatchable \n", - "5 None \n", - "6 None \n", - "7 None \n", - "8 None \n", - "9 None \n", - "10 None \n", - "11 None \n", - "12 None \n", - "13 None \n", - "14 None \n", - "15 None \n", - "16 None \n", - "\n", - " \\\n", - " hydrogen_demand \n", - "sortables \n", - "0 energy_hydrogen_storage_depleted_gas_field \n", - "1 energy_hydrogen_storage_salt_cavern \n", - "2 None \n", - "3 None \n", - "4 None \n", - "5 None \n", - "6 None \n", - "7 None \n", - "8 None \n", - "9 None \n", - "10 None \n", - "11 None \n", - "12 None \n", - "13 None \n", - "14 None \n", - "15 None \n", - "16 None \n", - "\n", - " \\\n", - " space_heating \n", - "sortables \n", - "0 households_space_heater_district_heating_lt_st... \n", - "1 households_space_heater_heatpump_surface_water... \n", - "2 households_space_heater_heatpump_air_water_ele... \n", - "3 households_space_heater_heatpump_ground_water_... \n", - "4 households_space_heater_heatpump_pvt_electricity \n", - "5 households_space_heater_district_heating_mt_st... \n", - "6 households_space_heater_hybrid_heatpump_air_wa... \n", - "7 households_space_heater_hybrid_hydrogen_heatpu... \n", - "8 households_space_heater_hybrid_crude_oil_heatp... \n", - "9 households_space_heater_district_heating_ht_st... \n", - "10 households_space_heater_electricity \n", - "11 households_space_heater_combined_network_gas \n", - "12 households_space_heater_combined_hydrogen \n", - "13 households_space_heater_wood_pellets \n", - "14 households_space_heater_network_gas \n", - "15 households_space_heater_coal \n", - "16 households_space_heater_crude_oil \n", - "\n", - " \\\n", - " heat_network_lt \n", - "sortables \n", - "0 energy_heat_network_storage_lt_steam_hot_water \n", - "1 energy_heat_boiler_lt_electricity \n", - "2 energy_heat_burner_lt_hydrogen \n", - "3 energy_heat_heatpump_water_water_lt_electricity \n", - "4 energy_heat_heatpump_surface_water_water_ts_lt... \n", - "5 energy_heat_heatpump_waste_water_water_ts_lt_e... \n", - "6 energy_heat_heatpump_drink_water_water_ts_lt_e... \n", - "7 None \n", - "8 None \n", - "9 None \n", - "10 None \n", - "11 None \n", - "12 None \n", - "13 None \n", - "14 None \n", - "15 None \n", - "16 None \n", - "\n", - " \\\n", - " heat_network_mt \n", - "sortables \n", - "0 energy_heat_network_storage_mt_steam_hot_water \n", - "1 energy_heat_boiler_mt_electricity \n", - "2 energy_heat_burner_mt_coal \n", - "3 energy_heat_burner_mt_crude_oil \n", - "4 energy_heat_burner_mt_hydrogen \n", - "5 energy_heat_burner_mt_network_gas \n", - "6 energy_heat_burner_mt_waste_mix \n", - "7 energy_heat_burner_mt_wood_pellets \n", - "8 energy_heat_heatpump_water_water_mt_electricity \n", - "9 energy_heat_heatpump_surface_water_water_ts_mt... \n", - "10 energy_heat_heatpump_waste_water_water_ts_mt_e... \n", - "11 energy_heat_heatpump_drink_water_water_ts_mt_e... \n", - "12 None \n", - "13 None \n", - "14 None \n", - "15 None \n", - "16 None \n", - "\n", - " \n", - " heat_network_ht \n", - "sortables \n", - "0 energy_heat_network_storage_ht_steam_hot_water \n", - "1 energy_heat_boiler_ht_electricity \n", - "2 energy_heat_burner_ht_coal \n", - "3 energy_heat_burner_ht_crude_oil \n", - "4 energy_heat_burner_ht_hydrogen \n", - "5 energy_heat_burner_ht_network_gas \n", - "6 energy_heat_burner_ht_waste_mix \n", - "7 energy_heat_burner_ht_wood_pellets \n", - "8 energy_heat_heatpump_water_water_ht_electricity \n", - "9 None \n", - "10 None \n", - "11 None \n", - "12 None \n", - "13 None \n", - "14 None \n", - "15 None \n", - "16 None " - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "packer.sortables()" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "0d3e771e", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
A: Create from excelB: Load a scenario by id
interconnector_1_priceinterconnector_1_import_availabilityinterconnector_1_export_availabilityinterconnector_2_priceinterconnector_2_import_availabilityinterconnector_2_export_availabilityinterconnector_3_priceinterconnector_1_priceinterconnector_1_import_availabilityinterconnector_1_export_availability...households_hot_waterindustry_ictindustry_other_electricityweather/solar_pv_profile_1weather/solar_thermalweather/air_temperatureweather/agriculture_heatingweather/wind_offshore_baselineweather/wind_coastal_baselineweather/wind_inland_baseline
00.011.00.026.001.01.00.019.09.09.0...9.09.09.09.09.09.09.09.09.09.0
10.011.00.026.001.01.00.009.09.09.0...9.09.09.09.09.09.09.09.09.09.0
20.011.00.014.481.01.00.009.09.09.0...9.09.09.09.09.09.09.09.09.09.0
30.011.00.00.011.00.00.009.09.09.0...9.09.09.09.09.09.09.09.09.09.0
40.011.00.00.021.00.00.009.09.09.0...9.09.09.09.09.09.09.09.09.09.0
..................................................................
87550.011.00.00.011.00.00.009.09.09.0...9.09.09.09.09.09.09.09.09.09.0
87560.011.00.00.011.00.00.009.09.09.0...9.09.09.09.09.09.09.09.09.09.0
87570.011.00.00.011.00.00.009.09.09.0...9.09.09.09.09.09.09.09.09.09.0
87580.011.00.00.021.00.00.009.09.09.0...9.09.09.09.09.09.09.09.09.09.0
87590.011.00.00.001.00.00.009.09.09.0...9.09.09.09.09.09.09.09.09.09.0
\n", - "

8760 rows × 52 columns

\n", - "
" - ], - "text/plain": [ - " A: Create from excel \\\n", - " interconnector_1_price interconnector_1_import_availability \n", - "0 0.01 1.0 \n", - "1 0.01 1.0 \n", - "2 0.01 1.0 \n", - "3 0.01 1.0 \n", - "4 0.01 1.0 \n", - "... ... ... \n", - "8755 0.01 1.0 \n", - "8756 0.01 1.0 \n", - "8757 0.01 1.0 \n", - "8758 0.01 1.0 \n", - "8759 0.01 1.0 \n", - "\n", - " \\\n", - " interconnector_1_export_availability interconnector_2_price \n", - "0 0.0 26.00 \n", - "1 0.0 26.00 \n", - "2 0.0 14.48 \n", - "3 0.0 0.01 \n", - "4 0.0 0.02 \n", - "... ... ... \n", - "8755 0.0 0.01 \n", - "8756 0.0 0.01 \n", - "8757 0.0 0.01 \n", - "8758 0.0 0.02 \n", - "8759 0.0 0.00 \n", - "\n", - " \\\n", - " interconnector_2_import_availability \n", - "0 1.0 \n", - "1 1.0 \n", - "2 1.0 \n", - "3 1.0 \n", - "4 1.0 \n", - "... ... \n", - "8755 1.0 \n", - "8756 1.0 \n", - "8757 1.0 \n", - "8758 1.0 \n", - "8759 1.0 \n", - "\n", - " \\\n", - " interconnector_2_export_availability interconnector_3_price \n", - "0 1.0 0.01 \n", - "1 1.0 0.00 \n", - "2 1.0 0.00 \n", - "3 0.0 0.00 \n", - "4 0.0 0.00 \n", - "... ... ... \n", - "8755 0.0 0.00 \n", - "8756 0.0 0.00 \n", - "8757 0.0 0.00 \n", - "8758 0.0 0.00 \n", - "8759 0.0 0.00 \n", - "\n", - " B: Load a scenario by id \\\n", - " interconnector_1_price interconnector_1_import_availability \n", - "0 9.0 9.0 \n", - "1 9.0 9.0 \n", - "2 9.0 9.0 \n", - "3 9.0 9.0 \n", - "4 9.0 9.0 \n", - "... ... ... \n", - "8755 9.0 9.0 \n", - "8756 9.0 9.0 \n", - "8757 9.0 9.0 \n", - "8758 9.0 9.0 \n", - "8759 9.0 9.0 \n", - "\n", - " ... \\\n", - " interconnector_1_export_availability ... households_hot_water \n", - "0 9.0 ... 9.0 \n", - "1 9.0 ... 9.0 \n", - "2 9.0 ... 9.0 \n", - "3 9.0 ... 9.0 \n", - "4 9.0 ... 9.0 \n", - "... ... ... ... \n", - "8755 9.0 ... 9.0 \n", - "8756 9.0 ... 9.0 \n", - "8757 9.0 ... 9.0 \n", - "8758 9.0 ... 9.0 \n", - "8759 9.0 ... 9.0 \n", - "\n", - " \\\n", - " industry_ict industry_other_electricity weather/solar_pv_profile_1 \n", - "0 9.0 9.0 9.0 \n", - "1 9.0 9.0 9.0 \n", - "2 9.0 9.0 9.0 \n", - "3 9.0 9.0 9.0 \n", - "4 9.0 9.0 9.0 \n", - "... ... ... ... \n", - "8755 9.0 9.0 9.0 \n", - "8756 9.0 9.0 9.0 \n", - "8757 9.0 9.0 9.0 \n", - "8758 9.0 9.0 9.0 \n", - "8759 9.0 9.0 9.0 \n", - "\n", - " \\\n", - " weather/solar_thermal weather/air_temperature \n", - "0 9.0 9.0 \n", - "1 9.0 9.0 \n", - "2 9.0 9.0 \n", - "3 9.0 9.0 \n", - "4 9.0 9.0 \n", - "... ... ... \n", - "8755 9.0 9.0 \n", - "8756 9.0 9.0 \n", - "8757 9.0 9.0 \n", - "8758 9.0 9.0 \n", - "8759 9.0 9.0 \n", - "\n", - " \\\n", - " weather/agriculture_heating weather/wind_offshore_baseline \n", - "0 9.0 9.0 \n", - "1 9.0 9.0 \n", - "2 9.0 9.0 \n", - "3 9.0 9.0 \n", - "4 9.0 9.0 \n", - "... ... ... \n", - "8755 9.0 9.0 \n", - "8756 9.0 9.0 \n", - "8757 9.0 9.0 \n", - "8758 9.0 9.0 \n", - "8759 9.0 9.0 \n", - "\n", - " \n", - " weather/wind_coastal_baseline weather/wind_inland_baseline \n", - "0 9.0 9.0 \n", - "1 9.0 9.0 \n", - "2 9.0 9.0 \n", - "3 9.0 9.0 \n", - "4 9.0 9.0 \n", - "... ... ... \n", - "8755 9.0 9.0 \n", - "8756 9.0 9.0 \n", - "8757 9.0 9.0 \n", - "8758 9.0 9.0 \n", - "8759 9.0 9.0 \n", - "\n", - "[8760 rows x 52 columns]" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "packer.custom_curves()" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "54cc3f61", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
A: Create from excelB: Load a scenario by id
futurefuture
gqueryunit
dashboard_emissionsfactor0.024027-0.947929
dashboard_co2_emissions_versus_start_yearfactor0.028299-0.997037
dashboard_total_costsbln_euro39.30029356.46303
\n", - "
" - ], - "text/plain": [ - " A: Create from excel \\\n", - " future \n", - "gquery unit \n", - "dashboard_emissions factor 0.024027 \n", - "dashboard_co2_emissions_versus_start_year factor 0.028299 \n", - "dashboard_total_costs bln_euro 39.300293 \n", - "\n", - " B: Load a scenario by id \n", - " future \n", - "gquery unit \n", - "dashboard_emissions factor -0.947929 \n", - "dashboard_co2_emissions_versus_start_year factor -0.997037 \n", - "dashboard_total_costs bln_euro 56.46303 " - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "packer.gquery_results()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "pyetm-qKH2ozgc", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/examples/exploring_a_scenario.ipynb b/examples/exploring_a_scenario.ipynb deleted file mode 100644 index 5fd681c..0000000 --- a/examples/exploring_a_scenario.ipynb +++ /dev/null @@ -1,211 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "ddbe7ab2", - "metadata": {}, - "source": [ - "# Scenario Examples\n", - "\n", - "This notebook demonstrates how to use the `Scenario` object within the pyetm package to retrieve and \n", - "inspect data from an ETM scenario.\n", - "\n", - "Make sure you have a valid `ETM_API_TOKEN` set in your environment.\n", - "\n", - "## Structure\n", - "\n", - "This notebook is organized into two main sections:\n", - "1. **Setup** - Run these cells first to set up your environment and load a scenario\n", - "2. **Examples** - After setup is complete, these cells can be run in any order to explore different aspects of scenario data\n", - "\n", - "## Setup:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "59514b1f", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Environment setup complete\n", - " Using ETM API at http://localhost:3000/api/v3\n", - " Token loaded? True\n", - "API connection ready\n" - ] - }, - { - "ename": "ScenarioError", - "evalue": "Could not load scenario 2690288: [\"HTTPConnectionPool(host='localhost', port=3000): Max retries exceeded with url: /api/v3/scenarios/2690288 (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 61] Connection refused'))\"]", - "output_type": "error", - "traceback": [ - "\u001b[31mScenarioError\u001b[39m\u001b[31m:\u001b[39m Could not load scenario 2690288: [\"HTTPConnectionPool(host='localhost', port=3000): Max retries exceeded with url: /api/v3/scenarios/2690288 (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 61] Connection refused'))\"]\n" - ] - } - ], - "source": [ - "from example_helpers import setup_notebook\n", - "from pyetm.models import Scenario\n", - "\n", - "setup_notebook()\n", - "\n", - "# Change the scenario id to anything you want! This is a scenario on pro.\n", - "scenario = Scenario.load(2690555)" - ] - }, - { - "cell_type": "markdown", - "id": "4056266c", - "metadata": {}, - "source": [ - "## Examples\n", - "\n", - "Basic scenario info:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "aca02e6c", - "metadata": {}, - "outputs": [], - "source": [ - "print(f\"Area: {scenario.area_code}\")\n", - "print(f\"End year: {scenario.end_year}\")\n", - "print(f\"Version: {scenario.version}\")" - ] - }, - { - "cell_type": "markdown", - "id": "b3026722", - "metadata": {}, - "source": [ - "User inputs" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7b529ffa", - "metadata": {}, - "outputs": [], - "source": [ - "user_vals = scenario.user_values()\n", - "print(f\"Modified inputs: {len(user_vals)}\")\n", - "print(f\"First input: {list(user_vals.keys())[0]} = {list(user_vals.values())[0]}\")" - ] - }, - { - "cell_type": "markdown", - "id": "625977af", - "metadata": {}, - "source": [ - "Example Input" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f9c453cf", - "metadata": {}, - "outputs": [], - "source": [ - "first_input = next(iter(scenario.inputs))\n", - "print(f\"Key: {first_input.key}\")\n", - "print(f\"Unit: {first_input.unit}\")\n", - "print(f\"Default: {first_input.default}\")" - ] - }, - { - "cell_type": "markdown", - "id": "50ef3d36", - "metadata": {}, - "source": [ - "Output curve (an export from the scenario)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4289f9c4", - "metadata": {}, - "outputs": [], - "source": [ - "carrier_keys = list(scenario.output_curves.attached_keys())\n", - "if carrier_keys:\n", - " first_carrier = carrier_keys[0]\n", - " carrier_data = list(scenario.all_output_curves())[0]\n", - " print(f\"Carrier curve: {first_carrier}\")\n", - " print(f\"Shape: {carrier_data.shape}\")" - ] - }, - { - "cell_type": "markdown", - "id": "af75d6e6", - "metadata": {}, - "source": [ - "Sortables" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "411ce7e1", - "metadata": {}, - "outputs": [], - "source": [ - "sortables = scenario.sortables.as_dict()\n", - "if sortables:\n", - " first_sortable = list(sortables.keys())[0]\n", - " print(f\"Sortable: {first_sortable}\")\n", - " print(f\"Items: {len(sortables[first_sortable])}\")" - ] - }, - { - "cell_type": "markdown", - "id": "73192cdf", - "metadata": {}, - "source": [ - "Gqueries" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1dbe4e91", - "metadata": {}, - "outputs": [], - "source": [ - "scenario.add_queries([\"dashboard_emissions\"])\n", - "results = scenario.results()\n", - "if results is not None:\n", - " print(f\"Query present result: {results['present'].iloc[0]:.2f}\")\n", - " print(f\"Query future result: {results['future'].iloc[0]:.2f}\")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "pyetm-qKH2ozgc", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/examples/myc_notebook_for_tim.ipynb b/examples/myc_notebook_for_tim.ipynb deleted file mode 100644 index 6545857..0000000 --- a/examples/myc_notebook_for_tim.ipynb +++ /dev/null @@ -1,1631 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "8128efd6", - "metadata": {}, - "source": [ - "This notebook mimics the myc_notebook from pyetm v1 to demonstrate how functionalities remain the same, despite being dressed up differently." - ] - }, - { - "cell_type": "markdown", - "id": "53e5210e", - "metadata": {}, - "source": [ - "**Multi-year charts**\n", - "\n", - "The MYC function within the ETM allows users to view and edit multiple scenarios at once. This \n", - "feature is useful to compare different scenarios or to built a transition path that contains \n", - "scenarios with different end years, see https://myc.energytransitionmodel.com/\n" - ] - }, - { - "cell_type": "markdown", - "id": "205371e8", - "metadata": {}, - "source": [ - "**Model Initialisation**\n", - "\n", - "Where you used to initialize the 'model' with the `model.from_excel()` function, now we work with a 'scenario' or 'scenarios' (TBC - what will we call the multiple scenario object?).\n", - "\n", - "You need to run the setup_notebook() command to get the API ready - this will also validate that you've set your API token correctly. You determine whether you connect with the beta, stable or live version of the ETM via the ETM_URL in the config." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e3d108b6", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Environment setup complete\n", - " Using ETM API at https://beta.engine.energytransitionmodel.com/api/v3\n", - " Token loaded? True\n", - "API connection ready\n" - ] - } - ], - "source": [ - "from example_helpers import setup_notebook\n", - "from pyetm.models import Scenario\n", - "\n", - "setup_notebook()\n", - "# put a comment how to make the setup" - ] - }, - { - "cell_type": "markdown", - "id": "f87a2eef", - "metadata": {}, - "source": [ - "Then, you can create a scenario (or scenarios) with the Scenario.from_excel. For now this functionality is not implemented, so the example will continue by loading an individual scenario. Note that when multi-scenario functionality has been implemented, these same steps should work exactly the same way, but on the Scenarios object, rather than the Scenario object." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "76dce178", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
2690499
scenario
end_year2040
privateFalse
area_codenl2019
template2402157
\n", - "
" - ], - "text/plain": [ - " 2690499\n", - "scenario \n", - "end_year 2040\n", - "private False\n", - "area_code nl2019\n", - "template 2402157" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "scenario = Scenario.load(2690499)\n", - "scenario.to_dataframe()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5c8a7628", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " max min user\n", - "input unit \n", - "climate_relevant_co2_biomass_gas_future % 100.0 0.0 0.0\n", - "climate_relevant_co2_biomass_gas_present % 100.0 0.0 0.0\n", - "climate_relevant_co2_biomass_liquid_future % 100.0 0.0 0.0\n", - "climate_relevant_co2_biomass_liquid_present % 100.0 0.0 0.0\n", - "climate_relevant_co2_biomass_solid_future % 100.0 0.0 0.0\n" - ] - } - ], - "source": [ - "# Get scenario input parameters (incl. units)\n", - "inputs = scenario.inputs\n", - "# Give an explanation of available columns\n", - "print(inputs.to_dataframe(columns=['max', 'min', 'user']).head())" - ] - }, - { - "cell_type": "markdown", - "id": "ba56a5f2", - "metadata": {}, - "source": [ - "You will notice that in the original pyetm this call was:\n", - "```\n", - "inputs = model.get_parameters(exclude=True)\n", - "inputs.head()\n", - "```\n", - "Pyetm v2 is more developer friendly, which means that each of the 'objects' on the model (for example the inputs) are still python objects until you call **to_dataframe()** on them. This is one of the more significant changes - you will have to specify (in the notebooks) what format you want the data in. For the flows from Excel --> ETM and ETM --> Excel, this is all taken care of internally." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e3a3bfab", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'climate_relevant_co2_biomass_gas_future': 0.0,\n", - " 'climate_relevant_co2_biomass_gas_present': 0.0,\n", - " 'climate_relevant_co2_biomass_liquid_future': 0.0,\n", - " 'climate_relevant_co2_biomass_liquid_present': 0.0,\n", - " 'climate_relevant_co2_biomass_solid_future': 0.0,\n", - " 'climate_relevant_co2_biomass_solid_present': 0.0,\n", - " 'capacity_costs_energy_flexibility_flow_batteries_electricity': 0.0,\n", - " 'costs_bio_ethanol': 0.9482455192,\n", - " 'costs_biodiesel': 0.9588091368,\n", - " 'costs_biogas': 58.0,\n", - " 'costs_captured_biogenic_co2': 0.0,\n", - " 'costs_co2': 123.0,\n", - " 'costs_co2_free_allocation': 0.0,\n", - " 'costs_coal': 56.0,\n", - " 'costs_electricity_fallback_price': 3000.0,\n", - " 'costs_gas': 15.0,\n", - " 'costs_greengas': 61.0,\n", - " 'costs_heat_infra_indoors': 100.0,\n", - " 'costs_heat_infra_outdoors': 100.0,\n", - " 'costs_heat_network_storage_ht_steam_hot_water': 43.2,\n", - " 'costs_hydrogen': 30.0,\n", - " 'costs_hydrogen_transport_compressed_trucks': 50.0822647794,\n", - " 'costs_hydrogen_transport_pipelines': 1.5706418062,\n", - " 'costs_imported_ammonia': 43.2145152,\n", - " 'costs_imported_heat': 11.569444,\n", - " 'costs_industry_residual_heat': 0.0,\n", - " 'costs_infrastructure_electricity_hv_net': 364.0,\n", - " 'costs_infrastructure_electricity_interconnector_net': 364.0,\n", - " 'costs_infrastructure_electricity_lv_mv_trafo': 200.0,\n", - " 'costs_infrastructure_electricity_lv_net': 916.0,\n", - " 'costs_infrastructure_electricity_mv_hv_trafo': 250.0,\n", - " 'costs_infrastructure_electricity_mv_net': 690.0,\n", - " 'costs_infrastructure_electricity_offshore_net': 1159.0,\n", - " 'costs_oil': 61.0,\n", - " 'costs_uranium': 69.100026,\n", - " 'costs_wacc_households': 2.0,\n", - " 'costs_wacc_proven_technologies': 4.0,\n", - " 'costs_wacc_public_infrastructure': 3.0,\n", - " 'costs_wacc_unproven_technologies': 7.0,\n", - " 'costs_wood': 149.7799980001,\n", - " 'efficiency_agriculture_heatpump_water_water_electricity': 4.5,\n", - " 'efficiency_agriculture_heatpump_water_water_ts_electricity': 23.0000000001,\n", - " 'efficiency_ammonia_reforming': 68.5,\n", - " 'efficiency_buildings_space_heater_collective_heatpump_water_water_ts_electricity': 3.76,\n", - " 'efficiency_buildings_space_heater_combined_hydrogen': 108.6956522,\n", - " 'efficiency_buildings_space_heater_crude_oil': 85.0,\n", - " 'efficiency_buildings_space_heater_electricity': 100.0,\n", - " 'efficiency_buildings_space_heater_heatpump_air_water_electricity': 100.0,\n", - " 'efficiency_buildings_space_heater_hybrid_heatpump_air_water_electricity': 100.0,\n", - " 'efficiency_buildings_space_heater_hybrid_hydrogen_heatpump_air_water_electricity': 100.0,\n", - " 'efficiency_buildings_space_heater_network_gas': 106.7,\n", - " 'efficiency_buildings_space_heater_wood_pellets': 82.0,\n", - " 'efficiency_energy_chp_combined_cycle_network_gas_electricity': 43.3,\n", - " 'efficiency_energy_chp_combined_cycle_network_gas_heat': 30.5,\n", - " 'efficiency_energy_chp_local_engine_biogas_electricity': 42.0,\n", - " 'efficiency_energy_chp_local_engine_biogas_heat': 39.0,\n", - " 'efficiency_energy_chp_local_engine_network_gas_electricity': 42.0,\n", - " 'efficiency_energy_chp_local_engine_network_gas_heat': 50.0,\n", - " 'efficiency_energy_chp_local_wood_pellets_electricity': 18.3,\n", - " 'efficiency_energy_chp_local_wood_pellets_heat': 47.0,\n", - " 'efficiency_energy_chp_supercritical_waste_mix_electricity': 20.45,\n", - " 'efficiency_energy_chp_supercritical_waste_mix_heat': 19.9500000001,\n", - " 'efficiency_energy_chp_ultra_supercritical_coal_electricity': 44.0,\n", - " 'efficiency_energy_chp_ultra_supercritical_coal_heat': 13.0,\n", - " 'efficiency_energy_chp_ultra_supercritical_cofiring_coal_electricity': 40.0,\n", - " 'efficiency_energy_chp_ultra_supercritical_cofiring_coal_heat': 15.0,\n", - " 'efficiency_energy_power_combined_cycle_coal': 45.3000000001,\n", - " 'efficiency_energy_power_combined_cycle_hydrogen': 60.0,\n", - " 'efficiency_energy_power_combined_cycle_network_gas': 60.0,\n", - " 'efficiency_energy_power_engine_diesel': 38.0,\n", - " 'efficiency_energy_power_engine_network_gas': 48.0,\n", - " 'efficiency_energy_power_nuclear_gen2_uranium_oxide': 36.93,\n", - " 'efficiency_energy_power_nuclear_gen3_uranium_oxide': 36.93,\n", - " 'efficiency_energy_power_nuclear_small_modular_reactor_uranium_oxide': 28.0000000001,\n", - " 'efficiency_energy_power_solar_pv_solar_radiation': 23.0,\n", - " 'efficiency_energy_power_supercritical_coal': 36.0,\n", - " 'efficiency_energy_power_supercritical_waste_mix': 25.0,\n", - " 'efficiency_energy_power_turbine_hydrogen': 34.0,\n", - " 'efficiency_energy_power_turbine_network_gas': 34.0,\n", - " 'efficiency_energy_power_ultra_supercritical_coal': 46.0,\n", - " 'efficiency_energy_power_ultra_supercritical_cofiring_coal': 42.0,\n", - " 'efficiency_energy_power_ultra_supercritical_crude_oil': 45.0,\n", - " 'efficiency_energy_power_ultra_supercritical_network_gas': 40.0,\n", - " 'efficiency_households_space_heater_combined_hydrogen': 110.0000000001,\n", - " 'efficiency_households_space_heater_combined_network_gas': 107.0,\n", - " 'efficiency_households_space_heater_crude_oil': 85.0,\n", - " 'efficiency_households_space_heater_electricity': 100.0,\n", - " 'efficiency_households_space_heater_heatpump_air_water_electricity': 100.0,\n", - " 'efficiency_households_space_heater_heatpump_ground_water_electricity': 4.8000000001,\n", - " 'efficiency_households_space_heater_hybrid_heatpump_air_water_electricity': 100.0,\n", - " 'efficiency_households_space_heater_hybrid_hydrogen_heatpump_air_water_electricity': 100.0,\n", - " 'efficiency_households_space_heater_network_gas': 80.0,\n", - " 'efficiency_households_space_heater_wood_pellets': 82.0,\n", - " 'efficiency_hydrogen_electrolysis': 66.0,\n", - " 'efficiency_industry_chp_turbine_hydrogen_electricity': 33.4448160536,\n", - " 'efficiency_industry_chp_turbine_hydrogen_heat': 41.4715719064,\n", - " 'investment_costs_ammonia_reforming': 0.0,\n", - " 'investment_costs_co2_capture_industry': 0.0,\n", - " 'investment_costs_co2_ccs': 0.0,\n", - " 'investment_costs_co2_storage': 0.0,\n", - " 'investment_costs_co2_transport': 0.0,\n", - " 'investment_costs_co2_utilisation': 0.0,\n", - " 'investment_costs_combustion_biomass_plants': 0.0,\n", - " 'investment_costs_combustion_coal_plant': 0.0,\n", - " 'investment_costs_combustion_gas_plant': 0.0,\n", - " 'investment_costs_combustion_hydrogen_plant': 0.0,\n", - " 'investment_costs_combustion_oil_plant': 0.0,\n", - " 'investment_costs_combustion_waste_incinerator': 0.0,\n", - " 'investment_costs_electric_heat_pumps': 0.0,\n", - " 'investment_costs_electrolyzers': 0.0,\n", - " 'investment_costs_energy_flexibility_hv_opac_electricity': 0.0,\n", - " 'investment_costs_energy_flexibility_mv_batteries_electricity': 0.0,\n", - " 'investment_costs_flexibility_p2h_electricity': 0.0,\n", - " 'investment_costs_gas_heat_pumps': 0.0,\n", - " 'investment_costs_geothermal': 0.0,\n", - " 'investment_costs_households_flexibility_p2p_electricity': 0.0,\n", - " 'investment_costs_households_storage_space_heating': 154.7368,\n", - " 'investment_costs_households_storage_water_heating': 50.71375,\n", - " 'investment_costs_hydrogen_electrolysis': 0.0,\n", - " 'investment_costs_nuclear_nuclear_plant': 0.0,\n", - " 'investment_costs_nuclear_small_modular_reactor': 0.0,\n", - " 'investment_costs_solar_concentrated_solar_power': 0.0,\n", - " 'investment_costs_solar_solar_panels': 0.0,\n", - " 'investment_costs_solar_thermal': 0.0,\n", - " 'investment_costs_water_river': 0.0,\n", - " 'investment_costs_wind_offshore': 0.0,\n", - " 'investment_costs_wind_onshore': 0.0,\n", - " 'om_costs_co2_capture_industry': 0.0,\n", - " 'om_costs_co2_ccs': 0.0,\n", - " 'om_costs_co2_storage': 0.0,\n", - " 'om_costs_co2_transport': 0.0,\n", - " 'om_costs_co2_utilisation': 0.0,\n", - " 'om_costs_combustion_biomass_plant': 0.0,\n", - " 'om_costs_combustion_coal_plant': 0.0,\n", - " 'om_costs_combustion_gas_plant': 0.0,\n", - " 'om_costs_combustion_hydrogen_plant': 0.0,\n", - " 'om_costs_combustion_oil_plant': 0.0,\n", - " 'om_costs_combustion_waste_incinerator': 0.0,\n", - " 'om_costs_geothermal': 0.0,\n", - " 'om_costs_nuclear_nuclear_plant': 0.0,\n", - " 'om_costs_nuclear_small_modular_reactor': 0.0,\n", - " 'om_costs_solar_thermal': 0.0,\n", - " 'om_costs_water_river': 0.0,\n", - " 'om_costs_wind_offshore': 0.0,\n", - " 'om_costs_wind_onshore': 0.0,\n", - " 'volume_costs_energy_flexibility_flow_batteries_electricity': 0.0,\n", - " 'agriculture_burner_crude_oil_share': 0.0,\n", - " 'agriculture_burner_hydrogen_share': 0.0,\n", - " 'agriculture_burner_network_gas_share': 0.0,\n", - " 'agriculture_burner_wood_pellets_share': 10.0,\n", - " 'agriculture_final_demand_ht_central_steam_hot_water_share': 48.0,\n", - " 'agriculture_final_demand_local_steam_hot_water_share': 0.0,\n", - " 'agriculture_geothermal_share': 20.0,\n", - " 'agriculture_heatpump_water_water_electricity_share': 5.0,\n", - " 'agriculture_heatpump_water_water_ts_electricity_share': 17.0,\n", - " 'agriculture_useful_demand_electricity': 0.6,\n", - " 'agriculture_useful_demand_useable_heat': -1.7,\n", - " 'capacity_of_agriculture_flexibility_p2h_electricity': 0.0,\n", - " 'buildings_cooling_airconditioning_share': 82.0,\n", - " 'buildings_cooling_collective_heatpump_water_water_ts_electricity_share': 18.0,\n", - " 'buildings_cooling_heatpump_air_water_electricity_share': 0.0,\n", - " 'buildings_cooling_heatpump_air_water_network_gas_share': 0.0,\n", - " 'buildings_space_heater_coal_share': 0.0,\n", - " 'buildings_space_heater_collective_heatpump_water_water_ts_electricity_share': 4.56,\n", - " 'buildings_space_heater_combined_hydrogen_share': 0.0,\n", - " 'buildings_space_heater_crude_oil_share': 0.0,\n", - " 'buildings_space_heater_district_heating_ht_steam_hot_water_share': 18.05,\n", - " 'buildings_space_heater_electricity_share': 0.0,\n", - " 'buildings_space_heater_heatpump_air_water_electricity_share': 41.8,\n", - " 'buildings_space_heater_heatpump_air_water_network_gas_share': 0.0,\n", - " 'buildings_space_heater_hybrid_heatpump_air_water_electricity_share': 19.45,\n", - " 'buildings_space_heater_hybrid_hydrogen_heatpump_air_water_electricity_share': 0.0,\n", - " 'buildings_space_heater_network_gas_share': 14.75,\n", - " 'buildings_space_heater_solar_thermal_share': 40.0,\n", - " 'buildings_space_heater_wood_pellets_share': 1.39,\n", - " 'buildings_insulation_level_buildings_future': 169.44532976497808,\n", - " 'buildings_insulation_level_buildings_present': 217.2208864009762,\n", - " 'buildings_lighting_efficient_fluorescent_electricity_share': 2.0,\n", - " 'buildings_lighting_led_electricity_share': 98.0,\n", - " 'buildings_lighting_standard_fluorescent_electricity_share': 0.0,\n", - " 'buildings_lighting_savings_from_daylight_control_light': 45.0,\n", - " 'buildings_lighting_savings_from_motion_detection_light': 49.0,\n", - " 'buildings_useful_demand_cooling': -0.2972159969666939,\n", - " 'buildings_useful_demand_electricity': 0.0,\n", - " 'buildings_useful_demand_for_appliances': 1.1,\n", - " 'buildings_number_of_buildings_future': 122142.46602400357,\n", - " 'bunkers_allocated_percentage_aviation': 0.0,\n", - " 'bunkers_allocated_percentage_shipping': 0.0,\n", - " 'bunkers_plane_using_bio_kerosene_share': 42.67,\n", - " 'bunkers_plane_using_kerosene_share': 57.33,\n", - " 'bunkers_ship_using_ammonia_share': 0.0,\n", - " 'bunkers_ship_using_heavy_fuel_oil_share': 67.0,\n", - " 'bunkers_ship_using_hydrogen_share': 0.0,\n", - " 'bunkers_ship_using_lng_share': 33.0,\n", - " 'bunkers_useful_demand_planes': 0.0,\n", - " 'bunkers_useful_demand_ships': 0.0,\n", - " 'volume_of_baseload_export_hydrogen': 134.63050808711347,\n", - " 'households_cooker_halogen_electricity_share': 0.0,\n", - " 'households_cooker_induction_electricity_share': 88.35,\n", - " 'households_cooker_network_gas_share': 9.5,\n", - " 'households_cooker_resistive_electricity_share': 2.15,\n", - " 'households_cooker_wood_pellets_share': 0.0,\n", - " 'households_cooling_airconditioning_electricity_share': 81.9300000001,\n", - " 'households_cooling_heatpump_air_water_electricity_share': 9.67,\n", - " 'households_cooling_heatpump_ground_water_electricity_share': 8.4,\n", - " 'households_useful_demand_for_cooling': 0.0,\n", - " 'households_useful_demand_cooking_per_person': 0.0,\n", - " 'households_useful_demand_electric_appliances': 0.0,\n", - " 'households_useful_demand_lighting': 0.0,\n", - " 'households_appliances_electricity_efficiency': 13.770491803278606,\n", - " 'households_heater_coal_share': 0.0,\n", - " 'households_heater_combined_hydrogen_share': 0.0,\n", - " 'households_heater_combined_network_gas_share': 15.0,\n", - " 'households_heater_crude_oil_share': 0.0,\n", - " 'households_heater_district_heating_ht_steam_hot_water_share': 18.0,\n", - " 'households_heater_electricity_share': 2.8,\n", - " 'households_heater_heatpump_air_water_electricity_share': 33.6,\n", - " 'households_heater_heatpump_ground_water_electricity_share': 8.2,\n", - " 'households_heater_heatpump_pvt_electricity_share': 0.0,\n", - " 'households_heater_hybrid_heatpump_air_water_electricity_share': 19.5,\n", - " 'households_heater_hybrid_hydrogen_heatpump_air_water_electricity_share': 0.0,\n", - " 'households_heater_network_gas_share': 0.0,\n", - " 'households_heater_wood_pellets_share': 2.9,\n", - " 'households_useful_demand_hot_water_share': 0.0,\n", - " 'households_water_heater_solar_thermal_share': 32.5,\n", - " 'households_insulation_level_apartments_1945_1964': 187.26134107628562,\n", - " 'households_insulation_level_apartments_1965_1984': 160.57671114919341,\n", - " 'households_insulation_level_apartments_1985_2004': 128.26307690023407,\n", - " 'households_insulation_level_apartments_2005_present': 96.18100458657419,\n", - " 'households_insulation_level_apartments_before_1945': 256.6002436636793,\n", - " 'households_insulation_level_apartments_future': 53.92879181106722,\n", - " 'households_insulation_level_detached_houses_1945_1964': 194.75462565741475,\n", - " 'households_insulation_level_detached_houses_1965_1984': 162.1440300736066,\n", - " 'households_insulation_level_detached_houses_1985_2004': 128.41872640805985,\n", - " 'households_insulation_level_detached_houses_2005_present': 93.16911568453558,\n", - " 'households_insulation_level_detached_houses_before_1945': 237.0837495697443,\n", - " 'households_insulation_level_detached_houses_future': 44.03429181614837,\n", - " 'households_insulation_level_semi_detached_houses_1945_1964': 180.82152900785633,\n", - " 'households_insulation_level_semi_detached_houses_1965_1984': 156.09290631617938,\n", - " 'households_insulation_level_semi_detached_houses_1985_2004': 128.38268907671798,\n", - " 'households_insulation_level_semi_detached_houses_2005_present': 95.1754172419351,\n", - " 'households_insulation_level_semi_detached_houses_before_1945': 224.08322620338217,\n", - " 'households_insulation_level_semi_detached_houses_future': 45.8219794702538,\n", - " 'households_insulation_level_terraced_houses_1945_1964': 244.77387685870463,\n", - " 'households_insulation_level_terraced_houses_1965_1984': 190.10073010677155,\n", - " 'households_insulation_level_terraced_houses_1985_2004': 131.53138563876874,\n", - " 'households_insulation_level_terraced_houses_2005_present': 101.4220246175114,\n", - " 'households_insulation_level_terraced_houses_before_1945': 266.01945785021763,\n", - " 'households_insulation_level_terraced_houses_future': 47.969841149677144,\n", - " 'households_lighting_efficient_fluorescent_electricity_share': 8.25,\n", - " 'households_lighting_incandescent_electricity_share': 0.0,\n", - " 'households_lighting_led_electricity_share': 91.75,\n", - " 'households_number_of_apartments_future': 407270.7379999999,\n", - " 'households_number_of_detached_houses_future': 141946.5721,\n", - " 'households_number_of_inhabitants': 19.1,\n", - " 'households_number_of_semi_detached_houses_future': 246876.06719999993,\n", - " 'households_number_of_terraced_houses_future': 334197.6226999997,\n", - " 'capacity_of_industry_chemicals_fertilizers_flexibility_p2h_electricity': 0.0,\n", - " 'capacity_of_industry_chemicals_other_flexibility_p2h_electricity': 0.0,\n", - " 'capacity_of_industry_chemicals_refineries_flexibility_p2h_electricity': 0.0,\n", - " 'capacity_of_industry_other_food_flexibility_p2h_electricity': 700.0,\n", - " 'capacity_of_industry_other_paper_flexibility_p2h_electricity': 175.0,\n", - " 'industry_aggregated_other_industry_coal_share_energetic': 0.0,\n", - " 'industry_aggregated_other_industry_cokes_share_energetic': 0.0,\n", - " 'industry_aggregated_other_industry_crude_oil_share_energetic': 0.0,\n", - " 'industry_aggregated_other_industry_electricity_share': 80.0,\n", - " 'industry_aggregated_other_industry_hydrogen_share_energetic': 3.0,\n", - " 'industry_aggregated_other_industry_hydrogen_share_non_energetic': 0.0,\n", - " 'industry_aggregated_other_industry_network_gas_share_energetic': 17.0,\n", - " 'industry_aggregated_other_industry_useable_heat_share': 0.0,\n", - " 'industry_aggregated_other_industry_wood_pellets_share_energetic': 0.0,\n", - " 'industry_aluminium_carbothermalreduction_electricity_share': 0.0,\n", - " 'industry_aluminium_electrolysis_bat_electricity_share': 16.66666667,\n", - " 'industry_aluminium_electrolysis_current_electricity_share': 42.8571428601,\n", - " 'industry_aluminium_production': 0.0,\n", - " 'industry_aluminium_smeltoven_electricity_share': 40.47619048,\n", - " 'industry_chemicals_fertilizers_burner_coal_share': 0.0,\n", - " 'industry_chemicals_fertilizers_burner_crude_oil_share': 0.0,\n", - " 'industry_chemicals_fertilizers_burner_hydrogen_share': 0.0,\n", - " 'industry_chemicals_fertilizers_burner_network_gas_share': 78.7151702787,\n", - " 'industry_chemicals_fertilizers_burner_wood_pellets_share': 0.0,\n", - " 'industry_chemicals_fertilizers_central_ammonia_share': 0.0,\n", - " 'industry_chemicals_fertilizers_hydrogen_network_share': 0.0,\n", - " 'industry_chemicals_fertilizers_local_ammonia_central_hydrogen_share': 0.0,\n", - " 'industry_chemicals_fertilizers_local_ammonia_local_hydrogen_share': 100.0,\n", - " 'industry_chemicals_fertilizers_steam_methane_reformer_hydrogen_share': 100.0,\n", - " 'industry_chemicals_other_burner_coal_share': 0.0,\n", - " 'industry_chemicals_other_burner_crude_oil_share': 45.3258609475,\n", - " 'industry_chemicals_other_burner_hydrogen_share': 0.0,\n", - " 'industry_chemicals_other_burner_network_gas_share': 24.2727467215,\n", - " 'industry_chemicals_other_burner_wood_pellets_share': 0.0,\n", - " 'industry_chemicals_other_coal_non_energetic_share': 0.0,\n", - " 'industry_chemicals_other_crude_oil_non_energetic_share': 88.8015390165,\n", - " 'industry_chemicals_other_heater_electricity_share': 0.0,\n", - " 'industry_chemicals_other_heatpump_water_water_electricity_share': 0.0,\n", - " 'industry_chemicals_other_hydrogen_non_energetic_share': 0.0,\n", - " 'industry_chemicals_other_network_gas_non_energetic_share': 11.1984609836,\n", - " 'industry_chemicals_other_steam_recompression_electricity_share': 0.0,\n", - " 'industry_chemicals_other_wood_pellets_non_energetic_share': 0.0,\n", - " 'industry_chemicals_refineries_burner_coal_share': 0.0,\n", - " 'industry_chemicals_refineries_burner_crude_oil_share': 64.2192843659,\n", - " 'industry_chemicals_refineries_burner_hydrogen_share': 0.0,\n", - " 'industry_chemicals_refineries_burner_network_gas_share': 27.8138338165,\n", - " 'industry_chemicals_refineries_burner_wood_pellets_share': 0.0,\n", - " 'industry_final_demand_for_chemical_fertilizers_steam_hot_water_share': 21.2848297214,\n", - " 'industry_final_demand_for_chemical_other_steam_hot_water_share': 30.4013923311,\n", - " 'industry_final_demand_for_chemical_refineries_steam_hot_water_share': 7.9668818178,\n", - " 'industry_final_demand_for_other_food_steam_hot_water_share': 0.0,\n", - " 'industry_final_demand_for_other_paper_steam_hot_water_share': 0.0,\n", - " 'industry_other_food_burner_coal_share': 0.0,\n", - " 'industry_other_food_burner_crude_oil_share': 0.0,\n", - " 'industry_other_food_burner_hydrogen_share': 0.0,\n", - " 'industry_other_food_burner_network_gas_share': 57.6,\n", - " 'industry_other_food_burner_wood_pellets_share': 0.0,\n", - " 'industry_other_food_heater_electricity_share': 42.4,\n", - " 'industry_other_metals_process_electricity_efficiency': 0.0,\n", - " 'industry_other_metals_process_heat_useable_heat_efficiency': 13.023776445487979,\n", - " 'industry_other_metals_production': 0.0,\n", - " 'industry_other_paper_burner_coal_share': 0.0,\n", - " 'industry_other_paper_burner_crude_oil_share': 0.0,\n", - " 'industry_other_paper_burner_hydrogen_share': 0.0,\n", - " 'industry_other_paper_burner_network_gas_share': 60.0,\n", - " 'industry_other_paper_burner_wood_pellets_share': 0.0,\n", - " 'industry_other_paper_heater_electricity_share': 40.0,\n", - " 'industry_steel_blastfurnace_bof_share': 100.0,\n", - " 'industry_steel_cyclonefurnace_bof_share': 0.0,\n", - " 'industry_steel_cyclonefurnace_bof_wood_pellets_share': 0.0,\n", - " 'industry_steel_dri_hydrogen_share': 0.0,\n", - " 'industry_steel_dri_network_gas_share': 0.0,\n", - " 'industry_steel_production': 100.0,\n", - " 'industry_steel_scrap_hbi_eaf_share': 0.0,\n", - " 'industry_useful_demand_for_aggregated_other_energetic': 89.0,\n", - " 'industry_useful_demand_for_aggregated_other_non_energetic': 89.0,\n", - " 'industry_useful_demand_for_chemical_fertilizers': 100.0,\n", - " 'industry_useful_demand_for_chemical_fertilizers_electricity_efficiency': 0.0,\n", - " 'industry_useful_demand_for_chemical_fertilizers_useable_heat_efficiency': 0.0,\n", - " 'industry_useful_demand_for_chemical_other': 100.0,\n", - " 'industry_useful_demand_for_chemical_other_electricity_efficiency': 0.0,\n", - " 'industry_useful_demand_for_chemical_other_useable_heat_efficiency': 0.0,\n", - " 'industry_useful_demand_for_chemical_refineries': 100.0,\n", - " 'industry_useful_demand_for_chemical_refineries_electricity_efficiency': 0.0,\n", - " 'industry_useful_demand_for_chemical_refineries_useable_heat_efficiency': 0.0,\n", - " 'industry_useful_demand_for_other_food': 100.0,\n", - " 'industry_useful_demand_for_other_food_electricity_efficiency': 25.320234587005388,\n", - " 'industry_useful_demand_for_other_food_useable_heat_efficiency': 25.320234587005388,\n", - " 'industry_useful_demand_for_other_ict': 329.0,\n", - " 'industry_useful_demand_for_other_ict_efficiency': 0.0,\n", - " 'industry_useful_demand_for_other_paper': 100.0,\n", - " 'industry_useful_demand_for_other_paper_electricity_efficiency': 31.246207044055573,\n", - " 'industry_useful_demand_for_other_paper_useable_heat_efficiency': 31.246207044055573,\n", - " 'other_useful_demand_electricity': 0.0,\n", - " 'other_useful_demand_non_energetic': 0.0,\n", - " 'other_useful_demand_useable_heat': 0.0,\n", - " 'transport_planes_efficiency': 0.0,\n", - " 'transport_ships_efficiency': 0.4,\n", - " 'transport_trains_efficiency': 0.1,\n", - " 'transport_vehicle_combustion_engine_efficiency': 0.4,\n", - " 'transport_vehicle_using_electricity_efficiency': 0.3,\n", - " 'transport_vehicle_using_hydrogen_efficiency': 0.3,\n", - " 'transport_freight_train_using_coal_share': 0.0,\n", - " 'transport_freight_train_using_diesel_mix_share': 0.66,\n", - " 'transport_freight_train_using_electricity_share': 98.68,\n", - " 'transport_freight_train_using_hydrogen_share': 0.66,\n", - " 'transport_freight_trains_share': 1.7501397973,\n", - " 'transport_ship_using_ammonia_share': 0.0,\n", - " 'transport_ship_using_diesel_mix_share': 64.68,\n", - " 'transport_ship_using_electricity_share': 9.93,\n", - " 'transport_ship_using_hydrogen_share': 16.66,\n", - " 'transport_ship_using_lng_mix_share': 8.73,\n", - " 'transport_ships_share': 19.9593814327,\n", - " 'transport_truck_using_compressed_natural_gas_share': 2.33,\n", - " 'transport_truck_using_diesel_mix_share': 29.15,\n", - " 'transport_truck_using_electricity_share': 45.07,\n", - " 'transport_truck_using_gasoline_mix_share': 0.0,\n", - " 'transport_truck_using_hydrogen_share': 19.12,\n", - " 'transport_truck_using_lng_mix_share': 4.33,\n", - " 'transport_trucks_share': 77.6037449859,\n", - " 'transport_useful_demand_freight_tonne_kms': 0.5,\n", - " 'transport_van_using_compressed_natural_gas_share': 0.0,\n", - " 'transport_van_using_diesel_mix_share': 23.2,\n", - " 'transport_van_using_electricity_share': 74.81,\n", - " 'transport_van_using_gasoline_mix_share': 0.44,\n", - " 'transport_van_using_hydrogen_share': 0.0,\n", - " 'transport_van_using_lpg_share': 1.55,\n", - " 'transport_vans_share': 0.6867337843,\n", - " 'transport_rail_mixer_diesel_diesel_share': 55.24,\n", - " 'transport_road_mixer_diesel_biodiesel_share': 44.81,\n", - " 'transport_road_mixer_diesel_diesel_share': 55.19,\n", - " 'transport_road_mixer_gasoline_ethanol_share': 45.69,\n", - " 'transport_road_mixer_gasoline_gasoline_share': 54.31,\n", - " 'transport_road_mixer_lng_bio_lng_share': 33.0,\n", - " 'transport_road_mixer_lng_lng_share': 67.0,\n", - " 'transport_shipping_mixer_diesel_bio_ethanol_share': 0.0,\n", - " 'transport_shipping_mixer_diesel_bio_lng_share': 33.0,\n", - " 'transport_shipping_mixer_diesel_biodiesel_share': 14.7,\n", - " 'transport_shipping_mixer_diesel_diesel_share': 52.3,\n", - " 'transport_shipping_mixer_diesel_heavy_fuel_oil_share': 0.0,\n", - " 'transport_shipping_mixer_diesel_lng_share': 0.0,\n", - " 'transport_shipping_mixer_lng_bio_lng_share': 42.67,\n", - " 'transport_shipping_mixer_lng_lng_share': 57.33,\n", - " 'transport_bicycle_using_electricity_share': 40.67,\n", - " 'transport_bicycle_using_human_power_share': 59.33,\n", - " 'transport_bicycles_share': 8.5,\n", - " 'transport_bus_using_compressed_natural_gas_share': 0.0,\n", - " 'transport_bus_using_diesel_mix_share': 0.0,\n", - " 'transport_bus_using_electricity_share': 96.67,\n", - " 'transport_bus_using_gasoline_mix_share': 0.0,\n", - " 'transport_bus_using_hydrogen_share': 3.33,\n", - " 'transport_bus_using_lng_share': 0.0,\n", - " 'transport_busses_share': 7.34,\n", - " 'transport_car_using_compressed_natural_gas_share': 0.0,\n", - " 'transport_car_using_diesel_mix_share': 0.0,\n", - " 'transport_car_using_electricity_share': 67.97,\n", - " 'transport_car_using_gasoline_mix_share': 28.27,\n", - " 'transport_car_using_hydrogen_share': 3.76,\n", - " 'transport_car_using_lpg_share': 0.0,\n", - " 'transport_cars_share': 69.0717377,\n", - " 'transport_motorcycle_using_electricity_share': 63.0,\n", - " 'transport_motorcycle_using_gasoline_mix_share': 37.0,\n", - " 'transport_motorcycles_share': 2.9115407598,\n", - " 'transport_passenger_train_using_coal_share': 0.0,\n", - " 'transport_passenger_train_using_diesel_mix_share': 0.7,\n", - " 'transport_passenger_train_using_electricity_share': 98.6,\n", - " 'transport_passenger_train_using_hydrogen_share': 0.7,\n", - " 'transport_passenger_trains_share': 12.0,\n", - " 'transport_rail_mixer_diesel_biodiesel_share': 44.76,\n", - " 'transport_plane_using_bio_ethanol_share': 0.0,\n", - " 'transport_plane_using_electricity_share': 16.7,\n", - " 'transport_plane_using_gasoline_share': 3.28,\n", - " 'transport_plane_using_hydrogen_share': 16.7,\n", - " 'transport_plane_using_kerosene_share': 63.32,\n", - " 'transport_planes_share': 0.0787128481,\n", - " 'transport_trams_share': 0.0980087341,\n", - " 'transport_useful_demand_passenger_kms': 1.0,\n", - " 'demand_of_molecules_direct_air_capture_co2': 0.0,\n", - " 'share_of_energy_chp_supercritical_ccs_ht_waste_mix': 0.0,\n", - " 'share_of_energy_hydrogen_autothermal_reformer_ccs_must_run': 0.0,\n", - " 'share_of_energy_hydrogen_biomass_gasification_ccs': 100.0,\n", - " 'share_of_energy_hydrogen_steam_methane_reformer_ccs_must_run': 100.0,\n", - " 'share_of_energy_power_combined_cycle_ccs_coal': 0.0,\n", - " 'share_of_energy_power_combined_cycle_ccs_network_gas': 0.0,\n", - " 'share_of_energy_power_supercritical_ccs_waste_mix': 0.0,\n", - " 'share_of_energy_power_ultra_supercritical_ccs_coal': 0.0,\n", - " 'share_of_energy_power_ultra_supercritical_oxyfuel_ccs_lignite': 0.0,\n", - " 'share_of_industry_chemicals_fertilizers_captured_combustion_co2': 0.0,\n", - " 'share_of_industry_chemicals_fertilizers_captured_processes_co2': 65.0,\n", - " 'share_of_industry_chemicals_other_captured_co2': 0.0,\n", - " 'share_of_industry_chemicals_refineries_captured_co2': 0.0,\n", - " 'share_of_industry_other_food_captured_co2': 0.0,\n", - " 'share_of_industry_other_paper_captured_co2': 0.0,\n", - " 'share_of_industry_steel_captured_co2': 0.0,\n", - " 'share_of_energy_steel_chemical_feedstock_coal_gas': 0.0,\n", - " 'share_of_energy_steel_energy_production_coal_gas': 100.0,\n", - " 'share_of_molecules_transport_pipelines_co2': 50.0,\n", - " 'share_of_molecules_transport_ships_co2': 50.0,\n", - " 'demand_of_molecules_offshore_sequestration_co2': 5.9,\n", - " 'demand_of_molecules_other_utilisation_co2': 2.342574,\n", - " 'output_of_energy_production_synthetic_methanol': 0.0,\n", - " 'share_of_molecules_other_utilisation_delayed_emitted_co2': 100.0,\n", - " 'share_of_molecules_other_utilisation_delayed_indefinitely_co2': 0.0,\n", - " 'co2_emissions_of_imported_ammonia_future': 348.3870984,\n", - " 'co2_emissions_of_imported_hydrogen_future': 0.0,\n", - " 'change_in_energetic_emissions_other_ghg_agriculture': 117.0,\n", - " 'change_in_energetic_emissions_other_ghg_buildings': 100.0,\n", - " 'change_in_energetic_emissions_other_ghg_energy': 100.0,\n", - " 'change_in_energetic_emissions_other_ghg_households': 100.0,\n", - " 'change_in_energetic_emissions_other_ghg_industry': 34.0,\n", - " 'change_in_energetic_emissions_other_ghg_transport': 20.0,\n", - " 'change_in_indirect_emissions_co2': 100.0,\n", - " 'change_in_non_energetic_emissions_co2_agriculture_manure': 50.0,\n", - " 'change_in_non_energetic_emissions_co2_agriculture_soil_cultivation': 50.0,\n", - " 'change_in_non_energetic_emissions_co2_chemical_industry': 66.66666667,\n", - " 'change_in_non_energetic_emissions_co2_other_industry': 40.0,\n", - " 'change_in_non_energetic_emissions_co2_waste_management': 50.0,\n", - " 'change_in_non_energetic_emissions_other_ghg_agriculture_fermentation': 48.0,\n", - " 'change_in_non_energetic_emissions_other_ghg_agriculture_manure': 102.0,\n", - " 'change_in_non_energetic_emissions_other_ghg_agriculture_other': 48.0,\n", - " 'change_in_non_energetic_emissions_other_ghg_agriculture_soil_cultivation': 64.0,\n", - " 'change_in_non_energetic_emissions_other_ghg_chemical_industry': 34.0,\n", - " 'change_in_non_energetic_emissions_other_ghg_other_industry': 34.0,\n", - " 'change_in_non_energetic_emissions_other_ghg_waste_management': 34.0,\n", - " 'battery_capacity_always_on_solar_pv_solar_radiation': 100.0,\n", - " 'battery_capacity_always_on_wind_turbine_inland': 100.0,\n", - " 'capacity_of_energy_flexibility_flow_batteries_electricity': 6500.0,\n", - " 'capacity_of_energy_flexibility_hv_opac_electricity': 0.0,\n", - " 'capacity_of_energy_flexibility_mv_batteries_electricity': 18500.0,\n", - " 'capacity_of_energy_flexibility_pumped_storage_electricity': 0.0,\n", - " 'capacity_of_energy_heat_flexibility_p2h_boiler_electricity': 4500.0,\n", - " 'capacity_of_energy_heat_flexibility_p2h_heatpump_electricity': 3500.0,\n", - " 'capacity_of_energy_hydrogen_flexibility_p2g_electricity': 14475.0,\n", - " 'connection_capacity_always_on_solar_pv_solar_radiation': 25.0,\n", - " 'connection_capacity_always_on_wind_turbine_inland': 75.0,\n", - " 'settings_enable_storage_optimisation_energy_flexibility_flow_batteries_electricity': 1.0,\n", - " 'settings_enable_storage_optimisation_energy_flexibility_hv_opac_electricity': 0.0,\n", - " 'settings_enable_storage_optimisation_energy_flexibility_mv_batteries_electricity': 1.0,\n", - " 'settings_enable_storage_optimisation_energy_flexibility_pumped_storage_electricity': 0.0,\n", - " 'volume_of_energy_flexibility_flow_batteries_electricity': 41.052631579,\n", - " 'wta_of_energy_flexibility_flow_batteries_electricity': 6.4285714286,\n", - " 'wta_of_energy_flexibility_hv_opac_electricity': 5.375,\n", - " 'wta_of_energy_flexibility_mv_batteries_electricity': 4.9411764706,\n", - " 'wta_of_energy_flexibility_pumped_storage_electricity': 5.5,\n", - " 'wtp_of_agriculture_flexibility_p2h_electricity': 22.0,\n", - " 'wtp_of_energy_flexibility_flow_batteries_electricity': 4.5,\n", - " 'wtp_of_energy_flexibility_hv_opac_electricity': 4.3,\n", - " 'wtp_of_energy_flexibility_mv_batteries_electricity': 4.2,\n", - " 'wtp_of_energy_flexibility_pumped_storage_electricity': 4.4,\n", - " 'wtp_of_energy_heat_flexibility_p2h_boiler_electricity': 25.0,\n", - " 'wtp_of_energy_heat_flexibility_p2h_heatpump_electricity': 25.0,\n", - " 'wtp_of_energy_hydrogen_flexibility_p2g_electricity': 30.0,\n", - " 'flexibility_heat_pump_space_heating_cop_cutoff_gas': 2.6,\n", - " 'flexibility_heat_pump_water_heating_cop_cutoff': 6.0,\n", - " 'households_flexibility_consumer_electricity_price': 22.5,\n", - " 'households_flexibility_consumer_gas_price': 81.4,\n", - " 'households_flexibility_p2p_electricity_market_penetration': 30.0,\n", - " 'settings_enable_storage_optimisation_households_flexibility_p2p_electricity': 'optimizing_storage',\n", - " 'wta_of_households_flexibility_p2p_electricity': 10.0,\n", - " 'wtp_of_households_flexibility_p2p_electricity': 5.0,\n", - " 'electricity_interconnector_1_capacity': 4400.0,\n", - " 'electricity_interconnector_1_co2_emissions_future': 0.0,\n", - " 'electricity_interconnector_1_co2_emissions_present': 0.0,\n", - " 'electricity_interconnector_1_export_availability': 100.0,\n", - " 'electricity_interconnector_1_import_availability': 100.0,\n", - " 'electricity_interconnector_1_marginal_costs': 37.5999984001,\n", - " 'electricity_interconnector_10_capacity': 0.0,\n", - " 'electricity_interconnector_10_co2_emissions_future': 370.0000008,\n", - " 'electricity_interconnector_10_co2_emissions_present': 370.0000008,\n", - " 'electricity_interconnector_10_export_availability': 100.0,\n", - " 'electricity_interconnector_10_import_availability': 100.0,\n", - " 'electricity_interconnector_10_marginal_costs': 37.5999984001,\n", - " 'electricity_interconnector_11_capacity': 0.0,\n", - " 'electricity_interconnector_11_co2_emissions_future': 370.0000008,\n", - " 'electricity_interconnector_11_co2_emissions_present': 370.0000008,\n", - " 'electricity_interconnector_11_export_availability': 100.0,\n", - " 'electricity_interconnector_11_import_availability': 100.0,\n", - " 'electricity_interconnector_11_marginal_costs': 37.5999984001,\n", - " 'electricity_interconnector_12_capacity': 0.0,\n", - " 'electricity_interconnector_12_co2_emissions_future': 370.0000008,\n", - " 'electricity_interconnector_12_co2_emissions_present': 370.0000008,\n", - " 'electricity_interconnector_12_export_availability': 100.0,\n", - " 'electricity_interconnector_12_import_availability': 100.0,\n", - " 'electricity_interconnector_12_marginal_costs': 37.5999984001,\n", - " 'electricity_interconnector_2_capacity': 6000.0,\n", - " 'electricity_interconnector_2_co2_emissions_future': 369.0,\n", - " 'electricity_interconnector_2_co2_emissions_present': 370.0000008,\n", - " 'electricity_interconnector_2_export_availability': 100.0,\n", - " 'electricity_interconnector_2_import_availability': 100.0,\n", - " 'electricity_interconnector_2_marginal_costs': 37.5999984001,\n", - " 'electricity_interconnector_3_capacity': 700.0,\n", - " 'electricity_interconnector_3_co2_emissions_future': 0.0,\n", - " 'electricity_interconnector_3_co2_emissions_present': 370.0000008,\n", - " 'electricity_interconnector_3_export_availability': 100.0,\n", - " 'electricity_interconnector_3_import_availability': 100.0,\n", - " 'electricity_interconnector_3_marginal_costs': 37.5999984001,\n", - " 'electricity_interconnector_4_capacity': 0.0,\n", - " 'electricity_interconnector_4_co2_emissions_future': 0.0,\n", - " 'electricity_interconnector_4_co2_emissions_present': 370.0000008,\n", - " 'electricity_interconnector_4_export_availability': 100.0,\n", - " 'electricity_interconnector_4_import_availability': 100.0,\n", - " 'electricity_interconnector_4_marginal_costs': 37.5999984001,\n", - " 'electricity_interconnector_5_capacity': 700.0,\n", - " 'electricity_interconnector_5_co2_emissions_future': 0.0,\n", - " 'electricity_interconnector_5_co2_emissions_present': 370.0000008,\n", - " 'electricity_interconnector_5_export_availability': 100.0,\n", - " 'electricity_interconnector_5_import_availability': 100.0,\n", - " 'electricity_interconnector_5_marginal_costs': 37.5999984001,\n", - " 'electricity_interconnector_6_capacity': 0.0,\n", - " 'electricity_interconnector_6_co2_emissions_future': 0.0,\n", - " 'electricity_interconnector_6_co2_emissions_present': 370.0000008,\n", - " 'electricity_interconnector_6_export_availability': 100.0,\n", - " 'electricity_interconnector_6_import_availability': 100.0,\n", - " 'electricity_interconnector_6_marginal_costs': 37.5999984001,\n", - " 'electricity_interconnector_7_capacity': 1000.0,\n", - " 'electricity_interconnector_7_co2_emissions_future': 0.0,\n", - " 'electricity_interconnector_7_co2_emissions_present': 370.0000008,\n", - " 'electricity_interconnector_7_export_availability': 100.0,\n", - " 'electricity_interconnector_7_import_availability': 100.0,\n", - " 'electricity_interconnector_7_marginal_costs': 37.5999984001,\n", - " 'electricity_interconnector_8_capacity': 2000.0,\n", - " 'electricity_interconnector_8_co2_emissions_future': 0.0,\n", - " 'electricity_interconnector_8_co2_emissions_present': 370.0000008,\n", - " 'electricity_interconnector_8_export_availability': 100.0,\n", - " 'electricity_interconnector_8_import_availability': 100.0,\n", - " 'electricity_interconnector_8_marginal_costs': 37.5999984001,\n", - " 'electricity_interconnector_9_capacity': 0.0,\n", - " 'electricity_interconnector_9_co2_emissions_future': 370.0000008,\n", - " 'electricity_interconnector_9_co2_emissions_present': 370.0000008,\n", - " 'electricity_interconnector_9_export_availability': 100.0,\n", - " 'electricity_interconnector_9_import_availability': 100.0,\n", - " 'electricity_interconnector_9_marginal_costs': 37.5999984001,\n", - " 'capacity_of_industry_chemical_flexibility_load_shifting_electricity': 35.0,\n", - " 'capacity_of_industry_metal_flexibility_load_shifting_electricity': 35.0,\n", - " 'capacity_of_industry_other_flexibility_load_shifting_electricity': 35.0,\n", - " 'capacity_of_industry_other_ict_flexibility_load_shifting_electricity': 30.0,\n", - " 'deficit_limit_of_industry_chemical_flexibility_load_shifting_electricity': 72.0,\n", - " 'deficit_limit_of_industry_metal_flexibility_load_shifting_electricity': 72.0,\n", - " 'deficit_limit_of_industry_other_flexibility_load_shifting_electricity': 72.0,\n", - " 'deficit_limit_of_industry_other_ict_flexibility_load_shifting_electricity': 24.0,\n", - " 'input_capacity_of_industry_chemical_flexibility_load_shifting_electricity': 35.0,\n", - " 'input_capacity_of_industry_metal_flexibility_load_shifting_electricity': 35.0,\n", - " 'input_capacity_of_industry_other_flexibility_load_shifting_electricity': 35.0,\n", - " 'input_capacity_of_industry_other_ict_flexibility_load_shifting_electricity': 30.0,\n", - " 'wta_of_industry_chemical_flexibility_load_shifting_electricity': 100.0,\n", - " 'wta_of_industry_metal_flexibility_load_shifting_electricity': 100.0,\n", - " 'wta_of_industry_other_flexibility_load_shifting_electricity': 100.0,\n", - " 'wta_of_industry_other_ict_flexibility_load_shifting_electricity': 100.0,\n", - " 'wtp_of_industry_chemicals_fertilizers_flexibility_p2h_electricity': 22.0,\n", - " 'wtp_of_industry_chemicals_other_flexibility_p2h_electricity': 22.0,\n", - " 'wtp_of_industry_chemicals_refineries_flexibility_p2h_electricity': 22.0,\n", - " 'wtp_of_industry_other_food_flexibility_p2h_electricity': 22.0,\n", - " 'wtp_of_industry_other_paper_flexibility_p2h_electricity': 22.0,\n", - " 'flexibility_residual_load_curve_moving_average': 72.0,\n", - " 'curtailment_of_buildings_solar_pv_solar_radiation': 55.0,\n", - " 'curtailment_of_energy_power_solar_pv_offshore': 55.0,\n", - " 'curtailment_of_energy_power_solar_pv_solar_radiation': 55.0,\n", - " 'curtailment_of_households_solar_pv_solar_radiation': 45.0,\n", - " 'settings_enable_storage_optimisation_transport_car_flexibility_p2p_electricity': 1.0,\n", - " 'transport_bus_using_electricity_availability': 0.0,\n", - " 'transport_car_using_electricity_availability': 17.5,\n", - " 'transport_car_using_electricity_custom_profile_charging_share': 100.0,\n", - " 'transport_car_using_electricity_fast_charging_share': 0.0,\n", - " 'transport_car_using_electricity_home_charging_share': 0.0,\n", - " 'transport_car_using_electricity_public_charging_share': 0.0,\n", - " 'transport_car_using_electricity_work_charging_share': 0.0,\n", - " 'transport_truck_using_electricity_availability': 0.0,\n", - " 'transport_van_using_electricity_availability': 0.0,\n", - " 'wta_of_transport_car_flexibility_p2p_electricity': 10.0,\n", - " 'wtp_of_transport_car_flexibility_p2p_electricity': 5.0,\n", - " 'flexibility_outdoor_temperature': 0.2125175493,\n", - " 'settings_weather_curve_set': 'default',\n", - " 'flh_of_energy_hydrogen_wind_turbine_offshore': 4000.0,\n", - " 'flh_of_energy_power_wind_turbine_coastal': 3200.000003,\n", - " 'flh_of_energy_power_wind_turbine_coastal_user_curve': 3200.000003,\n", - " 'flh_of_energy_power_wind_turbine_inland': 3200.000003,\n", - " 'flh_of_energy_power_wind_turbine_inland_user_curve': 3200.000003,\n", - " 'flh_of_energy_power_wind_turbine_offshore': 4750.000003461496,\n", - " 'flh_of_energy_power_wind_turbine_offshore_user_curve': 4750.000003461496,\n", - " 'flh_of_solar_pv_solar_radiation': 1012.334936,\n", - " 'flh_of_solar_pv_solar_radiation_user_curve': 1012.334936,\n", - " 'initial_updates_interconnector_curves': 0.0,\n", - " 'initial_updates_interconnector_prices': 0.0,\n", - " 'settings_enable_merit_order': 1.0,\n", - " 'energy_mix_capacity_per_unit_wind_turbine_inland': 3.0,\n", - " 'external_coupling_energy_production_synthetic_kerosene_demand': 0.0,\n", - " 'external_coupling_energy_production_synthetic_methanol_demand': 0.0,\n", - " 'external_coupling_molecules_other_utilisation_demand': 3.29209488358461,\n", - " 'external_coupling_industry_chemical_fertilizers_burner_coal_share': 0.0,\n", - " 'external_coupling_industry_chemical_fertilizers_burner_crude_oil_share': 0.0,\n", - " 'external_coupling_industry_chemical_fertilizers_burner_hydrogen_share': 50.6732983222066,\n", - " 'external_coupling_industry_chemical_fertilizers_burner_network_gas_share': 46.3963051101963,\n", - " 'external_coupling_industry_chemical_fertilizers_burner_wood_pellets_share': 0.0,\n", - " 'external_coupling_industry_chemical_fertilizers_combustion_ccus_capture_potential': 100.0,\n", - " 'external_coupling_industry_chemical_fertilizers_combustion_ccus_captured_co2': 0.0,\n", - " 'external_coupling_industry_chemical_fertilizers_combustion_ccus_electricity_use': 0.229514968527056,\n", - " 'external_coupling_industry_chemical_fertilizers_electricity': 475.351855618162,\n", - " 'external_coupling_industry_chemical_fertilizers_non_energetic_coal_share': 0.0,\n", - " 'external_coupling_industry_chemical_fertilizers_non_energetic_crude_oil_share': 0.0,\n", - " 'external_coupling_industry_chemical_fertilizers_non_energetic_hydrogen_share': 83.584159630957,\n", - " 'external_coupling_industry_chemical_fertilizers_non_energetic_network_gas_share': 16.415840369043,\n", - " 'external_coupling_industry_chemical_fertilizers_non_energetic_wood_pellets_share': 0.0,\n", - " 'external_coupling_industry_chemical_fertilizers_p2h_capacity': 0.0,\n", - " 'external_coupling_industry_chemical_fertilizers_processes_ccus_capture_potential': 100.0,\n", - " 'external_coupling_industry_chemical_fertilizers_processes_ccus_captured_co2': 100.0,\n", - " 'external_coupling_industry_chemical_fertilizers_processes_ccus_electricity_use': 0.229514968527056,\n", - " 'external_coupling_industry_chemical_fertilizers_residual_heat_share': 18.520027186658,\n", - " 'external_coupling_industry_chemical_fertilizers_steam_hot_water_share': 2.93039656759714,\n", - " 'external_coupling_industry_chemical_fertilizers_total_excluding_electricity': 94.05517289851,\n", - " 'external_coupling_industry_chemical_fertilizers_total_useable_heat_share': 15.4869053374752,\n", - " 'external_coupling_energy_chemical_other_transformation_external_coupling_node_ammonia_input_share': 0.0,\n", - " 'external_coupling_energy_chemical_other_transformation_external_coupling_node_ammonia_output_share': 0.0,\n", - " 'external_coupling_energy_chemical_other_transformation_external_coupling_node_crude_oil_input_share': 0.0,\n", - " 'external_coupling_energy_chemical_other_transformation_external_coupling_node_diesel_output_share': 0.0,\n", - " 'external_coupling_energy_chemical_other_transformation_external_coupling_node_electricity_input_share': 0.0,\n", - " 'external_coupling_energy_chemical_other_transformation_external_coupling_node_gasoline_output_share': 0.0,\n", - " 'external_coupling_energy_chemical_other_transformation_external_coupling_node_greengas_input_share': 0.0,\n", - " 'external_coupling_energy_chemical_other_transformation_external_coupling_node_greengas_output_share': 2.5662122493785073,\n", - " 'external_coupling_energy_chemical_other_transformation_external_coupling_node_heavy_fuel_oil_output_share': 0.0,\n", - " 'external_coupling_energy_chemical_other_transformation_external_coupling_node_hydrogen_input_share': 0.0,\n", - " 'external_coupling_energy_chemical_other_transformation_external_coupling_node_hydrogen_output_share': 28.3253720842459,\n", - " 'external_coupling_energy_chemical_other_transformation_external_coupling_node_kerosene_output_share': 0.0,\n", - " 'external_coupling_energy_chemical_other_transformation_external_coupling_node_loss_output_share': 0.0,\n", - " 'external_coupling_energy_chemical_other_transformation_external_coupling_node_lpg_output_share': 0.0,\n", - " 'external_coupling_energy_chemical_other_transformation_external_coupling_node_methanol_input_share': 0.0,\n", - " 'external_coupling_energy_chemical_other_transformation_external_coupling_node_methanol_output_share': 0.0,\n", - " 'external_coupling_energy_chemical_other_transformation_external_coupling_node_natural_gas_input_share': 0.0,\n", - " 'external_coupling_energy_chemical_other_transformation_external_coupling_node_natural_gas_output_share': 69.10841566637559,\n", - " 'external_coupling_energy_chemical_other_transformation_external_coupling_node_not_defined_input_share': 100.0,\n", - " 'external_coupling_energy_chemical_other_transformation_external_coupling_node_steam_hot_water_input_share': 0.0,\n", - " 'external_coupling_energy_chemical_other_transformation_external_coupling_node_total_demand': 145.02798773572636,\n", - " 'external_coupling_energy_chemical_other_transformation_external_coupling_node_waste_mix_input_share': 0.0,\n", - " 'external_coupling_energy_chemical_other_transformation_external_coupling_node_wood_pellets_input_share': 0.0,\n", - " 'external_coupling_industry_chemical_other_burner_coal_share': 0.0,\n", - " 'external_coupling_industry_chemical_other_burner_crude_oil_share': 4.15140444622588,\n", - " 'external_coupling_industry_chemical_other_burner_hydrogen_share': 38.163121847451,\n", - " 'external_coupling_industry_chemical_other_burner_network_gas_share': 44.1422501321988,\n", - " 'external_coupling_industry_chemical_other_burner_wood_pellets_share': 0.0,\n", - " 'external_coupling_industry_chemical_other_ccus_capture_potential': 100.0,\n", - " 'external_coupling_industry_chemical_other_ccus_captured_co2': 6.11129600882643,\n", - " 'external_coupling_industry_chemical_other_ccus_electricity_use': 0.124294429762498,\n", - " 'external_coupling_industry_chemical_other_electricity': 277.599988376699,\n", - " 'external_coupling_industry_chemical_other_heater_electricity_share': 0.0,\n", - " 'external_coupling_industry_chemical_other_heatpump_water_water_electricity_share': 0.0,\n", - " 'external_coupling_industry_chemical_other_non_energetic_coal_share': 0.0,\n", - " 'external_coupling_industry_chemical_other_non_energetic_crude_oil_share': 56.6568218227432,\n", - " 'external_coupling_industry_chemical_other_non_energetic_hydrogen_share': 6.74856929748537,\n", - " 'external_coupling_industry_chemical_other_non_energetic_network_gas_share': 11.3846995406033,\n", - " 'external_coupling_industry_chemical_other_non_energetic_wood_pellets_share': 25.2099093391682,\n", - " 'external_coupling_industry_chemical_other_p2h_capacity': 522.183604084003,\n", - " 'external_coupling_industry_chemical_other_residual_heat_share': 15.4433084571522,\n", - " 'external_coupling_industry_chemical_other_steam_hot_water_share': 13.5432235741243,\n", - " 'external_coupling_industry_chemical_other_steam_recompression_electricity_share': 0.0,\n", - " 'external_coupling_industry_chemical_other_total_non_energetic': 45.7297367916897,\n", - " 'external_coupling_industry_chemical_other_useable_heat': 33.9923944655155,\n", - " 'external_coupling_energy_chemical_refineries_transformation_external_coupling_node_ammonia_input_share': 0.0,\n", - " 'external_coupling_energy_chemical_refineries_transformation_external_coupling_node_ammonia_output_share': 0.0,\n", - " 'external_coupling_energy_chemical_refineries_transformation_external_coupling_node_crude_oil_input_share': 100.0,\n", - " 'external_coupling_energy_chemical_refineries_transformation_external_coupling_node_diesel_output_share': 28.8754407902916,\n", - " 'external_coupling_energy_chemical_refineries_transformation_external_coupling_node_electricity_input_share': 0.0,\n", - " 'external_coupling_energy_chemical_refineries_transformation_external_coupling_node_gasoline_output_share': 6.23530119017238,\n", - " 'external_coupling_energy_chemical_refineries_transformation_external_coupling_node_greengas_input_share': 0.0,\n", - " 'external_coupling_energy_chemical_refineries_transformation_external_coupling_node_greengas_output_share': 0.0,\n", - " 'external_coupling_energy_chemical_refineries_transformation_external_coupling_node_heavy_fuel_oil_output_share': 14.7654523402727,\n", - " 'external_coupling_energy_chemical_refineries_transformation_external_coupling_node_hydrogen_input_share': 0.0,\n", - " 'external_coupling_energy_chemical_refineries_transformation_external_coupling_node_hydrogen_output_share': 0.0,\n", - " 'external_coupling_energy_chemical_refineries_transformation_external_coupling_node_kerosene_output_share': 14.7523934475443,\n", - " 'external_coupling_energy_chemical_refineries_transformation_external_coupling_node_loss_output_share': 0.0,\n", - " 'external_coupling_energy_chemical_refineries_transformation_external_coupling_node_lpg_output_share': 2.25239174447402,\n", - " 'external_coupling_energy_chemical_refineries_transformation_external_coupling_node_methanol_input_share': 0.0,\n", - " 'external_coupling_energy_chemical_refineries_transformation_external_coupling_node_methanol_output_share': 0.0,\n", - " 'external_coupling_energy_chemical_refineries_transformation_external_coupling_node_natural_gas_input_share': 0.0,\n", - " 'external_coupling_energy_chemical_refineries_transformation_external_coupling_node_natural_gas_output_share': 0.0,\n", - " 'external_coupling_energy_chemical_refineries_transformation_external_coupling_node_not_defined_input_share': 0.0,\n", - " 'external_coupling_energy_chemical_refineries_transformation_external_coupling_node_not_defined_output_share': 3.58796542047281,\n", - " 'external_coupling_energy_chemical_refineries_transformation_external_coupling_node_steam_hot_water_input_share': 0.0,\n", - " 'external_coupling_energy_chemical_refineries_transformation_external_coupling_node_total_demand': 1889.958629148879,\n", - " 'external_coupling_energy_chemical_refineries_transformation_external_coupling_node_waste_mix_input_share': 0.0,\n", - " 'external_coupling_energy_chemical_refineries_transformation_external_coupling_node_wood_pellets_input_share': 0.0,\n", - " 'external_coupling_industry_chemical_refineries_burner_coal_share': 0.0,\n", - " 'external_coupling_industry_chemical_refineries_burner_crude_oil_share': 8.55291494528118,\n", - " 'external_coupling_industry_chemical_refineries_burner_hydrogen_share': 80.3160063659157,\n", - " 'external_coupling_industry_chemical_refineries_burner_network_gas_share': 10.7766510976364,\n", - " 'external_coupling_industry_chemical_refineries_burner_wood_pellets_share': 0.0,\n", - " 'external_coupling_industry_chemical_refineries_ccus_capture_potential': 100.0,\n", - " 'external_coupling_industry_chemical_refineries_ccus_captured_co2': 100.0,\n", - " 'external_coupling_industry_chemical_refineries_ccus_electricity_use': 0.030510017109512,\n", - " 'external_coupling_industry_chemical_refineries_electricity': 105.933269100756,\n", - " 'external_coupling_industry_chemical_refineries_p2h_capacity': 455.06386174751,\n", - " 'external_coupling_industry_chemical_refineries_residual_heat_share': 28.7767084382513,\n", - " 'external_coupling_industry_chemical_refineries_steam_hot_water_share': 0.354427591166749,\n", - " 'external_coupling_industry_chemical_refineries_useable_heat': 62.5640162386857,\n", - " 'external_coupling_energy_distribution_coal_gas_chemical_feedstock_share': 0.0,\n", - " 'external_coupling_energy_distribution_coal_gas_energy_production_share': 99.99,\n", - " 'external_coupling_energy_distribution_coal_gas_final_demand_share': 0.010000000000005116,\n", - " 'external_coupling_industry_metal_steel_blastfurnace_bof_share': 0.0,\n", - " 'external_coupling_industry_metal_steel_ccus_capture_potential': 100.0,\n", - " 'external_coupling_industry_metal_steel_ccus_captured_co2': 52.5547546810199,\n", - " 'external_coupling_industry_metal_steel_ccus_electricity_use': 0.57,\n", - " 'external_coupling_industry_metal_steel_cyclonefurnace_bof_share': 0.0,\n", - " 'external_coupling_industry_metal_steel_dri_hydrogen_share': 0.0,\n", - " 'external_coupling_industry_metal_steel_dri_network_gas_share': 0.0,\n", - " 'external_coupling_industry_metal_steel_efficiency': 7.31410052617644,\n", - " 'external_coupling_industry_metal_steel_energetic_coal_gas_share': 0.0,\n", - " 'external_coupling_industry_metal_steel_energetic_coal_share': 7.76726831346224,\n", - " 'external_coupling_industry_metal_steel_energetic_cokes_share': 0.0,\n", - " 'external_coupling_industry_metal_steel_energetic_crude_oil_share': 0.0,\n", - " 'external_coupling_industry_metal_steel_energetic_electricity_share': 22.7926669333398,\n", - " 'external_coupling_industry_metal_steel_energetic_hydrogen_share': 23.6267669198569,\n", - " 'external_coupling_industry_metal_steel_energetic_network_gas_share': 45.813297833341,\n", - " 'external_coupling_industry_metal_steel_energetic_steam_hot_water_share': 0.0,\n", - " 'external_coupling_industry_metal_steel_energetic_wood_pellets_share': 0.0,\n", - " 'external_coupling_industry_metal_steel_external_coupling_share': 100.0,\n", - " 'external_coupling_industry_metal_steel_fixed_om_costs': 316684316.043427,\n", - " 'external_coupling_industry_metal_steel_investment_costs': 4309820685.96129,\n", - " 'external_coupling_industry_metal_steel_scrap_hbi_eaf_share': 0.0,\n", - " 'external_coupling_industry_metal_steel_technical_lifetime': 19.0,\n", - " 'external_coupling_industry_metal_steel_total_demand': 97.33,\n", - " 'external_coupling_industry_metal_steel_wacc': 0.08,\n", - " 'external_coupling_biogenic_waste_max_demand': 27.8493698855199,\n", - " 'external_coupling_energy_chp_supercritical_ccs_waste_mix_captured_co2': 58.8235294117647,\n", - " 'external_coupling_energy_chp_supercritical_ccs_waste_mix_electrical_efficiency': 15.3827945040516,\n", - " 'external_coupling_energy_chp_supercritical_ccs_waste_mix_heat_efficiency': 1.23427917997262,\n", - " 'external_coupling_energy_chp_supercritical_waste_mix_capacity': 133.04294558354,\n", - " 'external_coupling_energy_chp_supercritical_waste_mix_electrical_efficiency': 15.3827945040516,\n", - " 'external_coupling_energy_chp_supercritical_waste_mix_heat_efficiency': 1.23427917997262,\n", - " 'external_coupling_non_biogenic_waste_max_demand': 23.3679305603854,\n", - " 'external_coupling_waste_mix_biogenic_waste_share': 54.9694458639823,\n", - " 'external_coupling_waste_mix_non_biogenic_waste_share': 45.0305541360177,\n", - " 'capacity_of_energy_imported_ammonia_baseload': 0.0,\n", - " 'max_demand_of_biogenic_waste': 21.38166,\n", - " 'max_demand_of_dry_biomass': 62.16023,\n", - " 'max_demand_of_oily_biomass': 10.5,\n", - " 'max_demand_of_wet_biomass': 109.873,\n", - " 'co_firing_biocoal_share': 0.0,\n", - " 'co_firing_coal_share': 100.0,\n", - " 'capacity_of_energy_chp_ultra_supercritical_coal': 0.0,\n", - " 'capacity_of_energy_chp_ultra_supercritical_cofiring_coal': 0.0,\n", - " 'capacity_of_energy_power_combined_cycle_coal': 0.0,\n", - " 'capacity_of_energy_power_supercritical_coal': 0.0,\n", - " 'capacity_of_energy_power_ultra_supercritical_coal': 0.0,\n", - " 'capacity_of_energy_power_ultra_supercritical_cofiring_coal': 0.0,\n", - " 'capacity_of_energy_power_ultra_supercritical_lignite': 0.0,\n", - " 'capacity_of_energy_chp_combined_cycle_network_gas': 56.0,\n", - " 'capacity_of_energy_chp_local_engine_network_gas': 0.0,\n", - " 'capacity_of_energy_power_combined_cycle_network_gas': 5280.0,\n", - " 'capacity_of_energy_power_engine_network_gas': 0.0,\n", - " 'capacity_of_energy_power_turbine_network_gas': 9.0,\n", - " 'capacity_of_energy_power_ultra_supercritical_network_gas': 11.0,\n", - " 'capacity_of_energy_power_nuclear_gen2_uranium_oxide': 0.0,\n", - " 'capacity_of_energy_power_nuclear_gen3_uranium_oxide': 0.0,\n", - " 'capacity_of_energy_power_nuclear_small_modular_reactor_uranium_oxide': 0.0,\n", - " 'merit_order_subtype_of_energy_power_nuclear_uranium_oxide': 0.0,\n", - " 'capacity_of_energy_power_engine_diesel': 0.0,\n", - " 'capacity_of_energy_power_ultra_supercritical_crude_oil': 0.0,\n", - " 'energy_mixer_for_gas_power_fuel_bio_oil_share': 0.0,\n", - " 'energy_mixer_for_gas_power_fuel_crude_oil_share': 7.9728731956,\n", - " 'energy_mixer_for_gas_power_fuel_natural_gas_share': 92.0271268045,\n", - " 'fuel_production_coal': 0.0,\n", - " 'fuel_production_crude_oil': 0.0,\n", - " 'fuel_production_lignite': 0.0,\n", - " 'fuel_production_natural_gas': 26.0,\n", - " 'fuel_production_uranium_oxide': 0.0,\n", - " 'green_gas_total_share': 37.7,\n", - " 'natural_gas_total_share': 62.3,\n", - " 'energy_biogas_fermentation_share': 50.0,\n", - " 'energy_greengas_gasification_dry_biomass_share': 25.0259259,\n", - " 'energy_greengas_gasification_wet_biomass_share': 24.9740741,\n", - " 'energy_regasification_lng_share': 1.4544312017,\n", - " 'energy_treatment_natural_gas_share': 98.5455687984,\n", - " 'capacity_of_agriculture_chp_engine_biogas': 0.0,\n", - " 'capacity_of_agriculture_chp_engine_network_gas_dispatchable': 207.0,\n", - " 'capacity_of_agriculture_chp_engine_network_gas_must_run': 0.0,\n", - " 'capacity_of_agriculture_chp_wood_pellets': 0.0,\n", - " 'capacity_of_energy_heat_burner_ht_coal': 0.0,\n", - " 'capacity_of_energy_heat_burner_ht_crude_oil': 0.0,\n", - " 'capacity_of_energy_heat_burner_ht_hydrogen': 0.0,\n", - " 'capacity_of_energy_heat_burner_ht_network_gas': 1000.0,\n", - " 'capacity_of_energy_heat_burner_ht_waste_mix': 0.0,\n", - " 'capacity_of_energy_heat_burner_ht_wood_pellets': 200.0,\n", - " 'capacity_of_energy_heat_heatpump_water_water_ht_electricity': 1500.0,\n", - " 'capacity_of_energy_heat_solar_ht_solar_thermal': 2500.0,\n", - " 'capacity_of_energy_heat_well_deep_ht_geothermal': 1400.0,\n", - " 'volume_of_ht_imported_heat': 0.0,\n", - " 'volume_of_ht_residual_heat': 25.714236461457922,\n", - " 'energy_heat_network_storage_ht_loss_share': 30.0000068049,\n", - " 'energy_heat_network_storage_ht_steam_hot_water_output_capacity_share': 200.0,\n", - " 'heat_storage_enabled_ht': 1.0,\n", - " 'energy_heat_distribution_ht_loss_share': 15.0,\n", - " 'co2_emissions_of_imported_heat': 35.97,\n", - " 'capacity_of_industry_chp_combined_cycle_gas_power_fuelmix': 478.0,\n", - " 'capacity_of_industry_chp_engine_gas_power_fuelmix': 62.0,\n", - " 'capacity_of_industry_chp_turbine_gas_power_fuelmix': 647.0,\n", - " 'capacity_of_industry_chp_turbine_hydrogen': 0.0,\n", - " 'capacity_of_industry_chp_ultra_supercritical_coal': 0.0,\n", - " 'capacity_of_industry_chp_wood_pellets': 0.0,\n", - " 'capacity_of_industry_heat_burner_coal': 0.0,\n", - " 'capacity_of_industry_heat_burner_crude_oil': 0.0,\n", - " 'capacity_of_industry_heat_burner_hydrogen': 0.0,\n", - " 'capacity_of_industry_heat_burner_lignite': 0.0,\n", - " 'capacity_of_industry_heat_well_geothermal': 0.0,\n", - " 'capacity_of_energy_hydrogen_ammonia_reformer_must_run': 0.0,\n", - " 'capacity_of_energy_hydrogen_autothermal_reformer_must_run': 0.0,\n", - " 'capacity_of_energy_hydrogen_biomass_gasification': 201.59999999999997,\n", - " 'capacity_of_energy_hydrogen_solar_pv_solar_radiation': 0.0,\n", - " 'capacity_of_energy_hydrogen_steam_methane_reformer_must_run': 2422.711775504852,\n", - " 'capacity_of_energy_hydrogen_wind_turbine_offshore': 2640.0,\n", - " 'capacity_of_energy_imported_hydrogen_baseload': 5459.0,\n", - " 'capacity_of_energy_hydrogen_storage_salt_cavern': 428.64444379753854,\n", - " 'volume_of_energy_hydrogen_storage_salt_cavern': 11.151657026441995,\n", - " 'energy_hydrogen_distribution_compressed_trucks_share': 1.0,\n", - " 'energy_hydrogen_transport_pipelines_share': 99.0,\n", - " 'agriculture_bio_kerosene_in_crude_oil_share': 0.0,\n", - " 'agriculture_biodiesel_in_crude_oil_share': 53.5628368135,\n", - " 'agriculture_diesel_in_crude_oil_share': 42.975430639,\n", - " 'agriculture_kerosene_in_crude_oil_share': 0.0,\n", - " 'agriculture_lpg_in_crude_oil_share': 3.4617325477,\n", - " 'agriculture_other_bio_oil_in_crude_oil_share': 0.0,\n", - " 'agriculture_other_oil_in_crude_oil_share': 0.0,\n", - " 'buildings_bio_kerosene_in_crude_oil_share': 0.0,\n", - " 'buildings_biodiesel_in_crude_oil_share': 0.0,\n", - " 'buildings_diesel_in_crude_oil_share': 54.3798623065,\n", - " 'buildings_kerosene_in_crude_oil_share': 0.114329433,\n", - " 'buildings_lpg_in_crude_oil_share': 42.7920472269,\n", - " 'buildings_other_bio_oil_in_crude_oil_share': 2.3839238021,\n", - " 'buildings_other_oil_in_crude_oil_share': 0.3298372318,\n", - " 'households_bio_kerosene_in_crude_oil_share': 0.0,\n", - " 'households_biodiesel_in_crude_oil_share': 0.0,\n", - " 'households_diesel_in_crude_oil_share': 20.1462563364,\n", - " 'households_kerosene_in_crude_oil_share': 15.5535857733,\n", - " 'households_lpg_in_crude_oil_share': 64.3001578904,\n", - " 'households_other_bio_oil_in_crude_oil_share': 0.0,\n", - " 'households_other_oil_in_crude_oil_share': 0.0,\n", - " 'industry_bio_kerosene_in_crude_oil_share': 0.0,\n", - " 'industry_biodiesel_in_crude_oil_share': 0.035695073,\n", - " 'industry_diesel_in_crude_oil_share': 0.006797406,\n", - " 'industry_kerosene_in_crude_oil_share': 0.0,\n", - " 'industry_lpg_in_crude_oil_share': 0.526530287,\n", - " 'industry_other_bio_oil_in_crude_oil_share': 33.70284273,\n", - " 'industry_other_oil_in_crude_oil_share': 65.72813451,\n", - " 'capacity_of_energy_chp_local_engine_biogas': 105.2173341123,\n", - " 'capacity_of_energy_chp_local_wood_pellets_dispatchable': 49.4967396253,\n", - " 'capacity_of_energy_power_geothermal': 0.0,\n", - " 'capacity_of_energy_power_hydro_river': 37.0013815462,\n", - " 'capacity_of_energy_power_combined_cycle_hydrogen': 3520.0,\n", - " 'capacity_of_energy_power_turbine_hydrogen': 7040.0,\n", - " 'capacity_of_buildings_solar_pv_solar_radiation': 44300.0,\n", - " 'capacity_of_energy_battery_solar_pv_solar_radiation': 0.0,\n", - " 'capacity_of_energy_power_solar_pv_offshore': 0.0,\n", - " 'capacity_of_energy_power_solar_pv_solar_radiation': 41800.0,\n", - " 'capacity_of_households_solar_pv_solar_radiation': 40000.0,\n", - " 'capacity_of_energy_chp_supercritical_waste_mix': 894.6490091117,\n", - " 'capacity_of_energy_power_supercritical_waste_mix': 0.0,\n", - " 'capacity_of_energy_battery_wind_turbine_inland': 0.0,\n", - " 'capacity_of_energy_power_wind_turbine_coastal': 4000.0,\n", - " 'capacity_of_energy_power_wind_turbine_inland': 8100.0,\n", - " 'capacity_of_energy_power_wind_turbine_offshore': 32000.0}" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# We also distinguish between inputs and user_values. Usually user values are more interesting:\n", - "user_values = scenario.user_values()\n", - "# Check if we can make this also to_dataframe\n", - "user_values" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "fca99519", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Empty DataFrame\n", - "Columns: []\n", - "Index: []\n" - ] - } - ], - "source": [ - "# Execute gqueries to fetch data from ETM (incl. units)\n", - "gqueries = scenario.results()\n", - "print(gqueries)" - ] - }, - { - "cell_type": "markdown", - "id": "fd5267db", - "metadata": {}, - "source": [ - "There are no default gqueries, you need to specify them yourself - hence the empty dataframe ." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "ed984767", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " future\n", - "gquery unit \n", - "dashboard_emissions factor -0.780545\n" - ] - } - ], - "source": [ - "scenario.add_queries([\"dashboard_emissions\"])\n", - "gqueries = scenario.results()\n", - "print(gqueries)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5b0d61ec", - "metadata": {}, - "outputs": [], - "source": [ - "# Optional: Fetch hourly electricity price profiles from ETM\n", - "custom_curves = scenario.custom_curves_series()\n", - "for key in custom_curves: print(key)" - ] - }, - { - "cell_type": "markdown", - "id": "ddd8fa69", - "metadata": {}, - "source": [ - "#TODO: Discuss\n", - "\n", - "Do you want a convenient way to only get the custom curves related to electricity price? Or are you more interested in the carrier curves? " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6a57a5bf", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'merit_order': agriculture_chp_engine_biogas.output (MW) \\\n", - " 0 0.0 \n", - " 1 0.0 \n", - " 2 0.0 \n", - " 3 0.0 \n", - " 4 0.0 \n", - " ... ... \n", - " 8755 0.0 \n", - " 8756 0.0 \n", - " 8757 0.0 \n", - " 8758 0.0 \n", - " 8759 0.0 \n", - " \n", - " agriculture_chp_engine_network_gas_dispatchable.output (MW) \\\n", - " 0 0.0 \n", - " 1 0.0 \n", - " 2 0.0 \n", - " 3 0.0 \n", - " 4 0.0 \n", - " ... ... \n", - " 8755 0.0 \n", - " 8756 0.0 \n", - " 8757 0.0 \n", - " 8758 0.0 \n", - " 8759 0.0 \n", - " \n", - " agriculture_chp_engine_network_gas_must_run.output (MW) \\\n", - " 0 0.0 \n", - " 1 0.0 \n", - " 2 0.0 \n", - " 3 0.0 \n", - " 4 0.0 \n", - " ... ... \n", - " 8755 0.0 \n", - " 8756 0.0 \n", - " 8757 0.0 \n", - " 8758 0.0 \n", - " 8759 0.0 \n", - " \n", - " agriculture_chp_wood_pellets.output (MW) \\\n", - " 0 0.0 \n", - " 1 0.0 \n", - " 2 0.0 \n", - " 3 0.0 \n", - " 4 0.0 \n", - " ... ... \n", - " 8755 0.0 \n", - " 8756 0.0 \n", - " 8757 0.0 \n", - " 8758 0.0 \n", - " 8759 0.0 \n", - " \n", - " agriculture_flexibility_p2h_hydrogen_electricity.output (MW) \\\n", - " 0 0.0 \n", - " 1 0.0 \n", - " 2 0.0 \n", - " 3 0.0 \n", - " 4 0.0 \n", - " ... ... \n", - " 8755 0.0 \n", - " 8756 0.0 \n", - " 8757 0.0 \n", - " 8758 0.0 \n", - " 8759 0.0 \n", - " \n", - " agriculture_flexibility_p2h_network_gas_electricity.output (MW) \\\n", - " 0 0.0 \n", - " 1 0.0 \n", - " 2 0.0 \n", - " 3 0.0 \n", - " 4 0.0 \n", - " ... ... \n", - " 8755 0.0 \n", - " 8756 0.0 \n", - " 8757 0.0 \n", - " 8758 0.0 \n", - " 8759 0.0 \n", - " \n", - " buildings_solar_pv_solar_radiation.output (MW) \\\n", - " 0 0.0 \n", - " 1 0.0 \n", - " 2 0.0 \n", - " 3 0.0 \n", - " 4 0.0 \n", - " ... ... \n", - " 8755 0.0 \n", - " 8756 0.0 \n", - " 8757 0.0 \n", - " 8758 0.0 \n", - " 8759 0.0 \n", - " \n", - " energy_battery_solar_electricity.output (MW) \\\n", - " 0 0.0 \n", - " 1 0.0 \n", - " 2 0.0 \n", - " 3 0.0 \n", - " 4 0.0 \n", - " ... ... \n", - " 8755 0.0 \n", - " 8756 0.0 \n", - " 8757 0.0 \n", - " 8758 0.0 \n", - " 8759 0.0 \n", - " \n", - " energy_battery_wind_electricity.output (MW) \\\n", - " 0 0.0 \n", - " 1 0.0 \n", - " 2 0.0 \n", - " 3 0.0 \n", - " 4 0.0 \n", - " ... ... \n", - " 8755 0.0 \n", - " 8756 0.0 \n", - " 8757 0.0 \n", - " 8758 0.0 \n", - " 8759 0.0 \n", - " \n", - " energy_chp_coal_gas.output (MW) ... \\\n", - " 0 0.0 ... \n", - " 1 0.0 ... \n", - " 2 0.0 ... \n", - " 3 0.0 ... \n", - " 4 0.0 ... \n", - " ... ... ... \n", - " 8755 0.0 ... \n", - " 8756 0.0 ... \n", - " 8757 0.0 ... \n", - " 8758 0.0 ... \n", - " 8759 0.0 ... \n", - " \n", - " transport_motorcycle_using_electricity.input (MW) \\\n", - " 0 6.0868 \n", - " 1 2.2664 \n", - " 2 1.0671 \n", - " 3 0.7418 \n", - " 4 0.7422 \n", - " ... ... \n", - " 8755 29.4081 \n", - " 8756 19.4375 \n", - " 8757 11.9942 \n", - " 8758 10.6178 \n", - " 8759 9.7232 \n", - " \n", - " transport_passenger_train_using_electricity.input (MW) \\\n", - " 0 100.6524 \n", - " 1 37.4773 \n", - " 2 17.6460 \n", - " 3 12.2670 \n", - " 4 12.2725 \n", - " ... ... \n", - " 8755 486.2939 \n", - " 8756 321.4203 \n", - " 8757 198.3364 \n", - " 8758 175.5763 \n", - " 8759 160.7839 \n", - " \n", - " transport_plane_using_electricity.input (MW) \\\n", - " 0 2.0642 \n", - " 1 2.0642 \n", - " 2 2.0642 \n", - " 3 2.0642 \n", - " 4 2.0642 \n", - " ... ... \n", - " 8755 2.0642 \n", - " 8756 2.0642 \n", - " 8757 2.0642 \n", - " 8758 2.0642 \n", - " 8759 2.0642 \n", - " \n", - " transport_ship_using_electricity.input (MW) \\\n", - " 0 29.8321 \n", - " 1 30.9370 \n", - " 2 30.9370 \n", - " 3 30.9370 \n", - " 4 30.9370 \n", - " ... ... \n", - " 8755 33.7494 \n", - " 8756 31.9414 \n", - " 8757 26.5174 \n", - " 8758 26.5174 \n", - " 8759 26.5174 \n", - " \n", - " transport_tram_using_electricity.input (MW) \\\n", - " 0 1.8122 \n", - " 1 0.6748 \n", - " 2 0.3177 \n", - " 3 0.2209 \n", - " 4 0.2210 \n", - " ... ... \n", - " 8755 8.7557 \n", - " 8756 5.7871 \n", - " 8757 3.5710 \n", - " 8758 3.1612 \n", - " 8759 2.8949 \n", - " \n", - " transport_truck_flexibility_p2p_electricity.input (MW) \\\n", - " 0 0.0 \n", - " 1 0.0 \n", - " 2 0.0 \n", - " 3 0.0 \n", - " 4 0.0 \n", - " ... ... \n", - " 8755 0.0 \n", - " 8756 0.0 \n", - " 8757 0.0 \n", - " 8758 0.0 \n", - " 8759 0.0 \n", - " \n", - " transport_truck_using_electricity.input (MW) \\\n", - " 0 301.1724 \n", - " 1 255.8993 \n", - " 2 255.7102 \n", - " 3 255.7102 \n", - " 4 255.7562 \n", - " ... ... \n", - " 8755 3632.1744 \n", - " 8756 3654.7956 \n", - " 8757 3290.3259 \n", - " 8758 2912.0708 \n", - " 8759 2633.8673 \n", - " \n", - " transport_van_flexibility_p2p_electricity.input (MW) \\\n", - " 0 0.0 \n", - " 1 0.0 \n", - " 2 0.0 \n", - " 3 0.0 \n", - " 4 0.0 \n", - " ... ... \n", - " 8755 0.0 \n", - " 8756 0.0 \n", - " 8757 0.0 \n", - " 8758 0.0 \n", - " 8759 0.0 \n", - " \n", - " transport_van_using_electricity.input (MW) deficit \n", - " 0 225.7143 0.0 \n", - " 1 183.4868 0.0 \n", - " 2 164.2823 0.0 \n", - " 3 152.3737 0.0 \n", - " 4 145.7294 0.0 \n", - " ... ... ... \n", - " 8755 1951.6292 0.0 \n", - " 8756 1756.9386 0.0 \n", - " 8757 1423.4249 0.0 \n", - " 8758 1141.5322 0.0 \n", - " 8759 1016.2915 0.0 \n", - " \n", - " [8760 rows x 284 columns],\n", - " 'electricity_price': Price (Euros)\n", - " 0 22.00\n", - " 1 22.00\n", - " 2 14.48\n", - " 3 0.01\n", - " 4 0.02\n", - " ... ...\n", - " 8755 0.01\n", - " 8756 0.01\n", - " 8757 0.01\n", - " 8758 0.02\n", - " 8759 0.00\n", - " \n", - " [8760 rows x 1 columns],\n", - " 'residual_load': Electricity imbalance (MW) Heat network imbalance (MW) \\\n", - " 0 -13983.316952 -7650.762461 \n", - " 1 -15074.662973 -2063.605451 \n", - " 2 -16392.624827 -236.749238 \n", - " 3 -18084.064350 -7257.637108 \n", - " 4 -18698.295084 -6777.697551 \n", - " ... ... ... \n", - " 8755 -10461.245439 -2908.084718 \n", - " 8756 -12120.991687 -3196.334417 \n", - " 8757 -14277.783965 -3698.939229 \n", - " 8758 -12769.564116 -4265.195281 \n", - " 8759 -14036.141852 -5382.621751 \n", - " \n", - " Network gas imbalance (MW) Hydrogen imbalance (MW) \\\n", - " 0 -4781.342416 -10122.196681 \n", - " 1 -3483.696797 -9409.232452 \n", - " 2 -3475.263835 -9413.765713 \n", - " 3 -4570.081283 -10137.602583 \n", - " 4 -4175.876527 -10138.862839 \n", - " ... ... ... \n", - " 8755 -1895.359218 -10120.066139 \n", - " 8756 -2098.834088 -10121.282579 \n", - " 8757 -2551.241935 -10122.752998 \n", - " 8758 -2865.165589 -10123.043235 \n", - " 8759 -3823.803492 -10123.672193 \n", - " \n", - " Network gas imbalance (short timescale) (MW) \\\n", - " 0 -1833.873449 \n", - " 1 -574.860579 \n", - " 2 -605.611833 \n", - " 3 -1739.687791 \n", - " 4 -1383.891692 \n", - " ... ... \n", - " 8755 1241.238351 \n", - " 8756 1013.073005 \n", - " 8757 519.009108 \n", - " 8758 160.843578 \n", - " 8759 -837.070806 \n", - " \n", - " Network gas imbalance (long timescale) (MW) \\\n", - " 0 -2947.468967 \n", - " 1 -2908.836218 \n", - " 2 -2869.652003 \n", - " 3 -2830.393493 \n", - " 4 -2791.984835 \n", - " ... ... \n", - " 8755 -3136.597568 \n", - " 8756 -3111.907093 \n", - " 8757 -3070.251043 \n", - " 8758 -3026.009167 \n", - " 8759 -2986.732687 \n", - " \n", - " Hydrogen imblanace (short timescale) (MW) \\\n", - " 0 -171.967531 \n", - " 1 529.822127 \n", - " 2 514.208089 \n", - " 3 -220.919672 \n", - " 4 -232.647398 \n", - " ... ... \n", - " 8755 -83.391025 \n", - " 8756 -103.105800 \n", - " 8757 -122.762259 \n", - " 8758 -140.510517 \n", - " 8759 -159.955285 \n", - " \n", - " Hydrogen imblanace (long timescale) (MW) \n", - " 0 -9950.229150 \n", - " 1 -9939.054580 \n", - " 2 -9927.973802 \n", - " 3 -9916.682911 \n", - " 4 -9906.215441 \n", - " ... ... \n", - " 8755 -10036.675114 \n", - " 8756 -10018.176778 \n", - " 8757 -9999.990739 \n", - " 8758 -9982.532718 \n", - " 8759 -9963.716908 \n", - " \n", - " [8760 rows x 8 columns]}" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Optional: Fetch hourly carrier profiles from ETM\n", - "output_curves = scenario.get_output_curves(carrier_type='electricity')\n", - "# Also serval carriers at ones. One carrier per sheet, with carrier name as sheet name\n", - "output_curves" - ] - }, - { - "cell_type": "markdown", - "id": "f29ee72f", - "metadata": {}, - "source": [ - "As you can see, this returns a dictionary of dataframes, including the merit_order, electricity_price and residual_load dataframes. If you want a specific output, just request it:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5366a81c", - "metadata": {}, - "outputs": [], - "source": [ - "electricity_price = scenario.output_curve(curve_name='electricity_price')\n", - "# Also in it's own sheet\n", - "# Hydrogen price also in it's own sheet\n", - "\n", - "# Nice to have: also make other downloads like sankey and energy_flows available\n", - "electricity_price" - ] - }, - { - "cell_type": "markdown", - "id": "638116c5", - "metadata": {}, - "source": [ - "**Export scenarios to Excel**\n", - "\n", - "Just like with the original implementation, everything in the scenario can be exported to an excel file. This is done via a \"Scenario Packer\" which organises the data usefully to display via excel.\n", - "\n", - "This example is simplified in the sense that we just add everything in the scenario to the packer, but you can also add specific inputs, gqueries curves etc to a packer (see more examples in the scenario_to_excel notebook)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4266f27d", - "metadata": {}, - "outputs": [], - "source": [ - "from pyetm.models import ScenarioPacker\n", - "\n", - "packer = ScenarioPacker()\n", - "packer.add(scenario, scenario2, scenario3)\n", - "packer.to_excel('folder/my_excel.xlsx')\n", - "\n", - "# Specify explicitly what to export in to_excel\n", - "packer.to_excel('folder/my_excel.xlsx', include_curves=True)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "pyetm-qKH2ozgc", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/examples/scenario_to_excel.ipynb b/examples/scenario_to_excel.ipynb deleted file mode 100644 index 6071b68..0000000 --- a/examples/scenario_to_excel.ipynb +++ /dev/null @@ -1,215 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "930300db", - "metadata": {}, - "source": [ - "## Preamble" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4e9a9e7c", - "metadata": {}, - "outputs": [], - "source": [ - "from example_helpers import setup_notebook\n", - "from pyetm.models import Scenario\n", - "\n", - "setup_notebook()" - ] - }, - { - "cell_type": "markdown", - "id": "1f4414c0", - "metadata": {}, - "source": [ - "## Picking my scenario" - ] - }, - { - "cell_type": "markdown", - "id": "c3cd461f", - "metadata": {}, - "source": [ - "Use an API session ID to load up one of your scenarios.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c4f42def", - "metadata": {}, - "outputs": [], - "source": [ - "# Example beta scenario\n", - "scenario = Scenario.load(2690456)\n", - "\n", - "# Example pro scenario\n", - "# scenario = Scenario.load(1340415)" - ] - }, - { - "cell_type": "markdown", - "id": "8d946757", - "metadata": {}, - "source": [ - "## Create a Packer\n", - "\n", - "The scenario packer allows you to collect scenarios and define what information you want to extract from all of them. It helps to collect all info into dataframes or Excel.\n", - "\n", - "- **Main info** with `main_info()` you display all meta information about the scenarios, like area code and end years;\n", - "\n", - "- Input settings\n", - " - **Inputs** `inputs()` displays all inputs for the scenario including their unit, default and user-set values;\n", - " - **Custom curves** using `custom_curves()` you can retrieve and display the curves uploaded to the scenario;\n", - " - **Sortables** `sortables()` shows all user sortables set for the scenario, like heat network orders, etc;\n", - "- Outputs:\n", - " - **GQuery results** with `gquery_results()` you can retrieve the queries that were prepared for the scenarios;\n", - " - **Output curves** `output_curves()` downloads and shows the carreir curves requested for the scenarios.\n", - "\n", - "\n", - "Scenarios can be added to a packer in multiple ways:\n", - "\n", - "- `add(*scenarios)` will ready the scenario for all 6 packs (or Excel tabs) described above\n", - "- `add_inputs(*scenarios)` will only ready the scenarios for the inputs dataframe or Excel tab\n", - "- `add_sortables(*scenarios)` will only ready the scenarios for the sortables dataframe or Excel tab\n", - "- `add_custom_curves(*scenarios)` will only ready the scenarios for the custom_curves dataframe or Excel tab\n", - "- `add_output_curves(*scenarios)` will only ready the scenarios for the output_curves dataframe or Excel tab\n", - "\n", - "If a scenario is added in any of the individual packs, it will be automatically added for main info and prepared gqueries." - ] - }, - { - "cell_type": "markdown", - "id": "a9d9214a", - "metadata": {}, - "source": [ - "-----------------\n", - "\n", - "NOTE: the packer currently only works for a single scenario!\n", - "\n", - "-----------------" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "fa8ac6ab", - "metadata": {}, - "outputs": [], - "source": [ - "from pyetm.models import ScenarioPacker\n", - "\n", - "packer = ScenarioPacker()\n", - "\n", - "scenario = Scenario.load(2690456)\n", - "scenario2 = Scenario.load(2690455)\n", - "# Ready the scenario for inputs\n", - "packer.add_inputs(scenario)\n", - "packer.add_inputs(scenario2)\n", - "\n", - "# Main info is automatically readied\n", - "print(packer.inputs())\n", - "print(packer.main_info())\n" - ] - }, - { - "cell_type": "markdown", - "id": "ed1cefd4", - "metadata": {}, - "source": [ - "When you add gqueries to a scenario which is connected to the packer, these queries will be readied for the pack." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "739e2a12", - "metadata": {}, - "outputs": [], - "source": [ - "scenario.add_queries(\n", - " [\"dashboard_total_costs\", \"dashboard_co2_emissions_versus_start_year\"]\n", - ")\n", - "\n", - "print(packer.gquery_results())" - ] - }, - { - "cell_type": "markdown", - "id": "c924ac3d", - "metadata": {}, - "source": [ - "Queries can be added on-the-go. When the packer is exported to Excel, all requested queries will show up." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ce5e2bdb", - "metadata": {}, - "outputs": [], - "source": [ - "scenario.add_queries(\n", - " [\"dashboard_emissions\"]\n", - ")\n", - "\n", - "scenario2.add_queries(\n", - " [\"dashboard_emissions\"]\n", - ")\n", - "\n", - "packer.to_excel('my_excel.xlsx')" - ] - }, - { - "cell_type": "markdown", - "id": "68ce86c3", - "metadata": {}, - "source": [ - "Output curves:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "bffd54b8", - "metadata": {}, - "outputs": [], - "source": [ - "packer.add_output_curves(scenario)\n", - "packer.add_output_curves(scenario2)\n", - "packer.add_custom_curves(scenario)\n", - "packer.add_custom_curves(scenario2)\n", - "packer.add_sortables(scenario)\n", - "packer.add_sortables(scenario2)\n", - "\n", - "\n", - "# packer.to_excel('testing_output_curves.xlsx')" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "pyetm-qKH2ozgc", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/examples/serialization_deserialization.ipynb b/examples/serialization_deserialization.ipynb deleted file mode 100644 index b2b130a..0000000 --- a/examples/serialization_deserialization.ipynb +++ /dev/null @@ -1,241 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "a1b2c3d4", - "metadata": {}, - "source": [ - "# Input Serialization/Deserialization\n", - "\n", - "This notebook demonstrates the serialization and deserialization capabilities of the `Inputs` model.\n", - "We'll load a scenario, serialize its inputs to a DataFrame, deserialize them back to objects,\n", - "and verify with some stats.\n", - "\n", - "## Setup" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "setup_cell", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Environment setup complete\n", - " Using ETM API at https://beta.engine.energytransitionmodel.com/api/v3\n", - " Token loaded? True\n", - "API connection ready\n" - ] - } - ], - "source": [ - "from example_helpers import setup_notebook\n", - "from pyetm.models import Scenario\n", - "\n", - "setup_notebook()\n", - "scenario = Scenario.load(2690288)\n", - "scenario.update_user_values({\n", - " \"climate_relevant_co2_biomass_gas_future\": 20.0\n", - "})" - ] - }, - { - "cell_type": "markdown", - "id": "original_data", - "metadata": {}, - "source": [ - "## Step 1: Examine Original Inputs\n", - "\n", - "Let's look at the original inputs and collect some basic statistics:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "examine_original", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Some inputs:\n", - " climate_relevant_co2_biomass_gas_future (%): default=0.0, user=20.0\n", - " climate_relevant_co2_biomass_gas_present (%): default=0.0, user=None\n", - " climate_relevant_co2_biomass_liquid_future (%): default=0.0, user=None\n" - ] - } - ], - "source": [ - "original_inputs = scenario.inputs\n", - "\n", - "print(\"Some inputs:\")\n", - "for i, input in enumerate(original_inputs):\n", - " if i < 3:\n", - " print(f\" {input.key} ({input.unit}): default={input.default}, user={input.user}\")\n", - " elif i == 3:\n", - " break" - ] - }, - { - "cell_type": "markdown", - "id": "serialization", - "metadata": {}, - "source": [ - "## Step 2: Serialize to DataFrame\n", - "\n", - "Convert the inputs to a DataFrame for inspection and storage:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "serialize", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "DataFrame shape: (1318, 5)\n", - "DataFrame index: ['input', 'unit']\n", - "DataFrame columns: ['user', 'default', 'min', 'max', 'disabled']\n", - " user default min max \\\n", - "input unit \n", - "climate_relevant_co2_biomass_gas_future % 20.0 0.0 0.0 100.0 \n", - "climate_relevant_co2_biomass_gas_present % NaN 0.0 0.0 100.0 \n", - "climate_relevant_co2_biomass_liquid_future % NaN 0.0 0.0 100.0 \n", - "climate_relevant_co2_biomass_liquid_present % NaN 0.0 0.0 100.0 \n", - "climate_relevant_co2_biomass_solid_future % NaN 0.0 0.0 100.0 \n", - "\n", - " disabled \n", - "input unit \n", - "climate_relevant_co2_biomass_gas_future % False \n", - "climate_relevant_co2_biomass_gas_present % False \n", - "climate_relevant_co2_biomass_liquid_future % False \n", - "climate_relevant_co2_biomass_liquid_present % False \n", - "climate_relevant_co2_biomass_solid_future % False \n" - ] - } - ], - "source": [ - "# Serialize to DataFrame with multiple columns\n", - "df = original_inputs.to_dataframe(columns=[\"user\", \"default\", \"min\", \"max\", \"disabled\"])\n", - "\n", - "print(f\"DataFrame shape: {df.shape}\")\n", - "print(f\"DataFrame index: {df.index.names}\")\n", - "print(f\"DataFrame columns: {list(df.columns)}\")\n", - "\n", - "print(df.head())" - ] - }, - { - "cell_type": "markdown", - "id": "deserialization", - "metadata": {}, - "source": [ - "## Step 3: Deserialize from DataFrame\n", - "\n", - "Convert the DataFrame back to Input objects:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "deserialize", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "DataFrame shape: (1318, 1)\n", - "DataFrame index: ['input', 'unit']\n", - "DataFrame columns: ['user']\n", - " user\n", - "input unit \n", - "climate_relevant_co2_biomass_gas_future % 20.0\n", - "climate_relevant_co2_biomass_gas_present % NaN\n", - "climate_relevant_co2_biomass_liquid_future % NaN\n", - "climate_relevant_co2_biomass_liquid_present % NaN\n", - "climate_relevant_co2_biomass_solid_future % NaN\n", - " user default min max \\\n", - "input unit \n", - "climate_relevant_co2_biomass_gas_future % 20.0 0.0 0.0 100.0 \n", - "climate_relevant_co2_biomass_gas_present % NaN 0.0 0.0 100.0 \n", - "climate_relevant_co2_biomass_liquid_future % NaN 0.0 0.0 100.0 \n", - "climate_relevant_co2_biomass_liquid_present % NaN 0.0 0.0 100.0 \n", - "climate_relevant_co2_biomass_solid_future % NaN 0.0 0.0 100.0 \n", - "\n", - " disabled \n", - "input unit \n", - "climate_relevant_co2_biomass_gas_future % False \n", - "climate_relevant_co2_biomass_gas_present % False \n", - "climate_relevant_co2_biomass_liquid_future % False \n", - "climate_relevant_co2_biomass_liquid_present % False \n", - "climate_relevant_co2_biomass_solid_future % False \n", - "\n", - "No deserialization warnings!\n", - "Same inputs:\n", - " climate_relevant_co2_biomass_gas_future (%): default=0.0, user=20.0\n", - " climate_relevant_co2_biomass_gas_present (%): default=0.0, user=None\n", - " climate_relevant_co2_biomass_liquid_future (%): default=0.0, user=None\n" - ] - } - ], - "source": [ - "scenario.set_user_values_from_dataframe(df)\n", - "reconstructed_inputs = scenario.inputs\n", - "\n", - "print(f\"DataFrame shape: {reconstructed_inputs.to_dataframe().shape}\")\n", - "print(f\"DataFrame index: {reconstructed_inputs.to_dataframe().index.names}\")\n", - "print(f\"DataFrame columns: {list(reconstructed_inputs.to_dataframe().columns)}\")\n", - "\n", - "print(reconstructed_inputs.to_dataframe().head())\n", - "\n", - "df_again = reconstructed_inputs.to_dataframe(columns=[\"user\", \"default\", \"min\", \"max\", \"disabled\"])\n", - "\n", - "print(df_again.head())\n", - "\n", - "# Check for warnings during deserialization\n", - "if reconstructed_inputs.warnings:\n", - " print(f\"\\nDeserialization warnings ({len(reconstructed_inputs.warnings)}):\")\n", - " reconstructed_inputs.show_warnings()\n", - "else:\n", - " print(\"\\nNo deserialization warnings!\")\n", - "\n", - "\n", - "print(\"Same inputs:\")\n", - "for i, input in enumerate(reconstructed_inputs):\n", - " if i < 3:\n", - " print(f\" {input.key} ({input.unit}): default={input.default}, user={input.user}\")\n", - " elif i == 3:\n", - " break" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "pyetm-FWBOHxp3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.11" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..19a8b5d --- /dev/null +++ b/poetry.lock @@ -0,0 +1,3036 @@ +# This file is automatically @generated by Poetry 2.1.4 and should not be changed by hand. + +[[package]] +name = "annotated-types" +version = "0.7.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +groups = ["main"] +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.10.0" +description = "High-level concurrency and networking framework on top of asyncio or Trio" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "anyio-4.10.0-py3-none-any.whl", hash = "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1"}, + {file = "anyio-4.10.0.tar.gz", hash = "sha256:3f3fae35c96039744587aa5b8371e7e8e603c0702999535961dd336026973ba6"}, +] + +[package.dependencies] +idna = ">=2.8" +sniffio = ">=1.1" +typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} + +[package.extras] +trio = ["trio (>=0.26.1)"] + +[[package]] +name = "appnope" +version = "0.1.4" +description = "Disable App Nap on macOS >= 10.9" +optional = false +python-versions = ">=3.6" +groups = ["dev"] +markers = "platform_system == \"Darwin\"" +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" +groups = ["dev"] +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 = "21.2.0" +description = "Low-level CFFI bindings for Argon2" +optional = false +python-versions = ">=3.6" +groups = ["dev"] +markers = "python_version >= \"3.14\"" +files = [ + {file = "argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f"}, + {file = "argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3e385d1c39c520c08b53d63300c3ecc28622f076f4c2b0e6d7e796e9f6502194"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3e3cc67fdb7d82c4718f19b4e7a87123caf8a93fde7e23cf66ac0337d3cb3f"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a22ad9800121b71099d0fb0a65323810a15f2e292f2ba450810a7316e128ee5"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9f8b450ed0547e3d473fdc8612083fd08dd2120d6ac8f73828df9b7d45bb351"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:93f9bf70084f97245ba10ee36575f0c3f1e7d7724d67d8e5b08e61787c320ed7"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3b9ef65804859d335dc6b31582cad2c5166f0c3e7975f324d9ffaa34ee7e6583"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4966ef5848d820776f5f562a7d45fdd70c2f330c961d0d745b784034bd9f48d"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ef543a89dee4db46a1a6e206cd015360e5a75822f76df533845c3cbaf72670"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2937d286e2ad0cc79a7087d3c272832865f779430e0cc2b4f3718d3159b0cb"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5e00316dabdaea0b2dd82d141cc66889ced0cdcbfa599e8b471cf22c620c329a"}, +] + +[package.dependencies] +cffi = ">=1.0.1" + +[package.extras] +dev = ["cogapp", "pre-commit", "pytest", "wheel"] +tests = ["pytest"] + +[[package]] +name = "argon2-cffi-bindings" +version = "25.1.0" +description = "Low-level CFFI bindings for Argon2" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +markers = "python_version < \"3.14\"" +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.3.0" +description = "Better dates & times for Python" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80"}, + {file = "arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85"}, +] + +[package.dependencies] +python-dateutil = ">=2.7.0" +types-python-dateutil = ">=2.8.10" + +[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 (==2021.1)", "simplejson (==3.*)"] + +[[package]] +name = "astroid" +version = "3.3.11" +description = "An abstract syntax tree for Python with inference support." +optional = false +python-versions = ">=3.9.0" +groups = ["dev"] +files = [ + {file = "astroid-3.3.11-py3-none-any.whl", hash = "sha256:54c760ae8322ece1abd213057c4b5bba7c49818853fc901ef09719a60dbf9dec"}, + {file = "astroid-3.3.11.tar.gz", hash = "sha256:1e5a5011af2920c7c67a53f65d536d65bfa7116feeaf2354d8b94f29573bb0ce"}, +] + +[[package]] +name = "asttokens" +version = "3.0.0" +description = "Annotate AST trees with source code positions" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2"}, + {file = "asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7"}, +] + +[package.extras] +astroid = ["astroid (>=2,<4)"] +test = ["astroid (>=2,<4)", "pytest", "pytest-cov", "pytest-xdist"] + +[[package]] +name = "async-lru" +version = "2.0.5" +description = "Simple LRU cache for asyncio" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +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]] +name = "attrs" +version = "25.3.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3"}, + {file = "attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b"}, +] + +[package.extras] +benchmark = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +cov = ["cloudpickle ; platform_python_implementation == \"CPython\"", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +dev = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier"] +tests = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\""] + +[[package]] +name = "babel" +version = "2.17.0" +description = "Internationalization utilities" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2"}, + {file = "babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d"}, +] + +[package.extras] +dev = ["backports.zoneinfo ; python_version < \"3.9\"", "freezegun (>=1.0,<2.0)", "jinja2 (>=3.0)", "pytest (>=6.0)", "pytest-cov", "pytz", "setuptools", "tzdata ; sys_platform == \"win32\""] + +[[package]] +name = "beautifulsoup4" +version = "4.13.4" +description = "Screen-scraping library" +optional = false +python-versions = ">=3.7.0" +groups = ["dev"] +files = [ + {file = "beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b"}, + {file = "beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195"}, +] + +[package.dependencies] +soupsieve = ">1.2" +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" +groups = ["dev"] +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 = "2025.8.3" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "certifi-2025.8.3-py3-none-any.whl", hash = "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5"}, + {file = "certifi-2025.8.3.tar.gz", hash = "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407"}, +] + +[[package]] +name = "cffi" +version = "1.17.1" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, + {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, + {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, + {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, + {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, + {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, + {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, + {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, + {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, + {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, + {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, + {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, + {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, + {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, + {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "3.4.3" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "charset_normalizer-3.4.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fb7f67a1bfa6e40b438170ebdc8158b78dc465a5a67b6dde178a46987b244a72"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc9370a2da1ac13f0153780040f465839e6cccb4a1e44810124b4e22483c93fe"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:07a0eae9e2787b586e129fdcbe1af6997f8d0e5abaa0bc98c0e20e124d67e601"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:74d77e25adda8581ffc1c720f1c81ca082921329452eba58b16233ab1842141c"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d0e909868420b7049dafd3a31d45125b31143eec59235311fc4c57ea26a4acd2"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c6f162aabe9a91a309510d74eeb6507fab5fff92337a15acbe77753d88d9dcf0"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4ca4c094de7771a98d7fbd67d9e5dbf1eb73efa4f744a730437d8a3a5cf994f0"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:02425242e96bcf29a49711b0ca9f37e451da7c70562bc10e8ed992a5a7a25cc0"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:78deba4d8f9590fe4dae384aeff04082510a709957e968753ff3c48399f6f92a"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-win32.whl", hash = "sha256:d79c198e27580c8e958906f803e63cddb77653731be08851c7df0b1a14a8fc0f"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-win_amd64.whl", hash = "sha256:c6e490913a46fa054e03699c70019ab869e990270597018cef1d8562132c2669"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b256ee2e749283ef3ddcff51a675ff43798d92d746d1a6e4631bf8c707d22d0b"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:13faeacfe61784e2559e690fc53fa4c5ae97c6fcedb8eb6fb8d0a15b475d2c64"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:00237675befef519d9af72169d8604a067d92755e84fe76492fef5441db05b91"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:585f3b2a80fbd26b048a0be90c5aae8f06605d3c92615911c3a2b03a8a3b796f"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e78314bdc32fa80696f72fa16dc61168fda4d6a0c014e0380f9d02f0e5d8a07"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:96b2b3d1a83ad55310de8c7b4a2d04d9277d5591f40761274856635acc5fcb30"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:939578d9d8fd4299220161fdd76e86c6a251987476f5243e8864a7844476ba14"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:fd10de089bcdcd1be95a2f73dbe6254798ec1bda9f450d5828c96f93e2536b9c"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1e8ac75d72fa3775e0b7cb7e4629cec13b7514d928d15ef8ea06bca03ef01cae"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-win32.whl", hash = "sha256:6cf8fd4c04756b6b60146d98cd8a77d0cdae0e1ca20329da2ac85eed779b6849"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:31a9a6f775f9bcd865d88ee350f0ffb0e25936a7f930ca98995c05abf1faf21c"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e28e334d3ff134e88989d90ba04b47d84382a828c061d0d1027b1b12a62b39b1"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0cacf8f7297b0c4fcb74227692ca46b4a5852f8f4f24b3c766dd94a1075c4884"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c6fd51128a41297f5409deab284fecbe5305ebd7e5a1f959bee1c054622b7018"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cfb2aad70f2c6debfbcb717f23b7eb55febc0bb23dcffc0f076009da10c6392"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1606f4a55c0fd363d754049cdf400175ee96c992b1f8018b993941f221221c5f"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:027b776c26d38b7f15b26a5da1044f376455fb3766df8fc38563b4efbc515154"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:42e5088973e56e31e4fa58eb6bd709e42fc03799c11c42929592889a2e54c491"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cc34f233c9e71701040d772aa7490318673aa7164a0efe3172b2981218c26d93"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:320e8e66157cc4e247d9ddca8e21f427efc7a04bbd0ac8a9faf56583fa543f9f"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-win32.whl", hash = "sha256:fb6fecfd65564f208cbf0fba07f107fb661bcd1a7c389edbced3f7a493f70e37"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:86df271bf921c2ee3818f0522e9a5b8092ca2ad8b065ece5d7d9d0e9f4849bcc"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-win32.whl", hash = "sha256:6fb70de56f1859a3f71261cbe41005f56a7842cc348d3aeb26237560bfa5e0ce"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:cf1ebb7d78e1ad8ec2a8c4732c7be2e736f6e5123a4146c5b89c9d1f585f8cef"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-win32.whl", hash = "sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0f2be7e0cf7754b9a30eb01f4295cc3d4358a479843b31f328afd210e2c7598c"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c60e092517a73c632ec38e290eba714e9627abe9d301c8c8a12ec32c314a2a4b"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:252098c8c7a873e17dd696ed98bbe91dbacd571da4b87df3736768efa7a792e4"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3653fad4fe3ed447a596ae8638b437f827234f01a8cd801842e43f3d0a6b281b"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8999f965f922ae054125286faf9f11bc6932184b93011d138925a1773830bbe9"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d95bfb53c211b57198bb91c46dd5a2d8018b3af446583aab40074bf7988401cb"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:5b413b0b1bfd94dbf4023ad6945889f374cd24e3f62de58d6bb102c4d9ae534a"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:b5e3b2d152e74e100a9e9573837aba24aab611d39428ded46f4e4022ea7d1942"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a2d08ac246bb48479170408d6c19f6385fa743e7157d716e144cad849b2dd94b"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-win32.whl", hash = "sha256:ec557499516fc90fd374bf2e32349a2887a876fbf162c160e3c01b6849eaf557"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:5d8d01eac18c423815ed4f4a2ec3b439d654e55ee4ad610e153cf02faf67ea40"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:70bfc5f2c318afece2f5838ea5e4c3febada0be750fcf4775641052bbba14d05"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:23b6b24d74478dc833444cbd927c338349d6ae852ba53a0d02a2de1fce45b96e"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:34a7f768e3f985abdb42841e20e17b330ad3aaf4bb7e7aeeb73db2e70f077b99"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fb731e5deb0c7ef82d698b0f4c5bb724633ee2a489401594c5c88b02e6cb15f7"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:257f26fed7d7ff59921b78244f3cd93ed2af1800ff048c33f624c87475819dd7"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1ef99f0456d3d46a50945c98de1774da86f8e992ab5c77865ea8b8195341fc19"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:2c322db9c8c89009a990ef07c3bcc9f011a3269bc06782f916cd3d9eed7c9312"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:511729f456829ef86ac41ca78c63a5cb55240ed23b4b737faca0eb1abb1c41bc"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:88ab34806dea0671532d3f82d82b85e8fc23d7b2dd12fa837978dad9bb392a34"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-win32.whl", hash = "sha256:16a8770207946ac75703458e2c743631c79c59c5890c80011d536248f8eaa432"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:d22dbedd33326a4a5190dd4fe9e9e693ef12160c77382d9e87919bce54f3d4ca"}, + {file = "charset_normalizer-3.4.3-py3-none-any.whl", hash = "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a"}, + {file = "charset_normalizer-3.4.3.tar.gz", hash = "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14"}, +] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["dev"] +markers = "sys_platform == \"win32\"" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {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" +groups = ["dev"] +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.3" +description = "Code coverage measurement for Python" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "coverage-7.10.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:53808194afdf948c462215e9403cca27a81cf150d2f9b386aee4dab614ae2ffe"}, + {file = "coverage-7.10.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f4d1b837d1abf72187a61645dbf799e0d7705aa9232924946e1f57eb09a3bf00"}, + {file = "coverage-7.10.3-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:2a90dd4505d3cc68b847ab10c5ee81822a968b5191664e8a0801778fa60459fa"}, + {file = "coverage-7.10.3-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d52989685ff5bf909c430e6d7f6550937bc6d6f3e6ecb303c97a86100efd4596"}, + {file = "coverage-7.10.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bdb558a1d97345bde3a9f4d3e8d11c9e5611f748646e9bb61d7d612a796671b5"}, + {file = "coverage-7.10.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c9e6331a8f09cb1fc8bda032752af03c366870b48cce908875ba2620d20d0ad4"}, + {file = "coverage-7.10.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:992f48bf35b720e174e7fae916d943599f1a66501a2710d06c5f8104e0756ee1"}, + {file = "coverage-7.10.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c5595fc4ad6a39312c786ec3326d7322d0cf10e3ac6a6df70809910026d67cfb"}, + {file = "coverage-7.10.3-cp310-cp310-win32.whl", hash = "sha256:9e92fa1f2bd5a57df9d00cf9ce1eb4ef6fccca4ceabec1c984837de55329db34"}, + {file = "coverage-7.10.3-cp310-cp310-win_amd64.whl", hash = "sha256:b96524d6e4a3ce6a75c56bb15dbd08023b0ae2289c254e15b9fbdddf0c577416"}, + {file = "coverage-7.10.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f2ff2e2afdf0d51b9b8301e542d9c21a8d084fd23d4c8ea2b3a1b3c96f5f7397"}, + {file = "coverage-7.10.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:18ecc5d1b9a8c570f6c9b808fa9a2b16836b3dd5414a6d467ae942208b095f85"}, + {file = "coverage-7.10.3-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1af4461b25fe92889590d438905e1fc79a95680ec2a1ff69a591bb3fdb6c7157"}, + {file = "coverage-7.10.3-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3966bc9a76b09a40dc6063c8b10375e827ea5dfcaffae402dd65953bef4cba54"}, + {file = "coverage-7.10.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:205a95b87ef4eb303b7bc5118b47b6b6604a644bcbdb33c336a41cfc0a08c06a"}, + {file = "coverage-7.10.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b3801b79fb2ad61e3c7e2554bab754fc5f105626056980a2b9cf3aef4f13f84"}, + {file = "coverage-7.10.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b0dc69c60224cda33d384572da945759756e3f06b9cdac27f302f53961e63160"}, + {file = "coverage-7.10.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a83d4f134bab2c7ff758e6bb1541dd72b54ba295ced6a63d93efc2e20cb9b124"}, + {file = "coverage-7.10.3-cp311-cp311-win32.whl", hash = "sha256:54e409dd64e5302b2a8fdf44ec1c26f47abd1f45a2dcf67bd161873ee05a59b8"}, + {file = "coverage-7.10.3-cp311-cp311-win_amd64.whl", hash = "sha256:30c601610a9b23807c5e9e2e442054b795953ab85d525c3de1b1b27cebeb2117"}, + {file = "coverage-7.10.3-cp311-cp311-win_arm64.whl", hash = "sha256:dabe662312a97958e932dee056f2659051d822552c0b866823e8ba1c2fe64770"}, + {file = "coverage-7.10.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:449c1e2d3a84d18bd204258a897a87bc57380072eb2aded6a5b5226046207b42"}, + {file = "coverage-7.10.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1d4f9ce50b9261ad196dc2b2e9f1fbbee21651b54c3097a25ad783679fd18294"}, + {file = "coverage-7.10.3-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4dd4564207b160d0d45c36a10bc0a3d12563028e8b48cd6459ea322302a156d7"}, + {file = "coverage-7.10.3-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5ca3c9530ee072b7cb6a6ea7b640bcdff0ad3b334ae9687e521e59f79b1d0437"}, + {file = "coverage-7.10.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b6df359e59fa243c9925ae6507e27f29c46698359f45e568fd51b9315dbbe587"}, + {file = "coverage-7.10.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a181e4c2c896c2ff64c6312db3bda38e9ade2e1aa67f86a5628ae85873786cea"}, + {file = "coverage-7.10.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a374d4e923814e8b72b205ef6b3d3a647bb50e66f3558582eda074c976923613"}, + {file = "coverage-7.10.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:daeefff05993e5e8c6e7499a8508e7bd94502b6b9a9159c84fd1fe6bce3151cb"}, + {file = "coverage-7.10.3-cp312-cp312-win32.whl", hash = "sha256:187ecdcac21f9636d570e419773df7bd2fda2e7fa040f812e7f95d0bddf5f79a"}, + {file = "coverage-7.10.3-cp312-cp312-win_amd64.whl", hash = "sha256:4a50ad2524ee7e4c2a95e60d2b0b83283bdfc745fe82359d567e4f15d3823eb5"}, + {file = "coverage-7.10.3-cp312-cp312-win_arm64.whl", hash = "sha256:c112f04e075d3495fa3ed2200f71317da99608cbb2e9345bdb6de8819fc30571"}, + {file = "coverage-7.10.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b99e87304ffe0eb97c5308447328a584258951853807afdc58b16143a530518a"}, + {file = "coverage-7.10.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4af09c7574d09afbc1ea7da9dcea23665c01f3bc1b1feb061dac135f98ffc53a"}, + {file = "coverage-7.10.3-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:488e9b50dc5d2aa9521053cfa706209e5acf5289e81edc28291a24f4e4488f46"}, + {file = "coverage-7.10.3-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:913ceddb4289cbba3a310704a424e3fb7aac2bc0c3a23ea473193cb290cf17d4"}, + {file = "coverage-7.10.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b1f91cbc78c7112ab84ed2a8defbccd90f888fcae40a97ddd6466b0bec6ae8a"}, + {file = "coverage-7.10.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b0bac054d45af7cd938834b43a9878b36ea92781bcb009eab040a5b09e9927e3"}, + {file = "coverage-7.10.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fe72cbdd12d9e0f4aca873fa6d755e103888a7f9085e4a62d282d9d5b9f7928c"}, + {file = "coverage-7.10.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c1e2e927ab3eadd7c244023927d646e4c15c65bb2ac7ae3c3e9537c013700d21"}, + {file = "coverage-7.10.3-cp313-cp313-win32.whl", hash = "sha256:24d0c13de473b04920ddd6e5da3c08831b1170b8f3b17461d7429b61cad59ae0"}, + {file = "coverage-7.10.3-cp313-cp313-win_amd64.whl", hash = "sha256:3564aae76bce4b96e2345cf53b4c87e938c4985424a9be6a66ee902626edec4c"}, + {file = "coverage-7.10.3-cp313-cp313-win_arm64.whl", hash = "sha256:f35580f19f297455f44afcd773c9c7a058e52eb6eb170aa31222e635f2e38b87"}, + {file = "coverage-7.10.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07009152f497a0464ffdf2634586787aea0e69ddd023eafb23fc38267db94b84"}, + {file = "coverage-7.10.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8dd2ba5f0c7e7e8cc418be2f0c14c4d9e3f08b8fb8e4c0f83c2fe87d03eb655e"}, + {file = "coverage-7.10.3-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1ae22b97003c74186e034a93e4f946c75fad8c0ce8d92fbbc168b5e15ee2841f"}, + {file = "coverage-7.10.3-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:eb329f1046888a36b1dc35504d3029e1dd5afe2196d94315d18c45ee380f67d5"}, + {file = "coverage-7.10.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce01048199a91f07f96ca3074b0c14021f4fe7ffd29a3e6a188ac60a5c3a4af8"}, + {file = "coverage-7.10.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:08b989a06eb9dfacf96d42b7fb4c9a22bafa370d245dc22fa839f2168c6f9fa1"}, + {file = "coverage-7.10.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:669fe0d4e69c575c52148511029b722ba8d26e8a3129840c2ce0522e1452b256"}, + {file = "coverage-7.10.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3262d19092771c83f3413831d9904b1ccc5f98da5de4ffa4ad67f5b20c7aaf7b"}, + {file = "coverage-7.10.3-cp313-cp313t-win32.whl", hash = "sha256:cc0ee4b2ccd42cab7ee6be46d8a67d230cb33a0a7cd47a58b587a7063b6c6b0e"}, + {file = "coverage-7.10.3-cp313-cp313t-win_amd64.whl", hash = "sha256:03db599f213341e2960430984e04cf35fb179724e052a3ee627a068653cf4a7c"}, + {file = "coverage-7.10.3-cp313-cp313t-win_arm64.whl", hash = "sha256:46eae7893ba65f53c71284585a262f083ef71594f05ec5c85baf79c402369098"}, + {file = "coverage-7.10.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:bce8b8180912914032785850d8f3aacb25ec1810f5f54afc4a8b114e7a9b55de"}, + {file = "coverage-7.10.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:07790b4b37d56608536f7c1079bd1aa511567ac2966d33d5cec9cf520c50a7c8"}, + {file = "coverage-7.10.3-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e79367ef2cd9166acedcbf136a458dfe9a4a2dd4d1ee95738fb2ee581c56f667"}, + {file = "coverage-7.10.3-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:419d2a0f769f26cb1d05e9ccbc5eab4cb5d70231604d47150867c07822acbdf4"}, + {file = "coverage-7.10.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee221cf244757cdc2ac882e3062ab414b8464ad9c884c21e878517ea64b3fa26"}, + {file = "coverage-7.10.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c2079d8cdd6f7373d628e14b3357f24d1db02c9dc22e6a007418ca7a2be0435a"}, + {file = "coverage-7.10.3-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:bd8df1f83c0703fa3ca781b02d36f9ec67ad9cb725b18d486405924f5e4270bd"}, + {file = "coverage-7.10.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6b4e25e0fa335c8aa26e42a52053f3786a61cc7622b4d54ae2dad994aa754fec"}, + {file = "coverage-7.10.3-cp314-cp314-win32.whl", hash = "sha256:d7c3d02c2866deb217dce664c71787f4b25420ea3eaf87056f44fb364a3528f5"}, + {file = "coverage-7.10.3-cp314-cp314-win_amd64.whl", hash = "sha256:9c8916d44d9e0fe6cdb2227dc6b0edd8bc6c8ef13438bbbf69af7482d9bb9833"}, + {file = "coverage-7.10.3-cp314-cp314-win_arm64.whl", hash = "sha256:1007d6a2b3cf197c57105cc1ba390d9ff7f0bee215ced4dea530181e49c65ab4"}, + {file = "coverage-7.10.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:ebc8791d346410d096818788877d675ca55c91db87d60e8f477bd41c6970ffc6"}, + {file = "coverage-7.10.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1f4e4d8e75f6fd3c6940ebeed29e3d9d632e1f18f6fb65d33086d99d4d073241"}, + {file = "coverage-7.10.3-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:24581ed69f132b6225a31b0228ae4885731cddc966f8a33fe5987288bdbbbd5e"}, + {file = "coverage-7.10.3-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ec151569ddfccbf71bac8c422dce15e176167385a00cd86e887f9a80035ce8a5"}, + {file = "coverage-7.10.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2ae8e7c56290b908ee817200c0b65929b8050bc28530b131fe7c6dfee3e7d86b"}, + {file = "coverage-7.10.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5fb742309766d7e48e9eb4dc34bc95a424707bc6140c0e7d9726e794f11b92a0"}, + {file = "coverage-7.10.3-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:c65e2a5b32fbe1e499f1036efa6eb9cb4ea2bf6f7168d0e7a5852f3024f471b1"}, + {file = "coverage-7.10.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d48d2cb07d50f12f4f18d2bb75d9d19e3506c26d96fffabf56d22936e5ed8f7c"}, + {file = "coverage-7.10.3-cp314-cp314t-win32.whl", hash = "sha256:dec0d9bc15ee305e09fe2cd1911d3f0371262d3cfdae05d79515d8cb712b4869"}, + {file = "coverage-7.10.3-cp314-cp314t-win_amd64.whl", hash = "sha256:424ea93a323aa0f7f01174308ea78bde885c3089ec1bef7143a6d93c3e24ef64"}, + {file = "coverage-7.10.3-cp314-cp314t-win_arm64.whl", hash = "sha256:f5983c132a62d93d71c9ef896a0b9bf6e6828d8d2ea32611f58684fba60bba35"}, + {file = "coverage-7.10.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:da749daa7e141985487e1ff90a68315b0845930ed53dc397f4ae8f8bab25b551"}, + {file = "coverage-7.10.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3126fb6a47d287f461d9b1aa5d1a8c97034d1dffb4f452f2cf211289dae74ef"}, + {file = "coverage-7.10.3-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3da794db13cc27ca40e1ec8127945b97fab78ba548040047d54e7bfa6d442dca"}, + {file = "coverage-7.10.3-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4e27bebbd184ef8d1c1e092b74a2b7109dcbe2618dce6e96b1776d53b14b3fe8"}, + {file = "coverage-7.10.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8fd4ee2580b9fefbd301b4f8f85b62ac90d1e848bea54f89a5748cf132782118"}, + {file = "coverage-7.10.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6999920bdd73259ce11cabfc1307484f071ecc6abdb2ca58d98facbcefc70f16"}, + {file = "coverage-7.10.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:c3623f929db885fab100cb88220a5b193321ed37e03af719efdbaf5d10b6e227"}, + {file = "coverage-7.10.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:25b902c5e15dea056485d782e420bb84621cc08ee75d5131ecb3dbef8bd1365f"}, + {file = "coverage-7.10.3-cp39-cp39-win32.whl", hash = "sha256:f930a4d92b004b643183451fe9c8fe398ccf866ed37d172ebaccfd443a097f61"}, + {file = "coverage-7.10.3-cp39-cp39-win_amd64.whl", hash = "sha256:08e638a93c8acba13c7842953f92a33d52d73e410329acd472280d2a21a6c0e1"}, + {file = "coverage-7.10.3-py3-none-any.whl", hash = "sha256:416a8d74dc0adfd33944ba2f405897bab87b7e9e84a391e09d241956bd953ce1"}, + {file = "coverage-7.10.3.tar.gz", hash = "sha256:812ba9250532e4a823b070b0420a36499859542335af3dca8f47fc6aa1a05619"}, +] + +[package.extras] +toml = ["tomli ; python_full_version <= \"3.11.0a6\""] + +[[package]] +name = "debugpy" +version = "1.8.16" +description = "An implementation of the Debug Adapter Protocol for Python" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "debugpy-1.8.16-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:2a3958fb9c2f40ed8ea48a0d34895b461de57a1f9862e7478716c35d76f56c65"}, + {file = "debugpy-1.8.16-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5ca7314042e8a614cc2574cd71f6ccd7e13a9708ce3c6d8436959eae56f2378"}, + {file = "debugpy-1.8.16-cp310-cp310-win32.whl", hash = "sha256:8624a6111dc312ed8c363347a0b59c5acc6210d897e41a7c069de3c53235c9a6"}, + {file = "debugpy-1.8.16-cp310-cp310-win_amd64.whl", hash = "sha256:fee6db83ea5c978baf042440cfe29695e1a5d48a30147abf4c3be87513609817"}, + {file = "debugpy-1.8.16-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:67371b28b79a6a12bcc027d94a06158f2fde223e35b5c4e0783b6f9d3b39274a"}, + {file = "debugpy-1.8.16-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2abae6dd02523bec2dee16bd6b0781cccb53fd4995e5c71cc659b5f45581898"}, + {file = "debugpy-1.8.16-cp311-cp311-win32.whl", hash = "sha256:f8340a3ac2ed4f5da59e064aa92e39edd52729a88fbde7bbaa54e08249a04493"}, + {file = "debugpy-1.8.16-cp311-cp311-win_amd64.whl", hash = "sha256:70f5fcd6d4d0c150a878d2aa37391c52de788c3dc680b97bdb5e529cb80df87a"}, + {file = "debugpy-1.8.16-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:b202e2843e32e80b3b584bcebfe0e65e0392920dc70df11b2bfe1afcb7a085e4"}, + {file = "debugpy-1.8.16-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64473c4a306ba11a99fe0bb14622ba4fbd943eb004847d9b69b107bde45aa9ea"}, + {file = "debugpy-1.8.16-cp312-cp312-win32.whl", hash = "sha256:833a61ed446426e38b0dd8be3e9d45ae285d424f5bf6cd5b2b559c8f12305508"}, + {file = "debugpy-1.8.16-cp312-cp312-win_amd64.whl", hash = "sha256:75f204684581e9ef3dc2f67687c3c8c183fde2d6675ab131d94084baf8084121"}, + {file = "debugpy-1.8.16-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:85df3adb1de5258dca910ae0bb185e48c98801ec15018a263a92bb06be1c8787"}, + {file = "debugpy-1.8.16-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bee89e948bc236a5c43c4214ac62d28b29388453f5fd328d739035e205365f0b"}, + {file = "debugpy-1.8.16-cp313-cp313-win32.whl", hash = "sha256:cf358066650439847ec5ff3dae1da98b5461ea5da0173d93d5e10f477c94609a"}, + {file = "debugpy-1.8.16-cp313-cp313-win_amd64.whl", hash = "sha256:b5aea1083f6f50023e8509399d7dc6535a351cc9f2e8827d1e093175e4d9fa4c"}, + {file = "debugpy-1.8.16-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:2801329c38f77c47976d341d18040a9ac09d0c71bf2c8b484ad27c74f83dc36f"}, + {file = "debugpy-1.8.16-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:687c7ab47948697c03b8f81424aa6dc3f923e6ebab1294732df1ca9773cc67bc"}, + {file = "debugpy-1.8.16-cp38-cp38-win32.whl", hash = "sha256:a2ba6fc5d7c4bc84bcae6c5f8edf5988146e55ae654b1bb36fecee9e5e77e9e2"}, + {file = "debugpy-1.8.16-cp38-cp38-win_amd64.whl", hash = "sha256:d58c48d8dbbbf48a3a3a638714a2d16de537b0dace1e3432b8e92c57d43707f8"}, + {file = "debugpy-1.8.16-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:135ccd2b1161bade72a7a099c9208811c137a150839e970aeaf121c2467debe8"}, + {file = "debugpy-1.8.16-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:211238306331a9089e253fd997213bc4a4c65f949271057d6695953254095376"}, + {file = "debugpy-1.8.16-cp39-cp39-win32.whl", hash = "sha256:88eb9ffdfb59bf63835d146c183d6dba1f722b3ae2a5f4b9fc03e925b3358922"}, + {file = "debugpy-1.8.16-cp39-cp39-win_amd64.whl", hash = "sha256:c2c47c2e52b40449552843b913786499efcc3dbc21d6c49287d939cd0dbc49fd"}, + {file = "debugpy-1.8.16-py2.py3-none-any.whl", hash = "sha256:19c9521962475b87da6f673514f7fd610328757ec993bf7ec0d8c96f9a325f9e"}, + {file = "debugpy-1.8.16.tar.gz", hash = "sha256:31e69a1feb1cf6b51efbed3f6c9b0ef03bc46ff050679c4be7ea6d2e23540870"}, +] + +[[package]] +name = "decorator" +version = "5.2.1" +description = "Decorators for Humans" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a"}, + {file = "decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360"}, +] + +[[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.*" +groups = ["dev"] +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 = "dill" +version = "0.4.0" +description = "serialize all of Python" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "dill-0.4.0-py3-none-any.whl", hash = "sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049"}, + {file = "dill-0.4.0.tar.gz", hash = "sha256:0633f1d2df477324f53a895b02c901fb961bdbf65a17122586ea7019292cbcf0"}, +] + +[package.extras] +graph = ["objgraph (>=1.7.2)"] +profile = ["gprof2dot (>=2022.7.29)"] + +[[package]] +name = "et-xmlfile" +version = "2.0.0" +description = "An implementation of lxml.xmlfile for the standard library" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa"}, + {file = "et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54"}, +] + +[[package]] +name = "executing" +version = "2.2.0" +description = "Get the currently executing AST node of a frame, and other information" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa"}, + {file = "executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755"}, +] + +[package.extras] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich ; python_version >= \"3.11\""] + +[[package]] +name = "fastjsonschema" +version = "2.21.1" +description = "Fastest Python implementation of JSON schema" +optional = false +python-versions = "*" +groups = ["dev"] +files = [ + {file = "fastjsonschema-2.21.1-py3-none-any.whl", hash = "sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667"}, + {file = "fastjsonschema-2.21.1.tar.gz", hash = "sha256:794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4"}, +] + +[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" +groups = ["dev"] +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" +groups = ["dev"] +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" +groups = ["dev"] +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" +groups = ["dev"] +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 ; platform_python_implementation == \"CPython\"", "brotlicffi ; platform_python_implementation != \"CPython\""] +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.10" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.6" +groups = ["main", "dev"] +files = [ + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, +] + +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + +[[package]] +name = "iniconfig" +version = "2.1.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760"}, + {file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"}, +] + +[[package]] +name = "ipykernel" +version = "6.30.1" +description = "IPython Kernel for Jupyter" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "ipykernel-6.30.1-py3-none-any.whl", hash = "sha256:aa6b9fb93dca949069d8b85b6c79b2518e32ac583ae9c7d37c51d119e18b3fb4"}, + {file = "ipykernel-6.30.1.tar.gz", hash = "sha256:6abb270161896402e76b91394fcdce5d1be5d45f456671e5080572f8505be39b"}, +] + +[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 = "9.4.0" +description = "IPython: Productive Interactive Computing" +optional = false +python-versions = ">=3.11" +groups = ["dev"] +files = [ + {file = "ipython-9.4.0-py3-none-any.whl", hash = "sha256:25850f025a446d9b359e8d296ba175a36aedd32e83ca9b5060430fe16801f066"}, + {file = "ipython-9.4.0.tar.gz", hash = "sha256:c033c6d4e7914c3d9768aabe76bbe87ba1dc66a92a05db6bfa1125d81f2ee270"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +ipython-pygments-lexers = "*" +jedi = ">=0.16" +matplotlib-inline = "*" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""} +prompt_toolkit = ">=3.0.41,<3.1.0" +pygments = ">=2.4.0" +stack_data = "*" +traitlets = ">=5.13.0" + +[package.extras] +all = ["ipython[doc,matplotlib,test,test-extra]"] +black = ["black"] +doc = ["docrepr", "exceptiongroup", "intersphinx_registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinx_toml (==0.0.4)", "typing_extensions"] +matplotlib = ["matplotlib"] +test = ["packaging", "pytest", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "ipykernel", "ipython[test]", "jupyter_ai", "matplotlib (!=3.2.0)", "nbclient", "nbformat", "numpy (>=1.23)", "pandas", "trio"] + +[[package]] +name = "ipython-pygments-lexers" +version = "1.1.1" +description = "Defines a variety of Pygments lexers for highlighting IPython code." +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c"}, + {file = "ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81"}, +] + +[package.dependencies] +pygments = "*" + +[[package]] +name = "isoduration" +version = "20.11.0" +description = "Operations with ISO 8601 durations" +optional = false +python-versions = ">=3.7" +groups = ["dev"] +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 = "isort" +version = "6.0.1" +description = "A Python utility / library to sort Python imports." +optional = false +python-versions = ">=3.9.0" +groups = ["dev"] +files = [ + {file = "isort-6.0.1-py3-none-any.whl", hash = "sha256:2dc5d7f65c9678d94c88dfc29161a320eec67328bc97aad576874cb4be1e9615"}, + {file = "isort-6.0.1.tar.gz", hash = "sha256:1cb5df28dfbc742e490c5e41bad6da41b805b0a8be7bc93cd0fb2a8a890ac450"}, +] + +[package.extras] +colors = ["colorama"] +plugins = ["setuptools"] + +[[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" +groups = ["dev"] +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" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +groups = ["dev"] +files = [ + {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, + {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "json5" +version = "0.12.1" +description = "A Python implementation of the JSON5 data format." +optional = false +python-versions = ">=3.8.0" +groups = ["dev"] +files = [ + {file = "json5-0.12.1-py3-none-any.whl", hash = "sha256:d9c9b3bc34a5f54d43c35e11ef7cb87d8bdd098c6ace87117a7b7e83e705c1d5"}, + {file = "json5-0.12.1.tar.gz", hash = "sha256:b2743e77b3242f8d03c143dd975a6ec7c52e2f2afe76ed934e53503dd4ad4990"}, +] + +[package.extras] +dev = ["build (==1.2.2.post1)", "coverage (==7.5.4) ; python_version < \"3.9\"", "coverage (==7.8.0) ; python_version >= \"3.9\"", "mypy (==1.14.1) ; python_version < \"3.9\"", "mypy (==1.15.0) ; python_version >= \"3.9\"", "pip (==25.0.1)", "pylint (==3.2.7) ; python_version < \"3.9\"", "pylint (==3.3.6) ; python_version >= \"3.9\"", "ruff (==0.11.2)", "twine (==6.1.0)", "uv (==0.6.11)"] + +[[package]] +name = "jsonpointer" +version = "3.0.0" +description = "Identify specific nodes in a JSON document (RFC 6901)" +optional = false +python-versions = ">=3.7" +groups = ["dev"] +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.0" +description = "An implementation of JSON Schema validation for Python" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "jsonschema-4.25.0-py3-none-any.whl", hash = "sha256:24c2e8da302de79c8b9382fee3e76b355e44d2a4364bb207159ce10b517bd716"}, + {file = "jsonschema-4.25.0.tar.gz", hash = "sha256:e63acf5c11762c0e6672ffb61482bdf57f0876684d8d249c0fe2d730d48bc55f"}, +] + +[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.4.1" +description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "jsonschema_specifications-2025.4.1-py3-none-any.whl", hash = "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af"}, + {file = "jsonschema_specifications-2025.4.1.tar.gz", hash = "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608"}, +] + +[package.dependencies] +referencing = ">=0.31.0" + +[[package]] +name = "jupyter-client" +version = "8.6.3" +description = "Jupyter protocol implementation and client libraries" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +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] +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 ; sys_platform == \"win32\"", "pre-commit", "pytest (<8.2.0)", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] + +[[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" +groups = ["dev"] +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.0" +description = "Jupyter Event System library" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "jupyter_events-0.12.0-py3-none-any.whl", hash = "sha256:6464b2fa5ad10451c3d35fabc75eab39556ae1e2853ad0c0cc31b656731a97fb"}, + {file = "jupyter_events-0.12.0.tar.gz", hash = "sha256:fc3fce98865f6784c9cd0a56a20644fc6098f21c8c33834a8d9fe383c17e554b"}, +] + +[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.2.6" +description = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "jupyter_lsp-2.2.6-py3-none-any.whl", hash = "sha256:283783752bf0b459ee7fa88effa72104d87dd343b82d5c06cf113ef755b15b6d"}, + {file = "jupyter_lsp-2.2.6.tar.gz", hash = "sha256:0566bd9bb04fd9e6774a937ed01522b555ba78be37bebef787c8ab22de4c0361"}, +] + +[package.dependencies] +jupyter_server = ">=1.1.2" + +[[package]] +name = "jupyter-server" +version = "2.16.0" +description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "jupyter_server-2.16.0-py3-none-any.whl", hash = "sha256:3d8db5be3bc64403b1c65b400a1d7f4647a5ce743f3b20dbdefe8ddb7b55af9e"}, + {file = "jupyter_server-2.16.0.tar.gz", hash = "sha256:65d4b44fdf2dcbbdfe0aa1ace4a842d4aaf746a2b7b168134d5aaed35621b7f6"}, +] + +[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 = ">=5.0" +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-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.3" +description = "A Jupyter Server Extension Providing Terminals." +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "jupyter_server_terminals-0.5.3-py3-none-any.whl", hash = "sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa"}, + {file = "jupyter_server_terminals-0.5.3.tar.gz", hash = "sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269"}, +] + +[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.4.5" +description = "JupyterLab computational environment" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "jupyterlab-4.4.5-py3-none-any.whl", hash = "sha256:e76244cceb2d1fb4a99341f3edc866f2a13a9e14c50368d730d75d8017be0863"}, + {file = "jupyterlab-4.4.5.tar.gz", hash = "sha256:0bd6c18e6a3c3d91388af6540afa3d0bb0b2e76287a7b88ddf20ab41b336e595"}, +] + +[package.dependencies] +async-lru = ">=1.0.0" +httpx = ">=0.25.0" +ipykernel = ">=6.5.0" +jinja2 = ">=3.0.3" +jupyter-core = "*" +jupyter-lsp = ">=2.0.0" +jupyter-server = ">=2.4.0,<3" +jupyterlab-server = ">=2.27.1,<3" +notebook-shim = ">=0.2" +packaging = "*" +setuptools = ">=41.1.0" +tornado = ">=6.2.0" +traitlets = "*" + +[package.extras] +dev = ["build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.11.4)"] +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 (==5.5.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)", "vega-datasets (==0.9.0)"] +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" +groups = ["dev"] +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.27.3" +description = "A set of server components for JupyterLab and JupyterLab like applications." +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "jupyterlab_server-2.27.3-py3-none-any.whl", hash = "sha256:e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4"}, + {file = "jupyterlab_server-2.27.3.tar.gz", hash = "sha256:eb36caca59e74471988f0ae25c77945610b887f777255aa21f8065def9e51ed4"}, +] + +[package.dependencies] +babel = ">=2.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 = "lark" +version = "1.2.2" +description = "a modern parsing library" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "lark-1.2.2-py3-none-any.whl", hash = "sha256:c2276486b02f0f1b90be155f2c8ba4a8e194d42775786db622faccd652d8e80c"}, + {file = "lark-1.2.2.tar.gz", hash = "sha256:ca807d0162cd16cef15a8feecb862d7319e7a09bdb13aef927968e45040fed80"}, +] + +[package.extras] +atomic-cache = ["atomicwrites"] +interegular = ["interegular (>=0.3.1,<0.4.0)"] +nearley = ["js2py"] +regex = ["regex"] + +[[package]] +name = "markupsafe" +version = "3.0.2" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, + {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, +] + +[[package]] +name = "matplotlib-inline" +version = "0.1.7" +description = "Inline Matplotlib backend for Jupyter" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, + {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, +] + +[package.dependencies] +traitlets = "*" + +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +optional = false +python-versions = ">=3.6" +groups = ["dev"] +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + +[[package]] +name = "mistune" +version = "3.1.3" +description = "A sane and fast Markdown parser with useful plugins and renderers" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "mistune-3.1.3-py3-none-any.whl", hash = "sha256:1a32314113cff28aa6432e99e522677c8587fd83e3d51c29b82a52409c842bd9"}, + {file = "mistune-3.1.3.tar.gz", hash = "sha256:a7035c21782b2becb6be62f8f25d3df81ccb4d6fa477a6525b15af06539f02a0"}, +] + +[[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" +groups = ["dev"] +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.16.6" +description = "Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. nbconvert can be used both as a Python library (`import nbconvert`) or as a command line tool (invoked as `jupyter nbconvert ...`)." +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "nbconvert-7.16.6-py3-none-any.whl", hash = "sha256:1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b"}, + {file = "nbconvert-7.16.6.tar.gz", hash = "sha256:576a7e37c6480da7b8465eefa66c17844243816ce1ccc372633c6b71c3c0f582"}, +] + +[package.dependencies] +beautifulsoup4 = "*" +bleach = {version = "!=5.0.0", extras = ["css"]} +defusedxml = "*" +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", "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 = ["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" +groups = ["dev"] +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" +groups = ["dev"] +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.4.5" +description = "Jupyter Notebook - A web-based notebook environment for interactive computing" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "notebook-7.4.5-py3-none-any.whl", hash = "sha256:351635461aca9dad08cf8946a4216f963e2760cc1bf7b1aaaecb23afc33ec046"}, + {file = "notebook-7.4.5.tar.gz", hash = "sha256:7c2c4ea245913c3ad8ab3e5d36b34a842c06e524556f5c2e1f5d7d08c986615e"}, +] + +[package.dependencies] +jupyter-server = ">=2.4.0,<3" +jupyterlab = ">=4.4.5,<4.5" +jupyterlab-server = ">=2.27.1,<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) ; python_version < \"3.10\"", "ipykernel", "jupyter-server[test] (>=2.4.0,<3)", "jupyterlab-server[test] (>=2.27.1,<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" +groups = ["dev"] +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 = "2.3.2" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.11" +groups = ["main"] +files = [ + {file = "numpy-2.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:852ae5bed3478b92f093e30f785c98e0cb62fa0a939ed057c31716e18a7a22b9"}, + {file = "numpy-2.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7a0e27186e781a69959d0230dd9909b5e26024f8da10683bd6344baea1885168"}, + {file = "numpy-2.3.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:f0a1a8476ad77a228e41619af2fa9505cf69df928e9aaa165746584ea17fed2b"}, + {file = "numpy-2.3.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:cbc95b3813920145032412f7e33d12080f11dc776262df1712e1638207dde9e8"}, + {file = "numpy-2.3.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f75018be4980a7324edc5930fe39aa391d5734531b1926968605416ff58c332d"}, + {file = "numpy-2.3.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:20b8200721840f5621b7bd03f8dcd78de33ec522fc40dc2641aa09537df010c3"}, + {file = "numpy-2.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f91e5c028504660d606340a084db4b216567ded1056ea2b4be4f9d10b67197f"}, + {file = "numpy-2.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:fb1752a3bb9a3ad2d6b090b88a9a0ae1cd6f004ef95f75825e2f382c183b2097"}, + {file = "numpy-2.3.2-cp311-cp311-win32.whl", hash = "sha256:4ae6863868aaee2f57503c7a5052b3a2807cf7a3914475e637a0ecd366ced220"}, + {file = "numpy-2.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:240259d6564f1c65424bcd10f435145a7644a65a6811cfc3201c4a429ba79170"}, + {file = "numpy-2.3.2-cp311-cp311-win_arm64.whl", hash = "sha256:4209f874d45f921bde2cff1ffcd8a3695f545ad2ffbef6d3d3c6768162efab89"}, + {file = "numpy-2.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bc3186bea41fae9d8e90c2b4fb5f0a1f5a690682da79b92574d63f56b529080b"}, + {file = "numpy-2.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f4f0215edb189048a3c03bd5b19345bdfa7b45a7a6f72ae5945d2a28272727f"}, + {file = "numpy-2.3.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:8b1224a734cd509f70816455c3cffe13a4f599b1bf7130f913ba0e2c0b2006c0"}, + {file = "numpy-2.3.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:3dcf02866b977a38ba3ec10215220609ab9667378a9e2150615673f3ffd6c73b"}, + {file = "numpy-2.3.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:572d5512df5470f50ada8d1972c5f1082d9a0b7aa5944db8084077570cf98370"}, + {file = "numpy-2.3.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8145dd6d10df13c559d1e4314df29695613575183fa2e2d11fac4c208c8a1f73"}, + {file = "numpy-2.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:103ea7063fa624af04a791c39f97070bf93b96d7af7eb23530cd087dc8dbe9dc"}, + {file = "numpy-2.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc927d7f289d14f5e037be917539620603294454130b6de200091e23d27dc9be"}, + {file = "numpy-2.3.2-cp312-cp312-win32.whl", hash = "sha256:d95f59afe7f808c103be692175008bab926b59309ade3e6d25009e9a171f7036"}, + {file = "numpy-2.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:9e196ade2400c0c737d93465327d1ae7c06c7cb8a1756121ebf54b06ca183c7f"}, + {file = "numpy-2.3.2-cp312-cp312-win_arm64.whl", hash = "sha256:ee807923782faaf60d0d7331f5e86da7d5e3079e28b291973c545476c2b00d07"}, + {file = "numpy-2.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c8d9727f5316a256425892b043736d63e89ed15bbfe6556c5ff4d9d4448ff3b3"}, + {file = "numpy-2.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:efc81393f25f14d11c9d161e46e6ee348637c0a1e8a54bf9dedc472a3fae993b"}, + {file = "numpy-2.3.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:dd937f088a2df683cbb79dda9a772b62a3e5a8a7e76690612c2737f38c6ef1b6"}, + {file = "numpy-2.3.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:11e58218c0c46c80509186e460d79fbdc9ca1eb8d8aee39d8f2dc768eb781089"}, + {file = "numpy-2.3.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5ad4ebcb683a1f99f4f392cc522ee20a18b2bb12a2c1c42c3d48d5a1adc9d3d2"}, + {file = "numpy-2.3.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:938065908d1d869c7d75d8ec45f735a034771c6ea07088867f713d1cd3bbbe4f"}, + {file = "numpy-2.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:66459dccc65d8ec98cc7df61307b64bf9e08101f9598755d42d8ae65d9a7a6ee"}, + {file = "numpy-2.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a7af9ed2aa9ec5950daf05bb11abc4076a108bd3c7db9aa7251d5f107079b6a6"}, + {file = "numpy-2.3.2-cp313-cp313-win32.whl", hash = "sha256:906a30249315f9c8e17b085cc5f87d3f369b35fedd0051d4a84686967bdbbd0b"}, + {file = "numpy-2.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:c63d95dc9d67b676e9108fe0d2182987ccb0f11933c1e8959f42fa0da8d4fa56"}, + {file = "numpy-2.3.2-cp313-cp313-win_arm64.whl", hash = "sha256:b05a89f2fb84d21235f93de47129dd4f11c16f64c87c33f5e284e6a3a54e43f2"}, + {file = "numpy-2.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4e6ecfeddfa83b02318f4d84acf15fbdbf9ded18e46989a15a8b6995dfbf85ab"}, + {file = "numpy-2.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:508b0eada3eded10a3b55725b40806a4b855961040180028f52580c4729916a2"}, + {file = "numpy-2.3.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:754d6755d9a7588bdc6ac47dc4ee97867271b17cee39cb87aef079574366db0a"}, + {file = "numpy-2.3.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:a9f66e7d2b2d7712410d3bc5684149040ef5f19856f20277cd17ea83e5006286"}, + {file = "numpy-2.3.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de6ea4e5a65d5a90c7d286ddff2b87f3f4ad61faa3db8dabe936b34c2275b6f8"}, + {file = "numpy-2.3.2-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3ef07ec8cbc8fc9e369c8dcd52019510c12da4de81367d8b20bc692aa07573a"}, + {file = "numpy-2.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:27c9f90e7481275c7800dc9c24b7cc40ace3fdb970ae4d21eaff983a32f70c91"}, + {file = "numpy-2.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:07b62978075b67eee4065b166d000d457c82a1efe726cce608b9db9dd66a73a5"}, + {file = "numpy-2.3.2-cp313-cp313t-win32.whl", hash = "sha256:c771cfac34a4f2c0de8e8c97312d07d64fd8f8ed45bc9f5726a7e947270152b5"}, + {file = "numpy-2.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:72dbebb2dcc8305c431b2836bcc66af967df91be793d63a24e3d9b741374c450"}, + {file = "numpy-2.3.2-cp313-cp313t-win_arm64.whl", hash = "sha256:72c6df2267e926a6d5286b0a6d556ebe49eae261062059317837fda12ddf0c1a"}, + {file = "numpy-2.3.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:448a66d052d0cf14ce9865d159bfc403282c9bc7bb2a31b03cc18b651eca8b1a"}, + {file = "numpy-2.3.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:546aaf78e81b4081b2eba1d105c3b34064783027a06b3ab20b6eba21fb64132b"}, + {file = "numpy-2.3.2-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:87c930d52f45df092f7578889711a0768094debf73cfcde105e2d66954358125"}, + {file = "numpy-2.3.2-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:8dc082ea901a62edb8f59713c6a7e28a85daddcb67454c839de57656478f5b19"}, + {file = "numpy-2.3.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:af58de8745f7fa9ca1c0c7c943616c6fe28e75d0c81f5c295810e3c83b5be92f"}, + {file = "numpy-2.3.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed5527c4cf10f16c6d0b6bee1f89958bccb0ad2522c8cadc2efd318bcd545f5"}, + {file = "numpy-2.3.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:095737ed986e00393ec18ec0b21b47c22889ae4b0cd2d5e88342e08b01141f58"}, + {file = "numpy-2.3.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b5e40e80299607f597e1a8a247ff8d71d79c5b52baa11cc1cce30aa92d2da6e0"}, + {file = "numpy-2.3.2-cp314-cp314-win32.whl", hash = "sha256:7d6e390423cc1f76e1b8108c9b6889d20a7a1f59d9a60cac4a050fa734d6c1e2"}, + {file = "numpy-2.3.2-cp314-cp314-win_amd64.whl", hash = "sha256:b9d0878b21e3918d76d2209c924ebb272340da1fb51abc00f986c258cd5e957b"}, + {file = "numpy-2.3.2-cp314-cp314-win_arm64.whl", hash = "sha256:2738534837c6a1d0c39340a190177d7d66fdf432894f469728da901f8f6dc910"}, + {file = "numpy-2.3.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:4d002ecf7c9b53240be3bb69d80f86ddbd34078bae04d87be81c1f58466f264e"}, + {file = "numpy-2.3.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:293b2192c6bcce487dbc6326de5853787f870aeb6c43f8f9c6496db5b1781e45"}, + {file = "numpy-2.3.2-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:0a4f2021a6da53a0d580d6ef5db29947025ae8b35b3250141805ea9a32bbe86b"}, + {file = "numpy-2.3.2-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:9c144440db4bf3bb6372d2c3e49834cc0ff7bb4c24975ab33e01199e645416f2"}, + {file = "numpy-2.3.2-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f92d6c2a8535dc4fe4419562294ff957f83a16ebdec66df0805e473ffaad8bd0"}, + {file = "numpy-2.3.2-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cefc2219baa48e468e3db7e706305fcd0c095534a192a08f31e98d83a7d45fb0"}, + {file = "numpy-2.3.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:76c3e9501ceb50b2ff3824c3589d5d1ab4ac857b0ee3f8f49629d0de55ecf7c2"}, + {file = "numpy-2.3.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:122bf5ed9a0221b3419672493878ba4967121514b1d7d4656a7580cd11dddcbf"}, + {file = "numpy-2.3.2-cp314-cp314t-win32.whl", hash = "sha256:6f1ae3dcb840edccc45af496f312528c15b1f79ac318169d094e85e4bb35fdf1"}, + {file = "numpy-2.3.2-cp314-cp314t-win_amd64.whl", hash = "sha256:087ffc25890d89a43536f75c5fe8770922008758e8eeeef61733957041ed2f9b"}, + {file = "numpy-2.3.2-cp314-cp314t-win_arm64.whl", hash = "sha256:092aeb3449833ea9c0bf0089d70c29ae480685dd2377ec9cdbbb620257f84631"}, + {file = "numpy-2.3.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:14a91ebac98813a49bc6aa1a0dfc09513dcec1d97eaf31ca21a87221a1cdcb15"}, + {file = "numpy-2.3.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:71669b5daae692189540cffc4c439468d35a3f84f0c88b078ecd94337f6cb0ec"}, + {file = "numpy-2.3.2-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:69779198d9caee6e547adb933941ed7520f896fd9656834c300bdf4dd8642712"}, + {file = "numpy-2.3.2-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:2c3271cc4097beb5a60f010bcc1cc204b300bb3eafb4399376418a83a1c6373c"}, + {file = "numpy-2.3.2-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8446acd11fe3dc1830568c941d44449fd5cb83068e5c70bd5a470d323d448296"}, + {file = "numpy-2.3.2-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aa098a5ab53fa407fded5870865c6275a5cd4101cfdef8d6fafc48286a96e981"}, + {file = "numpy-2.3.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:6936aff90dda378c09bea075af0d9c675fe3a977a9d2402f95a87f440f59f619"}, + {file = "numpy-2.3.2.tar.gz", hash = "sha256:e0486a11ec30cdecb53f184d496d1c6a20786c81e55e41640270130056f8ee48"}, +] + +[[package]] +name = "openpyxl" +version = "3.1.5" +description = "A Python library to read/write Excel 2010 xlsx/xlsm files" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2"}, + {file = "openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050"}, +] + +[package.dependencies] +et-xmlfile = "*" + +[[package]] +name = "overrides" +version = "7.7.0" +description = "A decorator to automatically detect mismatch when overriding a method." +optional = false +python-versions = ">=3.6" +groups = ["dev"] +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 = "25.0" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, + {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, +] + +[[package]] +name = "pandas" +version = "2.3.1" +description = "Powerful data structures for data analysis, time series, and statistics" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "pandas-2.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:22c2e866f7209ebc3a8f08d75766566aae02bcc91d196935a1d9e59c7b990ac9"}, + {file = "pandas-2.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3583d348546201aff730c8c47e49bc159833f971c2899d6097bce68b9112a4f1"}, + {file = "pandas-2.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f951fbb702dacd390561e0ea45cdd8ecfa7fb56935eb3dd78e306c19104b9b0"}, + {file = "pandas-2.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd05b72ec02ebfb993569b4931b2e16fbb4d6ad6ce80224a3ee838387d83a191"}, + {file = "pandas-2.3.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1b916a627919a247d865aed068eb65eb91a344b13f5b57ab9f610b7716c92de1"}, + {file = "pandas-2.3.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:fe67dc676818c186d5a3d5425250e40f179c2a89145df477dd82945eaea89e97"}, + {file = "pandas-2.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:2eb789ae0274672acbd3c575b0598d213345660120a257b47b5dafdc618aec83"}, + {file = "pandas-2.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2b0540963d83431f5ce8870ea02a7430adca100cec8a050f0811f8e31035541b"}, + {file = "pandas-2.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fe7317f578c6a153912bd2292f02e40c1d8f253e93c599e82620c7f69755c74f"}, + {file = "pandas-2.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6723a27ad7b244c0c79d8e7007092d7c8f0f11305770e2f4cd778b3ad5f9f85"}, + {file = "pandas-2.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3462c3735fe19f2638f2c3a40bd94ec2dc5ba13abbb032dd2fa1f540a075509d"}, + {file = "pandas-2.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:98bcc8b5bf7afed22cc753a28bc4d9e26e078e777066bc53fac7904ddef9a678"}, + {file = "pandas-2.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4d544806b485ddf29e52d75b1f559142514e60ef58a832f74fb38e48d757b299"}, + {file = "pandas-2.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:b3cd4273d3cb3707b6fffd217204c52ed92859533e31dc03b7c5008aa933aaab"}, + {file = "pandas-2.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:689968e841136f9e542020698ee1c4fbe9caa2ed2213ae2388dc7b81721510d3"}, + {file = "pandas-2.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:025e92411c16cbe5bb2a4abc99732a6b132f439b8aab23a59fa593eb00704232"}, + {file = "pandas-2.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b7ff55f31c4fcb3e316e8f7fa194566b286d6ac430afec0d461163312c5841e"}, + {file = "pandas-2.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7dcb79bf373a47d2a40cf7232928eb7540155abbc460925c2c96d2d30b006eb4"}, + {file = "pandas-2.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:56a342b231e8862c96bdb6ab97170e203ce511f4d0429589c8ede1ee8ece48b8"}, + {file = "pandas-2.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ca7ed14832bce68baef331f4d7f294411bed8efd032f8109d690df45e00c4679"}, + {file = "pandas-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:ac942bfd0aca577bef61f2bc8da8147c4ef6879965ef883d8e8d5d2dc3e744b8"}, + {file = "pandas-2.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9026bd4a80108fac2239294a15ef9003c4ee191a0f64b90f170b40cfb7cf2d22"}, + {file = "pandas-2.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6de8547d4fdb12421e2d047a2c446c623ff4c11f47fddb6b9169eb98ffba485a"}, + {file = "pandas-2.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:782647ddc63c83133b2506912cc6b108140a38a37292102aaa19c81c83db2928"}, + {file = "pandas-2.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ba6aff74075311fc88504b1db890187a3cd0f887a5b10f5525f8e2ef55bfdb9"}, + {file = "pandas-2.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e5635178b387bd2ba4ac040f82bc2ef6e6b500483975c4ebacd34bec945fda12"}, + {file = "pandas-2.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6f3bf5ec947526106399a9e1d26d40ee2b259c66422efdf4de63c848492d91bb"}, + {file = "pandas-2.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:1c78cf43c8fde236342a1cb2c34bcff89564a7bfed7e474ed2fffa6aed03a956"}, + {file = "pandas-2.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8dfc17328e8da77be3cf9f47509e5637ba8f137148ed0e9b5241e1baf526e20a"}, + {file = "pandas-2.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:ec6c851509364c59a5344458ab935e6451b31b818be467eb24b0fe89bd05b6b9"}, + {file = "pandas-2.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:911580460fc4884d9b05254b38a6bfadddfcc6aaef856fb5859e7ca202e45275"}, + {file = "pandas-2.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f4d6feeba91744872a600e6edbbd5b033005b431d5ae8379abee5bcfa479fab"}, + {file = "pandas-2.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fe37e757f462d31a9cd7580236a82f353f5713a80e059a29753cf938c6775d96"}, + {file = "pandas-2.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5db9637dbc24b631ff3707269ae4559bce4b7fd75c1c4d7e13f40edc42df4444"}, + {file = "pandas-2.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4645f770f98d656f11c69e81aeb21c6fca076a44bed3dcbb9396a4311bc7f6d8"}, + {file = "pandas-2.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:342e59589cc454aaff7484d75b816a433350b3d7964d7847327edda4d532a2e3"}, + {file = "pandas-2.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d12f618d80379fde6af007f65f0c25bd3e40251dbd1636480dfffce2cf1e6da"}, + {file = "pandas-2.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd71c47a911da120d72ef173aeac0bf5241423f9bfea57320110a978457e069e"}, + {file = "pandas-2.3.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:09e3b1587f0f3b0913e21e8b32c3119174551deb4a4eba4a89bc7377947977e7"}, + {file = "pandas-2.3.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2323294c73ed50f612f67e2bf3ae45aea04dce5690778e08a09391897f35ff88"}, + {file = "pandas-2.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:b4b0de34dc8499c2db34000ef8baad684cfa4cbd836ecee05f323ebfba348c7d"}, + {file = "pandas-2.3.1.tar.gz", hash = "sha256:0a95b9ac964fe83ce317827f80304d37388ea77616b1425f0ae41c9d2d0d7bb2"}, +] + +[package.dependencies] +numpy = {version = ">=1.26.0", markers = "python_version >= \"3.12\""} +python-dateutil = ">=2.8.2" +pytz = ">=2020.1" +tzdata = ">=2022.7" + +[package.extras] +all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"] +aws = ["s3fs (>=2022.11.0)"] +clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"] +compression = ["zstandard (>=0.19.0)"] +computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"] +consortium-standard = ["dataframe-api-compat (>=0.1.7)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"] +feather = ["pyarrow (>=10.0.1)"] +fss = ["fsspec (>=2022.11.0)"] +gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"] +hdf5 = ["tables (>=3.8.0)"] +html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"] +mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"] +parquet = ["pyarrow (>=10.0.1)"] +performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"] +plot = ["matplotlib (>=3.6.3)"] +postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"] +pyarrow = ["pyarrow (>=10.0.1)"] +spss = ["pyreadstat (>=1.2.0)"] +sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"] +test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.9.2)"] + +[[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.*" +groups = ["dev"] +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.4" +description = "A Python Parser" +optional = false +python-versions = ">=3.6" +groups = ["dev"] +files = [ + {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, + {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, +] + +[package.extras] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["docopt", "pytest"] + +[[package]] +name = "pexpect" +version = "4.9.0" +description = "Pexpect allows easy control of interactive console applications." +optional = false +python-versions = "*" +groups = ["dev"] +markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\"" +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.3.8" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4"}, + {file = "platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc"}, +] + +[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" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746"}, + {file = "pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["coverage", "pytest", "pytest-benchmark"] + +[[package]] +name = "prometheus-client" +version = "0.22.1" +description = "Python client for the Prometheus monitoring system." +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "prometheus_client-0.22.1-py3-none-any.whl", hash = "sha256:cca895342e308174341b2cbf99a56bef291fbc0ef7b9e5412a0f26d653ba7094"}, + {file = "prometheus_client-0.22.1.tar.gz", hash = "sha256:190f1331e783cf21eb60bca559354e0a4d4378facecf78f5428c39b675d20d28"}, +] + +[package.extras] +twisted = ["twisted"] + +[[package]] +name = "prompt-toolkit" +version = "3.0.51" +description = "Library for building powerful interactive command lines in Python" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "prompt_toolkit-3.0.51-py3-none-any.whl", hash = "sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07"}, + {file = "prompt_toolkit-3.0.51.tar.gz", hash = "sha256:931a162e3b27fc90c86f1b48bb1fb2c528c2761475e57c9c06de13311c7b54ed"}, +] + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "psutil" +version = "7.0.0" +description = "Cross-platform lib for process and system monitoring in Python. NOTE: the syntax of this script MUST be kept compatible with Python 2.7." +optional = false +python-versions = ">=3.6" +groups = ["dev"] +files = [ + {file = "psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25"}, + {file = "psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da"}, + {file = "psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91"}, + {file = "psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34"}, + {file = "psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993"}, + {file = "psutil-7.0.0-cp36-cp36m-win32.whl", hash = "sha256:84df4eb63e16849689f76b1ffcb36db7b8de703d1bc1fe41773db487621b6c17"}, + {file = "psutil-7.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:1e744154a6580bc968a0195fd25e80432d3afec619daf145b9e5ba16cc1d688e"}, + {file = "psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99"}, + {file = "psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553"}, + {file = "psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456"}, +] + +[package.extras] +dev = ["abi3audit", "black (==24.10.0)", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest", "pytest-cov", "pytest-xdist", "requests", "rstcheck", "ruff", "setuptools", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "vulture", "wheel"] +test = ["pytest", "pytest-xdist", "setuptools"] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +optional = false +python-versions = "*" +groups = ["dev"] +markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\" or os_name != \"nt\"" +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 = "*" +groups = ["dev"] +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 = "pycparser" +version = "2.22" +description = "C parser in Python" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, +] + +[[package]] +name = "pydantic" +version = "2.11.7" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b"}, + {file = "pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db"}, +] + +[package.dependencies] +annotated-types = ">=0.6.0" +pydantic-core = "2.33.2" +typing-extensions = ">=4.12.2" +typing-inspection = ">=0.4.0" + +[package.extras] +email = ["email-validator (>=2.0.0)"] +timezone = ["tzdata ; python_version >= \"3.9\" and platform_system == \"Windows\""] + +[[package]] +name = "pydantic-core" +version = "2.33.2" +description = "Core functionality for Pydantic validation and serialization" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "pydantic_core-2.33.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2b3d326aaef0c0399d9afffeb6367d5e26ddc24d351dbc9c636840ac355dc5d8"}, + {file = "pydantic_core-2.33.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e5b2671f05ba48b94cb90ce55d8bdcaaedb8ba00cc5359f6810fc918713983d"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0069c9acc3f3981b9ff4cdfaf088e98d83440a4c7ea1bc07460af3d4dc22e72d"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d53b22f2032c42eaaf025f7c40c2e3b94568ae077a606f006d206a463bc69572"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0405262705a123b7ce9f0b92f123334d67b70fd1f20a9372b907ce1080c7ba02"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b25d91e288e2c4e0662b8038a28c6a07eaac3e196cfc4ff69de4ea3db992a1b"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bdfe4b3789761f3bcb4b1ddf33355a71079858958e3a552f16d5af19768fef2"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:efec8db3266b76ef9607c2c4c419bdb06bf335ae433b80816089ea7585816f6a"}, + {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:031c57d67ca86902726e0fae2214ce6770bbe2f710dc33063187a68744a5ecac"}, + {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:f8de619080e944347f5f20de29a975c2d815d9ddd8be9b9b7268e2e3ef68605a"}, + {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:73662edf539e72a9440129f231ed3757faab89630d291b784ca99237fb94db2b"}, + {file = "pydantic_core-2.33.2-cp310-cp310-win32.whl", hash = "sha256:0a39979dcbb70998b0e505fb1556a1d550a0781463ce84ebf915ba293ccb7e22"}, + {file = "pydantic_core-2.33.2-cp310-cp310-win_amd64.whl", hash = "sha256:b0379a2b24882fef529ec3b4987cb5d003b9cda32256024e6fe1586ac45fc640"}, + {file = "pydantic_core-2.33.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4c5b0a576fb381edd6d27f0a85915c6daf2f8138dc5c267a57c08a62900758c7"}, + {file = "pydantic_core-2.33.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e799c050df38a639db758c617ec771fd8fb7a5f8eaaa4b27b101f266b216a246"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc46a01bf8d62f227d5ecee74178ffc448ff4e5197c756331f71efcc66dc980f"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a144d4f717285c6d9234a66778059f33a89096dfb9b39117663fd8413d582dcc"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cf6373c21bc80b2e0dc88444f41ae60b2f070ed02095754eb5a01df12256de"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dc625f4aa79713512d1976fe9f0bc99f706a9dee21dfd1810b4bbbf228d0e8a"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b21b5549499972441da4758d662aeea93f1923f953e9cbaff14b8b9565aef"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bdc25f3681f7b78572699569514036afe3c243bc3059d3942624e936ec93450e"}, + {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fe5b32187cbc0c862ee201ad66c30cf218e5ed468ec8dc1cf49dec66e160cc4d"}, + {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:bc7aee6f634a6f4a95676fcb5d6559a2c2a390330098dba5e5a5f28a2e4ada30"}, + {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:235f45e5dbcccf6bd99f9f472858849f73d11120d76ea8707115415f8e5ebebf"}, + {file = "pydantic_core-2.33.2-cp311-cp311-win32.whl", hash = "sha256:6368900c2d3ef09b69cb0b913f9f8263b03786e5b2a387706c5afb66800efd51"}, + {file = "pydantic_core-2.33.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e063337ef9e9820c77acc768546325ebe04ee38b08703244c1309cccc4f1bab"}, + {file = "pydantic_core-2.33.2-cp311-cp311-win_arm64.whl", hash = "sha256:6b99022f1d19bc32a4c2a0d544fc9a76e3be90f0b3f4af413f87d38749300e65"}, + {file = "pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc"}, + {file = "pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b"}, + {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1"}, + {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6"}, + {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea"}, + {file = "pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290"}, + {file = "pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2"}, + {file = "pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab"}, + {file = "pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f"}, + {file = "pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56"}, + {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5"}, + {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e"}, + {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162"}, + {file = "pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849"}, + {file = "pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9"}, + {file = "pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9"}, + {file = "pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac"}, + {file = "pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5"}, + {file = "pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9"}, + {file = "pydantic_core-2.33.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a2b911a5b90e0374d03813674bf0a5fbbb7741570dcd4b4e85a2e48d17def29d"}, + {file = "pydantic_core-2.33.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6fa6dfc3e4d1f734a34710f391ae822e0a8eb8559a85c6979e14e65ee6ba2954"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c54c939ee22dc8e2d545da79fc5381f1c020d6d3141d3bd747eab59164dc89fb"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53a57d2ed685940a504248187d5685e49eb5eef0f696853647bf37c418c538f7"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09fb9dd6571aacd023fe6aaca316bd01cf60ab27240d7eb39ebd66a3a15293b4"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0e6116757f7959a712db11f3e9c0a99ade00a5bbedae83cb801985aa154f071b"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d55ab81c57b8ff8548c3e4947f119551253f4e3787a7bbc0b6b3ca47498a9d3"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c20c462aa4434b33a2661701b861604913f912254e441ab8d78d30485736115a"}, + {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:44857c3227d3fb5e753d5fe4a3420d6376fa594b07b621e220cd93703fe21782"}, + {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:eb9b459ca4df0e5c87deb59d37377461a538852765293f9e6ee834f0435a93b9"}, + {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9fcd347d2cc5c23b06de6d3b7b8275be558a0c90549495c699e379a80bf8379e"}, + {file = "pydantic_core-2.33.2-cp39-cp39-win32.whl", hash = "sha256:83aa99b1285bc8f038941ddf598501a86f1536789740991d7d8756e34f1e74d9"}, + {file = "pydantic_core-2.33.2-cp39-cp39-win_amd64.whl", hash = "sha256:f481959862f57f29601ccced557cc2e817bce7533ab8e01a797a48b49c9692b3"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5c4aa4e82353f65e548c476b37e64189783aa5384903bfea4f41580f255fddfa"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d946c8bf0d5c24bf4fe333af284c59a19358aa3ec18cb3dc4370080da1e8ad29"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87b31b6846e361ef83fedb187bb5b4372d0da3f7e28d85415efa92d6125d6e6d"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa9d91b338f2df0508606f7009fde642391425189bba6d8c653afd80fd6bb64e"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2058a32994f1fde4ca0480ab9d1e75a0e8c87c22b53a3ae66554f9af78f2fe8c"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:0e03262ab796d986f978f79c943fc5f620381be7287148b8010b4097f79a39ec"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:1a8695a8d00c73e50bff9dfda4d540b7dee29ff9b8053e38380426a85ef10052"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:fa754d1850735a0b0e03bcffd9d4b4343eb417e47196e4485d9cca326073a42c"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a11c8d26a50bfab49002947d3d237abe4d9e4b5bdc8846a63537b6488e197808"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:dd14041875d09cc0f9308e37a6f8b65f5585cf2598a53aa0123df8b129d481f8"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d87c561733f66531dced0da6e864f44ebf89a8fba55f31407b00c2f7f9449593"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f82865531efd18d6e07a04a17331af02cb7a651583c418df8266f17a63c6612"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bfb5112df54209d820d7bf9317c7a6c9025ea52e49f46b6a2060104bba37de7"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:64632ff9d614e5eecfb495796ad51b0ed98c453e447a76bcbeeb69615079fc7e"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f889f7a40498cc077332c7ab6b4608d296d852182211787d4f3ee377aaae66e8"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:87acbfcf8e90ca885206e98359d7dca4bcbb35abdc0ff66672a293e1d7a19101"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:7f92c15cd1e97d4b12acd1cc9004fa092578acfa57b67ad5e43a197175d01a64"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3f26877a748dc4251cfcfda9dfb5f13fcb034f5308388066bcfe9031b63ae7d"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac89aea9af8cd672fa7b510e7b8c33b0bba9a43186680550ccf23020f32d535"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:970919794d126ba8645f3837ab6046fb4e72bbc057b3709144066204c19a455d"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3eb3fe62804e8f859c49ed20a8451342de53ed764150cb14ca71357c765dc2a6"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:3abcd9392a36025e3bd55f9bd38d908bd17962cc49bc6da8e7e96285336e2bca"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:3a1c81334778f9e3af2f8aeb7a960736e5cab1dfebfb26aabca09afd2906c039"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2807668ba86cb38c6817ad9bc66215ab8584d1d304030ce4f0887336f28a5e27"}, + {file = "pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + +[[package]] +name = "pydantic-settings" +version = "2.10.1" +description = "Settings management using Pydantic" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "pydantic_settings-2.10.1-py3-none-any.whl", hash = "sha256:a60952460b99cf661dc25c29c0ef171721f98bfcb52ef8d9ea4c943d7c8cc796"}, + {file = "pydantic_settings-2.10.1.tar.gz", hash = "sha256:06f0062169818d0f5524420a360d632d5857b83cffd4d42fe29597807a1614ee"}, +] + +[package.dependencies] +pydantic = ">=2.7.0" +python-dotenv = ">=0.21.0" +typing-inspection = ">=0.4.0" + +[package.extras] +aws-secrets-manager = ["boto3 (>=1.35.0)", "boto3-stubs[secretsmanager]"] +azure-key-vault = ["azure-identity (>=1.16.0)", "azure-keyvault-secrets (>=4.8.0)"] +gcp-secret-manager = ["google-cloud-secret-manager (>=2.23.1)"] +toml = ["tomli (>=2.0.1)"] +yaml = ["pyyaml (>=6.0.1)"] + +[[package]] +name = "pydeps" +version = "3.0.1" +description = "Display module dependencies" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "pydeps-3.0.1-py3-none-any.whl", hash = "sha256:7c86ee63c9ee6ddd088c840364981c5aa214a994d323bb7fa4724fca30829bee"}, + {file = "pydeps-3.0.1.tar.gz", hash = "sha256:a57415a8fae2ff6840a199b7dfcfecb90c37e4b9b54b58a111808a3440bc03bc"}, +] + +[package.dependencies] +stdlib_list = "*" + +[[package]] +name = "pygments" +version = "2.19.2" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b"}, + {file = "pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887"}, +] + +[package.extras] +windows-terminal = ["colorama (>=0.4.6)"] + +[[package]] +name = "pylint" +version = "3.3.8" +description = "python code static checker" +optional = false +python-versions = ">=3.9.0" +groups = ["dev"] +files = [ + {file = "pylint-3.3.8-py3-none-any.whl", hash = "sha256:7ef94aa692a600e82fabdd17102b73fc226758218c97473c7ad67bd4cb905d83"}, + {file = "pylint-3.3.8.tar.gz", hash = "sha256:26698de19941363037e2937d3db9ed94fb3303fdadf7d98847875345a8bb6b05"}, +] + +[package.dependencies] +astroid = ">=3.3.8,<=3.4.0.dev0" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +dill = {version = ">=0.3.7", markers = "python_version >= \"3.12\""} +isort = ">=4.2.5,<5.13 || >5.13,<7" +mccabe = ">=0.6,<0.8" +platformdirs = ">=2.2" +tomlkit = ">=0.10.1" + +[package.extras] +spelling = ["pyenchant (>=3.2,<4.0)"] +testutils = ["gitpython (>3)"] + +[[package]] +name = "pytest" +version = "8.4.1" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "pytest-8.4.1-py3-none-any.whl", hash = "sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7"}, + {file = "pytest-8.4.1.tar.gz", hash = "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c"}, +] + +[package.dependencies] +colorama = {version = ">=0.4", markers = "sys_platform == \"win32\""} +iniconfig = ">=1" +packaging = ">=20" +pluggy = ">=1.5,<2" +pygments = ">=2.7.2" + +[package.extras] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-cov" +version = "6.2.1" +description = "Pytest plugin for measuring coverage." +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "pytest_cov-6.2.1-py3-none-any.whl", hash = "sha256:f5bc4c23f42f1cdd23c70b1dab1bbaef4fc505ba950d53e0081d0730dd7e86d5"}, + {file = "pytest_cov-6.2.1.tar.gz", hash = "sha256:25cc6cc0a5358204b8108ecedc51a9b57b34cc6b8c967cc2c01a4e00d8a67da2"}, +] + +[package.dependencies] +coverage = {version = ">=7.5", extras = ["toml"]} +pluggy = ">=1.2" +pytest = ">=6.2.5" + +[package.extras] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main", "dev"] +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-dotenv" +version = "1.1.1" +description = "Read key-value pairs from a .env file and set them as environment variables" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "python_dotenv-1.1.1-py3-none-any.whl", hash = "sha256:31f23644fe2602f88ff55e1f5c79ba497e01224ee7737937930c448e4d0e24dc"}, + {file = "python_dotenv-1.1.1.tar.gz", hash = "sha256:a8a6399716257f45be6a007360200409fce5cda2661e3dec71d23dc15f6189ab"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + +[[package]] +name = "python-json-logger" +version = "3.3.0" +description = "JSON Log Formatter for the Python Logging Package" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "python_json_logger-3.3.0-py3-none-any.whl", hash = "sha256:dd980fae8cffb24c13caf6e158d3d61c0d6d22342f932cb6e9deedab3d35eec7"}, + {file = "python_json_logger-3.3.0.tar.gz", hash = "sha256:12b7e74b17775e7d565129296105bbe3910842d9d0eb083fc83a6a617aa8df84"}, +] + +[package.extras] +dev = ["backports.zoneinfo ; python_version < \"3.9\"", "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 ; implementation_name != \"pypy\"", "mypy", "orjson ; implementation_name != \"pypy\"", "pylint", "pytest", "tzdata", "validate-pyproject[all]"] + +[[package]] +name = "pytz" +version = "2025.2" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00"}, + {file = "pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3"}, +] + +[[package]] +name = "pywin32" +version = "311" +description = "Python for Window Extensions" +optional = false +python-versions = "*" +groups = ["dev"] +markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\"" +files = [ + {file = "pywin32-311-cp310-cp310-win32.whl", hash = "sha256:d03ff496d2a0cd4a5893504789d4a15399133fe82517455e78bad62efbb7f0a3"}, + {file = "pywin32-311-cp310-cp310-win_amd64.whl", hash = "sha256:797c2772017851984b97180b0bebe4b620bb86328e8a884bb626156295a63b3b"}, + {file = "pywin32-311-cp310-cp310-win_arm64.whl", hash = "sha256:0502d1facf1fed4839a9a51ccbcc63d952cf318f78ffc00a7e78528ac27d7a2b"}, + {file = "pywin32-311-cp311-cp311-win32.whl", hash = "sha256:184eb5e436dea364dcd3d2316d577d625c0351bf237c4e9a5fabbcfa5a58b151"}, + {file = "pywin32-311-cp311-cp311-win_amd64.whl", hash = "sha256:3ce80b34b22b17ccbd937a6e78e7225d80c52f5ab9940fe0506a1a16f3dab503"}, + {file = "pywin32-311-cp311-cp311-win_arm64.whl", hash = "sha256:a733f1388e1a842abb67ffa8e7aad0e70ac519e09b0f6a784e65a136ec7cefd2"}, + {file = "pywin32-311-cp312-cp312-win32.whl", hash = "sha256:750ec6e621af2b948540032557b10a2d43b0cee2ae9758c54154d711cc852d31"}, + {file = "pywin32-311-cp312-cp312-win_amd64.whl", hash = "sha256:b8c095edad5c211ff31c05223658e71bf7116daa0ecf3ad85f3201ea3190d067"}, + {file = "pywin32-311-cp312-cp312-win_arm64.whl", hash = "sha256:e286f46a9a39c4a18b319c28f59b61de793654af2f395c102b4f819e584b5852"}, + {file = "pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d"}, + {file = "pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d"}, + {file = "pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a"}, + {file = "pywin32-311-cp314-cp314-win32.whl", hash = "sha256:b7a2c10b93f8986666d0c803ee19b5990885872a7de910fc460f9b0c2fbf92ee"}, + {file = "pywin32-311-cp314-cp314-win_amd64.whl", hash = "sha256:3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87"}, + {file = "pywin32-311-cp314-cp314-win_arm64.whl", hash = "sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42"}, + {file = "pywin32-311-cp38-cp38-win32.whl", hash = "sha256:6c6f2969607b5023b0d9ce2541f8d2cbb01c4f46bc87456017cf63b73f1e2d8c"}, + {file = "pywin32-311-cp38-cp38-win_amd64.whl", hash = "sha256:c8015b09fb9a5e188f83b7b04de91ddca4658cee2ae6f3bc483f0b21a77ef6cd"}, + {file = "pywin32-311-cp39-cp39-win32.whl", hash = "sha256:aba8f82d551a942cb20d4a83413ccbac30790b50efb89a75e4f586ac0bb8056b"}, + {file = "pywin32-311-cp39-cp39-win_amd64.whl", hash = "sha256:e0c4cfb0621281fe40387df582097fd796e80430597cb9944f0ae70447bacd91"}, + {file = "pywin32-311-cp39-cp39-win_arm64.whl", hash = "sha256:62ea666235135fee79bb154e695f3ff67370afefd71bd7fea7512fc70ef31e3d"}, +] + +[[package]] +name = "pywinpty" +version = "3.0.0" +description = "" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +markers = "os_name == \"nt\"" +files = [ + {file = "pywinpty-3.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:327b6034e0dc38352c1c99a7c0b3e54941b4e506a5f21acce63609cd2ab6cce2"}, + {file = "pywinpty-3.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:29daa71ac5dcbe1496ef99f4cde85a732b1f0a3b71405d42177dbcf9ee405e5a"}, + {file = "pywinpty-3.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:1e0c4b01e5b03b1531d7c5d0e044b8c66dd0288c6d2b661820849f2a8d91aec3"}, + {file = "pywinpty-3.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:828cbe756b7e3d25d886fbd5691a1d523cd59c5fb79286bb32bb75c5221e7ba1"}, + {file = "pywinpty-3.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:de0cbe27b96e5a2cebd86c4a6b8b4139f978d9c169d44a8edc7e30e88e5d7a69"}, + {file = "pywinpty-3.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:007735316170ec1b6e773deadab5fe9ec4074dfdc06f27513fe87b8cfe45237d"}, + {file = "pywinpty-3.0.0.tar.gz", hash = "sha256:68f70e68a9f0766ffdea3fc500351cb7b9b012bcb8239a411f7ff0fc8f86dcb1"}, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.8" +groups = ["main", "dev"] +files = [ + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, +] + +[[package]] +name = "pyzmq" +version = "27.0.1" +description = "Python bindings for 0MQ" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "pyzmq-27.0.1-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:90a4da42aa322de8a3522461e3b5fe999935763b27f69a02fced40f4e3cf9682"}, + {file = "pyzmq-27.0.1-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:e648dca28178fc879c814cf285048dd22fd1f03e1104101106505ec0eea50a4d"}, + {file = "pyzmq-27.0.1-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bca8abc31799a6f3652d13f47e0b0e1cab76f9125f2283d085a3754f669b607"}, + {file = "pyzmq-27.0.1-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:092f4011b26d6b0201002f439bd74b38f23f3aefcb358621bdc3b230afc9b2d5"}, + {file = "pyzmq-27.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6f02f30a4a6b3efe665ab13a3dd47109d80326c8fd286311d1ba9f397dc5f247"}, + {file = "pyzmq-27.0.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f293a1419266e3bf3557d1f8778f9e1ffe7e6b2c8df5c9dca191caf60831eb74"}, + {file = "pyzmq-27.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ce181dd1a7c6c012d0efa8ab603c34b5ee9d86e570c03415bbb1b8772eeb381c"}, + {file = "pyzmq-27.0.1-cp310-cp310-win32.whl", hash = "sha256:f65741cc06630652e82aa68ddef4986a3ab9073dd46d59f94ce5f005fa72037c"}, + {file = "pyzmq-27.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:44909aa3ed2234d69fe81e1dade7be336bcfeab106e16bdaa3318dcde4262b93"}, + {file = "pyzmq-27.0.1-cp310-cp310-win_arm64.whl", hash = "sha256:4401649bfa0a38f0f8777f8faba7cd7eb7b5b8ae2abc7542b830dd09ad4aed0d"}, + {file = "pyzmq-27.0.1-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:9729190bd770314f5fbba42476abf6abe79a746eeda11d1d68fd56dd70e5c296"}, + {file = "pyzmq-27.0.1-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:696900ef6bc20bef6a242973943574f96c3f97d2183c1bd3da5eea4f559631b1"}, + {file = "pyzmq-27.0.1-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f96a63aecec22d3f7fdea3c6c98df9e42973f5856bb6812c3d8d78c262fee808"}, + {file = "pyzmq-27.0.1-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c512824360ea7490390566ce00bee880e19b526b312b25cc0bc30a0fe95cb67f"}, + {file = "pyzmq-27.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dfb2bb5e0f7198eaacfb6796fb0330afd28f36d985a770745fba554a5903595a"}, + {file = "pyzmq-27.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4f6886c59ba93ffde09b957d3e857e7950c8fe818bd5494d9b4287bc6d5bc7f1"}, + {file = "pyzmq-27.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b99ea9d330e86ce1ff7f2456b33f1bf81c43862a5590faf4ef4ed3a63504bdab"}, + {file = "pyzmq-27.0.1-cp311-cp311-win32.whl", hash = "sha256:571f762aed89025ba8cdcbe355fea56889715ec06d0264fd8b6a3f3fa38154ed"}, + {file = "pyzmq-27.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:ee16906c8025fa464bea1e48128c048d02359fb40bebe5333103228528506530"}, + {file = "pyzmq-27.0.1-cp311-cp311-win_arm64.whl", hash = "sha256:ba068f28028849da725ff9185c24f832ccf9207a40f9b28ac46ab7c04994bd41"}, + {file = "pyzmq-27.0.1-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:af7ebce2a1e7caf30c0bb64a845f63a69e76a2fadbc1cac47178f7bb6e657bdd"}, + {file = "pyzmq-27.0.1-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:8f617f60a8b609a13099b313e7e525e67f84ef4524b6acad396d9ff153f6e4cd"}, + {file = "pyzmq-27.0.1-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d59dad4173dc2a111f03e59315c7bd6e73da1a9d20a84a25cf08325b0582b1a"}, + {file = "pyzmq-27.0.1-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f5b6133c8d313bde8bd0d123c169d22525300ff164c2189f849de495e1344577"}, + {file = "pyzmq-27.0.1-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:58cca552567423f04d06a075f4b473e78ab5bdb906febe56bf4797633f54aa4e"}, + {file = "pyzmq-27.0.1-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:4b9d8e26fb600d0d69cc9933e20af08552e97cc868a183d38a5c0d661e40dfbb"}, + {file = "pyzmq-27.0.1-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2329f0c87f0466dce45bba32b63f47018dda5ca40a0085cc5c8558fea7d9fc55"}, + {file = "pyzmq-27.0.1-cp312-abi3-win32.whl", hash = "sha256:57bb92abdb48467b89c2d21da1ab01a07d0745e536d62afd2e30d5acbd0092eb"}, + {file = "pyzmq-27.0.1-cp312-abi3-win_amd64.whl", hash = "sha256:ff3f8757570e45da7a5bedaa140489846510014f7a9d5ee9301c61f3f1b8a686"}, + {file = "pyzmq-27.0.1-cp312-abi3-win_arm64.whl", hash = "sha256:df2c55c958d3766bdb3e9d858b911288acec09a9aab15883f384fc7180df5bed"}, + {file = "pyzmq-27.0.1-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:497bd8af534ae55dc4ef67eebd1c149ff2a0b0f1e146db73c8b5a53d83c1a5f5"}, + {file = "pyzmq-27.0.1-cp313-cp313-android_24_x86_64.whl", hash = "sha256:a066ea6ad6218b4c233906adf0ae67830f451ed238419c0db609310dd781fbe7"}, + {file = "pyzmq-27.0.1-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:72d235d6365ca73d8ce92f7425065d70f5c1e19baa458eb3f0d570e425b73a96"}, + {file = "pyzmq-27.0.1-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:313a7b374e3dc64848644ca348a51004b41726f768b02e17e689f1322366a4d9"}, + {file = "pyzmq-27.0.1-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:119ce8590409702394f959c159d048002cbed2f3c0645ec9d6a88087fc70f0f1"}, + {file = "pyzmq-27.0.1-cp313-cp313t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:45c3e00ce16896ace2cd770ab9057a7cf97d4613ea5f2a13f815141d8b6894b9"}, + {file = "pyzmq-27.0.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:678e50ec112bdc6df5a83ac259a55a4ba97a8b314c325ab26b3b5b071151bc61"}, + {file = "pyzmq-27.0.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:d0b96c30be9f9387b18b18b6133c75a7b1b0065da64e150fe1feb5ebf31ece1c"}, + {file = "pyzmq-27.0.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:88dc92d9eb5ea4968123e74db146d770b0c8d48f0e2bfb1dbc6c50a8edb12d64"}, + {file = "pyzmq-27.0.1-cp313-cp313t-win32.whl", hash = "sha256:6dcbcb34f5c9b0cefdfc71ff745459241b7d3cda5b27c7ad69d45afc0821d1e1"}, + {file = "pyzmq-27.0.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9fd0fda730461f510cfd9a40fafa5355d65f5e3dbdd8d6dfa342b5b3f5d1949"}, + {file = "pyzmq-27.0.1-cp313-cp313t-win_arm64.whl", hash = "sha256:56a3b1853f3954ec1f0e91085f1350cc57d18f11205e4ab6e83e4b7c414120e0"}, + {file = "pyzmq-27.0.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:f98f6b7787bd2beb1f0dde03f23a0621a0c978edf673b7d8f5e7bc039cbe1b60"}, + {file = "pyzmq-27.0.1-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:351bf5d8ca0788ca85327fda45843b6927593ff4c807faee368cc5aaf9f809c2"}, + {file = "pyzmq-27.0.1-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5268a5a9177afff53dc6d70dffe63114ba2a6e7b20d9411cc3adeba09eeda403"}, + {file = "pyzmq-27.0.1-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a4aca06ba295aa78bec9b33ec028d1ca08744c36294338c41432b7171060c808"}, + {file = "pyzmq-27.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1c363c6dc66352331d5ad64bb838765c6692766334a6a02fdb05e76bd408ae18"}, + {file = "pyzmq-27.0.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:87aebf4acd7249bdff8d3df03aed4f09e67078e6762cfe0aecf8d0748ff94cde"}, + {file = "pyzmq-27.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e4f22d67756518d71901edf73b38dc0eb4765cce22c8fe122cc81748d425262b"}, + {file = "pyzmq-27.0.1-cp314-cp314t-win32.whl", hash = "sha256:8c62297bc7aea2147b472ca5ca2b4389377ad82898c87cabab2a94aedd75e337"}, + {file = "pyzmq-27.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:bee5248d5ec9223545f8cc4f368c2d571477ae828c99409125c3911511d98245"}, + {file = "pyzmq-27.0.1-cp314-cp314t-win_arm64.whl", hash = "sha256:0fc24bf45e4a454e55ef99d7f5c8b8712539200ce98533af25a5bfa954b6b390"}, + {file = "pyzmq-27.0.1-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:9d16fdfd7d70a6b0ca45d36eb19f7702fa77ef6256652f17594fc9ce534c9da6"}, + {file = "pyzmq-27.0.1-cp38-cp38-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:d0356a21e58c3e99248930ff73cc05b1d302ff50f41a8a47371aefb04327378a"}, + {file = "pyzmq-27.0.1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a27fa11ebaccc099cac4309c799aa33919671a7660e29b3e465b7893bc64ec81"}, + {file = "pyzmq-27.0.1-cp38-cp38-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b25e72e115399a4441aad322258fa8267b873850dc7c276e3f874042728c2b45"}, + {file = "pyzmq-27.0.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f8c3b74f1cd577a5a9253eae7ed363f88cbb345a990ca3027e9038301d47c7f4"}, + {file = "pyzmq-27.0.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:19dce6c93656f9c469540350d29b128cd8ba55b80b332b431b9a1e9ff74cfd01"}, + {file = "pyzmq-27.0.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:da81512b83032ed6cdf85ca62e020b4c23dda87f1b6c26b932131222ccfdbd27"}, + {file = "pyzmq-27.0.1-cp38-cp38-win32.whl", hash = "sha256:7418fb5736d0d39b3ecc6bec4ff549777988feb260f5381636d8bd321b653038"}, + {file = "pyzmq-27.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:af2ee67b3688b067e20fea3fe36b823a362609a1966e7e7a21883ae6da248804"}, + {file = "pyzmq-27.0.1-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:05a94233fdde585eb70924a6e4929202a747eea6ed308a6171c4f1c715bbe39e"}, + {file = "pyzmq-27.0.1-cp39-cp39-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:c96702e1082eab62ae583d64c4e19c9b848359196697e536a0c57ae9bd165bd5"}, + {file = "pyzmq-27.0.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c9180d1f5b4b73e28b64e63cc6c4c097690f102aa14935a62d5dd7426a4e5b5a"}, + {file = "pyzmq-27.0.1-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e971d8680003d0af6020713e52f92109b46fedb463916e988814e04c8133578a"}, + {file = "pyzmq-27.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fe632fa4501154d58dfbe1764a0495734d55f84eaf1feda4549a1f1ca76659e9"}, + {file = "pyzmq-27.0.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:4c3874344fd5fa6d58bb51919708048ac4cab21099f40a227173cddb76b4c20b"}, + {file = "pyzmq-27.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0ec09073ed67ae236785d543df3b322282acc0bdf6d1b748c3e81f3043b21cb5"}, + {file = "pyzmq-27.0.1-cp39-cp39-win32.whl", hash = "sha256:f44e7ea288d022d4bf93b9e79dafcb4a7aea45a3cbeae2116792904931cefccf"}, + {file = "pyzmq-27.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:ffe6b809a97ac6dea524b3b837d5b28743d8c2f121141056d168ff0ba8f614ef"}, + {file = "pyzmq-27.0.1-cp39-cp39-win_arm64.whl", hash = "sha256:fde26267416c8478c95432c81489b53f57b0b5d24cd5c8bfaebf5bbaac4dc90c"}, + {file = "pyzmq-27.0.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:544b995a6a1976fad5d7ff01409b4588f7608ccc41be72147700af91fd44875d"}, + {file = "pyzmq-27.0.1-pp310-pypy310_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:0f772eea55cccce7f45d6ecdd1d5049c12a77ec22404f6b892fae687faa87bee"}, + {file = "pyzmq-27.0.1-pp310-pypy310_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9d63d66059114a6756d09169c9209ffceabacb65b9cb0f66e6fc344b20b73e6"}, + {file = "pyzmq-27.0.1-pp310-pypy310_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1da8e645c655d86f0305fb4c65a0d848f461cd90ee07d21f254667287b5dbe50"}, + {file = "pyzmq-27.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1843fd0daebcf843fe6d4da53b8bdd3fc906ad3e97d25f51c3fed44436d82a49"}, + {file = "pyzmq-27.0.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7fb0ee35845bef1e8c4a152d766242164e138c239e3182f558ae15cb4a891f94"}, + {file = "pyzmq-27.0.1-pp311-pypy311_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:f379f11e138dfd56c3f24a04164f871a08281194dd9ddf656a278d7d080c8ad0"}, + {file = "pyzmq-27.0.1-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b978c0678cffbe8860ec9edc91200e895c29ae1ac8a7085f947f8e8864c489fb"}, + {file = "pyzmq-27.0.1-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7ebccf0d760bc92a4a7c751aeb2fef6626144aace76ee8f5a63abeb100cae87f"}, + {file = "pyzmq-27.0.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:77fed80e30fa65708546c4119840a46691290efc231f6bfb2ac2a39b52e15811"}, + {file = "pyzmq-27.0.1-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:9d7b6b90da7285642f480b48c9efd1d25302fd628237d8f6f6ee39ba6b2d2d34"}, + {file = "pyzmq-27.0.1-pp38-pypy38_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:d2976b7079f09f48d59dc123293ed6282fca6ef96a270f4ea0364e4e54c8e855"}, + {file = "pyzmq-27.0.1-pp38-pypy38_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2852f67371918705cc18b321695f75c5d653d5d8c4a9b946c1eec4dab2bd6fdf"}, + {file = "pyzmq-27.0.1-pp38-pypy38_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be45a895f98877271e8a0b6cf40925e0369121ce423421c20fa6d7958dc753c2"}, + {file = "pyzmq-27.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:64ca3c7c614aefcdd5e358ecdd41d1237c35fe1417d01ec0160e7cdb0a380edc"}, + {file = "pyzmq-27.0.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:d97b59cbd8a6c8b23524a8ce237ff9504d987dc07156258aa68ae06d2dd5f34d"}, + {file = "pyzmq-27.0.1-pp39-pypy39_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:27a78bdd384dbbe7b357af95f72efe8c494306b5ec0a03c31e2d53d6763e5307"}, + {file = "pyzmq-27.0.1-pp39-pypy39_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b007e5dcba684e888fbc90554cb12a2f4e492927c8c2761a80b7590209821743"}, + {file = "pyzmq-27.0.1-pp39-pypy39_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:95594b2ceeaa94934e3e94dd7bf5f3c3659cf1a26b1fb3edcf6e42dad7e0eaf2"}, + {file = "pyzmq-27.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:70b719a130b81dd130a57ac0ff636dc2c0127c5b35ca5467d1b67057e3c7a4d2"}, + {file = "pyzmq-27.0.1.tar.gz", hash = "sha256:45c549204bc20e7484ffd2555f6cf02e572440ecf2f3bdd60d4404b20fddf64b"}, +] + +[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" +groups = ["dev"] +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.4" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.8" +groups = ["main", "dev"] +files = [ + {file = "requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c"}, + {file = "requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset_normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "requests-mock" +version = "1.12.1" +description = "Mock out responses from the requests package" +optional = false +python-versions = ">=3.5" +groups = ["dev"] +files = [ + {file = "requests-mock-1.12.1.tar.gz", hash = "sha256:e9e12e333b525156e82a3c852f22016b9158220d2f47454de9cae8a77d371401"}, + {file = "requests_mock-1.12.1-py2.py3-none-any.whl", hash = "sha256:b1e37054004cdd5e56c84454cc7df12b25f90f382159087f4b6915aaeef39563"}, +] + +[package.dependencies] +requests = ">=2.22,<3" + +[package.extras] +fixture = ["fixtures"] + +[[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.*" +groups = ["dev"] +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.*" +groups = ["dev"] +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" +groups = ["dev"] +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 = "rpds-py" +version = "0.27.0" +description = "Python bindings to Rust's persistent data structures (rpds)" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "rpds_py-0.27.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:130c1ffa5039a333f5926b09e346ab335f0d4ec393b030a18549a7c7e7c2cea4"}, + {file = "rpds_py-0.27.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a4cf32a26fa744101b67bfd28c55d992cd19438aff611a46cac7f066afca8fd4"}, + {file = "rpds_py-0.27.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64a0fe3f334a40b989812de70160de6b0ec7e3c9e4a04c0bbc48d97c5d3600ae"}, + {file = "rpds_py-0.27.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a0ff7ee28583ab30a52f371b40f54e7138c52ca67f8ca17ccb7ccf0b383cb5f"}, + {file = "rpds_py-0.27.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:15ea4d2e182345dd1b4286593601d766411b43f868924afe297570658c31a62b"}, + {file = "rpds_py-0.27.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:36184b44bf60a480863e51021c26aca3dfe8dd2f5eeabb33622b132b9d8b8b54"}, + {file = "rpds_py-0.27.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b78430703cfcf5f5e86eb74027a1ed03a93509273d7c705babb547f03e60016"}, + {file = "rpds_py-0.27.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:dbd749cff1defbde270ca346b69b3baf5f1297213ef322254bf2a28537f0b046"}, + {file = "rpds_py-0.27.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bde37765564cd22a676dd8101b657839a1854cfaa9c382c5abf6ff7accfd4ae"}, + {file = "rpds_py-0.27.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1d66f45b9399036e890fb9c04e9f70c33857fd8f58ac8db9f3278cfa835440c3"}, + {file = "rpds_py-0.27.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d85d784c619370d9329bbd670f41ff5f2ae62ea4519761b679d0f57f0f0ee267"}, + {file = "rpds_py-0.27.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5df559e9e7644d9042f626f2c3997b555f347d7a855a15f170b253f6c5bfe358"}, + {file = "rpds_py-0.27.0-cp310-cp310-win32.whl", hash = "sha256:b8a4131698b6992b2a56015f51646711ec5d893a0b314a4b985477868e240c87"}, + {file = "rpds_py-0.27.0-cp310-cp310-win_amd64.whl", hash = "sha256:cbc619e84a5e3ab2d452de831c88bdcad824414e9c2d28cd101f94dbdf26329c"}, + {file = "rpds_py-0.27.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:dbc2ab5d10544eb485baa76c63c501303b716a5c405ff2469a1d8ceffaabf622"}, + {file = "rpds_py-0.27.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7ec85994f96a58cf7ed288caa344b7fe31fd1d503bdf13d7331ead5f70ab60d5"}, + {file = "rpds_py-0.27.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:190d7285cd3bb6d31d37a0534d7359c1ee191eb194c511c301f32a4afa5a1dd4"}, + {file = "rpds_py-0.27.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c10d92fb6d7fd827e44055fcd932ad93dac6a11e832d51534d77b97d1d85400f"}, + {file = "rpds_py-0.27.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd2c1d27ebfe6a015cfa2005b7fe8c52d5019f7bbdd801bc6f7499aab9ae739e"}, + {file = "rpds_py-0.27.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4790c9d5dd565ddb3e9f656092f57268951398cef52e364c405ed3112dc7c7c1"}, + {file = "rpds_py-0.27.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4300e15e7d03660f04be84a125d1bdd0e6b2f674bc0723bc0fd0122f1a4585dc"}, + {file = "rpds_py-0.27.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:59195dc244fc183209cf8a93406889cadde47dfd2f0a6b137783aa9c56d67c85"}, + {file = "rpds_py-0.27.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fae4a01ef8c4cb2bbe92ef2063149596907dc4a881a8d26743b3f6b304713171"}, + {file = "rpds_py-0.27.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e3dc8d4ede2dbae6c0fc2b6c958bf51ce9fd7e9b40c0f5b8835c3fde44f5807d"}, + {file = "rpds_py-0.27.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:c3782fb753aa825b4ccabc04292e07897e2fd941448eabf666856c5530277626"}, + {file = "rpds_py-0.27.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:887ab1f12b0d227e9260558a4a2320024b20102207ada65c43e1ffc4546df72e"}, + {file = "rpds_py-0.27.0-cp311-cp311-win32.whl", hash = "sha256:5d6790ff400254137b81b8053b34417e2c46921e302d655181d55ea46df58cf7"}, + {file = "rpds_py-0.27.0-cp311-cp311-win_amd64.whl", hash = "sha256:e24d8031a2c62f34853756d9208eeafa6b940a1efcbfe36e8f57d99d52bb7261"}, + {file = "rpds_py-0.27.0-cp311-cp311-win_arm64.whl", hash = "sha256:08680820d23df1df0a0260f714d12966bc6c42d02e8055a91d61e03f0c47dda0"}, + {file = "rpds_py-0.27.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:19c990fdf5acecbf0623e906ae2e09ce1c58947197f9bced6bbd7482662231c4"}, + {file = "rpds_py-0.27.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6c27a7054b5224710fcfb1a626ec3ff4f28bcb89b899148c72873b18210e446b"}, + {file = "rpds_py-0.27.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09965b314091829b378b60607022048953e25f0b396c2b70e7c4c81bcecf932e"}, + {file = "rpds_py-0.27.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:14f028eb47f59e9169bfdf9f7ceafd29dd64902141840633683d0bad5b04ff34"}, + {file = "rpds_py-0.27.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6168af0be75bba990a39f9431cdfae5f0ad501f4af32ae62e8856307200517b8"}, + {file = "rpds_py-0.27.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ab47fe727c13c09d0e6f508e3a49e545008e23bf762a245b020391b621f5b726"}, + {file = "rpds_py-0.27.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fa01b3d5e3b7d97efab65bd3d88f164e289ec323a8c033c5c38e53ee25c007e"}, + {file = "rpds_py-0.27.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:6c135708e987f46053e0a1246a206f53717f9fadfba27174a9769ad4befba5c3"}, + {file = "rpds_py-0.27.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fc327f4497b7087d06204235199daf208fd01c82d80465dc5efa4ec9df1c5b4e"}, + {file = "rpds_py-0.27.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7e57906e38583a2cba67046a09c2637e23297618dc1f3caddbc493f2be97c93f"}, + {file = "rpds_py-0.27.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f4f69d7a4300fbf91efb1fb4916421bd57804c01ab938ab50ac9c4aa2212f03"}, + {file = "rpds_py-0.27.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b4c4fbbcff474e1e5f38be1bf04511c03d492d42eec0babda5d03af3b5589374"}, + {file = "rpds_py-0.27.0-cp312-cp312-win32.whl", hash = "sha256:27bac29bbbf39601b2aab474daf99dbc8e7176ca3389237a23944b17f8913d97"}, + {file = "rpds_py-0.27.0-cp312-cp312-win_amd64.whl", hash = "sha256:8a06aa1197ec0281eb1d7daf6073e199eb832fe591ffa329b88bae28f25f5fe5"}, + {file = "rpds_py-0.27.0-cp312-cp312-win_arm64.whl", hash = "sha256:e14aab02258cb776a108107bd15f5b5e4a1bbaa61ef33b36693dfab6f89d54f9"}, + {file = "rpds_py-0.27.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:443d239d02d9ae55b74015234f2cd8eb09e59fbba30bf60baeb3123ad4c6d5ff"}, + {file = "rpds_py-0.27.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b8a7acf04fda1f30f1007f3cc96d29d8cf0a53e626e4e1655fdf4eabc082d367"}, + {file = "rpds_py-0.27.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d0f92b78cfc3b74a42239fdd8c1266f4715b573204c234d2f9fc3fc7a24f185"}, + {file = "rpds_py-0.27.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ce4ed8e0c7dbc5b19352b9c2c6131dd23b95fa8698b5cdd076307a33626b72dc"}, + {file = "rpds_py-0.27.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fde355b02934cc6b07200cc3b27ab0c15870a757d1a72fd401aa92e2ea3c6bfe"}, + {file = "rpds_py-0.27.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13bbc4846ae4c993f07c93feb21a24d8ec637573d567a924b1001e81c8ae80f9"}, + {file = "rpds_py-0.27.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be0744661afbc4099fef7f4e604e7f1ea1be1dd7284f357924af12a705cc7d5c"}, + {file = "rpds_py-0.27.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:069e0384a54f427bd65d7fda83b68a90606a3835901aaff42185fcd94f5a9295"}, + {file = "rpds_py-0.27.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4bc262ace5a1a7dc3e2eac2fa97b8257ae795389f688b5adf22c5db1e2431c43"}, + {file = "rpds_py-0.27.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2fe6e18e5c8581f0361b35ae575043c7029d0a92cb3429e6e596c2cdde251432"}, + {file = "rpds_py-0.27.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d93ebdb82363d2e7bec64eecdc3632b59e84bd270d74fe5be1659f7787052f9b"}, + {file = "rpds_py-0.27.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0954e3a92e1d62e83a54ea7b3fdc9efa5d61acef8488a8a3d31fdafbfb00460d"}, + {file = "rpds_py-0.27.0-cp313-cp313-win32.whl", hash = "sha256:2cff9bdd6c7b906cc562a505c04a57d92e82d37200027e8d362518df427f96cd"}, + {file = "rpds_py-0.27.0-cp313-cp313-win_amd64.whl", hash = "sha256:dc79d192fb76fc0c84f2c58672c17bbbc383fd26c3cdc29daae16ce3d927e8b2"}, + {file = "rpds_py-0.27.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b3a5c8089eed498a3af23ce87a80805ff98f6ef8f7bdb70bd1b7dae5105f6ac"}, + {file = "rpds_py-0.27.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:90fb790138c1a89a2e58c9282fe1089638401f2f3b8dddd758499041bc6e0774"}, + {file = "rpds_py-0.27.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:010c4843a3b92b54373e3d2291a7447d6c3fc29f591772cc2ea0e9f5c1da434b"}, + {file = "rpds_py-0.27.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9ce7a9e967afc0a2af7caa0d15a3e9c1054815f73d6a8cb9225b61921b419bd"}, + {file = "rpds_py-0.27.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:aa0bf113d15e8abdfee92aa4db86761b709a09954083afcb5bf0f952d6065fdb"}, + {file = "rpds_py-0.27.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb91d252b35004a84670dfeafadb042528b19842a0080d8b53e5ec1128e8f433"}, + {file = "rpds_py-0.27.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:db8a6313dbac934193fc17fe7610f70cd8181c542a91382531bef5ed785e5615"}, + {file = "rpds_py-0.27.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce96ab0bdfcef1b8c371ada2100767ace6804ea35aacce0aef3aeb4f3f499ca8"}, + {file = "rpds_py-0.27.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:7451ede3560086abe1aa27dcdcf55cd15c96b56f543fb12e5826eee6f721f858"}, + {file = "rpds_py-0.27.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:32196b5a99821476537b3f7732432d64d93a58d680a52c5e12a190ee0135d8b5"}, + {file = "rpds_py-0.27.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a029be818059870664157194e46ce0e995082ac49926f1423c1f058534d2aaa9"}, + {file = "rpds_py-0.27.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3841f66c1ffdc6cebce8aed64e36db71466f1dc23c0d9a5592e2a782a3042c79"}, + {file = "rpds_py-0.27.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:42894616da0fc0dcb2ec08a77896c3f56e9cb2f4b66acd76fc8992c3557ceb1c"}, + {file = "rpds_py-0.27.0-cp313-cp313t-win32.whl", hash = "sha256:b1fef1f13c842a39a03409e30ca0bf87b39a1e2a305a9924deadb75a43105d23"}, + {file = "rpds_py-0.27.0-cp313-cp313t-win_amd64.whl", hash = "sha256:183f5e221ba3e283cd36fdfbe311d95cd87699a083330b4f792543987167eff1"}, + {file = "rpds_py-0.27.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:f3cd110e02c5bf17d8fb562f6c9df5c20e73029d587cf8602a2da6c5ef1e32cb"}, + {file = "rpds_py-0.27.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8d0e09cf4863c74106b5265c2c310f36146e2b445ff7b3018a56799f28f39f6f"}, + {file = "rpds_py-0.27.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64f689ab822f9b5eb6dfc69893b4b9366db1d2420f7db1f6a2adf2a9ca15ad64"}, + {file = "rpds_py-0.27.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e36c80c49853b3ffda7aa1831bf175c13356b210c73128c861f3aa93c3cc4015"}, + {file = "rpds_py-0.27.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6de6a7f622860af0146cb9ee148682ff4d0cea0b8fd3ad51ce4d40efb2f061d0"}, + {file = "rpds_py-0.27.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4045e2fc4b37ec4b48e8907a5819bdd3380708c139d7cc358f03a3653abedb89"}, + {file = "rpds_py-0.27.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9da162b718b12c4219eeeeb68a5b7552fbc7aadedf2efee440f88b9c0e54b45d"}, + {file = "rpds_py-0.27.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:0665be515767dc727ffa5f74bd2ef60b0ff85dad6bb8f50d91eaa6b5fb226f51"}, + {file = "rpds_py-0.27.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:203f581accef67300a942e49a37d74c12ceeef4514874c7cede21b012613ca2c"}, + {file = "rpds_py-0.27.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7873b65686a6471c0037139aa000d23fe94628e0daaa27b6e40607c90e3f5ec4"}, + {file = "rpds_py-0.27.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:249ab91ceaa6b41abc5f19513cb95b45c6f956f6b89f1fe3d99c81255a849f9e"}, + {file = "rpds_py-0.27.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d2f184336bc1d6abfaaa1262ed42739c3789b1e3a65a29916a615307d22ffd2e"}, + {file = "rpds_py-0.27.0-cp314-cp314-win32.whl", hash = "sha256:d3c622c39f04d5751408f5b801ecb527e6e0a471b367f420a877f7a660d583f6"}, + {file = "rpds_py-0.27.0-cp314-cp314-win_amd64.whl", hash = "sha256:cf824aceaeffff029ccfba0da637d432ca71ab21f13e7f6f5179cd88ebc77a8a"}, + {file = "rpds_py-0.27.0-cp314-cp314-win_arm64.whl", hash = "sha256:86aca1616922b40d8ac1b3073a1ead4255a2f13405e5700c01f7c8d29a03972d"}, + {file = "rpds_py-0.27.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:341d8acb6724c0c17bdf714319c393bb27f6d23d39bc74f94221b3e59fc31828"}, + {file = "rpds_py-0.27.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6b96b0b784fe5fd03beffff2b1533dc0d85e92bab8d1b2c24ef3a5dc8fac5669"}, + {file = "rpds_py-0.27.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c431bfb91478d7cbe368d0a699978050d3b112d7f1d440a41e90faa325557fd"}, + {file = "rpds_py-0.27.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:20e222a44ae9f507d0f2678ee3dd0c45ec1e930f6875d99b8459631c24058aec"}, + {file = "rpds_py-0.27.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:184f0d7b342967f6cda94a07d0e1fae177d11d0b8f17d73e06e36ac02889f303"}, + {file = "rpds_py-0.27.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a00c91104c173c9043bc46f7b30ee5e6d2f6b1149f11f545580f5d6fdff42c0b"}, + {file = "rpds_py-0.27.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7a37dd208f0d658e0487522078b1ed68cd6bce20ef4b5a915d2809b9094b410"}, + {file = "rpds_py-0.27.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:92f3b3ec3e6008a1fe00b7c0946a170f161ac00645cde35e3c9a68c2475e8156"}, + {file = "rpds_py-0.27.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a1b3db5fae5cbce2131b7420a3f83553d4d89514c03d67804ced36161fe8b6b2"}, + {file = "rpds_py-0.27.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5355527adaa713ab693cbce7c1e0ec71682f599f61b128cf19d07e5c13c9b1f1"}, + {file = "rpds_py-0.27.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:fcc01c57ce6e70b728af02b2401c5bc853a9e14eb07deda30624374f0aebfe42"}, + {file = "rpds_py-0.27.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3001013dae10f806380ba739d40dee11db1ecb91684febb8406a87c2ded23dae"}, + {file = "rpds_py-0.27.0-cp314-cp314t-win32.whl", hash = "sha256:0f401c369186a5743694dd9fc08cba66cf70908757552e1f714bfc5219c655b5"}, + {file = "rpds_py-0.27.0-cp314-cp314t-win_amd64.whl", hash = "sha256:8a1dca5507fa1337f75dcd5070218b20bc68cf8844271c923c1b79dfcbc20391"}, + {file = "rpds_py-0.27.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:e0d7151a1bd5d0a203a5008fc4ae51a159a610cb82ab0a9b2c4d80241745582e"}, + {file = "rpds_py-0.27.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:42ccc57ff99166a55a59d8c7d14f1a357b7749f9ed3584df74053fd098243451"}, + {file = "rpds_py-0.27.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e377e4cf8795cdbdff75b8f0223d7b6c68ff4fef36799d88ccf3a995a91c0112"}, + {file = "rpds_py-0.27.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:79af163a4b40bbd8cfd7ca86ec8b54b81121d3b213b4435ea27d6568bcba3e9d"}, + {file = "rpds_py-0.27.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2eff8ee57c5996b0d2a07c3601fb4ce5fbc37547344a26945dd9e5cbd1ed27a"}, + {file = "rpds_py-0.27.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7cf9bc4508efb18d8dff6934b602324eb9f8c6644749627ce001d6f38a490889"}, + {file = "rpds_py-0.27.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05284439ebe7d9f5f5a668d4d8a0a1d851d16f7d47c78e1fab968c8ad30cab04"}, + {file = "rpds_py-0.27.0-cp39-cp39-manylinux_2_31_riscv64.whl", hash = "sha256:1321bce595ad70e80f97f998db37356b2e22cf98094eba6fe91782e626da2f71"}, + {file = "rpds_py-0.27.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:737005088449ddd3b3df5a95476ee1c2c5c669f5c30eed909548a92939c0e12d"}, + {file = "rpds_py-0.27.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9b2a4e17bfd68536c3b801800941c95a1d4a06e3cada11c146093ba939d9638d"}, + {file = "rpds_py-0.27.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:dc6b0d5a1ea0318ef2def2b6a55dccf1dcaf77d605672347271ed7b829860765"}, + {file = "rpds_py-0.27.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:4c3f8a0d4802df34fcdbeb3dfe3a4d8c9a530baea8fafdf80816fcaac5379d83"}, + {file = "rpds_py-0.27.0-cp39-cp39-win32.whl", hash = "sha256:699c346abc73993962cac7bb4f02f58e438840fa5458a048d3a178a7a670ba86"}, + {file = "rpds_py-0.27.0-cp39-cp39-win_amd64.whl", hash = "sha256:be806e2961cd390a89d6c3ce8c2ae34271cfcd05660f716257838bb560f1c3b6"}, + {file = "rpds_py-0.27.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:46f48482c1a4748ab2773f75fffbdd1951eb59794e32788834b945da857c47a8"}, + {file = "rpds_py-0.27.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:419dd9c98bcc9fb0242be89e0c6e922df333b975d4268faa90d58499fd9c9ebe"}, + {file = "rpds_py-0.27.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55d42a0ef2bdf6bc81e1cc2d49d12460f63c6ae1423c4f4851b828e454ccf6f1"}, + {file = "rpds_py-0.27.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2e39169ac6aae06dd79c07c8a69d9da867cef6a6d7883a0186b46bb46ccfb0c3"}, + {file = "rpds_py-0.27.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:935afcdea4751b0ac918047a2df3f720212892347767aea28f5b3bf7be4f27c0"}, + {file = "rpds_py-0.27.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8de567dec6d451649a781633d36f5c7501711adee329d76c095be2178855b042"}, + {file = "rpds_py-0.27.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:555ed147cbe8c8f76e72a4c6cd3b7b761cbf9987891b9448808148204aed74a5"}, + {file = "rpds_py-0.27.0-pp310-pypy310_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:d2cc2b34f9e1d31ce255174da82902ad75bd7c0d88a33df54a77a22f2ef421ee"}, + {file = "rpds_py-0.27.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cb0702c12983be3b2fab98ead349ac63a98216d28dda6f518f52da5498a27a1b"}, + {file = "rpds_py-0.27.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:ba783541be46f27c8faea5a6645e193943c17ea2f0ffe593639d906a327a9bcc"}, + {file = "rpds_py-0.27.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:2406d034635d1497c596c40c85f86ecf2bf9611c1df73d14078af8444fe48031"}, + {file = "rpds_py-0.27.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:dea0808153f1fbbad772669d906cddd92100277533a03845de6893cadeffc8be"}, + {file = "rpds_py-0.27.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d2a81bdcfde4245468f7030a75a37d50400ac2455c3a4819d9d550c937f90ab5"}, + {file = "rpds_py-0.27.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e6491658dd2569f05860bad645569145c8626ac231877b0fb2d5f9bcb7054089"}, + {file = "rpds_py-0.27.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:bec77545d188f8bdd29d42bccb9191682a46fb2e655e3d1fb446d47c55ac3b8d"}, + {file = "rpds_py-0.27.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25a4aebf8ca02bbb90a9b3e7a463bbf3bee02ab1c446840ca07b1695a68ce424"}, + {file = "rpds_py-0.27.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:44524b96481a4c9b8e6c46d6afe43fa1fb485c261e359fbe32b63ff60e3884d8"}, + {file = "rpds_py-0.27.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45d04a73c54b6a5fd2bab91a4b5bc8b426949586e61340e212a8484919183859"}, + {file = "rpds_py-0.27.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:343cf24de9ed6c728abefc5d5c851d5de06497caa7ac37e5e65dd572921ed1b5"}, + {file = "rpds_py-0.27.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7aed8118ae20515974650d08eb724150dc2e20c2814bcc307089569995e88a14"}, + {file = "rpds_py-0.27.0-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:af9d4fd79ee1cc8e7caf693ee02737daabfc0fcf2773ca0a4735b356c8ad6f7c"}, + {file = "rpds_py-0.27.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f0396e894bd1e66c74ecbc08b4f6a03dc331140942c4b1d345dd131b68574a60"}, + {file = "rpds_py-0.27.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:59714ab0a5af25d723d8e9816638faf7f4254234decb7d212715c1aa71eee7be"}, + {file = "rpds_py-0.27.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:88051c3b7d5325409f433c5a40328fcb0685fc04e5db49ff936e910901d10114"}, + {file = "rpds_py-0.27.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:181bc29e59e5e5e6e9d63b143ff4d5191224d355e246b5a48c88ce6b35c4e466"}, + {file = "rpds_py-0.27.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9ad08547995a57e74fea6abaf5940d399447935faebbd2612b3b0ca6f987946b"}, + {file = "rpds_py-0.27.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:61490d57e82e23b45c66f96184237994bfafa914433b8cd1a9bb57fecfced59d"}, + {file = "rpds_py-0.27.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7cf5e726b6fa977e428a61880fb108a62f28b6d0c7ef675b117eaff7076df49"}, + {file = "rpds_py-0.27.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dc662bc9375a6a394b62dfd331874c434819f10ee3902123200dbcf116963f89"}, + {file = "rpds_py-0.27.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:299a245537e697f28a7511d01038c310ac74e8ea213c0019e1fc65f52c0dcb23"}, + {file = "rpds_py-0.27.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:be3964f7312ea05ed283b20f87cb533fdc555b2e428cc7be64612c0b2124f08c"}, + {file = "rpds_py-0.27.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33ba649a6e55ae3808e4c39e01580dc9a9b0d5b02e77b66bb86ef117922b1264"}, + {file = "rpds_py-0.27.0-pp39-pypy39_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:81f81bbd7cdb4bdc418c09a73809abeda8f263a6bf8f9c7f93ed98b5597af39d"}, + {file = "rpds_py-0.27.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:11e8e28c0ba0373d052818b600474cfee2fafa6c9f36c8587d217b13ee28ca7d"}, + {file = "rpds_py-0.27.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:e3acb9c16530362aeaef4e84d57db357002dc5cbfac9a23414c3e73c08301ab2"}, + {file = "rpds_py-0.27.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:2e307cb5f66c59ede95c00e93cd84190a5b7f3533d7953690b2036780622ba81"}, + {file = "rpds_py-0.27.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:f09c9d4c26fa79c1bad927efb05aca2391350b8e61c38cbc0d7d3c814e463124"}, + {file = "rpds_py-0.27.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:af22763a0a1eff106426a6e1f13c4582e0d0ad89c1493ab6c058236174cd6c6a"}, + {file = "rpds_py-0.27.0.tar.gz", hash = "sha256:8b23cf252f180cda89220b378d917180f29d313cd6a07b2431c0d3b776aae86f"}, +] + +[[package]] +name = "send2trash" +version = "1.8.3" +description = "Send file to trash natively under Mac OS X, Windows and Linux" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +groups = ["dev"] +files = [ + {file = "Send2Trash-1.8.3-py3-none-any.whl", hash = "sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9"}, + {file = "Send2Trash-1.8.3.tar.gz", hash = "sha256:b18e7a3966d99871aefeb00cfbcfdced55ce4871194810fc71f4aa484b953abf"}, +] + +[package.extras] +nativelib = ["pyobjc-framework-Cocoa ; sys_platform == \"darwin\"", "pywin32 ; sys_platform == \"win32\""] +objc = ["pyobjc-framework-Cocoa ; sys_platform == \"darwin\""] +win32 = ["pywin32 ; sys_platform == \"win32\""] + +[[package]] +name = "setuptools" +version = "80.9.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922"}, + {file = "setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c"}, +] + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "ruff (>=0.8.0) ; sys_platform != \"cygwin\""] +core = ["importlib_metadata (>=6) ; python_version < \"3.10\"", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1) ; python_version < \"3.11\"", "wheel (>=0.43.0)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf ; sys_platform != \"cygwin\"", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib_metadata (>=7.0.2) ; python_version < \"3.10\"", "jaraco.develop (>=7.21) ; sys_platform != \"cygwin\"", "mypy (==1.14.*)", "pytest-mypy"] + +[[package]] +name = "six" +version = "1.17.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main", "dev"] +files = [ + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +groups = ["dev"] +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] + +[[package]] +name = "soupsieve" +version = "2.7" +description = "A modern CSS selector implementation for Beautiful Soup." +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4"}, + {file = "soupsieve-2.7.tar.gz", hash = "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a"}, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +description = "Extract data from python stack frames and tracebacks for informative displays" +optional = false +python-versions = "*" +groups = ["dev"] +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 = "stdlib-list" +version = "0.11.1" +description = "A list of Python Standard Libraries (2.7 through 3.13)." +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "stdlib_list-0.11.1-py3-none-any.whl", hash = "sha256:9029ea5e3dfde8cd4294cfd4d1797be56a67fc4693c606181730148c3fd1da29"}, + {file = "stdlib_list-0.11.1.tar.gz", hash = "sha256:95ebd1d73da9333bba03ccc097f5bac05e3aa03e6822a0c0290f87e1047f1857"}, +] + +[package.extras] +dev = ["build", "stdlib-list[doc,lint,test]"] +doc = ["furo", "sphinx"] +lint = ["mypy", "ruff"] +support = ["sphobjinv"] +test = ["coverage[toml]", "pytest", "pytest-cov"] + +[[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" +groups = ["dev"] +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 = "tinycss2" +version = "1.4.0" +description = "A tiny CSS parser" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +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 = "tomlkit" +version = "0.13.3" +description = "Style preserving TOML library" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0"}, + {file = "tomlkit-0.13.3.tar.gz", hash = "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1"}, +] + +[[package]] +name = "tornado" +version = "6.5.2" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "tornado-6.5.2-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:2436822940d37cde62771cff8774f4f00b3c8024fe482e16ca8387b8a2724db6"}, + {file = "tornado-6.5.2-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:583a52c7aa94ee046854ba81d9ebb6c81ec0fd30386d96f7640c96dad45a03ef"}, + {file = "tornado-6.5.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0fe179f28d597deab2842b86ed4060deec7388f1fd9c1b4a41adf8af058907e"}, + {file = "tornado-6.5.2-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b186e85d1e3536d69583d2298423744740986018e393d0321df7340e71898882"}, + {file = "tornado-6.5.2-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e792706668c87709709c18b353da1f7662317b563ff69f00bab83595940c7108"}, + {file = "tornado-6.5.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:06ceb1300fd70cb20e43b1ad8aaee0266e69e7ced38fa910ad2e03285009ce7c"}, + {file = "tornado-6.5.2-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:74db443e0f5251be86cbf37929f84d8c20c27a355dd452a5cfa2aada0d001ec4"}, + {file = "tornado-6.5.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b5e735ab2889d7ed33b32a459cac490eda71a1ba6857b0118de476ab6c366c04"}, + {file = "tornado-6.5.2-cp39-abi3-win32.whl", hash = "sha256:c6f29e94d9b37a95013bb669616352ddb82e3bfe8326fccee50583caebc8a5f0"}, + {file = "tornado-6.5.2-cp39-abi3-win_amd64.whl", hash = "sha256:e56a5af51cc30dd2cae649429af65ca2f6571da29504a07995175df14c18f35f"}, + {file = "tornado-6.5.2-cp39-abi3-win_arm64.whl", hash = "sha256:d6c33dc3672e3a1f3618eb63b7ef4683a7688e7b9e6e8f0d9aa5726360a004af"}, + {file = "tornado-6.5.2.tar.gz", hash = "sha256:ab53c8f9a0fa351e2c0741284e06c7a45da86afb544133201c5cc8578eb076a0"}, +] + +[[package]] +name = "traitlets" +version = "5.14.3" +description = "Traitlets Python configuration system" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, + {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, +] + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] + +[[package]] +name = "types-python-dateutil" +version = "2.9.0.20250809" +description = "Typing stubs for python-dateutil" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "types_python_dateutil-2.9.0.20250809-py3-none-any.whl", hash = "sha256:768890cac4f2d7fd9e0feb6f3217fce2abbfdfc0cadd38d11fba325a815e4b9f"}, + {file = "types_python_dateutil-2.9.0.20250809.tar.gz", hash = "sha256:69cbf8d15ef7a75c3801d65d63466e46ac25a0baa678d89d0a137fc31a608cc1"}, +] + +[[package]] +name = "typing-extensions" +version = "4.14.1" +description = "Backported and Experimental Type Hints for Python 3.9+" +optional = false +python-versions = ">=3.9" +groups = ["main", "dev"] +files = [ + {file = "typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76"}, + {file = "typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36"}, +] + +[[package]] +name = "typing-inspection" +version = "0.4.1" +description = "Runtime typing introspection tools" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51"}, + {file = "typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28"}, +] + +[package.dependencies] +typing-extensions = ">=4.12.0" + +[[package]] +name = "tzdata" +version = "2025.2" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +groups = ["main"] +files = [ + {file = "tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8"}, + {file = "tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9"}, +] + +[[package]] +name = "uri-template" +version = "1.3.0" +description = "RFC 6570 URI Template Processor" +optional = false +python-versions = ">=3.7" +groups = ["dev"] +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 = "2.5.0" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.9" +groups = ["main", "dev"] +files = [ + {file = "urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc"}, + {file = "urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "wcwidth" +version = "0.2.13" +description = "Measures the displayed width of unicode strings in a terminal" +optional = false +python-versions = "*" +groups = ["dev"] +files = [ + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, +] + +[[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" +groups = ["dev"] +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 = "*" +groups = ["dev"] +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.8.0" +description = "WebSocket client for Python with low level API options" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526"}, + {file = "websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da"}, +] + +[package.extras] +docs = ["Sphinx (>=6.0)", "myst-parser (>=2.0.0)", "sphinx-rtd-theme (>=1.1.0)"] +optional = ["python-socks", "wsaccel"] +test = ["websockets"] + +[[package]] +name = "xlsxwriter" +version = "3.2.5" +description = "A Python module for creating Excel XLSX files." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "xlsxwriter-3.2.5-py3-none-any.whl", hash = "sha256:4f4824234e1eaf9d95df9a8fe974585ff91d0f5e3d3f12ace5b71e443c1c6abd"}, + {file = "xlsxwriter-3.2.5.tar.gz", hash = "sha256:7e88469d607cdc920151c0ab3ce9cf1a83992d4b7bc730c5ffdd1a12115a7dbe"}, +] + +[metadata] +lock-version = "2.1" +python-versions = ">=3.12,<4.0" +content-hash = "abe3b5271081c3ad44b715ed68207041ce87d3e9fee9512f9c14d93248e21a5d" diff --git a/pyproject.toml b/pyproject.toml index 4c3d1cb..6a76a4f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,58 +1,50 @@ [build-system] -requires = ["setuptools", "wheel"] -build-backend = "setuptools.build_meta" +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" -[project] +[tool.poetry] name = "pyetm" -version = "2.0-beta" - -description = "Python-ETM Connector" -authors = [] # TODO: add us! +version = "2.0" +description = "A Python package for energy transition modeling." +authors = ["Your Name "] +license = "MIT" readme = "README.md" -requires-python = ">=3.12" -license = {file = "LICENSE"} -dependencies = [ - # 'requests>=2.26', - # 'pandas[parquet]>=2.2', - # 'openpyxl>=3.0', - # 'xlsxwriter>=3.0', -] -keywords = ["ETM", "Energy Transition Model"] -classifiers = [ - 'Development Status :: 4 - Beta', - 'Intended Audience :: Developers', - 'Intended Audience :: Education', - 'Intended Audience :: Science/Research', - # 'License :: OSI Approved :: European Union Public Licence 1.2 (EUPL 1.2)', - 'Natural Language :: English', - 'Operating System :: OS Independent', - 'Programming Language :: Python', - # 'Programming Language :: Python :: 3', - # 'Programming Language :: Python :: 3.10', - # 'Programming Language :: Python :: 3.11', - # 'Programming Language :: Python :: 3.12', -] +homepage = "https://github.com/quintel/pyetm" +repository = "https://github.com/quintel/pyetm" +documentation = "https://docs.energytransitionmodel.com/main/pyetm/introduction" +keywords = ["energy", "transition", "modeling", "api"] +packages = [{ include = "pyetm", from = "src" }] -[project.urls] -repository = "https://github.com/robcalon/pyetm" +[tool.poetry.dependencies] +python = ">=3.12,<4.0" +pydantic = "*" +pandas = "*" +requests = "*" +python-dotenv = "*" +pyyaml = "*" +pydantic-settings = "*" +xlsxwriter = "*" +openpyxl = "*" -[project.optional-dependencies] -async = ["aiohttp>=3.8"] -dev = [ - "pytest>=7.0", - "pylint>=3.0", - "requests-mock>=1.11" -] +[tool.poetry.group.dev.dependencies] +pytest = "*" +pylint = "*" +requests-mock = "*" +ipykernel = "*" +notebook = "*" +pytest-cov = "*" +pydeps = "*" -[tool.setuptools.package-data] -"pyetm.data" = ["*.csv"] +[tool.poetry.scripts] +pyetm = "pyetm.__main__:main" -[tool.pylint] -max-args = 15 -max-local = 20 +[tool.poetry.urls] +"Bug Tracker" = "https://github.com/quintel/pyetm/issues" +"Documentation" = "https://docs.energytransitionmodel.com/main/pyetm/introduction" [tool.pytest.ini_options] -minversion = "7.0" -addopts = [ - "--import-mode=importlib", -] +addopts = "--cov=pyetm --cov-report=term-missing" +testpaths = ["tests"] + +[tool.pylint.main] +fail-under = 8.0 diff --git a/running_notebooks.md b/running_notebooks.md index e9af4a6..8fa45ba 100644 --- a/running_notebooks.md +++ b/running_notebooks.md @@ -1,9 +1,10 @@ # Running Notebooks This guide will help you install everything you need to open and run our Jupyter notebooks in VS Code, -even if you don’t have Python, Jupyter, or any VS Code extensions installed yet. If you'd like some -additional guidance or you're having trouble, check out [this helpful guide from vscode](https://www.youtube.com/watch?v=suAkMeWJ1yE&ab_channel=VisualStudioCode). -Just note that in the video they use venv, whereas we use pipenv (these are practically interchangable). +even if you don’t have Python, Jupyter, or any VS Code extensions installed yet. + +If you'd like some additional guidance or you're having trouble, check out [this helpful guide from VS Code](https://www.youtube.com/watch?v=suAkMeWJ1yE&ab_channel=VisualStudioCode). +Just note: in the video they use `venv`, whereas we use [Poetry](https://python-poetry.org/) for dependency management and virtual environments. --- @@ -17,17 +18,20 @@ Just note that in the video they use venv, whereas we use pipenv (these are prac ## 2. Install Python Go to the [official Python download page](https://www.python.org/downloads/) and download the latest -**Python 3.x** installer for your OS. -- **Windows:** Run the installer, **check** "Add Python to PATH", and click **Install Now**. -- **macOS/Linux:** Follow the on-screen instructions. On Linux, you can also use your package manager: - - ```bash - # Ubuntu/Debian - sudo apt update && sudo apt install python3 python3-venv python3-pip - ``` +**Python 3.12+** installer for your OS. + +- **Windows:** Run the installer, **check** "Add Python to PATH", and click **Install Now**. +- **macOS/Linux:** Follow the on-screen instructions. On macOS you can also use [Homebrew](https://brew.sh/): + ```bash + brew install python@3.12 + ``` + On Linux, you can use your package manager: + ```bash + # Ubuntu/Debian + sudo apt update && sudo apt install python3 python3-pip + ``` Verify installation by opening a terminal and running: - ```bash python3 --version # or on Windows @@ -43,7 +47,6 @@ python --version 3. (Optional) Check "Add to PATH" during installation for easier command-line use. Verify by running: - ```bash code --version ``` @@ -53,39 +56,39 @@ code --version ## 4. Install Necessary VS Code Extensions 1. Open VS Code. -2. Click the **Extensions** icon (or press Ctrl+Shift+X). +2. Click the **Extensions** icon (or press `Ctrl+Shift+X` / `Cmd+Shift+X` on macOS). 3. Install: - * **Python** (by Microsoft) * **Jupyter** (by Microsoft) --- -## 5. Set Up a Python Environment (using Pipenv) +## 5. Set Up a Python Environment (using Poetry) -If you'd like to learn more about pipenv, [check out the docs here.](https://pipenv.pypa.io/en/latest/index.html) - -In your project folder: - -1. **Install Pipenv** (if you don’t have it already): +We use [Poetry](https://python-poetry.org/) to manage dependencies and virtual environments. +1. **Install Poetry** (if you don’t have it already): ```bash - pip install pipenv + curl -sSL https://install.python-poetry.org | python3 - + ``` + Or on Windows (PowerShell): + ```powershell + (Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | py - ``` -2. **Install dependencies** from `Pipfile`: +2. **Install dependencies** from `pyproject.toml`: ```bash - pipenv install + poetry install --with dev ``` -3. **Activate** the Pipenv environment: +3. **Activate** the Poetry environment: ```bash - pipenv shell + eval $(poetry env activate) ``` -4. When adding new packages: +4. When adding new packages: ```bash - pipenv install + poetry add ``` --- @@ -93,13 +96,13 @@ In your project folder: ## 6. Open & Run the Notebook 1. In VS Code, go to **File → Open Folder** and select this project’s root folder. -2. Locate a `.ipynb` file in the Examples folder, and click to open it. -3. At the top right of the notebook editor, click **Select Kernel** and choose the interpreter from -your Pipenv environment (it will mention `Pipenv`). -4. Run cells by clicking the ▶️ icon or pressing Shift+Enter. +2. Locate a `.ipynb` file in the `examples` folder, and click to open it. +3. At the top right of the notebook editor, click **Select Kernel** and choose the interpreter from your Poetry environment (it will mention `.venv` or the Poetry-managed path). +4. Run cells by clicking the ▶️ icon or pressing `Shift+Enter`. --- ## 7. Important Notes -After this setup you will be *almost* ready to run the Jupyter notebooks in the examples folder. You -still need to configure your settings as [outlined in the main readme.](README.md) + +After this setup you will be *almost* ready to run the Jupyter notebooks in the examples folder. +You still need to configure your settings as [outlined in the main README](README.md). diff --git a/src/pyetm/config/settings.py b/src/pyetm/config/settings.py index 3119b40..a04ed36 100644 --- a/src/pyetm/config/settings.py +++ b/src/pyetm/config/settings.py @@ -1,4 +1,5 @@ from pathlib import Path +import re import yaml, os from typing import Optional, ClassVar, List, Annotated from pydantic import Field, ValidationError, HttpUrl, field_validator @@ -7,6 +8,7 @@ PROJECT_ROOT = Path(__file__).resolve().parents[3] CONFIG_FILE = PROJECT_ROOT / "config.yml" + class AppConfig(BaseSettings): """ Application configuration loaded from YAML. @@ -23,6 +25,13 @@ class AppConfig(BaseSettings): "https://engine.energytransitionmodel.com/api/v3", description="Base URL for the ETM API", ) + environment: Optional[str] = Field( + None, + description=( + "ETM environment to target. One of: 'pro' (default), 'beta', 'local', or a stable tag 'YYYY-MM'. " + "When set and base_url is not provided, base_url will be inferred." + ), + ) log_level: Optional[str] = Field( "INFO", description="App logging level", @@ -32,7 +41,7 @@ class AppConfig(BaseSettings): env_file=None, extra="ignore", case_sensitive=False ) - temp_folder: Optional[Path] = PROJECT_ROOT / 'tmp' + temp_folder: Optional[Path] = PROJECT_ROOT / "tmp" @field_validator("etm_api_token") @classmethod @@ -84,10 +93,17 @@ def from_yaml(cls, path: Path) -> "AppConfig": data = {k.lower(): v for k, v in raw.items()} - for field in ("etm_api_token", "base_url", "log_level"): + # Collect environment variables overriding YAML + for field in ("etm_api_token", "base_url", "log_level", "environment"): if val := os.getenv(field.upper()): data[field] = val + # If base_url wasn't explicitly provided, infer it from environment if present + if "base_url" not in data or not data["base_url"]: + env = (data.get("environment") or "").strip().lower() + if env: + data["base_url"] = _infer_base_url_from_env(env) + return cls(**data) @@ -111,3 +127,32 @@ def get_settings() -> AppConfig: f"{detail}\n\n" f"Please set them via environment variables or in `{CONFIG_FILE}`." ) from exc + + +def _infer_base_url_from_env(environment: str) -> str: + """ + Infers the ETM API base URL from an environment string. + + Supported values (case-insensitive): + - 'pro'/'prod' (default): https://engine.energytransitionmodel.com/api/v3 + - 'beta'/'staging': https://beta.engine.energytransitionmodel.com/api/v3 + - 'local'/'dev'/'development': http://localhost:3000/api/v3 + - stable tags 'YYYY-MM': https://{YYYY-MM}.engine.energytransitionmodel.com/api/v3 + + Falls back to the 'pro' URL if the input is empty or unrecognized. + """ + env = (environment or "").strip().lower() + + if env in ("", "pro", "prod"): # default + return "https://engine.energytransitionmodel.com/api/v3" + if env in ("beta", "staging"): + return "https://beta.engine.energytransitionmodel.com/api/v3" + if env in ("local", "dev", "development"): + return "http://localhost:3000/api/v3" + + # Stable tagged environments e.g., '2025-01' + if re.fullmatch(r"\d{4}-\d{2}", env): + return f"https://{env}.engine.energytransitionmodel.com/api/v3" + + # Unrecognized: be conservative and return production + return "https://engine.energytransitionmodel.com/api/v3" diff --git a/src/pyetm/models/packables/output_curves_pack.py b/src/pyetm/models/packables/output_curves_pack.py index ff90d49..58b0a60 100644 --- a/src/pyetm/models/packables/output_curves_pack.py +++ b/src/pyetm/models/packables/output_curves_pack.py @@ -1,9 +1,10 @@ import logging -from typing import ClassVar, Any - +from typing import ClassVar, Any, Optional, Sequence, Tuple +from xlsxwriter import Workbook +from pyetm.models.output_curves import OutputCurves import pandas as pd - from pyetm.models.packables.packable import Packable +from pyetm.utils.excel import add_frame logger = logging.getLogger(__name__) @@ -26,3 +27,97 @@ def _build_dataframe_for_scenario(self, scenario: Any, columns: str = "", **kwar def _to_dataframe(self, columns="", **kwargs) -> pd.DataFrame: return self.build_pack_dataframe(columns=columns, **kwargs) + + def to_excel_per_carrier( + self, path: str, carriers: Optional[Sequence[str]] = None + ) -> None: + + # Determine carrier selection + carrier_map = OutputCurves._load_carrier_mappings() + valid_carriers = list(carrier_map.keys()) + selected = list(valid_carriers if carriers is None else carriers) + selected = [c for c in selected if c in valid_carriers] + if not selected: + selected = valid_carriers + + # Nothing to do without scenarios + if not self.scenarios: + return + + wrote_any = False + workbook = None + try: + # Sort scenarios for deterministic sheet layout + scenarios_sorted = sorted(self.scenarios, key=lambda s: s.id) + + for carrier in selected: + series_entries: list[Tuple[Tuple[str, str], pd.Series]] = [] + + for scenario in scenarios_sorted: + # Scenario label + try: + scenario_name = str(scenario.identifier()) + except Exception: + scenario_name = str(getattr(scenario, "id", "scenario")) + + # Fetch curves mapping safely + curves = None + if hasattr(scenario, "get_output_curves") and callable( + getattr(scenario, "get_output_curves") + ): + try: + curves = scenario.get_output_curves(carrier) + except Exception: + curves = None + if not isinstance(curves, dict) or not curves: + continue + + for curve_name, df in curves.items(): + if df is None: + continue + try: + if isinstance(df, pd.Series): + s = df.copy() + series_entries.append(((scenario_name, curve_name), s)) + elif isinstance(df, pd.DataFrame): + if df.empty: + continue + if df.shape[1] == 1: + s = df.iloc[:, 0].copy() + series_entries.append( + ((scenario_name, curve_name), s) + ) + else: + for col in df.columns: + s = df[col].copy() + sub_curve = f"{curve_name}:{col}" + series_entries.append( + ((scenario_name, sub_curve), s) + ) + except Exception: + continue + + if not series_entries: + continue + + cols: list[Tuple[str, str]] = [key for key, _ in series_entries] + frames = [s for _, s in series_entries] + combined = pd.concat(frames, axis=1) + combined.columns = pd.MultiIndex.from_tuples( + cols, names=["Scenario", "Curve"] + ) + + # Lazily create the workbook on first real data + if workbook is None: + workbook = Workbook(str(path)) + add_frame( + name=carrier.upper(), + frame=combined, + workbook=workbook, + column_width=18, + scenario_styling=True, + ) + wrote_any = True + finally: + if workbook is not None and wrote_any: + workbook.close() diff --git a/src/pyetm/models/scenario.py b/src/pyetm/models/scenario.py index 36ab2ee..c87e6e4 100644 --- a/src/pyetm/models/scenario.py +++ b/src/pyetm/models/scenario.py @@ -111,15 +111,43 @@ def from_excel(cls, xlsx_path: PathLike | str) -> List["Scenario"]: scenarios.sort(key=lambda s: s.id) return scenarios - def to_excel(self, path: PathLike | str, *others: "Scenario") -> None: + def to_excel( + self, + path: PathLike | str, + *others: "Scenario", + export_output_curves: bool = True, + output_curves_path: str | None = None, + carriers: list[str] | None = None, + ) -> None: """ Export this scenario – and optionally additional scenarios – to an Excel file. + Output curves are exported to a separate workbook by default, with one sheet + per carrier. Use carriers to filter which carriers to include. """ - from pyetm.models.scenario_packer import ScenarioPacker + from pyetm.models.scenarios import Scenarios + + Scenarios(items=[self, *others]).to_excel( + path, + export_output_curves=export_output_curves, + output_curves_path=output_curves_path, + carriers=carriers, + ) - packer = ScenarioPacker() - packer.add(self, *others) - packer.to_excel(str(path)) + # Deprecated helper retained for backwards compatibility: route to main to_excel + def to_output_curves_excel( + self, + path: PathLike | str, + *others: "Scenario", + carriers: list[str] | None = None, + ) -> None: + from pyetm.models.scenarios import Scenarios + + Scenarios(items=[self, *others]).to_excel( + path, + export_output_curves=True, + output_curves_path=str(path), + carriers=carriers, + ) def update_metadata(self, **kwargs) -> Dict[str, Any]: """ diff --git a/src/pyetm/models/scenario_packer.py b/src/pyetm/models/scenario_packer.py index c024c5b..eef48c1 100644 --- a/src/pyetm/models/scenario_packer.py +++ b/src/pyetm/models/scenario_packer.py @@ -1,8 +1,9 @@ import pandas as pd import logging +from pathlib import Path from os import PathLike from pydantic import BaseModel -from typing import Optional, Dict, Any +from typing import Optional, Dict, Any, Sequence from xlsxwriter import Workbook from pyetm.models.packables.custom_curves_pack import CustomCurvesPack @@ -55,7 +56,7 @@ def add_output_curves(self, *scenarios): # DataFrame outputs def main_info(self) -> pd.DataFrame: - """Create main info DataFrame""" + """Create main info DataFrame by concatenating scenario dataframes.""" if len(self._scenarios()) == 0: return pd.DataFrame() @@ -78,25 +79,35 @@ def custom_curves(self) -> pd.DataFrame: def output_curves(self) -> pd.DataFrame: return self._output_curves.to_dataframe() - def to_excel(self, path: str): + def to_excel( + self, + path: str, + *, + export_output_curves: bool = True, + output_curves_path: Optional[str] = None, + carriers: Optional[Sequence[str]] = None, + ): if len(self._scenarios()) == 0: raise ValueError("Packer was empty, nothing to export") workbook = Workbook(path) - # Main info sheet (handled separately as it doesn't use a pack) - df = self.main_info() - if not df.empty: - df_filled = df.fillna("").infer_objects(copy=False) + # Main info sheet: enrich with metadata and friendly headers for Excel only + df_main = self._build_excel_main_dataframe() + if not df_main.empty: + df_main = self._sanitize_dataframe_for_excel(df_main) add_frame( name="MAIN", - frame=df_filled, + frame=df_main, workbook=workbook, column_width=18, scenario_styling=True, ) for pack in self.all_pack_data(): + # Skip output curves in the main workbook; exported separately + if getattr(pack, "key", None) == OutputCurvesPack.key: + continue df = pack.to_dataframe() if not df.empty: df_filled = df.fillna("").infer_objects(copy=False) @@ -110,12 +121,37 @@ def to_excel(self, path: str): workbook.close() + # Export output curves to a separate workbook with one sheet per carrier + if export_output_curves: + oc_path = output_curves_path + if oc_path is None: + base = Path(path) + oc_path = str(base.with_name(f"{base.stem}_output_curves{base.suffix}")) + try: + self._output_curves.to_excel_per_carrier(oc_path, carriers) + except Exception as e: + logger.warning("Failed exporting output curves workbook: %s", e) + def _scenarios(self) -> set["Scenario"]: """ - All scenarios we are packing info for: for these we need to insert - their metadata + All scenarios we are packing info for across all packs. """ - return set.union(*map(set, (pack.scenarios for pack in self.all_pack_data()))) + all_scenarios: set["Scenario"] = set() + for pack in self.all_pack_data(): + try: + items = getattr(pack, "scenarios", None) + if not items: + continue + if isinstance(items, set): + all_scenarios.update(items) + else: + try: + all_scenarios.update(list(items)) + except TypeError: + continue + except Exception: + continue + return all_scenarios def all_pack_data(self): """Yields each subpack""" @@ -503,3 +539,115 @@ def _setup_scenario_from_main_column( self._apply_metadata(scenario, meta_updates) return scenario + + def _build_excel_main_dataframe(self) -> pd.DataFrame: + """Build a MAIN sheet DataFrame with rich metadata for Excel export only.""" + scenarios = list(self._scenarios()) + if not scenarios: + return pd.DataFrame() + + def id_or_title(s): + try: + return s.identifier() + except Exception: + return getattr(s, "id", None) + + columns: dict[Any, dict[str, Any]] = {} + all_keys: list[str] = [] + + def add_key(k: str): + if k not in all_keys: + all_keys.append(k) + + for s in scenarios: + info: dict[str, Any] = {} + + # Core identifiers and common fields + info["scenario_id"] = getattr(s, "id", None) + info["area_code"] = getattr(s, "area_code", None) + info["end_year"] = getattr(s, "end_year", None) + info["start_year"] = getattr(s, "start_year", None) + info["keep_compatible"] = getattr(s, "keep_compatible", None) + info["private"] = getattr(s, "private", None) + info["template"] = getattr(s, "template", None) + info["source"] = getattr(s, "source", None) + try: + info["title"] = s.title + except Exception: + info["title"] = None + meta = getattr(s, "metadata", None) + if isinstance(meta, dict): + desc = meta.get("description") + if desc is not None: + info["description"] = desc + info["url"] = getattr(s, "url", None) + try: + info["version"] = s.version + except Exception: + info["version"] = None + info["created_at"] = getattr(s, "created_at", None) + info["updated_at"] = getattr(s, "updated_at", None) + + # Flatten all other metadata keys + if isinstance(meta, dict): + for k, v in meta.items(): + if k in ("title", "description"): + continue + info[f"metadata.{k}"] = v + + label = id_or_title(s) + columns[label] = info + for k in info.keys(): + add_key(k) + + # Preferred key order at top + preferred = [ + "title", + "description", + "scenario_id", + "template", + "area_code", + "start_year", + "end_year", + "keep_compatible", + "private", + "source", + "url", + "version", + "created_at", + "updated_at", + ] + remaining = [k for k in all_keys if k not in preferred] + index_order = preferred + remaining + + df = pd.DataFrame( + {col: {k: columns[col].get(k) for k in index_order} for col in columns} + ) + df.index.name = "scenario" + return df + + def _sanitize_dataframe_for_excel(self, df: pd.DataFrame) -> pd.DataFrame: + """Convert DataFrame values into Excel-safe primitives (str/number/bool/None).""" + import datetime as _dt + + def _safe(v: Any): + if v is None: + return "" + if isinstance(v, (str, int, float, bool)): + return v + # Pandas Timestamp / datetime + if isinstance(v, (pd.Timestamp, _dt.datetime, _dt.date)): + try: + return str(v) + except Exception: + return "" + # Convert everything else to string + try: + return str(v) + except Exception: + return "" + + out = df.copy() + out.index = out.index.map(lambda x: str(x) if x is not None else "") + out.columns = [str(c) if c is not None else "" for c in out.columns] + return out.map(_safe) diff --git a/src/pyetm/models/scenarios.py b/src/pyetm/models/scenarios.py index 94abc60..082b9f7 100644 --- a/src/pyetm/models/scenarios.py +++ b/src/pyetm/models/scenarios.py @@ -1,6 +1,6 @@ from __future__ import annotations from os import PathLike -from typing import Iterable, Iterator, List +from typing import Iterable, Iterator, List, Optional, Sequence from pydantic import BaseModel, Field from .scenario import Scenario @@ -28,21 +28,34 @@ def add(self, *scenarios: Scenario) -> None: def extend(self, scenarios: Iterable[Scenario]) -> None: self.items.extend(list(scenarios)) - def to_excel(self, path: PathLike | str) -> None: + def to_excel( + self, + path: PathLike | str, + *, + export_output_curves: bool = True, + output_curves_path: Optional[str] = None, + carriers: Optional[Sequence[str]] = None, + ) -> None: """ Export all scenarios in this collection to an Excel workbook. + Output curves are written to a separate workbook by default (one sheet per carrier). """ from .scenario_packer import ScenarioPacker packer = ScenarioPacker() if self.items: packer.add(*self.items) - packer.to_excel(str(path)) + packer.to_excel( + str(path), + export_output_curves=export_output_curves, + output_curves_path=output_curves_path, + carriers=carriers, + ) @classmethod def from_excel(cls, xlsx_path: PathLike | str) -> "Scenarios": """ Load or create scenarios from an Excel workbook and wrap them in Scenarios. """ - scenarios = Scenario.load_from_excel(xlsx_path) + scenarios = Scenario.from_excel(xlsx_path) return cls(items=scenarios) diff --git a/src/pyetm/services/scenario_runners/update_metadata.py b/src/pyetm/services/scenario_runners/update_metadata.py index bb1b2b8..0794a26 100644 --- a/src/pyetm/services/scenario_runners/update_metadata.py +++ b/src/pyetm/services/scenario_runners/update_metadata.py @@ -17,20 +17,19 @@ class UpdateMetadataRunner(BaseRunner[Dict[str, Any]]): **kwargs: Additional arguments passed to the request """ - # TODO: Investigate why end_year is not setting correctly META_KEYS = [ "keep_compatible", "private", "source", "metadata", "end_year", + "title", ] UNSETTABLE_META_KEYS = [ "id", "created_at", "updated_at", "area_code", - "title", "start_year", "scaling", "template", diff --git a/src/pyetm/utils/excel.py b/src/pyetm/utils/excel.py index a0d6be5..5e1f86b 100644 --- a/src/pyetm/utils/excel.py +++ b/src/pyetm/utils/excel.py @@ -78,8 +78,12 @@ def create_scenario_formats(workbook: Workbook) -> dict: "grey_header": workbook.add_format( {"bold": True, "bg_color": "#D9D9D9", "border": 1, "align": "center"} ), - "white_data": workbook.add_format({"bg_color": "#FFFFFF", "border": 1}), - "grey_data": workbook.add_format({"bg_color": "#D9D9D9", "border": 1}), + "white_data": workbook.add_format( + {"bg_color": "#FFFFFF", "border": 1, "align": "left"} + ), + "grey_data": workbook.add_format( + {"bg_color": "#D9D9D9", "border": 1, "align": "left"} + ), "bold": workbook.add_format({"bold": True}), "default": None, } @@ -150,10 +154,6 @@ def add_frame( col_offset = frame.index.nlevels if index else 0 row_offset = frame.columns.nlevels - # Adjust row offset if index has names - if index and frame.index.names != [None] * frame.index.nlevels: - row_offset += 1 - # Handle multi-index columns with scenario styling if isinstance(frame.columns, pd.MultiIndex) and scenario_styling: # Get scenario blocks for alternating colors diff --git a/tests/services/scenario_runners/test_update_metadata.py b/tests/services/scenario_runners/test_update_metadata.py index da6a652..10bb5b0 100644 --- a/tests/services/scenario_runners/test_update_metadata.py +++ b/tests/services/scenario_runners/test_update_metadata.py @@ -108,7 +108,7 @@ def test_update_metadata_runner_unsettable_keys_generate_warnings(): metadata = { "id": 456, # Unsettable - "title": "New Title", # Unsettable + "title": "New Title", # Settable "end_year": 2050, # Settable } @@ -121,7 +121,8 @@ def test_update_metadata_runner_unsettable_keys_generate_warnings(): expected_payload = { "scenario": { "end_year": 2050, - "metadata": {"existing": "value", "id": 456, "title": "New Title"}, + "title": "New Title", + "metadata": {"existing": "value", "id": 456}, } } mock_request.assert_called_once_with( @@ -293,6 +294,7 @@ def test_update_metadata_runner_meta_keys_constants(): "source", "metadata", "end_year", + "title", ] expected_unsettable_keys = [ @@ -300,7 +302,6 @@ def test_update_metadata_runner_meta_keys_constants(): "created_at", "updated_at", "area_code", - "title", "start_year", "scaling", "template",