diff --git a/.github/workflows/selfdrive_tests.yaml b/.github/workflows/selfdrive_tests.yaml
index 9653a18fdd3743..aa217735bfb4a5 100644
--- a/.github/workflows/selfdrive_tests.yaml
+++ b/.github/workflows/selfdrive_tests.yaml
@@ -146,13 +146,6 @@ jobs:
if: github.ref == 'refs/heads/master' && github.event_name != 'pull_request' && github.repository == 'commaai/openpilot'
needs: static_analysis # hack to ensure slow tests run first since this and static_analysis are fast
steps:
- - name: Get current date
- id: date
- run: echo "::set-output name=time::$(date +'%s')"
- - name: Output timestamp
- run: echo $TIMESTAMP
- env:
- TIMESTAMP: ${{ steps.date.outputs.time }}
- uses: actions/checkout@v2
with:
submodules: true
@@ -217,6 +210,13 @@ jobs:
runs-on: ubuntu-20.04
timeout-minutes: 50
steps:
+ - name: Get current date
+ id: date
+ run: echo "::set-output name=time::$(date +'%s')"
+ - name: Output timestamp
+ run: echo $TIMESTAMP
+ env:
+ TIMESTAMP: ${{ steps.date.outputs.time }}
- uses: actions/checkout@v2
with:
submodules: true
diff --git a/Jenkinsfile b/Jenkinsfile
index 29edbeb1726e2b..64ca4bfa24f5e8 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -37,7 +37,7 @@ EOF"""
def phone_steps(String device_type, steps) {
lock(resource: "", label: device_type, inversePrecedence: true, variable: 'device_ip', quantity: 1) {
- timeout(time: 150, unit: 'MINUTES') {
+ timeout(time: 60, unit: 'MINUTES') {
phone(device_ip, "git checkout", readFile("selfdrive/test/setup_device_ci.sh"),)
steps.each { item ->
phone(device_ip, item[0], item[1])
@@ -53,7 +53,7 @@ pipeline {
SOURCE_DIR = "/data/openpilot_source/"
}
options {
- timeout(time: 3, unit: 'HOURS')
+ timeout(time: 4, unit: 'HOURS')
}
stages {
diff --git a/Pipfile b/Pipfile
index 6949c5c52e6459..3fc26b363bd7cf 100644
--- a/Pipfile
+++ b/Pipfile
@@ -4,82 +4,33 @@ url = "https://pypi.org/simple"
verify_ssl = true
[dev-packages]
-aenum = "*"
-aiohttp = "*"
-azure-cli-core = "*"
-azure-common = "*"
-azure-core = "*"
-azure-nspkg = "~=3.0"
-azure-storage-blob = "~=2.1"
-azure-storage-common = "~=2.1"
-azure-storage-nspkg = "~=3.1"
-"backports.lzma" = "*"
-boto = "*"
-boto3 = "*"
control = "*"
coverage = "*"
-datadog = "*"
dictdiffer = "*"
-elasticsearch = "*"
fastcluster = "*"
-Flask-Cors = "*"
-Flask-SocketIO = "*"
-ft4222 = "*"
-GeoAlchemy2 = "*"
-git-pylint-commit-hook = "*"
-gunicorn = "*"
-h5py = "*"
hexdump = "*"
hypothesis = "*"
-imageio = "*"
inputs = "*"
-ipykernel = "*"
-ipython = "*"
-joblib = "*"
-json-logging-py = "*"
-jupyter = "*"
-jupyterlab = "*"
-jupyterlab-vim = "*"
-keras_applications = "*"
lru-dict = "*"
markdown-it-py = "*"
matplotlib = "*"
-mock = "*"
-mpld3 = "*"
-msgpack-python = "*"
mypy = "*"
myst-parser = "*"
-networkx = "~=2.3"
numpy = "*"
opencv-python-headless = "*"
-osmium = "*"
parameterized = "*"
paramiko = "*"
pprofile = "*"
pre-commit = "*"
pycurl = "*"
pygame = "*"
-Pygments = "*"
-pymongo = "*"
-PyMySQL = "~=0.9"
-pynmea2 = "*"
pyprof2calltree = "*"
-pyproj = "*"
-python-logstash = "*"
-redis = "*"
reverse_geocoder = "*"
-s2sphere = "*"
-scikit-image = "*"
scipy = "*"
-seaborn = "*"
-Shapely = "*"
-simplejson = "*"
sphinx = "*"
sphinx-rtd-theme = "*"
-SQLAlchemy = "*"
subprocess32 = "*"
tenacity = "*"
-Werkzeug = "*"
[packages]
atomicwrites = "*"
diff --git a/Pipfile.lock b/Pipfile.lock
index 8aacbcbd72bdcd..a1aaeb8766e477 100644
--- a/Pipfile.lock
+++ b/Pipfile.lock
@@ -1,7 +1,7 @@
{
"_meta": {
"hash": {
- "sha256": "5c7313dae29ab23058c6045053416ab27993a827b4b19c0fc1d7fbf1cb9c9fd3"
+ "sha256": "c0f1a46ca2ccdc208a392c5ce78d9d928f82d40afd46a33da7b99b895798fce2"
},
"pipfile-spec": 6,
"requires": {
@@ -18,11 +18,11 @@
"default": {
"astroid": {
"hashes": [
- "sha256:0755c998e7117078dcb7d0bda621391dd2a85da48052d948c7411ab187325346",
- "sha256:1e83a69fd51b013ebf5912d26b9338d6643a55fec2f20c787792680610eed4a2"
+ "sha256:11f7356737b624c42e21e71fe85eea6875cb94c03c82ac76bd535a0ff10b0f25",
+ "sha256:abc423a1e85bc1553954a14f2053473d2b7f8baf32eae62a328be24f436b5107"
],
"markers": "python_version ~= '3.6'",
- "version": "==2.8.4"
+ "version": "==2.8.5"
},
"atomicwrites": {
"hashes": [
@@ -292,11 +292,11 @@
},
"isort": {
"hashes": [
- "sha256:1a18ccace2ed8910bd9458b74a3ecbafd7b2f581301b0ab65cfdd4338272d76f",
- "sha256:e52ff6d38012b131628cf0f26c51e7bd3a7c81592eefe3ac71411e692f1b9345"
+ "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7",
+ "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"
],
"markers": "python_version < '4' and python_full_version >= '3.6.1'",
- "version": "==5.10.0"
+ "version": "==5.10.1"
},
"itsdangerous": {
"hashes": [
@@ -308,11 +308,11 @@
},
"jinja2": {
"hashes": [
- "sha256:827a0e32839ab1600d4eb1c4c33ec5a8edfbc5cb42dafa13b81f182f97784b45",
- "sha256:8569982d3f0889eed11dd620c706d39b60c36d6d25843961f33f77fb6bc6b20c"
+ "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8",
+ "sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7"
],
"index": "pypi",
- "version": "==3.0.2"
+ "version": "==3.0.3"
},
"json-rpc": {
"hashes": [
@@ -974,12 +974,11 @@
},
"typing-extensions": {
"hashes": [
- "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e",
- "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7",
- "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"
+ "sha256:2cdf80e4e04866a9b3689a51869016d36db0814d84b8d8a568d22781d45d27ed",
+ "sha256:829704698b22e13ec9eaf959122315eabb370b0884400e9818334d8b677023d9"
],
"markers": "python_version < '3.10'",
- "version": "==3.10.0.2"
+ "version": "==4.0.0"
},
"urllib3": {
"hashes": [
@@ -1071,101 +1070,6 @@
}
},
"develop": {
- "aenum": {
- "hashes": [
- "sha256:1d494e4d3b3e3e95389aee420203d945776d2430ee9a3d4f162e267b3a7ec3a6",
- "sha256:a3e86312ca58611236900b77e863d2b9034dfe8956a089a2935b55974eb33f1f",
- "sha256:c3dba3d5482d09ea371651d8da08cb21e0b8a826970bb08a3b30789b4a7b91a9"
- ],
- "index": "pypi",
- "version": "==3.1.3"
- },
- "aiohttp": {
- "hashes": [
- "sha256:09754a0d5eaab66c37591f2f8fac8f9781a5f61d51aa852a3261c4805ca6b984",
- "sha256:097ecf52f6b9859b025c1e36401f8aa4573552e887d1b91b4b999d68d0b5a3b3",
- "sha256:0a96473a1f61d7920a9099bc8e729dc8282539d25f79c12573ee0fdb9c8b66a8",
- "sha256:0af379221975054162959e00daf21159ff69a712fc42ed0052caddbd70d52ff4",
- "sha256:0d7b056fd3972d353cb4bc305c03f9381583766b7f8c7f1c44478dba69099e33",
- "sha256:14a6f026eca80dfa3d52e86be89feb5cd878f6f4a6adb34457e2c689fd85229b",
- "sha256:15a660d06092b7c92ed17c1dbe6c1eab0a02963992d60e3e8b9d5fa7fa81f01e",
- "sha256:1fa9f50aa1f114249b7963c98e20dc35c51be64096a85bc92433185f331de9cc",
- "sha256:257f4fad1714d26d562572095c8c5cd271d5a333252795cb7a002dca41fdbad7",
- "sha256:28369fe331a59d80393ec82df3d43307c7461bfaf9217999e33e2acc7984ff7c",
- "sha256:2bdd655732e38b40f8a8344d330cfae3c727fb257585df923316aabbd489ccb8",
- "sha256:2f44d1b1c740a9e2275160d77c73a11f61e8a916191c572876baa7b282bcc934",
- "sha256:3ba08a71caa42eef64357257878fb17f3fba3fba6e81a51d170e32321569e079",
- "sha256:3c5e9981e449d54308c6824f172ec8ab63eb9c5f922920970249efee83f7e919",
- "sha256:3f58aa995b905ab82fe228acd38538e7dc1509e01508dcf307dad5046399130f",
- "sha256:48c996eb91bfbdab1e01e2c02e7ff678c51e2b28e3a04e26e41691991cc55795",
- "sha256:48f218a5257b6bc16bcf26a91d97ecea0c7d29c811a90d965f3dd97c20f016d6",
- "sha256:4a6551057a846bf72c7a04f73de3fcaca269c0bd85afe475ceb59d261c6a938c",
- "sha256:51f90dabd9933b1621260b32c2f0d05d36923c7a5a909eb823e429dba0fd2f3e",
- "sha256:577cc2c7b807b174814dac2d02e673728f2e46c7f90ceda3a70ea4bb6d90b769",
- "sha256:5d79174d96446a02664e2bffc95e7b6fa93b9e6d8314536c5840dff130d0878b",
- "sha256:5e3f81fbbc170418e22918a9585fd7281bbc11d027064d62aa4b507552c92671",
- "sha256:5ecffdc748d3b40dd3618ede0170e4f5e1d3c9647cfb410d235d19e62cb54ee0",
- "sha256:63fa57a0708573d3c059f7b5527617bd0c291e4559298473df238d502e4ab98c",
- "sha256:67ca7032dfac8d001023fadafc812d9f48bf8a8c3bb15412d9cdcf92267593f4",
- "sha256:688a1eb8c1a5f7e795c7cb67e0fe600194e6723ba35f138dfae0db20c0cb8f94",
- "sha256:6a038cb1e6e55b26bb5520ccffab7f539b3786f5553af2ee47eb2ec5cbd7084e",
- "sha256:6b79f6c31e68b6dafc0317ec453c83c86dd8db1f8f0c6f28e97186563fca87a0",
- "sha256:6d3e027fe291b77f6be9630114a0200b2c52004ef20b94dc50ca59849cd623b3",
- "sha256:6f1d39a744101bf4043fa0926b3ead616607578192d0a169974fb5265ab1e9d2",
- "sha256:707adc30ea6918fba725c3cb3fe782d271ba352b22d7ae54a7f9f2e8a8488c41",
- "sha256:730b7c2b7382194d9985ffdc32ab317e893bca21e0665cb1186bdfbb4089d990",
- "sha256:764c7c6aa1f78bd77bd9674fc07d1ec44654da1818d0eef9fb48aa8371a3c847",
- "sha256:78d51e35ed163783d721b6f2ce8ce3f82fccfe471e8e50a10fba13a766d31f5a",
- "sha256:7a315ceb813208ef32bdd6ec3a85cbe3cb3be9bbda5fd030c234592fa9116993",
- "sha256:7ba09bb3dcb0b7ec936a485db2b64be44fe14cdce0a5eac56f50e55da3627385",
- "sha256:7d76e8a83396e06abe3df569b25bd3fc88bf78b7baa2c8e4cf4aaf5983af66a3",
- "sha256:84fe1732648c1bc303a70faa67cbc2f7f2e810c8a5bca94f6db7818e722e4c0a",
- "sha256:871d4fdc56288caa58b1094c20f2364215f7400411f76783ea19ad13be7c8e19",
- "sha256:88d4917c30fcd7f6404fb1dc713fa21de59d3063dcc048f4a8a1a90e6bbbd739",
- "sha256:8a50150419b741ee048b53146c39c47053f060cb9d98e78be08fdbe942eaa3c4",
- "sha256:90a97c2ed2830e7974cbe45f0838de0aefc1c123313f7c402e21c29ec063fbb4",
- "sha256:949a605ef3907254b122f845baa0920407080cdb1f73aa64f8d47df4a7f4c4f9",
- "sha256:9689af0f0a89e5032426c143fa3683b0451f06c83bf3b1e27902bd33acfae769",
- "sha256:98b1ea2763b33559dd9ec621d67fc17b583484cb90735bfb0ec3614c17b210e4",
- "sha256:9951c2696c4357703001e1fe6edc6ae8e97553ac630492ea1bf64b429cb712a3",
- "sha256:9a52b141ff3b923a9166595de6e3768a027546e75052ffba267d95b54267f4ab",
- "sha256:9e8723c3256641e141cd18f6ce478d54a004138b9f1a36e41083b36d9ecc5fc5",
- "sha256:a2fee4d656a7cc9ab47771b2a9e8fad8a9a33331c1b59c3057ecf0ac858f5bfe",
- "sha256:a4759e85a191de58e0ea468ab6fd9c03941986eee436e0518d7a9291fab122c8",
- "sha256:a5399a44a529083951b55521cf4ecbf6ad79fd54b9df57dbf01699ffa0549fc9",
- "sha256:a6074a3b2fa2d0c9bf0963f8dfc85e1e54a26114cc8594126bc52d3fa061c40e",
- "sha256:a84c335337b676d832c1e2bc47c3a97531b46b82de9f959dafb315cbcbe0dfcd",
- "sha256:adf0cb251b1b842c9dee5cfcdf880ba0aae32e841b8d0e6b6feeaef002a267c5",
- "sha256:b76669b7c058b8020b11008283c3b8e9c61bfd978807c45862956119b77ece45",
- "sha256:bda75d73e7400e81077b0910c9a60bf9771f715420d7e35fa7739ae95555f195",
- "sha256:be03a7483ad9ea60388f930160bb3728467dd0af538aa5edc60962ee700a0bdc",
- "sha256:c62d4791a8212c885b97a63ef5f3974b2cd41930f0cd224ada9c6ee6654f8150",
- "sha256:cb751ef712570d3bda9a73fd765ff3e1aba943ec5d52a54a0c2e89c7eef9da1e",
- "sha256:d3b19d8d183bcfd68b25beebab8dc3308282fe2ca3d6ea3cb4cd101b3c279f8d",
- "sha256:d3f90ee275b1d7c942e65b5c44c8fb52d55502a0b9a679837d71be2bd8927661",
- "sha256:d5f8c04574efa814a24510122810e3a3c77c0552f9f6ff65c9862f1f046be2c3",
- "sha256:d6a1a66bb8bac9bc2892c2674ea363486bfb748b86504966a390345a11b1680e",
- "sha256:d7715daf84f10bcebc083ad137e3eced3e1c8e7fa1f096ade9a8d02b08f0d91c",
- "sha256:dafc01a32b4a1d7d3ef8bfd3699406bb44f7b2e0d3eb8906d574846e1019b12f",
- "sha256:dcc4d5dd5fba3affaf4fd08f00ef156407573de8c63338787614ccc64f96b321",
- "sha256:de42f513ed7a997bc821bddab356b72e55e8396b1b7ba1bf39926d538a76a90f",
- "sha256:e27cde1e8d17b09730801ce97b6e0c444ba2a1f06348b169fd931b51d3402f0d",
- "sha256:ecb314e59bedb77188017f26e6b684b1f6d0465e724c3122a726359fa62ca1ba",
- "sha256:f348ebd20554e8bc26e8ef3ed8a134110c0f4bf015b3b4da6a4ddf34e0515b19",
- "sha256:fa818609357dde5c4a94a64c097c6404ad996b1d38ca977a72834b682830a722",
- "sha256:fe4a327da0c6b6e59f2e474ae79d6ee7745ac3279fd15f200044602fa31e3d79"
- ],
- "index": "pypi",
- "version": "==3.8.0"
- },
- "aiosignal": {
- "hashes": [
- "sha256:26e62109036cd181df6e6ad646f91f0dcfd05fe16d0cb924138ff2ab75d64e3a",
- "sha256:78ed67db6c7b7ced4f98e495e572106d5c432a93e1ddd1bf475e1dc05f5b7df2"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==1.2.0"
- },
"alabaster": {
"hashes": [
"sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359",
@@ -1173,61 +1077,6 @@
],
"version": "==0.7.12"
},
- "anyio": {
- "hashes": [
- "sha256:4fd09a25ab7fa01d34512b7249e366cd10358cdafc95022c7ff8c8f8a5026d66",
- "sha256:67da67b5b21f96b9d3d65daa6ea99f5d5282cb09f50eb4456f8fb51dffefc3ff"
- ],
- "markers": "python_full_version >= '3.6.2'",
- "version": "==3.3.4"
- },
- "applicationinsights": {
- "hashes": [
- "sha256:0b761f3ef0680acf4731906dfc1807faa6f2a57168ae74592db0084a6099f7b3",
- "sha256:e89a890db1c6906b6a7d0bcfd617dac83974773c64573147c8d6654f9cf2a6ea"
- ],
- "version": "==0.11.10"
- },
- "argcomplete": {
- "hashes": [
- "sha256:291f0beca7fd49ce285d2f10e4c1c77e9460cf823eef2de54df0c0fec88b0d81",
- "sha256:2c7dbffd8c045ea534921e63b0be6fe65e88599990d8dc408ac8c542b72a5445"
- ],
- "version": "==1.12.3"
- },
- "argon2-cffi": {
- "hashes": [
- "sha256:165cadae5ac1e26644f5ade3bd9c18d89963be51d9ea8817bd671006d7909057",
- "sha256:217b4f0f853ccbbb5045242946ad2e162e396064575860141b71a85eb47e475a",
- "sha256:245f64a203012b144b7b8c8ea6d468cb02b37caa5afee5ba4a10c80599334f6a",
- "sha256:4ad152c418f7eb640eac41ac815534e6aa61d1624530b8e7779114ecfbf327f8",
- "sha256:566ffb581bbd9db5562327aee71b2eda24a1c15b23a356740abe3c011bbe0dcb",
- "sha256:65213a9174320a1aee03fe826596e0620783966b49eb636955958b3074e87ff9",
- "sha256:bc513db2283c385ea4da31a2cd039c33380701f376f4edd12fe56db118a3b21a",
- "sha256:c7a7c8cc98ac418002090e4add5bebfff1b915ea1cb459c578cd8206fef10378",
- "sha256:e4d8f0ae1524b7b0372a3e574a2561cbdddb3fdb6c28b70a72868189bda19659",
- "sha256:f710b61103d1a1f692ca3ecbd1373e28aa5e545ac625ba067ff2feca1b2bb870",
- "sha256:fa7e7d1fc22514a32b1761fdfa1882b6baa5c36bb3ef557bdd69e6fc9ba14a41"
- ],
- "markers": "python_version >= '3.5'",
- "version": "==21.1.0"
- },
- "astroid": {
- "hashes": [
- "sha256:0755c998e7117078dcb7d0bda621391dd2a85da48052d948c7411ab187325346",
- "sha256:1e83a69fd51b013ebf5912d26b9338d6643a55fec2f20c787792680610eed4a2"
- ],
- "markers": "python_version ~= '3.6'",
- "version": "==2.8.4"
- },
- "async-timeout": {
- "hashes": [
- "sha256:7d87a4e8adba8ededb52e579ce6bc8276985888913620c935094c2276fd83382",
- "sha256:f3303dddf6cafa748a92747ab6c2ecf60e0aeca769aee4c151adfce243a05d9b"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==4.0.0"
- },
"attrs": {
"hashes": [
"sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1",
@@ -1236,77 +1085,6 @@
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
"version": "==21.2.0"
},
- "azure-cli-core": {
- "hashes": [
- "sha256:259f2721c85a19f3d1285289121702d7388dd1dc8df99a3eee804ef08b06275d",
- "sha256:d074c21b591036cdac1f7df1e1912145a646165710ce5ac54526423aee4951eb"
- ],
- "index": "pypi",
- "version": "==2.30.0"
- },
- "azure-cli-telemetry": {
- "hashes": [
- "sha256:05c11939b8ed9a98b8bad1d0201909ff7c33671aaa4a98932069594e815aefbe",
- "sha256:fc6cadf59f14f3bbd6c01d1b4d6ad54cfc1456303510d8bdb6206db08c40e661"
- ],
- "version": "==1.0.6"
- },
- "azure-common": {
- "hashes": [
- "sha256:426673962740dbe9aab052a4b52df39c07767decd3f25fdc87c9d4c566a04934",
- "sha256:9f3f5d991023acbd93050cf53c4e863c6973ded7e236c69e99c8ff5c7bad41ef"
- ],
- "index": "pypi",
- "version": "==1.1.27"
- },
- "azure-core": {
- "hashes": [
- "sha256:1202c6600e991193d79ff1fdcdcc914e347746609404f960ce7e1bb8df1bec32",
- "sha256:7a1654d08b568abe847c72d9b084e7fdfff6baf11afa2cd1905f73cdf2f15447"
- ],
- "index": "pypi",
- "version": "==1.20.0"
- },
- "azure-mgmt-core": {
- "hashes": [
- "sha256:3ffb7352b39e5495dccc2d2b47254f4d82747aff4735e8bf3267c335b0c9bb40",
- "sha256:7b7fa952aeb9d3eaa13eff905880f3d3b62200f7be7a8ba5a50c8b2e7295322a"
- ],
- "version": "==1.3.0"
- },
- "azure-nspkg": {
- "hashes": [
- "sha256:1d0bbb2157cf57b1bef6c8c8e5b41133957364456c43b0a43599890023cca0a8",
- "sha256:31a060caca00ed1ebd369fc7fe01a56768c927e404ebc92268f4d9d636435e28",
- "sha256:e7d3cea6af63e667d87ba1ca4f8cd7cb4dfca678e4c55fc1cedb320760e39dd0"
- ],
- "index": "pypi",
- "version": "==3.0.2"
- },
- "azure-storage-blob": {
- "hashes": [
- "sha256:a8e91a51d4f62d11127c7fd8ba0077385c5b11022f0269f8a2a71b9fc36bef31",
- "sha256:b90323aad60f207f9f90a0c4cf94c10acc313c20b39403398dfba51f25f7b454"
- ],
- "index": "pypi",
- "version": "==2.1.0"
- },
- "azure-storage-common": {
- "hashes": [
- "sha256:b01a491a18839b9d05a4fe3421458a0ddb5ab9443c14e487f40d16f9a1dc2fbe",
- "sha256:ccedef5c67227bc4d6670ffd37cec18fb529a1b7c3a5e53e4096eb0cf23dc73f"
- ],
- "index": "pypi",
- "version": "==2.1.0"
- },
- "azure-storage-nspkg": {
- "hashes": [
- "sha256:6f3bbe8652d5f542767d8433e7f96b8df7f518774055ac7c92ed7ca85f653811",
- "sha256:7da3bd6c73b8c464a57f53ae9af8328490d2267c66430d8a7621997e52a9703e"
- ],
- "index": "pypi",
- "version": "==3.1.0"
- },
"babel": {
"hashes": [
"sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9",
@@ -1315,27 +1093,13 @@
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
"version": "==2.9.1"
},
- "backcall": {
- "hashes": [
- "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e",
- "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"
- ],
- "version": "==0.2.0"
- },
"backports.entry-points-selectable": {
"hashes": [
- "sha256:988468260ec1c196dab6ae1149260e2f5472c9110334e5d51adcb77867361f6a",
- "sha256:a6d9a871cde5e15b4c4a53e3d43ba890cc6861ec1332c9c2428c92f977192acc"
+ "sha256:7fceed9532a7aa2bd888654a7314f864a3c16a4e710b34a58cfc0f08114c663b",
+ "sha256:914b21a479fde881635f7af5adc7f6e38d6b274be32269070c53b698c60d5386"
],
"markers": "python_version >= '2.7'",
- "version": "==1.1.0"
- },
- "backports.lzma": {
- "hashes": [
- "sha256:16d8b68e4d3cd4e6c9ddb059850452946da3914c8a8e197a7f2b0954559f2df4"
- ],
- "index": "pypi",
- "version": "==0.0.14"
+ "version": "==1.1.1"
},
"bcrypt": {
"hashes": [
@@ -1350,46 +1114,6 @@
"markers": "python_version >= '3.6'",
"version": "==3.2.0"
},
- "bidict": {
- "hashes": [
- "sha256:3ac67daa353ecf853a1df9d3e924f005e729227a60a8dbada31a4c31aba7f654",
- "sha256:42c84ffbe6f8de898af6073b4be9ea7ccedcd78d3474aa844c54e49d5a079f6f"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==0.21.4"
- },
- "bleach": {
- "hashes": [
- "sha256:0900d8b37eba61a802ee40ac0061f8c2b5dee29c1927dd1d233e075ebf5a71da",
- "sha256:4d2651ab93271d1129ac9cbc679f524565cc8a1b791909c4a51eac4446a15994"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==4.1.0"
- },
- "boto": {
- "hashes": [
- "sha256:147758d41ae7240dc989f0039f27da8ca0d53734be0eb869ef16e3adcfa462e8",
- "sha256:ea0d3b40a2d852767be77ca343b58a9e3a4b00d9db440efb8da74b4e58025e5a"
- ],
- "index": "pypi",
- "version": "==2.49.0"
- },
- "boto3": {
- "hashes": [
- "sha256:182a2b756a2c2180b473bc8452227062394a24e3701548be23ebc30d85976c64",
- "sha256:b9105554477978e80fda1103ff21ecf07502080667730e45383e1d3951c87954"
- ],
- "index": "pypi",
- "version": "==1.19.12"
- },
- "botocore": {
- "hashes": [
- "sha256:1d1094fb53ebe4535d8840fbd7c14aadb65bde7ff03a65f9a4f1d76bd03e16ff",
- "sha256:fc59b55e8c5dde64b017b2f114c25f8cce397b667e812aea7eafb4b59b49d7cb"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==1.22.12"
- },
"certifi": {
"hashes": [
"sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872",
@@ -1461,14 +1185,6 @@
"markers": "python_full_version >= '3.6.1'",
"version": "==3.3.1"
},
- "chardet": {
- "hashes": [
- "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa",
- "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"
- ],
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
- "version": "==4.0.0"
- },
"charset-normalizer": {
"hashes": [
"sha256:e019de665e2bcf9c2b64e2e5aa025fa991da8720daa3c1138cadd2fd1856aed0",
@@ -1477,22 +1193,6 @@
"markers": "python_version >= '3'",
"version": "==2.0.7"
},
- "click": {
- "hashes": [
- "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3",
- "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==8.0.3"
- },
- "colorama": {
- "hashes": [
- "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b",
- "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"
- ],
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
- "version": "==0.4.4"
- },
"control": {
"hashes": [
"sha256:34eeca077cf002a2f22a9334c8998ec5b3bcc0fdae2aac790a923cf8bc80245a"
@@ -1502,55 +1202,56 @@
},
"coverage": {
"hashes": [
- "sha256:0147f7833c41927d84f5af9219d9b32f875c0689e5e74ac8ca3cb61e73a698f9",
- "sha256:04a92a6cf9afd99f9979c61348ec79725a9f9342fb45e63c889e33c04610d97b",
- "sha256:10ab138b153e4cc408b43792cb7f518f9ee02f4ff55cd1ab67ad6fd7e9905c7e",
- "sha256:2e5b9c17a56b8bf0c0a9477fcd30d357deb486e4e1b389ed154f608f18556c8a",
- "sha256:326d944aad0189603733d646e8d4a7d952f7145684da973c463ec2eefe1387c2",
- "sha256:359a32515e94e398a5c0fa057e5887a42e647a9502d8e41165cf5cb8d3d1ca67",
- "sha256:35cd2230e1ed76df7d0081a997f0fe705be1f7d8696264eb508076e0d0b5a685",
- "sha256:3b270c6b48d3ff5a35deb3648028ba2643ad8434b07836782b1139cf9c66313f",
- "sha256:42a1fb5dee3355df90b635906bb99126faa7936d87dfc97eacc5293397618cb7",
- "sha256:479228e1b798d3c246ac89b09897ee706c51b3e5f8f8d778067f38db73ccc717",
- "sha256:4cd919057636f63ab299ccb86ea0e78b87812400c76abab245ca385f17d19fb5",
- "sha256:4d8b453764b9b26b0dd2afb83086a7c3f9379134e340288d2a52f8a91592394b",
- "sha256:51a441011a30d693e71dea198b2a6f53ba029afc39f8e2aeb5b77245c1b282ef",
- "sha256:557594a50bfe3fb0b1b57460f6789affe8850ad19c1acf2d14a3e12b2757d489",
- "sha256:572f917267f363101eec375c109c9c1118037c7cc98041440b5eabda3185ac7b",
- "sha256:62512c0ec5d307f56d86504c58eace11c1bc2afcdf44e3ff20de8ca427ca1d0e",
- "sha256:65ad3ff837c89a229d626b8004f0ee32110f9bfdb6a88b76a80df36ccc60d926",
- "sha256:666c6b32b69e56221ad1551d377f718ed00e6167c7a1b9257f780b105a101271",
- "sha256:6e994003e719458420e14ffb43c08f4c14990e20d9e077cb5cad7a3e419bbb54",
- "sha256:72bf437d54186d104388cbae73c9f2b0f8a3e11b6e8d7deb593bd14625c96026",
- "sha256:738e823a746841248b56f0f3bd6abf3b73af191d1fd65e4c723b9c456216f0ad",
- "sha256:78287731e3601ea5ce9d6468c82d88a12ef8fe625d6b7bdec9b45d96c1ad6533",
- "sha256:7833c872718dc913f18e51ee97ea0dece61d9930893a58b20b3daf09bb1af6b6",
- "sha256:7e083d32965d2eb6638a77e65b622be32a094fdc0250f28ce6039b0732fbcaa8",
- "sha256:8186b5a4730c896cbe1e4b645bdc524e62d874351ae50e1db7c3e9f5dc81dc26",
- "sha256:8605add58e6a960729aa40c0fd9a20a55909dd9b586d3e8104cc7f45869e4c6b",
- "sha256:977ce557d79577a3dd510844904d5d968bfef9489f512be65e2882e1c6eed7d8",
- "sha256:994ce5a7b3d20981b81d83618aa4882f955bfa573efdbef033d5632b58597ba9",
- "sha256:9ad5895938a894c368d49d8470fe9f519909e5ebc6b8f8ea5190bd0df6aa4271",
- "sha256:9eb0a1923354e0fdd1c8a6f53f5db2e6180d670e2b587914bf2e79fa8acfd003",
- "sha256:a00284dbfb53b42e35c7dd99fc0e26ef89b4a34efff68078ed29d03ccb28402a",
- "sha256:a11a2c019324fc111485e79d55907e7289e53d0031275a6c8daed30690bc50c0",
- "sha256:ab6a0fe4c96f8058d41948ddf134420d3ef8c42d5508b5a341a440cce7a37a1d",
- "sha256:b1d0a1bce919de0dd8da5cff4e616b2d9e6ebf3bd1410ff645318c3dd615010a",
- "sha256:b8e4f15b672c9156c1154249a9c5746e86ac9ae9edc3799ee3afebc323d9d9e0",
- "sha256:bbca34dca5a2d60f81326d908d77313816fad23d11b6069031a3d6b8c97a54f9",
- "sha256:bf656cd74ff7b4ed7006cdb2a6728150aaad69c7242b42a2a532f77b63ea233f",
- "sha256:c95257aa2ccf75d3d91d772060538d5fea7f625e48157f8ca44594f94d41cb33",
- "sha256:dc5023be1c2a8b0a0ab5e31389e62c28b2453eb31dd069f4b8d1a0f9814d951a",
- "sha256:e14bceb1f3ae8a14374be2b2d7bc12a59226872285f91d66d301e5f41705d4d6",
- "sha256:e3c4f5211394cd0bf6874ac5d29684a495f9c374919833dcfff0bd6d37f96201",
- "sha256:e76f017b6d4140a038c5ff12be1581183d7874e41f1c0af58ecf07748d36a336",
- "sha256:e7d5606b9240ed4def9cbdf35be4308047d11e858b9c88a6c26974758d6225ce",
- "sha256:f0f80e323a17af63eac6a9db0c9188c10f1fd815c3ab299727150cc0eb92c7a4",
- "sha256:fb2fa2f6506c03c48ca42e3fe5a692d7470d290c047ee6de7c0f3e5fa7639ac9",
- "sha256:ffa8fee2b1b9e60b531c4c27cf528d6b5d5da46b1730db1f4d6eee56ff282e07"
- ],
- "index": "pypi",
- "version": "==6.1.1"
+ "sha256:046647b96969fda1ae0605f61288635209dd69dcd27ba3ec0bf5148bc157f954",
+ "sha256:06d009e8a29483cbc0520665bc46035ffe9ae0e7484a49f9782c2a716e37d0a0",
+ "sha256:0cde7d9fe2fb55ff68ebe7fb319ef188e9b88e0a3d1c9c5db7dd829cd93d2193",
+ "sha256:1de9c6f5039ee2b1860b7bad2c7bc3651fbeb9368e4c4d93e98a76358cdcb052",
+ "sha256:24ed38ec86754c4d5a706fbd5b52b057c3df87901a8610d7e5642a08ec07087e",
+ "sha256:27a3df08a855522dfef8b8635f58bab81341b2fb5f447819bc252da3aa4cf44c",
+ "sha256:310c40bed6b626fd1f463e5a83dba19a61c4eb74e1ac0d07d454ebbdf9047e9d",
+ "sha256:3348865798c077c695cae00da0924136bb5cc501f236cfd6b6d9f7a3c94e0ec4",
+ "sha256:35b246ae3a2c042dc8f410c94bcb9754b18179cdb81ff9477a9089dbc9ecc186",
+ "sha256:3f546f48d5d80a90a266769aa613bc0719cb3e9c2ef3529d53f463996dd15a9d",
+ "sha256:586d38dfc7da4a87f5816b203ff06dd7c1bb5b16211ccaa0e9788a8da2b93696",
+ "sha256:5d3855d5d26292539861f5ced2ed042fc2aa33a12f80e487053aed3bcb6ced13",
+ "sha256:610c0ba11da8de3a753dc4b1f71894f9f9debfdde6559599f303286e70aeb0c2",
+ "sha256:62646d98cf0381ffda301a816d6ac6c35fc97aa81b09c4c52d66a15c4bef9d7c",
+ "sha256:66af99c7f7b64d050d37e795baadf515b4561124f25aae6e1baa482438ecc388",
+ "sha256:675adb3b3380967806b3cbb9c5b00ceb29b1c472692100a338730c1d3e59c8b9",
+ "sha256:6e5a8c947a2a89c56655ecbb789458a3a8e3b0cbf4c04250331df8f647b3de59",
+ "sha256:7a39590d1e6acf6a3c435c5d233f72f5d43b585f5be834cff1f21fec4afda225",
+ "sha256:80cb70264e9a1d04b519cdba3cd0dc42847bf8e982a4d55c769b9b0ee7cdce1e",
+ "sha256:82fdcb64bf08aa5db881db061d96db102c77397a570fbc112e21c48a4d9cb31b",
+ "sha256:8492d37acdc07a6eac6489f6c1954026f2260a85a4c2bb1e343fe3d35f5ee21a",
+ "sha256:94f558f8555e79c48c422045f252ef41eb43becdd945e9c775b45ebfc0cbd78f",
+ "sha256:958ac66272ff20e63d818627216e3d7412fdf68a2d25787b89a5c6f1eb7fdd93",
+ "sha256:95a58336aa111af54baa451c33266a8774780242cab3704b7698d5e514840758",
+ "sha256:96129e41405887a53a9cc564f960d7f853cc63d178f3a182fdd302e4cab2745b",
+ "sha256:97ef6e9119bd39d60ef7b9cd5deea2b34869c9f0b9777450a7e3759c1ab09b9b",
+ "sha256:98d44a8136eebbf544ad91fef5bd2b20ef0c9b459c65a833c923d9aa4546b204",
+ "sha256:9d2c2e3ce7b8cc932a2f918186964bd44de8c84e2f9ef72dc616f5bb8be22e71",
+ "sha256:a300b39c3d5905686c75a369d2a66e68fd01472ea42e16b38c948bd02b29e5bd",
+ "sha256:a34fccb45f7b2d890183a263578d60a392a1a218fdc12f5bce1477a6a68d4373",
+ "sha256:a4d48e42e17d3de212f9af44f81ab73b9378a4b2b8413fd708d0d9023f2bbde4",
+ "sha256:af45eea024c0e3a25462fade161afab4f0d9d9e0d5a5d53e86149f74f0a35ecc",
+ "sha256:ba6125d4e55c0b8e913dad27b22722eac7abdcb1f3eab1bd090eee9105660266",
+ "sha256:bc1ee1318f703bc6c971da700d74466e9b86e0c443eb85983fb2a1bd20447263",
+ "sha256:c18725f3cffe96732ef96f3de1939d81215fd6d7d64900dcc4acfe514ea4fcbf",
+ "sha256:c8e9c4bcaaaa932be581b3d8b88b677489975f845f7714efc8cce77568b6711c",
+ "sha256:cc799916b618ec9fd00135e576424165691fec4f70d7dc12cfaef09268a2478c",
+ "sha256:cd2d11a59afa5001ff28073ceca24ae4c506da4355aba30d1e7dd2bd0d2206dc",
+ "sha256:d0a595a781f8e186580ff8e3352dd4953b1944289bec7705377c80c7e36c4d6c",
+ "sha256:d3c5f49ce6af61154060640ad3b3281dbc46e2e0ef2fe78414d7f8a324f0b649",
+ "sha256:d9a635114b88c0ab462e0355472d00a180a5fbfd8511e7f18e4ac32652e7d972",
+ "sha256:e5432d9c329b11c27be45ee5f62cf20a33065d482c8dec1941d6670622a6fb8f",
+ "sha256:eab14fdd410500dae50fd14ccc332e65543e7b39f6fc076fe90603a0e5d2f929",
+ "sha256:ebcc03e1acef4ff44f37f3c61df478d6e469a573aa688e5a162f85d7e4c3860d",
+ "sha256:fae3fe111670e51f1ebbc475823899524e3459ea2db2cb88279bbfb2a0b8a3de",
+ "sha256:fd92ece726055e80d4e3f01fff3b91f54b18c9c357c48fcf6119e87e2461a091",
+ "sha256:ffa545230ca2ad921ad066bf8fd627e7be43716b6e0fcf8e32af1b8188ccb0ab"
+ ],
+ "index": "pypi",
+ "version": "==6.1.2"
},
"cryptography": {
"hashes": [
@@ -1586,57 +1287,6 @@
"markers": "python_version >= '3.6'",
"version": "==0.11.0"
},
- "datadog": {
- "hashes": [
- "sha256:140b51f5db3f46d6f3ec022c05830c6b3e13e4f62c19c823e1227ac322b26667",
- "sha256:7a6fac17a7d09f1883ab9a45ce4ff7a16aa1a5eb3cc4c6cddac7f8c53e7d1e9b"
- ],
- "index": "pypi",
- "version": "==0.42.0"
- },
- "debugpy": {
- "hashes": [
- "sha256:01e98c594b3e66d529e40edf314f849cd1a21f7a013298df58cd8e263bf8e184",
- "sha256:16db27b4b91991442f91d73604d32080b30de655aca9ba821b1972ea8171021b",
- "sha256:17a25ce9d7714f92fc97ef00cc06269d7c2b163094990ada30156ed31d9a5030",
- "sha256:194f95dd3e84568b5489aab5689a3a2c044e8fdc06f1890b8b4f70b6b89f2778",
- "sha256:1ec3a086e14bba6c472632025b8fe5bdfbaef2afa1ebd5c6615ce6ed8d89bc67",
- "sha256:23df67fc56d59e386c342428a7953c2c06cc226d8525b11319153e96afb65b0c",
- "sha256:26fbe53cca45a608679094791ce587b6e2798acd1d4777a8b303b07622e85182",
- "sha256:2b073ad5e8d8c488fbb6a116986858bab0c9c4558f28deb8832c7a5a27405bd6",
- "sha256:318f81f37341e4e054b4267d39896b73cddb3612ca13b39d7eea45af65165e1d",
- "sha256:3a457ad9c0059a21a6c7d563c1f18e924f5cf90278c722bd50ede6f56b77c7fe",
- "sha256:4404a62fb5332ea5c8c9132290eef50b3a0ba38cecacad5529e969a783bcbdd7",
- "sha256:5d76a4fd028d8009c3faf1185b4b78ceb2273dd2499447664b03939e0368bb90",
- "sha256:70b422c63a833630c33e3f9cdbd9b6971f8c5afd452697e464339a21bbe862ba",
- "sha256:82f5f9ce93af6861a0713f804e62ab390bb12a17f113153e47fea8bbb1dfbe36",
- "sha256:a2aa64f6d2ca7ded8a7e8a4e7cae3bc71866b09876b7b05cecad231779cb9156",
- "sha256:b2df2c373e85871086bd55271c929670cd4e1dba63e94a08d442db830646203b",
- "sha256:b5b3157372e0e0a1297a8b6b5280bcf1d35a40f436c7973771c972726d1e32d5",
- "sha256:d2b09e91fbd1efa4f4fda121d49af89501beda50c18ed7499712c71a4bf3452e",
- "sha256:d876db8c312eeb02d85611e0f696abe66a2c1515e6405943609e725d5ff36f2a",
- "sha256:f3a3dca9104aa14fd4210edcce6d9ce2b65bd9618c0b222135a40b9d6e2a9eeb",
- "sha256:f73988422b17f071ad3c4383551ace1ba5ed810cbab5f9c362783d22d40a08dc"
- ],
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
- "version": "==1.5.1"
- },
- "decorator": {
- "hashes": [
- "sha256:7b12e7c3c6ab203a29e157335e9122cb03de9ab7264b137594103fd4a683b374",
- "sha256:e59913af105b9860aa2c8d3272d9de5a56a4e608db9a2f167a8480b323d529a7"
- ],
- "markers": "python_version >= '3.5'",
- "version": "==5.1.0"
- },
- "defusedxml": {
- "hashes": [
- "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69",
- "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"
- ],
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
- "version": "==0.7.1"
- },
"dictdiffer": {
"hashes": [
"sha256:17bacf5fbfe613ccf1b6d512bd766e6b21fb798822a133aa86098b8ac9997578",
@@ -1660,22 +1310,6 @@
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
"version": "==0.17.1"
},
- "elasticsearch": {
- "hashes": [
- "sha256:1e9a6302945d98046899a7c9b3d345c881ac7b05ba176d3a49c9d2702b1e8bc8",
- "sha256:b728a3cdde3a4d3a93b9e92f0e7f0fe636226d236219913db32311ccaf8a9d16"
- ],
- "index": "pypi",
- "version": "==7.15.1"
- },
- "entrypoints": {
- "hashes": [
- "sha256:589f874b313739ad35be6e0cd7efde2a4e9b6fea91edcc34e58ecbb8dbe56d19",
- "sha256:c70dd71abe5a8c85e55e12c19bd91ccfeec11a6e99044204511f9ed547d48451"
- ],
- "markers": "python_version >= '2.7'",
- "version": "==0.3"
- },
"fastcluster": {
"hashes": [
"sha256:181af434d47c0628a98182f6d1483d0fd1da2a65ed4acd5f04f9bd1038098e63",
@@ -1701,240 +1335,19 @@
},
"filelock": {
"hashes": [
- "sha256:7afc856f74fa7006a289fd10fa840e1eebd8bbff6bffb69c26c54a0512ea8cf8",
- "sha256:bb2a1c717df74c48a2d00ed625e5a66f8572a3a30baacb7657add1d7bac4097b"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==3.3.2"
- },
- "flask": {
- "hashes": [
- "sha256:7b2fb8e934ddd50731893bdcdb00fc8c0315916f9fcd50d22c7cc1a95ab634e2",
- "sha256:cb90f62f1d8e4dc4621f52106613488b5ba826b2e1e10a33eac92f723093ab6a"
- ],
- "index": "pypi",
- "version": "==2.0.2"
- },
- "flask-cors": {
- "hashes": [
- "sha256:74efc975af1194fc7891ff5cd85b0f7478be4f7f59fe158102e91abb72bb4438",
- "sha256:b60839393f3b84a0f3746f6cdca56c1ad7426aa738b70d6c61375857823181de"
- ],
- "index": "pypi",
- "version": "==3.0.10"
- },
- "flask-socketio": {
- "hashes": [
- "sha256:07e1899e3b4851978b2ac8642080156c6294f8d0fc5212b4e4bcca713830306a",
- "sha256:1efdaacc7a26e94f2b197a80079b1058f6aa644a6094c0a322349e2b9c41f6b1"
- ],
- "index": "pypi",
- "version": "==5.1.1"
- },
- "frozenlist": {
- "hashes": [
- "sha256:01d79515ed5aa3d699b05f6bdcf1fe9087d61d6b53882aa599a10853f0479c6c",
- "sha256:0a7c7cce70e41bc13d7d50f0e5dd175f14a4f1837a8549b0936ed0cbe6170bf9",
- "sha256:11ff401951b5ac8c0701a804f503d72c048173208490c54ebb8d7bb7c07a6d00",
- "sha256:14a5cef795ae3e28fb504b73e797c1800e9249f950e1c964bb6bdc8d77871161",
- "sha256:16eef427c51cb1203a7c0ab59d1b8abccaba9a4f58c4bfca6ed278fc896dc193",
- "sha256:16ef7dd5b7d17495404a2e7a49bac1bc13d6d20c16d11f4133c757dd94c4144c",
- "sha256:181754275d5d32487431a0a29add4f897968b7157204bc1eaaf0a0ce80c5ba7d",
- "sha256:1cf63243bc5f5c19762943b0aa9e0d3fb3723d0c514d820a18a9b9a5ef864315",
- "sha256:1cfe6fef507f8bac40f009c85c7eddfed88c1c0d38c75e72fe10476cef94e10f",
- "sha256:1fef737fd1388f9b93bba8808c5f63058113c10f4e3c0763ced68431773f72f9",
- "sha256:25b358aaa7dba5891b05968dd539f5856d69f522b6de0bf34e61f133e077c1a4",
- "sha256:26f602e380a5132880fa245c92030abb0fc6ff34e0c5500600366cedc6adb06a",
- "sha256:28e164722ea0df0cf6d48c4d5bdf3d19e87aaa6dfb39b0ba91153f224b912020",
- "sha256:2de5b931701257d50771a032bba4e448ff958076380b049fd36ed8738fdb375b",
- "sha256:3457f8cf86deb6ce1ba67e120f1b0128fcba1332a180722756597253c465fc1d",
- "sha256:351686ca020d1bcd238596b1fa5c8efcbc21bffda9d0efe237aaa60348421e2a",
- "sha256:406aeb340613b4b559db78d86864485f68919b7141dec82aba24d1477fd2976f",
- "sha256:41de4db9b9501679cf7cddc16d07ac0f10ef7eb58c525a1c8cbff43022bddca4",
- "sha256:41f62468af1bd4e4b42b5508a3fe8cc46a693f0cdd0ca2f443f51f207893d837",
- "sha256:4766632cd8a68e4f10f156a12c9acd7b1609941525569dd3636d859d79279ed3",
- "sha256:47b2848e464883d0bbdcd9493c67443e5e695a84694efff0476f9059b4cb6257",
- "sha256:4a495c3d513573b0b3f935bfa887a85d9ae09f0627cf47cad17d0cc9b9ba5c38",
- "sha256:4ad065b2ebd09f32511ff2be35c5dfafee6192978b5a1e9d279a5c6e121e3b03",
- "sha256:4c457220468d734e3077580a3642b7f682f5fd9507f17ddf1029452450912cdc",
- "sha256:4f52d0732e56906f8ddea4bd856192984650282424049c956857fed43697ea43",
- "sha256:54a1e09ab7a69f843cd28fefd2bcaf23edb9e3a8d7680032c8968b8ac934587d",
- "sha256:5a72eecf37eface331636951249d878750db84034927c997d47f7f78a573b72b",
- "sha256:5df31bb2b974f379d230a25943d9bf0d3bc666b4b0807394b131a28fca2b0e5f",
- "sha256:66a518731a21a55b7d3e087b430f1956a36793acc15912e2878431c7aec54210",
- "sha256:6790b8d96bbb74b7a6f4594b6f131bd23056c25f2aa5d816bd177d95245a30e3",
- "sha256:68201be60ac56aff972dc18085800b6ee07973c49103a8aba669dee3d71079de",
- "sha256:6e105013fa84623c057a4381dc8ea0361f4d682c11f3816cc80f49a1f3bc17c6",
- "sha256:705c184b77565955a99dc360f359e8249580c6b7eaa4dc0227caa861ef46b27a",
- "sha256:72cfbeab7a920ea9e74b19aa0afe3b4ad9c89471e3badc985d08756efa9b813b",
- "sha256:735f386ec522e384f511614c01d2ef9cf799f051353876b4c6fb93ef67a6d1ee",
- "sha256:82d22f6e6f2916e837c91c860140ef9947e31194c82aaeda843d6551cec92f19",
- "sha256:83334e84a290a158c0c4cc4d22e8c7cfe0bba5b76d37f1c2509dabd22acafe15",
- "sha256:84e97f59211b5b9083a2e7a45abf91cfb441369e8bb6d1f5287382c1c526def3",
- "sha256:87521e32e18a2223311afc2492ef2d99946337da0779ddcda77b82ee7319df59",
- "sha256:878ebe074839d649a1cdb03a61077d05760624f36d196884a5cafb12290e187b",
- "sha256:89fdfc84c6bf0bff2ff3170bb34ecba8a6911b260d318d377171429c4be18c73",
- "sha256:8b4c7665a17c3a5430edb663e4ad4e1ad457614d1b2f2b7f87052e2ef4fa45ca",
- "sha256:8b54cdd2fda15467b9b0bfa78cee2ddf6dbb4585ef23a16e14926f4b076dfae4",
- "sha256:94728f97ddf603d23c8c3dd5cae2644fa12d33116e69f49b1644a71bb77b89ae",
- "sha256:954b154a4533ef28bd3e83ffdf4eadf39deeda9e38fb8feaf066d6069885e034",
- "sha256:977a1438d0e0d96573fd679d291a1542097ea9f4918a8b6494b06610dfeefbf9",
- "sha256:9ade70aea559ca98f4b1b1e5650c45678052e76a8ab2f76d90f2ac64180215a2",
- "sha256:9b6e21e5770df2dea06cb7b6323fbc008b13c4a4e3b52cb54685276479ee7676",
- "sha256:a0d3ffa8772464441b52489b985d46001e2853a3b082c655ec5fad9fb6a3d618",
- "sha256:a37594ad6356e50073fe4f60aa4187b97d15329f2138124d252a5a19c8553ea4",
- "sha256:a8d86547a5e98d9edd47c432f7a14b0c5592624b496ae9880fb6332f34af1edc",
- "sha256:aa44c4740b4e23fcfa259e9dd52315d2b1770064cde9507457e4c4a65a04c397",
- "sha256:acc4614e8d1feb9f46dd829a8e771b8f5c4b1051365d02efb27a3229048ade8a",
- "sha256:af2a51c8a381d76eabb76f228f565ed4c3701441ecec101dd18be70ebd483cfd",
- "sha256:b2ae2f5e9fa10805fb1c9adbfefaaecedd9e31849434be462c3960a0139ed729",
- "sha256:b46f997d5ed6d222a863b02cdc9c299101ee27974d9bbb2fd1b3c8441311c408",
- "sha256:bc93f5f62df3bdc1f677066327fc81f92b83644852a31c6aa9b32c2dde86ea7d",
- "sha256:bfbaa08cf1452acad9cb1c1d7b89394a41e712f88df522cea1a0f296b57782a0",
- "sha256:c1e8e9033d34c2c9e186e58279879d78c94dd365068a3607af33f2bc99357a53",
- "sha256:c5328ed53fdb0a73c8a50105306a3bc013e5ca36cca714ec4f7bd31d38d8a97f",
- "sha256:c6a9d84ee6427b65a81fc24e6ef589cb794009f5ca4150151251c062773e7ed2",
- "sha256:c98d3c04701773ad60d9545cd96df94d955329efc7743fdb96422c4b669c633b",
- "sha256:cb3957c39668d10e2b486acc85f94153520a23263b6401e8f59422ef65b9520d",
- "sha256:e63ad0beef6ece06475d29f47d1f2f29727805376e09850ebf64f90777962792",
- "sha256:e74f8b4d8677ebb4015ac01fcaf05f34e8a1f22775db1f304f497f2f88fdc697",
- "sha256:e7d0dd3e727c70c2680f5f09a0775525229809f1a35d8552b92ff10b2b14f2c2",
- "sha256:ec6cf345771cdb00791d271af9a0a6fbfc2b6dd44cb753f1eeaa256e21622adb",
- "sha256:ed58803563a8c87cf4c0771366cf0ad1aa265b6b0ae54cbbb53013480c7ad74d",
- "sha256:f0081a623c886197ff8de9e635528fd7e6a387dccef432149e25c13946cb0cd0",
- "sha256:f025f1d6825725b09c0038775acab9ae94264453a696cc797ce20c0769a7b367",
- "sha256:f5f3b2942c3b8b9bfe76b408bbaba3d3bb305ee3693e8b1d631fe0a0d4f93673",
- "sha256:fbd4844ff111449f3bbe20ba24fbb906b5b1c2384d0f3287c9f7da2354ce6d23"
+ "sha256:2e139a228bcf56dd8b2274a65174d005c4a6b68540ee0bdbb92c76f43f29f7e8",
+ "sha256:93d512b32a23baf4cac44ffd72ccf70732aeff7b8050fcaf6d3ec406d954baf4"
],
"markers": "python_version >= '3.6'",
- "version": "==1.2.0"
- },
- "ft4222": {
- "hashes": [
- "sha256:03faa3f02e260e9b14c34d39dcde9b78c98bc9fc443362b5bbbc25b69c46db0a",
- "sha256:045ad976d3d45b82091484c0aa9c796edfed3b1fee867748c182d84dc8824cc1",
- "sha256:22e81b897103a27dc750b3cfe7381a03264d1167b576da2167a7f2f96bd851d7",
- "sha256:295571f5fe9a8934733396184b67b5e0acadcf8d8461b9c8d6ddef46cc9a0764",
- "sha256:4edae5040de78dc0fc7339e1f6b1c0098031d3c8fde356d23af79f264dec3954",
- "sha256:53f2e92ef231813594e9c3f75f9ed9b0c1392cd0a14341afc46327b48ccdbfb9",
- "sha256:646986616a0f86f990956b756d3ef747c1acf30576d5c47f36d735d0e3f930a1",
- "sha256:652d1041f9d23a29d856857cbbc8c471af66582693aa35fc6962f214666b2db5",
- "sha256:66268671f263a9a65cf163ef6d711afad2eaa1cedafe85f851d5d7538e2ee4bf",
- "sha256:6bf1c0c23eb3e8cd85b30651536f995783330782b1d3b294b9d82a0ddda27645",
- "sha256:8951cc546425840fd6d271aa70c51997fa4e673a0bf32e2d2767edd3d6df5d76",
- "sha256:8aa62413cdd6f6f059c2b5bd14eb02b97911d3cfb674cc975435d5c3e8554975",
- "sha256:99a1a832e132135dc98d286f1ba063cbd34a9caecd15500834bcb2674de60c66",
- "sha256:9c883fe2501013ee41a91116599187e25a6c62c33ad244c2423498512f56ab7a",
- "sha256:9ec3cd7f18af44f3fee7b66f3c7bf3584eab605cb1634898a90d14c6fa41811a",
- "sha256:9fa18401fb903b91cc5456f81a07be318670f51aa61220dd4a1bf88041c780ac",
- "sha256:c5563cfd4c581d9f20e488b0312304f1f325d6dadaa953469b10c4e628c53614",
- "sha256:f0526054a4b1e36a6c134e6d8a2b7846719446ded8d6ec9cd350c49a458f884c",
- "sha256:f1505475010ff96b784c92169a5d6fbaf5db658fcd07e30b8dae89b090537587"
- ],
- "index": "pypi",
- "version": "==1.3.0"
- },
- "future": {
- "hashes": [
- "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d"
- ],
- "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'",
- "version": "==0.18.2"
- },
- "geoalchemy2": {
- "hashes": [
- "sha256:2e3323a8442d4b1f8de69106315c17d8ce729fc127a38a5d7e2b53e1a19b9dd5",
- "sha256:b0e56d4a945bdc0f8fa9edd50ecc912889ea68e0e3558a19160dcb0d5b1b65fc"
- ],
- "index": "pypi",
- "version": "==0.9.4"
- },
- "git-pylint-commit-hook": {
- "hashes": [
- "sha256:e1d39e7856b3ef0a0269121ca210dc3f5a97da158b322411e8e1185918a91b3c"
- ],
- "index": "pypi",
- "version": "==2.5.1"
- },
- "greenlet": {
- "hashes": [
- "sha256:00e44c8afdbe5467e4f7b5851be223be68adb4272f44696ee71fe46b7036a711",
- "sha256:013d61294b6cd8fe3242932c1c5e36e5d1db2c8afb58606c5a67efce62c1f5fd",
- "sha256:049fe7579230e44daef03a259faa24511d10ebfa44f69411d99e6a184fe68073",
- "sha256:14d4f3cd4e8b524ae9b8aa567858beed70c392fdec26dbdb0a8a418392e71708",
- "sha256:166eac03e48784a6a6e0e5f041cfebb1ab400b394db188c48b3a84737f505b67",
- "sha256:17ff94e7a83aa8671a25bf5b59326ec26da379ace2ebc4411d690d80a7fbcf23",
- "sha256:1e12bdc622676ce47ae9abbf455c189e442afdde8818d9da983085df6312e7a1",
- "sha256:21915eb821a6b3d9d8eefdaf57d6c345b970ad722f856cd71739493ce003ad08",
- "sha256:288c6a76705dc54fba69fbcb59904ae4ad768b4c768839b8ca5fdadec6dd8cfd",
- "sha256:32ca72bbc673adbcfecb935bb3fb1b74e663d10a4b241aaa2f5a75fe1d1f90aa",
- "sha256:356b3576ad078c89a6107caa9c50cc14e98e3a6c4874a37c3e0273e4baf33de8",
- "sha256:40b951f601af999a8bf2ce8c71e8aaa4e8c6f78ff8afae7b808aae2dc50d4c40",
- "sha256:572e1787d1460da79590bf44304abbc0a2da944ea64ec549188fa84d89bba7ab",
- "sha256:58df5c2a0e293bf665a51f8a100d3e9956febfbf1d9aaf8c0677cf70218910c6",
- "sha256:64e6175c2e53195278d7388c454e0b30997573f3f4bd63697f88d855f7a6a1fc",
- "sha256:7227b47e73dedaa513cdebb98469705ef0d66eb5a1250144468e9c3097d6b59b",
- "sha256:7418b6bfc7fe3331541b84bb2141c9baf1ec7132a7ecd9f375912eca810e714e",
- "sha256:7cbd7574ce8e138bda9df4efc6bf2ab8572c9aff640d8ecfece1b006b68da963",
- "sha256:7ff61ff178250f9bb3cd89752df0f1dd0e27316a8bd1465351652b1b4a4cdfd3",
- "sha256:833e1551925ed51e6b44c800e71e77dacd7e49181fdc9ac9a0bf3714d515785d",
- "sha256:8639cadfda96737427330a094476d4c7a56ac03de7265622fcf4cfe57c8ae18d",
- "sha256:8c790abda465726cfb8bb08bd4ca9a5d0a7bd77c7ac1ca1b839ad823b948ea28",
- "sha256:8d2f1fb53a421b410751887eb4ff21386d119ef9cde3797bf5e7ed49fb51a3b3",
- "sha256:903bbd302a2378f984aef528f76d4c9b1748f318fe1294961c072bdc7f2ffa3e",
- "sha256:93f81b134a165cc17123626ab8da2e30c0455441d4ab5576eed73a64c025b25c",
- "sha256:95e69877983ea39b7303570fa6760f81a3eec23d0e3ab2021b7144b94d06202d",
- "sha256:9633b3034d3d901f0a46b7939f8c4d64427dfba6bbc5a36b1a67364cf148a1b0",
- "sha256:97e5306482182170ade15c4b0d8386ded995a07d7cc2ca8f27958d34d6736497",
- "sha256:9f3cba480d3deb69f6ee2c1825060177a22c7826431458c697df88e6aeb3caee",
- "sha256:aa5b467f15e78b82257319aebc78dd2915e4c1436c3c0d1ad6f53e47ba6e2713",
- "sha256:abb7a75ed8b968f3061327c433a0fbd17b729947b400747c334a9c29a9af6c58",
- "sha256:aec52725173bd3a7b56fe91bc56eccb26fbdff1386ef123abb63c84c5b43b63a",
- "sha256:b11548073a2213d950c3f671aa88e6f83cda6e2fb97a8b6317b1b5b33d850e06",
- "sha256:b1692f7d6bc45e3200844be0dba153612103db241691088626a33ff1f24a0d88",
- "sha256:b92e29e58bef6d9cfd340c72b04d74c4b4e9f70c9fa7c78b674d1fec18896dc4",
- "sha256:be5f425ff1f5f4b3c1e33ad64ab994eed12fc284a6ea71c5243fd564502ecbe5",
- "sha256:dd0b1e9e891f69e7675ba5c92e28b90eaa045f6ab134ffe70b52e948aa175b3c",
- "sha256:e30f5ea4ae2346e62cedde8794a56858a67b878dd79f7df76a0767e356b1744a",
- "sha256:e6a36bb9474218c7a5b27ae476035497a6990e21d04c279884eb10d9b290f1b1",
- "sha256:e859fcb4cbe93504ea18008d1df98dee4f7766db66c435e4882ab35cf70cac43",
- "sha256:eb6ea6da4c787111adf40f697b4e58732ee0942b5d3bd8f435277643329ba627",
- "sha256:ec8c433b3ab0419100bd45b47c9c8551248a5aee30ca5e9d399a0b57ac04651b",
- "sha256:eff9d20417ff9dcb0d25e2defc2574d10b491bf2e693b4e491914738b7908168",
- "sha256:f0214eb2a23b85528310dad848ad2ac58e735612929c8072f6093f3585fd342d",
- "sha256:f276df9830dba7a333544bd41070e8175762a7ac20350786b322b714b0e654f5",
- "sha256:f3acda1924472472ddd60c29e5b9db0cec629fbe3c5c5accb74d6d6d14773478",
- "sha256:f70a9e237bb792c7cc7e44c531fd48f5897961701cdaa06cf22fc14965c496cf",
- "sha256:f9d29ca8a77117315101425ec7ec2a47a22ccf59f5593378fc4077ac5b754fce",
- "sha256:fa877ca7f6b48054f847b61d6fa7bed5cebb663ebc55e018fda12db09dcc664c",
- "sha256:fdcec0b8399108577ec290f55551d926d9a1fa6cad45882093a7a07ac5ec147b"
- ],
- "markers": "python_version >= '3' and platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32')))))",
- "version": "==1.1.2"
- },
- "gunicorn": {
- "hashes": [
- "sha256:9dcc4547dbb1cb284accfb15ab5667a0e5d1881cc443e0677b4882a4067a807e",
- "sha256:e0a968b5ba15f8a328fdfd7ab1fcb5af4470c28aaf7e55df02a99bc13138e6e8"
- ],
- "index": "pypi",
- "version": "==20.1.0"
+ "version": "==3.4.0"
},
- "h5py": {
+ "fonttools": {
"hashes": [
- "sha256:320f5810e058dcea73529dc98ae42263d34004bcc9209d7bf44eac5136716c3f",
- "sha256:3f9518c37a8b9cd067927a8cbc6fe96846d5d28c32e10baf49c8a1d012c9b0a6",
- "sha256:40fe8572511c317ec7598271b5dce9c25957cc373af733e53ea246bbf0244958",
- "sha256:77c7be4001ac7d3ed80477de5b6942501d782de1bbe4886597bdfec2a7ab821f",
- "sha256:834a53178fc558c9832081fd18bc22f6f2585edcc06c802adfa4afb07ff884b4",
- "sha256:c99329ebe346a73bd13bf3fc3d54ee9421f6ee00de6ea085c64a856a9acee7b3",
- "sha256:cdff848353e2d20d5f66535957595c79932851f51e496623a96186d02ba0cf30",
- "sha256:d15e1556ff9591b3f3d8c7b3b66085f3867e5500528663bf11c499ab71c9c6b6",
- "sha256:f75d7bdaba8d3537490b0f53adcd043991ada3597f88e772969172c45145a8f6",
- "sha256:fc763e707aa631fdc200878c7b5c13ea5b5d1f9772696871dcd6f0f5932fcd35"
+ "sha256:68071406009e7ef6a5fdcd85d95975cd6963867bb226f2b786bfffe15d1959ef",
+ "sha256:8c8f84131bf04f3b1dcf99b9763cec35c347164ab6ad006e18d2f99fcab05529"
],
- "index": "pypi",
- "version": "==3.5.0"
+ "markers": "python_version >= '3.7'",
+ "version": "==4.28.1"
},
"hexdump": {
"hashes": [
@@ -1943,29 +1356,21 @@
"index": "pypi",
"version": "==3.3"
},
- "humanfriendly": {
- "hashes": [
- "sha256:332da98c24cc150efcc91b5508b19115209272bfdf4b0764a56795932f854271",
- "sha256:f7dba53ac7935fd0b4a2fc9a29e316ddd9ea135fb3052d3d0279d10c18ff9c48"
- ],
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
- "version": "==9.2"
- },
"hypothesis": {
"hashes": [
- "sha256:4030f88ae0a8d3339a41dd7589c78d3ba0a3a270f729c12aceddaea7c60b224b",
- "sha256:f6b7b3b693fe00121a6c9edc04bedf6c48a75ea5ab02251e6023c4357a5369a5"
+ "sha256:8f7318839b64bae1410704933fe01f3db5f80f20f2ba8d4ea3520443ae3a001d",
+ "sha256:f1627022f75306c653115fbd169ba6a4322804f60533a7b46625fd0eecba43d5"
],
"index": "pypi",
- "version": "==6.24.2"
+ "version": "==6.24.5"
},
"identify": {
"hashes": [
- "sha256:4de55a93e0ba72bf917c840b3794eb1055a67272a1732351c557c88ec42011b1",
- "sha256:595283a1c3a078ac5774ad4dc4d1bdd0c1602f60bcf11ae673b64cb2b1945762"
+ "sha256:4f85f9bd8e6e5e2d61b2f8de5ff5313d8a1cfac4c88822d74406de45ad10bd82",
+ "sha256:8cb609a671d2f861ae7fe583711a43fd2faab0c892f39cbc4568b0c51b354238"
],
"markers": "python_full_version >= '3.6.1'",
- "version": "==2.3.4"
+ "version": "==2.3.6"
},
"idna": {
"hashes": [
@@ -1975,29 +1380,13 @@
"markers": "python_version >= '3'",
"version": "==3.3"
},
- "imageio": {
- "hashes": [
- "sha256:469c59fe71c81cdc41c84f842d62dd2739a08fac8cb85f5a518a92a6227e2ed6",
- "sha256:93ee376a8dc96182ead8d773c3ac2becf79c6f2b93d38f31d7ac036c62a6c72e"
- ],
- "index": "pypi",
- "version": "==2.10.3"
- },
"imagesize": {
"hashes": [
- "sha256:6965f19a6a2039c7d48bca7dba2473069ff854c36ae6f19d2cde309d998228a1",
- "sha256:b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1"
+ "sha256:1db2f82529e53c3e929e8926a1fa9235aa82d0bd0c580359c67ec31b2fddaa8c",
+ "sha256:cd1750d452385ca327479d45b64d9c7729ecf0b3969a58148298c77092261f9d"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
- "version": "==1.2.0"
- },
- "importlib-resources": {
- "hashes": [
- "sha256:33a95faed5fc19b4bc16b29a6eeae248a3fe69dd55d4d229d2b480e23eeaad45",
- "sha256:d756e2f85dd4de2ba89be0b21dba2a3bbec2e871a42a3a16719258a11f87506b"
- ],
- "markers": "python_version < '3.9'",
- "version": "==5.4.0"
+ "version": "==1.3.0"
},
"inputs": {
"hashes": [
@@ -2007,287 +1396,72 @@
"index": "pypi",
"version": "==0.5"
},
- "ipykernel": {
+ "jinja2": {
"hashes": [
- "sha256:299795cca2c4aed7e233e3ad5360e1c73627fd0dcec11a9e75d5b2df43629353",
- "sha256:f43de132feea90f86d68c51013afe9694f9415f440053ec9909dd656c75b04b5"
+ "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8",
+ "sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7"
],
"index": "pypi",
- "version": "==6.5.0"
+ "version": "==3.0.3"
},
- "ipython": {
+ "kiwisolver": {
"hashes": [
- "sha256:4f69d7423a5a1972f6347ff233e38bbf4df6a150ef20fbb00c635442ac3060aa",
- "sha256:a658beaf856ce46bc453366d5dc6b2ddc6c481efd3540cb28aa3943819caac9f"
+ "sha256:0007840186bacfaa0aba4466d5890334ea5938e0bb7e28078a0eb0e63b5b59d5",
+ "sha256:19554bd8d54cf41139f376753af1a644b63c9ca93f8f72009d50a2080f870f77",
+ "sha256:1d45d1c74f88b9f41062716c727f78f2a59a5476ecbe74956fafb423c5c87a76",
+ "sha256:1d819553730d3c2724582124aee8a03c846ec4362ded1034c16fb3ef309264e6",
+ "sha256:2210f28778c7d2ee13f3c2a20a3a22db889e75f4ec13a21072eabb5693801e84",
+ "sha256:22521219ca739654a296eea6d4367703558fba16f98688bd8ce65abff36eaa84",
+ "sha256:25405f88a37c5f5bcba01c6e350086d65e7465fd1caaf986333d2a045045a223",
+ "sha256:2b65bd35f3e06a47b5c30ea99e0c2b88f72c6476eedaf8cfbc8e66adb5479dcf",
+ "sha256:2ddb500a2808c100e72c075cbb00bf32e62763c82b6a882d403f01a119e3f402",
+ "sha256:2f8f6c8f4f1cff93ca5058d6ec5f0efda922ecb3f4c5fb76181f327decff98b8",
+ "sha256:30fa008c172355c7768159983a7270cb23838c4d7db73d6c0f6b60dde0d432c6",
+ "sha256:3dbb3cea20b4af4f49f84cffaf45dd5f88e8594d18568e0225e6ad9dec0e7967",
+ "sha256:4116ba9a58109ed5e4cb315bdcbff9838f3159d099ba5259c7c7fb77f8537492",
+ "sha256:44e6adf67577dbdfa2d9f06db9fbc5639afefdb5bf2b4dfec25c3a7fbc619536",
+ "sha256:5326ddfacbe51abf9469fe668944bc2e399181a2158cb5d45e1d40856b2a0589",
+ "sha256:70adc3658138bc77a36ce769f5f183169bc0a2906a4f61f09673f7181255ac9b",
+ "sha256:72be6ebb4e92520b9726d7146bc9c9b277513a57a38efcf66db0620aec0097e0",
+ "sha256:7843b1624d6ccca403a610d1277f7c28ad184c5aa88a1750c1a999754e65b439",
+ "sha256:7ba5a1041480c6e0a8b11a9544d53562abc2d19220bfa14133e0cdd9967e97af",
+ "sha256:80efd202108c3a4150e042b269f7c78643420cc232a0a771743bb96b742f838f",
+ "sha256:82f49c5a79d3839bc8f38cb5f4bfc87e15f04cbafa5fbd12fb32c941cb529cfb",
+ "sha256:83d2c9db5dfc537d0171e32de160461230eb14663299b7e6d18ca6dca21e4977",
+ "sha256:8d93a1095f83e908fc253f2fb569c2711414c0bfd451cab580466465b235b470",
+ "sha256:8dc3d842fa41a33fe83d9f5c66c0cc1f28756530cd89944b63b072281e852031",
+ "sha256:9661a04ca3c950a8ac8c47f53cbc0b530bce1b52f516a1e87b7736fec24bfff0",
+ "sha256:a498bcd005e8a3fedd0022bb30ee0ad92728154a8798b703f394484452550507",
+ "sha256:a7a4cf5bbdc861987a7745aed7a536c6405256853c94abc9f3287c3fa401b174",
+ "sha256:b5074fb09429f2b7bc82b6fb4be8645dcbac14e592128beeff5461dcde0af09f",
+ "sha256:b6a5431940f28b6de123de42f0eb47b84a073ee3c3345dc109ad550a3307dd28",
+ "sha256:ba677bcaff9429fd1bf01648ad0901cea56c0d068df383d5f5856d88221fe75b",
+ "sha256:bcadb05c3d4794eb9eee1dddf1c24215c92fb7b55a80beae7a60530a91060560",
+ "sha256:bf7eb45d14fc036514c09554bf983f2a72323254912ed0c3c8e697b62c4c158f",
+ "sha256:c358721aebd40c243894298f685a19eb0491a5c3e0b923b9f887ef1193ddf829",
+ "sha256:c4550a359c5157aaf8507e6820d98682872b9100ce7607f8aa070b4b8af6c298",
+ "sha256:c6572c2dab23c86a14e82c245473d45b4c515314f1f859e92608dcafbd2f19b8",
+ "sha256:cba430db673c29376135e695c6e2501c44c256a81495da849e85d1793ee975ad",
+ "sha256:dedc71c8eb9c5096037766390172c34fb86ef048b8e8958b4e484b9e505d66bc",
+ "sha256:e6f5eb2f53fac7d408a45fbcdeda7224b1cfff64919d0f95473420a931347ae9",
+ "sha256:ec2eba188c1906b05b9b49ae55aae4efd8150c61ba450e6721f64620c50b59eb",
+ "sha256:ee040a7de8d295dbd261ef2d6d3192f13e2b08ec4a954de34a6fb8ff6422e24c",
+ "sha256:eedd3b59190885d1ebdf6c5e0ca56828beb1949b4dfe6e5d0256a461429ac386",
+ "sha256:f441422bb313ab25de7b3dbfd388e790eceb76ce01a18199ec4944b369017009",
+ "sha256:f8eb7b6716f5b50e9c06207a14172cf2de201e41912ebe732846c02c830455b9",
+ "sha256:fc4453705b81d03568d5b808ad8f09c77c47534f6ac2e72e733f9ca4714aa75c"
],
- "index": "pypi",
- "version": "==7.29.0"
+ "markers": "python_version >= '3.7'",
+ "version": "==1.3.2"
},
- "ipython-genutils": {
+ "lru-dict": {
"hashes": [
- "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8",
- "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"
+ "sha256:45b81f67d75341d4433abade799a47e9c42a9e22a118531dcb5e549864032d7c"
],
- "version": "==0.2.0"
+ "index": "pypi",
+ "version": "==1.1.7"
},
- "ipywidgets": {
- "hashes": [
- "sha256:00974f7cb4d5f8d494c19810fedb9fa9b64bffd3cda7c2be23c133a1ad3c99c5",
- "sha256:d258f582f915c62ea91023299603be095de19afb5ee271698f88327b9fe9bf43"
- ],
- "version": "==7.6.5"
- },
- "isort": {
- "hashes": [
- "sha256:1a18ccace2ed8910bd9458b74a3ecbafd7b2f581301b0ab65cfdd4338272d76f",
- "sha256:e52ff6d38012b131628cf0f26c51e7bd3a7c81592eefe3ac71411e692f1b9345"
- ],
- "markers": "python_version < '4' and python_full_version >= '3.6.1'",
- "version": "==5.10.0"
- },
- "itsdangerous": {
- "hashes": [
- "sha256:5174094b9637652bdb841a3029700391451bd092ba3db90600dea710ba28e97c",
- "sha256:9e724d68fc22902a1435351f84c3fb8623f303fffcc566a4cb952df8c572cff0"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==2.0.1"
- },
- "jedi": {
- "hashes": [
- "sha256:18456d83f65f400ab0c2d3319e48520420ef43b23a086fdc05dff34132f0fb93",
- "sha256:92550a404bad8afed881a137ec9a461fed49eca661414be45059329614ed0707"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==0.18.0"
- },
- "jinja2": {
- "hashes": [
- "sha256:827a0e32839ab1600d4eb1c4c33ec5a8edfbc5cb42dafa13b81f182f97784b45",
- "sha256:8569982d3f0889eed11dd620c706d39b60c36d6d25843961f33f77fb6bc6b20c"
- ],
- "index": "pypi",
- "version": "==3.0.2"
- },
- "jmespath": {
- "hashes": [
- "sha256:b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9",
- "sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f"
- ],
- "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'",
- "version": "==0.10.0"
- },
- "joblib": {
- "hashes": [
- "sha256:4158fcecd13733f8be669be0683b96ebdbbd38d23559f54dca7205aea1bf1e35",
- "sha256:f21f109b3c7ff9d95f8387f752d0d9c34a02aa2f7060c2135f465da0e5160ff6"
- ],
- "index": "pypi",
- "version": "==1.1.0"
- },
- "json-logging-py": {
- "hashes": [
- "sha256:118b1fe1f4eacaea6370e5b9710d0f6d0c0a4599aef9d5b9875a6a579974fc9a"
- ],
- "index": "pypi",
- "version": "==0.2"
- },
- "json5": {
- "hashes": [
- "sha256:823e510eb355949bed817e1f3e2d682455dc6af9daf6066d5698d6a2ca4481c2",
- "sha256:9175ad1bc248e22bb8d95a8e8d765958bf0008fef2fe8abab5bc04e0f1ac8302"
- ],
- "version": "==0.9.6"
- },
- "jsonschema": {
- "hashes": [
- "sha256:2a0f162822a64d95287990481b45d82f096e99721c86534f48201b64ebca6e8c",
- "sha256:390713469ae64b8a58698bb3cbc3859abe6925b565a973f87323ef21b09a27a8"
- ],
- "markers": "python_version >= '3.7'",
- "version": "==4.2.1"
- },
- "jupyter": {
- "hashes": [
- "sha256:3e1f86076bbb7c8c207829390305a2b1fe836d471ed54be66a3b8c41e7f46cc7",
- "sha256:5b290f93b98ffbc21c0c7e749f054b3267782166d72fa5e3ed1ed4eaf34a2b78",
- "sha256:d9dc4b3318f310e34c82951ea5d6683f67bed7def4b259fafbfe4f1beb1d8e5f"
- ],
- "index": "pypi",
- "version": "==1.0.0"
- },
- "jupyter-client": {
- "hashes": [
- "sha256:074bdeb1ffaef4a3095468ee16313938cfdc48fc65ca95cc18980b956c2e5d79",
- "sha256:8b6e06000eb9399775e0a55c52df6c1be4766666209c22f90c2691ded0e338dc"
- ],
- "markers": "python_full_version >= '3.6.1'",
- "version": "==7.0.6"
- },
- "jupyter-console": {
- "hashes": [
- "sha256:242248e1685039cd8bff2c2ecb7ce6c1546eb50ee3b08519729e6e881aec19c7",
- "sha256:7799c4ea951e0e96ba8260575423cb323ea5a03fcf5503560fa3e15748869e27"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==6.4.0"
- },
- "jupyter-core": {
- "hashes": [
- "sha256:1c091f3bbefd6f2a8782f2c1db662ca8478ac240e962ae2c66f0b87c818154ea",
- "sha256:dce8a7499da5a53ae3afd5a9f4b02e5df1d57250cf48f3ad79da23b4778cd6fa"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==4.9.1"
- },
- "jupyter-server": {
- "hashes": [
- "sha256:c1f32e0c1807ab2de37bf70af97a36b4436db0bc8af3124632b1f4441038bf95",
- "sha256:eb247b555f5bdfb4a219d78e86bc8769456a1a712d8e30a4dbe06e3fe7e8a278"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==1.11.2"
- },
- "jupyterlab": {
- "hashes": [
- "sha256:215dcbc2674bf1c74eca16b30eac49b882d41503c522ed337fb0053c89565ec8",
- "sha256:c970ed2e703831e02171d7bacae35b1e42a227b154bb3684a88ddf64167278bc"
- ],
- "index": "pypi",
- "version": "==3.2.2"
- },
- "jupyterlab-pygments": {
- "hashes": [
- "sha256:abfb880fd1561987efaefcb2d2ac75145d2a5d0139b1876d5be806e32f630008",
- "sha256:cfcda0873626150932f438eccf0f8bf22bfa92345b814890ab360d666b254146"
- ],
- "version": "==0.1.2"
- },
- "jupyterlab-server": {
- "hashes": [
- "sha256:26d813c8162c83d466df7d155865987dabe70aa452f9187dfb79fd88afc8fa0b",
- "sha256:9507f059ddb3d088674ed76fd3d751cedd940f8a74055e2250bf44babcc2ea1f"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==2.8.2"
- },
- "jupyterlab-vim": {
- "hashes": [
- "sha256:6722fa3c35425ccca207eddf5f636058d28b8e75fabdb1f680a56762f9921afd",
- "sha256:74794f2f298d19c9c362301ef63333681204fc90a18bec0b220c29383749e282"
- ],
- "index": "pypi",
- "version": "==0.14.5"
- },
- "jupyterlab-widgets": {
- "hashes": [
- "sha256:7885092b2b96bf189c3a705cc3c412a4472ec5e8382d0b47219a66cccae73cfa",
- "sha256:f5d9efface8ec62941173ba1cffb2edd0ecddc801c11ae2931e30b50492eb8f7"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==1.0.2"
- },
- "keras-applications": {
- "hashes": [
- "sha256:5579f9a12bcde9748f4a12233925a59b93b73ae6947409ff34aa2ba258189fe5",
- "sha256:df4323692b8c1174af821bf906f1e442e63fa7589bf0f1230a0b6bdc5a810c95"
- ],
- "index": "pypi",
- "version": "==1.0.8"
- },
- "kiwisolver": {
- "hashes": [
- "sha256:0007840186bacfaa0aba4466d5890334ea5938e0bb7e28078a0eb0e63b5b59d5",
- "sha256:19554bd8d54cf41139f376753af1a644b63c9ca93f8f72009d50a2080f870f77",
- "sha256:1d45d1c74f88b9f41062716c727f78f2a59a5476ecbe74956fafb423c5c87a76",
- "sha256:1d819553730d3c2724582124aee8a03c846ec4362ded1034c16fb3ef309264e6",
- "sha256:2210f28778c7d2ee13f3c2a20a3a22db889e75f4ec13a21072eabb5693801e84",
- "sha256:22521219ca739654a296eea6d4367703558fba16f98688bd8ce65abff36eaa84",
- "sha256:25405f88a37c5f5bcba01c6e350086d65e7465fd1caaf986333d2a045045a223",
- "sha256:2b65bd35f3e06a47b5c30ea99e0c2b88f72c6476eedaf8cfbc8e66adb5479dcf",
- "sha256:2ddb500a2808c100e72c075cbb00bf32e62763c82b6a882d403f01a119e3f402",
- "sha256:2f8f6c8f4f1cff93ca5058d6ec5f0efda922ecb3f4c5fb76181f327decff98b8",
- "sha256:30fa008c172355c7768159983a7270cb23838c4d7db73d6c0f6b60dde0d432c6",
- "sha256:3dbb3cea20b4af4f49f84cffaf45dd5f88e8594d18568e0225e6ad9dec0e7967",
- "sha256:4116ba9a58109ed5e4cb315bdcbff9838f3159d099ba5259c7c7fb77f8537492",
- "sha256:44e6adf67577dbdfa2d9f06db9fbc5639afefdb5bf2b4dfec25c3a7fbc619536",
- "sha256:5326ddfacbe51abf9469fe668944bc2e399181a2158cb5d45e1d40856b2a0589",
- "sha256:70adc3658138bc77a36ce769f5f183169bc0a2906a4f61f09673f7181255ac9b",
- "sha256:72be6ebb4e92520b9726d7146bc9c9b277513a57a38efcf66db0620aec0097e0",
- "sha256:7843b1624d6ccca403a610d1277f7c28ad184c5aa88a1750c1a999754e65b439",
- "sha256:7ba5a1041480c6e0a8b11a9544d53562abc2d19220bfa14133e0cdd9967e97af",
- "sha256:80efd202108c3a4150e042b269f7c78643420cc232a0a771743bb96b742f838f",
- "sha256:82f49c5a79d3839bc8f38cb5f4bfc87e15f04cbafa5fbd12fb32c941cb529cfb",
- "sha256:83d2c9db5dfc537d0171e32de160461230eb14663299b7e6d18ca6dca21e4977",
- "sha256:8d93a1095f83e908fc253f2fb569c2711414c0bfd451cab580466465b235b470",
- "sha256:8dc3d842fa41a33fe83d9f5c66c0cc1f28756530cd89944b63b072281e852031",
- "sha256:9661a04ca3c950a8ac8c47f53cbc0b530bce1b52f516a1e87b7736fec24bfff0",
- "sha256:a498bcd005e8a3fedd0022bb30ee0ad92728154a8798b703f394484452550507",
- "sha256:a7a4cf5bbdc861987a7745aed7a536c6405256853c94abc9f3287c3fa401b174",
- "sha256:b5074fb09429f2b7bc82b6fb4be8645dcbac14e592128beeff5461dcde0af09f",
- "sha256:b6a5431940f28b6de123de42f0eb47b84a073ee3c3345dc109ad550a3307dd28",
- "sha256:ba677bcaff9429fd1bf01648ad0901cea56c0d068df383d5f5856d88221fe75b",
- "sha256:bcadb05c3d4794eb9eee1dddf1c24215c92fb7b55a80beae7a60530a91060560",
- "sha256:bf7eb45d14fc036514c09554bf983f2a72323254912ed0c3c8e697b62c4c158f",
- "sha256:c358721aebd40c243894298f685a19eb0491a5c3e0b923b9f887ef1193ddf829",
- "sha256:c4550a359c5157aaf8507e6820d98682872b9100ce7607f8aa070b4b8af6c298",
- "sha256:c6572c2dab23c86a14e82c245473d45b4c515314f1f859e92608dcafbd2f19b8",
- "sha256:cba430db673c29376135e695c6e2501c44c256a81495da849e85d1793ee975ad",
- "sha256:dedc71c8eb9c5096037766390172c34fb86ef048b8e8958b4e484b9e505d66bc",
- "sha256:e6f5eb2f53fac7d408a45fbcdeda7224b1cfff64919d0f95473420a931347ae9",
- "sha256:ec2eba188c1906b05b9b49ae55aae4efd8150c61ba450e6721f64620c50b59eb",
- "sha256:ee040a7de8d295dbd261ef2d6d3192f13e2b08ec4a954de34a6fb8ff6422e24c",
- "sha256:eedd3b59190885d1ebdf6c5e0ca56828beb1949b4dfe6e5d0256a461429ac386",
- "sha256:f441422bb313ab25de7b3dbfd388e790eceb76ce01a18199ec4944b369017009",
- "sha256:f8eb7b6716f5b50e9c06207a14172cf2de201e41912ebe732846c02c830455b9",
- "sha256:fc4453705b81d03568d5b808ad8f09c77c47534f6ac2e72e733f9ca4714aa75c"
- ],
- "markers": "python_version >= '3.7'",
- "version": "==1.3.2"
- },
- "knack": {
- "hashes": [
- "sha256:4eaa50a1c5e79d1c5c8e5e1705b661721b0b83a089695e59e229cc26c64963b9",
- "sha256:5239f85873f524e213e81af7b784bfc08b654006eb418ae0042b9019552399e9"
- ],
- "version": "==0.8.2"
- },
- "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"
- ],
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'",
- "version": "==1.6.0"
- },
- "lru-dict": {
- "hashes": [
- "sha256:45b81f67d75341d4433abade799a47e9c42a9e22a118531dcb5e549864032d7c"
- ],
- "index": "pypi",
- "version": "==1.1.7"
- },
- "markdown-it-py": {
+ "markdown-it-py": {
"hashes": [
"sha256:36be6bb3ad987bfdb839f5ba78ddf094552ca38ccbd784ae4f74a4e1419fc6e3",
"sha256:98080fc0bc34c4f2bcf0846a096a9429acbd9d5d8e67ed34026c03c61c464389"
@@ -2372,45 +1546,44 @@
},
"matplotlib": {
"hashes": [
- "sha256:01c9de93a2ca0d128c9064f23709362e7fefb34910c7c9e0b8ab0de8258d5eda",
- "sha256:41b6e307458988891fcdea2d8ecf84a8c92d53f84190aa32da65f9505546e684",
- "sha256:48e1e0859b54d5f2e29bb78ca179fd59b971c6ceb29977fb52735bfd280eb0f5",
- "sha256:54a026055d5f8614f184e588f6e29064019a0aa8448450214c0b60926d62d919",
- "sha256:556965514b259204637c360d213de28d43a1f4aed1eca15596ce83f768c5a56f",
- "sha256:5c988bb43414c7c2b0a31bd5187b4d27fd625c080371b463a6d422047df78913",
- "sha256:6a724e3a48a54b8b6e7c4ae38cd3d07084508fa47c410c8757e9db9791421838",
- "sha256:6be8df61b1626e1a142c57e065405e869e9429b4a6dab4a324757d0dc4d42235",
- "sha256:844a7b0233e4ff7fba57e90b8799edaa40b9e31e300b8d5efc350937fa8b1bea",
- "sha256:85f0c9cf724715e75243a7b3087cf4a3de056b55e05d4d76cc58d610d62894f3",
- "sha256:a78a3b51f29448c7f4d4575e561f6b0dbb8d01c13c2046ab6c5220eb25c06506",
- "sha256:b884715a59fec9ad3b6048ecf3860f3b2ce965e676ef52593d6fa29abcf7d330",
- "sha256:b8b53f336a4688cfce615887505d7e41fd79b3594bf21dd300531a4f5b4f746a",
- "sha256:c70b6311dda3e27672f1bf48851a0de816d1ca6aaf3d49365fbdd8e959b33d2b",
- "sha256:ebfb01a65c3f5d53a8c2a8133fec2b5221281c053d944ae81ff5822a68266617",
- "sha256:eeb1859efe7754b1460e1d4991bbd4a60a56f366bc422ef3a9c5ae05f0bc70b5",
- "sha256:f15edcb0629a0801738925fe27070480f446fcaa15de65946ff946ad99a59a40",
- "sha256:f1c5efc278d996af8a251b2ce0b07bbeccb821f25c8c9846bdcb00ffc7f158aa",
- "sha256:f72657f1596199dc1e4e7a10f52a4784ead8a711f4e5b59bea95bdb97cf0e4fd",
- "sha256:fc4f526dfdb31c9bd6b8ca06bf9fab663ca12f3ec9cdf4496fb44bc680140318",
- "sha256:fcd6f1954943c0c192bfbebbac263f839d7055409f1173f80d8b11a224d236da"
+ "sha256:0abf8b51cc6d3ba34d1b15b26e329f23879848a0cf1216954c1f432ffc7e1af7",
+ "sha256:0e020a42f3338823a393dd2f80e39a2c07b9f941dfe2c778eb104eeb33d60bb5",
+ "sha256:13930a0c9bec0fd25f43c448b047a21af1353328b946f044a8fc3be077c6b1a8",
+ "sha256:153a0cf6a6ff4f406a0600d2034710c49988bacc6313d193b32716f98a697580",
+ "sha256:18f6e52386300db5cc4d1e9019ad9da2e80658bab018834d963ebb0aa5355095",
+ "sha256:2089b9014792dcc87bb1d620cde847913338abf7d957ef05587382b0cb76d44e",
+ "sha256:2eea16883aa7724c95eea0eb473ab585c6cf66f0e28f7f13e63deb38f4fd6d0f",
+ "sha256:38892a254420d95594285077276162a5e9e9c30b6da08bdc2a4d53331ad9a6fa",
+ "sha256:4b018ea6f26424a0852eb60eb406420d9f0d34f65736ea7bbfbb104946a66d86",
+ "sha256:65f877882b7ddede7090c7d87be27a0f4720fe7fc6fddd4409c06e1aa0f1ae8d",
+ "sha256:666d717a4798eb9c5d3ae83fe80c7bc6ed696b93e879cb01cb24a74155c73612",
+ "sha256:66b172610db0ececebebb09d146f54205f87c7b841454e408fba854764f91bdd",
+ "sha256:6db02c5605f063b67780f4d5753476b6a4944343284aa4e93c5e8ff6e9ec7f76",
+ "sha256:6e0e6b2111165522ad336705499b1f968c34a9e84d05d498ee5af0b5697d1efe",
+ "sha256:71a1851111f23f82fc43d2b6b2bfdd3f760579a664ebc939576fe21cc6133d01",
+ "sha256:7a7cb59ebd63a8ac4542ec1c61dd08724f82ec3aa7bb6b4b9e212d43c611ce3d",
+ "sha256:7baf23adb698d8c6ca7339c9dde00931bc47b2dd82fa912827fef9f93db77f5e",
+ "sha256:970aa97297537540369d05fe0fd1bb952593f9ab696c9b427c06990a83e2418b",
+ "sha256:9bac8eb1eccef540d7f4e844b6313d9f7722efd48c07e1b4bfec1056132127fd",
+ "sha256:a07ff2565da72a7b384a9e000b15b6b8270d81370af8a3531a16f6fbcee023cc",
+ "sha256:a0dcaf5648cecddc328e81a0421821a1f65a1d517b20746c94a1f0f5c36fb51a",
+ "sha256:a0ea10faa3bab0714d3a19c7e0921279a68d57552414d6eceaea99f97d7735db",
+ "sha256:a5b62d1805cc83d755972033c05cea78a1e177a159fc84da5c9c4ab6303ccbd9",
+ "sha256:a6cef5b31e27c31253c0f852b629a38d550ae66ec6850129c49d872f9ee428cb",
+ "sha256:a7bf8b05c214d32fb7ca7c001fde70b9b426378e897b0adbf77b85ea3569d56a",
+ "sha256:ac17a7e7b06ee426a4989f0b7f24ab1a592e39cdf56353a90f4e998bc0bf44d6",
+ "sha256:b3b687e905da32e5f2e5f16efa713f5d1fcd9fb8b8c697895de35c91fedeb086",
+ "sha256:b5e439d9e55d645f2a4dca63e2f66d68fe974c405053b132d61c7e98c25dfeb2",
+ "sha256:ba107add08e12600b072cf3c47aaa1ab85dd4d3c48107a5d3377d1bf80f8b235",
+ "sha256:d092b7ba63182d2dd427904e3eb58dd5c46ec67c5968de14a4b5007010a3a4cc",
+ "sha256:dc8c5c23e7056e126275dbf29efba817b3d94196690930d0968873ac3a94ab82",
+ "sha256:df0042cab69f4d246f4cb8fc297770ac4ae6ec2983f61836b04a117722037dcd",
+ "sha256:ee3d9ff16d749a9aa521bd7d86f0dbf256b2d2ac8ce31b19e4d2c86d2f2ff0b6",
+ "sha256:f23fbf70d2e80f4e03a83fc1206a8306d9bc50482fee4239f10676ce7e470c83",
+ "sha256:ff5d9fe518ad2de14ce82ab906b6ab5c2b0c7f4f984400ff8a7a905daa580a0a"
],
"index": "pypi",
- "version": "==3.4.3"
- },
- "matplotlib-inline": {
- "hashes": [
- "sha256:a04bfba22e0d1395479f866853ec1ee28eea1485c1d69a6faf00dc3e24ff34ee",
- "sha256:aed605ba3b72462d64d475a21a9296f400a19c4f74a31b59103d2a99ffd5aa5c"
- ],
- "markers": "python_version >= '3.5'",
- "version": "==0.1.3"
- },
- "mccabe": {
- "hashes": [
- "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42",
- "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"
- ],
- "version": "==0.6.1"
+ "version": "==3.5.0"
},
"mdit-py-plugins": {
"hashes": [
@@ -2420,127 +1593,6 @@
"markers": "python_version ~= '3.6'",
"version": "==0.2.8"
},
- "mistune": {
- "hashes": [
- "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e",
- "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"
- ],
- "version": "==0.8.4"
- },
- "mock": {
- "hashes": [
- "sha256:122fcb64ee37cfad5b3f48d7a7d51875d7031aaf3d8be7c42e2bee25044eee62",
- "sha256:7d3fbbde18228f4ff2f1f119a45cdffa458b4c0dee32eb4d2bb2f82554bac7bc"
- ],
- "index": "pypi",
- "version": "==4.0.3"
- },
- "mpld3": {
- "hashes": [
- "sha256:b080f3535238a71024c0158280ab4f6091717c45347c41c907012f8dd6da1bd5"
- ],
- "index": "pypi",
- "version": "==0.5.5"
- },
- "msal": {
- "hashes": [
- "sha256:240fb04dba46a27fd6a3178db8334412d0d02e0be85166f9e05bb45d03399084",
- "sha256:a421a43413335099228f1d9ad93f7491d7c7c40044108290e4923fe58f41a332"
- ],
- "version": "==1.16.0"
- },
- "msal-extensions": {
- "hashes": [
- "sha256:5523dfa15da88297e90d2e73486c8ef875a17f61ea7b7e2953a300432c2e7861",
- "sha256:a530c2d620061822f2ced8e29da301bc928b146970df635c852907423e8ddddc"
- ],
- "version": "==0.3.0"
- },
- "msgpack-python": {
- "hashes": [
- "sha256:378cc8a6d3545b532dfd149da715abae4fda2a3adb6d74e525d0d5e51f46909b"
- ],
- "index": "pypi",
- "version": "==0.5.6"
- },
- "multidict": {
- "hashes": [
- "sha256:06560fbdcf22c9387100979e65b26fba0816c162b888cb65b845d3def7a54c9b",
- "sha256:067150fad08e6f2dd91a650c7a49ba65085303fcc3decbd64a57dc13a2733031",
- "sha256:0a2cbcfbea6dc776782a444db819c8b78afe4db597211298dd8b2222f73e9cd0",
- "sha256:0dd1c93edb444b33ba2274b66f63def8a327d607c6c790772f448a53b6ea59ce",
- "sha256:0fed465af2e0eb6357ba95795d003ac0bdb546305cc2366b1fc8f0ad67cc3fda",
- "sha256:116347c63ba049c1ea56e157fa8aa6edaf5e92925c9b64f3da7769bdfa012858",
- "sha256:1b4ac3ba7a97b35a5ccf34f41b5a8642a01d1e55454b699e5e8e7a99b5a3acf5",
- "sha256:1c7976cd1c157fa7ba5456ae5d31ccdf1479680dc9b8d8aa28afabc370df42b8",
- "sha256:246145bff76cc4b19310f0ad28bd0769b940c2a49fc601b86bfd150cbd72bb22",
- "sha256:25cbd39a9029b409167aa0a20d8a17f502d43f2efebfe9e3ac019fe6796c59ac",
- "sha256:28e6d883acd8674887d7edc896b91751dc2d8e87fbdca8359591a13872799e4e",
- "sha256:2d1d55cdf706ddc62822d394d1df53573d32a7a07d4f099470d3cb9323b721b6",
- "sha256:2e77282fd1d677c313ffcaddfec236bf23f273c4fba7cdf198108f5940ae10f5",
- "sha256:32fdba7333eb2351fee2596b756d730d62b5827d5e1ab2f84e6cbb287cc67fe0",
- "sha256:35591729668a303a02b06e8dba0eb8140c4a1bfd4c4b3209a436a02a5ac1de11",
- "sha256:380b868f55f63d048a25931a1632818f90e4be71d2081c2338fcf656d299949a",
- "sha256:3822c5894c72e3b35aae9909bef66ec83e44522faf767c0ad39e0e2de11d3b55",
- "sha256:38ba256ee9b310da6a1a0f013ef4e422fca30a685bcbec86a969bd520504e341",
- "sha256:3bc3b1621b979621cee9f7b09f024ec76ec03cc365e638126a056317470bde1b",
- "sha256:3d2d7d1fff8e09d99354c04c3fd5b560fb04639fd45926b34e27cfdec678a704",
- "sha256:517d75522b7b18a3385726b54a081afd425d4f41144a5399e5abd97ccafdf36b",
- "sha256:5f79c19c6420962eb17c7e48878a03053b7ccd7b69f389d5831c0a4a7f1ac0a1",
- "sha256:5f841c4f14331fd1e36cbf3336ed7be2cb2a8f110ce40ea253e5573387db7621",
- "sha256:637c1896497ff19e1ee27c1c2c2ddaa9f2d134bbb5e0c52254361ea20486418d",
- "sha256:6ee908c070020d682e9b42c8f621e8bb10c767d04416e2ebe44e37d0f44d9ad5",
- "sha256:77f0fb7200cc7dedda7a60912f2059086e29ff67cefbc58d2506638c1a9132d7",
- "sha256:7878b61c867fb2df7a95e44b316f88d5a3742390c99dfba6c557a21b30180cac",
- "sha256:78c106b2b506b4d895ddc801ff509f941119394b89c9115580014127414e6c2d",
- "sha256:8b911d74acdc1fe2941e59b4f1a278a330e9c34c6c8ca1ee21264c51ec9b67ef",
- "sha256:93de39267c4c676c9ebb2057e98a8138bade0d806aad4d864322eee0803140a0",
- "sha256:9416cf11bcd73c861267e88aea71e9fcc35302b3943e45e1dbb4317f91a4b34f",
- "sha256:94b117e27efd8e08b4046c57461d5a114d26b40824995a2eb58372b94f9fca02",
- "sha256:9815765f9dcda04921ba467957be543423e5ec6a1136135d84f2ae092c50d87b",
- "sha256:98ec9aea6223adf46999f22e2c0ab6cf33f5914be604a404f658386a8f1fba37",
- "sha256:a37e9a68349f6abe24130846e2f1d2e38f7ddab30b81b754e5a1fde32f782b23",
- "sha256:a43616aec0f0d53c411582c451f5d3e1123a68cc7b3475d6f7d97a626f8ff90d",
- "sha256:a4771d0d0ac9d9fe9e24e33bed482a13dfc1256d008d101485fe460359476065",
- "sha256:a5635bcf1b75f0f6ef3c8a1ad07b500104a971e38d3683167b9454cb6465ac86",
- "sha256:a9acb76d5f3dd9421874923da2ed1e76041cb51b9337fd7f507edde1d86535d6",
- "sha256:ac42181292099d91217a82e3fa3ce0e0ddf3a74fd891b7c2b347a7f5aa0edded",
- "sha256:b227345e4186809d31f22087d0265655114af7cda442ecaf72246275865bebe4",
- "sha256:b61f85101ef08cbbc37846ac0e43f027f7844f3fade9b7f6dd087178caedeee7",
- "sha256:b70913cbf2e14275013be98a06ef4b412329fe7b4f83d64eb70dce8269ed1e1a",
- "sha256:b9aad49466b8d828b96b9e3630006234879c8d3e2b0a9d99219b3121bc5cdb17",
- "sha256:baf1856fab8212bf35230c019cde7c641887e3fc08cadd39d32a421a30151ea3",
- "sha256:bd6c9c50bf2ad3f0448edaa1a3b55b2e6866ef8feca5d8dbec10ec7c94371d21",
- "sha256:c1ff762e2ee126e6f1258650ac641e2b8e1f3d927a925aafcfde943b77a36d24",
- "sha256:c30ac9f562106cd9e8071c23949a067b10211917fdcb75b4718cf5775356a940",
- "sha256:c9631c642e08b9fff1c6255487e62971d8b8e821808ddd013d8ac058087591ac",
- "sha256:cdd68778f96216596218b4e8882944d24a634d984ee1a5a049b300377878fa7c",
- "sha256:ce8cacda0b679ebc25624d5de66c705bc53dcc7c6f02a7fb0f3ca5e227d80422",
- "sha256:cfde464ca4af42a629648c0b0d79b8f295cf5b695412451716531d6916461628",
- "sha256:d3def943bfd5f1c47d51fd324df1e806d8da1f8e105cc7f1c76a1daf0f7e17b0",
- "sha256:d9b668c065968c5979fe6b6fa6760bb6ab9aeb94b75b73c0a9c1acf6393ac3bf",
- "sha256:da7d57ea65744d249427793c042094c4016789eb2562576fb831870f9c878d9e",
- "sha256:dc3a866cf6c13d59a01878cd806f219340f3e82eed514485e094321f24900677",
- "sha256:df23c83398715b26ab09574217ca21e14694917a0c857e356fd39e1c64f8283f",
- "sha256:dfc924a7e946dd3c6360e50e8f750d51e3ef5395c95dc054bc9eab0f70df4f9c",
- "sha256:e4a67f1080123de76e4e97a18d10350df6a7182e243312426d508712e99988d4",
- "sha256:e5283c0a00f48e8cafcecadebfa0ed1dac8b39e295c7248c44c665c16dc1138b",
- "sha256:e58a9b5cc96e014ddf93c2227cbdeca94b56a7eb77300205d6e4001805391747",
- "sha256:e6453f3cbeb78440747096f239d282cc57a2997a16b5197c9bc839099e1633d0",
- "sha256:e6c4fa1ec16e01e292315ba76eb1d012c025b99d22896bd14a66628b245e3e01",
- "sha256:e7d81ce5744757d2f05fc41896e3b2ae0458464b14b5a2c1e87a6a9d69aefaa8",
- "sha256:ea21d4d5104b4f840b91d9dc8cbc832aba9612121eaba503e54eaab1ad140eb9",
- "sha256:ecc99bce8ee42dcad15848c7885197d26841cb24fa2ee6e89d23b8993c871c64",
- "sha256:f0bb0973f42ffcb5e3537548e0767079420aefd94ba990b61cf7bb8d47f4916d",
- "sha256:f19001e790013ed580abfde2a4465388950728861b52f0da73e8e8a9418533c0",
- "sha256:f76440e480c3b2ca7f843ff8a48dc82446b86ed4930552d736c0bac507498a52",
- "sha256:f9bef5cff994ca3026fcc90680e326d1a19df9841c5e3d224076407cc21471a1",
- "sha256:fc66d4016f6e50ed36fb39cd287a3878ffcebfa90008535c62e0e90a7ab713ae",
- "sha256:fd77c8f3cba815aa69cb97ee2b2ef385c7c12ada9c734b0f3b32e26bb88bbf1d"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==5.2.0"
- },
"mypy": {
"hashes": [
"sha256:088cd9c7904b4ad80bec811053272986611b84221835e079be5bcad029e79dd9",
@@ -2585,54 +1637,6 @@
"index": "pypi",
"version": "==0.15.2"
},
- "nbclassic": {
- "hashes": [
- "sha256:9c7b7987a148ecdd1827b47fe6f6968b2ddabf663142f81254000cb77ee5bd10",
- "sha256:f00b07ef4908fc38fd332d2676ccd3ceea5076528feaf21bd27e809ef20f5578"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==0.3.4"
- },
- "nbclient": {
- "hashes": [
- "sha256:542b1dfd492bc2524fff52064461149208ac3d53fa6353ce21da2219910b0cfc",
- "sha256:ed7d18431393750d29a64da432e0b7889274eb5a5056682be5691b1b1dc8f755"
- ],
- "markers": "python_full_version >= '3.6.1'",
- "version": "==0.5.5"
- },
- "nbconvert": {
- "hashes": [
- "sha256:16ceecd0afaa8fd26c245fa32e2c52066c02f13aa73387fffafd84750baea863",
- "sha256:b1b9dc4f1ff6cafae0e6d91f42fb9046fdc32e6beb6d7e2fa2cd7191ad535240"
- ],
- "markers": "python_version >= '3.7'",
- "version": "==6.2.0"
- },
- "nbformat": {
- "hashes": [
- "sha256:b516788ad70771c6250977c1374fcca6edebe6126fd2adb5a69aa5c2356fd1c8",
- "sha256:eb8447edd7127d043361bc17f2f5a807626bc8e878c7709a1c647abda28a9171"
- ],
- "markers": "python_version >= '3.5'",
- "version": "==5.1.3"
- },
- "nest-asyncio": {
- "hashes": [
- "sha256:76d6e972265063fe92a90b9cc4fb82616e07d586b346ed9d2c89a4187acea39c",
- "sha256:afc5a1c515210a23c461932765691ad39e8eba6551c055ac8d5546e69250d0aa"
- ],
- "markers": "python_version >= '3.5'",
- "version": "==1.5.1"
- },
- "networkx": {
- "hashes": [
- "sha256:80b6b89c77d1dfb64a4c7854981b60aeea6360ac02c6d4e4913319e0a313abef",
- "sha256:c0946ed31d71f1b732b5aaa6da5a0388a345019af232ce2f49c766e2d6795c51"
- ],
- "index": "pypi",
- "version": "==2.6.3"
- },
"nodeenv": {
"hashes": [
"sha256:3ef13ff90291ba2a4a7a4ff9a979b63ffdd00a464dbe04acf0ea6471517a4c2b",
@@ -2640,14 +1644,6 @@
],
"version": "==1.6.0"
},
- "notebook": {
- "hashes": [
- "sha256:872e20da9ae518bbcac3e4e0092d5bd35454e847dedb8cb9739e9f3b68406be0",
- "sha256:f7b4362698fed34f44038de0517b2e5136c1e7c379797198c1736121d3d597bd"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==6.4.5"
- },
"numpy": {
"hashes": [
"sha256:0b78ecfa070460104934e2caf51694ccd00f37d5e5dbe76f021b1b0b0d221823",
@@ -2720,26 +1716,6 @@
"index": "pypi",
"version": "==4.5.4.58"
},
- "osmium": {
- "hashes": [
- "sha256:36e2fec6ef00f0c13ec81cdb13b1d70a8d8a9a61094ea08b2a448f98bb62a6e2",
- "sha256:3f3a79c895f86109b72f048bac50d36c9527b61a1701df74aa94495e1fc9ef46",
- "sha256:5dcfc48205785ad56524e883e121866258d951ac6765cf181c213a37de3d5071",
- "sha256:6a4a36328c85dcacda88e6d838bf5b6ecc04cacc427660a3fddb9bba701fe436",
- "sha256:82102179fd3fefb61db6a70e96ed668d335fee29f6e45ef8d484b21e7daa02a4",
- "sha256:a572773655e9fefcb51aacf90b2f599064f0f855c968ccf66f74c3f410e68665",
- "sha256:ab691a1a4f077946f139658bf11c4b73f0c59606d747d30c6a7bd61841f67771",
- "sha256:acbbf5ebf7e77e753d96431f4f4b0598663a2eec287120f0184b3d894cc54ddb",
- "sha256:ae4e8e52ddf67db9f499fb25010933bf36e976ebd820600d0e67720ab90bccf1",
- "sha256:b94b3c792a8f148e654f838382f4c5fb34eeea5dd13c2ebc34f5ce43c4744956",
- "sha256:c23c6aa1903ddebbaff6e1969c37c46bfc00b845f51e35be2f52c1153b7f4fff",
- "sha256:d285c91b1d87cdc25e44243f8685ccc09de26a6287e6cbd891cf4b0eb0b2fc40",
- "sha256:e156143a6e0661a6f04608f6c73cb939bccb96f51e59bb46f59cfa0fd6a93303",
- "sha256:eb6d42a550997bbe1de12d6a1747d51ddc26c7d3118c6d22159703efa57c9d5a"
- ],
- "index": "pypi",
- "version": "==3.2.0"
- },
"packaging": {
"hashes": [
"sha256:096d689d78ca690e4cd8a89568ba06d07ca097e3306a4381635073ca91479966",
@@ -2748,44 +1724,6 @@
"markers": "python_version >= '3.6'",
"version": "==21.2"
},
- "pandas": {
- "hashes": [
- "sha256:003ba92db58b71a5f8add604a17a059f3068ef4e8c0c365b088468d0d64935fd",
- "sha256:10e10a2527db79af6e830c3d5842a4d60383b162885270f8cffc15abca4ba4a9",
- "sha256:22808afb8f96e2269dcc5b846decacb2f526dd0b47baebc63d913bf847317c8f",
- "sha256:2d1dc09c0013d8faa7474574d61b575f9af6257ab95c93dcf33a14fd8d2c1bab",
- "sha256:35c77609acd2e4d517da41bae0c11c70d31c87aae8dd1aabd2670906c6d2c143",
- "sha256:372d72a3d8a5f2dbaf566a5fa5fa7f230842ac80f29a931fb4b071502cf86b9a",
- "sha256:42493f8ae67918bf129869abea8204df899902287a7f5eaf596c8e54e0ac7ff4",
- "sha256:4acc28364863127bca1029fb72228e6f473bb50c32e77155e80b410e2068eeac",
- "sha256:5298a733e5bfbb761181fd4672c36d0c627320eb999c59c65156c6a90c7e1b4f",
- "sha256:5ba0aac1397e1d7b654fccf263a4798a9e84ef749866060d19e577e927d66e1b",
- "sha256:9707bdc1ea9639c886b4d3be6e2a45812c1ac0c2080f94c31b71c9fa35556f9b",
- "sha256:a2aa18d3f0b7d538e21932f637fbfe8518d085238b429e4790a35e1e44a96ffc",
- "sha256:a388960f979665b447f0847626e40f99af8cf191bce9dc571d716433130cb3a7",
- "sha256:a51528192755f7429c5bcc9e80832c517340317c861318fea9cea081b57c9afd",
- "sha256:b528e126c13816a4374e56b7b18bfe91f7a7f6576d1aadba5dee6a87a7f479ae",
- "sha256:c1aa4de4919358c5ef119f6377bc5964b3a7023c23e845d9db7d9016fa0c5b1c",
- "sha256:c2646458e1dce44df9f71a01dc65f7e8fa4307f29e5c0f2f92c97f47a5bf22f5",
- "sha256:c2f44425594ae85e119459bb5abb0748d76ef01d9c08583a667e3339e134218e",
- "sha256:d47750cf07dee6b55d8423471be70d627314277976ff2edd1381f02d52dbadf9",
- "sha256:d99d2350adb7b6c3f7f8f0e5dfb7d34ff8dd4bc0a53e62c445b7e43e163fce63",
- "sha256:dd324f8ee05925ee85de0ea3f0d66e1362e8c80799eb4eb04927d32335a3e44a",
- "sha256:eaca36a80acaacb8183930e2e5ad7f71539a66805d6204ea88736570b2876a7b",
- "sha256:f567e972dce3bbc3a8076e0b675273b4a9e8576ac629149cf8286ee13c259ae5",
- "sha256:fe48e4925455c964db914b958f6e7032d285848b7538a5e1b19aeb26ffaea3ec"
- ],
- "markers": "python_full_version >= '3.7.1'",
- "version": "==1.3.4"
- },
- "pandocfilters": {
- "hashes": [
- "sha256:0b679503337d233b4339a817bfc8c50064e2eff681314376a47cb582305a7a38",
- "sha256:33aae3f25fd1a026079f5d27bdd52496f0e0803b3469282162bafdcbdf6ef14f"
- ],
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
- "version": "==1.5.0"
- },
"parameterized": {
"hashes": [
"sha256:41bbff37d6186430f77f900d777e5bb6a24928a1c46fb1de692f8b52b8833b5c",
@@ -2802,29 +1740,6 @@
"index": "pypi",
"version": "==2.8.0"
},
- "parso": {
- "hashes": [
- "sha256:12b83492c6239ce32ff5eed6d3639d6a536170723c6f3f1506869f1ace413398",
- "sha256:a8c4922db71e4fdb90e0d0bc6e50f9b273d3397925e5e60a717e719201778d22"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==0.8.2"
- },
- "pexpect": {
- "hashes": [
- "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937",
- "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"
- ],
- "markers": "sys_platform != 'win32'",
- "version": "==4.8.0"
- },
- "pickleshare": {
- "hashes": [
- "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca",
- "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"
- ],
- "version": "==0.7.5"
- },
"pillow": {
"hashes": [
"sha256:066f3999cb3b070a95c3652712cffa1a748cd02d60ad7b4e485c3748a04d9d76",
@@ -2872,13 +1787,6 @@
"index": "pypi",
"version": "==8.4.0"
},
- "pkginfo": {
- "hashes": [
- "sha256:37ecd857b47e5f55949c41ed061eb51a0bee97a87c969219d144c0e023982779",
- "sha256:e7432f81d08adec7297633191bbf0bd47faf13cd8724c3a13250e51d542635bd"
- ],
- "version": "==1.7.1"
- },
"platformdirs": {
"hashes": [
"sha256:367a5e80b3d04d2428ffa76d33f124cf11e8fff2acdaa9b43d545f5c7d661ef2",
@@ -2887,14 +1795,6 @@
"markers": "python_version >= '3.6'",
"version": "==2.4.0"
},
- "portalocker": {
- "hashes": [
- "sha256:34cb36c618d88bcd9079beb36dcdc1848a3e3d92ac4eac59055bdeafc39f9d4a",
- "sha256:6d6f5de5a3e68c4dd65a98ec1babb26d28ccc5e770e07b672d65d5a35e4b2d8a"
- ],
- "markers": "platform_system != 'Windows'",
- "version": "==1.7.1"
- },
"pprofile": {
"hashes": [
"sha256:b2bb56603dadf40c0bc0f61621f22c20e41638425f729945d9b7f8e4ae8cdd4a"
@@ -2910,64 +1810,6 @@
"index": "pypi",
"version": "==2.15.0"
},
- "prometheus-client": {
- "hashes": [
- "sha256:1b12ba48cee33b9b0b9de64a1047cbd3c5f2d0ab6ebcead7ddda613a750ec3c5",
- "sha256:317453ebabff0a1b02df7f708efbab21e3489e7072b61cb6957230dd004a0af0"
- ],
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
- "version": "==0.12.0"
- },
- "prompt-toolkit": {
- "hashes": [
- "sha256:449f333dd120bd01f5d296a8ce1452114ba3a71fae7288d2f0ae2c918764fa72",
- "sha256:48d85cdca8b6c4f16480c7ce03fd193666b62b0a21667ca56b4bb5ad679d1170"
- ],
- "markers": "python_full_version >= '3.6.2'",
- "version": "==3.0.22"
- },
- "psutil": {
- "hashes": [
- "sha256:0066a82f7b1b37d334e68697faba68e5ad5e858279fd6351c8ca6024e8d6ba64",
- "sha256:02b8292609b1f7fcb34173b25e48d0da8667bc85f81d7476584d889c6e0f2131",
- "sha256:0ae6f386d8d297177fd288be6e8d1afc05966878704dad9847719650e44fc49c",
- "sha256:0c9ccb99ab76025f2f0bbecf341d4656e9c1351db8cc8a03ccd62e318ab4b5c6",
- "sha256:0dd4465a039d343925cdc29023bb6960ccf4e74a65ad53e768403746a9207023",
- "sha256:12d844996d6c2b1d3881cfa6fa201fd635971869a9da945cf6756105af73d2df",
- "sha256:1bff0d07e76114ec24ee32e7f7f8d0c4b0514b3fae93e3d2aaafd65d22502394",
- "sha256:245b5509968ac0bd179287d91210cd3f37add77dad385ef238b275bad35fa1c4",
- "sha256:28ff7c95293ae74bf1ca1a79e8805fcde005c18a122ca983abf676ea3466362b",
- "sha256:36b3b6c9e2a34b7d7fbae330a85bf72c30b1c827a4366a07443fc4b6270449e2",
- "sha256:52de075468cd394ac98c66f9ca33b2f54ae1d9bff1ef6b67a212ee8f639ec06d",
- "sha256:5da29e394bdedd9144c7331192e20c1f79283fb03b06e6abd3a8ae45ffecee65",
- "sha256:61f05864b42fedc0771d6d8e49c35f07efd209ade09a5afe6a5059e7bb7bf83d",
- "sha256:6223d07a1ae93f86451d0198a0c361032c4c93ebd4bf6d25e2fb3edfad9571ef",
- "sha256:6323d5d845c2785efb20aded4726636546b26d3b577aded22492908f7c1bdda7",
- "sha256:6ffe81843131ee0ffa02c317186ed1e759a145267d54fdef1bc4ea5f5931ab60",
- "sha256:74f2d0be88db96ada78756cb3a3e1b107ce8ab79f65aa885f76d7664e56928f6",
- "sha256:74fb2557d1430fff18ff0d72613c5ca30c45cdbfcddd6a5773e9fc1fe9364be8",
- "sha256:90d4091c2d30ddd0a03e0b97e6a33a48628469b99585e2ad6bf21f17423b112b",
- "sha256:90f31c34d25b1b3ed6c40cdd34ff122b1887a825297c017e4cbd6796dd8b672d",
- "sha256:99de3e8739258b3c3e8669cb9757c9a861b2a25ad0955f8e53ac662d66de61ac",
- "sha256:c6a5fd10ce6b6344e616cf01cc5b849fa8103fbb5ba507b6b2dee4c11e84c935",
- "sha256:ce8b867423291cb65cfc6d9c4955ee9bfc1e21fe03bb50e177f2b957f1c2469d",
- "sha256:d225cd8319aa1d3c85bf195c4e07d17d3cd68636b8fc97e6cf198f782f99af28",
- "sha256:ea313bb02e5e25224e518e4352af4bf5e062755160f77e4b1767dd5ccb65f876",
- "sha256:ea372bcc129394485824ae3e3ddabe67dc0b118d262c568b4d2602a7070afdb0",
- "sha256:f4634b033faf0d968bb9220dd1c793b897ab7f1189956e1aa9eae752527127d3",
- "sha256:fcc01e900c1d7bee2a37e5d6e4f9194760a93597c97fee89c4ae51701de03563"
- ],
- "index": "pypi",
- "version": "==5.8.0"
- },
- "ptyprocess": {
- "hashes": [
- "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35",
- "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"
- ],
- "markers": "os_name != 'nt'",
- "version": "==0.7.0"
- },
"pycparser": {
"hashes": [
"sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9",
@@ -3030,167 +1872,30 @@
"sha256:b400edd7391972e75b4243113089d6ea10b032e1306e8721efabb36d33c2d0f2",
"sha256:b545634f96132af1d31dcb873cf03a9c4a5654ae39d9ee126db0b2eba2806788",
"sha256:ba5bf655c892bbf4a9bafb4fcbc4c71023cc9a65f0cae0f3eba09a11018a858e",
- "sha256:bb55368d455ab9518b97febd33a8d417988397b019c9408993be034e0b5a7db6",
- "sha256:c1eb91198fc47c2e4fdc19c544b5d94534a70fd877f5c342228feb05e9fc4bef",
- "sha256:c28c6f764aa03a0245db12346f1da327c6f49bcc20e53aefec6eed57e4fbe1ce",
- "sha256:c6ee571995527e779b46cafee7ebef2dceb1a9c375143828e019293ff0efa167",
- "sha256:c84a93e6d33dafce9e25080ac557342333e15ef7e378ba84cb6181c52a8fd663",
- "sha256:d4061ac4e81bb36ec8f0a7027582c1c4dd32a939882e008165627103cb0b3985",
- "sha256:d5c62fbdb30082f7e1dcfa253da48e7b4be7342d275b34b2efa51f6cffc5942b",
- "sha256:e533f4bf9dc1a91cfd608b9bfb028c6a92383e731c502660933f0f9b812045a6",
- "sha256:e9368c105a8bccc8adfe7fd7fa5220d2b6c03979a3a57a8178c42f6fa9914ebc",
- "sha256:f628f9f26c8dadf72fabc9ae0ce5fe7f60d76be71a3407abc756b4d1fd030fa0",
- "sha256:f8379052cfbc278b11e31bc97f2e7f5998959c50837c4d54f4e424a541e0c5d9",
- "sha256:fad7b5351931cb68d19d7ecc0b21021fe23237d8fba8c455b5af4a79e1c7c536",
- "sha256:fdd488daa4ad33748d5ea806e311bfe01b9cc506def5288400072fcd66d226cf"
- ],
- "index": "pypi",
- "version": "==2.1.0"
- },
- "pygments": {
- "hashes": [
- "sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380",
- "sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6"
- ],
- "index": "pypi",
- "version": "==2.10.0"
- },
- "pyjwt": {
- "hashes": [
- "sha256:b888b4d56f06f6dcd777210c334e69c737be74755d3e5e9ee3fe67dc18a0ee41",
- "sha256:e0c4bb8d9f0af0c7f5b1ec4c5036309617d03d56932877f2f7a0beeb5318322f"
- ],
- "index": "pypi",
- "version": "==2.3.0"
- },
- "pylint": {
- "hashes": [
- "sha256:0f358e221c45cbd4dad2a1e4b883e75d28acdcccd29d40c76eb72b307269b126",
- "sha256:2c9843fff1a88ca0ad98a256806c82c5a8f86086e7ccbdb93297d86c3f90c436"
- ],
- "index": "pypi",
- "version": "==2.11.1"
- },
- "pymongo": {
- "hashes": [
- "sha256:02e0c088f189ca69fac094cb5f851b43bbbd7cec42114495777d4d8f297f7f8a",
- "sha256:138248c542051eb462f88b50b0267bd5286d6661064bab06faa0ef6ac30cdb4b",
- "sha256:13a7c6d055af58a1e9c505e736da8b6a2e95ccc8cec10b008143f7a536e5de8a",
- "sha256:13d74bf3435c1e58d8fafccc0d5e87f246ae2c6e9cbef4b35e32a1c3759e354f",
- "sha256:15dae01341571d0af51526b7a21648ca575e9375e16ba045c9860848dfa8952f",
- "sha256:17238115e6d37f5423b046cb829f1ca02c4ea7edb163f5b8b88e0c975dc3fec9",
- "sha256:180b405e17b90a877ea5dbc5efe7f4c171af4c89323148e100c0f12cedb86f12",
- "sha256:1821ce4e5a293313947fd017bbd2d2535aa6309680fa29b33d0442d15da296ec",
- "sha256:1a7b138a04fdd17849930dc8bf664002e17db38448850bfb96d200c9c5a8b3a1",
- "sha256:1c4e51a3b69789b6f468a8e881a13f2d1e8f5e99e41f80fd44845e6ec0f701e1",
- "sha256:1d55982e5335925c55e2b87467043866ce72bd30ea7e7e3eeed6ec3d95a806d4",
- "sha256:1fa6f08ddb6975371777f97592d35c771e713ee2250e55618148a5e57e260aff",
- "sha256:2174d3279b8e2b6d7613b338f684cd78ff7adf1e7ec5b7b7bde5609a129c9898",
- "sha256:2462a68f6675da548e333fa299d8e9807e00f95a4d198cfe9194d7be69f40c9b",
- "sha256:25fd76deabe9ea37c8360c362b32f702cc095a208dd1c5328189938ca7685847",
- "sha256:287c2a0063267c1458c4ddf528b44063ce7f376a6436eea5bccd7f625bbc3b5e",
- "sha256:2d3abe548a280b49269c7907d5b71199882510c484d680a5ea7860f30c4a695f",
- "sha256:2fa101bb23619120673899694a65b094364269e597f551a87c4bdae3a474d726",
- "sha256:2fda3b3fb5c0d159195ab834b322a23808f1b059bcc7e475765abeddee6a2529",
- "sha256:303531649fa45f96b694054c1aa02f79bda32ef57affe42c5c339336717eed74",
- "sha256:36806ee53a85c3ba73939652f2ced2961e6a77cfbae385cd83f2e24cd97964b7",
- "sha256:37a63da5ee623acdf98e6d511171c8a5827a6106b0712c18af4441ef4f11e6be",
- "sha256:3a2fcbd04273a509fa85285d9eccf17ab65ce440bd4f5e5a58c978e563cd9e9a",
- "sha256:3b40e36d3036bfe69ba63ec8e746a390721f75467085a0384b528e1dda532c69",
- "sha256:4168b6c425d783e81723fc3dc382d374a228ff29530436a472a36d9f27593e73",
- "sha256:444c00ebc20f2f9dc62e34f7dc9453dc2f5f5a72419c8dccad6e26d546c35712",
- "sha256:45d6b47d70ed44e3c40bef618ed61866c48176e7e5dff80d06d8b1a6192e8584",
- "sha256:460bdaa3f65ddb5b7474ae08589a1763b5da1a78b8348351b9ba1c63b459d67d",
- "sha256:47ed77f62c8417a86f9ad158b803f3459a636386cb9d3d4e9e7d6a82d051f907",
- "sha256:48722e91981bb22a16b0431ea01da3e1cc5b96805634d3b8d3c2a5315c1ce7f1",
- "sha256:49b0d92724d3fce1174fd30b0b428595072d5c6b14d6203e46a9ea347ae7b439",
- "sha256:4a2d73a9281faefb273a5448f6d25f44ebd311ada9eb79b6801ae890508fe231",
- "sha256:4f4bc64fe9cbd70d46f519f1e88c9e4677f7af18ab9cd4942abce2bcfa7549c3",
- "sha256:5067c04d3b19c820faac6342854d887ade58e8d38c3db79b68c2a102bbb100e7",
- "sha256:51437c77030bed72d57d8a61e22758e3c389b13fea7787c808030002bb05ca39",
- "sha256:515e4708d6567901ffc06476a38abe2c9093733f52638235d9f149579c1d3de0",
- "sha256:5183b698d6542219e4135de583b57bc6286bd37df7f645b688278eb919bfa785",
- "sha256:56feb80ea1f5334ccab9bd16a5161571ab70392e51fcc752fb8a1dc67125f663",
- "sha256:573e2387d0686976642142c50740dfc4d3494cc627e2a7d22782b99f70879055",
- "sha256:58a67b3800476232f9989e533d0244060309451b436d46670a53e6d189f1a7e7",
- "sha256:5e3833c001a04aa06a28c6fd9628256862a654c09b0f81c07734b5629bc014ab",
- "sha256:5f5fe59328838fa28958cc06ecf94be585726b97d637012f168bc3c7abe4fd81",
- "sha256:6235bf2157aa46e53568ed79b70603aa8874baa202d5d1de82fa0eb917696e73",
- "sha256:63be03f7ae1e15e72a234637ec7941ef229c7ab252c9ff6af48bba1e5418961c",
- "sha256:65f159c445761cab04b665fc448b3fc008aebc98e54fdcbfd1aff195ef1b1408",
- "sha256:67e0b2ad3692f6d0335ae231a40de55ec395b6c2e971ad6f55b162244d1ec542",
- "sha256:68409171ab2aa7ccd6e8e839233e4b8ddeec246383c9a3698614e814739356f9",
- "sha256:6a96c04ce39d66df60d9ce89f4c254c4967bc7d9e2e2c52adc58f47be826ee96",
- "sha256:6ead0126fb4424c6c6a4fdc603d699a9db7c03cdb8eac374c352a75fec8a820a",
- "sha256:6eb6789f26c398c383225e1313c8e75a7d290d323b8eaf65f3f3ddd0eb8a5a3c",
- "sha256:6f07888e3b73c0dfa46f12d098760494f5f23fd66923a6615edfe486e6a7649c",
- "sha256:6f0f0a10f128ea0898e607d351ebfabf70941494fc94e87f12c76e2894d8e6c4",
- "sha256:704879b6a54c45ad76cea7c6789c1ae7185050acea7afd15b58318fa1932ed45",
- "sha256:7117bfd8827cfe550f65a3c399dcd6e02226197a91c6d11a3540c3e8efc686d6",
- "sha256:712de1876608fd5d76abc3fc8ec55077278dd5044073fbe9492631c9a2c58351",
- "sha256:75c7ef67b4b8ec070e7a4740764f6c03ec9246b59d95e2ae45c029d41cb9efa1",
- "sha256:77dddf596fb065de29fb39992fbc81301f7fd0003be649b7fa7448c77ca53bed",
- "sha256:7abc87e45b572eb6d17a50422e69a9e5d6f13e691e821fe2312df512500faa50",
- "sha256:7d8cdd2f070c71366e64990653522cce84b08dc26ab0d1fa19aa8d14ee0cf9ba",
- "sha256:81ce5f871f5d8e82615c8bd0b34b68a9650204c8b1a04ce7890d58c98eb66e39",
- "sha256:837cdef094f39c6f4a2967abc646a412999c2540fbf5d3cce1dd3b671f4b876c",
- "sha256:849e641cfed05c75d772f9e9018f42c5fbd00655d43d52da1b9c56346fd3e4cc",
- "sha256:87114b995506e7584cf3daf891e419b5f6e7e383e7df6267494da3a76312aa22",
- "sha256:87db421c9eb915b8d9a9a13c5b2ee338350e36ee83e26ff0adfc48abc5db3ac3",
- "sha256:8851544168703fb519e95556e3b463fca4beeef7ed3f731d81a68c8268515d9d",
- "sha256:891f541c7ed29b95799da0cd249ae1db1842777b564e8205a197b038c5df6135",
- "sha256:8f87f53c9cd89010ae45490ec2c963ff18b31f5f290dc08b04151709589fe8d9",
- "sha256:9641be893ccce7d192a0094efd0a0d9f1783a1ebf314b4128f8a27bfadb8a77c",
- "sha256:979e34db4f3dc5710c18db437aaf282f691092b352e708cb2afd4df287698c76",
- "sha256:9b62d84478f471fdb0dcea3876acff38f146bd23cbdbed15074fb4622064ec2e",
- "sha256:a472ca3d43d33e596ff5836c6cc71c3e61be33f44fe1cfdab4a1100f4af60333",
- "sha256:a5dbeeea6a375fbd79448b48a54c46fc9351611a03ef8398d2a40b684ce46194",
- "sha256:a7430f3987d232e782304c109be1d0e6fff46ca6405cb2479e4d8d08cd29541e",
- "sha256:a81e52dbf95f236a0c89a5abcd2b6e1331da0c0312f471c73fae76c79d2acf6b",
- "sha256:aa434534cc91f51a85e3099dc257ee8034b3d2be77f2ca58fb335a686e3a681f",
- "sha256:ab27d6d7d41a66d9e54269a290d27cd5c74f08e9add0054a754b4821026c4f42",
- "sha256:adb37bf22d25a51b84d989a2a5c770d4514ac590201eea1cb50ce8c9c5257f1d",
- "sha256:afb16330ab6efbbf995375ad94e970fa2f89bb46bd10d854b7047620fdb0d67d",
- "sha256:b1b06038c9940a49c73db0aeb0f6809b308e198da1326171768cf68d843af521",
- "sha256:b1e6d1cf4bd6552b5f519432cce1530c09e6b0aab98d44803b991f7e880bd332",
- "sha256:bf2d9d62178bb5c05e77d40becf89c309b1966fbcfb5c306238f81bf1ec2d6a2",
- "sha256:bfd073fea04061019a103a288847846b5ef40dfa2f73b940ed61e399ca95314f",
- "sha256:c04e84ccf590933a266180286d8b6a5fc844078a5d934432628301bd8b5f9ca7",
- "sha256:c0947d7be30335cb4c3d5d0983d8ebc8294ae52503cf1d596c926f7e7183900b",
- "sha256:c2a17752f97a942bdb4ff4a0516a67c5ade1658ebe1ab2edacdec0b42e39fa75",
- "sha256:c4653830375ab019b86d218c749ad38908b74182b2863d09936aa8d7f990d30e",
- "sha256:c660fd1e4a4b52f79f7d134a3d31d452948477b7f46ff5061074a534c5805ba6",
- "sha256:cb48ff6cc6109190e1ccf8ea1fc71cc244c9185813ce7d1c415dce991cfb8709",
- "sha256:cef2675004d85d85a4ccc24730b73a99931547368d18ceeed1259a2d9fcddbc1",
- "sha256:d1b98539b0de822b6f717498e59ae3e5ae2e7f564370ab513e6d0c060753e447",
- "sha256:d6c6989c10008ac70c2bb2ad2b940fcfe883712746c89f7e3308c14c213a70d7",
- "sha256:db3efec9dcecd96555d752215797816da40315d61878f90ca39c8e269791bf17",
- "sha256:dc4749c230a71b34db50ac2481d9008bb17b67c92671c443c3b40e192fbea78e",
- "sha256:dcf906c1f7a33e4222e4bff18da1554d69323bc4dd95fe867a6fa80709ee5f93",
- "sha256:e2bccadbe313b11704160aaba5eec95d2da1aa663f02f41d2d1520d02bbbdcd5",
- "sha256:e30cce3cc86d6082c8596b3fbee0d4f54bc4d337a4fa1bf536920e2e319e24f0",
- "sha256:e5d6428b8b422ba5205140e8be11722fa7292a0bedaa8bc80fb34c92eb19ba45",
- "sha256:e841695b5dbea38909ab2dbf17e91e9a823412d8d88d1ef77f1b94a7bc551c0f",
- "sha256:eb65ec0255a0fccc47c87d44e505ef5180bfd71690bd5f84161b1f23949fb209",
- "sha256:ed20ec5a01c43254f6047c5d8124b70d28e39f128c8ad960b437644fe94e1827",
- "sha256:ed751a20840a31242e7bea566fcf93ba75bc11b33afe2777bbf46069c1af5094",
- "sha256:ef8b927813c27c3bdfc82c55682d7767403bcdadfd9f9c0fc49f4be4553a877b",
- "sha256:f43cacda46fc188f998e6d308afe1c61ff41dcb300949f4cbf731e9a0a5eb2d3",
- "sha256:f44bea60fd2178d7153deef9621c4b526a93939da30010bba24d3408a98b0f79",
- "sha256:fcc021530b7c71069132fe4846d95a3cdd74d143adc2f7e398d5fabf610f111c",
- "sha256:fe16517b275031d61261a4e3941c411fb7c46a9cd012f02381b56e7907cc9e06",
- "sha256:fe3ae4294d593da54862f0140fdcc89d1aeeb94258ca97f094119ed7f0e5882d"
+ "sha256:bb55368d455ab9518b97febd33a8d417988397b019c9408993be034e0b5a7db6",
+ "sha256:c1eb91198fc47c2e4fdc19c544b5d94534a70fd877f5c342228feb05e9fc4bef",
+ "sha256:c28c6f764aa03a0245db12346f1da327c6f49bcc20e53aefec6eed57e4fbe1ce",
+ "sha256:c6ee571995527e779b46cafee7ebef2dceb1a9c375143828e019293ff0efa167",
+ "sha256:c84a93e6d33dafce9e25080ac557342333e15ef7e378ba84cb6181c52a8fd663",
+ "sha256:d4061ac4e81bb36ec8f0a7027582c1c4dd32a939882e008165627103cb0b3985",
+ "sha256:d5c62fbdb30082f7e1dcfa253da48e7b4be7342d275b34b2efa51f6cffc5942b",
+ "sha256:e533f4bf9dc1a91cfd608b9bfb028c6a92383e731c502660933f0f9b812045a6",
+ "sha256:e9368c105a8bccc8adfe7fd7fa5220d2b6c03979a3a57a8178c42f6fa9914ebc",
+ "sha256:f628f9f26c8dadf72fabc9ae0ce5fe7f60d76be71a3407abc756b4d1fd030fa0",
+ "sha256:f8379052cfbc278b11e31bc97f2e7f5998959c50837c4d54f4e424a541e0c5d9",
+ "sha256:fad7b5351931cb68d19d7ecc0b21021fe23237d8fba8c455b5af4a79e1c7c536",
+ "sha256:fdd488daa4ad33748d5ea806e311bfe01b9cc506def5288400072fcd66d226cf"
],
"index": "pypi",
- "version": "==3.12.1"
+ "version": "==2.1.0"
},
- "pymysql": {
+ "pygments": {
"hashes": [
- "sha256:263040d2779a3b84930f7ac9da5132be0fefcd6f453a885756656103f8ee1fdd",
- "sha256:44f47128dda8676e021c8d2dbb49a82be9e4ab158b9f03e897152a3a287c69ea"
+ "sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380",
+ "sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6"
],
- "index": "pypi",
- "version": "==0.10.1"
+ "markers": "python_version >= '3.5'",
+ "version": "==2.10.0"
},
"pynacl": {
"hashes": [
@@ -3216,21 +1921,6 @@
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
"version": "==1.4.0"
},
- "pynmea2": {
- "hashes": [
- "sha256:098f9ffd89c4a6c5e137b8b59e5b38194888d4a557c50b003ebcf2c3c15ec22e",
- "sha256:e340d3327ebf09683d09466a52541dfcccb98bde9cb661cab2d3eeb72ea424ad"
- ],
- "index": "pypi",
- "version": "==1.18.0"
- },
- "pyopenssl": {
- "hashes": [
- "sha256:5e2d8c5e46d0d865ae933bef5230090bdaf5506281e9eec60fa250ee80600cb3",
- "sha256:8935bd4920ab9abfebb07c41a4f58296407ed77f04bd1a92914044b848ba1ed6"
- ],
- "version": "==21.0.0"
- },
"pyparsing": {
"hashes": [
"sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1",
@@ -3246,67 +1936,6 @@
"index": "pypi",
"version": "==1.4.5"
},
- "pyproj": {
- "hashes": [
- "sha256:00ec0cdd218cc8e7c823a9fe7c705b1e55926fe3a9460ef2048403757f9897ec",
- "sha256:19e6a7c6d31624b9971639036679fad35460045fd99c0c484899134b6bbf84cc",
- "sha256:28026ddf4d779e6bcbbd45954a0ca017348d819f27deb503e860be4eb88f5218",
- "sha256:40ed2a66d93af811abac9fd2581685a2aade22a6753501f2f9760893ee6b0828",
- "sha256:4a936093825ff55b24c1fc6cc093541fcf6d0f6d406589ed699e62048ebf3877",
- "sha256:50d312cb7610f93f02f07b7da5b96469c52645717bebe6530ac7214cc69c068e",
- "sha256:604e8041ee0a17eec0fac4e7e10b2f11f45ab49676a4f26eb63753ebb9ba38b0",
- "sha256:76dd8a9dbd67a42e5ab8afe0e4a4167f0dfcd8f07e12541852c5289abf49e28f",
- "sha256:8a732342136fa57112de717109c2b853a4df3e4e2de56e42da7a2b61e67f0b29",
- "sha256:8cf6f7c62a7c4144771a330381198e53bff782c0345af623b8989b1913acb919",
- "sha256:8e6821a472f03e3604413b562536e05cb7926c3bd85bfc423c88c4909871f692",
- "sha256:b73973908688a0845ebd78871ed2edcca35d1fad8e90983a416a49aadb350f28",
- "sha256:b87eda8647d71f27ed81c43da9d8e0b841a403378b645e8dc1d015e9f5133ed1",
- "sha256:c5fb6283da84be5dc909f3f681490fd43de1b3694e9b5bed1ca7bc875130cb93",
- "sha256:c7d7097b969c7a3f114fcce379021e59c843c1c7b1b9b3f1bb2aa65019793800",
- "sha256:ce554616880ab59110af9baa2948b4442d2961e20390df00cea49782b7c779fe",
- "sha256:d355ddf4cb29e77cb38e152354fb6ef6796d699d37e1a67a2427890ce2341162",
- "sha256:e61c34b1b5a6b8df2ecf5abdbf8dd69322001ebc1971d0897919e4004512c476",
- "sha256:f2eb0ee7e4183c1c4e2f450cccff09734b59ff929619bad3a4df97a87e3a3d1f",
- "sha256:faadb5795e99321b5135263080348e184b927352c6331a06c2fcfe77a07ad215"
- ],
- "index": "pypi",
- "version": "==3.2.1"
- },
- "pyrsistent": {
- "hashes": [
- "sha256:097b96f129dd36a8c9e33594e7ebb151b1515eb52cceb08474c10a5479e799f2",
- "sha256:2aaf19dc8ce517a8653746d98e962ef480ff34b6bc563fc067be6401ffb457c7",
- "sha256:404e1f1d254d314d55adb8d87f4f465c8693d6f902f67eb6ef5b4526dc58e6ea",
- "sha256:48578680353f41dca1ca3dc48629fb77dfc745128b56fc01096b2530c13fd426",
- "sha256:4916c10896721e472ee12c95cdc2891ce5890898d2f9907b1b4ae0f53588b710",
- "sha256:527be2bfa8dc80f6f8ddd65242ba476a6c4fb4e3aedbf281dfbac1b1ed4165b1",
- "sha256:58a70d93fb79dc585b21f9d72487b929a6fe58da0754fa4cb9f279bb92369396",
- "sha256:5e4395bbf841693eaebaa5bb5c8f5cdbb1d139e07c975c682ec4e4f8126e03d2",
- "sha256:6b5eed00e597b5b5773b4ca30bd48a5774ef1e96f2a45d105db5b4ebb4bca680",
- "sha256:73ff61b1411e3fb0ba144b8f08d6749749775fe89688093e1efef9839d2dcc35",
- "sha256:772e94c2c6864f2cd2ffbe58bb3bdefbe2a32afa0acb1a77e472aac831f83427",
- "sha256:773c781216f8c2900b42a7b638d5b517bb134ae1acbebe4d1e8f1f41ea60eb4b",
- "sha256:a0c772d791c38bbc77be659af29bb14c38ced151433592e326361610250c605b",
- "sha256:b29b869cf58412ca5738d23691e96d8aff535e17390128a1a52717c9a109da4f",
- "sha256:c1a9ff320fa699337e05edcaae79ef8c2880b52720bc031b219e5b5008ebbdef",
- "sha256:cd3caef37a415fd0dae6148a1b6957a8c5f275a62cca02e18474608cb263640c",
- "sha256:d5ec194c9c573aafaceebf05fc400656722793dac57f254cd4741f3c27ae57b4",
- "sha256:da6e5e818d18459fa46fac0a4a4e543507fe1110e808101277c5a2b5bab0cd2d",
- "sha256:e79d94ca58fcafef6395f6352383fa1a76922268fa02caa2272fff501c2fdc78",
- "sha256:f3ef98d7b76da5eb19c37fda834d50262ff9167c65658d1d8f974d2e4d90676b",
- "sha256:f4c8cabb46ff8e5d61f56a037974228e978f26bfefce4f61a4b1ac0ba7a2ab72"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==0.18.0"
- },
- "pysocks": {
- "hashes": [
- "sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299",
- "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5",
- "sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0"
- ],
- "version": "==1.7.1"
- },
"python-dateutil": {
"hashes": [
"sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86",
@@ -3315,29 +1944,6 @@
"index": "pypi",
"version": "==2.8.2"
},
- "python-engineio": {
- "hashes": [
- "sha256:ad06a975f7e14cb3bb7137cbf70fd883804484d29acd58004d1db1e2a7fc0ad3",
- "sha256:fed35eeacfa21f53f1fc05ef0cadd65a50780364da3a2be7650eb92f928fdb11"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==4.3.0"
- },
- "python-logstash": {
- "hashes": [
- "sha256:10943e5df83f592b4d61b63ad1afff855ccc8c9467f78718f0a59809ba1fe68c"
- ],
- "index": "pypi",
- "version": "==0.4.6"
- },
- "python-socketio": {
- "hashes": [
- "sha256:d84fa319e943aa18328280c8fbc4e2ba03cf9e96ff905b294b8b482af64532c9",
- "sha256:ef4e273ddfebb421144a228cbab1e7e27ffe8d372514fa561e57d590ea6627b0"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==5.4.1"
- },
"pytz": {
"hashes": [
"sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c",
@@ -3345,42 +1951,6 @@
],
"version": "==2021.3"
},
- "pywavelets": {
- "hashes": [
- "sha256:076ca8907001fdfe4205484f719d12b4a0262dfe6652fa1cfc3c5c362d14dc84",
- "sha256:18a51b3f9416a2ae6e9a35c4af32cf520dd7895f2b69714f4aa2f4342fca47f9",
- "sha256:1a64b40f6acb4ffbaccce0545d7fc641744f95351f62e4c6aaa40549326008c9",
- "sha256:2b634a54241c190ee989a4af87669d377b37c91bcc9cf0efe33c10ff847f7841",
- "sha256:2f7429eeb5bf9c7068002d0d7f094ed654c77a70ce5e6198737fd68ab85f8311",
- "sha256:35959c041ec014648575085a97b498eafbbaa824f86f6e4a59bfdef8a3fe6308",
- "sha256:39c74740718e420d38c78ca4498568fa57976d78d5096277358e0fa9629a7aea",
- "sha256:411e17ca6ed8cf5e18a7ca5ee06a91c25800cc6c58c77986202abf98d749273a",
- "sha256:55e39ec848ceec13c9fa1598253ae9dd5c31d09dfd48059462860d2b908fb224",
- "sha256:6162dc0ae04669ea04b4b51420777b9ea2d30b0a9d02901b2a3b4d61d159c2e9",
- "sha256:68b5c33741d26c827074b3d8f0251de1c3019bb9567b8d303eb093c822ce28f1",
- "sha256:6bc78fb9c42a716309b4ace56f51965d8b5662c3ba19d4591749f31773db1125",
- "sha256:6ebfefebb5c6494a3af41ad8c60248a95da267a24b79ed143723d4502b1fe4d7",
- "sha256:720dbcdd3d91c6dfead79c80bf8b00a1d8aa4e5d551dc528c6d5151e4efc3403",
- "sha256:732bab78435c48be5d6bc75486ef629d7c8f112e07b313bf1f1a2220ab437277",
- "sha256:7947e51ca05489b85928af52a34fe67022ab5b81d4ae32a4109a99e883a0635e",
- "sha256:79f5b54f9dc353e5ee47f0c3f02bebd2c899d49780633aa771fed43fa20b3149",
- "sha256:80b924edbc012ded8aa8b91cb2fd6207fb1a9a3a377beb4049b8a07445cec6f0",
- "sha256:83c5e3eb78ce111c2f0b45f46106cc697c3cb6c4e5f51308e1f81b512c70c8fb",
- "sha256:889d4c5c5205a9c90118c1980df526857929841df33e4cd1ff1eff77c6817a65",
- "sha256:935ff247b8b78bdf77647fee962b1cc208c51a7b229db30b9ba5f6da3e675178",
- "sha256:98b2669c5af842a70cfab33a7043fcb5e7535a690a00cd251b44c9be0be418e5",
- "sha256:9e2528823ccf5a0a1d23262dfefe5034dce89cd84e4e124dc553dfcdf63ebb92",
- "sha256:bc5e87b72371da87c9bebc68e54882aada9c3114e640de180f62d5da95749cd3",
- "sha256:be105382961745f88d8196bba5a69ee2c4455d87ad2a2e5d1eed6bd7fda4d3fd",
- "sha256:c06d2e340c7bf8b9ec71da2284beab8519a3908eab031f4ea126e8ccfc3fd567",
- "sha256:c2a799e79cee81a862216c47e5623c97b95f1abee8dd1f9eed736df23fb653fb",
- "sha256:cfe79844526dd92e3ecc9490b5031fca5f8ab607e1e858feba232b1b788ff0ea",
- "sha256:d510aef84d9852653d079c84f2f81a82d5d09815e625f35c95714e7364570ad4",
- "sha256:e02a0558e0c2ac8b8bbe6a6ac18c136767ec56b96a321e0dfde2173adfa5a504"
- ],
- "markers": "python_version >= '3.5'",
- "version": "==1.1.1"
- },
"pyyaml": {
"hashes": [
"sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293",
@@ -3420,83 +1990,6 @@
"index": "pypi",
"version": "==6.0"
},
- "pyzmq": {
- "hashes": [
- "sha256:08c4e315a76ef26eb833511ebf3fa87d182152adf43dedee8d79f998a2162a0b",
- "sha256:0ca6cd58f62a2751728016d40082008d3b3412a7f28ddfb4a2f0d3c130f69e74",
- "sha256:1621e7a2af72cced1f6ec8ca8ca91d0f76ac236ab2e8828ac8fe909512d566cb",
- "sha256:18cd854b423fce44951c3a4d3e686bac8f1243d954f579e120a1714096637cc0",
- "sha256:2841997a0d85b998cbafecb4183caf51fd19c4357075dfd33eb7efea57e4c149",
- "sha256:2b97502c16a5ec611cd52410bdfaab264997c627a46b0f98d3f666227fd1ea2d",
- "sha256:3a4c9886d61d386b2b493377d980f502186cd71d501fffdba52bd2a0880cef4f",
- "sha256:3c1895c95be92600233e476fe283f042e71cf8f0b938aabf21b7aafa62a8dac9",
- "sha256:42abddebe2c6a35180ca549fadc7228d23c1e1f76167c5ebc8a936b5804ea2df",
- "sha256:468bd59a588e276961a918a3060948ae68f6ff5a7fa10bb2f9160c18fe341067",
- "sha256:480b9931bfb08bf8b094edd4836271d4d6b44150da051547d8c7113bf947a8b0",
- "sha256:53f4fd13976789ffafedd4d46f954c7bb01146121812b72b4ddca286034df966",
- "sha256:62bcade20813796c426409a3e7423862d50ff0639f5a2a95be4b85b09a618666",
- "sha256:67db33bea0a29d03e6eeec55a8190e033318cee3cbc732ba8fd939617cbf762d",
- "sha256:6b217b8f9dfb6628f74b94bdaf9f7408708cb02167d644edca33f38746ca12dd",
- "sha256:7661fc1d5cb73481cf710a1418a4e1e301ed7d5d924f91c67ba84b2a1b89defd",
- "sha256:76c532fd68b93998aab92356be280deec5de8f8fe59cd28763d2cc8a58747b7f",
- "sha256:79244b9e97948eaf38695f4b8e6fc63b14b78cc37f403c6642ba555517ac1268",
- "sha256:7c58f598d9fcc52772b89a92d72bf8829c12d09746a6d2c724c5b30076c1f11d",
- "sha256:7dc09198e4073e6015d9a8ea093fc348d4e59de49382476940c3dd9ae156fba8",
- "sha256:80e043a89c6cadefd3a0712f8a1322038e819ebe9dbac7eca3bce1721bcb63bf",
- "sha256:851977788b9caa8ed011f5f643d3ee8653af02c5fc723fa350db5125abf2be7b",
- "sha256:8eddc033e716f8c91c6a2112f0a8ebc5e00532b4a6ae1eb0ccc48e027f9c671c",
- "sha256:902319cfe23366595d3fa769b5b751e6ee6750a0a64c5d9f757d624b2ac3519e",
- "sha256:954e73c9cd4d6ae319f1c936ad159072b6d356a92dcbbabfd6e6204b9a79d356",
- "sha256:ab888624ed68930442a3f3b0b921ad7439c51ba122dbc8c386e6487a658e4a4e",
- "sha256:acebba1a23fb9d72b42471c3771b6f2f18dcd46df77482612054bd45c07dfa36",
- "sha256:b4ebed0977f92320f6686c96e9e8dd29eed199eb8d066936bac991afc37cbb70",
- "sha256:badb868fff14cfd0e200eaa845887b1011146a7d26d579aaa7f966c203736b92",
- "sha256:be4e0f229cf3a71f9ecd633566bd6f80d9fa6afaaff5489492be63fe459ef98c",
- "sha256:c0f84360dcca3481e8674393bdf931f9f10470988f87311b19d23cda869bb6b7",
- "sha256:c1e41b32d6f7f9c26bc731a8b529ff592f31fc8b6ef2be9fa74abd05c8a342d7",
- "sha256:c88fa7410e9fc471e0858638f403739ee869924dd8e4ae26748496466e27ac59",
- "sha256:cf98fd7a6c8aaa08dbc699ffae33fd71175696d78028281bc7b832b26f00ca57",
- "sha256:d072f7dfbdb184f0786d63bda26e8a0882041b1e393fbe98940395f7fab4c5e2",
- "sha256:d1b5d457acbadcf8b27561deeaa386b0217f47626b29672fa7bd31deb6e91e1b",
- "sha256:d3dcb5548ead4f1123851a5ced467791f6986d68c656bc63bfff1bf9e36671e2",
- "sha256:d6157793719de168b199194f6b6173f0ccd3bf3499e6870fac17086072e39115",
- "sha256:d728b08448e5ac3e4d886b165385a262883c34b84a7fe1166277fe675e1c197a",
- "sha256:de8df0684398bd74ad160afdc2a118ca28384ac6f5e234eb0508858d8d2d9364",
- "sha256:e6a02cf7271ee94674a44f4e62aa061d2d049001c844657740e156596298b70b",
- "sha256:ea12133df25e3a6918718fbb9a510c6ee5d3fdd5a346320421aac3882f4feeea",
- "sha256:ea5a79e808baef98c48c884effce05c31a0698c1057de8fc1c688891043c1ce1",
- "sha256:f43b4a2e6218371dd4f41e547bd919ceeb6ebf4abf31a7a0669cd11cd91ea973",
- "sha256:f762442bab706fd874064ca218b33a1d8e40d4938e96c24dafd9b12e28017f45",
- "sha256:f89468059ebc519a7acde1ee50b779019535db8dcf9b8c162ef669257fef7a93",
- "sha256:f907c7359ce8bf7f7e63c82f75ad0223384105f5126f313400b7e8004d9b33c3"
- ],
- "index": "pypi",
- "version": "==22.3.0"
- },
- "qtconsole": {
- "hashes": [
- "sha256:73994105b0369bb99f4164df4a131010f3c7b33a7b5169c37366358d8744675b",
- "sha256:bbc34bca14f65535afcb401bc74b752bac955e5313001ba640383f7e5857dc49"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==5.1.1"
- },
- "qtpy": {
- "hashes": [
- "sha256:83c502973e9fdd7b648d8267a421229ea3d9a0651c22e4c65a4d9228479c39b6",
- "sha256:d6e4ae3a41f1fcb19762b58f35ad6dd443b4bdc867a4cb81ef10ccd85403c92b"
- ],
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'",
- "version": "==1.11.2"
- },
- "redis": {
- "hashes": [
- "sha256:0e7e0cfca8660dea8b7d5cd8c4f6c5e29e11f31158c0b0ae91a397f00e5a05a2",
- "sha256:432b788c4530cfe16d8d943a09d40ca6c16149727e4afe8c2c9d5580c59d9f24"
- ],
- "index": "pypi",
- "version": "==3.5.3"
- },
"requests": {
"hashes": [
"sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24",
@@ -3512,47 +2005,6 @@
"index": "pypi",
"version": "==1.5.1"
},
- "s2sphere": {
- "hashes": [
- "sha256:c2478c1ff7c601a59a7151a57b605435897514578fa6bdb8730721c182adbbaf",
- "sha256:d2340c9cf458ddc9a89afd1d8048a4195ce6fa6b0095ab900d4be5271e537401"
- ],
- "index": "pypi",
- "version": "==0.2.5"
- },
- "s3transfer": {
- "hashes": [
- "sha256:50ed823e1dc5868ad40c8dc92072f757aa0e653a192845c94a3b676f4a62da4c",
- "sha256:9c1dc369814391a6bda20ebbf4b70a0f34630592c9aa520856bf384916af2803"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==0.5.0"
- },
- "scikit-image": {
- "hashes": [
- "sha256:05b430b1f8e25f7ba4a55afc6bf592af00f0ec809ab1d80bdede8893e7c6af57",
- "sha256:088bf793696a3d5f56cce27c75d415fa795d1db9336b7e8257a1764dc03c7c52",
- "sha256:0bf23d3d182ba8fe4ef8a0935e843be1f6c99e7eebeb492ac07c305e8cbb1dcd",
- "sha256:0bf3cdadc15db90f875bf59bdd0db080337e6353bb3d165c281f9af456d9d3f2",
- "sha256:142d070a41f9dfed0c3661e0dd9ce3cdb59a20a5b5ab071f529577d6d3e1fb81",
- "sha256:2f24eb3df859ba5b3fb66947fe2d7240653b38f307d574e25f1ae29cc2a212ee",
- "sha256:3068af85682e90fda021070969dd2fce667f89a868c6aacb2fffbc5aa002e39e",
- "sha256:3f3aa984638a6868171d176d26d6bd17b7b16a9fd505eaa97482f00a4310e3ff",
- "sha256:7994866857a1bb388cf3ede4ca7a8fba0b89ef980d5d802ec25e30124a2a34db",
- "sha256:7f27357adae9225df10fd152224d4c43978ae222f44bad7fedbfc2b81b985f9d",
- "sha256:8394ad148685ed6ea8d84eb9c41e70cef1adda6c6d9a0ff8476c3126818a9340",
- "sha256:9b60fe0bc6e770c126c625f8c2d8af3b20fea53dac845abdf474bef1bd526490",
- "sha256:b29982f07231f60d6170f4c2c6f2fe88051a7b4194d775aefd81bfee107452b9",
- "sha256:bfa6eb04dc0b8773043f9994eccd8c517d713cd0f9e960dcb6754e19c1abceb1",
- "sha256:e2148846fae22e12b7a20d11d951adae57213dd097af5960407eb5c4421c0ab3",
- "sha256:ec242ff35bd4bc531aaf00c6edb9f0f64ff36ff353bd6ecd8f1c77886ddc0a7a",
- "sha256:ecae99f93f4c5e9b1bf34959f4dc596c41f2f6b2fc407d9d9ddf85aebd3137ca",
- "sha256:ef92f42d8a0794c47df1eeb1937119b6686b523dc663ecc5ffdf3c91645719ac",
- "sha256:f698fc715202eeccabb371190c19c2d6713696de4d07609a0fa0cae3acb0b3dd"
- ],
- "index": "pypi",
- "version": "==0.18.3"
- },
"scipy": {
"hashes": [
"sha256:1437073f1d4664990879aa8f9547524764372e0fef84a077be4b19e82bba7a8d",
@@ -3575,6 +2027,7 @@
"sha256:a80eb01c43fd98257ec7a49ff5cec0edba32031b5f86503f55399a48cb2c5379",
"sha256:cac71d5476a6f56b50459da21f6221707e0051ebd428b2137db32ef4a43bb15e",
"sha256:d86abd1ddf421dea5e9cebfeb4de0d205b3dc04e78249afedba9c6c3b2227ff2",
+ "sha256:dc2d1bf41294e63c7302bf499973ac0c7f73c93c01763db43055f6525234bf11",
"sha256:e08b81fcd9bf98740b58dc6fdd7879e33a64dcb682201c1135f7d4a75216bb05",
"sha256:e3efe7ef75dfe627b354ab0af0dbc918eadee97cc80ff1aabea6d3e01114ebdd",
"sha256:fa2dbabaaecdb502641b0b3c00dec05fb475ae48655c66da16c9ed24eda1e711"
@@ -3582,99 +2035,13 @@
"index": "pypi",
"version": "==1.7.2"
},
- "seaborn": {
+ "setuptools-scm": {
"hashes": [
- "sha256:85a6baa9b55f81a0623abddc4a26b334653ff4c6b18c418361de19dbba0ef283",
- "sha256:cf45e9286d40826864be0e3c066f98536982baf701a7caa386511792d61ff4f6"
- ],
- "index": "pypi",
- "version": "==0.11.2"
- },
- "send2trash": {
- "hashes": [
- "sha256:d2c24762fd3759860a0aff155e45871447ea58d2be6bdd39b5c8f966a0c99c2d",
- "sha256:f20eaadfdb517eaca5ce077640cb261c7d2698385a6a0f072a4a5447fd49fa08"
- ],
- "version": "==1.8.0"
- },
- "shapely": {
- "hashes": [
- "sha256:0e640d6da59172d679270f0dfd88128b6ae7c57df864a030dd858ff924c307fc",
- "sha256:13cbb959863cec32d48e2cffdc4bb81828bc3b0fa4256c9b2b32edac5021a0e4",
- "sha256:19b54cd840883fd71cce98fd94916d1731eed8a32c115eb082b3ed24e631be02",
- "sha256:1c5632cedea6d815b61eb4c264da1c3f24a8ce2ceba2f74e30fba340ca230563",
- "sha256:26b43b69dfeb8a8cb27aacf5597134baf12337845c2bacb01809540c20d3d904",
- "sha256:2c3cc87e66cbffd00ce0457c03969b64935752824bf43a1cd61f21cf606997d6",
- "sha256:4e8cdffeec6d0c47ed1eb215ec4e80c024ac05be6ded982061c1e1188034f22f",
- "sha256:622f62d2b2da81dd40841a56db0f78bcf9f9af7a83c7d5f5dc9bcb234aa650ba",
- "sha256:68bdf463f7a609fbed42bbded18fa74c82a5741251984a5597d070060f4286f4",
- "sha256:78b3a46dadd47c27e658d5e8d9006b4b1eb9b7ab947b450059225dcee799a18f",
- "sha256:796b15a483ac37c2dc757654186d0e064a42fb6f43cb9d1ff65d81cd0c92a84e",
- "sha256:7e1aebf4f1b2fbef40152fd531216387fcf6fe4ff2d777268381979b63c7c779",
- "sha256:83145eda2e582c2046d1ecc6a0d7dbfe97f492434311124f65ea60f4e87a6b65",
- "sha256:83d10f8b47a7568fc90063f72da62cda201dc92ecadf80cc00c015babc48e11f",
- "sha256:8917a91430126165cfa4bc2b4cf168121e37ff0c8657134e7398c597ca1fe934",
- "sha256:9b54ebd8fa4b78320f6d87032fe91363c7c1bf0f8d4a30eb93bca6413f787fd5",
- "sha256:bd84d993a0e8e07f5ebb4c67794d5392fdd23ce59a7ccc121900f2080f57989a",
- "sha256:cfb9d72d255af1a484e3859f4c9bb737950faf1d16c21d2b949ffc4ba5f46147",
- "sha256:d4ce1f18a0c9bb6b483c73bd7a0eb3a5e90676bcc29b9c27120236e662195c9d",
- "sha256:f304243b1f4d7bca9b3c9fdeec6565171e1b611fb4a3d6c93efc870c8a75958c",
- "sha256:f5307ee14ba4199f8bbcf6532ca33064661c1433960c432c84f0daa73b47ef9c"
- ],
- "index": "pypi",
- "version": "==1.8.0"
- },
- "simplejson": {
- "hashes": [
- "sha256:065230b9659ac38c8021fa512802562d122afb0cf8d4b89e257014dcddb5730a",
- "sha256:07707ba69324eaf58f0c6f59d289acc3e0ed9ec528dae5b0d4219c0d6da27dc5",
- "sha256:10defa88dd10a0a4763f16c1b5504e96ae6dc68953cfe5fc572b4a8fcaf9409b",
- "sha256:140eb58809f24d843736edb8080b220417e22c82ac07a3dfa473f57e78216b5f",
- "sha256:188f2c78a8ac1eb7a70a4b2b7b9ad11f52181044957bf981fb3e399c719e30ee",
- "sha256:1c2688365743b0f190392e674af5e313ebe9d621813d15f9332e874b7c1f2d04",
- "sha256:24e413bd845bd17d4d72063d64e053898543fb7abc81afeae13e5c43cef9c171",
- "sha256:2b59acd09b02da97728d0bae8ff48876d7efcbbb08e569c55e2d0c2e018324f5",
- "sha256:2df15814529a4625ea6f7b354a083609b3944c269b954ece0d0e7455872e1b2a",
- "sha256:352c11582aa1e49a2f0f7f7d8fd5ec5311da890d1354287e83c63ab6af857cf5",
- "sha256:36b08b886027eac67e7a0e822e3a5bf419429efad7612e69501669d6252a21f2",
- "sha256:376023f51edaf7290332dacfb055bc00ce864cb013c0338d0dea48731f37e42f",
- "sha256:3ba82f8b421886f4a2311c43fb98faaf36c581976192349fef2a89ed0fcdbdef",
- "sha256:3d72aa9e73134dacd049a2d6f9bd219f7be9c004d03d52395831611d66cedb71",
- "sha256:40ece8fa730d1a947bff792bcc7824bd02d3ce6105432798e9a04a360c8c07b0",
- "sha256:417b7e119d66085dc45bdd563dcb2c575ee10a3b1c492dd3502a029448d4be1c",
- "sha256:42b7c7264229860fe879be961877f7466d9f7173bd6427b3ba98144a031d49fb",
- "sha256:457d9cfe7ece1571770381edccdad7fc255b12cd7b5b813219441146d4f47595",
- "sha256:4a6943816e10028eeed512ea03be52b54ea83108b408d1049b999f58a760089b",
- "sha256:5b94df70bd34a3b946c0eb272022fb0f8a9eb27cad76e7f313fedbee2ebe4317",
- "sha256:5f5051a13e7d53430a990604b532c9124253c5f348857e2d5106d45fc8533860",
- "sha256:5f7f53b1edd4b23fb112b89208377480c0bcee45d43a03ffacf30f3290e0ed85",
- "sha256:5fe8c6dcb9e6f7066bdc07d3c410a2fca78c0d0b4e0e72510ffd20a60a20eb8e",
- "sha256:71a54815ec0212b0cba23adc1b2a731bdd2df7b9e4432718b2ed20e8aaf7f01a",
- "sha256:7332f7b06d42153255f7bfeb10266141c08d48cc1a022a35473c95238ff2aebc",
- "sha256:78c6f0ed72b440ebe1892d273c1e5f91e55e6861bea611d3b904e673152a7a4c",
- "sha256:7c9b30a2524ae6983b708f12741a31fbc2fb8d6fecd0b6c8584a62fd59f59e09",
- "sha256:86fcffc06f1125cb443e2bed812805739d64ceb78597ac3c1b2d439471a09717",
- "sha256:87572213965fd8a4fb7a97f837221e01d8fddcfb558363c671b8aa93477fb6a2",
- "sha256:8e595de17178dd3bbeb2c5b8ea97536341c63b7278639cb8ee2681a84c0ef037",
- "sha256:917f01db71d5e720b731effa3ff4a2c702a1b6dacad9bcdc580d86a018dfc3ca",
- "sha256:91cfb43fb91ff6d1e4258be04eee84b51a4ef40a28d899679b9ea2556322fb50",
- "sha256:aa86cfdeb118795875855589934013e32895715ec2d9e8eb7a59be3e7e07a7e1",
- "sha256:ade09aa3c284d11f39640aebdcbb748e1996f0c60504f8c4a0c5a9fec821e67a",
- "sha256:b2a5688606dffbe95e1347a05b77eb90489fe337edde888e23bbb7fd81b0d93b",
- "sha256:b92fbc2bc549c5045c8233d954f3260ccf99e0f3ec9edfd2372b74b350917752",
- "sha256:c2d5334d935af711f6d6dfeec2d34e071cdf73ec0df8e8bd35ac435b26d8da97",
- "sha256:cb0afc3bad49eb89a579103616574a54b523856d20fc539a4f7a513a0a8ba4b2",
- "sha256:ce66f730031b9b3683b2fc6ad4160a18db86557c004c3d490a29bf8d450d7ab9",
- "sha256:e29b9cea4216ec130df85d8c36efb9985fda1c9039e4706fb30e0fb6a67602ff",
- "sha256:e2cc4b68e59319e3de778325e34fbff487bfdb2225530e89995402989898d681",
- "sha256:e90d2e219c3dce1500dda95f5b893c293c4d53c4e330c968afbd4e7a90ff4a5b",
- "sha256:f13c48cc4363829bdfecc0c181b6ddf28008931de54908a492dc8ccd0066cd60",
- "sha256:f550730d18edec4ff9d4252784b62adfe885d4542946b6d5a54c8a6521b56afd",
- "sha256:fa843ee0d34c7193f5a816e79df8142faff851549cab31e84b526f04878ac778",
- "sha256:fe1c33f78d2060719d52ea9459d97d7ae3a5b707ec02548575c4fbed1d1d345b"
+ "sha256:4c64444b1d49c4063ae60bfe1680f611c8b13833d556fd1d6050c0023162a119",
+ "sha256:a49aa8081eeb3514eb9728fa5040f2eaa962d6c6f4ec9c32f6c1fba88f88a0f2"
],
- "index": "pypi",
- "version": "==3.17.5"
+ "markers": "python_version >= '3.6'",
+ "version": "==6.3.2"
},
"six": {
"hashes": [
@@ -3684,20 +2051,12 @@
"index": "pypi",
"version": "==1.16.0"
},
- "sniffio": {
- "hashes": [
- "sha256:471b71698eac1c2112a40ce2752bb2f4a4814c22a54a3eed3676bc0f5ca9f663",
- "sha256:c4666eecec1d3f50960c6bdf61ab7bc350648da6c126e3cf6898d8cd4ddcd3de"
- ],
- "markers": "python_version >= '3.5'",
- "version": "==1.2.0"
- },
"snowballstemmer": {
"hashes": [
- "sha256:b51b447bea85f9968c13b650126a888aabd4cb4463fca868ec596826325dedc2",
- "sha256:e997baa4f2e9139951b6f4c631bad912dfd3c792467e2f03d7239464af90e914"
+ "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1",
+ "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"
],
- "version": "==2.1.0"
+ "version": "==2.2.0"
},
"sortedcontainers": {
"hashes": [
@@ -3708,11 +2067,11 @@
},
"sphinx": {
"hashes": [
- "sha256:94078db9184491e15bce0a56d9186e0aec95f16ac20b12d00e06d4e36f1058a6",
- "sha256:98a535c62a4fcfcc362528592f69b26f7caec587d32cd55688db580be0287ae0"
+ "sha256:6d051ab6e0d06cba786c4656b0fe67ba259fe058410f49e95bee6e49c4052cbf",
+ "sha256:7e2b30da5f39170efcd95c6270f07669d623c276521fee27ad6c380f49d2bf5b"
],
"index": "pypi",
- "version": "==4.2.0"
+ "version": "==4.3.0"
},
"sphinx-rtd-theme": {
"hashes": [
@@ -3770,48 +2129,6 @@
"markers": "python_version >= '3.5'",
"version": "==1.1.5"
},
- "sqlalchemy": {
- "hashes": [
- "sha256:07ac4461a1116b317519ddf6f34bcb00b011b5c1370ebeaaf56595504ffc7e84",
- "sha256:090536fd23bf49077ee94ff97142bc5ee8bad24294c3d7c8d5284267c885dde7",
- "sha256:1dee515578d04bc80c4f9a8c8cfe93f455db725059e885f1b1da174d91c4d077",
- "sha256:1ef37c9ec2015ce2f0dc1084514e197f2f199d3dc3514190db7620b78e6004c8",
- "sha256:295b90efef1278f27fe27d94a45460ae3c17f5c5c2b32c163e29c359740a1599",
- "sha256:2ce42ad1f59eb85c55c44fb505f8854081ee23748f76b62a7f569cfa9b6d0604",
- "sha256:2feb028dc75e13ba93456a42ac042b255bf94dbd692bf80b47b22653bb25ccf8",
- "sha256:31f4426cfad19b5a50d07153146b2bcb372a279975d5fa39f98883c0ef0f3313",
- "sha256:3c0c5f54560a92691d54b0768d67b4d3159e514b426cfcb1258af8c195577e8f",
- "sha256:463ef692259ff8189be42223e433542347ae17e33f91c1013e9c5c64e2798088",
- "sha256:4a882dedb9dfa6f33524953c3e3d72bcf518a5defd6d5863150a821928b19ad3",
- "sha256:4c185c928e2638af9bae13acc3f70e0096eac76471a1101a10f96b80666b8270",
- "sha256:5039faa365e7522a8eb4736a54afd24a7e75dcc33b81ab2f0e6c456140f1ad64",
- "sha256:5c6774b34782116ad9bdec61c2dbce9faaca4b166a0bc8e7b03c2b870b121d94",
- "sha256:6bc7f9d7d90ef55e8c6db1308a8619cd8f40e24a34f759119b95e7284dca351a",
- "sha256:7e8ef103eaa72a857746fd57dda5b8b5961e8e82a528a3f8b7e2884d8506f0b7",
- "sha256:7ef421c3887b39c6f352e5022a53ac18de8387de331130481cb956b2d029cad6",
- "sha256:908fad32c53b17aad12d722379150c3c5317c422437e44032256a77df1746292",
- "sha256:91efbda4e6d311812f23996242bad7665c1392209554f8a31ec6db757456db5c",
- "sha256:a6506c17b0b6016656783232d0bdd03fd333f1f654d51a14d93223f953903646",
- "sha256:a95bf9c725012dcd7ea3cac16bf647054e0d62b31d67467d228338e6a163e4ff",
- "sha256:ad7e403fc1e3cb76e802872694e30d6ca6129b9bc6ad4e7caa48ca35f8a144f8",
- "sha256:b86f762cee3709722ab4691981958cbec475ea43406a6916a7ec375db9cbd9e9",
- "sha256:ba84026e84379326bbf2f0c50792f2ae56ab9c01937df5597b6893810b8ca369",
- "sha256:bca660b76672e15d70a7dba5e703e1ce451a0257b6bd2028e62b0487885e8ae9",
- "sha256:c24c01dcd03426a5fe5ee7af735906bec6084977b9027a3605d11d949a565c01",
- "sha256:c2f2114b0968a280f94deeeaa31cfbac9175e6ac7bd3058b3ce6e054ecd762b3",
- "sha256:c46f013ff31b80cbe36410281675e1fb4eaf3e25c284fd8a69981c73f6fa4cb4",
- "sha256:c757ba1279b85b3460e72e8b92239dae6f8b060a75fb24b3d9be984dd78cfa55",
- "sha256:cc6b21f19bc9d4cd77cbcba5f3b260436ce033f1053cea225b6efea2603d201e",
- "sha256:dbf588ab09e522ac2cbd010919a592c6aae2f15ccc3cd9a96d01c42fbc13f63e",
- "sha256:de996756d894a2d52c132742e3b6d64ecd37e0919ddadf4dc3981818777c7e67",
- "sha256:e700d48056475d077f867e6a36e58546de71bdb6fdc3d34b879e3240827fefab",
- "sha256:f1e97c5f36b94542f72917b62f3a2f92be914b2cf33b80fa69cede7529241d2a",
- "sha256:fb2aa74a6e3c2cebea38dd21633671841fbe70ea486053cba33d68e3e22ccc0a",
- "sha256:ff8f91a7b1c4a1c7772caa9efe640f2768828897044748f2458b708f1026e2d4"
- ],
- "index": "pypi",
- "version": "==1.4.26"
- },
"subprocess32": {
"hashes": [
"sha256:88e37c1aac5388df41cc8a8456bb49ebffd321a3ad4d70358e3518176de3a56b",
@@ -3821,13 +2138,6 @@
"index": "pypi",
"version": "==3.5.4"
},
- "tabulate": {
- "hashes": [
- "sha256:d7c013fe7abbc5e491394e10fa845f8f32fe54f8dc60c6622c6cf482d25d47e4",
- "sha256:eb1d13f25760052e8931f2ef80aaf6045a6cceb47514db8beab24cded16f13a7"
- ],
- "version": "==0.8.9"
- },
"tenacity": {
"hashes": [
"sha256:43242a20e3e73291a28bcbcacfd6e000b02d3857a9a9fff56b297a27afdc932f",
@@ -3836,30 +2146,6 @@
"index": "pypi",
"version": "==8.0.1"
},
- "terminado": {
- "hashes": [
- "sha256:09fdde344324a1c9c6e610ee4ca165c4bb7f5bbf982fceeeb38998a988ef8452",
- "sha256:b20fd93cc57c1678c799799d117874367cc07a3d2d55be95205b1a88fa08393f"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==0.12.1"
- },
- "testpath": {
- "hashes": [
- "sha256:1acf7a0bcd3004ae8357409fc33751e16d37ccc650921da1094a86581ad1e417",
- "sha256:8044f9a0bab6567fc644a3593164e872543bb44225b0e24846e2c89237937589"
- ],
- "markers": "python_version >= '3.5'",
- "version": "==0.5.0"
- },
- "tifffile": {
- "hashes": [
- "sha256:153e31fa1d892f482fabb2ae9f2561fa429ee42d01a6f67e58cee13637d9285b",
- "sha256:2e0066f90e2dbeb3e6a287cfd78bafbd2f142fabbca4a76a8ff809573baf5ad5"
- ],
- "markers": "python_version >= '3.7'",
- "version": "==2021.11.2"
- },
"toml": {
"hashes": [
"sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b",
@@ -3868,69 +2154,21 @@
"markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'",
"version": "==0.10.2"
},
- "tornado": {
- "hashes": [
- "sha256:0a00ff4561e2929a2c37ce706cb8233b7907e0cdc22eab98888aca5dd3775feb",
- "sha256:0d321a39c36e5f2c4ff12b4ed58d41390460f798422c4504e09eb5678e09998c",
- "sha256:1e8225a1070cd8eec59a996c43229fe8f95689cb16e552d130b9793cb570a288",
- "sha256:20241b3cb4f425e971cb0a8e4ffc9b0a861530ae3c52f2b0434e6c1b57e9fd95",
- "sha256:25ad220258349a12ae87ede08a7b04aca51237721f63b1808d39bdb4b2164558",
- "sha256:33892118b165401f291070100d6d09359ca74addda679b60390b09f8ef325ffe",
- "sha256:33c6e81d7bd55b468d2e793517c909b139960b6c790a60b7991b9b6b76fb9791",
- "sha256:3447475585bae2e77ecb832fc0300c3695516a47d46cefa0528181a34c5b9d3d",
- "sha256:34ca2dac9e4d7afb0bed4677512e36a52f09caa6fded70b4e3e1c89dbd92c326",
- "sha256:3e63498f680547ed24d2c71e6497f24bca791aca2fe116dbc2bd0ac7f191691b",
- "sha256:548430be2740e327b3fe0201abe471f314741efcb0067ec4f2d7dcfb4825f3e4",
- "sha256:6196a5c39286cc37c024cd78834fb9345e464525d8991c21e908cc046d1cc02c",
- "sha256:61b32d06ae8a036a6607805e6720ef00a3c98207038444ba7fd3d169cd998910",
- "sha256:6286efab1ed6e74b7028327365cf7346b1d777d63ab30e21a0f4d5b275fc17d5",
- "sha256:65d98939f1a2e74b58839f8c4dab3b6b3c1ce84972ae712be02845e65391ac7c",
- "sha256:66324e4e1beede9ac79e60f88de548da58b1f8ab4b2f1354d8375774f997e6c0",
- "sha256:6c77c9937962577a6a76917845d06af6ab9197702a42e1346d8ae2e76b5e3675",
- "sha256:70dec29e8ac485dbf57481baee40781c63e381bebea080991893cd297742b8fd",
- "sha256:7250a3fa399f08ec9cb3f7b1b987955d17e044f1ade821b32e5f435130250d7f",
- "sha256:748290bf9112b581c525e6e6d3820621ff020ed95af6f17fedef416b27ed564c",
- "sha256:7da13da6f985aab7f6f28debab00c67ff9cbacd588e8477034c0652ac141feea",
- "sha256:8f959b26f2634a091bb42241c3ed8d3cedb506e7c27b8dd5c7b9f745318ddbb6",
- "sha256:9de9e5188a782be6b1ce866e8a51bc76a0fbaa0e16613823fc38e4fc2556ad05",
- "sha256:a48900ecea1cbb71b8c71c620dee15b62f85f7c14189bdeee54966fbd9a0c5bd",
- "sha256:b87936fd2c317b6ee08a5741ea06b9d11a6074ef4cc42e031bc6403f82a32575",
- "sha256:c77da1263aa361938476f04c4b6c8916001b90b2c2fdd92d8d535e1af48fba5a",
- "sha256:cb5ec8eead331e3bb4ce8066cf06d2dfef1bfb1b2a73082dfe8a161301b76e37",
- "sha256:cc0ee35043162abbf717b7df924597ade8e5395e7b66d18270116f8745ceb795",
- "sha256:d14d30e7f46a0476efb0deb5b61343b1526f73ebb5ed84f23dc794bdb88f9d9f",
- "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32",
- "sha256:d3d20ea5782ba63ed13bc2b8c291a053c8d807a8fa927d941bd718468f7b950c",
- "sha256:d3f7594930c423fd9f5d1a76bee85a2c36fd8b4b16921cae7e965f22575e9c01",
- "sha256:dcef026f608f678c118779cd6591c8af6e9b4155c44e0d1bc0c87c036fb8c8c4",
- "sha256:e0791ac58d91ac58f694d8d2957884df8e4e2f6687cdf367ef7eb7497f79eaa2",
- "sha256:e385b637ac3acaae8022e7e47dfa7b83d3620e432e3ecb9a3f7f58f150e50921",
- "sha256:e519d64089b0876c7b467274468709dadf11e41d65f63bba207e04217f47c085",
- "sha256:e7229e60ac41a1202444497ddde70a48d33909e484f96eb0da9baf8dc68541df",
- "sha256:ed3ad863b1b40cd1d4bd21e7498329ccaece75db5a5bf58cd3c9f130843e7102",
- "sha256:f0ba29bafd8e7e22920567ce0d232c26d4d47c8b5cf4ed7b562b5db39fa199c5",
- "sha256:fa2ba70284fa42c2a5ecb35e322e68823288a4251f9ba9cc77be04ae15eada68",
- "sha256:fba85b6cd9c39be262fcd23865652920832b61583de2a2ca907dbd8e8a8c81e5"
- ],
- "markers": "python_version >= '3.5'",
- "version": "==6.1"
- },
- "traitlets": {
+ "tomli": {
"hashes": [
- "sha256:059f456c5a7c1c82b98c2e8c799f39c9b8128f6d0d46941ee118daace9eb70c7",
- "sha256:2d313cc50a42cd6c277e7d7dc8d4d7fedd06a2c215f78766ae7b1a66277e0033"
+ "sha256:c6ce0015eb38820eaf32b5db832dbc26deb3dd427bd5f6556cf0acac2c214fee",
+ "sha256:f04066f68f5554911363063a30b108d2b5a5b1a010aa8b6132af78489fe3aade"
],
- "markers": "python_version >= '3.7'",
- "version": "==5.1.1"
+ "markers": "python_version >= '3.6'",
+ "version": "==1.2.2"
},
"typing-extensions": {
"hashes": [
- "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e",
- "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7",
- "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"
+ "sha256:2cdf80e4e04866a9b3689a51869016d36db0814d84b8d8a568d22781d45d27ed",
+ "sha256:829704698b22e13ec9eaf959122315eabb370b0884400e9818334d8b677023d9"
],
"markers": "python_version < '3.10'",
- "version": "==3.10.0.2"
+ "version": "==4.0.0"
},
"urllib3": {
"hashes": [
@@ -3947,186 +2185,6 @@
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
"version": "==20.10.0"
- },
- "wcwidth": {
- "hashes": [
- "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784",
- "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"
- ],
- "version": "==0.2.5"
- },
- "webencodings": {
- "hashes": [
- "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78",
- "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"
- ],
- "version": "==0.5.1"
- },
- "websocket-client": {
- "hashes": [
- "sha256:0133d2f784858e59959ce82ddac316634229da55b498aac311f1620567a710ec",
- "sha256:8dfb715d8a992f5712fff8c843adae94e22b22a99b2c5e6b0ec4a1a981cc4e0d"
- ],
- "index": "pypi",
- "version": "==1.2.1"
- },
- "werkzeug": {
- "hashes": [
- "sha256:63d3dc1cf60e7b7e35e97fa9861f7397283b75d765afcaefd993d6046899de8f",
- "sha256:aa2bb6fc8dee8d6c504c0ac1e7f5f7dc5810a9903e793b6f715a9f015bdadb9a"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==2.0.2"
- },
- "widgetsnbextension": {
- "hashes": [
- "sha256:763a9fdc836d141fa080005a886d63f66f73d56dba1fb5961afc239c77708569",
- "sha256:e0731a60ba540cd19bbbefe771a9076dcd2dde90713a8f87f27f53f2d1db7727"
- ],
- "version": "==3.5.2"
- },
- "wrapt": {
- "hashes": [
- "sha256:086218a72ec7d986a3eddb7707c8c4526d677c7b35e355875a0fe2918b059179",
- "sha256:0877fe981fd76b183711d767500e6b3111378ed2043c145e21816ee589d91096",
- "sha256:0a017a667d1f7411816e4bf214646d0ad5b1da2c1ea13dec6c162736ff25a374",
- "sha256:0cb23d36ed03bf46b894cfec777eec754146d68429c30431c99ef28482b5c1df",
- "sha256:1fea9cd438686e6682271d36f3481a9f3636195578bab9ca3382e2f5f01fc185",
- "sha256:220a869982ea9023e163ba915077816ca439489de6d2c09089b219f4e11b6785",
- "sha256:25b1b1d5df495d82be1c9d2fad408f7ce5ca8a38085e2da41bb63c914baadff7",
- "sha256:2dded5496e8f1592ec27079b28b6ad2a1ef0b9296d270f77b8e4a3a796cf6909",
- "sha256:2ebdde19cd3c8cdf8df3fc165bc7827334bc4e353465048b36f7deeae8ee0918",
- "sha256:43e69ffe47e3609a6aec0fe723001c60c65305784d964f5007d5b4fb1bc6bf33",
- "sha256:46f7f3af321a573fc0c3586612db4decb7eb37172af1bc6173d81f5b66c2e068",
- "sha256:47f0a183743e7f71f29e4e21574ad3fa95676136f45b91afcf83f6a050914829",
- "sha256:498e6217523111d07cd67e87a791f5e9ee769f9241fcf8a379696e25806965af",
- "sha256:4b9c458732450ec42578b5642ac53e312092acf8c0bfce140ada5ca1ac556f79",
- "sha256:51799ca950cfee9396a87f4a1240622ac38973b6df5ef7a41e7f0b98797099ce",
- "sha256:5601f44a0f38fed36cc07db004f0eedeaadbdcec90e4e90509480e7e6060a5bc",
- "sha256:5f223101f21cfd41deec8ce3889dc59f88a59b409db028c469c9b20cfeefbe36",
- "sha256:610f5f83dd1e0ad40254c306f4764fcdc846641f120c3cf424ff57a19d5f7ade",
- "sha256:6a03d9917aee887690aa3f1747ce634e610f6db6f6b332b35c2dd89412912bca",
- "sha256:705e2af1f7be4707e49ced9153f8d72131090e52be9278b5dbb1498c749a1e32",
- "sha256:766b32c762e07e26f50d8a3468e3b4228b3736c805018e4b0ec8cc01ecd88125",
- "sha256:77416e6b17926d953b5c666a3cb718d5945df63ecf922af0ee576206d7033b5e",
- "sha256:778fd096ee96890c10ce96187c76b3e99b2da44e08c9e24d5652f356873f6709",
- "sha256:78dea98c81915bbf510eb6a3c9c24915e4660302937b9ae05a0947164248020f",
- "sha256:7dd215e4e8514004c8d810a73e342c536547038fb130205ec4bba9f5de35d45b",
- "sha256:7dde79d007cd6dfa65afe404766057c2409316135cb892be4b1c768e3f3a11cb",
- "sha256:81bd7c90d28a4b2e1df135bfbd7c23aee3050078ca6441bead44c42483f9ebfb",
- "sha256:85148f4225287b6a0665eef08a178c15097366d46b210574a658c1ff5b377489",
- "sha256:865c0b50003616f05858b22174c40ffc27a38e67359fa1495605f96125f76640",
- "sha256:87883690cae293541e08ba2da22cacaae0a092e0ed56bbba8d018cc486fbafbb",
- "sha256:8aab36778fa9bba1a8f06a4919556f9f8c7b33102bd71b3ab307bb3fecb21851",
- "sha256:8c73c1a2ec7c98d7eaded149f6d225a692caa1bd7b2401a14125446e9e90410d",
- "sha256:936503cb0a6ed28dbfa87e8fcd0a56458822144e9d11a49ccee6d9a8adb2ac44",
- "sha256:944b180f61f5e36c0634d3202ba8509b986b5fbaf57db3e94df11abee244ba13",
- "sha256:96b81ae75591a795d8c90edc0bfaab44d3d41ffc1aae4d994c5aa21d9b8e19a2",
- "sha256:981da26722bebb9247a0601e2922cedf8bb7a600e89c852d063313102de6f2cb",
- "sha256:ae9de71eb60940e58207f8e71fe113c639da42adb02fb2bcbcaccc1ccecd092b",
- "sha256:b73d4b78807bd299b38e4598b8e7bd34ed55d480160d2e7fdaabd9931afa65f9",
- "sha256:d4a5f6146cfa5c7ba0134249665acd322a70d1ea61732723c7d3e8cc0fa80755",
- "sha256:dd91006848eb55af2159375134d724032a2d1d13bcc6f81cd8d3ed9f2b8e846c",
- "sha256:e05e60ff3b2b0342153be4d1b597bbcfd8330890056b9619f4ad6b8d5c96a81a",
- "sha256:e6906d6f48437dfd80464f7d7af1740eadc572b9f7a4301e7dd3d65db285cacf",
- "sha256:e92d0d4fa68ea0c02d39f1e2f9cb5bc4b4a71e8c442207433d8db47ee79d7aa3",
- "sha256:e94b7d9deaa4cc7bac9198a58a7240aaf87fe56c6277ee25fa5b3aa1edebd229",
- "sha256:ea3e746e29d4000cd98d572f3ee2a6050a4f784bb536f4ac1f035987fc1ed83e",
- "sha256:ec7e20258ecc5174029a0f391e1b948bf2906cd64c198a9b8b281b811cbc04de",
- "sha256:ec9465dd69d5657b5d2fa6133b3e1e989ae27d29471a672416fd729b429eb554",
- "sha256:f122ccd12fdc69628786d0c947bdd9cb2733be8f800d88b5a37c57f1f1d73c10",
- "sha256:f99c0489258086308aad4ae57da9e8ecf9e1f3f30fa35d5e170b4d4896554d80",
- "sha256:f9c51d9af9abb899bd34ace878fbec8bf357b3194a10c4e8e0a25512826ef056",
- "sha256:fd76c47f20984b43d93de9a82011bb6e5f8325df6c9ed4d8310029a55fa361ea"
- ],
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
- "version": "==1.13.3"
- },
- "yarl": {
- "hashes": [
- "sha256:044daf3012e43d4b3538562da94a88fb12a6490652dbc29fb19adfa02cf72eac",
- "sha256:0cba38120db72123db7c58322fa69e3c0efa933040ffb586c3a87c063ec7cae8",
- "sha256:167ab7f64e409e9bdd99333fe8c67b5574a1f0495dcfd905bc7454e766729b9e",
- "sha256:1be4bbb3d27a4e9aa5f3df2ab61e3701ce8fcbd3e9846dbce7c033a7e8136746",
- "sha256:1ca56f002eaf7998b5fcf73b2421790da9d2586331805f38acd9997743114e98",
- "sha256:1d3d5ad8ea96bd6d643d80c7b8d5977b4e2fb1bab6c9da7322616fd26203d125",
- "sha256:1eb6480ef366d75b54c68164094a6a560c247370a68c02dddb11f20c4c6d3c9d",
- "sha256:1edc172dcca3f11b38a9d5c7505c83c1913c0addc99cd28e993efeaafdfaa18d",
- "sha256:211fcd65c58bf250fb994b53bc45a442ddc9f441f6fec53e65de8cba48ded986",
- "sha256:29e0656d5497733dcddc21797da5a2ab990c0cb9719f1f969e58a4abac66234d",
- "sha256:368bcf400247318382cc150aaa632582d0780b28ee6053cd80268c7e72796dec",
- "sha256:39d5493c5ecd75c8093fa7700a2fb5c94fe28c839c8e40144b7ab7ccba6938c8",
- "sha256:3abddf0b8e41445426d29f955b24aeecc83fa1072be1be4e0d194134a7d9baee",
- "sha256:3bf8cfe8856708ede6a73907bf0501f2dc4e104085e070a41f5d88e7faf237f3",
- "sha256:3ec1d9a0d7780416e657f1e405ba35ec1ba453a4f1511eb8b9fbab81cb8b3ce1",
- "sha256:45399b46d60c253327a460e99856752009fcee5f5d3c80b2f7c0cae1c38d56dd",
- "sha256:52690eb521d690ab041c3919666bea13ab9fbff80d615ec16fa81a297131276b",
- "sha256:534b047277a9a19d858cde163aba93f3e1677d5acd92f7d10ace419d478540de",
- "sha256:580c1f15500e137a8c37053e4cbf6058944d4c114701fa59944607505c2fe3a0",
- "sha256:59218fef177296451b23214c91ea3aba7858b4ae3306dde120224cfe0f7a6ee8",
- "sha256:5ba63585a89c9885f18331a55d25fe81dc2d82b71311ff8bd378fc8004202ff6",
- "sha256:5bb7d54b8f61ba6eee541fba4b83d22b8a046b4ef4d8eb7f15a7e35db2e1e245",
- "sha256:6152224d0a1eb254f97df3997d79dadd8bb2c1a02ef283dbb34b97d4f8492d23",
- "sha256:67e94028817defe5e705079b10a8438b8cb56e7115fa01640e9c0bb3edf67332",
- "sha256:695ba021a9e04418507fa930d5f0704edbce47076bdcfeeaba1c83683e5649d1",
- "sha256:6a1a9fe17621af43e9b9fcea8bd088ba682c8192d744b386ee3c47b56eaabb2c",
- "sha256:6ab0c3274d0a846840bf6c27d2c60ba771a12e4d7586bf550eefc2df0b56b3b4",
- "sha256:6feca8b6bfb9eef6ee057628e71e1734caf520a907b6ec0d62839e8293e945c0",
- "sha256:737e401cd0c493f7e3dd4db72aca11cfe069531c9761b8ea474926936b3c57c8",
- "sha256:788713c2896f426a4e166b11f4ec538b5736294ebf7d5f654ae445fd44270832",
- "sha256:797c2c412b04403d2da075fb93c123df35239cd7b4cc4e0cd9e5839b73f52c58",
- "sha256:8300401dc88cad23f5b4e4c1226f44a5aa696436a4026e456fe0e5d2f7f486e6",
- "sha256:87f6e082bce21464857ba58b569370e7b547d239ca22248be68ea5d6b51464a1",
- "sha256:89ccbf58e6a0ab89d487c92a490cb5660d06c3a47ca08872859672f9c511fc52",
- "sha256:8b0915ee85150963a9504c10de4e4729ae700af11df0dc5550e6587ed7891e92",
- "sha256:8cce6f9fa3df25f55521fbb5c7e4a736683148bcc0c75b21863789e5185f9185",
- "sha256:95a1873b6c0dd1c437fb3bb4a4aaa699a48c218ac7ca1e74b0bee0ab16c7d60d",
- "sha256:9b4c77d92d56a4c5027572752aa35082e40c561eec776048330d2907aead891d",
- "sha256:9bfcd43c65fbb339dc7086b5315750efa42a34eefad0256ba114cd8ad3896f4b",
- "sha256:9c1f083e7e71b2dd01f7cd7434a5f88c15213194df38bc29b388ccdf1492b739",
- "sha256:a1d0894f238763717bdcfea74558c94e3bc34aeacd3351d769460c1a586a8b05",
- "sha256:a467a431a0817a292121c13cbe637348b546e6ef47ca14a790aa2fa8cc93df63",
- "sha256:aa32aaa97d8b2ed4e54dc65d241a0da1c627454950f7d7b1f95b13985afd6c5d",
- "sha256:ac10bbac36cd89eac19f4e51c032ba6b412b3892b685076f4acd2de18ca990aa",
- "sha256:ac35ccde589ab6a1870a484ed136d49a26bcd06b6a1c6397b1967ca13ceb3913",
- "sha256:bab827163113177aee910adb1f48ff7af31ee0289f434f7e22d10baf624a6dfe",
- "sha256:baf81561f2972fb895e7844882898bda1eef4b07b5b385bcd308d2098f1a767b",
- "sha256:bf19725fec28452474d9887a128e98dd67eee7b7d52e932e6949c532d820dc3b",
- "sha256:c01a89a44bb672c38f42b49cdb0ad667b116d731b3f4c896f72302ff77d71656",
- "sha256:c0910c6b6c31359d2f6184828888c983d54d09d581a4a23547a35f1d0b9484b1",
- "sha256:c10ea1e80a697cf7d80d1ed414b5cb8f1eec07d618f54637067ae3c0334133c4",
- "sha256:c1164a2eac148d85bbdd23e07dfcc930f2e633220f3eb3c3e2a25f6148c2819e",
- "sha256:c145ab54702334c42237a6c6c4cc08703b6aa9b94e2f227ceb3d477d20c36c63",
- "sha256:c17965ff3706beedafd458c452bf15bac693ecd146a60a06a214614dc097a271",
- "sha256:c19324a1c5399b602f3b6e7db9478e5b1adf5cf58901996fc973fe4fccd73eed",
- "sha256:c2a1ac41a6aa980db03d098a5531f13985edcb451bcd9d00670b03129922cd0d",
- "sha256:c6ddcd80d79c96eb19c354d9dca95291589c5954099836b7c8d29278a7ec0bda",
- "sha256:c9c6d927e098c2d360695f2e9d38870b2e92e0919be07dbe339aefa32a090265",
- "sha256:cc8b7a7254c0fc3187d43d6cb54b5032d2365efd1df0cd1749c0c4df5f0ad45f",
- "sha256:cff3ba513db55cc6a35076f32c4cdc27032bd075c9faef31fec749e64b45d26c",
- "sha256:d260d4dc495c05d6600264a197d9d6f7fc9347f21d2594926202fd08cf89a8ba",
- "sha256:d6f3d62e16c10e88d2168ba2d065aa374e3c538998ed04996cd373ff2036d64c",
- "sha256:da6df107b9ccfe52d3a48165e48d72db0eca3e3029b5b8cb4fe6ee3cb870ba8b",
- "sha256:dfe4b95b7e00c6635a72e2d00b478e8a28bfb122dc76349a06e20792eb53a523",
- "sha256:e39378894ee6ae9f555ae2de332d513a5763276a9265f8e7cbaeb1b1ee74623a",
- "sha256:ede3b46cdb719c794427dcce9d8beb4abe8b9aa1e97526cc20de9bd6583ad1ef",
- "sha256:f2a8508f7350512434e41065684076f640ecce176d262a7d54f0da41d99c5a95",
- "sha256:f44477ae29025d8ea87ec308539f95963ffdc31a82f42ca9deecf2d505242e72",
- "sha256:f64394bd7ceef1237cc604b5a89bf748c95982a84bcd3c4bbeb40f685c810794",
- "sha256:fc4dd8b01a8112809e6b636b00f487846956402834a7fd59d46d4f4267181c41",
- "sha256:fce78593346c014d0d986b7ebc80d782b7f5e19843ca798ed62f8e3ba8728576",
- "sha256:fd547ec596d90c8676e369dd8a581a21227fe9b4ad37d0dc7feb4ccf544c2d59"
- ],
- "markers": "python_version >= '3.6'",
- "version": "==1.7.2"
- },
- "zipp": {
- "hashes": [
- "sha256:71c644c5369f4a6e07636f0aa966270449561fcea2e3d6747b8d23efaa9d7832",
- "sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc"
- ],
- "markers": "python_version < '3.10'",
- "version": "==3.6.0"
}
}
}
diff --git a/RELEASES.md b/RELEASES.md
index 31383eec8015ec..aabe4254774878 100644
--- a/RELEASES.md
+++ b/RELEASES.md
@@ -1,9 +1,12 @@
+Version 0.8.12 (202X-XX-XX)
+========================
+
Version 0.8.11 (2021-11-22)
========================
* Support for an external panda on the comma three
* Navigation: Show more detailed instructions when approaching maneuver
* Fixed occasional steering faults on GM cars thanks to jyoung8607!
- * Nissan ECU firmware fingerprinting thanks to robin-reckmann, martinl and razem-io!
+ * Nissan ECU firmware fingerprinting thanks to robin-reckmann, martinl, and razem-io!
* Cadillac Escalade ESV 2016 support thanks to Gibby!
* Mazda CX-9 2021 support thanks to Jacar!
* Volkswagen Polo 2020 support thanks to jyoung8607!
diff --git a/SConstruct b/SConstruct
index 73c66690ade338..67acd3eac4637f 100644
--- a/SConstruct
+++ b/SConstruct
@@ -189,6 +189,7 @@ env = Environment(
"-Wno-inconsistent-missing-override",
"-Wno-c99-designator",
"-Wno-reorder-init-list",
+ "-Wno-error=unused-but-set-variable",
] + cflags + ccflags,
CPPPATH=cpppath + [
diff --git a/cereal b/cereal
index 78ded8f8606e17..5edffa0f494abf 160000
--- a/cereal
+++ b/cereal
@@ -1 +1 @@
-Subproject commit 78ded8f8606e1760f8bb99834ed4cbfc68c5d49e
+Subproject commit 5edffa0f494abfa2e907c497cda0f64223a421e7
diff --git a/docs/CARS.md b/docs/CARS.md
index 924b3f72cd7abf..aa23a85cecb0a6 100644
--- a/docs/CARS.md
+++ b/docs/CARS.md
@@ -46,7 +46,7 @@
| Toyota | Avalon 2016-21 | TSS-P | Stock3| 20mph1 | 0mph |
| Toyota | Avalon Hybrid 2019-21 | TSS-P | Stock3| 20mph1 | 0mph |
| Toyota | Camry 2018-20 | All | Stock | 0mph4 | 0mph |
-| Toyota | Camry 2021 | All | openpilot | 0mph4 | 0mph |
+| Toyota | Camry 2021-22 | All | openpilot | 0mph4 | 0mph |
| Toyota | Camry Hybrid 2018-20 | All | Stock | 0mph4 | 0mph |
| Toyota | Camry Hybrid 2021-22 | All | openpilot | 0mph | 0mph |
| Toyota | C-HR 2017-20 | All | Stock | 0mph | 0mph |
@@ -58,7 +58,7 @@
| Toyota | Highlander 2017-19 | All | Stock3| 0mph | 0mph |
| Toyota | Highlander 2020-22 | All | openpilot | 0mph | 0mph |
| Toyota | Highlander Hybrid 2017-19 | All | Stock3| 0mph | 0mph |
-| Toyota | Highlander Hybrid 2020-21 | All | openpilot | 0mph | 0mph |
+| Toyota | Highlander Hybrid 2020-22 | All | openpilot | 0mph | 0mph |
| Toyota | Mirai 2021 | All | openpilot | 0mph | 0mph |
| Toyota | Prius 2016-20 | TSS-P | Stock3| 0mph | 0mph |
| Toyota | Prius 2021 | All | openpilot | 0mph | 0mph |
diff --git a/opendbc b/opendbc
index b9669cbe5405fe..fedaf7eb31949e 160000
--- a/opendbc
+++ b/opendbc
@@ -1 +1 @@
-Subproject commit b9669cbe5405fe3cc3b591f7bba44b407021fde6
+Subproject commit fedaf7eb31949ee3b72831c1bc7bba7641b64912
diff --git a/panda b/panda
index ae26b75d7bac3d..571512a3923962 160000
--- a/panda
+++ b/panda
@@ -1 +1 @@
-Subproject commit ae26b75d7bac3d57b060f9fdc48b591fa23e0a25
+Subproject commit 571512a392396271e54469c562b2ba08cbb44bfc
diff --git a/release/files_common b/release/files_common
index bf8b22369364cc..ceaef0b0bf4607 100644
--- a/release/files_common
+++ b/release/files_common
@@ -130,6 +130,7 @@ selfdrive/car/hyundai/carcontroller.py
selfdrive/car/hyundai/hyundaican.py
selfdrive/car/toyota/__init__.py
selfdrive/car/toyota/carstate.py
+selfdrive/car/toyota/tunes.py
selfdrive/car/toyota/interface.py
selfdrive/car/toyota/radar_interface.py
selfdrive/car/toyota/values.py
diff --git a/selfdrive/boardd/boardd.cc b/selfdrive/boardd/boardd.cc
index c6f2cf8ed39867..50749a10617dae 100644
--- a/selfdrive/boardd/boardd.cc
+++ b/selfdrive/boardd/boardd.cc
@@ -158,8 +158,6 @@ Panda *usb_connect(std::string serial="", uint32_t index=0) {
return nullptr;
}
- Params params = Params();
-
if (getenv("BOARDD_LOOPBACK")) {
panda->set_loopback(true);
}
@@ -669,6 +667,11 @@ int main(int argc, char* argv[]) {
}
}
+ if (pandas.size() == 0) {
+ // do_exit was set while not connected to a panda
+ return 0;
+ }
+
peripheral_panda = pandas[0];
LOGW("connected to board");
diff --git a/selfdrive/boardd/panda.cc b/selfdrive/boardd/panda.cc
index b5bf3f903dbcf5..f101b2e3b20d37 100644
--- a/selfdrive/boardd/panda.cc
+++ b/selfdrive/boardd/panda.cc
@@ -344,6 +344,14 @@ void Panda::send_heartbeat() {
usb_write(0xf3, 1, 0);
}
+void Panda::set_can_speed_kbps(uint16_t bus, uint16_t speed) {
+ usb_write(0xde, bus, (speed * 10));
+}
+
+void Panda::set_data_speed_kbps(uint16_t bus, uint16_t speed) {
+ usb_write(0xf9, bus, (speed * 10));
+}
+
uint8_t Panda::len_to_dlc(uint8_t len) {
if (len <= 8) {
return len;
@@ -356,12 +364,14 @@ uint8_t Panda::len_to_dlc(uint8_t len) {
}
void Panda::can_send(capnp::List::Reader can_data_list) {
- send.resize(72 * can_data_list.size()); // TODO: need to include 1 byte for each usb 64bytes frame
+ if (send.size() < (can_data_list.size() * CANPACKET_MAX_SIZE)) {
+ send.resize(can_data_list.size() * CANPACKET_MAX_SIZE);
+ }
int msg_count = 0;
while (msg_count < can_data_list.size()) {
uint32_t pos = 0;
- while (pos < 256) {
+ while (pos < USB_TX_SOFT_LIMIT) {
if (msg_count == can_data_list.size()) { break; }
auto cmsg = can_data_list[msg_count];
@@ -376,26 +386,31 @@ void Panda::can_send(capnp::List::Reader can_data_list) {
assert(can_data.size() <= (hw_type == cereal::PandaState::PandaType::RED_PANDA) ? 64 : 8);
assert(can_data.size() == dlc_to_len[data_len_code]);
- *(uint32_t*)&send[pos+1] = (cmsg.getAddress() << 3);
- if (cmsg.getAddress() >= 0x800) {
- *(uint32_t*)&send[pos+1] |= (1 << 2);
- }
- send[pos] = data_len_code << 4 | ((bus - bus_offset) << 1);
- memcpy(&send[pos+5], can_data.begin(), can_data.size());
+ can_header header;
+ header.addr = cmsg.getAddress();
+ header.extended = (cmsg.getAddress() >= 0x800) ? 1 : 0;
+ header.data_len_code = data_len_code;
+ header.bus = bus - bus_offset;
+ memcpy(&send[pos], &header, CANPACKET_HEAD_SIZE);
+ memcpy(&send[pos+CANPACKET_HEAD_SIZE], can_data.begin(), can_data.size());
pos += CANPACKET_HEAD_SIZE + dlc_to_len[data_len_code];
msg_count++;
}
if (pos > 0) { // Helps not to spam with ZLP
- // insert counter
+ // Counter needs to be inserted every 64 bytes (first byte of 64 bytes USB packet)
uint8_t counter = 0;
- for (int i = 0; i < pos; i += 64) {
- send.insert(send.begin() + i, counter);
+ uint8_t to_write[USB_TX_SOFT_LIMIT+128];
+ int ptr = 0;
+ for (int i = 0; i < pos; i += 63) {
+ to_write[ptr] = counter;
+ int copy_size = ((pos - i) < 63) ? (pos - i) : 63;
+ memcpy(&to_write[ptr+1], &(send.data()[i]) , copy_size);
+ ptr += copy_size + 1;
counter++;
- pos++;
}
- usb_bulk_write(3, (uint8_t*)send.data(), pos, 5);
+ usb_bulk_write(3, to_write, ptr, 5);
}
}
}
@@ -407,7 +422,6 @@ bool Panda::can_receive(std::vector& out_vec) {
// Not sure if this can happen
if (recv < 0) recv = 0;
- // TODO: Might change from full to overloaded? if > some threshold that is lower than RECV_SIZE, let's say 80-90%
if (recv == RECV_SIZE) {
LOGW("Receive buffer full");
}
@@ -418,17 +432,18 @@ bool Panda::can_receive(std::vector& out_vec) {
out_vec.reserve(out_vec.size() + (recv / CANPACKET_HEAD_SIZE));
- static uint8_t tail[72];
+ static uint8_t tail[CANPACKET_MAX_SIZE];
uint8_t tail_size = 0;
uint8_t counter = 0;
for (int i = 0; i < recv; i += 64) {
+ // Check for counter every 64 bytes (length of USB packet)
if (counter != data[i]) {
LOGE("CAN: MALFORMED USB RECV PACKET");
break;
}
counter++;
uint8_t chunk_len = ((recv - i) > 64) ? 63 : (recv - i - 1); // as 1 is always reserved for counter
- uint8_t chunk[72];
+ uint8_t chunk[CANPACKET_MAX_SIZE];
memcpy(chunk, tail, tail_size);
memcpy(&chunk[tail_size], &data[i+1], chunk_len);
chunk_len += tail_size;
@@ -439,21 +454,22 @@ bool Panda::can_receive(std::vector& out_vec) {
uint8_t pckt_len = CANPACKET_HEAD_SIZE + data_len;
if (pckt_len <= (chunk_len - pos)) {
can_frame canData;
+ can_header header;
+ memcpy(&header, &chunk[pos], CANPACKET_HEAD_SIZE);
canData.busTime = 0;
- canData.address = (*(uint32_t*)&chunk[pos+1]) >> 3;
- canData.src = ((chunk[pos] >> 1) & 0x7) + bus_offset;
+ canData.address = header.addr;
+ canData.src = header.bus + bus_offset;
- bool rejected = chunk[pos+1] & 0x1;
- bool returned = (chunk[pos+1] >> 1) & 0x1;
- if (rejected) { canData.src += CANPACKET_REJECTED; }
- if (returned) { canData.src += CANPACKET_RETURNED; }
- canData.dat.assign((char*)&chunk[pos+5], data_len);
+ if (header.rejected) { canData.src += CANPACKET_REJECTED; }
+ if (header.returned) { canData.src += CANPACKET_RETURNED; }
+ canData.dat.assign((char*)&chunk[pos+CANPACKET_HEAD_SIZE], data_len);
pos += pckt_len;
// add to vector
out_vec.push_back(canData);
} else {
+ // Keep partial CAN packet until next USB packet
tail_size = (chunk_len - pos);
memcpy(tail, &chunk[pos], tail_size);
break;
diff --git a/selfdrive/boardd/panda.h b/selfdrive/boardd/panda.h
index 2373d1cb938139..415bb30103fc70 100644
--- a/selfdrive/boardd/panda.h
+++ b/selfdrive/boardd/panda.h
@@ -13,11 +13,12 @@
#include "cereal/gen/cpp/car.capnp.h"
#include "cereal/gen/cpp/log.capnp.h"
-// double the FIFO size
-#define RECV_SIZE (0x4000)
#define TIMEOUT 0
#define PANDA_BUS_CNT 4
-#define CANPACKET_HEAD_SIZE (0x5U)
+#define RECV_SIZE (0x4000U)
+#define USB_TX_SOFT_LIMIT (0x100U)
+#define CANPACKET_HEAD_SIZE 5U
+#define CANPACKET_MAX_SIZE 72U
#define CANPACKET_REJECTED (0xC0U)
#define CANPACKET_RETURNED (0x80U)
@@ -44,6 +45,16 @@ struct __attribute__((packed)) health_t {
uint8_t heartbeat_lost;
};
+struct __attribute__((packed)) can_header {
+ uint8_t reserved : 1;
+ uint8_t bus : 3;
+ uint8_t data_len_code : 4;
+ uint8_t rejected : 1;
+ uint8_t returned : 1;
+ uint8_t extended : 1;
+ uint32_t addr : 29;
+};
+
struct can_frame {
long address;
std::string dat;
@@ -96,6 +107,8 @@ class Panda {
void set_power_saving(bool power_saving);
void set_usb_power_mode(cereal::PeripheralState::UsbPowerMode power_mode);
void send_heartbeat();
+ void set_can_speed_kbps(uint16_t bus, uint16_t speed);
+ void set_data_speed_kbps(uint16_t bus, uint16_t speed);
uint8_t len_to_dlc(uint8_t len);
void can_send(capnp::List::Reader can_data_list);
bool can_receive(std::vector& out_vec);
diff --git a/selfdrive/camerad/cameras/camera_common.h b/selfdrive/camerad/cameras/camera_common.h
index 8387e60bf206c3..e994fc2208b722 100644
--- a/selfdrive/camerad/cameras/camera_common.h
+++ b/selfdrive/camerad/cameras/camera_common.h
@@ -34,6 +34,7 @@ enum CameraType {
WideRoadCam
};
+// TODO: remove these once all the internal tools are moved to vipc
const bool env_send_driver = getenv("SEND_DRIVER") != NULL;
const bool env_send_road = getenv("SEND_ROAD") != NULL;
const bool env_send_wide_road = getenv("SEND_WIDE_ROAD") != NULL;
diff --git a/selfdrive/camerad/cameras/camera_qcom2.cc b/selfdrive/camerad/cameras/camera_qcom2.cc
index 089d9e999bb19c..03138e353aa69c 100644
--- a/selfdrive/camerad/cameras/camera_qcom2.cc
+++ b/selfdrive/camerad/cameras/camera_qcom2.cc
@@ -551,7 +551,6 @@ int open_v4l_by_name_and_index(const char name[], int index, int flags = O_RDWR
}
static void camera_open(CameraState *s) {
- int ret;
s->sensor_fd = open_v4l_by_name_and_index("cam-sensor-driver", s->camera_num);
assert(s->sensor_fd >= 0);
LOGD("opened sensor");
@@ -566,7 +565,7 @@ static void camera_open(CameraState *s) {
// create session
struct cam_req_mgr_session_info session_info = {};
- ret = cam_control(s->multi_cam_state->video0_fd, CAM_REQ_MGR_CREATE_SESSION, &session_info, sizeof(session_info));
+ int ret = cam_control(s->multi_cam_state->video0_fd, CAM_REQ_MGR_CREATE_SESSION, &session_info, sizeof(session_info));
LOGD("get session: %d 0x%X", ret, session_info.session_hdl);
s->session_handle = session_info.session_hdl;
@@ -577,73 +576,59 @@ static void camera_open(CameraState *s) {
s->sensor_dev_handle = *sensor_dev_handle;
LOGD("acquire sensor dev");
- static struct cam_isp_resource isp_resource = {0};
- isp_resource.resource_id = CAM_ISP_RES_ID_PORT;
- isp_resource.length = sizeof(struct cam_isp_in_port_info) + sizeof(struct cam_isp_out_port_info)*(1-1);
- isp_resource.handle_type = CAM_HANDLE_USER_POINTER;
-
- struct cam_isp_in_port_info *in_port_info = (struct cam_isp_in_port_info *)malloc(isp_resource.length);
- isp_resource.res_hdl = (uint64_t)in_port_info;
-
- switch (s->camera_num) {
- case 0:
- in_port_info->res_type = CAM_ISP_IFE_IN_RES_PHY_0;
- break;
- case 1:
- in_port_info->res_type = CAM_ISP_IFE_IN_RES_PHY_1;
- break;
- case 2:
- in_port_info->res_type = CAM_ISP_IFE_IN_RES_PHY_2;
- break;
- }
-
- in_port_info->lane_type = CAM_ISP_LANE_TYPE_DPHY;
- in_port_info->lane_num = 4;
- in_port_info->lane_cfg = 0x3210;
-
- in_port_info->vc = 0x0;
- //in_port_info->dt = 0x2C; //CSI_RAW12
- //in_port_info->format = CAM_FORMAT_MIPI_RAW_12;
-
- in_port_info->dt = 0x2B; //CSI_RAW10
- in_port_info->format = CAM_FORMAT_MIPI_RAW_10;
-
- in_port_info->test_pattern = 0x2; // 0x3?
- in_port_info->usage_type = 0x0;
-
- in_port_info->left_start = 0x0;
- in_port_info->left_stop = FRAME_WIDTH - 1;
- in_port_info->left_width = FRAME_WIDTH;
-
- in_port_info->right_start = 0x0;
- in_port_info->right_stop = FRAME_WIDTH - 1;
- in_port_info->right_width = FRAME_WIDTH;
-
- in_port_info->line_start = 0x0;
- in_port_info->line_stop = FRAME_HEIGHT - 1;
- in_port_info->height = FRAME_HEIGHT;
-
- in_port_info->pixel_clk = 0x0;
- in_port_info->batch_size = 0x0;
- in_port_info->dsp_mode = 0x0;
- in_port_info->hbi_cnt = 0x0;
- in_port_info->custom_csid = 0x0;
-
- in_port_info->num_out_res = 0x1;
- in_port_info->data[0] = (struct cam_isp_out_port_info){
- .res_type = CAM_ISP_IFE_OUT_RES_RDI_0,
- //.format = CAM_FORMAT_MIPI_RAW_12,
- .format = CAM_FORMAT_MIPI_RAW_10,
- .width = FRAME_WIDTH,
- .height = FRAME_HEIGHT,
- .comp_grp_id = 0x0, .split_point = 0x0, .secure_mode = 0x0,
+ struct cam_isp_in_port_info in_port_info = {
+ .res_type = (uint32_t[]){CAM_ISP_IFE_IN_RES_PHY_0, CAM_ISP_IFE_IN_RES_PHY_1, CAM_ISP_IFE_IN_RES_PHY_2}[s->camera_num],
+
+ .lane_type = CAM_ISP_LANE_TYPE_DPHY,
+ .lane_num = 4,
+ .lane_cfg = 0x3210,
+
+ .vc = 0x0,
+ // .dt = 0x2C; //CSI_RAW12
+ .dt = 0x2B, //CSI_RAW10
+ .format = CAM_FORMAT_MIPI_RAW_10,
+
+ .test_pattern = 0x2, // 0x3?
+ .usage_type = 0x0,
+
+ .left_start = 0,
+ .left_stop = FRAME_WIDTH - 1,
+ .left_width = FRAME_WIDTH,
+
+ .right_start = 0,
+ .right_stop = FRAME_WIDTH - 1,
+ .right_width = FRAME_WIDTH,
+
+ .line_start = 0,
+ .line_stop = FRAME_HEIGHT - 1,
+ .height = FRAME_HEIGHT,
+
+ .pixel_clk = 0x0,
+ .batch_size = 0x0,
+ .dsp_mode = 0x0,
+ .hbi_cnt = 0x0,
+ .custom_csid = 0x0,
+
+ .num_out_res = 0x1,
+ .data[0] = (struct cam_isp_out_port_info){
+ .res_type = CAM_ISP_IFE_OUT_RES_RDI_0,
+ .format = CAM_FORMAT_MIPI_RAW_10,
+ .width = FRAME_WIDTH,
+ .height = FRAME_HEIGHT,
+ .comp_grp_id = 0x0, .split_point = 0x0, .secure_mode = 0x0,
+ },
+ };
+ struct cam_isp_resource isp_resource = {
+ .resource_id = CAM_ISP_RES_ID_PORT,
+ .handle_type = CAM_HANDLE_USER_POINTER,
+ .res_hdl = (uint64_t)&in_port_info,
+ .length = sizeof(in_port_info),
};
auto isp_dev_handle = device_acquire(s->multi_cam_state->isp_fd, s->session_handle, &isp_resource);
assert(isp_dev_handle);
s->isp_dev_handle = *isp_dev_handle;
LOGD("acquire isp dev");
- free(in_port_info);
struct cam_csiphy_acquire_dev_info csiphy_acquire_dev_info = {.combo_mode = 0};
auto csiphy_dev_handle = device_acquire(s->csiphy_fd, s->session_handle, &csiphy_acquire_dev_info);
@@ -651,19 +636,14 @@ static void camera_open(CameraState *s) {
s->csiphy_dev_handle = *csiphy_dev_handle;
LOGD("acquire csiphy dev");
- // acquires done
-
// config ISP
alloc_w_mmu_hdl(s->multi_cam_state->video0_fd, 984480, (uint32_t*)&s->buf0_handle, 0x20, CAM_MEM_FLAG_HW_READ_WRITE | CAM_MEM_FLAG_KMD_ACCESS | CAM_MEM_FLAG_UMD_ACCESS | CAM_MEM_FLAG_CMD_BUF_TYPE, s->multi_cam_state->device_iommu, s->multi_cam_state->cdm_iommu);
config_isp(s, 0, 0, 1, s->buf0_handle, 0);
LOG("-- Configuring sensor");
- sensors_i2c(s, init_array_ar0231, sizeof(init_array_ar0231)/sizeof(struct i2c_random_wr_payload),
- CAM_SENSOR_PACKET_OPCODE_SENSOR_CONFIG);
- //sensors_i2c(s, start_reg_array, sizeof(start_reg_array)/sizeof(struct i2c_random_wr_payload),
- //CAM_SENSOR_PACKET_OPCODE_SENSOR_STREAMON);
- //sensors_i2c(s, stop_reg_array, sizeof(stop_reg_array)/sizeof(struct i2c_random_wr_payload),
- //CAM_SENSOR_PACKET_OPCODE_SENSOR_STREAMOFF);
+ sensors_i2c(s, init_array_ar0231, std::size(init_array_ar0231), CAM_SENSOR_PACKET_OPCODE_SENSOR_CONFIG);
+ //sensors_i2c(s, start_reg_array, std::size(start_reg_array), CAM_SENSOR_PACKET_OPCODE_SENSOR_STREAMON);
+ //sensors_i2c(s, stop_reg_array, std::size(stop_reg_array), CAM_SENSOR_PACKET_OPCODE_SENSOR_STREAMOFF);
// config csiphy
LOG("-- Config CSI PHY");
@@ -700,7 +680,7 @@ static void camera_open(CameraState *s) {
// link devices
LOG("-- Link devices");
- static struct cam_req_mgr_link_info req_mgr_link_info = {0};
+ struct cam_req_mgr_link_info req_mgr_link_info = {0};
req_mgr_link_info.session_hdl = s->session_handle;
req_mgr_link_info.num_devices = 2;
req_mgr_link_info.dev_hdls[0] = s->isp_dev_handle;
@@ -709,7 +689,7 @@ static void camera_open(CameraState *s) {
LOGD("link: %d", ret);
s->link_handle = req_mgr_link_info.link_hdl;
- static struct cam_req_mgr_link_control req_mgr_link_control = {0};
+ struct cam_req_mgr_link_control req_mgr_link_control = {0};
req_mgr_link_control.ops = CAM_REQ_MGR_LINK_ACTIVATE;
req_mgr_link_control.session_hdl = s->session_handle;
req_mgr_link_control.num_links = 1;
diff --git a/selfdrive/camerad/snapshot/snapshot.py b/selfdrive/camerad/snapshot/snapshot.py
index 787d628370e34e..889e1579bf5949 100755
--- a/selfdrive/camerad/snapshot/snapshot.py
+++ b/selfdrive/camerad/snapshot/snapshot.py
@@ -1,5 +1,4 @@
#!/usr/bin/env python3
-import os
import subprocess
import time
@@ -8,24 +7,29 @@
from typing import List
import cereal.messaging as messaging
+from cereal.visionipc.visionipc_pyx import VisionIpcClient, VisionStreamType # pylint: disable=no-name-in-module, import-error
from common.params import Params
from common.realtime import DT_MDL
-from common.transformations.camera import eon_f_frame_size, eon_d_frame_size, tici_f_frame_size
-from selfdrive.hardware import TICI
+from selfdrive.hardware import TICI, PC
from selfdrive.controls.lib.alertmanager import set_offroad_alert
from selfdrive.manager.process_config import managed_processes
LM_THRESH = 120 # defined in selfdrive/camerad/imgproc/utils.h
+VISION_STREAMS = {
+ "roadCameraState": VisionStreamType.VISION_STREAM_RGB_BACK,
+ "driverCameraState": VisionStreamType.VISION_STREAM_RGB_FRONT,
+ "wideRoadCameraState": VisionStreamType.VISION_STREAM_RGB_WIDE,
+}
+
def jpeg_write(fn, dat):
img = Image.fromarray(dat)
img.save(fn, "JPEG")
-def extract_image(dat, frame_sizes):
- img = np.frombuffer(dat, dtype=np.uint8)
- w, h = frame_sizes[len(img) // 3]
+def extract_image(buf, w, h, stride):
+ img = np.hstack([buf[i * stride:i * stride + 3 * w] for i in range(h)])
b = img[::3].reshape(h, w)
g = img[1::3].reshape(h, w)
r = img[2::3].reshape(h, w)
@@ -33,45 +37,47 @@ def extract_image(dat, frame_sizes):
def rois_in_focus(lapres: List[float]) -> float:
- sz = len(lapres)
- return sum([1. / sz for sharpness in
- lapres if sharpness >= LM_THRESH])
+ return sum([1. / len(lapres) for sharpness in lapres if sharpness >= LM_THRESH])
def get_snapshots(frame="roadCameraState", front_frame="driverCameraState", focus_perc_threshold=0.):
- frame_sizes = [eon_f_frame_size, eon_d_frame_size, tici_f_frame_size]
- frame_sizes = {w * h: (w, h) for (w, h) in frame_sizes}
-
- sockets = []
- if frame is not None:
- sockets.append(frame)
- if front_frame is not None:
- sockets.append(front_frame)
+ sockets = [s for s in (frame, front_frame) if s is not None]
+ sm = messaging.SubMaster(sockets)
+ vipc_clients = {s: VisionIpcClient("camerad", VISION_STREAMS[s], True) for s in sockets}
# wait 4 sec from camerad startup for focus and exposure
- sm = messaging.SubMaster(sockets)
while sm[sockets[0]].frameId < int(4. / DT_MDL):
sm.update()
+ for client in vipc_clients.values():
+ client.connect(True)
+
+ # wait for focus
start_t = time.monotonic()
while time.monotonic() - start_t < 10:
- sm.update()
+ sm.update(100)
if min(sm.rcv_frame.values()) > 1 and rois_in_focus(sm[frame].sharpnessScore) >= focus_perc_threshold:
break
- rear = extract_image(sm[frame].image, frame_sizes) if frame is not None else None
- front = extract_image(sm[front_frame].image, frame_sizes) if front_frame is not None else None
+ # grab images
+ rear, front = None, None
+ if frame is not None:
+ c = vipc_clients[frame]
+ rear = extract_image(c.recv(), c.width, c.height, c.stride)
+ if front_frame is not None:
+ c = vipc_clients[front_frame]
+ front = extract_image(c.recv(), c.width, c.height, c.stride)
return rear, front
def snapshot():
params = Params()
- front_camera_allowed = params.get_bool("RecordFront")
if (not params.get_bool("IsOffroad")) or params.get_bool("IsTakingSnapshot"):
print("Already taking snapshot")
return None, None
+ front_camera_allowed = params.get_bool("RecordFront")
params.put_bool("IsTakingSnapshot", True)
set_offroad_alert("Offroad_IsTakingSnapshot", True)
time.sleep(2.0) # Give thermald time to read the param, or if just started give camerad time to start
@@ -86,13 +92,11 @@ def snapshot():
except subprocess.CalledProcessError:
pass
- os.environ["SEND_ROAD"] = "1"
- os.environ["SEND_WIDE_ROAD"] = "1"
- if front_camera_allowed:
- os.environ["SEND_DRIVER"] = "1"
-
try:
- managed_processes['camerad'].start()
+ # Allow testing on replay on PC
+ if not PC:
+ managed_processes['camerad'].start()
+
frame = "wideRoadCameraState" if TICI else "roadCameraState"
front_frame = "driverCameraState" if front_camera_allowed else None
focus_perc_threshold = 0. if TICI else 10 / 12.
diff --git a/selfdrive/camerad/test/test_exposure.py b/selfdrive/camerad/test/test_exposure.py
index 0b5b5ace8898da..6ed69627b50d27 100755
--- a/selfdrive/camerad/test/test_exposure.py
+++ b/selfdrive/camerad/test/test_exposure.py
@@ -1,8 +1,6 @@
#!/usr/bin/env python3
-
import time
import unittest
-import os
import numpy as np
from selfdrive.test.helpers import with_processes
@@ -13,11 +11,6 @@
TEST_TIME = 45
REPEAT = 5
-os.environ["SEND_ROAD"] = "1"
-os.environ["SEND_DRIVER"] = "1"
-if TICI:
- os.environ["SEND_WIDE_ROAD"] = "1"
-
class TestCamerad(unittest.TestCase):
@classmethod
def setUpClass(cls):
@@ -38,14 +31,11 @@ def _is_exposure_okay(self, i, med_mean=np.array([[0.2,0.4],[0.2,0.6]])):
print([i_median, i_mean])
return med_ex[0] < i_median < med_ex[1] and mean_ex[0] < i_mean < mean_ex[1]
-
@with_processes(['camerad'])
def test_camera_operation(self):
- print("checking image outputs")
-
- start = time.time()
passed = 0
- while(time.time() - start < TEST_TIME and passed < REPEAT):
+ start = time.time()
+ while time.time() - start < TEST_TIME and passed < REPEAT:
rpic, dpic = get_snapshots(frame="roadCameraState", front_frame="driverCameraState")
res = self._is_exposure_okay(rpic)
@@ -61,8 +51,7 @@ def test_camera_operation(self):
passed += int(res)
time.sleep(2)
- print(passed)
- self.assertTrue(passed >= REPEAT)
+ self.assertGreaterEqual(passed, REPEAT)
if __name__ == "__main__":
unittest.main()
diff --git a/selfdrive/car/honda/carcontroller.py b/selfdrive/car/honda/carcontroller.py
index 088e42476ea0b3..1e0a35fdf50222 100644
--- a/selfdrive/car/honda/carcontroller.py
+++ b/selfdrive/car/honda/carcontroller.py
@@ -232,7 +232,7 @@ def update(self, enabled, active, CS, frame, actuators, pcm_cancel_cmd,
# This prevents unexpected pedal range rescaling
# Sending non-zero gas when OP is not enabled will cause the PCM not to respond to throttle as expected
# when you do enable.
- if enabled:
+ if active:
apply_gas = clip(gas_mult * (gas - brake + wind_brake*3/4), 0., 1.)
else:
apply_gas = 0.0
diff --git a/selfdrive/car/mazda/values.py b/selfdrive/car/mazda/values.py
index 4e4ecd341c26f1..ada3ea1ddbb8f3 100644
--- a/selfdrive/car/mazda/values.py
+++ b/selfdrive/car/mazda/values.py
@@ -46,13 +46,14 @@ class Buttons:
],
(Ecu.engine, 0x7e0, None): [
b'PA53-188K2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
- b'PYNF-188K2-F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'PYFA-188K2-J\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'PYFC-188K2-J\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'PYFD-188K2-J\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYNF-188K2-F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'PX2G-188K2-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'PX2H-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
- b'PX2H-188K2-D\0x0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PX2H-188K2-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PX2K-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'PX38-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'PX42-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'PX68-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
@@ -67,14 +68,14 @@ class Buttons:
],
(Ecu.esp, 0x760, None): [
b'K123-437K2-E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'KBJ5-437K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'KL2K-437K2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'KN0W-437K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
- b'KBJ5-437K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
],
(Ecu.fwdCamera, 0x706, None): [
- b'B61L-67XK2-T\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'B61L-67XK2-R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'B61L-67XK2-S\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'B61L-67XK2-T\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'B61L-67XK2-V\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'GSH7-67XK2-J\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'GSH7-67XK2-N\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
@@ -82,14 +83,15 @@ class Buttons:
(Ecu.transmission, 0x7e1, None): [
b'PA66-21PS1-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'PX39-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PX39-21PS1-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PX68-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'PYB1-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'PYB1-21PS1-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
- b'PX68-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
- b'PYNC-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'PYB2-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'PYB2-21PS1-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'PYB2-21PS1-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'PYB2-21PS1-G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYNC-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'SH9T-21PS1-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
],
},
@@ -101,55 +103,59 @@ class Buttons:
b'KJ01-3210X-L-00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
],
(Ecu.engine, 0x7e0, None): [
- b'PYFM-188K2-F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
- b'PYD7-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'PX23-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'PX24-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'PXN8-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PXN8-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYD7-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYD8-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYFM-188K2-F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
],
(Ecu.fwdRadar, 0x764, None): [
- b'TK80-67XK2-E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'K123-67XK2-F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'K131-67XK2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'K131-67XK2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'TK80-67XK2-E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
],
(Ecu.esp, 0x760, None): [
+ b'TA0B-437K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'TK79-437K2-E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'TM53-437K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'TN40-437K2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
- b'TA0B-437K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
],
(Ecu.fwdCamera, 0x706, None): [
- b'TK80-67XK2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'B61L-67XK2-P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'B61L-67XK2-V\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'GSH7-67XK2-K\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
- ],
+ b'TK80-67XK2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ ],
(Ecu.transmission, 0x7e1, None): [
+ b'PXM7-21PS1-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PXM7-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'PYFM-21PS1-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'PYD5-21PS1-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'PYD5-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PYD6-21PS1-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'PYD6-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
- b'PXM7-21PS1-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
],
},
CAR.MAZDA3: {
(Ecu.eps, 0x730, None): [
+ b'BHN1-3210X-J-00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'K070-3210X-C-00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'KR11-3210X-K-00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
- b'BHN1-3210X-J-00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
],
(Ecu.engine, 0x7e0, None): [
b'P5JD-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
+ b'PY2P-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'PYKC-188K2-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'PYKE-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
- b'PY2P-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
],
(Ecu.fwdRadar, 0x764, None): [
+ b'B63C-67XK2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'GHP9-67Y10---41\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'K131-67XK2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
- b'B63C-67XK2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
],
(Ecu.esp, 0x760, None): [
b'B45A-437AS-0-08\x00\x00\x00\x00\x00\x00\x00\x00\x00',
@@ -173,8 +179,8 @@ class Buttons:
b'GFBC-3210X-A-00\000\000\000\000\000\000\000\000\000',
],
(Ecu.engine, 0x7e0, None): [
- b'PYH7-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'PX4F-188K2-D\000\000\000\000\000\000\000\000\000\000\000\000',
+ b'PYH7-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
],
(Ecu.fwdRadar, 0x764, None): [
b'K131-67XK2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
@@ -189,8 +195,8 @@ class Buttons:
b'GSH7-67XK2-P\000\000\000\000\000\000\000\000\000\000\000\000',
],
(Ecu.transmission, 0x7e1, None): [
- b'PYH7-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'PYH3-21PS1-D\000\000\000\000\000\000\000\000\000\000\000\000',
+ b'PYH7-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
],
},
diff --git a/selfdrive/car/toyota/carcontroller.py b/selfdrive/car/toyota/carcontroller.py
index 2d17ee20f821df..daf91a49d38262 100644
--- a/selfdrive/car/toyota/carcontroller.py
+++ b/selfdrive/car/toyota/carcontroller.py
@@ -37,7 +37,7 @@ def __init__(self, dbc_name, CP, VM):
self.packer = CANPacker(dbc_name)
- def update(self, enabled, CS, frame, actuators, pcm_cancel_cmd, hud_alert,
+ def update(self, enabled, active, CS, frame, actuators, pcm_cancel_cmd, hud_alert,
left_line, right_line, lead, left_lane_depart, right_lane_depart):
# *** compute control surfaces ***
@@ -53,7 +53,7 @@ def update(self, enabled, CS, frame, actuators, pcm_cancel_cmd, hud_alert,
elif CS.out.vEgo > MIN_ACC_SPEED + PEDAL_HYST_GAP:
self.use_interceptor = False
- if self.use_interceptor and enabled:
+ if self.use_interceptor and active:
# only send negative accel when using interceptor. gas handles acceleration
# +0.18 m/s^2 offset to reduce ABS pump usage when OP is engaged
MAX_INTERCEPTOR_GAS = interp(CS.out.vEgo, [0.0, MIN_ACC_SPEED], [0.2, 0.5])
diff --git a/selfdrive/car/toyota/interface.py b/selfdrive/car/toyota/interface.py
index 643876af118a93..a1221ae8a4184e 100755
--- a/selfdrive/car/toyota/interface.py
+++ b/selfdrive/car/toyota/interface.py
@@ -1,7 +1,8 @@
#!/usr/bin/env python3
from cereal import car
from selfdrive.config import Conversions as CV
-from selfdrive.car.toyota.values import Ecu, CAR, TSS2_CAR, NO_DSU_CAR, MIN_ACC_SPEED, PEDAL_HYST_GAP, CarControllerParams
+from selfdrive.car.toyota.tunes import LatTunes, LongTunes, set_long_tune, set_lat_tune
+from selfdrive.car.toyota.values import Ecu, CAR, TSS2_CAR, NO_DSU_CAR, MIN_ACC_SPEED, CarControllerParams
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint, get_safety_config
from selfdrive.car.interfaces import CarInterfaceBase
@@ -23,267 +24,208 @@ def get_params(candidate, fingerprint=gen_empty_fingerprint(), car_fw=[]): # py
ret.steerActuatorDelay = 0.12 # Default delay, Prius has larger delay
ret.steerLimitTimer = 0.4
- ret.stoppingControl = False # Toyota starts braking more when it thinks you want to stop
+ ret.stoppingControl = False # Toyota starts braking more when it thinks you want to stop
- if candidate not in [CAR.PRIUS, CAR.RAV4, CAR.RAV4H]: # These cars use LQR/INDI
- ret.lateralTuning.init('pid')
- ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kpBP = [[0.], [0.]]
+ # Most cars use this default safety param
+ ret.safetyConfigs[0].safetyParam = 73
if candidate == CAR.PRIUS:
- stop_and_go = True
ret.safetyConfigs[0].safetyParam = 66 # see conversion factor for STEER_TORQUE_EPS in dbc file
+ stop_and_go = True
ret.wheelbase = 2.70
ret.steerRatio = 15.74 # unknown end-to-end spec
tire_stiffness_factor = 0.6371 # hand-tune
ret.mass = 3045. * CV.LB_TO_KG + STD_CARGO_KG
- ret.lateralTuning.init('indi')
- ret.lateralTuning.indi.innerLoopGainBP = [0.]
- ret.lateralTuning.indi.innerLoopGainV = [4.0]
- ret.lateralTuning.indi.outerLoopGainBP = [0.]
- ret.lateralTuning.indi.outerLoopGainV = [3.0]
- ret.lateralTuning.indi.timeConstantBP = [0.]
- ret.lateralTuning.indi.timeConstantV = [1.0]
- ret.lateralTuning.indi.actuatorEffectivenessBP = [0.]
- ret.lateralTuning.indi.actuatorEffectivenessV = [1.0]
+ set_lat_tune(ret.lateralTuning, LatTunes.INDI_PRIUS)
ret.steerActuatorDelay = 0.3
elif candidate in [CAR.RAV4, CAR.RAV4H]:
stop_and_go = True if (candidate in CAR.RAV4H) else False
- ret.safetyConfigs[0].safetyParam = 73
ret.wheelbase = 2.65
ret.steerRatio = 16.88 # 14.5 is spec end-to-end
tire_stiffness_factor = 0.5533
ret.mass = 3650. * CV.LB_TO_KG + STD_CARGO_KG # mean between normal and hybrid
- ret.lateralTuning.init('lqr')
-
- ret.lateralTuning.lqr.scale = 1500.0
- ret.lateralTuning.lqr.ki = 0.05
-
- ret.lateralTuning.lqr.a = [0., 1., -0.22619643, 1.21822268]
- ret.lateralTuning.lqr.b = [-1.92006585e-04, 3.95603032e-05]
- ret.lateralTuning.lqr.c = [1., 0.]
- ret.lateralTuning.lqr.k = [-110.73572306, 451.22718255]
- ret.lateralTuning.lqr.l = [0.3233671, 0.3185757]
- ret.lateralTuning.lqr.dcGain = 0.002237852961363602
+ set_lat_tune(ret.lateralTuning, LatTunes.LQR_RAV4)
elif candidate == CAR.COROLLA:
- stop_and_go = False
ret.safetyConfigs[0].safetyParam = 88
+ stop_and_go = False
ret.wheelbase = 2.70
ret.steerRatio = 18.27
tire_stiffness_factor = 0.444 # not optimized yet
ret.mass = 2860. * CV.LB_TO_KG + STD_CARGO_KG # mean between normal and hybrid
- ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.2], [0.05]]
- ret.lateralTuning.pid.kf = 0.00003 # full torque for 20 deg at 80mph means 0.00007818594
+ set_lat_tune(ret.lateralTuning, LatTunes.PID_A)
elif candidate == CAR.LEXUS_RX:
stop_and_go = True
- ret.safetyConfigs[0].safetyParam = 73
ret.wheelbase = 2.79
ret.steerRatio = 14.8
tire_stiffness_factor = 0.5533
ret.mass = 4387. * CV.LB_TO_KG + STD_CARGO_KG
- ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.05]]
- ret.lateralTuning.pid.kf = 0.00006
+ set_lat_tune(ret.lateralTuning, LatTunes.PID_B)
+
elif candidate == CAR.LEXUS_RXH:
stop_and_go = True
- ret.safetyConfigs[0].safetyParam = 73
ret.wheelbase = 2.79
ret.steerRatio = 16. # 14.8 is spec end-to-end
tire_stiffness_factor = 0.444 # not optimized yet
ret.mass = 4481. * CV.LB_TO_KG + STD_CARGO_KG # mean between min and max
- ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.1]]
- ret.lateralTuning.pid.kf = 0.00006 # full torque for 10 deg at 80mph means 0.00007818594
+ set_lat_tune(ret.lateralTuning, LatTunes.PID_C)
elif candidate == CAR.LEXUS_RX_TSS2:
stop_and_go = True
- ret.safetyConfigs[0].safetyParam = 73
ret.wheelbase = 2.79
ret.steerRatio = 14.8
tire_stiffness_factor = 0.5533 # not optimized yet
ret.mass = 4387. * CV.LB_TO_KG + STD_CARGO_KG
- ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.1]]
- ret.lateralTuning.pid.kf = 0.00007818594
+ set_lat_tune(ret.lateralTuning, LatTunes.PID_D)
elif candidate == CAR.LEXUS_RXH_TSS2:
stop_and_go = True
- ret.safetyConfigs[0].safetyParam = 73
ret.wheelbase = 2.79
ret.steerRatio = 16.0 # 14.8 is spec end-to-end
tire_stiffness_factor = 0.444 # not optimized yet
ret.mass = 4481.0 * CV.LB_TO_KG + STD_CARGO_KG # mean between min and max
- ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.15]]
- ret.lateralTuning.pid.kf = 0.00007818594
+ set_lat_tune(ret.lateralTuning, LatTunes.PID_E)
elif candidate in [CAR.CHR, CAR.CHRH]:
stop_and_go = True
- ret.safetyConfigs[0].safetyParam = 73
ret.wheelbase = 2.63906
ret.steerRatio = 13.6
tire_stiffness_factor = 0.7933
ret.mass = 3300. * CV.LB_TO_KG + STD_CARGO_KG
- ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.723], [0.0428]]
- ret.lateralTuning.pid.kf = 0.00006
+ set_lat_tune(ret.lateralTuning, LatTunes.PID_F)
elif candidate in [CAR.CAMRY, CAR.CAMRYH, CAR.CAMRY_TSS2, CAR.CAMRYH_TSS2]:
stop_and_go = True
- ret.safetyConfigs[0].safetyParam = 73
ret.wheelbase = 2.82448
ret.steerRatio = 13.7
tire_stiffness_factor = 0.7933
ret.mass = 3400. * CV.LB_TO_KG + STD_CARGO_KG # mean between normal and hybrid
- ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.1]]
- ret.lateralTuning.pid.kf = 0.00006
+ set_lat_tune(ret.lateralTuning, LatTunes.PID_C)
elif candidate in [CAR.HIGHLANDER_TSS2, CAR.HIGHLANDERH_TSS2]:
stop_and_go = True
- ret.safetyConfigs[0].safetyParam = 73
ret.wheelbase = 2.84988 # 112.2 in = 2.84988 m
ret.steerRatio = 16.0
tire_stiffness_factor = 0.8
ret.mass = 4700. * CV.LB_TO_KG + STD_CARGO_KG # 4260 + 4-5 people
- ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.18], [0.015]] # community tuning
- ret.lateralTuning.pid.kf = 0.00012 # community tuning
+ set_lat_tune(ret.lateralTuning, LatTunes.PID_G)
elif candidate in [CAR.HIGHLANDER, CAR.HIGHLANDERH]:
stop_and_go = True
- ret.safetyConfigs[0].safetyParam = 73
ret.wheelbase = 2.78
ret.steerRatio = 16.0
tire_stiffness_factor = 0.8
ret.mass = 4607. * CV.LB_TO_KG + STD_CARGO_KG # mean between normal and hybrid limited
- ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.18], [0.015]] # community tuning
- ret.lateralTuning.pid.kf = 0.00012 # community tuning
+ set_lat_tune(ret.lateralTuning, LatTunes.PID_G)
elif candidate in [CAR.AVALON, CAR.AVALON_2019, CAR.AVALONH_2019]:
stop_and_go = False
- ret.safetyConfigs[0].safetyParam = 73
ret.wheelbase = 2.82
ret.steerRatio = 14.8 # Found at https://pressroom.toyota.com/releases/2016+avalon+product+specs.download
tire_stiffness_factor = 0.7983
ret.mass = 3505. * CV.LB_TO_KG + STD_CARGO_KG # mean between normal and hybrid
- ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.17], [0.03]]
- ret.lateralTuning.pid.kf = 0.00006
+ set_lat_tune(ret.lateralTuning, LatTunes.PID_H)
elif candidate in [CAR.RAV4_TSS2, CAR.RAV4H_TSS2]:
stop_and_go = True
- ret.safetyConfigs[0].safetyParam = 73
ret.wheelbase = 2.68986
ret.steerRatio = 14.3
tire_stiffness_factor = 0.7933
- ret.mass = 3585. * CV.LB_TO_KG + STD_CARGO_KG # Average between ICE and Hybrid
- ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.1]]
- ret.lateralTuning.pid.kf = 0.00007818594
+ ret.mass = 3585. * CV.LB_TO_KG + STD_CARGO_KG # Average between ICE and Hybrid
+ set_lat_tune(ret.lateralTuning, LatTunes.PID_D)
# 2019+ Rav4 TSS2 uses two different steering racks and specific tuning seems to be necessary.
# See https://github.com/commaai/openpilot/pull/21429#issuecomment-873652891
for fw in car_fw:
if fw.ecu == "eps" and (fw.fwVersion.startswith(b'\x02') or fw.fwVersion in [b'8965B42181\x00\x00\x00\x00\x00\x00']):
- ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.15], [0.05]]
- ret.lateralTuning.pid.kf = 0.00004
+ set_lat_tune(ret.lateralTuning, LatTunes.PID_I)
break
elif candidate in [CAR.COROLLA_TSS2, CAR.COROLLAH_TSS2]:
stop_and_go = True
- ret.safetyConfigs[0].safetyParam = 73
ret.wheelbase = 2.67 # Average between 2.70 for sedan and 2.64 for hatchback
ret.steerRatio = 13.9
tire_stiffness_factor = 0.444 # not optimized yet
ret.mass = 3060. * CV.LB_TO_KG + STD_CARGO_KG
- ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.1]]
- ret.lateralTuning.pid.kf = 0.00007818594
+ set_lat_tune(ret.lateralTuning, LatTunes.PID_D)
elif candidate in [CAR.LEXUS_ES_TSS2, CAR.LEXUS_ESH_TSS2]:
stop_and_go = True
- ret.safetyConfigs[0].safetyParam = 73
ret.wheelbase = 2.8702
ret.steerRatio = 16.0 # not optimized
tire_stiffness_factor = 0.444 # not optimized yet
ret.mass = 3704. * CV.LB_TO_KG + STD_CARGO_KG
- ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.1]]
- ret.lateralTuning.pid.kf = 0.00007818594
+ set_lat_tune(ret.lateralTuning, LatTunes.PID_D)
elif candidate == CAR.LEXUS_ESH:
stop_and_go = True
- ret.safetyConfigs[0].safetyParam = 73
ret.wheelbase = 2.8190
ret.steerRatio = 16.06
tire_stiffness_factor = 0.444 # not optimized yet
ret.mass = 3682. * CV.LB_TO_KG + STD_CARGO_KG
- ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.1]]
- ret.lateralTuning.pid.kf = 0.00007818594
+ set_lat_tune(ret.lateralTuning, LatTunes.PID_D)
elif candidate == CAR.SIENNA:
stop_and_go = True
- ret.safetyConfigs[0].safetyParam = 73
ret.wheelbase = 3.03
ret.steerRatio = 15.5
tire_stiffness_factor = 0.444
ret.mass = 4590. * CV.LB_TO_KG + STD_CARGO_KG
- ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.19], [0.02]]
- ret.lateralTuning.pid.kf = 0.00007818594
+ set_lat_tune(ret.lateralTuning, LatTunes.PID_J)
elif candidate == CAR.LEXUS_IS:
- stop_and_go = False
ret.safetyConfigs[0].safetyParam = 77
+ stop_and_go = False
ret.wheelbase = 2.79908
ret.steerRatio = 13.3
tire_stiffness_factor = 0.444
ret.mass = 3736.8 * CV.LB_TO_KG + STD_CARGO_KG
- ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.3], [0.05]]
- ret.lateralTuning.pid.kf = 0.00006
+ set_lat_tune(ret.lateralTuning, LatTunes.PID_L)
elif candidate == CAR.LEXUS_CTH:
- stop_and_go = True
ret.safetyConfigs[0].safetyParam = 100
+ stop_and_go = True
ret.wheelbase = 2.60
ret.steerRatio = 18.6
tire_stiffness_factor = 0.517
ret.mass = 3108 * CV.LB_TO_KG + STD_CARGO_KG # mean between min and max
- ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.3], [0.05]]
- ret.lateralTuning.pid.kf = 0.00007
+ set_lat_tune(ret.lateralTuning, LatTunes.PID_M)
elif candidate in [CAR.LEXUS_NXH, CAR.LEXUS_NX, CAR.LEXUS_NX_TSS2]:
stop_and_go = True
- ret.safetyConfigs[0].safetyParam = 73
ret.wheelbase = 2.66
ret.steerRatio = 14.7
tire_stiffness_factor = 0.444 # not optimized yet
ret.mass = 4070 * CV.LB_TO_KG + STD_CARGO_KG
- ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.1]]
- ret.lateralTuning.pid.kf = 0.00006
+ set_lat_tune(ret.lateralTuning, LatTunes.PID_C)
elif candidate == CAR.PRIUS_TSS2:
stop_and_go = True
- ret.safetyConfigs[0].safetyParam = 73
ret.wheelbase = 2.70002 # from toyota online sepc.
ret.steerRatio = 13.4 # True steerRation from older prius
tire_stiffness_factor = 0.6371 # hand-tune
ret.mass = 3115. * CV.LB_TO_KG + STD_CARGO_KG
- ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.35], [0.15]]
- ret.lateralTuning.pid.kf = 0.00007818594
+ set_lat_tune(ret.lateralTuning, LatTunes.PID_N)
elif candidate == CAR.MIRAI:
stop_and_go = True
- ret.safetyConfigs[0].safetyParam = 73
ret.wheelbase = 2.91
ret.steerRatio = 14.8
tire_stiffness_factor = 0.8
ret.mass = 4300. * CV.LB_TO_KG + STD_CARGO_KG
- ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.1]]
- ret.lateralTuning.pid.kf = 0.00006
+ set_lat_tune(ret.lateralTuning, LatTunes.PID_C)
elif candidate == CAR.ALPHARD_TSS2:
stop_and_go = True
- ret.safetyConfigs[0].safetyParam = 73
ret.wheelbase = 3.00
ret.steerRatio = 14.2
tire_stiffness_factor = 0.444
- ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.19], [0.02]]
ret.mass = 4305. * CV.LB_TO_KG + STD_CARGO_KG
- ret.lateralTuning.pid.kf = 0.00007818594
+ set_lat_tune(ret.lateralTuning, LatTunes.PID_J)
ret.steerRateCost = 1.
ret.centerToFront = ret.wheelbase * 0.44
@@ -316,28 +258,13 @@ def get_params(candidate, fingerprint=gen_empty_fingerprint(), car_fw=[]): # py
ret.communityFeature = ret.enableGasInterceptor or ret.enableDsu or smartDsu
if ret.enableGasInterceptor:
- ret.longitudinalTuning.kpBP = [0., 5., MIN_ACC_SPEED, MIN_ACC_SPEED + PEDAL_HYST_GAP, 35.]
- ret.longitudinalTuning.kpV = [1.2, 0.8, 0.765, 2.255, 1.5]
- ret.longitudinalTuning.kiBP = [0., MIN_ACC_SPEED, MIN_ACC_SPEED + PEDAL_HYST_GAP, 35.]
- ret.longitudinalTuning.kiV = [0.18, 0.165, 0.489, 0.36]
+ set_long_tune(ret.longitudinalTuning, LongTunes.PEDAL)
elif candidate in [CAR.COROLLA_TSS2, CAR.COROLLAH_TSS2, CAR.RAV4_TSS2, CAR.RAV4H_TSS2, CAR.LEXUS_NX_TSS2]:
- # Improved longitudinal tune
- ret.longitudinalTuning.deadzoneBP = [0., 8.05]
- ret.longitudinalTuning.deadzoneV = [.0, .14]
- ret.longitudinalTuning.kpBP = [0., 5., 20.]
- ret.longitudinalTuning.kpV = [1.3, 1.0, 0.7]
- ret.longitudinalTuning.kiBP = [0., 5., 12., 20., 27.]
- ret.longitudinalTuning.kiV = [.35, .23, .20, .17, .1]
+ set_long_tune(ret.longitudinalTuning, LongTunes.TSS2)
ret.stoppingDecelRate = 0.3 # reach stopping target smoothly
ret.startingAccelRate = 6.0 # release brakes fast
else:
- # Default longitudinal tune
- ret.longitudinalTuning.deadzoneBP = [0., 9.]
- ret.longitudinalTuning.deadzoneV = [0., .15]
- ret.longitudinalTuning.kpBP = [0., 5., 35.]
- ret.longitudinalTuning.kiBP = [0., 35.]
- ret.longitudinalTuning.kpV = [3.6, 2.4, 1.5]
- ret.longitudinalTuning.kiV = [0.54, 0.36]
+ set_long_tune(ret.longitudinalTuning, LongTunes.TSS)
return ret
@@ -375,7 +302,7 @@ def update(self, c, can_strings):
# to be called @ 100hz
def apply(self, c):
- can_sends = self.CC.update(c.enabled, self.CS, self.frame,
+ can_sends = self.CC.update(c.enabled, c.active, self.CS, self.frame,
c.actuators, c.cruiseControl.cancel,
c.hudControl.visualAlert, c.hudControl.leftLaneVisible,
c.hudControl.rightLaneVisible, c.hudControl.leadVisible,
diff --git a/selfdrive/car/toyota/tunes.py b/selfdrive/car/toyota/tunes.py
new file mode 100644
index 00000000000000..3f210d48a7791b
--- /dev/null
+++ b/selfdrive/car/toyota/tunes.py
@@ -0,0 +1,142 @@
+#!/usr/bin/env python3
+from enum import Enum
+from selfdrive.car.toyota.values import MIN_ACC_SPEED, PEDAL_HYST_GAP
+
+
+class LongTunes(Enum):
+ PEDAL = 0
+ TSS2 = 1
+ TSS = 2
+
+class LatTunes(Enum):
+ INDI_PRIUS = 0
+ LQR_RAV4 = 1
+ PID_A = 2
+ PID_B = 3
+ PID_C = 4
+ PID_D = 5
+ PID_E = 6
+ PID_F = 7
+ PID_G = 8
+ PID_I = 9
+ PID_H = 10
+ PID_J = 11
+ PID_K = 12
+ PID_L = 13
+ PID_M = 14
+ PID_N = 15
+
+
+###### LONG ######
+def set_long_tune(tune, name):
+ if name == LongTunes.PEDAL:
+ tune.deadzoneBP = [0.]
+ tune.deadzoneV = [0.]
+ tune.kpBP = [0., 5., MIN_ACC_SPEED, MIN_ACC_SPEED + PEDAL_HYST_GAP, 35.]
+ tune.kpV = [1.2, 0.8, 0.765, 2.255, 1.5]
+ tune.kiBP = [0., MIN_ACC_SPEED, MIN_ACC_SPEED + PEDAL_HYST_GAP, 35.]
+ tune.kiV = [0.18, 0.165, 0.489, 0.36]
+ # Improved longitudinal tune
+ elif name == LongTunes.TSS2:
+ tune.deadzoneBP = [0., 8.05]
+ tune.deadzoneV = [.0, .14]
+ tune.kpBP = [0., 5., 20.]
+ tune.kpV = [1.3, 1.0, 0.7]
+ tune.kiBP = [0., 5., 12., 20., 27.]
+ tune.kiV = [.35, .23, .20, .17, .1]
+ # Default longitudinal tune
+ elif name == LongTunes.TSS:
+ tune.deadzoneBP = [0., 9.]
+ tune.deadzoneV = [0., .15]
+ tune.kpBP = [0., 5., 35.]
+ tune.kiBP = [0., 35.]
+ tune.kpV = [3.6, 2.4, 1.5]
+ tune.kiV = [0.54, 0.36]
+ else:
+ raise NotImplementedError('This longitudinal tune does not exist')
+
+
+###### LAT ######
+def set_lat_tune(tune, name):
+ if name == LatTunes.INDI_PRIUS:
+ tune.init('indi')
+ tune.indi.innerLoopGainBP = [0.]
+ tune.indi.innerLoopGainV = [4.0]
+ tune.indi.outerLoopGainBP = [0.]
+ tune.indi.outerLoopGainV = [3.0]
+ tune.indi.timeConstantBP = [0.]
+ tune.indi.timeConstantV = [1.0]
+ tune.indi.actuatorEffectivenessBP = [0.]
+ tune.indi.actuatorEffectivenessV = [1.0]
+
+ elif name == LatTunes.LQR_RAV4:
+ tune.init('lqr')
+ tune.lqr.scale = 1500.0
+ tune.lqr.ki = 0.05
+ tune.lqr.a = [0., 1., -0.22619643, 1.21822268]
+ tune.lqr.b = [-1.92006585e-04, 3.95603032e-05]
+ tune.lqr.c = [1., 0.]
+ tune.lqr.k = [-110.73572306, 451.22718255]
+ tune.lqr.l = [0.3233671, 0.3185757]
+ tune.lqr.dcGain = 0.002237852961363602
+
+ elif 'PID' in str(name):
+ tune.init('pid')
+ tune.pid.kiBP = [0.0]
+ tune.pid.kpBP = [0.0]
+ if name == LatTunes.PID_A:
+ tune.pid.kpV = [0.2]
+ tune.pid.kiV = [0.05]
+ tune.pid.kf = 0.00003
+ elif name == LatTunes.PID_B:
+ tune.pid.kpV = [0.6]
+ tune.pid.kiV = [0.05]
+ tune.pid.kf = 0.00006
+ elif name == LatTunes.PID_C:
+ tune.pid.kpV = [0.6]
+ tune.pid.kiV = [0.1]
+ tune.pid.kf = 0.00006
+ elif name == LatTunes.PID_D:
+ tune.pid.kpV = [0.6]
+ tune.pid.kiV = [0.1]
+ tune.pid.kf = 0.00007818594
+ elif name == LatTunes.PID_E:
+ tune.pid.kpV = [0.6]
+ tune.pid.kiV = [0.15]
+ tune.pid.kf = 0.00007818594
+ elif name == LatTunes.PID_F:
+ tune.pid.kpV = [0.723]
+ tune.pid.kiV = [0.0428]
+ tune.pid.kf = 0.00006
+ elif name == LatTunes.PID_G:
+ tune.pid.kpV = [0.18]
+ tune.pid.kiV = [0.015]
+ tune.pid.kf = 0.00012
+ elif name == LatTunes.PID_H:
+ tune.pid.kpV = [0.17]
+ tune.pid.kiV = [0.03]
+ tune.pid.kf = 0.00006
+ elif name == LatTunes.PID_I:
+ tune.pid.kpV = [0.15]
+ tune.pid.kiV = [0.05]
+ tune.pid.kf = 0.00004
+ elif name == LatTunes.PID_J:
+ tune.pid.kpV = [0.19]
+ tune.pid.kiV = [0.02]
+ tune.pid.kf = 0.00007818594
+ elif name == LatTunes.PID_L:
+ tune.pid.kpV = [0.3]
+ tune.pid.kiV = [0.05]
+ tune.pid.kf = 0.00006
+ elif name == LatTunes.PID_M:
+ tune.pid.kpV = [0.3]
+ tune.pid.kiV = [0.05]
+ tune.pid.kf = 0.00007
+ elif name == LatTunes.PID_N:
+ tune.pid.kpV = [0.35]
+ tune.pid.kiV = [0.15]
+ tune.pid.kf = 0.00007818594
+ else:
+ raise NotImplementedError('This PID tune does not exist')
+ else:
+ raise NotImplementedError('This lateral tune does not exist')
diff --git a/selfdrive/car/toyota/values.py b/selfdrive/car/toyota/values.py
index 0cd75d8723b205..73198d925fc8ae 100644
--- a/selfdrive/car/toyota/values.py
+++ b/selfdrive/car/toyota/values.py
@@ -618,6 +618,7 @@ class CAR:
b'\x028966312Q4000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
b'\x038966312L7000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF1205001\x00\x00\x00\x00',
b'\x038966312N1000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF1203001\x00\x00\x00\x00',
+ b'\x038966312T3000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF1205001\x00\x00\x00\x00',
],
(Ecu.eps, 0x7a1, None): [
b'8965B12361\x00\x00\x00\x00\x00\x00',
@@ -782,7 +783,8 @@ class CAR:
b'\x01F152648C6300\x00\x00\x00\x00',
],
(Ecu.engine, 0x700, None): [
- b'\x01896630EA1000\000\000\000\000',
+ b'\x01896630EA1000\x00\x00\x00\x00',
+ b'\x01896630EE4000\x00\x00\x00\x00',
b'\x01896630EA1000\x00\x00\x00\x00897CF4801001\x00\x00\x00\x00',
b'\x02896630E66000\x00\x00\x00\x00897CF4801001\x00\x00\x00\x00',
b'\x02896630EB3000\x00\x00\x00\x00897CF4801001\x00\x00\x00\x00',
diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py
index 01677037fb7149..ed0b1ac76d407b 100755
--- a/selfdrive/car/volkswagen/values.py
+++ b/selfdrive/car/volkswagen/values.py
@@ -160,6 +160,7 @@ class CAR:
b'\xf1\x8704L906056CR\xf1\x895813',
b'\xf1\x8704L906056HE\xf1\x893758',
b'\xf1\x870EA906016A \xf1\x898343',
+ b'\xf1\x870EA906016E \xf1\x894219',
b'\xf1\x870EA906016F \xf1\x895002',
b'\xf1\x870EA906016S \xf1\x897207',
b'\xf1\x875G0906259 \xf1\x890007',
@@ -227,6 +228,7 @@ class CAR:
b'\xf1\x875Q0959655S \xf1\x890870\xf1\x82\02324230011211200061104171724102491132111',
b'\xf1\x875Q0959655S \xf1\x890870\xf1\x82\02324230011211200621143171724112491132111',
b'\xf1\x875Q0959655S \xf1\x890870\xf1\x82\x1315120011211200061104171717101791132111',
+ b'\xf1\x875Q0959655S \xf1\x890870\xf1\x82\x1324230011211200631143171724122491132111',
b'\xf1\x875Q0959655T \xf1\x890825\xf1\x82\023271200111312--071104171837103791132111',
b'\xf1\x875Q0959655T \xf1\x890830\xf1\x82\x13271100111312--071104171826102691131211',
b'\xf1\x875QD959655 \xf1\x890388\xf1\x82\x111413001113120006110417121D101D9112',
@@ -254,6 +256,7 @@ class CAR:
b'\xf1\x875Q0909144S \xf1\x891063\xf1\x82\00516A00604A1',
b'\xf1\x875Q0909144S \xf1\x891063\xf1\x82\00516A07A02A1',
b'\xf1\x875Q0909144T \xf1\x891072\xf1\x82\00521A00507A1',
+ b'\xf1\x875Q0909144T \xf1\x891072\xf1\x82\x0521A07B04A1',
b'\xf1\x875Q0909144T \xf1\x891072\xf1\x82\00521A20B03A1',
b'\xf1\x875QD909144B \xf1\x891072\xf1\x82\x0521A00507A1',
b'\xf1\x875QM909144A \xf1\x891072\xf1\x82\x0521A20B03A1',
diff --git a/selfdrive/common/version.h b/selfdrive/common/version.h
index 9f00fac4f94111..aa786903c48a22 100644
--- a/selfdrive/common/version.h
+++ b/selfdrive/common/version.h
@@ -1 +1 @@
-#define COMMA_VERSION "0.8.11"
+#define COMMA_VERSION "0.8.12"
diff --git a/selfdrive/common/watchdog.cc b/selfdrive/common/watchdog.cc
index 33307f720007bd..c937103a5d1880 100644
--- a/selfdrive/common/watchdog.cc
+++ b/selfdrive/common/watchdog.cc
@@ -1,19 +1,12 @@
#include "selfdrive/common/watchdog.h"
-
-#include
-
-#include
-#include
-
#include "selfdrive/common/timing.h"
#include "selfdrive/common/util.h"
const std::string watchdog_fn_prefix = "/dev/shm/wd_"; // +
bool watchdog_kick() {
- std::string fn = watchdog_fn_prefix + std::to_string(getpid());
- std::string cur_t = std::to_string(nanos_since_boot());
+ static std::string fn = watchdog_fn_prefix + std::to_string(getpid());
- int r = util::write_file(fn.c_str(), cur_t.data(), cur_t.length(), O_WRONLY | O_CREAT);
- return r == 0;
+ uint64_t ts = nanos_since_boot();
+ return util::write_file(fn.c_str(), &ts, sizeof(ts), O_WRONLY | O_CREAT) > 0;
}
diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py
index 07b68c941ae22e..bd184f200faf78 100755
--- a/selfdrive/controls/controlsd.py
+++ b/selfdrive/controls/controlsd.py
@@ -404,7 +404,7 @@ def state_transition(self, CS):
elif self.CP.pcmCruise and CS.cruiseState.enabled:
self.v_cruise_kph = CS.cruiseState.speed * CV.MS_TO_KPH
- # decrease the soft disable timer at every step, as it's reset on
+ # decrement the soft disable timer at every step, as it's reset on
# entrance in SOFT_DISABLING state
self.soft_disable_timer = max(0, self.soft_disable_timer - 1)
@@ -426,7 +426,7 @@ def state_transition(self, CS):
if self.state == State.enabled:
if self.events.any(ET.SOFT_DISABLE):
self.state = State.softDisabling
- self.soft_disable_timer = 300 # 3s
+ self.soft_disable_timer = int(3 / DT_CTRL)
self.current_alert_types.append(ET.SOFT_DISABLE)
# SOFT DISABLING
diff --git a/selfdrive/controls/lib/events.py b/selfdrive/controls/lib/events.py
index 09e9d65c90c34a..bd728159b708d4 100644
--- a/selfdrive/controls/lib/events.py
+++ b/selfdrive/controls/lib/events.py
@@ -149,7 +149,7 @@ def __init__(self, alert_text_2, audible_alert=AudibleAlert.chimeError,
class SoftDisableAlert(Alert):
def __init__(self, alert_text_2):
super().__init__("TAKE CONTROL IMMEDIATELY", alert_text_2,
- AlertStatus.critical, AlertSize.full,
+ AlertStatus.userPrompt, AlertSize.full,
Priority.MID, VisualAlert.steerRequired,
AudibleAlert.chimeWarningRepeatInfinite, 2.),
@@ -171,10 +171,18 @@ def __init__(self, audible_alert: car.CarControl.HUDControl.AudibleAlert):
class NormalPermanentAlert(Alert):
- def __init__(self, alert_text_1: str, alert_text_2: str = "", duration: float = 0.2):
+ def __init__(self, alert_text_1: str, alert_text_2: str = "", duration: float = 0.2, priority: Priority = Priority.LOWER, creation_delay: float = 0.):
super().__init__(alert_text_1, alert_text_2,
AlertStatus.normal, AlertSize.mid if len(alert_text_2) else AlertSize.small,
- Priority.LOWER, VisualAlert.none, AudibleAlert.none, duration),
+ priority, VisualAlert.none, AudibleAlert.none, duration, creation_delay=creation_delay),
+
+
+class StartupAlert(Alert):
+ def __init__(self, alert_text_1: str, alert_text_2: str = "Always keep hands on wheel and eyes on road", alert_status=AlertStatus.normal):
+ super().__init__(alert_text_1, alert_text_2,
+ alert_status, AlertSize.mid,
+ Priority.LOWER, VisualAlert.none, AudibleAlert.none, 10.),
+
# ********** helper functions **********
def get_display_speed(speed_ms: float, metric: bool) -> str:
@@ -244,88 +252,59 @@ def joystick_alert(CP: car.CarParams, sm: messaging.SubMaster, metric: bool) ->
},
EventName.startup: {
- ET.PERMANENT: Alert(
- "Be ready to take over at any time",
- "Always keep hands on wheel and eyes on road",
- AlertStatus.normal, AlertSize.mid,
- Priority.LOWER, VisualAlert.none, AudibleAlert.none, 10.),
+ ET.PERMANENT: StartupAlert("Be ready to take over at any time")
},
EventName.startupMaster: {
- ET.PERMANENT: Alert(
- "WARNING: This branch is not tested",
- "Always keep hands on wheel and eyes on road",
- AlertStatus.userPrompt, AlertSize.mid,
- Priority.LOWER, VisualAlert.none, AudibleAlert.none, 10.),
+ ET.PERMANENT: StartupAlert("WARNING: This branch is not tested",
+ alert_status=AlertStatus.userPrompt),
},
# Car is recognized, but marked as dashcam only
EventName.startupNoControl: {
- ET.PERMANENT: Alert(
- "Dashcam mode",
- "Always keep hands on wheel and eyes on road",
- AlertStatus.normal, AlertSize.mid,
- Priority.LOWER, VisualAlert.none, AudibleAlert.none, 10.),
+ ET.PERMANENT: StartupAlert("Dashcam mode"),
},
# Car is not recognized
EventName.startupNoCar: {
- ET.PERMANENT: Alert(
- "Dashcam mode for unsupported car",
- "Always keep hands on wheel and eyes on road",
- AlertStatus.normal, AlertSize.mid,
- Priority.LOWER, VisualAlert.none, AudibleAlert.none, 10.),
+ ET.PERMANENT: StartupAlert("Dashcam mode for unsupported car"),
},
EventName.startupNoFw: {
- ET.PERMANENT: Alert(
- "Car Unrecognized",
- "Check comma power connections",
- AlertStatus.userPrompt, AlertSize.mid,
- Priority.LOWER, VisualAlert.none, AudibleAlert.none, 10.),
+ ET.PERMANENT: StartupAlert("Car Unrecognized",
+ "Check comma power connections",
+ alert_status=AlertStatus.userPrompt),
},
EventName.dashcamMode: {
- ET.PERMANENT: Alert(
- "Dashcam Mode",
- "",
- AlertStatus.normal, AlertSize.small,
- Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .2),
+ ET.PERMANENT: NormalPermanentAlert("Dashcam Mode",
+ priority=Priority.LOWEST),
},
EventName.invalidLkasSetting: {
- ET.PERMANENT: Alert(
- "Stock LKAS is turned on",
- "Turn off stock LKAS to engage",
- AlertStatus.normal, AlertSize.mid,
- Priority.LOWER, VisualAlert.none, AudibleAlert.none, .2),
+ ET.PERMANENT: NormalPermanentAlert("Stock LKAS is turned on",
+ "Turn off stock LKAS to engage"),
},
EventName.cruiseMismatch: {
- ET.PERMANENT: ImmediateDisableAlert("openpilot failed to cancel cruise"),
+ #ET.PERMANENT: ImmediateDisableAlert("openpilot failed to cancel cruise"),
},
# Some features or cars are marked as community features. If openpilot
# detects the use of a community feature it switches to dashcam mode
# until these features are allowed using a toggle in settings.
EventName.communityFeatureDisallowed: {
- # LOW priority to overcome Cruise Error
- ET.PERMANENT: Alert(
- "openpilot Not Available",
- "Enable Community Features in Settings to Engage",
- AlertStatus.normal, AlertSize.mid,
- Priority.LOW, VisualAlert.none, AudibleAlert.none, .2),
+ ET.PERMANENT: NormalPermanentAlert("openpilot Not Available",
+ "Enable Community Features in Settings to Engage"),
},
# openpilot doesn't recognize the car. This switches openpilot into a
# read-only mode. This can be solved by adding your fingerprint.
# See https://github.com/commaai/openpilot/wiki/Fingerprinting for more information
EventName.carUnrecognized: {
- ET.PERMANENT: Alert(
- "Dashcam Mode",
- "Car Unrecognized",
- AlertStatus.normal, AlertSize.mid,
- Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .2),
+ ET.PERMANENT: NormalPermanentAlert("Dashcam Mode",
+ "Car Unrecognized",
+ priority=Priority.LOWEST),
},
EventName.stockAeb: {
@@ -374,11 +353,6 @@ def joystick_alert(CP: car.CarParams, sm: messaging.SubMaster, metric: bool) ->
EventName.vehicleModelInvalid: {
ET.NO_ENTRY: NoEntryAlert("Vehicle Parameter Identification Failed"),
ET.SOFT_DISABLE: SoftDisableAlert("Vehicle Parameter Identification Failed"),
- ET.WARNING: Alert(
- "Vehicle Parameter Identification Failed",
- "",
- AlertStatus.normal, AlertSize.small,
- Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .1),
},
EventName.steerTempUnavailableSilent: {
@@ -718,18 +692,21 @@ def joystick_alert(CP: car.CarParams, sm: messaging.SubMaster, metric: bool) ->
},
EventName.roadCameraError: {
- ET.PERMANENT: NormalPermanentAlert("Road Camera Error", "",
- duration=10.),
+ ET.PERMANENT: NormalPermanentAlert("Camera Error",
+ duration=1.,
+ creation_delay=30.),
},
EventName.driverCameraError: {
- ET.PERMANENT: NormalPermanentAlert("Driver Camera Error", "",
- duration=10.),
+ ET.PERMANENT: NormalPermanentAlert("Camera Error",
+ duration=1.,
+ creation_delay=30.),
},
EventName.wideRoadCameraError: {
- ET.PERMANENT: NormalPermanentAlert("Wide Road Camera Error", "",
- duration=10.),
+ ET.PERMANENT: NormalPermanentAlert("Camera Error",
+ duration=1.,
+ creation_delay=30.),
},
# Sometimes the USB stack on the device can get into a bad state
@@ -756,21 +733,13 @@ def joystick_alert(CP: car.CarParams, sm: messaging.SubMaster, metric: bool) ->
EventName.steerUnavailable: {
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("LKAS Fault: Restart the Car"),
- ET.PERMANENT: Alert(
- "LKAS Fault: Restart the car to engage",
- "",
- AlertStatus.normal, AlertSize.small,
- Priority.LOWER, VisualAlert.none, AudibleAlert.none, .2),
+ ET.PERMANENT: NormalPermanentAlert("LKAS Fault: Restart the car to engage"),
ET.NO_ENTRY: NoEntryAlert("LKAS Fault: Restart the Car"),
},
EventName.brakeUnavailable: {
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Cruise Fault: Restart the Car"),
- ET.PERMANENT: Alert(
- "Cruise Fault: Restart the car to engage",
- "",
- AlertStatus.normal, AlertSize.small,
- Priority.LOWER, VisualAlert.none, AudibleAlert.none, .2),
+ ET.PERMANENT: NormalPermanentAlert("Cruise Fault: Restart the car to engage"),
ET.NO_ENTRY: NoEntryAlert("Cruise Fault: Restart the Car"),
},
@@ -832,19 +801,11 @@ def joystick_alert(CP: car.CarParams, sm: messaging.SubMaster, metric: bool) ->
"Model uncertain at this speed",
AlertStatus.userPrompt, AlertSize.mid,
Priority.HIGH, VisualAlert.steerRequired, AudibleAlert.chimeWarning2RepeatInfinite, 4.),
- ET.NO_ENTRY: Alert(
- "Speed Too High",
- "Slow down to engage",
- AlertStatus.normal, AlertSize.mid,
- Priority.LOW, VisualAlert.none, AudibleAlert.chimeError, 3.),
+ ET.NO_ENTRY: NoEntryAlert("Slow down to engage"),
},
EventName.lowSpeedLockout: {
- ET.PERMANENT: Alert(
- "Cruise Fault: Restart the car to engage",
- "",
- AlertStatus.normal, AlertSize.small,
- Priority.LOWER, VisualAlert.none, AudibleAlert.none, .2),
+ ET.PERMANENT: NormalPermanentAlert("Cruise Fault: Restart the car to engage"),
ET.NO_ENTRY: NoEntryAlert("Cruise Fault: Restart the Car"),
},
diff --git a/selfdrive/controls/lib/longitudinal_mpc_lib/long_mpc.py b/selfdrive/controls/lib/longitudinal_mpc_lib/long_mpc.py
index df6d8e0fb64316..577651f8d47262 100644
--- a/selfdrive/controls/lib/longitudinal_mpc_lib/long_mpc.py
+++ b/selfdrive/controls/lib/longitudinal_mpc_lib/long_mpc.py
@@ -24,15 +24,17 @@
X_DIM = 3
U_DIM = 1
-COST_E_DIM = 4
+PARAM_DIM= 4
+COST_E_DIM = 5
COST_DIM = COST_E_DIM + 1
CONSTR_DIM = 4
X_EGO_OBSTACLE_COST = 3.
-V_EGO_COST = 0.
X_EGO_COST = 0.
+V_EGO_COST = 0.
A_EGO_COST = 0.
-J_EGO_COST = 10.
+J_EGO_COST = 5.0
+A_CHANGE_COST = .5
DANGER_ZONE_COST = 100.
CRASH_DISTANCE = .5
LIMIT_COST = 1e6
@@ -85,7 +87,8 @@ def gen_long_model():
x_obstacle = SX.sym('x_obstacle')
a_min = SX.sym('a_min')
a_max = SX.sym('a_max')
- model.p = vertcat(a_min, a_max, x_obstacle)
+ prev_a = SX.sym('prev_a')
+ model.p = vertcat(a_min, a_max, x_obstacle, prev_a)
# dynamics model
f_expl = vertcat(v_ego, a_ego, j_ego)
@@ -118,6 +121,7 @@ def gen_long_mpc_solver():
a_min, a_max = ocp.model.p[0], ocp.model.p[1]
x_obstacle = ocp.model.p[2]
+ prev_a = ocp.model.p[3]
ocp.cost.yref = np.zeros((COST_DIM, ))
ocp.cost.yref_e = np.zeros((COST_E_DIM, ))
@@ -132,6 +136,7 @@ def gen_long_mpc_solver():
x_ego,
v_ego,
a_ego,
+ 20*(a_ego - prev_a),
j_ego]
ocp.model.cost_y_expr = vertcat(*costs)
ocp.model.cost_y_expr_e = vertcat(*costs[:-1])
@@ -148,7 +153,7 @@ def gen_long_mpc_solver():
x0 = np.zeros(X_DIM)
ocp.constraints.x0 = x0
- ocp.parameter_values = np.array([-1.2, 1.2, 0.0])
+ ocp.parameter_values = np.array([-1.2, 1.2, 0.0, 0.0])
# We put all constraint cost weights to 0 and only set them at runtime
cost_weights = np.zeros(CONSTR_DIM)
@@ -198,6 +203,7 @@ def reset(self):
self.solver = AcadosOcpSolverFast('long', N, EXPORT_DIR)
self.v_solution = [0.0 for i in range(N+1)]
self.a_solution = [0.0 for i in range(N+1)]
+ self.prev_a = self.a_solution
self.j_solution = [0.0 for i in range(N)]
self.yref = np.zeros((N+1, COST_DIM))
for i in range(N):
@@ -205,7 +211,7 @@ def reset(self):
self.solver.cost_set(N, "yref", self.yref[N][:COST_E_DIM])
self.x_sol = np.zeros((N+1, X_DIM))
self.u_sol = np.zeros((N,1))
- self.params = np.zeros((N+1,3))
+ self.params = np.zeros((N+1, PARAM_DIM))
for i in range(N+1):
self.solver.set(i, 'x', np.zeros(X_DIM))
self.last_cloudlog_t = 0
@@ -222,8 +228,9 @@ def set_weights(self):
self.set_weights_for_lead_policy()
def set_weights_for_lead_policy(self):
- W = np.asfortranarray(np.diag([X_EGO_OBSTACLE_COST, X_EGO_COST, V_EGO_COST, A_EGO_COST, J_EGO_COST]))
+ W = np.asfortranarray(np.diag([X_EGO_OBSTACLE_COST, X_EGO_COST, V_EGO_COST, A_EGO_COST, A_CHANGE_COST, J_EGO_COST]))
for i in range(N):
+ W[4,4] = A_CHANGE_COST * np.interp(T_IDXS[i], [0.0, 1.0, 2.0], [1.0, 1.0, 0.0])
self.solver.cost_set(i, 'W', W)
# Setting the slice without the copy make the array not contiguous,
# causing issues with the C interface.
@@ -235,7 +242,7 @@ def set_weights_for_lead_policy(self):
self.solver.cost_set(i, 'Zl', Zl)
def set_weights_for_xva_policy(self):
- W = np.asfortranarray(np.diag([0., 10., 1., 10., 1.]))
+ W = np.asfortranarray(np.diag([0., 10., 1., 10., 0.0, 1.]))
for i in range(N):
self.solver.cost_set(i, 'W', W)
# Setting the slice without the copy make the array not contiguous,
@@ -320,6 +327,7 @@ def update(self, carstate, radarstate, v_cruise):
x_obstacles = np.column_stack([lead_0_obstacle, lead_1_obstacle, cruise_obstacle])
self.source = SOURCES[np.argmin(x_obstacles[0])]
self.params[:,2] = np.min(x_obstacles, axis=1)
+ self.params[:,3] = np.copy(self.prev_a)
self.run()
if (np.any(lead_xv_0[:,0] - self.x_sol[:,0] < CRASH_DISTANCE) and
@@ -339,7 +347,8 @@ def update_with_xva(self, x, v, a):
self.accel_limit_arr[:,1] = 10.
x_obstacle = 1e5*np.ones((N+1))
self.params = np.concatenate([self.accel_limit_arr,
- x_obstacle[:,None]], axis=1)
+ x_obstacle[:,None],
+ self.prev_a], axis=1)
self.run()
@@ -358,6 +367,8 @@ def run(self):
self.a_solution = self.x_sol[:,2]
self.j_solution = self.u_sol[:,0]
+ self.prev_a = interp(T_IDXS + 0.05, T_IDXS, self.a_solution)
+
t = sec_since_boot()
if self.solution_status != 0:
if t > self.last_cloudlog_t + 5.0:
diff --git a/selfdrive/controls/tests/test_alerts.py b/selfdrive/controls/tests/test_alerts.py
index d32bc2365d9899..a55cb373a133cc 100755
--- a/selfdrive/controls/tests/test_alerts.py
+++ b/selfdrive/controls/tests/test_alerts.py
@@ -76,11 +76,16 @@ def test_alert_text_length(self):
def test_alert_sanity_check(self):
for a in ALERTS:
if a.alert_size == AlertSize.none:
- self.assertEqual(0, len(a.alert_text_1))
- self.assertEqual(0, len(a.alert_text_2))
+ self.assertEqual(len(a.alert_text_1), 0)
+ self.assertEqual(len(a.alert_text_2), 0)
+ elif a.alert_size == AlertSize.small:
+ self.assertGreater(len(a.alert_text_1), 0)
+ self.assertEqual(len(a.alert_text_2), 0)
+ elif a.alert_size == AlertSize.mid:
+ self.assertGreater(len(a.alert_text_1), 0)
+ self.assertGreater(len(a.alert_text_2), 0)
else:
- if a.alert_size == AlertSize.small:
- self.assertEqual(0, len(a.alert_text_2))
+ self.assertGreater(len(a.alert_text_1), 0)
self.assertGreaterEqual(a.duration, 0.)
diff --git a/selfdrive/manager/process.py b/selfdrive/manager/process.py
index 8cb3505b8e00c3..d9a1619411a390 100644
--- a/selfdrive/manager/process.py
+++ b/selfdrive/manager/process.py
@@ -1,6 +1,7 @@
import importlib
import os
import signal
+import struct
import time
import subprocess
from abc import ABC, abstractmethod
@@ -88,7 +89,7 @@ def check_watchdog(self, started):
try:
fn = WATCHDOG_FN + str(self.proc.pid)
- self.last_watchdog_time = int(open(fn).read())
+ self.last_watchdog_time = struct.unpack('Q', open(fn, "rb").read())[0]
except Exception:
pass
diff --git a/selfdrive/test/longitudinal_maneuvers/test_longitudinal.py b/selfdrive/test/longitudinal_maneuvers/test_longitudinal.py
index 4267f3c9e134d7..35b9f32e68e86a 100755
--- a/selfdrive/test/longitudinal_maneuvers/test_longitudinal.py
+++ b/selfdrive/test/longitudinal_maneuvers/test_longitudinal.py
@@ -62,7 +62,7 @@
speed_lead_values=[20., 20., 0.],
prob_lead_values=[0., 1., 1.],
cruise_values=[20., 20., 20.],
- breakpoints=[2., 2.01, 8.51],
+ breakpoints=[2., 2.01, 8.8],
),
Maneuver(
"approach stopped car at 20m/s",
diff --git a/selfdrive/test/openpilotci.py b/selfdrive/test/openpilotci.py
index 1939677b102822..9cc0e37c4b2b7d 100755
--- a/selfdrive/test/openpilotci.py
+++ b/selfdrive/test/openpilotci.py
@@ -12,7 +12,7 @@ def get_url(route_name, segment_num, log_type="rlog"):
return BASE_URL + "%s/%s/%s.%s" % (route_name.replace("|", "/"), segment_num, log_type, ext)
def upload_file(path, name):
- from azure.storage.blob import BlockBlobService
+ from azure.storage.blob import BlockBlobService # pylint: disable=import-error
sas_token = None
if os.path.isfile(TOKEN_PATH):
diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit
index d58be73f571c5b..5027b0c1798917 100644
--- a/selfdrive/test/process_replay/ref_commit
+++ b/selfdrive/test/process_replay/ref_commit
@@ -1 +1 @@
-b3c61dc5f6777497fdd82fb7421a469a43efcbf1
\ No newline at end of file
+6540e8c5a765975fd292b1efdef97b2d6391fa9c
\ No newline at end of file
diff --git a/selfdrive/test/test_onroad.py b/selfdrive/test/test_onroad.py
index f051b18b075040..f1aad012eff275 100755
--- a/selfdrive/test/test_onroad.py
+++ b/selfdrive/test/test_onroad.py
@@ -56,7 +56,7 @@
"./loggerd": 70.0,
"selfdrive.controls.controlsd": 28.0,
"./camerad": 31.0,
- "./_ui": 21.0,
+ "./_ui": 30.2,
"selfdrive.controls.plannerd": 11.7,
"./_dmonitoringmodeld": 10.0,
"selfdrive.locationd.paramsd": 5.0,
@@ -97,7 +97,8 @@ def cputime_total(ct):
def check_cpu_usage(first_proc, last_proc):
- result = "------------------------------------------------\n"
+ result = "\n"
+ result += "------------------------------------------------\n"
result += "------------------ CPU Usage -------------------\n"
result += "------------------------------------------------\n"
@@ -112,10 +113,9 @@ def check_cpu_usage(first_proc, last_proc):
cpu_usage = cpu_time / dt * 100.
if cpu_usage > max(normal_cpu_usage * 1.15, normal_cpu_usage + 5.0):
# cpu usage is high while playing sounds
- if proc_name == "./_soundd" and cpu_usage < 65.:
- continue
- result += f"Warning {proc_name} using more CPU than normal\n"
- r = False
+ if not (proc_name == "./_soundd" and cpu_usage < 65.):
+ result += f"Warning {proc_name} using more CPU than normal\n"
+ r = False
elif cpu_usage < min(normal_cpu_usage * 0.65, max(normal_cpu_usage - 1.0, 0.0)):
result += f"Warning {proc_name} using less CPU than normal\n"
r = False
@@ -201,7 +201,8 @@ def test_cpu_usage(self):
self.assertTrue(cpu_ok)
def test_model_execution_timings(self):
- result = "------------------------------------------------\n"
+ result = "\n"
+ result += "------------------------------------------------\n"
result += "----------------- Model Timing -----------------\n"
result += "------------------------------------------------\n"
# TODO: this went up when plannerd cpu usage increased, why?
@@ -212,12 +213,15 @@ def test_model_execution_timings(self):
self.assertLess(np.mean(ts), avg_max, f"high avg '{s}' execution time: {np.mean(ts)}")
result += f"'{s}' execution time: {min(ts)}\n"
result += f"'{s}' avg execution time: {np.mean(ts)}\n"
+ result += "------------------------------------------------\n"
print(result)
def test_timings(self):
-
- print("\n\n")
- print("="*25, "service timings", "="*25)
+ passed = True
+ result = "\n"
+ result += "------------------------------------------------\n"
+ result += "----------------- Service Timings --------------\n"
+ result += "------------------------------------------------\n"
for s, (maxmin, rsd) in TIMINGS.items():
msgs = [m.logMonoTime for m in self.lr if m.which() == s]
if not len(msgs):
@@ -226,12 +230,22 @@ def test_timings(self):
ts = np.diff(msgs) / 1e9
dt = 1 / service_list[s].frequency
- np.testing.assert_allclose(np.mean(ts), dt, rtol=0.03, err_msg=f"{s} - failed mean timing check")
- np.testing.assert_allclose([np.max(ts), np.min(ts)], dt, rtol=maxmin, err_msg=f"{s} - failed max/min timing check")
- self.assertLess(np.std(ts) / dt, rsd, msg=f"{s} - failed RSD timing check")
- print(f"{s}: {np.array([np.mean(ts), np.max(ts), np.min(ts)])*1e3}")
- print(f" {np.max(np.absolute([np.max(ts)/dt, np.min(ts)/dt]))} {np.std(ts)/dt}")
- print("="*67)
+ try:
+ np.testing.assert_allclose(np.mean(ts), dt, rtol=0.03, err_msg=f"{s} - failed mean timing check")
+ np.testing.assert_allclose([np.max(ts), np.min(ts)], dt, rtol=maxmin, err_msg=f"{s} - failed max/min timing check")
+ except Exception as e:
+ result += str(e) + "\n"
+ passed = False
+
+ if np.std(ts) / dt > rsd:
+ result += f"{s} - failed RSD timing check\n"
+ passed = False
+
+ result += f"{s.ljust(40)}: {np.array([np.mean(ts), np.max(ts), np.min(ts)])*1e3}\n"
+ result += f"{''.ljust(40)} {np.max(np.absolute([np.max(ts)/dt, np.min(ts)/dt]))} {np.std(ts)/dt}\n"
+ result += "="*67
+ print(result)
+ self.assertTrue(passed)
@release_only
def test_startup(self):
diff --git a/selfdrive/test/update_ci_routes.py b/selfdrive/test/update_ci_routes.py
index e25172be9d62b3..3e5a0d2cf0db24 100755
--- a/selfdrive/test/update_ci_routes.py
+++ b/selfdrive/test/update_ci_routes.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python3
import sys
import subprocess
-from azure.storage.blob import BlockBlobService
+from azure.storage.blob import BlockBlobService # pylint: disable=import-error
from selfdrive.test.test_routes import routes as test_car_models_routes
from selfdrive.test.process_replay.test_processes import original_segments as replay_segments
diff --git a/selfdrive/thermald/thermald.py b/selfdrive/thermald/thermald.py
index 5e678587911d6f..1f4247145544c7 100755
--- a/selfdrive/thermald/thermald.py
+++ b/selfdrive/thermald/thermald.py
@@ -126,16 +126,23 @@ def handle_fan_uno(controller, max_cpu_temp, fan_speed, ignition):
return new_speed
+last_ignition = False
def handle_fan_tici(controller, max_cpu_temp, fan_speed, ignition):
+ global last_ignition
+
controller.neg_limit = -(80 if ignition else 30)
controller.pos_limit = -(30 if ignition else 0)
+ if ignition != last_ignition:
+ controller.reset()
+
fan_pwr_out = -int(controller.update(
setpoint=(75 if ignition else (OFFROAD_DANGER_TEMP - 2)),
measurement=max_cpu_temp,
feedforward=interp(max_cpu_temp, [60.0, 100.0], [0, -80])
))
+ last_ignition = ignition
return fan_pwr_out
diff --git a/selfdrive/ui/navd/route_engine.h b/selfdrive/ui/navd/route_engine.h
index 5b8de698a96bb3..9a6c99041732aa 100644
--- a/selfdrive/ui/navd/route_engine.h
+++ b/selfdrive/ui/navd/route_engine.h
@@ -1,5 +1,7 @@
#pragma once
+#include
+
#include
#include
#include
diff --git a/selfdrive/ui/paint.cc b/selfdrive/ui/paint.cc
index 1bbbb8379cd4c1..612b924f3220d9 100644
--- a/selfdrive/ui/paint.cc
+++ b/selfdrive/ui/paint.cc
@@ -64,15 +64,15 @@ static void ui_draw_circle_image(const UIState *s, int center_x, int center_y, i
ui_draw_circle_image(s, center_x, center_y, radius, image, nvgRGBA(0, 0, 0, (255 * bg_alpha)), img_alpha);
}
-static void draw_lead(UIState *s, const cereal::ModelDataV2::LeadDataV3::Reader &lead_data, const vertex_data &vd) {
+static void draw_lead(UIState *s, const cereal::RadarState::LeadData::Reader &lead_data, const vertex_data &vd) {
// Draw lead car indicator
auto [x, y] = vd;
float fillAlpha = 0;
float speedBuff = 10.;
float leadBuff = 40.;
- float d_rel = lead_data.getX()[0];
- float v_rel = lead_data.getV()[0];
+ float d_rel = lead_data.getDRel();
+ float v_rel = lead_data.getVRel();
if (d_rel < leadBuff) {
fillAlpha = 255*(1.0-(d_rel/leadBuff));
if (v_rel < 0) {
@@ -139,12 +139,12 @@ static void ui_draw_world(UIState *s) {
// Draw lead indicators if openpilot is handling longitudinal
if (s->scene.longitudinal_control) {
- auto lead_one = (*s->sm)["modelV2"].getModelV2().getLeadsV3()[0];
- auto lead_two = (*s->sm)["modelV2"].getModelV2().getLeadsV3()[1];
- if (lead_one.getProb() > .5) {
+ auto lead_one = (*s->sm)["radarState"].getRadarState().getLeadOne();
+ auto lead_two = (*s->sm)["radarState"].getRadarState().getLeadTwo();
+ if (lead_one.getStatus()) {
draw_lead(s, lead_one, s->scene.lead_vertices[0]);
}
- if (lead_two.getProb() > .5 && (std::abs(lead_one.getX()[0] - lead_two.getX()[0]) > 3.0)) {
+ if (lead_two.getStatus() && (std::abs(lead_one.getDRel() - lead_two.getDRel()) > 3.0)) {
draw_lead(s, lead_two, s->scene.lead_vertices[1]);
}
}
@@ -302,12 +302,10 @@ void ui_resize(UIState *s, int width, int height) {
// Apply transformation such that video pixel coordinates match video
// 1) Put (0, 0) in the middle of the video
- nvgTranslate(s->vg, width / 2, height / 2 + y_offset);
// 2) Apply same scaling as video
- nvgScale(s->vg, zoom, zoom);
// 3) Put (0, 0) in top left corner of video
- nvgTranslate(s->vg, -intrinsic_matrix.v[2], -intrinsic_matrix.v[5]);
-
- nvgCurrentTransform(s->vg, s->car_space_transform);
- nvgResetTransform(s->vg);
+ s->car_space_transform.reset();
+ s->car_space_transform.translate(width / 2, height / 2 + y_offset)
+ .scale(zoom, zoom)
+ .translate(-intrinsic_matrix.v[2], -intrinsic_matrix.v[5]);
}
diff --git a/selfdrive/ui/paint.h b/selfdrive/ui/paint.h
index 55fe9c1d0835f1..4ce7cbd133e156 100644
--- a/selfdrive/ui/paint.h
+++ b/selfdrive/ui/paint.h
@@ -9,3 +9,4 @@ void ui_fill_rect(NVGcontext *vg, const Rect &r, const NVGpaint &paint, float ra
void ui_fill_rect(NVGcontext *vg, const Rect &r, const NVGcolor &color, float radius = 0);
void ui_nvg_init(UIState *s);
void ui_resize(UIState *s, int width, int height);
+void ui_update_params(UIState *s);
diff --git a/selfdrive/ui/qt/maps/map.cc b/selfdrive/ui/qt/maps/map.cc
index 1daed310b756aa..ecb5c122ae95ac 100644
--- a/selfdrive/ui/qt/maps/map.cc
+++ b/selfdrive/ui/qt/maps/map.cc
@@ -22,12 +22,15 @@ const float MIN_PITCH = 0;
const float MAP_SCALE = 2;
MapWindow::MapWindow(const QMapboxGLSettings &settings) :
- m_settings(settings), velocity_filter(0, 10, 0.1) {
+ m_settings(settings), velocity_filter(0, 10, 0.05) {
sm = new SubMaster({"liveLocationKalman", "navInstruction", "navRoute"});
+ // Connect now, so any navRoutes sent while the map is initializing are not dropped
+ sm->update(0);
+
timer = new QTimer(this);
QObject::connect(timer, SIGNAL(timeout()), this, SLOT(timerUpdate()));
- timer->start(100);
+ timer->start(50);
// Instructions
map_instructions = new MapInstructions(this);
@@ -50,6 +53,7 @@ MapWindow::MapWindow(const QMapboxGLSettings &settings) :
}
grabGesture(Qt::GestureType::PinchGesture);
+ qDebug() << "MapWindow initialized";
}
MapWindow::~MapWindow() {
@@ -178,7 +182,8 @@ void MapWindow::timerUpdate() {
}
}
- if (sm->updated("navRoute")) {
+ if (sm->rcv_frame("navRoute") != route_rcv_frame) {
+ qWarning() << "Got new navRoute from navd";
auto route = (*sm)["navRoute"].getNavRoute();
auto route_points = capnp_coordinate_list_to_collection(route.getCoordinates());
QMapbox::Feature feature(QMapbox::Feature::LineStringType, route_points, {}, {});
@@ -193,6 +198,7 @@ void MapWindow::timerUpdate() {
setVisible(true); // Show map on destination set/change
allow_open = false;
}
+ route_rcv_frame = sm->rcv_frame("navRoute");
}
}
diff --git a/selfdrive/ui/qt/maps/map.h b/selfdrive/ui/qt/maps/map.h
index 519750ce58a784..a5e333fdf50e60 100644
--- a/selfdrive/ui/qt/maps/map.h
+++ b/selfdrive/ui/qt/maps/map.h
@@ -114,6 +114,7 @@ class MapWindow : public QOpenGLWidget {
MapETA* map_eta;
void clearRoute();
+ uint64_t route_rcv_frame = 0;
private slots:
void timerUpdate();
diff --git a/selfdrive/ui/qt/onroad.cc b/selfdrive/ui/qt/onroad.cc
index a2195a621d5f49..e7a233000cdd8e 100644
--- a/selfdrive/ui/qt/onroad.cc
+++ b/selfdrive/ui/qt/onroad.cc
@@ -42,10 +42,12 @@ OnroadWindow::OnroadWindow(QWidget *parent) : QWidget(parent) {
void OnroadWindow::updateState(const UIState &s) {
QColor bgColor = bg_colors[s.status];
Alert alert = Alert::get(*(s.sm), s.scene.started_frame);
- if (alert.type == "controlsUnresponsive") {
- bgColor = bg_colors[STATUS_ALERT];
+ if (s.sm->updated("controlsState") || !alert.equal({})) {
+ if (alert.type == "controlsUnresponsive") {
+ bgColor = bg_colors[STATUS_ALERT];
+ }
+ alerts->updateAlert(alert, bgColor);
}
- alerts->updateAlert(alert, bgColor);
if (bg != bgColor) {
// repaint border
bg = bgColor;
@@ -184,3 +186,9 @@ void NvgWindow::paintGL() {
}
prev_draw_t = cur_draw_t;
}
+
+void NvgWindow::showEvent(QShowEvent *event) {
+ CameraViewWidget::showEvent(event);
+ ui_update_params(&QUIState::ui_state);
+ prev_draw_t = millis_since_boot();
+}
diff --git a/selfdrive/ui/qt/onroad.h b/selfdrive/ui/qt/onroad.h
index 9be04e04ae473f..ee44973cf24c19 100644
--- a/selfdrive/ui/qt/onroad.h
+++ b/selfdrive/ui/qt/onroad.h
@@ -34,6 +34,7 @@ class NvgWindow : public CameraViewWidget {
protected:
void paintGL() override;
void initializeGL() override;
+ void showEvent(QShowEvent *event) override;
double prev_draw_t = 0;
};
diff --git a/selfdrive/ui/qt/sidebar.cc b/selfdrive/ui/qt/sidebar.cc
index cd53a5b725c831..73c4e2f8ce6b65 100644
--- a/selfdrive/ui/qt/sidebar.cc
+++ b/selfdrive/ui/qt/sidebar.cc
@@ -43,6 +43,8 @@ void Sidebar::mouseReleaseEvent(QMouseEvent *event) {
}
void Sidebar::updateState(const UIState &s) {
+ if (!isVisible()) return;
+
auto &sm = *(s.sm);
auto deviceState = sm["deviceState"].getDeviceState();
diff --git a/selfdrive/ui/qt/widgets/cameraview.cc b/selfdrive/ui/qt/widgets/cameraview.cc
index 19eb4ab7700373..1daabd7d1ec784 100644
--- a/selfdrive/ui/qt/widgets/cameraview.cc
+++ b/selfdrive/ui/qt/widgets/cameraview.cc
@@ -1,5 +1,8 @@
#include "selfdrive/ui/qt/widgets/cameraview.h"
+#include
+#include
+
namespace {
const char frame_vertex_shader[] =
@@ -197,18 +200,13 @@ void CameraViewWidget::paintGL() {
glClear(GL_STENCIL_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
return;
}
+ std::unique_lock lk(texture_lock);
glViewport(0, 0, width(), height());
glBindVertexArray(frame_vao);
glActiveTexture(GL_TEXTURE0);
-
glBindTexture(GL_TEXTURE_2D, texture[latest_frame->idx]->frame_tex);
- if (!Hardware::EON()) {
- // this is handled in ion on QCOM
- glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, latest_frame->width, latest_frame->height,
- GL_RGB, GL_UNSIGNED_BYTE, latest_frame->addr);
- }
glUseProgram(program->programId());
glUniform1i(program->uniformLocation("uTexture"), 0);
@@ -251,6 +249,25 @@ void CameraViewWidget::vipcThread() {
VisionStreamType cur_stream_type = stream_type;
std::unique_ptr vipc_client;
+ std::unique_ptr ctx;
+ std::unique_ptr surface;
+ std::unique_ptr gl_buffer;
+
+ if (!Hardware::EON()) {
+ ctx = std::make_unique();
+ ctx->setFormat(context()->format());
+ ctx->setShareContext(context());
+ ctx->create();
+ assert(ctx->isValid());
+
+ surface = std::make_unique();
+ surface->setFormat(ctx->format());
+ surface->create();
+ ctx->makeCurrent(surface.get());
+ assert(QOpenGLContext::currentContext() == ctx.get());
+ initializeOpenGLFunctions();
+ }
+
while (!QThread::currentThread()->isInterruptionRequested()) {
if (!vipc_client || cur_stream_type != stream_type) {
cur_stream_type = stream_type;
@@ -262,11 +279,38 @@ void CameraViewWidget::vipcThread() {
QThread::msleep(100);
continue;
}
+
+ if (!Hardware::EON()) {
+ gl_buffer.reset(new QOpenGLBuffer(QOpenGLBuffer::PixelUnpackBuffer));
+ gl_buffer->create();
+ gl_buffer->bind();
+ gl_buffer->setUsagePattern(QOpenGLBuffer::StreamDraw);
+ gl_buffer->allocate(vipc_client->buffers[0].len);
+ }
+
emit vipcThreadConnected(vipc_client.get());
}
if (VisionBuf *buf = vipc_client->recv(nullptr, 1000)) {
- emit vipcThreadFrameReceived(buf);
+ if (!Hardware::EON()) {
+ std::unique_lock lk(texture_lock);
+
+ void *texture_buffer = gl_buffer->map(QOpenGLBuffer::WriteOnly);
+ memcpy(texture_buffer, buf->addr, buf->len);
+ gl_buffer->unmap();
+
+ // copy pixels from PBO to texture object
+ glBindTexture(GL_TEXTURE_2D, texture[buf->idx]->frame_tex);
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, buf->width, buf->height, GL_RGB, GL_UNSIGNED_BYTE, 0);
+ glBindTexture(GL_TEXTURE_2D, 0);
+ assert(glGetError() == GL_NO_ERROR);
+
+ emit vipcThreadFrameReceived(buf);
+
+ glFlush();
+ } else {
+ emit vipcThreadFrameReceived(buf);
+ }
}
}
}
diff --git a/selfdrive/ui/qt/widgets/cameraview.h b/selfdrive/ui/qt/widgets/cameraview.h
index caf686cee81376..90622c6b775a6e 100644
--- a/selfdrive/ui/qt/widgets/cameraview.h
+++ b/selfdrive/ui/qt/widgets/cameraview.h
@@ -48,6 +48,8 @@ class CameraViewWidget : public QOpenGLWidget, protected QOpenGLFunctions {
std::atomic stream_type;
QThread *vipc_thread = nullptr;
+ std::mutex texture_lock;
+
protected slots:
void vipcConnected(VisionIpcClient *vipc_client);
void vipcFrameReceived(VisionBuf *buf);
diff --git a/selfdrive/ui/replay/framereader.cc b/selfdrive/ui/replay/framereader.cc
index bfdc6ee386d767..1524ad974850ed 100644
--- a/selfdrive/ui/replay/framereader.cc
+++ b/selfdrive/ui/replay/framereader.cc
@@ -1,94 +1,122 @@
#include "selfdrive/ui/replay/framereader.h"
#include
-#include
namespace {
-int readFunction(void *opaque, uint8_t *buf, int buf_size) {
- auto &iss = *reinterpret_cast(opaque);
- iss.read(reinterpret_cast(buf), buf_size);
- return iss.gcount() ? iss.gcount() : AVERROR_EOF;
+struct buffer_data {
+ const uint8_t *data;
+ int64_t offset;
+ size_t size;
+};
+
+int readPacket(void *opaque, uint8_t *buf, int buf_size) {
+ struct buffer_data *bd = (struct buffer_data *)opaque;
+ buf_size = std::min((size_t)buf_size, bd->size - bd->offset);
+ if (!buf_size) return AVERROR_EOF;
+
+ memcpy(buf, bd->data + bd->offset, buf_size);
+ bd->offset += buf_size;
+ return buf_size;
+}
+
+enum AVPixelFormat get_hw_format(AVCodecContext *ctx, const enum AVPixelFormat *pix_fmts) {
+ enum AVPixelFormat *hw_pix_fmt = reinterpret_cast(ctx->opaque);
+ for (const enum AVPixelFormat *p = pix_fmts; *p != -1; p++) {
+ if (*p == *hw_pix_fmt) return *p;
+ }
+ printf("Please run replay with the --no-cuda flag!\n");
+ assert(0);
+ return AV_PIX_FMT_NONE;
}
} // namespace
FrameReader::FrameReader(bool local_cache, int chunk_size, int retries) : FileReader(local_cache, chunk_size, retries) {
- pFormatCtx_ = avformat_alloc_context();
- av_frame_ = av_frame_alloc();
- rgb_frame_ = av_frame_alloc();
- yuv_frame_ = av_frame_alloc();
+ input_ctx = avformat_alloc_context();
+ sws_frame.reset(av_frame_alloc());
}
FrameReader::~FrameReader() {
for (auto &f : frames_) {
- av_free_packet(&f.pkt);
+ av_packet_unref(&f.pkt);
}
- if (pCodecCtx_) avcodec_free_context(&pCodecCtx_);
- if (pFormatCtx_) avformat_close_input(&pFormatCtx_);
- if (av_frame_) av_frame_free(&av_frame_);
- if (rgb_frame_) av_frame_free(&rgb_frame_);
- if (yuv_frame_) av_frame_free(&yuv_frame_);
+ if (decoder_ctx) avcodec_free_context(&decoder_ctx);
+ if (input_ctx) avformat_close_input(&input_ctx);
+ if (hw_device_ctx) av_buffer_unref(&hw_device_ctx);
+
if (rgb_sws_ctx_) sws_freeContext(rgb_sws_ctx_);
if (yuv_sws_ctx_) sws_freeContext(yuv_sws_ctx_);
if (avio_ctx_) {
av_freep(&avio_ctx_->buffer);
- av_freep(&avio_ctx_);
+ avio_context_free(&avio_ctx_);
}
}
-bool FrameReader::load(const std::string &url, std::atomic *abort) {
+bool FrameReader::load(const std::string &url, bool no_cuda, std::atomic *abort) {
std::string content = read(url, abort);
if (content.empty()) return false;
- std::istringstream iss(content);
+ struct buffer_data bd = {
+ .data = (uint8_t *)content.data(),
+ .offset = 0,
+ .size = content.size(),
+ };
const int avio_ctx_buffer_size = 64 * 1024;
unsigned char *avio_ctx_buffer = (unsigned char *)av_malloc(avio_ctx_buffer_size);
- avio_ctx_ = avio_alloc_context(avio_ctx_buffer, avio_ctx_buffer_size, 0, &iss, readFunction, nullptr, nullptr);
- pFormatCtx_->pb = avio_ctx_;
+ avio_ctx_ = avio_alloc_context(avio_ctx_buffer, avio_ctx_buffer_size, 0, &bd, readPacket, nullptr, nullptr);
+ input_ctx->pb = avio_ctx_;
- pFormatCtx_->probesize = 10 * 1024 * 1024; // 10MB
- int ret = avformat_open_input(&pFormatCtx_, url.c_str(), NULL, NULL);
+ input_ctx->probesize = 10 * 1024 * 1024; // 10MB
+ int ret = avformat_open_input(&input_ctx, url.c_str(), NULL, NULL);
if (ret != 0) {
char err_str[1024] = {0};
av_strerror(ret, err_str, std::size(err_str));
printf("Error loading video - %s - %s\n", err_str, url.c_str());
return false;
}
- avformat_find_stream_info(pFormatCtx_, NULL);
- // av_dump_format(pFormatCtx_, 0, url.c_str(), 0);
- AVStream *video = pFormatCtx_->streams[0];
- auto pCodec = avcodec_find_decoder(video->codec->codec_id);
- if (!pCodec) return false;
+ ret = avformat_find_stream_info(input_ctx, nullptr);
+ if (ret < 0) {
+ printf("cannot find a video stream in the input file\n");
+ return false;
+ }
+
+ AVStream *video = input_ctx->streams[0];
+ AVCodec *decoder = avcodec_find_decoder(video->codec->codec_id);
+ if (!decoder) return false;
- pCodecCtx_ = avcodec_alloc_context3(pCodec);
- ret = avcodec_parameters_to_context(pCodecCtx_, video->codecpar);
+ decoder_ctx = avcodec_alloc_context3(decoder);
+ ret = avcodec_parameters_to_context(decoder_ctx, video->codecpar);
if (ret != 0) return false;
- // pCodecCtx_->thread_count = 0;
- // pCodecCtx_->thread_type = FF_THREAD_FRAME;
- ret = avcodec_open2(pCodecCtx_, pCodec, NULL);
- if (ret < 0) return false;
+ width = (decoder_ctx->width + 3) & ~3;
+ height = decoder_ctx->height;
- width = (pCodecCtx_->width + 3) & ~3;
- height = pCodecCtx_->height;
- rgb_sws_ctx_ = sws_getContext(pCodecCtx_->width, pCodecCtx_->height, AV_PIX_FMT_YUV420P,
- width, height, AV_PIX_FMT_BGR24,
- SWS_FAST_BILINEAR, NULL, NULL, NULL);
- if (!rgb_sws_ctx_) return false;
+ if (!no_cuda) {
+ if (!initHardwareDecoder(AV_HWDEVICE_TYPE_CUDA)) {
+ printf("No CUDA capable device was found. fallback to CPU decoding.\n");
+ }
+ }
- yuv_sws_ctx_ = sws_getContext(pCodecCtx_->width, pCodecCtx_->height, AV_PIX_FMT_YUV420P,
- width, height, AV_PIX_FMT_YUV420P,
- SWS_FAST_BILINEAR, NULL, NULL, NULL);
+ rgb_sws_ctx_ = sws_getContext(decoder_ctx->width, decoder_ctx->height, sws_src_format,
+ width, height, AV_PIX_FMT_BGR24,
+ SWS_BILINEAR, NULL, NULL, NULL);
+ if (!rgb_sws_ctx_) return false;
+ yuv_sws_ctx_ = sws_getContext(decoder_ctx->width, decoder_ctx->height, sws_src_format,
+ width, height, AV_PIX_FMT_YUV420P,
+ SWS_BILINEAR, NULL, NULL, NULL);
if (!yuv_sws_ctx_) return false;
+ ret = avcodec_open2(decoder_ctx, decoder, NULL);
+ if (ret < 0) return false;
+
frames_.reserve(60 * 20); // 20fps, one minute
while (!(abort && *abort)) {
Frame &frame = frames_.emplace_back();
- ret = av_read_frame(pFormatCtx_, &frame.pkt);
+ ret = av_read_frame(input_ctx, &frame.pkt);
if (ret < 0) {
frames_.pop_back();
valid_ = (ret == AVERROR_EOF);
@@ -100,6 +128,43 @@ bool FrameReader::load(const std::string &url, std::atomic *abort) {
return valid_;
}
+bool FrameReader::initHardwareDecoder(AVHWDeviceType hw_device_type) {
+ for (int i = 0;; i++) {
+ const AVCodecHWConfig *config = avcodec_get_hw_config(decoder_ctx->codec, i);
+ if (!config) {
+ printf("decoder %s does not support hw device type %s.\n",
+ decoder_ctx->codec->name, av_hwdevice_get_type_name(hw_device_type));
+ return false;
+ }
+ if (config->methods & AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX && config->device_type == hw_device_type) {
+ hw_pix_fmt = config->pix_fmt;
+ break;
+ }
+ }
+
+ int ret = av_hwdevice_ctx_create(&hw_device_ctx, hw_device_type, nullptr, nullptr, 0);
+ if (ret < 0) {
+ printf("Failed to create specified HW device %d.\n", ret);
+ return false;
+ }
+
+ // get sws source format
+ AVHWFramesConstraints *hw_frames_const = av_hwdevice_get_hwframe_constraints(hw_device_ctx, nullptr);
+ assert(hw_frames_const != 0);
+ for (AVPixelFormat *p = hw_frames_const->valid_sw_formats; *p != AV_PIX_FMT_NONE; p++) {
+ if (sws_isSupportedInput(*p)) {
+ sws_src_format = *p;
+ break;
+ }
+ }
+ av_hwframe_constraints_free(&hw_frames_const);
+
+ decoder_ctx->hw_device_ctx = av_buffer_ref(hw_device_ctx);
+ decoder_ctx->opaque = &hw_pix_fmt;
+ decoder_ctx->get_format = get_hw_format;
+ return true;
+}
+
bool FrameReader::get(int idx, uint8_t *rgb, uint8_t *yuv) {
assert(rgb || yuv);
if (!valid_ || idx < 0 || idx >= frames_.size()) {
@@ -125,35 +190,51 @@ bool FrameReader::decode(int idx, uint8_t *rgb, uint8_t *yuv) {
for (int i = from_idx; i <= idx; ++i) {
Frame &frame = frames_[i];
if ((!frame.decoded || i == idx) && !frame.failed) {
- frame.decoded = decodeFrame(&frame.pkt);
+ AVFrame *f = decodeFrame(&frame.pkt);
+ frame.decoded = f != nullptr;
frame.failed = !frame.decoded;
if (frame.decoded && i == idx) {
- return copyBuffers(av_frame_, rgb, yuv);
+ return copyBuffers(f, rgb, yuv);
}
}
}
return false;
}
-bool FrameReader::decodeFrame(AVPacket *pkt) {
- int ret = avcodec_send_packet(pCodecCtx_, pkt);
+AVFrame *FrameReader::decodeFrame(AVPacket *pkt) {
+ int ret = avcodec_send_packet(decoder_ctx, pkt);
if (ret < 0) {
printf("Error sending a packet for decoding\n");
- return false;
+ return nullptr;
+ }
+
+ av_frame_.reset(av_frame_alloc());
+ ret = avcodec_receive_frame(decoder_ctx, av_frame_.get());
+ if (ret != 0) {
+ return nullptr;
+ }
+
+ if (av_frame_->format == hw_pix_fmt) {
+ hw_frame.reset(av_frame_alloc());
+ if ((ret = av_hwframe_transfer_data(hw_frame.get(), av_frame_.get(), 0)) < 0) {
+ printf("error transferring the data from GPU to CPU\n");
+ return nullptr;
+ }
+ return hw_frame.get();
+ } else {
+ return av_frame_.get();
}
- ret = avcodec_receive_frame(pCodecCtx_, av_frame_);
- return ret == 0;
}
bool FrameReader::copyBuffers(AVFrame *f, uint8_t *rgb, uint8_t *yuv) {
// images is going to be written to output buffers, no alignment (align = 1)
if (yuv) {
- av_image_fill_arrays(yuv_frame_->data, yuv_frame_->linesize, yuv, AV_PIX_FMT_YUV420P, width, height, 1);
- int ret = sws_scale(yuv_sws_ctx_, (const uint8_t **)f->data, f->linesize, 0, f->height, yuv_frame_->data, yuv_frame_->linesize);
+ av_image_fill_arrays(sws_frame->data, sws_frame->linesize, yuv, AV_PIX_FMT_YUV420P, width, height, 1);
+ int ret = sws_scale(yuv_sws_ctx_, (const uint8_t **)f->data, f->linesize, 0, f->height, sws_frame->data, sws_frame->linesize);
if (ret < 0) return false;
}
- av_image_fill_arrays(rgb_frame_->data, rgb_frame_->linesize, rgb, AV_PIX_FMT_BGR24, width, height, 1);
- int ret = sws_scale(rgb_sws_ctx_, (const uint8_t **)f->data, f->linesize, 0, f->height, rgb_frame_->data, rgb_frame_->linesize);
+ av_image_fill_arrays(sws_frame->data, sws_frame->linesize, rgb, AV_PIX_FMT_BGR24, width, height, 1);
+ int ret = sws_scale(rgb_sws_ctx_, (const uint8_t **)f->data, f->linesize, 0, f->height, sws_frame->data, sws_frame->linesize);
return ret >= 0;
}
diff --git a/selfdrive/ui/replay/framereader.h b/selfdrive/ui/replay/framereader.h
index 1b552cd1b859d0..c7b04138cfd7f3 100644
--- a/selfdrive/ui/replay/framereader.h
+++ b/selfdrive/ui/replay/framereader.h
@@ -1,5 +1,6 @@
#pragma once
+#include
#include
#include
@@ -12,11 +13,15 @@ extern "C" {
#include
}
+struct AVFrameDeleter {
+ void operator()(AVFrame* frame) const { av_frame_free(&frame); }
+};
+
class FrameReader : protected FileReader {
public:
FrameReader(bool local_cache = false, int chunk_size = -1, int retries = 0);
~FrameReader();
- bool load(const std::string &url, std::atomic *abort = nullptr);
+ bool load(const std::string &url, bool no_cuda = false, std::atomic *abort = nullptr);
bool get(int idx, uint8_t *rgb, uint8_t *yuv);
int getRGBSize() const { return width * height * 3; }
int getYUVSize() const { return width * height * 3 / 2; }
@@ -26,8 +31,9 @@ class FrameReader : protected FileReader {
int width = 0, height = 0;
private:
+ bool initHardwareDecoder(AVHWDeviceType hw_device_type);
bool decode(int idx, uint8_t *rgb, uint8_t *yuv);
- bool decodeFrame(AVPacket *pkt);
+ AVFrame * decodeFrame(AVPacket *pkt);
bool copyBuffers(AVFrame *f, uint8_t *rgb, uint8_t *yuv);
struct Frame {
@@ -36,11 +42,15 @@ class FrameReader : protected FileReader {
bool failed = false;
};
std::vector frames_;
+ AVPixelFormat sws_src_format = AV_PIX_FMT_YUV420P;
SwsContext *rgb_sws_ctx_ = nullptr, *yuv_sws_ctx_ = nullptr;
- AVFrame *av_frame_, *rgb_frame_, *yuv_frame_ = nullptr;
- AVFormatContext *pFormatCtx_ = nullptr;
- AVCodecContext *pCodecCtx_ = nullptr;
+ std::unique_ptrav_frame_, sws_frame, hw_frame;
+ AVFormatContext *input_ctx = nullptr;
+ AVCodecContext *decoder_ctx = nullptr;
int key_frames_count_ = 0;
bool valid_ = false;
AVIOContext *avio_ctx_ = nullptr;
+
+ AVPixelFormat hw_pix_fmt = AV_PIX_FMT_NONE;
+ AVBufferRef *hw_device_ctx = nullptr;
};
diff --git a/selfdrive/ui/replay/main.cc b/selfdrive/ui/replay/main.cc
index d4fc8ff13a9f5c..062837885b1c67 100644
--- a/selfdrive/ui/replay/main.cc
+++ b/selfdrive/ui/replay/main.cc
@@ -102,6 +102,7 @@ int main(int argc, char *argv[]) {
{"no-cache", REPLAY_FLAG_NO_FILE_CACHE, "turn off local cache"},
{"qcam", REPLAY_FLAG_QCAMERA, "load qcamera"},
{"yuv", REPLAY_FLAG_SEND_YUV, "send yuv frame"},
+ {"no-cuda", REPLAY_FLAG_NO_CUDA, "disable CUDA"},
};
QCommandLineParser parser;
diff --git a/selfdrive/ui/replay/replay.h b/selfdrive/ui/replay/replay.h
index 320afa505b9670..2d30d90e4bce7d 100644
--- a/selfdrive/ui/replay/replay.h
+++ b/selfdrive/ui/replay/replay.h
@@ -16,6 +16,7 @@ enum REPLAY_FLAGS {
REPLAY_FLAG_NO_FILE_CACHE = 0x0020,
REPLAY_FLAG_QCAMERA = 0x0040,
REPLAY_FLAG_SEND_YUV = 0x0080,
+ REPLAY_FLAG_NO_CUDA = 0x0100,
};
class Replay : public QObject {
diff --git a/selfdrive/ui/replay/route.cc b/selfdrive/ui/replay/route.cc
index d834d67ab63714..9ee1d387c4736c 100644
--- a/selfdrive/ui/replay/route.cc
+++ b/selfdrive/ui/replay/route.cc
@@ -91,7 +91,7 @@ void Route::addFileToSegment(int n, const QString &file) {
// class Segment
-Segment::Segment(int n, const SegmentFile &files, uint32_t flags) : seg_num(n) {
+Segment::Segment(int n, const SegmentFile &files, uint32_t flags) : seg_num(n), flags(flags) {
// [RoadCam, DriverCam, WideRoadCam, log]. fallback to qcamera/qlog
const QString file_list[] = {
(flags & REPLAY_FLAG_QCAMERA) || files.road_cam.isEmpty() ? files.qcamera : files.road_cam,
@@ -102,7 +102,7 @@ Segment::Segment(int n, const SegmentFile &files, uint32_t flags) : seg_num(n) {
for (int i = 0; i < std::size(file_list); i++) {
if (!file_list[i].isEmpty()) {
loading_++;
- synchronizer_.addFuture(QtConcurrent::run([=] { loadFile(i, file_list[i].toStdString(), !(flags & REPLAY_FLAG_NO_FILE_CACHE)); }));
+ synchronizer_.addFuture(QtConcurrent::run([=] { loadFile(i, file_list[i].toStdString()); }));
}
}
}
@@ -114,11 +114,12 @@ Segment::~Segment() {
synchronizer_.waitForFinished();
}
-void Segment::loadFile(int id, const std::string file, bool local_cache) {
+void Segment::loadFile(int id, const std::string file) {
+ const bool local_cache = !(flags & REPLAY_FLAG_NO_FILE_CACHE);
bool success = false;
if (id < MAX_CAMERAS) {
frames[id] = std::make_unique(local_cache, 20 * 1024 * 1024, 3);
- success = frames[id]->load(file, &abort_);
+ success = frames[id]->load(file, flags & REPLAY_FLAG_NO_CUDA, &abort_);
} else {
log = std::make_unique(local_cache, -1, 3);
success = log->load(file, &abort_);
diff --git a/selfdrive/ui/replay/route.h b/selfdrive/ui/replay/route.h
index b11607f250021f..c39eef7d92ef4c 100644
--- a/selfdrive/ui/replay/route.h
+++ b/selfdrive/ui/replay/route.h
@@ -58,9 +58,10 @@ class Segment : public QObject {
void loadFinished(bool success);
protected:
- void loadFile(int id, const std::string file, bool local_cache);
+ void loadFile(int id, const std::string file);
std::atomic abort_ = false;
std::atomic loading_ = 0;
QFutureSynchronizer synchronizer_;
+ uint32_t flags;
};
diff --git a/selfdrive/ui/ui.cc b/selfdrive/ui/ui.cc
index d0c3c04879c9e7..7a4de06586d48b 100644
--- a/selfdrive/ui/ui.cc
+++ b/selfdrive/ui/ui.cc
@@ -12,23 +12,27 @@
#define BACKLIGHT_DT 0.05
#define BACKLIGHT_TS 10.00
-#define BACKLIGHT_OFFROAD 75
+#define BACKLIGHT_OFFROAD 50
// Projects a point in car to space to the corresponding point in full frame
// image space.
static bool calib_frame_to_full_frame(const UIState *s, float in_x, float in_y, float in_z, vertex_data *out) {
const float margin = 500.0f;
+ const QRectF clip_region{-margin, -margin, s->fb_w + 2 * margin, s->fb_h + 2 * margin};
+
const vec3 pt = (vec3){{in_x, in_y, in_z}};
const vec3 Ep = matvecmul3(s->scene.view_from_calib, pt);
const vec3 KEp = matvecmul3(s->wide_camera ? ecam_intrinsic_matrix : fcam_intrinsic_matrix, Ep);
// Project.
- float x = KEp.v[0] / KEp.v[2];
- float y = KEp.v[1] / KEp.v[2];
-
- nvgTransformPoint(&out->x, &out->y, s->car_space_transform, x, y);
- return out->x >= -margin && out->x <= s->fb_w + margin && out->y >= -margin && out->y <= s->fb_h + margin;
+ QPointF point = s->car_space_transform.map(QPointF{KEp.v[0] / KEp.v[2], KEp.v[1] / KEp.v[2]});
+ if (clip_region.contains(point)) {
+ out->x = point.x();
+ out->y = point.y();
+ return true;
+ }
+ return false;
}
static int get_path_length_idx(const cereal::ModelDataV2::XYZTData::Reader &line, const float path_height) {
@@ -40,13 +44,12 @@ static int get_path_length_idx(const cereal::ModelDataV2::XYZTData::Reader &line
return max_idx;
}
-static void update_leads(UIState *s, const cereal::ModelDataV2::Reader &model) {
- auto leads = model.getLeadsV3();
- auto model_position = model.getPosition();
+static void update_leads(UIState *s, const cereal::RadarState::Reader &radar_state, std::optional line) {
for (int i = 0; i < 2; ++i) {
- if (leads[i].getProb() > 0.5) {
- float z = model_position.getZ()[get_path_length_idx(model_position, leads[i].getX()[0])];
- calib_frame_to_full_frame(s, leads[i].getX()[0], leads[i].getY()[0], z + 1.22, &s->scene.lead_vertices[i]);
+ auto lead_data = (i == 0) ? radar_state.getLeadOne() : radar_state.getLeadTwo();
+ if (lead_data.getStatus()) {
+ float z = line ? (*line).getZ()[get_path_length_idx(*line, lead_data.getDRel())] : 0.0;
+ calib_frame_to_full_frame(s, lead_data.getDRel(), -lead_data.getYRel(), z + 1.22, &s->scene.lead_vertices[i]);
}
}
}
@@ -89,9 +92,9 @@ static void update_model(UIState *s, const cereal::ModelDataV2::Reader &model) {
}
// update path
- auto lead_one = model.getLeadsV3()[0];
- if (lead_one.getProb() > 0.5) {
- const float lead_d = lead_one.getX()[0] * 2.;
+ auto lead_one = (*s->sm)["radarState"].getRadarState().getLeadOne();
+ if (lead_one.getStatus()) {
+ const float lead_d = lead_one.getDRel() * 2.;
max_distance = std::clamp((float)(lead_d - fmin(lead_d * 0.35, 10.)), 0.0f, max_distance);
}
max_idx = get_path_length_idx(model_position, max_distance);
@@ -105,6 +108,7 @@ static void update_sockets(UIState *s) {
static void update_state(UIState *s) {
SubMaster &sm = *(s->sm);
UIScene &scene = s->scene;
+ s->running_time = 1e-9 * (nanos_since_boot() - sm["deviceState"].getDeviceState().getStartedMonoTime());
// update engageability and DM icons at 2Hz
if (sm.frame % (UI_FREQ / 2) == 0) {
@@ -113,9 +117,14 @@ static void update_state(UIState *s) {
scene.dm_active = sm["driverMonitoringState"].getDriverMonitoringState().getIsActiveMode();
}
if (sm.updated("modelV2") && s->vg) {
- auto model = sm["modelV2"].getModelV2();
- update_model(s, model);
- update_leads(s, model);
+ update_model(s, sm["modelV2"].getModelV2());
+ }
+ if (sm.updated("radarState") && s->vg) {
+ std::optional line;
+ if (sm.rcv_frame("modelV2") > 0) {
+ line = sm["modelV2"].getModelV2().getPosition();
+ }
+ update_leads(s, sm["radarState"].getRadarState(), line);
}
if (sm.updated("liveCalibration")) {
scene.world_objects_visible = true;
@@ -185,12 +194,8 @@ static void update_state(UIState *s) {
scene.started = sm["deviceState"].getDeviceState().getStarted() && scene.ignition;
}
-static void update_params(UIState *s) {
- const uint64_t frame = s->sm->frame;
- UIScene &scene = s->scene;
- if (frame % (5*UI_FREQ) == 0) {
- scene.is_metric = Params().getBool("IsMetric");
- }
+void ui_update_params(UIState *s) {
+ s->scene.is_metric = Params().getBool("IsMetric");
}
static void update_status(UIState *s) {
@@ -224,7 +229,7 @@ static void update_status(UIState *s) {
QUIState::QUIState(QObject *parent) : QObject(parent) {
ui_state.sm = std::make_unique>({
- "modelV2", "controlsState", "liveCalibration", "deviceState", "roadCameraState",
+ "modelV2", "controlsState", "liveCalibration", "radarState", "deviceState", "roadCameraState",
"pandaStates", "carParams", "driverMonitoringState", "sensorEvents", "carState", "liveLocationKalman",
});
@@ -239,7 +244,6 @@ QUIState::QUIState(QObject *parent) : QObject(parent) {
}
void QUIState::update() {
- update_params(&ui_state);
update_sockets(&ui_state);
update_state(&ui_state);
update_status(&ui_state);
@@ -249,7 +253,9 @@ void QUIState::update() {
emit offroadTransition(!ui_state.scene.started);
}
- watchdog_kick();
+ if (ui_state.sm->frame % UI_FREQ == 0) {
+ watchdog_kick();
+ }
emit uiUpdate(ui_state);
}
@@ -278,21 +284,30 @@ void Device::setAwake(bool on, bool reset) {
}
void Device::updateBrightness(const UIState &s) {
- // Scale to 0% to 100%
- float clipped_brightness = 100.0 * s.scene.light_sensor;
-
- // CIE 1931 - https://www.photonstophotos.net/GeneralTopics/Exposure/Psychometric_Lightness_and_Gamma.htm
- if (clipped_brightness <= 8) {
- clipped_brightness = (clipped_brightness / 903.3);
- } else {
- clipped_brightness = std::pow((clipped_brightness + 16.0) / 116.0, 3.0);
- }
+ float clipped_brightness = BACKLIGHT_OFFROAD;
+ if (s.scene.started) {
+ // Scale to 0% to 100%
+ clipped_brightness = 100.0 * s.scene.light_sensor;
+
+ // CIE 1931 - https://www.photonstophotos.net/GeneralTopics/Exposure/Psychometric_Lightness_and_Gamma.htm
+ if (clipped_brightness <= 8) {
+ clipped_brightness = (clipped_brightness / 903.3);
+ } else {
+ clipped_brightness = std::pow((clipped_brightness + 16.0) / 116.0, 3.0);
+ }
- // Scale back to 10% to 100%
- clipped_brightness = std::clamp(100.0f * clipped_brightness, 10.0f, 100.0f);
+ // Scale back to 10% to 100%
+ clipped_brightness = std::clamp(100.0f * clipped_brightness, 10.0f, 100.0f);
- if (!s.scene.started) {
- clipped_brightness = BACKLIGHT_OFFROAD;
+ // Limit brightness if running for too long
+ if (Hardware::TICI()) {
+ const float MAX_BRIGHTNESS_HOURS = 4;
+ const float HOURLY_BRIGHTNESS_DECREASE = 5;
+ float ui_running_hours = s.running_time / (60*60);
+ float anti_burnin_max_percent = std::clamp(100.0f - HOURLY_BRIGHTNESS_DECREASE * (ui_running_hours - MAX_BRIGHTNESS_HOURS),
+ 30.0f, 100.0f);
+ clipped_brightness = std::min(clipped_brightness, anti_burnin_max_percent);
+ }
}
int brightness = brightness_filter.update(clipped_brightness);
diff --git a/selfdrive/ui/ui.h b/selfdrive/ui/ui.h
index 4fcc137df7d8ff..46cbae63fb035d 100644
--- a/selfdrive/ui/ui.h
+++ b/selfdrive/ui/ui.h
@@ -3,11 +3,12 @@
#include