From c3ad189448722a90a3db4aa137728332bba235db Mon Sep 17 00:00:00 2001 From: Silo Date: Fri, 20 Feb 2026 16:52:22 +0000 Subject: [PATCH] erm --- .vscode/launch.json | 2 +- Pipfile | 3 +- Pipfile.lock | 1186 +++++++++++++++++++-------------- app/__init__.py | 5 +- app/network_utils.py | 167 +++-- app/{routes2.py => routes.py} | 0 app/routes.py.orig | 322 --------- app/templates/base.html | 101 ++- app/templates/index.html | 21 +- app/templates/login.html | 22 +- app/templates/message.html | 4 +- app/templates/wpa.html | 17 +- app_orig.py | 97 --- test.py | 524 +++------------ tr.py => wsgi.py | 4 + 15 files changed, 957 insertions(+), 1518 deletions(-) rename app/{routes2.py => routes.py} (100%) delete mode 100644 app/routes.py.orig delete mode 100644 app_orig.py rename tr.py => wsgi.py (68%) diff --git a/.vscode/launch.json b/.vscode/launch.json index 762157c..216d1b7 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -10,7 +10,7 @@ "request": "launch", "module": "flask", "env": { - "FLASK_APP": "tr.py", + "FLASK_APP": "wsgi.py", "FLASK_ENV": "development", "PYDEVD_LOAD_NATIVE_LIB": "0", "PYDEVD_USE_CYTHON": "0" diff --git a/Pipfile b/Pipfile index 70edc6a..75c73c9 100644 --- a/Pipfile +++ b/Pipfile @@ -10,6 +10,7 @@ flask-login = "*" flask-sqlalchemy = "*" flask-migrate = "*" gunicorn = "*" +markupsafe = "*" [dev-packages] pylint = "*" @@ -20,7 +21,7 @@ pylint_flask = "*" pylint_flask_sqlalchemy = "*" [requires] -python_version = "3.7" +python_version = "3.9" [pipenv] allow_prereleases = true diff --git a/Pipfile.lock b/Pipfile.lock index 791e242..0047d76 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,11 +1,11 @@ { "_meta": { "hash": { - "sha256": "2c20afd9d423672d58929927bef7981348dcd18df39fa51c7654899585870a0e" + "sha256": "768c98cbed248e3421f518083f911a25c05c575fc16f8e13e3df8dfff44f49c1" }, "pipfile-spec": 6, "requires": { - "python_version": "3.7" + "python_version": "3.9" }, "sources": [ { @@ -18,525 +18,654 @@ "default": { "alembic": { "hashes": [ - "sha256:a21fedebb3fb8f6bbbba51a11114f08c78709377051384c9c5ead5705ee93a51", - "sha256:e78be5b919f5bb184e3e0e2dd1ca986f2362e29a2bc933c446fe89f39dbe4e9c" + "sha256:a88bb7f6e513bd4301ecf4c7f2206fe93f9913f9b48dac3b78babde2d6fe765e", + "sha256:e845dfe090c5ffa7b92593ae6687c5cb1a101e91fa53868497dbd79847f9dbe3" ], - "version": "==1.6.5" + "markers": "python_version >= '3.9'", + "version": "==1.16.5" + }, + "blinker": { + "hashes": [ + "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf", + "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc" + ], + "markers": "python_version >= '3.9'", + "version": "==1.9.0" }, "click": { "hashes": [ - "sha256:8c04c11192119b1ef78ea049e0a6f0463e4c48ef00a30160c704337586f3ad7a", - "sha256:fba402a4a47334742d782209a7c79bc448911afe1149d07bdabdf480b3e2f4b6" + "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", + "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a" ], - "version": "==8.0.1" + "markers": "python_version >= '3.7'", + "version": "==8.1.8" }, "flask": { "hashes": [ - "sha256:1c4c257b1892aec1398784c63791cbaa43062f1f7aeb555c4da961b20ee68f55", - "sha256:a6209ca15eb63fc9385f38e452704113d679511d9574d09b2cf9183ae7d20dc9" + "sha256:bf656c15c80190ed628ad08cdfd3aaa35beb087855e2f494910aa3774cc4fd87", + "sha256:ca1d8112ec8a6158cc29ea4858963350011b5c846a414cdb7a954aa9e967d03c" ], "index": "pypi", - "version": "==2.0.1" + "markers": "python_version >= '3.9'", + "version": "==3.1.2" }, "flask-login": { "hashes": [ - "sha256:6d33aef15b5bcead780acc339464aae8a6e28f13c90d8b1cf9de8b549d1c0b4b", - "sha256:7451b5001e17837ba58945aead261ba425fdf7b4f0448777e597ddab39f4fba0" + "sha256:5e23d14a607ef12806c699590b89d0f0e0d67baeec599d75947bf9c147330333", + "sha256:849b25b82a436bf830a054e74214074af59097171562ab10bfa999e6b78aae5d" ], "index": "pypi", - "version": "==0.5.0" + "markers": "python_version >= '3.7'", + "version": "==0.6.3" }, "flask-migrate": { "hashes": [ - "sha256:4d42e8f861d78cb6e9319afcba5bf76062e5efd7784184dd2a1cccd9de34a702", - "sha256:df9043d2050df3c0e0f6313f6b529b62c837b6033c20335e9d0b4acdf2c40e23" + "sha256:1a336b06eb2c3ace005f5f2ded8641d534c18798d64061f6ff11f79e1434126d", + "sha256:24d8051af161782e0743af1b04a152d007bad9772b2bca67b7ec1e8ceeb3910d" ], "index": "pypi", - "version": "==3.0.1" + "markers": "python_version >= '3.6'", + "version": "==4.1.0" }, "flask-sqlalchemy": { "hashes": [ - "sha256:2bda44b43e7cacb15d4e05ff3cc1f8bc97936cc464623424102bfc2c35e95912", - "sha256:f12c3d4cc5cc7fdcc148b9527ea05671718c3ea45d50c7e732cceb33f574b390" + "sha256:4ba4be7f419dc72f4efd8802d69974803c37259dd42f3913b0dcf75c9447e0a0", + "sha256:e4b68bb881802dda1a7d878b2fc84c06d1ee57fb40b874d3dc97dabfa36b8312" ], "index": "pypi", - "version": "==2.5.1" + "markers": "python_version >= '3.8'", + "version": "==3.1.1" }, "flask-wtf": { "hashes": [ - "sha256:6ff7af73458f182180906a37a783e290bdc8a3817fe4ad17227563137ca285bf", - "sha256:ff177185f891302dc253437fe63081e7a46a4e99aca61dfe086fb23e54fff2dc" + "sha256:79d2ee1e436cf570bccb7d916533fa18757a2f18c290accffab1b9a0b684666b", + "sha256:e93160c5c5b6b571cf99300b6e01b72f9a101027cab1579901f8b10c5daf0b70" ], "index": "pypi", - "version": "==0.15.1" - }, - "greenlet": { - "hashes": [ - "sha256:03f28a5ea20201e70ab70518d151116ce939b412961c33827519ce620957d44c", - "sha256:06d7ac89e6094a0a8f8dc46aa61898e9e1aec79b0f8b47b2400dd51a44dbc832", - "sha256:06ecb43b04480e6bafc45cb1b4b67c785e183ce12c079473359e04a709333b08", - "sha256:096cb0217d1505826ba3d723e8981096f2622cde1eb91af9ed89a17c10aa1f3e", - "sha256:0c557c809eeee215b87e8a7cbfb2d783fb5598a78342c29ade561440abae7d22", - "sha256:0de64d419b1cb1bfd4ea544bedea4b535ef3ae1e150b0f2609da14bbf48a4a5f", - "sha256:14927b15c953f8f2d2a8dffa224aa78d7759ef95284d4c39e1745cf36e8cdd2c", - "sha256:16183fa53bc1a037c38d75fdc59d6208181fa28024a12a7f64bb0884434c91ea", - "sha256:206295d270f702bc27dbdbd7651e8ebe42d319139e0d90217b2074309a200da8", - "sha256:22002259e5b7828b05600a762579fa2f8b33373ad95a0ee57b4d6109d0e589ad", - "sha256:2325123ff3a8ecc10ca76f062445efef13b6cf5a23389e2df3c02a4a527b89bc", - "sha256:258f9612aba0d06785143ee1cbf2d7361801c95489c0bd10c69d163ec5254a16", - "sha256:3096286a6072553b5dbd5efbefc22297e9d06a05ac14ba017233fedaed7584a8", - "sha256:3d13da093d44dee7535b91049e44dd2b5540c2a0e15df168404d3dd2626e0ec5", - "sha256:408071b64e52192869129a205e5b463abda36eff0cebb19d6e63369440e4dc99", - "sha256:598bcfd841e0b1d88e32e6a5ea48348a2c726461b05ff057c1b8692be9443c6e", - "sha256:5d928e2e3c3906e0a29b43dc26d9b3d6e36921eee276786c4e7ad9ff5665c78a", - "sha256:5f75e7f237428755d00e7460239a2482fa7e3970db56c8935bd60da3f0733e56", - "sha256:60848099b76467ef09b62b0f4512e7e6f0a2c977357a036de602b653667f5f4c", - "sha256:6b1d08f2e7f2048d77343279c4d4faa7aef168b3e36039cba1917fffb781a8ed", - "sha256:70bd1bb271e9429e2793902dfd194b653221904a07cbf207c3139e2672d17959", - "sha256:76ed710b4e953fc31c663b079d317c18f40235ba2e3d55f70ff80794f7b57922", - "sha256:7920e3eccd26b7f4c661b746002f5ec5f0928076bd738d38d894bb359ce51927", - "sha256:7db68f15486d412b8e2cfcd584bf3b3a000911d25779d081cbbae76d71bd1a7e", - "sha256:8833e27949ea32d27f7e96930fa29404dd4f2feb13cce483daf52e8842ec246a", - "sha256:944fbdd540712d5377a8795c840a97ff71e7f3221d3fddc98769a15a87b36131", - "sha256:9a6b035aa2c5fcf3dbbf0e3a8a5bc75286fc2d4e6f9cfa738788b433ec894919", - "sha256:9bdcff4b9051fb1aa4bba4fceff6a5f770c6be436408efd99b76fc827f2a9319", - "sha256:a9017ff5fc2522e45562882ff481128631bf35da444775bc2776ac5c61d8bcae", - "sha256:aa4230234d02e6f32f189fd40b59d5a968fe77e80f59c9c933384fe8ba535535", - "sha256:ad80bb338cf9f8129c049837a42a43451fc7c8b57ad56f8e6d32e7697b115505", - "sha256:adb94a28225005890d4cf73648b5131e885c7b4b17bc762779f061844aabcc11", - "sha256:b3090631fecdf7e983d183d0fad7ea72cfb12fa9212461a9b708ff7907ffff47", - "sha256:b33b51ab057f8a20b497ffafdb1e79256db0c03ef4f5e3d52e7497200e11f821", - "sha256:b97c9a144bbeec7039cca44df117efcbeed7209543f5695201cacf05ba3b5857", - "sha256:be13a18cec649ebaab835dff269e914679ef329204704869f2f167b2c163a9da", - "sha256:be9768e56f92d1d7cd94185bab5856f3c5589a50d221c166cc2ad5eb134bd1dc", - "sha256:c1580087ab493c6b43e66f2bdd165d9e3c1e86ef83f6c2c44a29f2869d2c5bd5", - "sha256:c35872b2916ab5a240d52a94314c963476c989814ba9b519bc842e5b61b464bb", - "sha256:c70c7dd733a4c56838d1f1781e769081a25fade879510c5b5f0df76956abfa05", - "sha256:c767458511a59f6f597bfb0032a1c82a52c29ae228c2c0a6865cfeaeaac4c5f5", - "sha256:c87df8ae3f01ffb4483c796fe1b15232ce2b219f0b18126948616224d3f658ee", - "sha256:ca1c4a569232c063615f9e70ff9a1e2fee8c66a6fb5caf0f5e8b21a396deec3e", - "sha256:cc407b68e0a874e7ece60f6639df46309376882152345508be94da608cc0b831", - "sha256:da862b8f7de577bc421323714f63276acb2f759ab8c5e33335509f0b89e06b8f", - "sha256:dfe7eac0d253915116ed0cd160a15a88981a1d194c1ef151e862a5c7d2f853d3", - "sha256:ed1377feed808c9c1139bdb6a61bcbf030c236dd288d6fca71ac26906ab03ba6", - "sha256:f42ad188466d946f1b3afc0a9e1a266ac8926461ee0786c06baac6bd71f8a6f3", - "sha256:f92731609d6625e1cc26ff5757db4d32b6b810d2a3363b0ff94ff573e5901f6f" - ], - "markers": "python_version >= '3'", - "version": "==1.1.0" + "markers": "python_version >= '3.9'", + "version": "==1.2.2" }, "gunicorn": { "hashes": [ - "sha256:9dcc4547dbb1cb284accfb15ab5667a0e5d1881cc443e0677b4882a4067a807e", - "sha256:e0a968b5ba15f8a328fdfd7ab1fcb5af4470c28aaf7e55df02a99bc13138e6e8" + "sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d", + "sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec" ], "index": "pypi", - "version": "==20.1.0" + "markers": "python_version >= '3.7'", + "version": "==23.0.0" }, "importlib-metadata": { "hashes": [ - "sha256:079ada16b7fc30dfbb5d13399a5113110dab1aa7c2bc62f66af75f0b717c8cac", - "sha256:9f55f560e116f8643ecf2922d9cd3e1c7e8d52e683178fecd9d08f6aa357e11e" + "sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb", + "sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151" ], - "markers": "python_version < '3.8'", - "version": "==4.6.1" + "markers": "python_version >= '3.9'", + "version": "==8.7.1" }, "itsdangerous": { "hashes": [ - "sha256:5174094b9637652bdb841a3029700391451bd092ba3db90600dea710ba28e97c", - "sha256:9e724d68fc22902a1435351f84c3fb8623f303fffcc566a4cb952df8c572cff0" + "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef", + "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173" ], - "version": "==2.0.1" + "markers": "python_version >= '3.8'", + "version": "==2.2.0" }, "jinja2": { "hashes": [ - "sha256:1f06f2da51e7b56b8f238affdd6b4e2c61e39598a378cc49345bc1bd42a978a4", - "sha256:703f484b47a6af502e743c9122595cc812b0271f661722403114f71a79d0f5a4" + "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", + "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67" ], - "version": "==3.0.1" + "markers": "python_version >= '3.7'", + "version": "==3.1.6" }, "mako": { "hashes": [ - "sha256:17831f0b7087c313c0ffae2bcbbd3c1d5ba9eeac9c38f2eb7b50e8c99fe9d5ab", - "sha256:aea166356da44b9b830c8023cd9b557fa856bd8b4035d6de771ca027dfc5cc6e" + "sha256:99579a6f39583fa7e5630a28c3c1f440e4e97a414b80372649c0ce338da2ea28", + "sha256:baef24a52fc4fc514a0887ac600f9f1cff3d82c61d4d700a1fa84d597b88db59" ], - "version": "==1.1.4" + "markers": "python_version >= '3.8'", + "version": "==1.3.10" }, "markupsafe": { "hashes": [ - "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298", - "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64", - "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b", - "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567", - "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff", - "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74", - "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35", - "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26", - "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7", - "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75", - "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f", - "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135", - "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8", - "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a", - "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914", - "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18", - "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8", - "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2", - "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d", - "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b", - "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f", - "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb", - "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833", - "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415", - "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902", - "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9", - "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d", - "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066", - "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f", - "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5", - "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94", - "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509", - "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51", - "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872" + "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f", + "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", + "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", + "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", + "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", + "sha256:0f4b68347f8c5eab4a13419215bdfd7f8c9b19f2b25520968adfad23eb0ce60c", + "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", + "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", + "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", + "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", + "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", + "sha256:15d939a21d546304880945ca1ecb8a039db6b4dc49b2c5a400387cdae6a62e26", + "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1", + "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", + "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", + "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", + "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695", + "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", + "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", + "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", + "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", + "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa", + "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559", + "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", + "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", + "sha256:3537e01efc9d4dccdf77221fb1cb3b8e1a38d5428920e0657ce299b20324d758", + "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", + "sha256:38664109c14ffc9e7437e86b4dceb442b0096dfe3541d7864d9cbe1da4cf36c8", + "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", + "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", + "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", + "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", + "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", + "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", + "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", + "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", + "sha256:591ae9f2a647529ca990bc681daebdd52c8791ff06c2bfa05b65163e28102ef2", + "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", + "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", + "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", + "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", + "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", + "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", + "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", + "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", + "sha256:7c3fb7d25180895632e5d3148dbdc29ea38ccb7fd210aa27acbd1201a1902c6e", + "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", + "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", + "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", + "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", + "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", + "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", + "sha256:949b8d66bc381ee8b007cd945914c721d9aba8e27f71959d750a46f7c282b20b", + "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", + "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", + "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", + "sha256:a320721ab5a1aba0a233739394eb907f8c8da5c98c9181d1161e77a0c8e36f2d", + "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", + "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", + "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", + "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", + "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", + "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", + "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", + "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c", + "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", + "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8", + "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", + "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6", + "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", + "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", + "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", + "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", + "sha256:df2449253ef108a379b8b5d6b43f4b1a8e81a061d6537becd5582fba5f9196d7", + "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419", + "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", + "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1", + "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", + "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", + "sha256:e8fc20152abba6b83724d7ff268c249fa196d8259ff481f3b1476383f8f24e42", + "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", + "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", + "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", + "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", + "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", + "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591", + "sha256:f71a396b3bf33ecaa1626c255855702aca4d3d9fea5e051b41ac59a9c1c41edc", + "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", + "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50" ], - "version": "==2.0.1" + "index": "pypi", + "markers": "python_version >= '3.9'", + "version": "==3.0.3" }, - "python-dateutil": { + "packaging": { "hashes": [ - "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", - "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" + "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", + "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529" ], - "version": "==2.8.2" - }, - "python-editor": { - "hashes": [ - "sha256:1bf6e860a8ad52a14c3ee1252d5dc25b2030618ed80c022598f00176adc8367d", - "sha256:51fda6bcc5ddbbb7063b2af7509e43bd84bfc32a4ff71349ec7847713882327b", - "sha256:5f98b069316ea1c2ed3f67e7f5df6c0d8f10b689964a4a811ff64f0106819ec8", - "sha256:c3da2053dbab6b29c94e43c486ff67206eafbe7eb52dbec7390b5e2fb05aac77", - "sha256:ea87e17f6ec459e780e4221f295411462e0d0810858e055fc514684350a2f522" - ], - "version": "==1.0.4" - }, - "six": { - "hashes": [ - "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", - "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" - ], - "version": "==1.16.0" + "markers": "python_version >= '3.8'", + "version": "==26.0" }, "sqlalchemy": { "hashes": [ - "sha256:09dbb4bc01a734ccddbf188deb2a69aede4b3c153a72b6d5c6900be7fb2945b1", - "sha256:12bac5fa1a6ea870bdccb96fe01610641dd44ebe001ed91ef7fcd980e9702db5", - "sha256:1fdae7d980a2fa617d119d0dc13ecb5c23cc63a8b04ffcb5298f2c59d86851e9", - "sha256:26daa429f039e29b1e523bf763bfab17490556b974c77b5ca7acb545b9230e9a", - "sha256:36a089dc604032d41343d86290ce85d4e6886012eea73faa88001260abf5ff81", - "sha256:39b5d36ab71f73c068cdcf70c38075511de73616e6c7fdd112d6268c2704d9f5", - "sha256:4014978de28163cd8027434916a92d0f5bb1a3a38dff5e8bf8bff4d9372a9117", - "sha256:44d23ea797a5e0be71bc5454b9ae99158ea0edc79e2393c6e9a2354de88329c0", - "sha256:488608953385d6c127d2dcbc4b11f8d7f2f30b89f6bd27c01b042253d985cc2f", - "sha256:5102b9face693e8b2db3b2539c7e1a5d9a5b4dc0d79967670626ffd2f710d6e6", - "sha256:5908ea6c652a050d768580d01219c98c071e71910ab8e7b42c02af4010608397", - "sha256:5d856cc50fd26fc8dd04892ed5a5a3d7eeb914fea2c2e484183e2d84c14926e0", - "sha256:68393d3fd31469845b6ba11f5b4209edbea0b58506be0e077aafbf9aa2e21e11", - "sha256:6a16c7c4452293da5143afa3056680db2d187b380b3ef4d470d4e29885720de3", - "sha256:756f5d2f5b92d27450167247fb574b09c4cd192a3f8c2e493b3e518a204ee543", - "sha256:891927a49b2363a4199763a9d436d97b0b42c65922a4ea09025600b81a00d17e", - "sha256:9bfe882d5a1bbde0245dca0bd48da0976bd6634cf2041d2fdf0417c5463e40e5", - "sha256:9fcbb4b4756b250ed19adc5e28c005b8ed56fdb5c21efa24c6822c0575b4964d", - "sha256:a00d9c6d3a8afe1d1681cd8a5266d2f0ed684b0b44bada2ca82403b9e8b25d39", - "sha256:a5e14cb0c0a4ac095395f24575a0e7ab5d1be27f5f9347f1762f21505e3ba9f1", - "sha256:b48148ceedfb55f764562e04c00539bb9ea72bf07820ca15a594a9a049ff6b0e", - "sha256:b7fb937c720847879c7402fe300cfdb2aeff22349fa4ea3651bca4e2d6555939", - "sha256:bc34a007e604091ca3a4a057525efc4cefd2b7fe970f44d20b9cfa109ab1bddb", - "sha256:c9373ef67a127799027091fa53449125351a8c943ddaa97bec4e99271dbb21f4", - "sha256:d09a760b0a045b4d799102ae7965b5491ccf102123f14b2a8cc6c01d1021a2d9", - "sha256:ec1be26cdccd60d180359a527d5980d959a26269a2c7b1b327a1eea0cab37ed8", - "sha256:eedd76f135461cf237534a6dc0d1e0f6bb88a1dc193678fab48a11d223462da5", - "sha256:f028ef6a1d828bc754852a022b2160e036202ac8658a6c7d34875aafd14a9a15", - "sha256:f814d80844969b0d22ea63663da4de5ca1c434cfbae226188901e5d368792c17", - "sha256:fd2102a8f8a659522719ed73865dff3d3cc76eb0833039dc473e0ad3041d04be" + "sha256:09168817d6c19954d3b7655da6ba87fcb3a62bb575fb396a81a8b6a9fadfe8b5", + "sha256:0cc3117db526cad3e61074100bd2867b533e2c7dc1569e95c14089735d6fb4fe", + "sha256:181903fe8c1b9082995325f1b2e84ac078b1189e2819380c2303a5f90e114a62", + "sha256:1bc3f601f0a818d27bfe139f6766487d9c88502062a2cd3a7ee6c342e81d5047", + "sha256:1e6199143d51e3e1168bedd98cc698397404a8f7508831b81b6a29b18b051069", + "sha256:2347c3f0efc4de367ba00218e0ae5c4ba2306e47216ef80d6e31761ac97cb0b9", + "sha256:261c4b1f101b4a411154f1da2b76497d73abbfc42740029205d4d01fa1052684", + "sha256:33e462154edb9493f6c3ad2125931e273bbd0be8ae53f3ecd1c161ea9a1dd366", + "sha256:37fee2164cf21417478b6a906adc1a91d69ae9aba8f9533e67ce882f4bb1de53", + "sha256:3a9a72b0da8387f15d5810f1facca8f879de9b85af8c645138cba61ea147968c", + "sha256:3aac08f7546179889c62b53b18ebf1148b10244b3405569c93984b0388d016a7", + "sha256:3c32e993bc57be6d177f7d5d31edb93f30726d798ad86ff9066d75d9bf2e0b6b", + "sha256:412f26bb4ba942d52016edc8d12fb15d91d3cd46b0047ba46e424213ad407bcb", + "sha256:42a1643dc5427b69aca967dae540a90b0fbf57eaf248f13a90ea5930e0966863", + "sha256:4396c948d8217e83e2c202fbdcc0389cf8c93d2c1c5e60fa5c5a955eae0e64be", + "sha256:4dafb537740eef640c4d6a7c254611dca2df87eaf6d14d6a5fca9d1f4c3fc0fa", + "sha256:4f52f7291a92381e9b4de9050b0a65ce5d6a763333406861e33906b8aa4906bf", + "sha256:52fe29b3817bd191cc20bad564237c808967972c97fa683c04b28ec8979ae36f", + "sha256:56bdd261bfd0895452006d5316cbf35739c53b9bb71a170a331fa0ea560b2ada", + "sha256:585af6afe518732d9ccd3aea33af2edaae4a7aa881af5d8f6f4fe3a368699597", + "sha256:590be24e20e2424a4c3c1b0835e9405fa3d0af5823a1a9fc02e5dff56471515f", + "sha256:64901e08c33462acc9ec3bad27fc7a5c2b6491665f2aa57564e57a4f5d7c52ad", + "sha256:6ac245604295b521de49b465bab845e3afe6916bcb2147e5929c8041b4ec0545", + "sha256:6f827fd687fa1ba7f51699e1132129eac8db8003695513fcf13fc587e1bd47a5", + "sha256:70ed2830b169a9960193f4d4322d22be5c0925357d82cbf485b3369893350908", + "sha256:716be5bcabf327b6d5d265dbdc6213a01199be587224eb991ad0d37e83d728fd", + "sha256:7568fe771f974abadce52669ef3a03150ff03186d8eb82613bc8adc435a03f01", + "sha256:77f8071d8fbcbb2dd11b7fd40dedd04e8ebe2eb80497916efedba844298065ef", + "sha256:82ec52100ec1e6ec671563bbd02d7c7c8d0b9e71a0723c72f22ecf52d1755330", + "sha256:895296687ad06dc9b11a024cf68e8d9d3943aa0b4964278d2553b86f1b267735", + "sha256:8d3b44b3d0ab2f1319d71d9863d76eeb46766f8cf9e921ac293511804d39813f", + "sha256:8d679b5f318423eacb61f933a9a0f75535bfca7056daeadbf6bd5bcee6183aee", + "sha256:8e84b09a9b0f19accedcbeff5c2caf36e0dd537341a33aad8d680336152dc34e", + "sha256:9094c8b3197db12aa6f05c51c05daaad0a92b8c9af5388569847b03b1007fb1b", + "sha256:90bde6c6b1827565a95fde597da001212ab436f1b2e0c2dcc7246e14db26e2a3", + "sha256:9397b381dcee8a2d6b99447ae85ea2530dcac82ca494d1db877087a13e38926d", + "sha256:93a12da97cca70cea10d4b4fc602589c4511f96c1f8f6c11817620c021d21d00", + "sha256:93bb0aae40b52c57fd74ef9c6933c08c040ba98daf23ad33c3f9893494b8d3ce", + "sha256:94b1e5f3a5f1ff4f42d5daab047428cd45a3380e51e191360a35cef71c9a7a2a", + "sha256:965c62be8256d10c11f8907e7a8d3e18127a4c527a5919d85fa87fd9ecc2cfdc", + "sha256:96c7cca1a4babaaf3bfff3e4e606e38578856917e52f0384635a95b226c87764", + "sha256:9bcdce05f056622a632f1d44bb47dbdb677f58cad393612280406ce37530eb6d", + "sha256:9d80ea2ac519c364a7286e8d765d6cd08648f5b21ca855a8017d9871f075542d", + "sha256:a1e8cc6cc01da346dc92d9509a63033b9b1bda4fed7a7a7807ed385c7dccdc10", + "sha256:ab65cb2885a9f80f979b85aa4e9c9165a31381ca322cbde7c638fe6eefd1ec39", + "sha256:af865c18752d416798dae13f83f38927c52f085c52e2f32b8ab0fef46fdd02c2", + "sha256:b1e14b2f6965a685c7128bd315e27387205429c2e339eeec55cb75ca4ab0ea2e", + "sha256:b2a9f9aee38039cf4755891a1e50e1effcc42ea6ba053743f452c372c3152b1b", + "sha256:be6c0466b4c25b44c5d82b0426b5501de3c424d7a3220e86cd32f319ba56798e", + "sha256:c4e2cc868b7b5208aec6c960950b7bb821f82c2fe66446c92ee0a571765e91a5", + "sha256:c805fa6e5d461329fa02f53f88c914d189ea771b6821083937e79550bf31fc19", + "sha256:cf36851ee7219c170bb0793dbc3da3e80c582e04a5437bc601bfe8c85c9216d7", + "sha256:db23b1bf8cfe1f7fda19018e7207b20cdb5168f83c437ff7e95d19e39289c447", + "sha256:e0c05aff5c6b1bb5fb46a87e0f9d2f733f83ef6cbbbcd5c642b6c01678268061", + "sha256:e8ac45e8f4eaac0f9f8043ea0e224158855c6a4329fd4ee37c45c61e3beb518e", + "sha256:ea3cd46b6713a10216323cda3333514944e510aa691c945334713fca6b5279ff", + "sha256:ebf7e1e78af38047e08836d33502c7a278915698b7c2145d045f780201679999", + "sha256:f9c11766e7e7c0a2767dda5acb006a118640c9fc0a4104214b96269bfb78399e", + "sha256:ff33c6e6ad006bbc0f34f5faf941cfc62c45841c64c0a058ac38c799f15b5ede" ], - "version": "==1.4.22" + "markers": "python_version >= '3.7'", + "version": "==2.0.46" + }, + "tomli": { + "hashes": [ + "sha256:0408e3de5ec77cc7f81960c362543cbbd91ef883e3138e81b729fc3eea5b9729", + "sha256:0dc56fef0e2c1c470aeac5b6ca8cc7b640bb93e92d9803ddaf9ea03e198f5b0b", + "sha256:0e0fe8a0b8312acf3a88077a0802565cb09ee34107813bba1c7cd591fa6cfc8d", + "sha256:0f2e3955efea4d1cfbcb87bc321e00dc08d2bcb737fd1d5e398af111d86db5df", + "sha256:133e93646ec4300d651839d382d63edff11d8978be23da4cc106f5a18b7d0576", + "sha256:1b168f2731796b045128c45982d3a4874057626da0e2ef1fdd722848b741361d", + "sha256:1c8a885b370751837c029ef9bc014f27d80840e48bac415f3412e6593bbc18c1", + "sha256:1f776e7d669ebceb01dee46484485f43a4048746235e683bcdffacdf1fb4785a", + "sha256:1fb2945cbe303b1419e2706e711b7113da57b7db31ee378d08712d678a34e51e", + "sha256:20cedb4ee43278bc4f2fee6cb50daec836959aadaf948db5172e776dd3d993fc", + "sha256:20ffd184fb1df76a66e34bd1b36b4a4641bd2b82954befa32fe8163e79f1a702", + "sha256:26ab906a1eb794cd4e103691daa23d95c6919cc2fa9160000ac02370cc9dd3f6", + "sha256:2add28aacc7425117ff6364fe9e06a183bb0251b03f986df0e78e974047571fd", + "sha256:2b1e3b80e1d5e52e40e9b924ec43d81570f0e7d09d11081b797bc4692765a3d4", + "sha256:31d556d079d72db7c584c0627ff3a24c5d3fb4f730221d3444f3efb1b2514776", + "sha256:36b9d05b51e65b254ea6c2585b59d2c4cb91c8a3d91d0ed0f17591a29aaea54a", + "sha256:39b0b5d1b6dd03684b3fb276407ebed7090bbec989fa55838c98560c01113b66", + "sha256:3cf226acb51d8f1c394c1b310e0e0e61fecdd7adcb78d01e294ac297dd2e7f87", + "sha256:3d895d56bd3f82ddd6faaff993c275efc2ff38e52322ea264122d72729dca2b2", + "sha256:413540dce94673591859c4c6f794dfeaa845e98bf35d72ed59636f869ef9f86f", + "sha256:43e685b9b2341681907759cf3a04e14d7104b3580f808cfde1dfdb60ada85475", + "sha256:4cbcb367d44a1f0c2be408758b43e1ffb5308abe0ea222897d6bfc8e8281ef2f", + "sha256:551e321c6ba03b55676970b47cb1b73f14a0a4dce6a3e1a9458fd6d921d72e95", + "sha256:5572e41282d5268eb09a697c89a7bee84fae66511f87533a6f88bd2f7b652da9", + "sha256:5aa48d7c2356055feef06a43611fc401a07337d5b006be13a30f6c58f869e3c3", + "sha256:5b5807f3999fb66776dbce568cc9a828544244a8eb84b84b9bafc080c99597b9", + "sha256:5e3f639a7a8f10069d0e15408c0b96a2a828cfdec6fca05296ebcdcc28ca7c76", + "sha256:685306e2cc7da35be4ee914fd34ab801a6acacb061b6a7abca922aaf9ad368da", + "sha256:75c2f8bbddf170e8effc98f5e9084a8751f8174ea6ccf4fca5398436e0320bc8", + "sha256:7b438885858efd5be02a9a133caf5812b8776ee0c969fea02c45e8e3f296ba51", + "sha256:7d49c66a7d5e56ac959cb6fc583aff0651094ec071ba9ad43df785abc2320d86", + "sha256:7d6d9a4aee98fac3eab4952ad1d73aee87359452d1c086b5ceb43ed02ddb16b8", + "sha256:84d081fbc252d1b6a982e1870660e7330fb8f90f676f6e78b052ad4e64714bf0", + "sha256:8768715ffc41f0008abe25d808c20c3d990f42b6e2e58305d5da280ae7d1fa3b", + "sha256:920b1de295e72887bafa3ad9f7a792f811847d57ea6b1215154030cf131f16b1", + "sha256:9a08144fa4cba33db5255f9b74f0b89888622109bd2776148f2597447f92a94e", + "sha256:a26d7ff68dfdb9f87a016ecfd1e1c2bacbe3108f4e0f8bcd2228ef9a766c787d", + "sha256:aa89c3f6c277dd275d8e243ad24f3b5e701491a860d5121f2cdd399fbb31fc9c", + "sha256:b5ef256a3fd497d4973c11bf142e9ed78b150d36f5773f1ca6088c230ffc5867", + "sha256:b6c78bdf37764092d369722d9946cb65b8767bfa4110f902a1b2542d8d173c8a", + "sha256:bbb1b10aa643d973366dc2cb1ad94f99c1726a02343d43cbc011edbfac579e7c", + "sha256:c084ad935abe686bd9c898e62a02a19abfc9760b5a79bc29644463eaf2840cb0", + "sha256:c73add4bb52a206fd0c0723432db123c0c75c280cbd67174dd9d2db228ebb1b4", + "sha256:cae9c19ed12d4e8f3ebf46d1a75090e4c0dc16271c5bce1c833ac168f08fb614", + "sha256:d20b797a5c1ad80c516e41bc1fb0443ddb5006e9aaa7bda2d71978346aeb9132", + "sha256:d3d1654e11d724760cdb37a3d7691f0be9db5fbdaef59c9f532aabf87006dbaa", + "sha256:d878f2a6707cc9d53a1be1414bbb419e629c3d6e67f69230217bb663e76b5087" + ], + "markers": "python_version >= '3.8'", + "version": "==2.4.0" }, "typing-extensions": { "hashes": [ - "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497", - "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342", - "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84" + "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", + "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548" ], - "markers": "python_version < '3.8'", - "version": "==3.10.0.0" + "markers": "python_version >= '3.9'", + "version": "==4.15.0" }, "werkzeug": { "hashes": [ - "sha256:1de1db30d010ff1af14a009224ec49ab2329ad2cde454c8a708130642d579c42", - "sha256:6c1ec500dcdba0baa27600f6a22f6333d8b662d22027ff9f6202e3367413caa8" + "sha256:5111e36e91086ece91f93268bb39b4a35c1e6f1feac762c9c822ded0a4e322dc", + "sha256:6a548b0e88955dd07ccb25539d7d0cc97417ee9e179677d22c7041c8f078ce67" ], - "version": "==2.0.1" + "markers": "python_version >= '3.9'", + "version": "==3.1.5" }, "wtforms": { "hashes": [ - "sha256:7ee6e0591777e4ad6779276cd64464bd0a8fc1ce2509b5bb88f936c9426c180c", - "sha256:cf01f0173ff7124ab30afeee444876a0f576fa5ed9c32f2112c439137077492f" + "sha256:583bad77ba1dd7286463f21e11aa3043ca4869d03575921d1a1698d0715e0fd4", + "sha256:df3e6b70f3192e92623128123ec8dca3067df9cfadd43d59681e210cfb8d4682" ], - "version": "==3.0.0a1" + "markers": "python_version >= '3.9'", + "version": "==3.2.1" }, "zipp": { "hashes": [ - "sha256:957cfda87797e389580cb8b9e3870841ca991e2125350677b2ca83a0e99390a3", - "sha256:f5812b1e007e48cff63449a5e9f4e7ebea716b4111f9c4f9a645f91d579bf0c4" + "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", + "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166" ], - "version": "==3.5.0" + "markers": "python_version >= '3.9'", + "version": "==3.23.0" } }, "develop": { - "appdirs": { - "hashes": [ - "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41", - "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128" - ], - "version": "==1.4.4" - }, "astroid": { "hashes": [ - "sha256:7b963d1c590d490f60d2973e57437115978d3a2529843f160b5003b721e1e925", - "sha256:83e494b02d75d07d4e347b27c066fd791c0c74fc96c613d1ea3de0c82c48168f" + "sha256:1e5a5011af2920c7c67a53f65d536d65bfa7116feeaf2354d8b94f29573bb0ce", + "sha256:54c760ae8322ece1abd213057c4b5bba7c49818853fc901ef09719a60dbf9dec" ], - "version": "==2.6.5" + "markers": "python_full_version >= '3.9.0'", + "version": "==3.3.11" }, "black": { "hashes": [ - "sha256:1c7aa6ada8ee864db745b22790a32f94b2795c253a75d6d9b5e439ff10d23116", - "sha256:c8373c6491de9362e39271630b65b964607bc5c79c83783547d76c839b3aa219" + "sha256:0a1d40348b6621cc20d3d7530a5b8d67e9714906dfd7346338249ad9c6cedf2b", + "sha256:0c0f7c461df55cf32929b002335883946a4893d759f2df343389c4396f3b6b37", + "sha256:1032639c90208c15711334d681de2e24821af0575573db2810b0763bcd62e0f0", + "sha256:35690a383f22dd3e468c85dc4b915217f87667ad9cce781d7b42678ce63c4170", + "sha256:43945853a31099c7c0ff8dface53b4de56c41294fa6783c0441a8b1d9bf668bc", + "sha256:51c65d7d60bb25429ea2bf0731c32b2a2442eb4bd3b2afcb47830f0b13e58bfd", + "sha256:5bd4a22a0b37401c8e492e994bce79e614f91b14d9ea911f44f36e262195fdda", + "sha256:6cb2d54a39e0ef021d6c5eef442e10fd71fcb491be6413d083a320ee768329dd", + "sha256:6cced12b747c4c76bc09b4db057c319d8545307266f41aaee665540bc0e04e96", + "sha256:7eebd4744dfe92ef1ee349dc532defbf012a88b087bb7ddd688ff59a447b080e", + "sha256:80e7486ad3535636657aa180ad32a7d67d7c273a80e12f1b4bfa0823d54e8fac", + "sha256:895571922a35434a9d8ca67ef926da6bc9ad464522a5fe0db99b394ef1c0675a", + "sha256:92285c37b93a1698dcbc34581867b480f1ba3a7b92acf1fe0467b04d7a4da0dc", + "sha256:936c4dd07669269f40b497440159a221ee435e3fddcf668e0c05244a9be71993", + "sha256:9815ccee1e55717fe9a4b924cae1646ef7f54e0f990da39a34fc7b264fcf80a2", + "sha256:9a323ac32f5dc75ce7470501b887250be5005a01602e931a15e45593f70f6e08", + "sha256:a3bb5ce32daa9ff0605d73b6f19da0b0e6c1f8f2d75594db539fdfed722f2b06", + "sha256:aa211411e94fdf86519996b7f5f05e71ba34835d8f0c0f03c00a26271da02664", + "sha256:ae263af2f496940438e5be1a0c1020e13b09154f3af4df0835ea7f9fe7bfa409", + "sha256:cb4f4b65d717062191bdec8e4a442539a8ea065e6af1c4f4d36f0cdb5f71e170", + "sha256:d81a44cbc7e4f73a9d6ae449ec2317ad81512d1e7dce7d57f6333fd6259737bc", + "sha256:dae49ef7369c6caa1a1833fd5efb7c3024bb7e4499bf64833f65ad27791b1545", + "sha256:e3f562da087791e96cefcd9dda058380a442ab322a02e222add53736451f604b", + "sha256:ec311e22458eec32a807f029b2646f661e6859c3f61bc6d9ffb67958779f392e", + "sha256:f42c0ea7f59994490f4dccd64e6b2dd49ac57c7c84f38b8faab50f8759db245c", + "sha256:f9786c24d8e9bd5f20dc7a7f0cdd742644656987f6ea6947629306f937726c03" ], "index": "pypi", - "version": "==21.7b0" + "markers": "python_version >= '3.9'", + "version": "==25.11.0" + }, + "blinker": { + "hashes": [ + "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf", + "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc" + ], + "markers": "python_version >= '3.9'", + "version": "==1.9.0" }, "click": { "hashes": [ - "sha256:8c04c11192119b1ef78ea049e0a6f0463e4c48ef00a30160c704337586f3ad7a", - "sha256:fba402a4a47334742d782209a7c79bc448911afe1149d07bdabdf480b3e2f4b6" + "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", + "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a" ], - "version": "==8.0.1" + "markers": "python_version >= '3.7'", + "version": "==8.1.8" + }, + "dill": { + "hashes": [ + "sha256:1e1ce33e978ae97fcfcff5638477032b801c46c7c65cf717f95fbc2248f79a9d", + "sha256:423092df4182177d4d8ba8290c8a5b640c66ab35ec7da59ccfa00f6fa3eea5fa" + ], + "markers": "python_version >= '3.9'", + "version": "==0.4.1" }, "flake8": { "hashes": [ - "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b", - "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907" + "sha256:b9696257b9ce8beb888cdbe31cf885c90d31928fe202be0889a7cdafad32f01e", + "sha256:fe044858146b9fc69b551a4b490d69cf960fcb78ad1edcb84e7fbb1b4a8e3872" ], "index": "pypi", - "version": "==3.9.2" + "markers": "python_version >= '3.9'", + "version": "==7.3.0" }, "flask": { "hashes": [ - "sha256:1c4c257b1892aec1398784c63791cbaa43062f1f7aeb555c4da961b20ee68f55", - "sha256:a6209ca15eb63fc9385f38e452704113d679511d9574d09b2cf9183ae7d20dc9" + "sha256:bf656c15c80190ed628ad08cdfd3aaa35beb087855e2f494910aa3774cc4fd87", + "sha256:ca1d8112ec8a6158cc29ea4858963350011b5c846a414cdb7a954aa9e967d03c" ], "index": "pypi", - "version": "==2.0.1" + "markers": "python_version >= '3.9'", + "version": "==3.1.2" }, "flask-sqlalchemy": { "hashes": [ - "sha256:2bda44b43e7cacb15d4e05ff3cc1f8bc97936cc464623424102bfc2c35e95912", - "sha256:f12c3d4cc5cc7fdcc148b9527ea05671718c3ea45d50c7e732cceb33f574b390" + "sha256:4ba4be7f419dc72f4efd8802d69974803c37259dd42f3913b0dcf75c9447e0a0", + "sha256:e4b68bb881802dda1a7d878b2fc84c06d1ee57fb40b874d3dc97dabfa36b8312" ], "index": "pypi", - "version": "==2.5.1" - }, - "greenlet": { - "hashes": [ - "sha256:03f28a5ea20201e70ab70518d151116ce939b412961c33827519ce620957d44c", - "sha256:06d7ac89e6094a0a8f8dc46aa61898e9e1aec79b0f8b47b2400dd51a44dbc832", - "sha256:06ecb43b04480e6bafc45cb1b4b67c785e183ce12c079473359e04a709333b08", - "sha256:096cb0217d1505826ba3d723e8981096f2622cde1eb91af9ed89a17c10aa1f3e", - "sha256:0c557c809eeee215b87e8a7cbfb2d783fb5598a78342c29ade561440abae7d22", - "sha256:0de64d419b1cb1bfd4ea544bedea4b535ef3ae1e150b0f2609da14bbf48a4a5f", - "sha256:14927b15c953f8f2d2a8dffa224aa78d7759ef95284d4c39e1745cf36e8cdd2c", - "sha256:16183fa53bc1a037c38d75fdc59d6208181fa28024a12a7f64bb0884434c91ea", - "sha256:206295d270f702bc27dbdbd7651e8ebe42d319139e0d90217b2074309a200da8", - "sha256:22002259e5b7828b05600a762579fa2f8b33373ad95a0ee57b4d6109d0e589ad", - "sha256:2325123ff3a8ecc10ca76f062445efef13b6cf5a23389e2df3c02a4a527b89bc", - "sha256:258f9612aba0d06785143ee1cbf2d7361801c95489c0bd10c69d163ec5254a16", - "sha256:3096286a6072553b5dbd5efbefc22297e9d06a05ac14ba017233fedaed7584a8", - "sha256:3d13da093d44dee7535b91049e44dd2b5540c2a0e15df168404d3dd2626e0ec5", - "sha256:408071b64e52192869129a205e5b463abda36eff0cebb19d6e63369440e4dc99", - "sha256:598bcfd841e0b1d88e32e6a5ea48348a2c726461b05ff057c1b8692be9443c6e", - "sha256:5d928e2e3c3906e0a29b43dc26d9b3d6e36921eee276786c4e7ad9ff5665c78a", - "sha256:5f75e7f237428755d00e7460239a2482fa7e3970db56c8935bd60da3f0733e56", - "sha256:60848099b76467ef09b62b0f4512e7e6f0a2c977357a036de602b653667f5f4c", - "sha256:6b1d08f2e7f2048d77343279c4d4faa7aef168b3e36039cba1917fffb781a8ed", - "sha256:70bd1bb271e9429e2793902dfd194b653221904a07cbf207c3139e2672d17959", - "sha256:76ed710b4e953fc31c663b079d317c18f40235ba2e3d55f70ff80794f7b57922", - "sha256:7920e3eccd26b7f4c661b746002f5ec5f0928076bd738d38d894bb359ce51927", - "sha256:7db68f15486d412b8e2cfcd584bf3b3a000911d25779d081cbbae76d71bd1a7e", - "sha256:8833e27949ea32d27f7e96930fa29404dd4f2feb13cce483daf52e8842ec246a", - "sha256:944fbdd540712d5377a8795c840a97ff71e7f3221d3fddc98769a15a87b36131", - "sha256:9a6b035aa2c5fcf3dbbf0e3a8a5bc75286fc2d4e6f9cfa738788b433ec894919", - "sha256:9bdcff4b9051fb1aa4bba4fceff6a5f770c6be436408efd99b76fc827f2a9319", - "sha256:a9017ff5fc2522e45562882ff481128631bf35da444775bc2776ac5c61d8bcae", - "sha256:aa4230234d02e6f32f189fd40b59d5a968fe77e80f59c9c933384fe8ba535535", - "sha256:ad80bb338cf9f8129c049837a42a43451fc7c8b57ad56f8e6d32e7697b115505", - "sha256:adb94a28225005890d4cf73648b5131e885c7b4b17bc762779f061844aabcc11", - "sha256:b3090631fecdf7e983d183d0fad7ea72cfb12fa9212461a9b708ff7907ffff47", - "sha256:b33b51ab057f8a20b497ffafdb1e79256db0c03ef4f5e3d52e7497200e11f821", - "sha256:b97c9a144bbeec7039cca44df117efcbeed7209543f5695201cacf05ba3b5857", - "sha256:be13a18cec649ebaab835dff269e914679ef329204704869f2f167b2c163a9da", - "sha256:be9768e56f92d1d7cd94185bab5856f3c5589a50d221c166cc2ad5eb134bd1dc", - "sha256:c1580087ab493c6b43e66f2bdd165d9e3c1e86ef83f6c2c44a29f2869d2c5bd5", - "sha256:c35872b2916ab5a240d52a94314c963476c989814ba9b519bc842e5b61b464bb", - "sha256:c70c7dd733a4c56838d1f1781e769081a25fade879510c5b5f0df76956abfa05", - "sha256:c767458511a59f6f597bfb0032a1c82a52c29ae228c2c0a6865cfeaeaac4c5f5", - "sha256:c87df8ae3f01ffb4483c796fe1b15232ce2b219f0b18126948616224d3f658ee", - "sha256:ca1c4a569232c063615f9e70ff9a1e2fee8c66a6fb5caf0f5e8b21a396deec3e", - "sha256:cc407b68e0a874e7ece60f6639df46309376882152345508be94da608cc0b831", - "sha256:da862b8f7de577bc421323714f63276acb2f759ab8c5e33335509f0b89e06b8f", - "sha256:dfe7eac0d253915116ed0cd160a15a88981a1d194c1ef151e862a5c7d2f853d3", - "sha256:ed1377feed808c9c1139bdb6a61bcbf030c236dd288d6fca71ac26906ab03ba6", - "sha256:f42ad188466d946f1b3afc0a9e1a266ac8926461ee0786c06baac6bd71f8a6f3", - "sha256:f92731609d6625e1cc26ff5757db4d32b6b810d2a3363b0ff94ff573e5901f6f" - ], - "markers": "python_version >= '3'", - "version": "==1.1.0" + "markers": "python_version >= '3.8'", + "version": "==3.1.1" }, "importlib-metadata": { "hashes": [ - "sha256:079ada16b7fc30dfbb5d13399a5113110dab1aa7c2bc62f66af75f0b717c8cac", - "sha256:9f55f560e116f8643ecf2922d9cd3e1c7e8d52e683178fecd9d08f6aa357e11e" + "sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb", + "sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151" ], - "markers": "python_version < '3.8'", - "version": "==4.6.1" + "markers": "python_version >= '3.9'", + "version": "==8.7.1" }, "isort": { "hashes": [ - "sha256:eed17b53c3e7912425579853d078a0832820f023191561fcee9d7cae424e0813", - "sha256:f65ce5bd4cbc6abdfbe29afc2f0245538ab358c14590912df638033f157d555e" + "sha256:58d8927ecce74e5087aef019f778d4081a3b6c98f15a80ba35782ca8a2097784", + "sha256:9b8f96a14cfee0677e78e941ff62f03769a06d412aabb9e2a90487b3b7e8d481" ], - "version": "==5.9.2" + "markers": "python_full_version >= '3.9.0'", + "version": "==6.1.0" }, "itsdangerous": { "hashes": [ - "sha256:5174094b9637652bdb841a3029700391451bd092ba3db90600dea710ba28e97c", - "sha256:9e724d68fc22902a1435351f84c3fb8623f303fffcc566a4cb952df8c572cff0" + "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef", + "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173" ], - "version": "==2.0.1" + "markers": "python_version >= '3.8'", + "version": "==2.2.0" }, "jinja2": { "hashes": [ - "sha256:1f06f2da51e7b56b8f238affdd6b4e2c61e39598a378cc49345bc1bd42a978a4", - "sha256:703f484b47a6af502e743c9122595cc812b0271f661722403114f71a79d0f5a4" + "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", + "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67" ], - "version": "==3.0.1" - }, - "lazy-object-proxy": { - "hashes": [ - "sha256:17e0967ba374fc24141738c69736da90e94419338fd4c7c7bef01ee26b339653", - "sha256:1fee665d2638491f4d6e55bd483e15ef21f6c8c2095f235fef72601021e64f61", - "sha256:22ddd618cefe54305df49e4c069fa65715be4ad0e78e8d252a33debf00f6ede2", - "sha256:24a5045889cc2729033b3e604d496c2b6f588c754f7a62027ad4437a7ecc4837", - "sha256:410283732af311b51b837894fa2f24f2c0039aa7f220135192b38fcc42bd43d3", - "sha256:4732c765372bd78a2d6b2150a6e99d00a78ec963375f236979c0626b97ed8e43", - "sha256:489000d368377571c6f982fba6497f2aa13c6d1facc40660963da62f5c379726", - "sha256:4f60460e9f1eb632584c9685bccea152f4ac2130e299784dbaf9fae9f49891b3", - "sha256:5743a5ab42ae40caa8421b320ebf3a998f89c85cdc8376d6b2e00bd12bd1b587", - "sha256:85fb7608121fd5621cc4377a8961d0b32ccf84a7285b4f1d21988b2eae2868e8", - "sha256:9698110e36e2df951c7c36b6729e96429c9c32b3331989ef19976592c5f3c77a", - "sha256:9d397bf41caad3f489e10774667310d73cb9c4258e9aed94b9ec734b34b495fd", - "sha256:b579f8acbf2bdd9ea200b1d5dea36abd93cabf56cf626ab9c744a432e15c815f", - "sha256:b865b01a2e7f96db0c5d12cfea590f98d8c5ba64ad222300d93ce6ff9138bcad", - "sha256:bf34e368e8dd976423396555078def5cfc3039ebc6fc06d1ae2c5a65eebbcde4", - "sha256:c6938967f8528b3668622a9ed3b31d145fab161a32f5891ea7b84f6b790be05b", - "sha256:d1c2676e3d840852a2de7c7d5d76407c772927addff8d742b9808fe0afccebdf", - "sha256:d7124f52f3bd259f510651450e18e0fd081ed82f3c08541dffc7b94b883aa981", - "sha256:d900d949b707778696fdf01036f58c9876a0d8bfe116e8d220cfd4b15f14e741", - "sha256:ebfd274dcd5133e0afae738e6d9da4323c3eb021b3e13052d8cbd0e457b1256e", - "sha256:ed361bb83436f117f9917d282a456f9e5009ea12fd6de8742d1a4752c3017e93", - "sha256:f5144c75445ae3ca2057faac03fda5a902eff196702b0a24daf1d6ce0650514b" - ], - "version": "==1.6.0" + "markers": "python_version >= '3.7'", + "version": "==3.1.6" }, "markupsafe": { "hashes": [ - "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298", - "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64", - "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b", - "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567", - "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff", - "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74", - "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35", - "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26", - "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7", - "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75", - "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f", - "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135", - "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8", - "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a", - "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914", - "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18", - "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8", - "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2", - "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d", - "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b", - "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f", - "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb", - "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833", - "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415", - "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902", - "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9", - "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d", - "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066", - "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f", - "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5", - "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94", - "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509", - "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51", - "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872" + "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f", + "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", + "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", + "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", + "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", + "sha256:0f4b68347f8c5eab4a13419215bdfd7f8c9b19f2b25520968adfad23eb0ce60c", + "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", + "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", + "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", + "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", + "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", + "sha256:15d939a21d546304880945ca1ecb8a039db6b4dc49b2c5a400387cdae6a62e26", + "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1", + "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", + "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", + "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", + "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695", + "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", + "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", + "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", + "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", + "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa", + "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559", + "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", + "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", + "sha256:3537e01efc9d4dccdf77221fb1cb3b8e1a38d5428920e0657ce299b20324d758", + "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", + "sha256:38664109c14ffc9e7437e86b4dceb442b0096dfe3541d7864d9cbe1da4cf36c8", + "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", + "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", + "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", + "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", + "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", + "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", + "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", + "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", + "sha256:591ae9f2a647529ca990bc681daebdd52c8791ff06c2bfa05b65163e28102ef2", + "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", + "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", + "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", + "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", + "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", + "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", + "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", + "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", + "sha256:7c3fb7d25180895632e5d3148dbdc29ea38ccb7fd210aa27acbd1201a1902c6e", + "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", + "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", + "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", + "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", + "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", + "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", + "sha256:949b8d66bc381ee8b007cd945914c721d9aba8e27f71959d750a46f7c282b20b", + "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", + "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", + "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", + "sha256:a320721ab5a1aba0a233739394eb907f8c8da5c98c9181d1161e77a0c8e36f2d", + "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", + "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", + "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", + "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", + "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", + "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", + "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", + "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c", + "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", + "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8", + "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", + "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6", + "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", + "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", + "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", + "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", + "sha256:df2449253ef108a379b8b5d6b43f4b1a8e81a061d6537becd5582fba5f9196d7", + "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419", + "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", + "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1", + "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", + "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", + "sha256:e8fc20152abba6b83724d7ff268c249fa196d8259ff481f3b1476383f8f24e42", + "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", + "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", + "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", + "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", + "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", + "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591", + "sha256:f71a396b3bf33ecaa1626c255855702aca4d3d9fea5e051b41ac59a9c1c41edc", + "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", + "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50" ], - "version": "==2.0.1" + "index": "pypi", + "markers": "python_version >= '3.9'", + "version": "==3.0.3" }, "mccabe": { "hashes": [ - "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", - "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f" + "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", + "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" ], - "version": "==0.6.1" + "markers": "python_version >= '3.6'", + "version": "==0.7.0" }, "mypy-extensions": { "hashes": [ - "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d", - "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8" + "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", + "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558" ], - "version": "==0.4.3" + "markers": "python_version >= '3.8'", + "version": "==1.1.0" + }, + "packaging": { + "hashes": [ + "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", + "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529" + ], + "markers": "python_version >= '3.8'", + "version": "==26.0" }, "pathspec": { "hashes": [ - "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a", - "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1" + "sha256:0210e2ae8a21a9137c0d470578cb0e595af87edaa6ebf12ff176f14a02e0e645", + "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723" ], - "version": "==0.9.0" + "markers": "python_version >= '3.9'", + "version": "==1.0.4" + }, + "platformdirs": { + "hashes": [ + "sha256:abd01743f24e5287cd7a5db3752faf1a2d65353f38ec26d98e25a6db65958c85", + "sha256:ca753cf4d81dc309bc67b0ea38fd15dc97bc30ce419a7f58d13eb3bf14c4febf" + ], + "markers": "python_version >= '3.9'", + "version": "==4.4.0" }, "pycodestyle": { "hashes": [ - "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068", - "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef" + "sha256:c4b5b517d278089ff9d0abdec919cd97262a3367449ea1c8b49b91529167b783", + "sha256:dd6bf7cb4ee77f8e016f9c8e74a35ddd9f67e1d5fd4184d86c3b98e07099f42d" ], - "version": "==2.7.0" + "markers": "python_version >= '3.9'", + "version": "==2.14.0" }, "pyflakes": { "hashes": [ - "sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3", - "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db" + "sha256:b24f96fafb7d2ab0ec5075b7350b3d2d2218eab42003821c06344973d3ea2f58", + "sha256:f742a7dbd0d9cb9ea41e9a24a918996e8170c799fa528688d40dd582c8265f4f" ], - "version": "==2.3.1" + "markers": "python_version >= '3.9'", + "version": "==3.4.0" }, "pylint": { "hashes": [ - "sha256:349b149e88e4357ed4f77ac3a4e61c0ab965cda293b6f4e58caf73d4b24ae551", - "sha256:adc11bec00c2084bf55c81dd69e26f2793fef757547997d44b21aed038f74403" + "sha256:01f9b0462c7730f94786c283f3e52a1fbdf0494bbe0971a78d7277ef46a751e7", + "sha256:d312737d7b25ccf6b01cc4ac629b5dcd14a0fcf3ec392735ac70f137a9d5f83a" ], "index": "pypi", - "version": "==3.0.0a4" + "markers": "python_full_version >= '3.9.0'", + "version": "==3.3.9" }, "pylint-flask": { "hashes": [ @@ -551,182 +680,223 @@ "sha256:8ede5baba1a465d8ba39d8383ffcf0889d7a6afeff44bd24177fcf529ba8aa81" ], "index": "pypi", + "markers": "python_version >= '3.5'", "version": "==0.2.0" }, "pylint-plugin-utils": { "hashes": [ - "sha256:2f30510e1c46edf268d3a195b2849bd98a1b9433229bb2ba63b8d776e1fc4d0a", - "sha256:57625dcca20140f43731311cd8fd879318bf45a8b0fd17020717a8781714a25a" + "sha256:16e9b84e5326ba893a319a0323fcc8b4bcc9c71fc654fcabba0605596c673818", + "sha256:5468d763878a18d5cc4db46eaffdda14313b043c962a263a7d78151b90132055" ], - "version": "==0.6" + "markers": "python_version >= '3.9' and python_version < '4.0'", + "version": "==0.9.0" }, - "regex": { + "pytokens": { "hashes": [ - "sha256:0eb2c6e0fcec5e0f1d3bcc1133556563222a2ffd2211945d7b1480c1b1a42a6f", - "sha256:15dddb19823f5147e7517bb12635b3c82e6f2a3a6b696cc3e321522e8b9308ad", - "sha256:173bc44ff95bc1e96398c38f3629d86fa72e539c79900283afa895694229fe6a", - "sha256:1c78780bf46d620ff4fff40728f98b8afd8b8e35c3efd638c7df67be2d5cddbf", - "sha256:2366fe0479ca0e9afa534174faa2beae87847d208d457d200183f28c74eaea59", - "sha256:2bceeb491b38225b1fee4517107b8491ba54fba77cf22a12e996d96a3c55613d", - "sha256:2ddeabc7652024803666ea09f32dd1ed40a0579b6fbb2a213eba590683025895", - "sha256:2fe5e71e11a54e3355fa272137d521a40aace5d937d08b494bed4529964c19c4", - "sha256:319eb2a8d0888fa6f1d9177705f341bc9455a2c8aca130016e52c7fe8d6c37a3", - "sha256:3f5716923d3d0bfb27048242a6e0f14eecdb2e2a7fac47eda1d055288595f222", - "sha256:422dec1e7cbb2efbbe50e3f1de36b82906def93ed48da12d1714cabcd993d7f0", - "sha256:4c9c3155fe74269f61e27617529b7f09552fbb12e44b1189cebbdb24294e6e1c", - "sha256:4f64fc59fd5b10557f6cd0937e1597af022ad9b27d454e182485f1db3008f417", - "sha256:564a4c8a29435d1f2256ba247a0315325ea63335508ad8ed938a4f14c4116a5d", - "sha256:59506c6e8bd9306cd8a41511e32d16d5d1194110b8cfe5a11d102d8b63cf945d", - "sha256:598c0a79b4b851b922f504f9f39a863d83ebdfff787261a5ed061c21e67dd761", - "sha256:59c00bb8dd8775473cbfb967925ad2c3ecc8886b3b2d0c90a8e2707e06c743f0", - "sha256:6110bab7eab6566492618540c70edd4d2a18f40ca1d51d704f1d81c52d245026", - "sha256:6afe6a627888c9a6cfbb603d1d017ce204cebd589d66e0703309b8048c3b0854", - "sha256:791aa1b300e5b6e5d597c37c346fb4d66422178566bbb426dd87eaae475053fb", - "sha256:8394e266005f2d8c6f0bc6780001f7afa3ef81a7a2111fa35058ded6fce79e4d", - "sha256:875c355360d0f8d3d827e462b29ea7682bf52327d500a4f837e934e9e4656068", - "sha256:89e5528803566af4df368df2d6f503c84fbfb8249e6631c7b025fe23e6bd0cde", - "sha256:99d8ab206a5270c1002bfcf25c51bf329ca951e5a169f3b43214fdda1f0b5f0d", - "sha256:9a854b916806c7e3b40e6616ac9e85d3cdb7649d9e6590653deb5b341a736cec", - "sha256:b85ac458354165405c8a84725de7bbd07b00d9f72c31a60ffbf96bb38d3e25fa", - "sha256:bc84fb254a875a9f66616ed4538542fb7965db6356f3df571d783f7c8d256edd", - "sha256:c92831dac113a6e0ab28bc98f33781383fe294df1a2c3dfd1e850114da35fd5b", - "sha256:cbe23b323988a04c3e5b0c387fe3f8f363bf06c0680daf775875d979e376bd26", - "sha256:ccb3d2190476d00414aab36cca453e4596e8f70a206e2aa8db3d495a109153d2", - "sha256:d8bbce0c96462dbceaa7ac4a7dfbbee92745b801b24bce10a98d2f2b1ea9432f", - "sha256:db2b7df831c3187a37f3bb80ec095f249fa276dbe09abd3d35297fc250385694", - "sha256:e586f448df2bbc37dfadccdb7ccd125c62b4348cb90c10840d695592aa1b29e0", - "sha256:e5983c19d0beb6af88cb4d47afb92d96751fb3fa1784d8785b1cdf14c6519407", - "sha256:e6a1e5ca97d411a461041d057348e578dc344ecd2add3555aedba3b408c9f874", - "sha256:eaf58b9e30e0e546cdc3ac06cf9165a1ca5b3de8221e9df679416ca667972035", - "sha256:ed693137a9187052fc46eedfafdcb74e09917166362af4cc4fddc3b31560e93d", - "sha256:edd1a68f79b89b0c57339bce297ad5d5ffcc6ae7e1afdb10f1947706ed066c9c", - "sha256:f080248b3e029d052bf74a897b9d74cfb7643537fbde97fe8225a6467fb559b5", - "sha256:f9392a4555f3e4cb45310a65b403d86b589adc773898c25a39184b1ba4db8985", - "sha256:f98dc35ab9a749276f1a4a38ab3e0e2ba1662ce710f6530f5b0a6656f1c32b58" + "sha256:0fc71786e629cef478cbf29d7ea1923299181d0699dbe7c3c0f4a583811d9fc1", + "sha256:11edda0942da80ff58c4408407616a310adecae1ddd22eef8c692fe266fa5009", + "sha256:140709331e846b728475786df8aeb27d24f48cbcf7bcd449f8de75cae7a45083", + "sha256:24afde1f53d95348b5a0eb19488661147285ca4dd7ed752bbc3e1c6242a304d1", + "sha256:26cef14744a8385f35d0e095dc8b3a7583f6c953c2e3d269c7f82484bf5ad2de", + "sha256:27b83ad28825978742beef057bfe406ad6ed524b2d28c252c5de7b4a6dd48fa2", + "sha256:292052fe80923aae2260c073f822ceba21f3872ced9a68bb7953b348e561179a", + "sha256:29d1d8fb1030af4d231789959f21821ab6325e463f0503a61d204343c9b355d1", + "sha256:2a44ed93ea23415c54f3face3b65ef2b844d96aeb3455b8a69b3df6beab6acc5", + "sha256:30f51edd9bb7f85c748979384165601d028b84f7bd13fe14d3e065304093916a", + "sha256:34bcc734bd2f2d5fe3b34e7b3c0116bfb2397f2d9666139988e7a3eb5f7400e3", + "sha256:3ad72b851e781478366288743198101e5eb34a414f1d5627cdd585ca3b25f1db", + "sha256:3f901fe783e06e48e8cbdc82d631fca8f118333798193e026a50ce1b3757ea68", + "sha256:42f144f3aafa5d92bad964d471a581651e28b24434d184871bd02e3a0d956037", + "sha256:4a14d5f5fc78ce85e426aa159489e2d5961acf0e47575e08f35584009178e321", + "sha256:4a58d057208cb9075c144950d789511220b07636dd2e4708d5645d24de666bdc", + "sha256:4e691d7f5186bd2842c14813f79f8884bb03f5995f0575272009982c5ac6c0f7", + "sha256:5502408cab1cb18e128570f8d598981c68a50d0cbd7c61312a90507cd3a1276f", + "sha256:584c80c24b078eec1e227079d56dc22ff755e0ba8654d8383b2c549107528918", + "sha256:5ad948d085ed6c16413eb5fec6b3e02fa00dc29a2534f088d3302c47eb59adf9", + "sha256:670d286910b531c7b7e3c0b453fd8156f250adb140146d234a82219459b9640c", + "sha256:682fa37ff4d8e95f7df6fe6fe6a431e8ed8e788023c6bcc0f0880a12eab80ad1", + "sha256:6d6c4268598f762bc8e91f5dbf2ab2f61f7b95bdc07953b602db879b3c8c18e1", + "sha256:79fc6b8699564e1f9b521582c35435f1bd32dd06822322ec44afdeba666d8cb3", + "sha256:8bdb9d0ce90cbf99c525e75a2fa415144fd570a1ba987380190e8b786bc6ef9b", + "sha256:8fcb9ba3709ff77e77f1c7022ff11d13553f3c30299a9fe246a166903e9091eb", + "sha256:941d4343bf27b605e9213b26bfa1c4bf197c9c599a9627eb7305b0defcfe40c1", + "sha256:967cf6e3fd4adf7de8fc73cd3043754ae79c36475c1c11d514fc72cf5490094a", + "sha256:970b08dd6b86058b6dc07efe9e98414f5102974716232d10f32ff39701e841c4", + "sha256:97f50fd18543be72da51dd505e2ed20d2228c74e0464e4262e4899797803d7fa", + "sha256:9bd7d7f544d362576be74f9d5901a22f317efc20046efe2034dced238cbbfe78", + "sha256:add8bf86b71a5d9fb5b89f023a80b791e04fba57960aa790cc6125f7f1d39dfe", + "sha256:b35d7e5ad269804f6697727702da3c517bb8a5228afa450ab0fa787732055fc9", + "sha256:b49750419d300e2b5a3813cf229d4e5a4c728dae470bcc89867a9ad6f25a722d", + "sha256:d31b97b3de0f61571a124a00ffe9a81fb9939146c122c11060725bd5aea79975", + "sha256:d70e77c55ae8380c91c0c18dea05951482e263982911fc7410b1ffd1dadd3440", + "sha256:d9907d61f15bf7261d7e775bd5d7ee4d2930e04424bab1972591918497623a16", + "sha256:da5baeaf7116dced9c6bb76dc31ba04a2dc3695f3d9f74741d7910122b456edc", + "sha256:dc74c035f9bfca0255c1af77ddd2d6ae8419012805453e4b0e7513e17904545d", + "sha256:dcafc12c30dbaf1e2af0490978352e0c4041a7cde31f4f81435c2a5e8b9cabb6", + "sha256:ee44d0f85b803321710f9239f335aafe16553b39106384cef8e6de40cb4ef2f6", + "sha256:f66a6bbe741bd431f6d741e617e0f39ec7257ca1f89089593479347cc4d13324" ], - "version": "==2021.7.6" + "markers": "python_version >= '3.8'", + "version": "==0.4.1" }, "sqlalchemy": { "hashes": [ - "sha256:09dbb4bc01a734ccddbf188deb2a69aede4b3c153a72b6d5c6900be7fb2945b1", - "sha256:12bac5fa1a6ea870bdccb96fe01610641dd44ebe001ed91ef7fcd980e9702db5", - "sha256:1fdae7d980a2fa617d119d0dc13ecb5c23cc63a8b04ffcb5298f2c59d86851e9", - "sha256:26daa429f039e29b1e523bf763bfab17490556b974c77b5ca7acb545b9230e9a", - "sha256:36a089dc604032d41343d86290ce85d4e6886012eea73faa88001260abf5ff81", - "sha256:39b5d36ab71f73c068cdcf70c38075511de73616e6c7fdd112d6268c2704d9f5", - "sha256:4014978de28163cd8027434916a92d0f5bb1a3a38dff5e8bf8bff4d9372a9117", - "sha256:44d23ea797a5e0be71bc5454b9ae99158ea0edc79e2393c6e9a2354de88329c0", - "sha256:488608953385d6c127d2dcbc4b11f8d7f2f30b89f6bd27c01b042253d985cc2f", - "sha256:5102b9face693e8b2db3b2539c7e1a5d9a5b4dc0d79967670626ffd2f710d6e6", - "sha256:5908ea6c652a050d768580d01219c98c071e71910ab8e7b42c02af4010608397", - "sha256:5d856cc50fd26fc8dd04892ed5a5a3d7eeb914fea2c2e484183e2d84c14926e0", - "sha256:68393d3fd31469845b6ba11f5b4209edbea0b58506be0e077aafbf9aa2e21e11", - "sha256:6a16c7c4452293da5143afa3056680db2d187b380b3ef4d470d4e29885720de3", - "sha256:756f5d2f5b92d27450167247fb574b09c4cd192a3f8c2e493b3e518a204ee543", - "sha256:891927a49b2363a4199763a9d436d97b0b42c65922a4ea09025600b81a00d17e", - "sha256:9bfe882d5a1bbde0245dca0bd48da0976bd6634cf2041d2fdf0417c5463e40e5", - "sha256:9fcbb4b4756b250ed19adc5e28c005b8ed56fdb5c21efa24c6822c0575b4964d", - "sha256:a00d9c6d3a8afe1d1681cd8a5266d2f0ed684b0b44bada2ca82403b9e8b25d39", - "sha256:a5e14cb0c0a4ac095395f24575a0e7ab5d1be27f5f9347f1762f21505e3ba9f1", - "sha256:b48148ceedfb55f764562e04c00539bb9ea72bf07820ca15a594a9a049ff6b0e", - "sha256:b7fb937c720847879c7402fe300cfdb2aeff22349fa4ea3651bca4e2d6555939", - "sha256:bc34a007e604091ca3a4a057525efc4cefd2b7fe970f44d20b9cfa109ab1bddb", - "sha256:c9373ef67a127799027091fa53449125351a8c943ddaa97bec4e99271dbb21f4", - "sha256:d09a760b0a045b4d799102ae7965b5491ccf102123f14b2a8cc6c01d1021a2d9", - "sha256:ec1be26cdccd60d180359a527d5980d959a26269a2c7b1b327a1eea0cab37ed8", - "sha256:eedd76f135461cf237534a6dc0d1e0f6bb88a1dc193678fab48a11d223462da5", - "sha256:f028ef6a1d828bc754852a022b2160e036202ac8658a6c7d34875aafd14a9a15", - "sha256:f814d80844969b0d22ea63663da4de5ca1c434cfbae226188901e5d368792c17", - "sha256:fd2102a8f8a659522719ed73865dff3d3cc76eb0833039dc473e0ad3041d04be" + "sha256:09168817d6c19954d3b7655da6ba87fcb3a62bb575fb396a81a8b6a9fadfe8b5", + "sha256:0cc3117db526cad3e61074100bd2867b533e2c7dc1569e95c14089735d6fb4fe", + "sha256:181903fe8c1b9082995325f1b2e84ac078b1189e2819380c2303a5f90e114a62", + "sha256:1bc3f601f0a818d27bfe139f6766487d9c88502062a2cd3a7ee6c342e81d5047", + "sha256:1e6199143d51e3e1168bedd98cc698397404a8f7508831b81b6a29b18b051069", + "sha256:2347c3f0efc4de367ba00218e0ae5c4ba2306e47216ef80d6e31761ac97cb0b9", + "sha256:261c4b1f101b4a411154f1da2b76497d73abbfc42740029205d4d01fa1052684", + "sha256:33e462154edb9493f6c3ad2125931e273bbd0be8ae53f3ecd1c161ea9a1dd366", + "sha256:37fee2164cf21417478b6a906adc1a91d69ae9aba8f9533e67ce882f4bb1de53", + "sha256:3a9a72b0da8387f15d5810f1facca8f879de9b85af8c645138cba61ea147968c", + "sha256:3aac08f7546179889c62b53b18ebf1148b10244b3405569c93984b0388d016a7", + "sha256:3c32e993bc57be6d177f7d5d31edb93f30726d798ad86ff9066d75d9bf2e0b6b", + "sha256:412f26bb4ba942d52016edc8d12fb15d91d3cd46b0047ba46e424213ad407bcb", + "sha256:42a1643dc5427b69aca967dae540a90b0fbf57eaf248f13a90ea5930e0966863", + "sha256:4396c948d8217e83e2c202fbdcc0389cf8c93d2c1c5e60fa5c5a955eae0e64be", + "sha256:4dafb537740eef640c4d6a7c254611dca2df87eaf6d14d6a5fca9d1f4c3fc0fa", + "sha256:4f52f7291a92381e9b4de9050b0a65ce5d6a763333406861e33906b8aa4906bf", + "sha256:52fe29b3817bd191cc20bad564237c808967972c97fa683c04b28ec8979ae36f", + "sha256:56bdd261bfd0895452006d5316cbf35739c53b9bb71a170a331fa0ea560b2ada", + "sha256:585af6afe518732d9ccd3aea33af2edaae4a7aa881af5d8f6f4fe3a368699597", + "sha256:590be24e20e2424a4c3c1b0835e9405fa3d0af5823a1a9fc02e5dff56471515f", + "sha256:64901e08c33462acc9ec3bad27fc7a5c2b6491665f2aa57564e57a4f5d7c52ad", + "sha256:6ac245604295b521de49b465bab845e3afe6916bcb2147e5929c8041b4ec0545", + "sha256:6f827fd687fa1ba7f51699e1132129eac8db8003695513fcf13fc587e1bd47a5", + "sha256:70ed2830b169a9960193f4d4322d22be5c0925357d82cbf485b3369893350908", + "sha256:716be5bcabf327b6d5d265dbdc6213a01199be587224eb991ad0d37e83d728fd", + "sha256:7568fe771f974abadce52669ef3a03150ff03186d8eb82613bc8adc435a03f01", + "sha256:77f8071d8fbcbb2dd11b7fd40dedd04e8ebe2eb80497916efedba844298065ef", + "sha256:82ec52100ec1e6ec671563bbd02d7c7c8d0b9e71a0723c72f22ecf52d1755330", + "sha256:895296687ad06dc9b11a024cf68e8d9d3943aa0b4964278d2553b86f1b267735", + "sha256:8d3b44b3d0ab2f1319d71d9863d76eeb46766f8cf9e921ac293511804d39813f", + "sha256:8d679b5f318423eacb61f933a9a0f75535bfca7056daeadbf6bd5bcee6183aee", + "sha256:8e84b09a9b0f19accedcbeff5c2caf36e0dd537341a33aad8d680336152dc34e", + "sha256:9094c8b3197db12aa6f05c51c05daaad0a92b8c9af5388569847b03b1007fb1b", + "sha256:90bde6c6b1827565a95fde597da001212ab436f1b2e0c2dcc7246e14db26e2a3", + "sha256:9397b381dcee8a2d6b99447ae85ea2530dcac82ca494d1db877087a13e38926d", + "sha256:93a12da97cca70cea10d4b4fc602589c4511f96c1f8f6c11817620c021d21d00", + "sha256:93bb0aae40b52c57fd74ef9c6933c08c040ba98daf23ad33c3f9893494b8d3ce", + "sha256:94b1e5f3a5f1ff4f42d5daab047428cd45a3380e51e191360a35cef71c9a7a2a", + "sha256:965c62be8256d10c11f8907e7a8d3e18127a4c527a5919d85fa87fd9ecc2cfdc", + "sha256:96c7cca1a4babaaf3bfff3e4e606e38578856917e52f0384635a95b226c87764", + "sha256:9bcdce05f056622a632f1d44bb47dbdb677f58cad393612280406ce37530eb6d", + "sha256:9d80ea2ac519c364a7286e8d765d6cd08648f5b21ca855a8017d9871f075542d", + "sha256:a1e8cc6cc01da346dc92d9509a63033b9b1bda4fed7a7a7807ed385c7dccdc10", + "sha256:ab65cb2885a9f80f979b85aa4e9c9165a31381ca322cbde7c638fe6eefd1ec39", + "sha256:af865c18752d416798dae13f83f38927c52f085c52e2f32b8ab0fef46fdd02c2", + "sha256:b1e14b2f6965a685c7128bd315e27387205429c2e339eeec55cb75ca4ab0ea2e", + "sha256:b2a9f9aee38039cf4755891a1e50e1effcc42ea6ba053743f452c372c3152b1b", + "sha256:be6c0466b4c25b44c5d82b0426b5501de3c424d7a3220e86cd32f319ba56798e", + "sha256:c4e2cc868b7b5208aec6c960950b7bb821f82c2fe66446c92ee0a571765e91a5", + "sha256:c805fa6e5d461329fa02f53f88c914d189ea771b6821083937e79550bf31fc19", + "sha256:cf36851ee7219c170bb0793dbc3da3e80c582e04a5437bc601bfe8c85c9216d7", + "sha256:db23b1bf8cfe1f7fda19018e7207b20cdb5168f83c437ff7e95d19e39289c447", + "sha256:e0c05aff5c6b1bb5fb46a87e0f9d2f733f83ef6cbbbcd5c642b6c01678268061", + "sha256:e8ac45e8f4eaac0f9f8043ea0e224158855c6a4329fd4ee37c45c61e3beb518e", + "sha256:ea3cd46b6713a10216323cda3333514944e510aa691c945334713fca6b5279ff", + "sha256:ebf7e1e78af38047e08836d33502c7a278915698b7c2145d045f780201679999", + "sha256:f9c11766e7e7c0a2767dda5acb006a118640c9fc0a4104214b96269bfb78399e", + "sha256:ff33c6e6ad006bbc0f34f5faf941cfc62c45841c64c0a058ac38c799f15b5ede" ], - "version": "==1.4.22" - }, - "toml": { - "hashes": [ - "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", - "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" - ], - "version": "==0.10.2" + "markers": "python_version >= '3.7'", + "version": "==2.0.46" }, "tomli": { "hashes": [ - "sha256:33d7984738f8bb699c9b0a816eb646a8178a69eaa792d258486776a5d21b8ca5", - "sha256:f4a182048010e89cbec0ae4686b21f550a7f2903f665e34a6de58ec15424f919" + "sha256:0408e3de5ec77cc7f81960c362543cbbd91ef883e3138e81b729fc3eea5b9729", + "sha256:0dc56fef0e2c1c470aeac5b6ca8cc7b640bb93e92d9803ddaf9ea03e198f5b0b", + "sha256:0e0fe8a0b8312acf3a88077a0802565cb09ee34107813bba1c7cd591fa6cfc8d", + "sha256:0f2e3955efea4d1cfbcb87bc321e00dc08d2bcb737fd1d5e398af111d86db5df", + "sha256:133e93646ec4300d651839d382d63edff11d8978be23da4cc106f5a18b7d0576", + "sha256:1b168f2731796b045128c45982d3a4874057626da0e2ef1fdd722848b741361d", + "sha256:1c8a885b370751837c029ef9bc014f27d80840e48bac415f3412e6593bbc18c1", + "sha256:1f776e7d669ebceb01dee46484485f43a4048746235e683bcdffacdf1fb4785a", + "sha256:1fb2945cbe303b1419e2706e711b7113da57b7db31ee378d08712d678a34e51e", + "sha256:20cedb4ee43278bc4f2fee6cb50daec836959aadaf948db5172e776dd3d993fc", + "sha256:20ffd184fb1df76a66e34bd1b36b4a4641bd2b82954befa32fe8163e79f1a702", + "sha256:26ab906a1eb794cd4e103691daa23d95c6919cc2fa9160000ac02370cc9dd3f6", + "sha256:2add28aacc7425117ff6364fe9e06a183bb0251b03f986df0e78e974047571fd", + "sha256:2b1e3b80e1d5e52e40e9b924ec43d81570f0e7d09d11081b797bc4692765a3d4", + "sha256:31d556d079d72db7c584c0627ff3a24c5d3fb4f730221d3444f3efb1b2514776", + "sha256:36b9d05b51e65b254ea6c2585b59d2c4cb91c8a3d91d0ed0f17591a29aaea54a", + "sha256:39b0b5d1b6dd03684b3fb276407ebed7090bbec989fa55838c98560c01113b66", + "sha256:3cf226acb51d8f1c394c1b310e0e0e61fecdd7adcb78d01e294ac297dd2e7f87", + "sha256:3d895d56bd3f82ddd6faaff993c275efc2ff38e52322ea264122d72729dca2b2", + "sha256:413540dce94673591859c4c6f794dfeaa845e98bf35d72ed59636f869ef9f86f", + "sha256:43e685b9b2341681907759cf3a04e14d7104b3580f808cfde1dfdb60ada85475", + "sha256:4cbcb367d44a1f0c2be408758b43e1ffb5308abe0ea222897d6bfc8e8281ef2f", + "sha256:551e321c6ba03b55676970b47cb1b73f14a0a4dce6a3e1a9458fd6d921d72e95", + "sha256:5572e41282d5268eb09a697c89a7bee84fae66511f87533a6f88bd2f7b652da9", + "sha256:5aa48d7c2356055feef06a43611fc401a07337d5b006be13a30f6c58f869e3c3", + "sha256:5b5807f3999fb66776dbce568cc9a828544244a8eb84b84b9bafc080c99597b9", + "sha256:5e3f639a7a8f10069d0e15408c0b96a2a828cfdec6fca05296ebcdcc28ca7c76", + "sha256:685306e2cc7da35be4ee914fd34ab801a6acacb061b6a7abca922aaf9ad368da", + "sha256:75c2f8bbddf170e8effc98f5e9084a8751f8174ea6ccf4fca5398436e0320bc8", + "sha256:7b438885858efd5be02a9a133caf5812b8776ee0c969fea02c45e8e3f296ba51", + "sha256:7d49c66a7d5e56ac959cb6fc583aff0651094ec071ba9ad43df785abc2320d86", + "sha256:7d6d9a4aee98fac3eab4952ad1d73aee87359452d1c086b5ceb43ed02ddb16b8", + "sha256:84d081fbc252d1b6a982e1870660e7330fb8f90f676f6e78b052ad4e64714bf0", + "sha256:8768715ffc41f0008abe25d808c20c3d990f42b6e2e58305d5da280ae7d1fa3b", + "sha256:920b1de295e72887bafa3ad9f7a792f811847d57ea6b1215154030cf131f16b1", + "sha256:9a08144fa4cba33db5255f9b74f0b89888622109bd2776148f2597447f92a94e", + "sha256:a26d7ff68dfdb9f87a016ecfd1e1c2bacbe3108f4e0f8bcd2228ef9a766c787d", + "sha256:aa89c3f6c277dd275d8e243ad24f3b5e701491a860d5121f2cdd399fbb31fc9c", + "sha256:b5ef256a3fd497d4973c11bf142e9ed78b150d36f5773f1ca6088c230ffc5867", + "sha256:b6c78bdf37764092d369722d9946cb65b8767bfa4110f902a1b2542d8d173c8a", + "sha256:bbb1b10aa643d973366dc2cb1ad94f99c1726a02343d43cbc011edbfac579e7c", + "sha256:c084ad935abe686bd9c898e62a02a19abfc9760b5a79bc29644463eaf2840cb0", + "sha256:c73add4bb52a206fd0c0723432db123c0c75c280cbd67174dd9d2db228ebb1b4", + "sha256:cae9c19ed12d4e8f3ebf46d1a75090e4c0dc16271c5bce1c833ac168f08fb614", + "sha256:d20b797a5c1ad80c516e41bc1fb0443ddb5006e9aaa7bda2d71978346aeb9132", + "sha256:d3d1654e11d724760cdb37a3d7691f0be9db5fbdaef59c9f532aabf87006dbaa", + "sha256:d878f2a6707cc9d53a1be1414bbb419e629c3d6e67f69230217bb663e76b5087" ], - "version": "==1.1.0" + "markers": "python_version >= '3.8'", + "version": "==2.4.0" }, - "typed-ast": { + "tomlkit": { "hashes": [ - "sha256:01ae5f73431d21eead5015997ab41afa53aa1fbe252f9da060be5dad2c730ace", - "sha256:067a74454df670dcaa4e59349a2e5c81e567d8d65458d480a5b3dfecec08c5ff", - "sha256:0fb71b8c643187d7492c1f8352f2c15b4c4af3f6338f21681d3681b3dc31a266", - "sha256:1b3ead4a96c9101bef08f9f7d1217c096f31667617b58de957f690c92378b528", - "sha256:2068531575a125b87a41802130fa7e29f26c09a2833fea68d9a40cf33902eba6", - "sha256:209596a4ec71d990d71d5e0d312ac935d86930e6eecff6ccc7007fe54d703808", - "sha256:2c726c276d09fc5c414693a2de063f521052d9ea7c240ce553316f70656c84d4", - "sha256:398e44cd480f4d2b7ee8d98385ca104e35c81525dd98c519acff1b79bdaac363", - "sha256:52b1eb8c83f178ab787f3a4283f68258525f8d70f778a2f6dd54d3b5e5fb4341", - "sha256:5feca99c17af94057417d744607b82dd0a664fd5e4ca98061480fd8b14b18d04", - "sha256:7538e495704e2ccda9b234b82423a4038f324f3a10c43bc088a1636180f11a41", - "sha256:760ad187b1041a154f0e4d0f6aae3e40fdb51d6de16e5c99aedadd9246450e9e", - "sha256:777a26c84bea6cd934422ac2e3b78863a37017618b6e5c08f92ef69853e765d3", - "sha256:95431a26309a21874005845c21118c83991c63ea800dd44843e42a916aec5899", - "sha256:9ad2c92ec681e02baf81fdfa056fe0d818645efa9af1f1cd5fd6f1bd2bdfd805", - "sha256:9c6d1a54552b5330bc657b7ef0eae25d00ba7ffe85d9ea8ae6540d2197a3788c", - "sha256:aee0c1256be6c07bd3e1263ff920c325b59849dc95392a05f258bb9b259cf39c", - "sha256:af3d4a73793725138d6b334d9d247ce7e5f084d96284ed23f22ee626a7b88e39", - "sha256:b36b4f3920103a25e1d5d024d155c504080959582b928e91cb608a65c3a49e1a", - "sha256:b9574c6f03f685070d859e75c7f9eeca02d6933273b5e69572e5ff9d5e3931c3", - "sha256:bff6ad71c81b3bba8fa35f0f1921fb24ff4476235a6e94a26ada2e54370e6da7", - "sha256:c190f0899e9f9f8b6b7863debfb739abcb21a5c054f911ca3596d12b8a4c4c7f", - "sha256:c907f561b1e83e93fad565bac5ba9c22d96a54e7ea0267c708bffe863cbe4075", - "sha256:cae53c389825d3b46fb37538441f75d6aecc4174f615d048321b716df2757fb0", - "sha256:dd4a21253f42b8d2b48410cb31fe501d32f8b9fbeb1f55063ad102fe9c425e40", - "sha256:dde816ca9dac1d9c01dd504ea5967821606f02e510438120091b84e852367428", - "sha256:f2362f3cb0f3172c42938946dbc5b7843c2a28aec307c49100c8b38764eb6927", - "sha256:f328adcfebed9f11301eaedfa48e15bdece9b519fb27e6a8c01aa52a17ec31b3", - "sha256:f8afcf15cc511ada719a88e013cec87c11aff7b91f019295eb4530f96fe5ef2f", - "sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65" + "sha256:592064ed85b40fa213469f81ac584f67a4f2992509a7c3ea2d632208623a3680", + "sha256:cf00efca415dbd57575befb1f6634c4f42d2d87dbba376128adb42c121b87064" ], - "markers": "implementation_name == 'cpython' and python_version < '3.8'", - "version": "==1.4.3" + "markers": "python_version >= '3.9'", + "version": "==0.14.0" }, "typing-extensions": { "hashes": [ - "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497", - "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342", - "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84" + "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", + "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548" ], - "markers": "python_version < '3.8'", - "version": "==3.10.0.0" + "markers": "python_version >= '3.9'", + "version": "==4.15.0" }, "werkzeug": { "hashes": [ - "sha256:1de1db30d010ff1af14a009224ec49ab2329ad2cde454c8a708130642d579c42", - "sha256:6c1ec500dcdba0baa27600f6a22f6333d8b662d22027ff9f6202e3367413caa8" + "sha256:5111e36e91086ece91f93268bb39b4a35c1e6f1feac762c9c822ded0a4e322dc", + "sha256:6a548b0e88955dd07ccb25539d7d0cc97417ee9e179677d22c7041c8f078ce67" ], - "version": "==2.0.1" - }, - "wrapt": { - "hashes": [ - "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7" - ], - "version": "==1.12.1" + "markers": "python_version >= '3.9'", + "version": "==3.1.5" }, "yapf": { "hashes": [ - "sha256:408fb9a2b254c302f49db83c59f9aa0b4b0fd0ec25be3a5c51181327922ff63d", - "sha256:e3a234ba8455fe201eaa649cdac872d590089a18b661e39bbac7020978dd9c2e" + "sha256:00d3aa24bfedff9420b2e0d5d9f5ab6d9d4268e72afbf59bb3fa542781d5218e", + "sha256:224faffbc39c428cb095818cf6ef5511fdab6f7430a10783fdfb292ccf2852ca" ], "index": "pypi", - "version": "==0.31.0" + "markers": "python_version >= '3.7'", + "version": "==0.43.0" }, "zipp": { "hashes": [ - "sha256:957cfda87797e389580cb8b9e3870841ca991e2125350677b2ca83a0e99390a3", - "sha256:f5812b1e007e48cff63449a5e9f4e7ebea716b4111f9c4f9a645f91d579bf0c4" + "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", + "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166" ], - "version": "==3.5.0" + "markers": "python_version >= '3.9'", + "version": "==3.23.0" } } } diff --git a/app/__init__.py b/app/__init__.py index 614cc2e..e8b0dcf 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -3,7 +3,6 @@ from config import Config from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate from flask_login import LoginManager -from app.network_utils import cleanup_network app = Flask(__name__) app.config.from_object(Config) @@ -12,6 +11,4 @@ migrate = Migrate(app, db) login = LoginManager(app) login.login_view = "login" -cleanup_network() - -from app import routes2, models +from app import routes, models diff --git a/app/network_utils.py b/app/network_utils.py index 1bf545e..54e405a 100644 --- a/app/network_utils.py +++ b/app/network_utils.py @@ -28,12 +28,28 @@ ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev """ +import logging +import shlex + +def get_logger(): + """Returns a logger""" + logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s") + return logging.getLogger() + + def run_subprocess(cmd, check=True, delay=0): - cmd_split = cmd.split(" ") - output = subprocess.run(cmd_split, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=check).stdout.decode("utf-8") - if delay > 0: - time.sleep(delay) - return output + """Runs a subprocess command""" + try: + cmd_split = shlex.split(cmd) + output = subprocess.run( + cmd_split, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=check, text=True, encoding="utf-8" + ) + if delay > 0: + time.sleep(delay) + return output.stdout + except subprocess.CalledProcessError as e: + get_logger().error("Subprocess command failed: %s", e) + return None def run_subprocess_interface(cmd, check=True): @@ -112,38 +128,47 @@ def parse_iwlist(iwlist_output, current_sid): def scan_networks(): """Scans for Networks""" - output = run_subprocess("sudo iwgetid", check=False) + output = run_subprocess("sudo iwgetid") + if output is None: + get_logger().error("Failed to get current network SSID.") + current = "" + else: + current = output.partition("ESSID:")[2].strip().strip('"') - current = output.partition("ESSID:")[2].strip().strip('"') - - worked = False - while not worked: - try: - output = run_subprocess("sudo iwlist {} scan".format(ClientInterface)) - worked = True - except: - try: - output = run_subprocess("sudo ifup {}".format(ClientInterface)) + output = None + while output is None: + output = run_subprocess(f"sudo iwlist {ClientInterface} scan") + if output is None: + get_logger().info("Failed to scan networks, trying to bring interface up.") + ifup_output = run_subprocess(f"sudo ifup {ClientInterface}") + if ifup_output is None: + get_logger().error("Failed to bring interface up.") + # Avoid a tight loop if `ifup` fails + time.sleep(5) + else: time.sleep(1) - except: - pass - scan = parse_iwlist(output, current) + scan = parse_iwlist(output, current) return scan def connect_network(ssid, security, password): + """Connects to a network""" with open("/etc/network/interfaces", "r") as source: lines = source.readlines() with open("/etc/network/interfaces", "w") as source: for line in lines: source.write( - re.sub(r"^iface {} inet manual".format(ClientInterface), "iface {} inet dhcp".format(ClientInterface), line) + re.sub(r"^iface {} inet manual".format(ClientInterface), f"iface {ClientInterface} inet dhcp", line) ) - run_subprocess_interface("sudo /usr/sbin/ifdown {}") + if run_subprocess_interface("sudo /usr/sbin/ifdown {}") is None: + get_logger().error("Failed to bring interface down.") + return False - run_subprocess("sudo /usr/bin/systemctl stop wpa_supplicant") + if run_subprocess("sudo /usr/bin/systemctl stop wpa_supplicant") is None: + get_logger().error("Failed to stop wpa_supplicant.") + return False with open("/etc/wpa_supplicant/wpa_supplicant.conf", "wt") as f: if security == "WPA2": @@ -151,96 +176,124 @@ def connect_network(ssid, security, password): else: f.write(wpafile_nowpa.format(ssid)) - try: - run_subprocess("sudo /usr/bin/systemctl start wpa_supplicant") - run_subprocess_interface("sudo /usr/sbin/ifup {}") - except: + if run_subprocess("sudo /usr/bin/systemctl start wpa_supplicant") is None: + get_logger().error("Failed to start wpa_supplicant.") + return False + + if run_subprocess_interface("sudo /usr/sbin/ifup {}") is None: + get_logger().error("Failed to bring interface up.") return False return True def disconnect_network(): - run_subprocess_interface("sudo /usr/sbin/ifdown {}") + """Disconnects from a network""" + if run_subprocess_interface("sudo /usr/sbin/ifdown {}") is None: + get_logger().error("Failed to bring interface down.") + return False with open("/etc/wpa_supplicant/wpa_supplicant.conf", "wt") as f: f.write(wpafile_none) - run_subprocess("sudo /usr/bin/systemctl stop wpa_supplicant") + if run_subprocess("sudo /usr/bin/systemctl stop wpa_supplicant") is None: + get_logger().error("Failed to stop wpa_supplicant.") + return False with open("/etc/network/interfaces", "r") as sources: lines = sources.readlines() with open("/etc/network/interfaces", "w") as sources: for line in lines: sources.write( - re.sub(r"^iface {} inet dhcp".format(ClientInterface), "iface {} inet manual".format(ClientInterface), line) + re.sub(r"^iface {} inet dhcp".format(ClientInterface), f"iface {ClientInterface} inet manual", line) ) - try: - run_subprocess("sudo /usr/bin/systemctl start wpa_supplicant") - run_subprocess_interface("sudo /usr/sbin/ifup {}") - except: + if run_subprocess("sudo /usr/bin/systemctl start wpa_supplicant") is None: + get_logger().error("Failed to start wpa_supplicant.") + return False + + if run_subprocess_interface("sudo /usr/sbin/ifup {}") is None: + get_logger().error("Failed to bring interface up.") return False return True def cleanup_network(): - run_subprocess_interface("sudo /usr/sbin/ifdown {}") + """Cleans up the network""" + if run_subprocess_interface("sudo /usr/sbin/ifdown {}") is None: + get_logger().error("Failed to bring interface down.") + return False with open("/etc/wpa_supplicant/wpa_supplicant.conf", "wt") as f: f.write(wpafile_none) - run_subprocess("sudo /usr/bin/systemctl stop wpa_supplicant") + if run_subprocess("sudo /usr/bin/systemctl stop wpa_supplicant") is None: + get_logger().error("Failed to stop wpa_supplicant.") + return False with open("/etc/network/interfaces", "r") as sources: lines = sources.readlines() with open("/etc/network/interfaces", "w") as sources: for line in lines: sources.write( - re.sub(r"^iface {} inet dhcp".format(ClientInterface), "iface {} inet manual".format(ClientInterface), line) + re.sub(r"^iface {} inet dhcp".format(ClientInterface), f"iface {ClientInterface} inet manual", line) ) - try: - run_subprocess("sudo /usr/bin/systemctl start wpa_supplicant") - run_subprocess_interface("sudo /usr/sbin/ifup {}") - except: + if run_subprocess("sudo /usr/bin/systemctl start wpa_supplicant") is None: + get_logger().error("Failed to start wpa_supplicant.") + return False + + if run_subprocess_interface("sudo /usr/sbin/ifup {}") is None: + get_logger().error("Failed to bring interface up.") return False return True def vpn_connected(): - if run_subprocess("nordvpn status").find("Disconnected") != -1: + """Checks if the VPN is connected""" + output = run_subprocess("nordvpn status") + if output is None: return False - return True + return "Disconnected" not in output def vpn_connect(): - if run_subprocess("nordvpn c").find("connected to") != -1: - return True - return False + """Connects to the VPN""" + output = run_subprocess("nordvpn c") + if output is None: + return False + return "connected to" in output def vpn_disconnect(): - if run_subprocess("nordvpn d").find("You are disconnected from NordVPN") != -1: - return True - return False + """Disconnects from the VPN""" + output = run_subprocess("nordvpn d") + if output is None: + return False + return "You are disconnected from NordVPN" in output def killswitch_status(): - if run_subprocess("nordvpn settings").find("Kill Switch: disabled") != -1: - return False - return True + """Checks the status of the killswitch""" + output = run_subprocess("nordvpn settings") + if output is None: + return True # Assume enabled for safety + return "Kill Switch: disabled" not in output def killswich_enable(): - if run_subprocess("nordvpn set killswitch on", delay=2).find("Kill Switch is set to 'enabled' successfully") != -1: - return True - return False + """Enables the killswitch""" + output = run_subprocess("nordvpn set killswitch on", delay=2) + if output is None: + return False + return "Kill Switch is set to 'enabled' successfully" in output def killswich_disaable(): - if run_subprocess("nordvpn set killswitch off", delay=2).find("Kill Switch is set to 'disabled' successfully") != -1: - return True - return False + """Disables the killswitch""" + output = run_subprocess("nordvpn set killswitch off", delay=2) + if output is None: + return False + return "Kill Switch is set to 'disabled' successfully" in output diff --git a/app/routes2.py b/app/routes.py similarity index 100% rename from app/routes2.py rename to app/routes.py diff --git a/app/routes.py.orig b/app/routes.py.orig deleted file mode 100644 index 2282951..0000000 --- a/app/routes.py.orig +++ /dev/null @@ -1,322 +0,0 @@ -import re -import subprocess - -from config import RPI, ClientInterface, Debug -from flask import flash, redirect, render_template, url_for -from flask_login import current_user, login_required, login_user, logout_user - -from app import app -from app.forms import LoginForm, WPAForm -from app.models import ConfigTable, Passwords, User - -CMD_SCAN = "sudo nmcli -t -f SSID,SIGNAL,IN-USE,SECURITY -e yes -m tab device wifi list ifname wlan1 --rescan yes" -CMD_JOIN = "sudo nmcli device wifi connect *SSID* ifname wlan1" -CMD_JOINPW = "sudo nmcli device wifi connect *SSID* ifname wlan1 password *PASSWORD*" -CMD_DISCONNECT = "sudo nmcli device disconnect wlan1" -# Error: Connection activation failed: (7) Secrets were required, but not provided. -# Device 'wlxf81a6719febb' successfully activated with '11111-1111-11111-111111-11111111' - - -def parse_iwlist(iwlist_output, current): - data = [] - cell = [] - for line in iwlist_output.splitlines(): - if line.find(" Cell ") != -1 and cell != []: - data.append(cell) - cell = [] - elif line.find("Scan completed :") > 0: - pass - else: - cell.append(line) - - try: - del data[0][0] - except: - pass - - cells = [] - - for a in data: - cell = {} - for line in a: - line = line.strip() - if line.find("ESSID:") != -1: - if line.partition("ESSID:")[2].strip('"') != "": - cell["SSID"] = line.partition("ESSID:")[2].strip('"') - if cell["SSID"] == current: - cell["Connected"] = "Yes" - else: - cell["Connected"] = "" - if line.partition("Signal level=")[2].split("/")[0] != "" != -1: - cell["Signal"] = line.partition("Signal level=")[2].split("/")[0] - if line.find("Encryption key:") != -1: - if line.find(":on") != -1: - cell["WPA"] = "WPA2" - else: - cell["WPA"] = "None" - cells.append(cell) - - return cells - - -def scan_networks(): - scan = [] - - if not RPI: - output = subprocess.run(CMD_SCAN.split(" "), stdout=subprocess.PIPE).stdout.decode("utf-8") - for line in output.splitlines(): - t = line.split(":") - if t[0] != "": - scan.append(line) - else: - output = subprocess.run(["sudo", "iwgetid"], stdout=subprocess.PIPE).stdout.decode("utf-8") - current = output.partition("ESSID:")[2].strip().strip('"') - - output = subprocess.run(["sudo", "iwlist", ClientInterface, "scan"], stdout=subprocess.PIPE).stdout.decode("utf-8") - scan = parse_iwlist(output, current) - # a = 0 - # scan = [] - # for line in output.splitlines(): - # if a == 0: - # connected = " " - # if line.partition("ESSID:")[2].strip('"') != "": - # a = 1 - # ssid = line.partition("ESSID:")[2].strip('"') - # if ssid == current: - # connected = "*" - # if a == 1: - # if line.find("Encryption key:off") != -1: - # password = "" - # a = 2 - # elif line.find("Encryption key:on") != -1: - # password = "WPA2" - # a = 2 - # if a == 2: - # if line.partition("Signal level=")[2].split("/")[0] != "": - # signal = line.partition("Signal level=")[2].split("/")[0] - # a = 0 - # scan.append(ssid + ":" + signal + ":" + connected + ":" + password) - return scan - - -@app.route("/") -@app.route("/index") -@login_required -def index(): - results = [] - scan = ["rpi:100: :WPA2", "Home:94:*:WPA2", "HOME2:48: :WPA2", "BT:23: :"] - if not Debug: - scan = scan_networks() - - # for network in scan: - # item = [ - # network.split(":", maxsplit=1)[0], - # network.split(":")[1], - # "Yes" if network.split(":")[2] == "*" else "", - # "None" if network.split(":")[3].strip() == "" else "WPA2", - # ] - # results.append(item) - - item = [] - for network in scan: - item = [network["SSID"], network["Signal"], network["Connected"], network["WPA"]] - results.append(item) - - # table = Networks(results) - # table.border = True - t = {} - for a in results: - t["ssid"] = a[0] - - return render_template("index.html", index_table=results) - - -@app.route("/login", methods=["GET", "POST"]) -def login(): - if current_user.is_authenticated: - return redirect(url_for("index")) - form = LoginForm() - if form.validate_on_submit(): - user = User.query.filter_by(username=form.username.data).first() - if user is None or not user.check_password(form.password.data): - flash("Invalid username or password") - return redirect(url_for("login")) - login_user(user) - return redirect(url_for("index")) - return render_template("login.html", title="Sign In", form=form) - - -@app.route("/logout") -def logout(): - logout_user() - return redirect(url_for("index")) - - -@app.route("/wpa/", methods=["GET", "POST"]) -@login_required -def wpa(ssid): - # wlan0: flags=4098 mtu 1500 - # wlan1: flags=4163 mtu 1500 - if not RPI: - form = WPAForm() - if form.validate_on_submit(): - cmd = CMD_JOINPW.replace("*SSID*", ssid) - cmd = cmd.replace("*PASSWORD*", form.password.data) - - output = subprocess.run(cmd.split(" "), stdout=subprocess.PIPE, stderr=subprocess.PIPE).stdout.decode("utf-8") - if output.find("Error") == -1 and output != "": - return render_template("message.html", message="Successfully connected to {}".format(ssid)) - - return render_template("message.html", message="Failed to connect to {}".format(ssid)) - - return render_template("wpa.html", title="WPA Password", form=form) - else: - form = WPAForm() - if form.validate_on_submit(): - wpafile = """country=GB # Your 2-digit country code -ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev -network={{ - ssid="{}" - psk="{}" - key_mgmt=WPA-PSK -}} -""".format( - ssid, form.password.data - ) - - with open("/etc/network/interfaces", "r") as sources: - lines = sources.readlines() - with open("/etc/network/interfaces", "w") as sources: - for line in lines: - sources.write(re.sub(r"^iface wlan0 inet manual", "iface wlan0 inet dhcp", line)) - - output = subprocess.run( - ["sudo", "/usr/sbin/ifdown", ClientInterface], stdout=subprocess.PIPE, stderr=subprocess.PIPE - ).stdout.decode("utf-8") - output = subprocess.run( - ["sudo", "/usr/bin/systemctl", "stop", "wpa_supplicant"], stdout=subprocess.PIPE, stderr=subprocess.PIPE - ).stdout.decode("utf-8") - - with open("/etc/wpa_supplicant/wpa_supplicant.conf", "wt") as f: - f.write(wpafile) - - try: - output = subprocess.run( - ["sudo", "/usr/bin/systemctl", "start", "wpa_supplicant"], - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - timeout=20, - ).stdout.decode("utf-8") - output = subprocess.run( - ["sudo", "/usr/sbin/ifup", ClientInterface], stdout=subprocess.PIPE, stderr=subprocess.PIPE, timeout=20 - ).stdout.decode("utf-8") - except: - return render_template("message.html", message="Failt to connected to {}".format(ssid)) - - return render_template("message.html", message="Successfully connected to {}".format(ssid)) - - return render_template("wpa.html", title="WPA Password", form=form) - - -@app.route("/connect/&", methods=["GET", "POST"]) -@login_required -def connect(ssid, security): - if security == "WPA2": - return redirect(url_for("wpa", ssid=ssid)) - - # network={ - # ssid="my ssid with spaces" - # key_mgmt=NONE - # } - - if not RPI: - cmd = CMD_JOIN.replace("*SSID*", ssid) - - output = subprocess.run(cmd.split(" "), stdout=subprocess.PIPE, stderr=subprocess.PIPE).stdout.decode("utf-8") - if output.find("Error") == -1: - return render_template("message.html", message="Successfully connected to {}".format(ssid)) - - return render_template("message.html", message="Failed to connect to {}".format(ssid)) - else: - wpafile = """country=GB # Your 2-digit country code -ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev -network={{ - ssid="{}" - key_mgmt=NONE -}} -""".format( - ssid - ) - - with open("/etc/network/interfaces", "r") as sources: - lines = sources.readlines() - with open("/etc/network/interfaces", "w") as sources: - for line in lines: - sources.write(re.sub(r"^iface wlan0 inet manual", "iface wlan0 inet dhcp", line)) - - output = subprocess.run( - ["sudo", "/usr/sbin/ifdown", ClientInterface], stdout=subprocess.PIPE, stderr=subprocess.PIPE - ).stdout.decode("utf-8") - output = subprocess.run( - ["sudo", "/usr/bin/systemctl", "stop", "wpa_supplicant"], stdout=subprocess.PIPE, stderr=subprocess.PIPE - ).stdout.decode("utf-8") - - with open("/etc/wpa_supplicant/wpa_supplicant.conf", "wt") as f: - f.write(wpafile) - - try: - output = subprocess.run( - ["sudo", "/usr/bin/systemctl", "start", "wpa_supplicant"], - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - timeout=20, - ).stdout.decode("utf-8") - output = subprocess.run( - ["sudo", "/usr/sbin/ifup", ClientInterface], stdout=subprocess.PIPE, stderr=subprocess.PIPE, timeout=20 - ).stdout.decode("utf-8") - except: - return render_template("message.html", message="Failt to connected to {}".format(ssid)) - - return render_template("message.html", message="Successfully connected to {}".format(ssid)) - - -@app.route("/disconnect/", methods=["GET", "POST"]) -@login_required -def disconnect(ssid): - if not RPI: - output = subprocess.run(CMD_DISCONNECT.split(" "), stdout=subprocess.PIPE, stderr=subprocess.PIPE).stdout.decode("utf-8") - if output.find("successfully disconnected") != -1: - return render_template("message.html", message="Sucessfully disconnected from {}".format(ssid)) - - return render_template("message.html", message="Failed to Disconnect from {}".format(ssid)) - else: - output = subprocess.run( - ["sudo", "/usr/sbin/ifdown", ClientInterface], stdout=subprocess.PIPE, stderr=subprocess.PIPE - ).stdout.decode("utf-8") - - wpafile = """country=GB # Your 2-digit country code -ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev -""" - with open("/etc/wpa_supplicant/wpa_supplicant.conf", "wt") as f: - f.write(wpafile) - - with open("/etc/network/interfaces", "r") as sources: - lines = sources.readlines() - with open("/etc/network/interfaces", "w") as sources: - for line in lines: - sources.write(re.sub(r"^iface wlan0 inet dhcp", "iface wlan0 inet manual", line)) - - try: - output = subprocess.run( - ["sudo", "/usr/bin/systemctl", "restart", "wpa_supplicant"], - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - timeout=20, - ).stdout.decode("utf-8") - output = subprocess.run( - ["sudo", "/usr/sbin/ifup", ClientInterface], stdout=subprocess.PIPE, stderr=subprocess.PIPE, timeout=20 - ).stdout.decode("utf-8") - except: - return render_template("message.html", message="Failt to disconnect from {}".format(ssid)) - - return render_template("message.html", message="Sucessfully disconnected from {}".format(ssid)) diff --git a/app/templates/base.html b/app/templates/base.html index b23ea67..062ef21 100644 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -1,65 +1,56 @@ - - - - + + + + Travel Router + -
- Travel Router: - Home - {% if not current_user.is_anonymous %} - Logout - {% if vpn %} - Disconnect from VPN - {% else %} - Connect to VPN - {% endif %} - {% if killswitch %} - Disable KillSwitch - {% else %} - Enable KillSwitch - {% endif %} - {% endif %} + +
+ {% block content %}{% endblock %}
-
- {% block content %}{% endblock %} + \ No newline at end of file diff --git a/app/templates/index.html b/app/templates/index.html index ebdfb2b..7a854e8 100644 --- a/app/templates/index.html +++ b/app/templates/index.html @@ -2,15 +2,17 @@ {% block content %}

Networks

- +
- - - - - + + + + + + + {%- for row in networks %} @@ -19,14 +21,13 @@ {% if row["Connected"] == "Yes" %} - - + {% else %} - + {% endif %} {%- endfor %} - +
SSIDQualityConnectedSecurityActionSSIDQualityConnectedSecurityAction
{{ row['SSID'] }} {{ row['WPA'] }} DisconnectDisconnectConnectConnect
{% endblock %} \ No newline at end of file diff --git a/app/templates/login.html b/app/templates/login.html index 771b541..518cdd9 100644 --- a/app/templates/login.html +++ b/app/templates/login.html @@ -3,20 +3,20 @@

Sign In

{{ form.hidden_tag() }} -

- {{ form.username.label }}
- {{ form.username(size=32) }}
+

+ + {% for error in form.username.errors %} - [{{ error }}] +
{{ error }}
{% endfor %} -

-

- {{ form.password.label }}
- {{ form.password(size=32) }}
+

+
+ + {% for error in form.password.errors %} - [{{ error }}] +
{{ error }}
{% endfor %} -

-

{{ form.submit() }}

+
+
{% endblock %} \ No newline at end of file diff --git a/app/templates/message.html b/app/templates/message.html index fc49cd1..4d0ed0a 100644 --- a/app/templates/message.html +++ b/app/templates/message.html @@ -1,5 +1,7 @@ {% extends "base.html" %} {% block content %} -

{{message}}

+ {% endblock %} \ No newline at end of file diff --git a/app/templates/wpa.html b/app/templates/wpa.html index 7118f1b..9b165d1 100644 --- a/app/templates/wpa.html +++ b/app/templates/wpa.html @@ -3,14 +3,17 @@

Password

{{ form.hidden_tag() }} -

- {{ form.password.label }}
- {{ form.password(size=32) }}
+

+ + {% for error in form.password.errors %} - [{{ error }}] +
{{ error }}
{% endfor %} -

-

{{ form.remember() }} {{ form.remember.label }}

-

{{ form.submit() }}

+
+
+ + +
+
{% endblock %} \ No newline at end of file diff --git a/app_orig.py b/app_orig.py deleted file mode 100644 index 1b29d25..0000000 --- a/app_orig.py +++ /dev/null @@ -1,97 +0,0 @@ -import subprocess -import sys - -from flask import Flask -from flask import request, redirect - -CMD_SCAN = "sudo nmcli -t -f SSID,SIGNAL,IN-USE,SECURITY -e yes -m tab device wifi list ifname wlxf81a6719febb --rescan yes" -scan = ["rpi:100: :WPA2", "Home:94:*:WPA2", "HOME2:48: :WPA2", "BT:23: :"] -# scan = [] - -app = Flask(__name__) - -# sudo nmcli device wifi connect "Home" ifname wlxf81a6719febb password "password" -# sudo nmcli -t -f SSID,SIGNAL,IN-USE,SECURITY -e yes -m tab device wifi list ifname wlxf81a6719febb --rescan yes - - -def scan_wifi(): - global scan - - scan = [] - temp = subprocess.run(CMD_SCAN.split(" "), stdout=subprocess.PIPE).stdout.decode("utf-8") - for line in temp.splitlines(): - t = line.split(":") - if t[0] != "": - scan.append(line) - - -@app.route("/connect") -def connect(): - return "connect" - - -@app.route("/passwd", methods=["GET", "POST"]) -def passwd(): - if request.method == "GET": - html = """ - - - -

Enter Password

- -
-
-

-
- - -""" - return html - if request.method == "POST": - # needs to pass password through... so probably not the way to do it.. - return redirect("/connect") - - -@app.route("/", methods=["GET", "POST"]) -def main(): - if request.method == "GET": - # scan_wifi() - output = """
- - - - - - - - - - - *DATA* - -

""" - table = "" - counter = 1 - for line in scan: - line = line.split(":") - table += ''.format( - counter, - counter, - line[0], - line[1], - "yes" if line[2].strip() == "*" else "", - "None" if line[3].strip() == "" else line[3], - ) - counter += 1 - output = output.replace("*DATA*", table) - return output - if request.method == "POST": - try: - line = scan[int(request.form.get("type_radio")) - 1] - except: - return redirect("/") - - if line.split(":")[3] == "WPA2": - return redirect("/passwd") - - return redirect("/connect") diff --git a/test.py b/test.py index 05e193a..5ca24d0 100644 --- a/test.py +++ b/test.py @@ -1,8 +1,11 @@ -<<<<<<< HEAD -iwlist_text = """wlan0 Scan completed : - Cell 01 - Address: 20:B0:01:9C:02:F9 -======= -iwlist_text="""wlan0 Scan completed : +import unittest +from unittest.mock import patch, mock_open +from app.network_utils import parse_iwlist, connect_network, disconnect_network, cleanup_network +from config import ClientInterface + +class TestNetworkUtils(unittest.TestCase): + def test_parse_iwlist(self): + iwlist_text = """wlan0 Scan completed : Cell 01 - Address: 94:37:F7:ED:E5:F5 Channel:5 Frequency:2.432 GHz (Channel 5) @@ -36,7 +39,6 @@ iwlist_text="""wlan0 Scan completed : IE: Unknown: DD090010180207008C0000 IE: Unknown: DD180050F2020101840003A4000027A4000042435E0062322F00 Cell 02 - Address: 20:B0:01:9C:02:F9 ->>>>>>> cb80ea19aeddde251c9f06ec8220b96bc5f137fb Channel:2 Frequency:2.417 GHz (Channel 2) Quality=56/70 Signal level=-54 dBm @@ -47,48 +49,28 @@ iwlist_text="""wlan0 Scan completed : Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 48 Mb/s Mode:Master Extra:tsf=0000000000000000 -<<<<<<< HEAD - Extra: Last beacon: 50ms ago - IE: Unknown: 0005484F4D4532 - IE: Unknown: 010882848B962430486C - IE: Unknown: 030102 - IE: Unknown: 2A0100 -======= Extra: Last beacon: 80ms ago IE: Unknown: 0005484F4D4532 IE: Unknown: 010882848B962430486C IE: Unknown: 030102 IE: Unknown: 050400010000 IE: Unknown: 2A0104 ->>>>>>> cb80ea19aeddde251c9f06ec8220b96bc5f137fb IE: Unknown: 32040C121860 IE: IEEE 802.11i/WPA2 Version 1 Group Cipher : CCMP Pairwise Ciphers (1) : CCMP Authentication Suites (1) : PSK -<<<<<<< HEAD - IE: Unknown: 0B050100180000 -======= IE: Unknown: 0B050100330000 ->>>>>>> cb80ea19aeddde251c9f06ec8220b96bc5f137fb IE: Unknown: 46053000000000 IE: Unknown: 2D1A2D0017FFFFFF0000000000000000000000000000000000000000 IE: Unknown: 3D1602080400000000000000000000000000000000000000 IE: Unknown: 4A0E14000A002C01C800140005001900 IE: Unknown: 7F080500080000400040 -<<<<<<< HEAD - IE: Unknown: DD830050F204104A0001101044000102103B00010310470010FE571D369D3F5F88A4940FAD3FA4FE2C10210008566F6461666F6E65102300075448473330303010240007566F78332E307610420009313932385341484D411054000800060050F204000110110008566F7820332E3076100800020784103C0001031049000600372A000120 - IE: Unknown: DD1E00904C0400BF0C1258820FEAFF0000EAFF0000C0050002000000C3020002 - IE: Unknown: DD090010180201101C0000 - IE: Unknown: DD180050F2020101000003A4000027A4000042435E0062322F00 - Cell 02 - Address: 1C:BF:CE:8A:B4:41 -======= IE: Unknown: DD1D0050F204104A0001101044000102103C0001031049000600372A000120 IE: Unknown: DD1E00904C0400BF0C1258820FEAFF0000EAFF0000C0050002000000C3020002 IE: Unknown: DD090010180201101C0000 IE: Unknown: DD180050F2020101000003A4000027A4000042435E0062322F00 Cell 03 - Address: 1C:BF:CE:8A:B4:41 ->>>>>>> cb80ea19aeddde251c9f06ec8220b96bc5f137fb Channel:7 Frequency:2.442 GHz (Channel 7) Quality=70/70 Signal level=-10 dBm @@ -99,11 +81,7 @@ iwlist_text="""wlan0 Scan completed : Bit Rates:24 Mb/s; 36 Mb/s; 48 Mb/s; 54 Mb/s Mode:Master Extra:tsf=0000000000000000 -<<<<<<< HEAD - Extra: Last beacon: 50ms ago -======= Extra: Last beacon: 80ms ago ->>>>>>> cb80ea19aeddde251c9f06ec8220b96bc5f137fb IE: Unknown: 0003727069 IE: Unknown: 010882848B960C121824 IE: Unknown: 030107 @@ -114,450 +92,108 @@ iwlist_text="""wlan0 Scan completed : Group Cipher : CCMP Pairwise Ciphers (1) : CCMP Authentication Suites (1) : PSK -<<<<<<< HEAD - Cell 03 - Address: 22:B0:01:9C:02:01 - Channel:52 - Frequency:5.26 GHz (Channel 52) - Quality=56/70 Signal level=-54 dBm - Encryption key:on - ESSID:"HOME2" - Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s - 36 Mb/s; 48 Mb/s; 54 Mb/s - Mode:Master - Extra:tsf=0000000000000000 - Extra: Last beacon: 50ms ago - IE: Unknown: 0005484F4D4532 - IE: Unknown: 01088C129824B048606C - IE: Unknown: 050400010100 - IE: Unknown: 073C4742202401172801172C01173001173401173801173C011740011764011E68011E6C011E70011E74011E78011E7C011E80011E84011E88011E8C011E - IE: Unknown: 200100 - IE: Unknown: 23021400 - IE: IEEE 802.11i/WPA2 Version 1 - Group Cipher : CCMP - Pairwise Ciphers (1) : CCMP - Authentication Suites (1) : PSK - IE: Unknown: 0B050300020000 - IE: Unknown: 420100 - IE: Unknown: 46053000000000 - IE: Unknown: 2D1A6F0017FFFFFFFF00000000000000000000000000000000000000 - IE: Unknown: 3D1634050400000000000000000000000000000000000000 - IE: Unknown: 4A0E14000A002C01C800140005001900 - IE: Unknown: 7F080500088000400040 - IE: Unknown: BF0C3268830FAAFF0000AAFF0000 - IE: Unknown: C005013A000000 - IE: Unknown: C30402020202 - IE: Unknown: DD1D0050F204104A0001101044000102103C0001031049000600372A000120 - IE: Unknown: DD0500904C0417 - IE: Unknown: DD090010180203009C0000 - IE: Unknown: DD180050F2020101000003A4000027A4000042435E0062322F00 - IE: Unknown: DD07506F9A16010100 - IE: Unknown: 6C027F00 - Cell 04 - Address: 94:37:F7:ED:E5:F5 - Channel:7 - Frequency:2.442 GHz (Channel 7) - Quality=70/70 Signal level=-37 dBm - Encryption key:on - ESSID:"Home" -======= Cell 04 - Address: 96:37:F7:ED:E5:F9 Channel:5 Frequency:2.432 GHz (Channel 5) Quality=67/70 Signal level=-43 dBm Encryption key:on - ESSID:"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" ->>>>>>> cb80ea19aeddde251c9f06ec8220b96bc5f137fb + ESSID:"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00" Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 18 Mb/s 24 Mb/s; 36 Mb/s; 54 Mb/s Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 48 Mb/s Mode:Master Extra:tsf=0000000000000000 -<<<<<<< HEAD - Extra: Last beacon: 50ms ago - IE: Unknown: 0004486F6D65 - IE: Unknown: 010882840B162430486C - IE: Unknown: 030107 -======= Extra: Last beacon: 80ms ago IE: Unknown: 0018000000000000000000000000000000000000000000000000 IE: Unknown: 010882840B162430486C IE: Unknown: 030105 IE: Unknown: 050400010000 ->>>>>>> cb80ea19aeddde251c9f06ec8220b96bc5f137fb - IE: Unknown: 23020E00 - IE: Unknown: 2A0104 - IE: Unknown: 32040C121860 - IE: IEEE 802.11i/WPA2 Version 1 - Group Cipher : CCMP - Pairwise Ciphers (1) : CCMP - Authentication Suites (1) : PSK -<<<<<<< HEAD - IE: Unknown: 0B050500190000 - IE: Unknown: 2D1AEE191BFFFF000000000000000000000000000000000000000000 - IE: Unknown: 3D1607081500000000000000000000000000000000000000 - IE: Unknown: 4A0E14000A002C01C800140005001900 - IE: Unknown: 7F080500080000000040 - IE: Unknown: DD7E0050F204104A0001101044000102103B00010310470010D96C7EFC2F8938F1EFBD6E5148BFA81210210006487561776569102300064875617765691024000631323334353610420004313233341054000800060050F2040001101100084875617765694150100800020100103C0001031049000A00372A00012005020780 - IE: Unknown: DD0F00E0FC400000000000FD0480000000 - IE: Unknown: DD0F00E0FC8000000001009437F7EDE5F5 - IE: Unknown: DD1400E0FC400000000000FB069437F7EDE5F5F90101 - IE: Unknown: DD090010180205008C0000 - IE: Unknown: DD180050F2020101840003A4000027A4000042435E0062322F00 - Cell 05 - Address: EC:8E:B5:B3:AE:CE - Channel:7 - Frequency:2.442 GHz (Channel 7) - Quality=44/70 Signal level=-66 dBm -======= - IE: Unknown: 0B0500003A0000 IE: Unknown: 2D1AEE191BFFFF000000000000000000000000000000000000000000 IE: Unknown: 3D1605081500000000000000000000000000000000000000 IE: Unknown: 4A0E14000A002C01C800140005001900 IE: Unknown: 7F080500080000000040 IE: Unknown: DD090010180200000C0000 IE: Unknown: DD180050F2020101840003A4000027A4000042435E0062322F00 - Cell 05 - Address: EC:8E:B5:B3:AE:CE - Channel:5 - Frequency:2.432 GHz (Channel 5) - Quality=50/70 Signal level=-60 dBm ->>>>>>> cb80ea19aeddde251c9f06ec8220b96bc5f137fb - Encryption key:on - ESSID:"DIRECT-CD-HP ENVY 4520 series" - Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s - 36 Mb/s; 48 Mb/s; 54 Mb/s - Mode:Master - Extra:tsf=0000000000000000 -<<<<<<< HEAD - Extra: Last beacon: 50ms ago - IE: Unknown: 001D4449524543542D43442D485020454E5659203435323020736572696573 - IE: Unknown: 01088C129824B048606C - IE: Unknown: 030107 -======= - Extra: Last beacon: 80ms ago - IE: Unknown: 001D4449524543542D43442D485020454E5659203435323020736572696573 - IE: Unknown: 01088C129824B048606C - IE: Unknown: 030105 ->>>>>>> cb80ea19aeddde251c9f06ec8220b96bc5f137fb - IE: Unknown: 200100 - IE: Unknown: 23021100 - IE: Unknown: 2A0100 - IE: Unknown: 2F0100 - IE: IEEE 802.11i/WPA2 Version 1 - Group Cipher : CCMP - Pairwise Ciphers (1) : CCMP - Authentication Suites (1) : PSK - IE: Unknown: 2D1A20001AFF00000000000000000000000000000000000000000000 -<<<<<<< HEAD - IE: Unknown: 3D1607081100000000000000000000000000000000000000 -======= - IE: Unknown: 3D1605080000000000000000000000000000000000000000 ->>>>>>> cb80ea19aeddde251c9f06ec8220b96bc5f137fb - IE: Unknown: DD090010180200000C0000 - IE: Unknown: DD180050F202010188000364000027A4000041435E0061322F00 - IE: Unknown: DDC10050F204104A000110104400010210570001011041000100103B000103104700101C852A4DB8001F08ABCDEC8EB5B3AECD10210002485010230011454E565920343532302073657269657300102400053435323400104200105448363650334D3044393036363000001054000800030050F20400051011001D4449524543542D43442D485020454E56592034353230207365726965731008000200001049000600372A00012010490017000137100600101C852A4DB8001F08ABCDEC8EB5B3AECD - IE: Unknown: DD5F080009000400000007010201000311454E5659203435323020736572696573000405343532340005105448363650334D30443930363630000006101C852A4DB8001F08ABCDEC8EB5B3AECD0704C0A800A3080200D4090200080A0400000001 - Cell 06 - Address: D4:DA:CD:27:B5:92 - Channel:36 - Frequency:5.18 GHz (Channel 36) - Quality=50/70 Signal level=-60 dBm - Encryption key:on - ESSID:"SKY2E6AD" - Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s - 36 Mb/s; 48 Mb/s; 54 Mb/s - Mode:Master - Extra:tsf=0000000000000000 -<<<<<<< HEAD - Extra: Last beacon: 50ms ago -======= - Extra: Last beacon: 80ms ago ->>>>>>> cb80ea19aeddde251c9f06ec8220b96bc5f137fb - IE: Unknown: 0008534B593245364144 - IE: Unknown: 01088C129824B048606C - IE: Unknown: 07344742202401172801172C01173001173401173801173C011740011764011E68011E6C011E70011E74011E84011E88011E8C011E00 - IE: Unknown: 200100 - IE: Unknown: 23021000 - IE: IEEE 802.11i/WPA2 Version 1 - Group Cipher : CCMP - Pairwise Ciphers (1) : CCMP - Authentication Suites (1) : PSK -<<<<<<< HEAD - IE: Unknown: 0B050000280000 -======= - IE: Unknown: 0B050000130000 ->>>>>>> cb80ea19aeddde251c9f06ec8220b96bc5f137fb - IE: Unknown: 420100 - IE: Unknown: 46057208000000 - IE: Unknown: 2D1AEF0117FFFFFFFF00000000000000000000000000000000000000 - IE: Unknown: 3D1624050000000000000000000000000000000000000000 - IE: Unknown: 7F080400080000000040 - IE: Unknown: BF0CB269830FAAFF0000AAFF0000 - IE: Unknown: C005012A000000 - IE: Unknown: C30402020202 -<<<<<<< HEAD - IE: Unknown: DDAD0050F204104A0001101044000102103B00010310470010B3B9D65E5B53F032D888BB2D851A5CBA10210003536B7910230005454D31353010240007312E302E302E301042000E41543133353132303330303030311054000800060050F20400011011000E536B792051204D696E6920626F7810080002200C103C0001021049000600372A00012010580022007FC51000186309446EBAB7CC70AE7616820D8EF0A5303030303030303130000101 -======= - IE: Unknown: DDAD0050F204104A0001101044000102103B00010310470010B3B9D65E5B53F032D888BB2D851A5CBA10210003536B7910230005454D31353010240007312E302E302E301042000E41543133353132303330303030311054000800060050F20400011011000E536B792051204D696E6920626F7810080002200C103C0001021049000600372A00012010580022007FC510001868FFE221A0ABBBB2A9C1BB3C760026E3303030303030303130000101 ->>>>>>> cb80ea19aeddde251c9f06ec8220b96bc5f137fb - IE: Unknown: DD090010180200001C0000 - IE: Unknown: DD180050F2020101840003A4000027A4000042435E0062322F00 - Cell 07 - Address: 94:37:F7:ED:E5:FA - Channel:36 - Frequency:5.18 GHz (Channel 36) -<<<<<<< HEAD - Quality=64/70 Signal level=-46 dBm -======= - Quality=62/70 Signal level=-48 dBm ->>>>>>> cb80ea19aeddde251c9f06ec8220b96bc5f137fb - Encryption key:on - ESSID:"Home_5GHz" - Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s - 36 Mb/s; 48 Mb/s; 54 Mb/s - Mode:Master - Extra:tsf=0000000000000000 -<<<<<<< HEAD - Extra: Last beacon: 50ms ago -======= - Extra: Last beacon: 80ms ago ->>>>>>> cb80ea19aeddde251c9f06ec8220b96bc5f137fb - IE: Unknown: 0009486F6D655F3547487A - IE: Unknown: 01088C129824B048606C - IE: Unknown: 200100 - IE: Unknown: 23020F00 - IE: IEEE 802.11i/WPA2 Version 1 - Group Cipher : CCMP - Pairwise Ciphers (1) : CCMP - Authentication Suites (1) : PSK -<<<<<<< HEAD - IE: Unknown: 0B0505002F0000 - IE: Unknown: 2D1AEF0117FFFFFFFF00000000000000000000000000000000000000 - IE: Unknown: 3D1624050400000000000000000000000000000000000000 -======= - IE: Unknown: 0B050700210000 - IE: Unknown: 2D1AEF0117FFFFFFFF00000000000000000000000000000000000000 - IE: Unknown: 3D1624051600000000000000000000000000000000000000 ->>>>>>> cb80ea19aeddde251c9f06ec8220b96bc5f137fb - IE: Unknown: 7F080400080000000040 - IE: Unknown: BF0CB5698B0FAAFF0000AAFF0020 - IE: Unknown: C005012A000000 - IE: Unknown: C30402202020 - IE: Unknown: C70132 - IE: Unknown: FF24230900001200100C2002C06F5B8318000C00AAFFAAFFAAFFAAFF1B1CC7711CC7711CC771 -<<<<<<< HEAD - IE: Unknown: FF072404000030FCFF - IE: Unknown: FF022700 - IE: Unknown: FF0E260400A4FF20A4FF4043FF6032FF - IE: Unknown: DD7E0050F204104A0001101044000102103B00010310470010D96C7EFC2F8938F1EFBD6E5148BFA81210210006487561776569102300064875617765691024000631323334353610420004313233341054000800060050F2040001101100084875617765694150100800020100103C0001031049000A00372A00012005020780 - IE: Unknown: DD0F00E0FC8000000001009437F7EDE5FA - IE: Unknown: DD1400E0FC400000000000FB069437F7EDE5FAF90101 - IE: Unknown: DD0500904C0417 - IE: Unknown: DD090010180205001C0000 - IE: Unknown: DD180050F2020101840003A4000027A4000042435E0062322F00 - Cell 08 - Address: 62:8E:29:1A:B2:3D - Channel:1 - Frequency:2.412 GHz (Channel 1) - Quality=34/70 Signal level=-76 dBm - Encryption key:off - ESSID:"BTWi-fi" - Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 18 Mb/s - 24 Mb/s; 36 Mb/s; 54 Mb/s - Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 48 Mb/s - Mode:Master - Extra:tsf=0000000000000000 - Extra: Last beacon: 50ms ago - IE: Unknown: 0007425457692D6669 - IE: Unknown: 010882848B962430486C - IE: Unknown: 030101 - IE: Unknown: 050401030000 - IE: Unknown: 0706474220010D14 - IE: Unknown: 2A0104 - IE: Unknown: 32040C121860 - IE: Unknown: 0B050000230000 - IE: Unknown: 2D1AAD0117FFFFFF0000000000000000000000000000000000000000 - IE: Unknown: 3D1601000400000000000000000000000000000000000000 - IE: Unknown: 7F080400080000000040 - IE: Unknown: DD1E00904C0408BF0CB259820FEAFF0000EAFF0000C0050001000000C3020002 - IE: Unknown: DD090010180200101C0000 - IE: Unknown: DD180050F2020101880003A4000027A4000042435E0062322F00 - Cell 09 - Address: 98:1E:19:E5:01:39 -======= - IE: Unknown: FF072404000025FCFF - IE: Unknown: FF022700 - IE: Unknown: FF0E260400A4FF20A4FF4043FF6032FF - IE: Unknown: DD0F00E0FC8000000001009437F7EDE5FA - IE: Unknown: DD1400E0FC400000000000FB069437F7EDE5FAF90101 - IE: Unknown: DD7E0050F204104A0001101044000102103B00010310470010D96C7EFC2F8938F1EFBD6E5148BFA81210210006487561776569102300064875617765691024000631323334353610420004313233341054000800060050F2040001101100084875617765694150100800020100103C0001031049000A00372A00012005020780 - IE: Unknown: DD0500904C0417 - IE: Unknown: DD090010180207001C0000 - IE: Unknown: DD180050F2020101840003A4000027A4000042435E0062322F00 - Cell 08 - Address: 98:1E:19:E5:01:39 ->>>>>>> cb80ea19aeddde251c9f06ec8220b96bc5f137fb - Channel:36 - Frequency:5.18 GHz (Channel 36) - Quality=33/70 Signal level=-77 dBm - Encryption key:on - ESSID:"BTHub6-F8K2" - Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s - 36 Mb/s; 48 Mb/s; 54 Mb/s - Mode:Master - Extra:tsf=0000000000000000 -<<<<<<< HEAD - Extra: Last beacon: 50ms ago - IE: Unknown: 000B4254487562362D46384B32 - IE: Unknown: 01088C129824B048606C -======= - Extra: Last beacon: 80ms ago - IE: Unknown: 000B4254487562362D46384B32 - IE: Unknown: 01088C129824B048606C - IE: Unknown: 050402030000 ->>>>>>> cb80ea19aeddde251c9f06ec8220b96bc5f137fb - IE: Unknown: 073C4742202401172801172C01173001173401173801173C011740011764011E68011E6C011E70011E74011E78011E7C011E80011E84011E88011E8C011E - IE: Unknown: 200100 - IE: Unknown: 23021500 - IE: IEEE 802.11i/WPA2 Version 1 - Group Cipher : CCMP - Pairwise Ciphers (1) : CCMP - Authentication Suites (1) : PSK -<<<<<<< HEAD - IE: Unknown: 0B050100110000 -======= - IE: Unknown: 0B0501000C0000 ->>>>>>> cb80ea19aeddde251c9f06ec8220b96bc5f137fb - IE: Unknown: 42020000 - IE: Unknown: 2D1AEF0117FFFFFFFF00000000000000000000000000000000000000 - IE: Unknown: 3D1624050000000000000000000000000000000000000000 - IE: Unknown: 7F080400080000000040 - IE: Unknown: BF0CB269830FAAFF0000AAFF0000 - IE: Unknown: C005012A000000 - IE: Unknown: C30402020202 -<<<<<<< HEAD - IE: Unknown: DD800050F204104A0001101044000102103B000103104700102ADE320B3332E522A765BA8ACC7669F81021000242541023000842545F4855425F3610240007312E302D322E30104200063132333435361054000800060050F20400011011000D42545F4855425F362D31323334100800022000103C0001031049000600372A000120 - IE: Unknown: DD0500904C0417 - IE: Unknown: DD090010180201001C0000 - IE: Unknown: DD180050F2020101800003A4000027A4000042435E0062322F00 - Cell 10 - Address: 96:37:F7:ED:E5:FC - Channel:36 - Frequency:5.18 GHz (Channel 36) - Quality=64/70 Signal level=-46 dBm - Encryption key:on - ESSID:"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" -======= - IE: Unknown: DD310050F204104A0001101044000102104700102ADE320B3332E522A765BA8ACC7669F8103C0001031049000600372A000120 - IE: Unknown: DD0500904C0417 - IE: Unknown: DD090010180201001C0000 - IE: Unknown: DD180050F2020101800003A4000027A4000042435E0062322F00 - Cell 09 - Address: 22:B0:01:9C:02:01 - Channel:52 - Frequency:5.26 GHz (Channel 52) - Quality=53/70 Signal level=-57 dBm - Encryption key:on - ESSID:"HOME2" ->>>>>>> cb80ea19aeddde251c9f06ec8220b96bc5f137fb - Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s - 36 Mb/s; 48 Mb/s; 54 Mb/s - Mode:Master - Extra:tsf=0000000000000000 -<<<<<<< HEAD - Extra: Last beacon: 50ms ago - IE: Unknown: 0018000000000000000000000000000000000000000000000000 - IE: Unknown: 01088C129824B048606C - IE: Unknown: 050400010000 - IE: Unknown: 200100 - IE: Unknown: 23020F00 -======= - Extra: Last beacon: 80ms ago - IE: Unknown: 0005484F4D4532 - IE: Unknown: 01088C129824B048606C - IE: Unknown: 050400010000 - IE: Unknown: 073C4742202401172801172C01173001173401173801173C011740011764011E68011E6C011E70011E74011E78011E7C011E80011E84011E88011E8C011E - IE: Unknown: 200100 - IE: Unknown: 23021400 ->>>>>>> cb80ea19aeddde251c9f06ec8220b96bc5f137fb - IE: IEEE 802.11i/WPA2 Version 1 - Group Cipher : CCMP - Pairwise Ciphers (1) : CCMP - Authentication Suites (1) : PSK -<<<<<<< HEAD - IE: Unknown: 0B0500002F0000 - IE: Unknown: 2D1AEF0117FFFFFFFF00000000000000000000000000000000000000 - IE: Unknown: 3D1624050400000000000000000000000000000000000000 - IE: Unknown: 7F080400080000000040 - IE: Unknown: BF0CB5698B0FAAFF0000AAFF0020 - IE: Unknown: C005012A000000 - IE: Unknown: C30402202020 - IE: Unknown: C70132 - IE: Unknown: FF24230900001200100C2002C06F5B8318000C00AAFFAAFFAAFFAAFF1B1CC7711CC7711CC771 - IE: Unknown: FF072404000030FCFF - IE: Unknown: FF022700 - IE: Unknown: FF0E260400A4FF20A4FF4043FF6032FF - IE: Unknown: DD0500904C0417 - IE: Unknown: DD090010180200001C0000 - IE: Unknown: DD180050F2020101840003A4000027A4000042435E0062322F00 - """ -from pprint import pprint + expected_results = [ + {'Connected': '', 'SSID': 'Home', 'Signal': '70/70', 'WPA': 'WPA2'}, + {'Connected': '', 'SSID': 'HOME2', 'Signal': '56/70', 'WPA': 'WPA2'}, + {'Connected': '', 'SSID': 'rpi', 'Signal': '70/70', 'WPA': 'WPA2'} + ] + results = parse_iwlist(iwlist_text, "") + # We can't guarantee the order of the results, so we'll sort them by SSID + results.sort(key=lambda x: x['SSID']) + expected_results.sort(key=lambda x: x['SSID']) -def parse_iwlist(iwlist_output): - data = [] - in_cell = False - cell = [] - for line in iwlist_output.splitlines(): - if line.find(" Cell ") != -1 and cell != []: - data.append(cell) - cell = [] - elif line.find("Scan completed :") > 0: - pass - else: - cell.append(line) + self.assertEqual(results, expected_results) - del data[0][0] +class TestNetworkConnection(unittest.TestCase): + @patch('app.network_utils.run_subprocess_interface') + @patch('app.network_utils.run_subprocess') + @patch('builtins.open', new_callable=mock_open) + def test_connect_network_wpa2_success(self, mock_file, mock_run_subprocess, mock_run_subprocess_interface): + mock_run_subprocess.return_value = "Success" + mock_run_subprocess_interface.return_value = "Success" + result = connect_network("TestSSID", "WPA2", "TestPassword") + self.assertTrue(result) + mock_file.assert_any_call('/etc/network/interfaces', 'r') + mock_file.assert_any_call('/etc/network/interfaces', 'w') + mock_file.assert_any_call('/etc/wpa_supplicant/wpa_supplicant.conf', 'wt') + mock_run_subprocess_interface.assert_any_call(f'sudo /usr/sbin/ifdown {{}}') + mock_run_subprocess.assert_any_call('sudo /usr/bin/systemctl stop wpa_supplicant') + mock_run_subprocess.assert_any_call('sudo /usr/bin/systemctl start wpa_supplicant') + mock_run_subprocess_interface.assert_any_call(f'sudo /usr/sbin/ifup {{}}') - cells = [] + @patch('app.network_utils.run_subprocess') + @patch('builtins.open', new_callable=mock_open) + def test_connect_network_wpa2_failure(self, mock_file, mock_run_subprocess): + mock_run_subprocess.return_value = None + result = connect_network("TestSSID", "WPA2", "TestPassword") + self.assertFalse(result) - for a in data: - cell = {} - for line in a: - line = line.strip() - if line.find("ESSID:") != -1: - if line.partition("ESSID:")[2].strip('"') != "": - cell["SSID"] = line.partition("ESSID:")[2].strip('"') - if line.partition("Signal level=")[2].split("/")[0] != "" != -1: - cell["Signal"] = line.partition("Signal level=")[2].split("/")[0] - if line.find("Encryption key:") != -1: - if line.find(":on") != -1: - cell["WPA"] = "WPA2" - else: - cell["WPA"] = "None" - cells.append(cell) + @patch('app.network_utils.run_subprocess_interface') + @patch('app.network_utils.run_subprocess') + @patch('builtins.open', new_callable=mock_open) + def test_disconnect_network_success(self, mock_file, mock_run_subprocess, mock_run_subprocess_interface): + mock_run_subprocess.return_value = "Success" + mock_run_subprocess_interface.return_value = "Success" + result = disconnect_network() + self.assertTrue(result) + mock_file.assert_any_call('/etc/wpa_supplicant/wpa_supplicant.conf', 'wt') + mock_run_subprocess_interface.assert_any_call(f'sudo /usr/sbin/ifdown {{}}') + mock_run_subprocess.assert_any_call('sudo /usr/bin/systemctl stop wpa_supplicant') + mock_run_subprocess.assert_any_call('sudo /usr/bin/systemctl start wpa_supplicant') + mock_run_subprocess_interface.assert_any_call(f'sudo /usr/sbin/ifup {{}}') - pprint(cells) + @patch('app.network_utils.run_subprocess') + @patch('builtins.open', new_callable=mock_open) + def test_disconnect_network_failure(self, mock_file, mock_run_subprocess): + mock_run_subprocess.return_value = None + result = disconnect_network() + self.assertFalse(result) + @patch('app.network_utils.run_subprocess_interface') + @patch('app.network_utils.run_subprocess') + @patch('builtins.open', new_callable=mock_open) + def test_cleanup_network_success(self, mock_file, mock_run_subprocess, mock_run_subprocess_interface): + mock_run_subprocess.return_value = "Success" + mock_run_subprocess_interface.return_value = "Success" + result = cleanup_network() + self.assertTrue(result) + mock_file.assert_any_call('/etc/wpa_supplicant/wpa_supplicant.conf', 'wt') + mock_run_subprocess_interface.assert_any_call(f'sudo /usr/sbin/ifdown {{}}') + mock_run_subprocess.assert_any_call('sudo /usr/bin/systemctl stop wpa_supplicant') + mock_run_subprocess.assert_any_call('sudo /usr/bin/systemctl start wpa_supplicant') + mock_run_subprocess_interface.assert_any_call(f'sudo /usr/sbin/ifup {{}}') -if __name__ == "__main__": - parse_iwlist(iwlist_text) -======= - IE: Unknown: 0B050200040000 - IE: Unknown: 420100 - IE: Unknown: 46053000000000 - IE: Unknown: 2D1A6F0017FFFFFFFF00000000000000000000000000000000000000 - IE: Unknown: 3D1634050400000000000000000000000000000000000000 - IE: Unknown: 4A0E14000A002C01C800140005001900 - IE: Unknown: 7F080500088000400040 - IE: Unknown: BF0C3268830FAAFF0000AAFF0000 - IE: Unknown: C005013A000000 - IE: Unknown: C30402020202 - IE: Unknown: DD1D0050F204104A0001101044000102103C0001031049000600372A000120 - IE: Unknown: DD0500904C0417 - IE: Unknown: DD090010180202009C0000 - IE: Unknown: DD180050F2020101000003A4000027A4000042435E0062322F00 - IE: Unknown: DD07506F9A16010100 - IE: Unknown: 6C027F00 + @patch('app.network_utils.run_subprocess') + @patch('builtins.open', new_callable=mock_open) + def test_cleanup_network_failure(self, mock_file, mock_run_subprocess): + mock_run_subprocess.return_value = None + result = cleanup_network() + self.assertFalse(result) -""" - -def parse_iwlist(iwlist_output): - data = [] - for line in iwlist_output: - if line.find() if __name__ == '__main__': - parse_iwlist(iwlist_text) ->>>>>>> cb80ea19aeddde251c9f06ec8220b96bc5f137fb + unittest.main() diff --git a/tr.py b/wsgi.py similarity index 68% rename from tr.py rename to wsgi.py index 0820bcd..e8a3eee 100644 --- a/tr.py +++ b/wsgi.py @@ -1,6 +1,10 @@ from app import app, db from app.models import User +from app.network_utils import cleanup_network + +cleanup_network() @app.shell_context_processor def make_shell_context(): return {'db': db, 'User': User} +
SelectSIDStrengthConnectedPassword
{}{}{}{}