From dd3fd206dc6be9e78ef041b38e41781784839a8b Mon Sep 17 00:00:00 2001 From: Danny Staple Date: Sun, 22 Jan 2023 22:56:12 +0000 Subject: [PATCH] Add amended version of 4.3 with performance reporting and some fixes. --- .../4.3-monte-carlo_perf/analyse_output.ipynb | 344 +++ .../display_from_robot.py | 74 + ch-13/4.3-monte-carlo_perf/poetry.lock | 2572 +++++++++++++++++ ch-13/4.3-monte-carlo_perf/pyproject.toml | 22 + ch-13/4.3-monte-carlo_perf/requirements.txt | 3 + ch-13/4.3-monte-carlo_perf/robot/arena.py | 97 + ch-13/4.3-monte-carlo_perf/robot/code.py | 290 ++ .../robot/performance_counter.py | 85 + .../robot/pid_controller.py | 27 + .../4.3-monte-carlo_perf/robot/pio_encoder.py | 84 + ch-13/4.3-monte-carlo_perf/robot/robot.py | 80 + .../robot_ble_connection.py | 38 + 12 files changed, 3716 insertions(+) create mode 100644 ch-13/4.3-monte-carlo_perf/analyse_output.ipynb create mode 100644 ch-13/4.3-monte-carlo_perf/display_from_robot.py create mode 100644 ch-13/4.3-monte-carlo_perf/poetry.lock create mode 100644 ch-13/4.3-monte-carlo_perf/pyproject.toml create mode 100644 ch-13/4.3-monte-carlo_perf/requirements.txt create mode 100644 ch-13/4.3-monte-carlo_perf/robot/arena.py create mode 100644 ch-13/4.3-monte-carlo_perf/robot/code.py create mode 100644 ch-13/4.3-monte-carlo_perf/robot/performance_counter.py create mode 100644 ch-13/4.3-monte-carlo_perf/robot/pid_controller.py create mode 100644 ch-13/4.3-monte-carlo_perf/robot/pio_encoder.py create mode 100755 ch-13/4.3-monte-carlo_perf/robot/robot.py create mode 100644 ch-13/4.3-monte-carlo_perf/robot_ble_connection.py diff --git a/ch-13/4.3-monte-carlo_perf/analyse_output.ipynb b/ch-13/4.3-monte-carlo_perf/analyse_output.ipynb new file mode 100644 index 0000000..be334dd --- /dev/null +++ b/ch-13/4.3-monte-carlo_perf/analyse_output.ipynb @@ -0,0 +1,344 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "from matplotlib import pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import json\n", + "from robot import arena" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "poses_raw_data = \"\"\"\n", + "Received data: {\"poses\": [[1029, 243], [91, 1349], [1428, 74], [1428, 833], [27, 1127], [976, 1055], [63, 1147], [1336, 231], [853, 638], [1226, 285], [317, 371], [1402, 1025], [966, 1343], [1419, 165], [696, 1339], [885, 65], [844, 17], [142, 974], [830, 305], [1102, 1486]]}\n", + "Received data: {\"poses\": [[875, 341], [465, 694], [423, 1000], [869, 21], [1319, 313], [270, 358], [555, 310], [550, 409], [264, 706], [1336, 313], [476, 19], [577, 764], [1351, 1352], [949, 1304], [625, 688], [881, 1102], [1361, 1135], [749, 475], [1184, 446], [1108, 549]]}\n", + "Received data: {\"poses\": [[852, 902], [534, 1501], [375, 734], [712, 1143], [129, 1417], [1280, 225], [178, 399], [1412, 168], [773, 696], [1063, 666], [793, 526], [1493, 1046], [1015, 629], [1081, 515], [-44, 259], [1422, 367], [1393, -87], [526, 1134], [197, 641], [1092, 1399]]}\n", + "Received data: {\"poses\": [[947, 839], [1573, 1118], [300, 613], [282, 1334], [626, 659], [795, 1155], [1235, 120], [1014, 964], [1073, 798], [685, 760], [227, 503], [128, -152], [1022, 673], [615, 558], [1015, 428], [-139, 313], [1503, 288], [1349, -186], [556, 400], [625, 945]]}\n", + "Received data: {\"poses\": [[1032, 784], [1664, 1165], [317, 1162], [203, 231], [780, 949], [974, 52], [1201, 28], [919, 1016], [640, 1219], [210, 398], [171, -245], [1117, 718], [636, 458], [632, 466], [1286, 221], [218, 488], [892, 526], [1311, -280], [1344, 1446], [609, 1046]]}\n", + "Received data: {\"poses\": [[1006, 283], [415, 1115], [514, 596], [78, 858], [968, 841], [610, 1256], [-113, 523], [502, 866], [191, 293], [339, 1371], [664, 350], [657, 348], [655, 361], [1386, 178], [-322, 409], [93, 1256], [167, 1392], [651, -82], [1481, 1340], [769, 571]]}\n", + "Received data: {\"poses\": [[1011, 294], [427, 1116], [425, 1119], [80, 1196], [768, 1209], [1164, -82], [803, 1045], [502, 883], [196, 286], [1215, 783], [662, 346], [666, 349], [662, 354], [881, 253], [216, 605], [1288, 1053], [412, -27], [1328, 1560], [1492, 1343], [1262, 1119]]}\n", + "Received data: {\"poses\": [[1767, 1325], [517, 1177], [1318, 595], [901, 746], [511, 1197], [716, 984], [832, 1233], [274, 817], [218, 1369], [1220, 883], [779, 320], [770, 307], [763, 325], [765, 317], [122, 661], [1384, 1100], [73, 1458], [344, 207], [1577, 1408], [789, 682]]}\n", + "Received data: {\"poses\": [[1775, 1426], [597, 1228], [1221, 634], [849, 664], [781, -160], [632, 926], [915, 1285], [887, 234], [120, 1357], [1228, 982], [1219, 978], [868, 299], [857, 297], [863, 287], [38, 703], [1477, 1141], [-18, 1512], [1741, 1155], [1653, 1476], [1472, 1120]]}\n", + "Received data: {\"poses\": [[1398, 871], [683, 1300], [-221, 1285], [1381, 406], [372, 1320], [222, 742], [449, 96], [11, 1345], [1231, 1086], [969, 251], [974, 278], [972, 260], [959, 258], [1005, -44], [1574, 1184], [-114, 1010], [1045, 1695], [320, 9], [325, 1175], [1576, 1125]]}\n", + "Received data: {\"poses\": [[679, 1318], [679, 1320], [683, 1310], [1101, 651], [503, 1014], [329, 1066], [543, 850], [213, 732], [462, 95], [1218, 1105], [1218, 1095], [993, 278], [981, 255], [984, 263], [975, 261], [980, 269], [1582, 1194], [1031, 1694], [316, 1178], [269, 1243]]}\n", + "Received data: {\"poses\": [[1405, 977], [663, 1416], [684, 1394], [1032, 587], [836, 471], [1309, 486], [338, 973], [555, 753], [203, 635], [549, 139], [1138, 1153], [1056, 345], [1053, 342], [1047, 337], [1032, 344], [1044, 338], [1045, 339], [1575, 1303], [956, 1635], [198, 1170]]}\n", + "Received data: {\"poses\": [[769, 684], [644, 1528], [678, 1506], [950, 509], [-380, 1129], [529, 810], [356, 858], [348, 855], [295, 1112], [565, 650], [193, 527], [647, 190], [1036, 1202], [1131, 423], [1130, 405], [1130, 408], [1129, 409], [-244, 637], [865, 1567], [625, 1019]]}\n", + "Received data: {\"poses\": [[674, 725], [678, 724], [523, 1155], [872, 446], [537, 704], [540, 700], [1159, 641], [352, 754], [353, 756], [577, 539], [574, 541], [182, 426], [951, 1256], [956, 1261], [1200, 497], [1193, 495], [1182, 502], [1194, 497], [898, 710], [508, 1064]]}\n", + "Received data: {\"poses\": [[576, 768], [583, 772], [579, 770], [490, 1243], [549, 597], [544, 594], [544, 593], [549, 589], [380, 653], [360, 643], [587, 437], [581, 439], [581, 433], [587, 437], [858, 1313], [867, 1327], [1273, 575], [1271, 572], [906, 820], [417, 1123]]}\n", + "Received data: {\"poses\": [[490, 816], [492, 814], [599, 1830], [709, 313], [551, 495], [556, 491], [550, 492], [559, 491], [559, 486], [390, 548], [359, 548], [591, 339], [588, 330], [589, 333], [593, 339], [771, 1371], [1360, 616], [1346, 645], [-115, 880], [326, 1180]]}\n", + "Received data: {\"poses\": [[396, 860], [390, 865], [400, 861], [628, 232], [565, 387], [560, 388], [562, 385], [562, 390], [564, 393], [374, 439], [395, 444], [362, 430], [604, 222], [592, 220], [590, 238], [686, 1425], [1442, 685], [1417, 716], [-197, 810], [237, 1242]]}\n", + "Received data: {\"poses\": [[304, 904], [302, 909], [536, 211], [572, 290], [567, 290], [572, 287], [555, 283], [578, 276], [403, 342], [400, 345], [610, 125], [593, 125], [602, 128], [591, 135], [603, 1481], [1508, 782], [1490, 790], [930, 1115], [152, 1294], [149, 1288]]}\n", + "Received data: {\"poses\": [[296, 903], [298, 916], [533, 203], [567, 289], [556, 284], [583, 274], [575, 278], [579, 280], [577, 273], [407, 335], [404, 338], [363, 320], [616, 110], [595, 114], [621, 114], [121, 6], [1513, 793], [1498, 787], [931, 1139], [144, 1285]]}\n", + "Received data: {\"poses\": [[215, 852], [222, 850], [560, 68], [667, 241], [668, 242], [668, 233], [654, 230], [666, 241], [785, 939], [493, 292], [500, 296], [492, 288], [695, 72], [690, 76], [708, 74], [522, 1467], [1489, 860], [851, 1193], [58, 1250], [61, 1261]]}\n", + "Received data: {\"poses\": [[130, 792], [127, 810], [140, 789], [1320, -132], [765, 199], [764, 201], [768, 190], [757, 190], [763, 197], [731, 171], [670, 917], [598, 253], [589, 256], [539, 217], [781, 30], [788, 34], [430, 1424], [1444, 987], [765, 1248], [-35, 1216]]}\n", + "Received data: {\"poses\": [[43, 732], [59, 732], [578, -118], [857, 160], [821, 134], [852, 160], [854, 156], [854, 155], [856, 163], [578, 894], [680, 197], [692, 210], [674, 193], [896, -30], [846, -44], [899, -12], [1476, 1057], [1418, 1086], [678, 1305], [-128, 1150]]}\n", + "Received data: {\"poses\": [[-39, 670], [-37, 665], [614, -245], [932, 74], [954, 113], [957, 105], [957, 110], [946, 105], [953, 108], [908, 68], [465, 874], [773, 151], [782, 173], [721, 109], [936, -101], [1003, -58], [241, 1339], [1433, 1157], [1410, 1204], [586, 1382]]}\n", + "Received data: {\"poses\": [[-48, 662], [-45, 657], [613, -250], [970, 117], [972, 115], [969, 110], [967, 114], [967, 105], [463, 864], [450, 867], [786, 154], [785, 148], [782, 151], [781, 144], [989, -65], [989, -69], [1423, 1167], [1405, 1208], [581, 1369], [-226, 1095]]}\n", + "Received data: {\"poses\": [[-31, 562], [-34, 561], [713, -287], [1046, 177], [1051, 158], [1045, 165], [1047, 167], [435, 780], [434, 771], [437, 769], [430, 775], [868, 211], [866, 204], [867, 209], [861, 194], [1067, -11], [1084, 7], [1328, 1190], [489, 1319], [-229, 994]]}\n", + "Received data: {\"poses\": [[-29, 459], [-22, 453], [817, -325], [1121, 239], [1122, 236], [1131, 245], [401, 681], [400, 673], [403, 672], [407, 667], [393, 683], [394, 677], [958, 264], [956, 268], [952, 253], [1154, 49], [1160, 47], [1228, 1210], [392, 1268], [-225, 888]]}\n", + "Received data: {\"poses\": [[-17, 353], [-13, 354], [-8, 351], [1207, 304], [1213, 278], [1204, 304], [367, 588], [364, 587], [364, 588], [365, 581], [354, 584], [360, 593], [366, 582], [1039, 316], [1038, 333], [990, 256], [1212, 35], [1125, 1247], [1099, 1279], [305, 1246]]}\n", + "Received data: {\"poses\": [[7, 253], [4, 242], [1319, 338], [1292, 369], [328, 484], [328, 487], [328, 491], [322, 479], [327, 481], [313, 482], [316, 481], [322, 487], [329, 494], [335, 474], [1131, 382], [1087, 304], [1316, 99], [1020, 1273], [979, 1280], [208, 1193]]}\n", + "Received data: {\"poses\": [[1, 156], [1360, 427], [1390, 392], [292, 391], [297, 397], [288, 391], [308, 382], [284, 383], [302, 381], [300, 377], [283, 392], [279, 388], [284, 394], [292, 399], [292, 384], [1211, 419], [1180, 346], [1404, 147], [927, 1293], [922, 1371]]}\n", + "Received data: {\"poses\": [[19, 140], [288, 386], [290, 390], [296, 386], [285, 381], [310, 375], [290, 387], [302, 372], [302, 370], [286, 386], [282, 380], [276, 383], [283, 385], [292, 378], [1222, 431], [1215, 426], [1421, 226], [921, 1291], [912, 1370], [107, 1148]]}\n", + "Received data: {\"poses\": [[91, 107], [1349, 522], [347, 310], [352, 309], [356, 310], [348, 312], [367, 308], [343, 308], [357, 303], [341, 305], [343, 312], [346, 311], [337, 304], [391, 290], [353, 306], [1203, 549], [1189, 450], [285, 733], [816, 1234], [106, 1044]]}\n", + "Received data: {\"poses\": [[202, 66], [1384, 602], [418, 222], [410, 229], [419, 233], [421, 225], [435, 230], [410, 218], [409, 219], [458, 230], [419, 232], [414, 232], [401, 224], [464, 215], [411, 222], [421, 225], [1207, 629], [1417, 430], [779, 1159], [99, 938]]}\n", + "Received data: {\"poses\": [[1306, 728], [1382, 706], [475, 143], [472, 149], [479, 154], [469, 144], [501, 150], [475, 146], [464, 145], [522, 159], [485, 156], [470, 149], [465, 145], [473, 150], [471, 142], [1205, 732], [1174, 796], [1200, 657], [699, 1088], [82, 827]]}\n", + "Received data: {\"poses\": [[288, 9], [1386, 702], [480, 140], [482, 143], [477, 145], [487, 145], [496, 141], [494, 143], [477, 148], [449, 135], [467, 143], [467, 142], [455, 139], [462, 137], [476, 140], [483, 146], [1200, 732], [1202, 662], [1420, 458], [88, 838]]}\n", + "Received data: {\"poses\": [[298, 26], [289, 12], [492, 156], [480, 149], [483, 147], [480, 152], [490, 153], [478, 137], [497, 145], [467, 139], [452, 139], [461, 145], [478, 148], [473, 140], [471, 146], [540, 140], [496, 149], [1198, 728], [1193, 663], [699, 1081]]}\n", + "Received data: {\"poses\": [[1305, 651], [513, 238], [521, 247], [521, 247], [514, 229], [514, 229], [516, 251], [516, 251], [516, 251], [504, 237], [511, 245], [526, 236], [512, 233], [512, 233], [512, 233], [1090, 739], [1090, 739], [175, 895], [175, 895], [176, 885]]}\n", + "Received data: {\"poses\": [[549, 331], [556, 337], [547, 326], [537, 319], [519, 328], [540, 335], [529, 329], [545, 342], [601, 325], [548, 323], [1049, 627], [1049, 627], [1010, 680], [1005, 677], [1009, 678], [1013, 681], [893, 1032], [877, 1119], [264, 947], [265, 932]]}\n", + "Received data: {\"poses\": [[592, 436], [588, 414], [586, 416], [554, 431], [565, 437], [562, 425], [580, 438], [637, 425], [959, 573], [954, 570], [966, 575], [925, 622], [921, 615], [923, 622], [927, 621], [929, 623], [991, 1003], [975, 1090], [979, 1090], [361, 978]]}\n", + "Received data: {\"poses\": [[632, 519], [624, 513], [635, 520], [587, 518], [598, 521], [615, 529], [669, 507], [624, 525], [872, 522], [871, 522], [884, 529], [846, 564], [844, 563], [844, 562], [838, 564], [847, 565], [848, 567], [1088, 972], [1069, 1063], [444, 1017]]}\n", + "Received data: {\"poses\": [[966, 441], [645, 613], [676, 595], [668, 591], [635, 629], [643, 622], [703, 612], [708, 614], [781, 472], [782, 472], [790, 478], [756, 499], [755, 508], [753, 504], [750, 505], [763, 504], [770, 503], [1192, 929], [1166, 1026], [541, 1062]]}\n", + "Received data: {\"poses\": [[713, 723], [726, 689], [708, 714], [656, 714], [699, 711], [682, 722], [699, 722], [739, 705], [696, 723], [689, 417], [706, 424], [670, 447], [672, 448], [673, 433], [654, 443], [685, 439], [1281, 903], [1268, 997], [635, 1109], [639, 1099]]}\n", + "Received data: {\"poses\": [[711, 804], [773, 772], [774, 773], [695, 813], [703, 816], [720, 817], [724, 815], [783, 799], [763, 788], [615, 375], [621, 374], [591, 399], [587, 397], [593, 369], [593, 397], [589, 397], [596, 401], [1377, 870], [710, 1192], [735, 1137]]}\n", + "Received data: {\"poses\": [[816, 902], [830, 866], [822, 872], [754, 913], [776, 916], [815, 902], [501, 334], [516, 324], [522, 323], [495, 335], [495, 345], [493, 340], [492, 337], [497, 337], [490, 335], [493, 335], [516, 317], [497, 347], [1457, 916], [831, 1191]]}\n", + "Received data: {\"poses\": [[599, 245], [886, 953], [744, 1029], [796, 1003], [877, 1000], [420, 277], [409, 285], [422, 274], [429, 281], [431, 271], [418, 287], [409, 287], [417, 265], [411, 289], [402, 286], [405, 282], [431, 263], [408, 293], [1554, 892], [922, 1227]]}\n", + "Received data: {\"poses\": [[825, 1091], [881, 1100], [326, 234], [347, 237], [322, 230], [334, 231], [335, 241], [342, 238], [328, 235], [313, 247], [322, 230], [314, 235], [312, 233], [310, 230], [315, 228], [341, 206], [331, 239], [1669, 751], [1022, 1247], [1011, 1259]]}\n", + "Received data: {\"poses\": [[937, 1049], [836, 1107], [327, 231], [325, 230], [315, 239], [327, 229], [317, 228], [336, 229], [331, 231], [324, 227], [302, 226], [316, 221], [318, 228], [304, 227], [306, 223], [310, 236], [340, 199], [323, 231], [1652, 840], [1024, 1274]]}\n", + "Received data: {\"poses\": [[706, 1208], [777, 1186], [864, 1143], [317, 132], [307, 139], [327, 126], [325, 129], [327, 132], [324, 133], [313, 127], [329, 131], [327, 131], [311, 122], [312, 123], [317, 133], [325, 129], [322, 140], [320, 128], [1725, 903], [1028, 1365]]}\n", + "Received data: {\"poses\": [[760, 1271], [707, 1270], [730, 1276], [309, 21], [332, 23], [306, 20], [314, 17], [303, 20], [323, 31], [321, 26], [335, 21], [301, 25], [320, 26], [315, 14], [318, 15], [327, 28], [322, 27], [319, 27], [319, 31], [1049, 1483]]}\n", + "Received data: {\"poses\": [[750, 1276], [733, 1265], [722, 1281], [313, 12], [315, 13], [302, 24], [327, 2], [309, 14], [323, 25], [326, 16], [342, 9], [330, 16], [313, 11], [327, 17], [310, 14], [333, 20], [339, 15], [373, -16], [330, 13], [1044, 1479]]}\n", + "Received data: {\"poses\": [[812, 1237], [697, 1273], [720, 1280], [798, 1239], [315, 16], [317, 13], [338, 11], [319, 8], [332, 21], [325, 25], [320, 11], [335, 12], [315, 11], [329, 17], [320, 16], [332, 11], [331, 20], [326, 18], [332, 13], [1048, 1482]]}\n", + "Received data: {\"poses\": [[762, 1159], [664, 1186], [730, 1179], [398, 56], [400, 52], [398, 54], [419, 60], [403, 51], [395, 59], [418, 63], [405, 64], [421, 63], [414, 60], [403, 58], [410, 66], [400, 60], [396, 62], [409, 72], [401, 67], [414, 61]]}\n", + "Received data: {\"poses\": [[716, 1062], [635, 1103], [705, 1060], [491, 102], [495, 99], [490, 113], [497, 94], [491, 109], [508, 107], [507, 107], [500, 111], [514, 115], [501, 113], [485, 110], [498, 112], [484, 116], [496, 124], [494, 123], [499, 123], [511, 117]]}\n", + "Received data: {\"poses\": [[653, 990], [605, 995], [591, 995], [589, 1018], [593, 1011], [655, 976], [661, 977], [586, 149], [580, 141], [579, 155], [584, 136], [596, 148], [592, 144], [587, 167], [568, 159], [581, 163], [611, 147], [573, 180], [581, 177], [590, 169]]}\n", + "Received data: {\"poses\": [[594, 907], [618, 882], [556, 903], [555, 906], [544, 899], [568, 910], [543, 914], [543, 917], [602, 888], [598, 881], [584, 898], [675, 194], [670, 187], [681, 188], [697, 191], [662, 234], [658, 237], [667, 220], [663, 235], [674, 220]]}\n", + "Received data: {\"poses\": [[534, 822], [554, 804], [513, 816], [511, 823], [474, 825], [525, 820], [491, 842], [500, 833], [495, 832], [548, 806], [556, 799], [524, 813], [768, 233], [775, 217], [770, 235], [778, 216], [739, 260], [755, 267], [746, 288], [763, 276]]}\n", + "Received data: {\"poses\": [[506, 712], [464, 725], [454, 728], [425, 736], [432, 734], [478, 732], [452, 739], [452, 738], [441, 743], [494, 715], [503, 712], [464, 728], [852, 268], [857, 268], [868, 271], [856, 325], [851, 307], [838, 323], [849, 329], [459, 1293]]}\n", + "Received data: {\"poses\": [[415, 665], [410, 651], [415, 630], [378, 646], [385, 650], [438, 645], [405, 652], [397, 655], [481, 632], [439, 633], [446, 631], [942, 306], [946, 312], [949, 305], [956, 306], [935, 370], [922, 370], [937, 366], [924, 385], [936, 377]]}\n", + "Received data: {\"poses\": [[414, 657], [441, 629], [410, 640], [375, 635], [383, 648], [437, 637], [389, 662], [406, 643], [407, 646], [403, 647], [437, 630], [434, 624], [452, 604], [959, 313], [954, 297], [974, 294], [925, 357], [931, 356], [941, 369], [937, 373]]}\n", + "Received data: {\"poses\": [[432, 569], [495, 529], [483, 534], [462, 545], [427, 549], [435, 551], [490, 553], [435, 570], [456, 556], [456, 556], [453, 561], [547, 525], [477, 531], [498, 515], [976, 412], [974, 400], [955, 479], [935, 483], [927, 489], [933, 490]]}\n", + "Received data: {\"poses\": [[471, 469], [468, 476], [536, 440], [505, 453], [518, 450], [478, 464], [488, 465], [491, 463], [478, 487], [505, 473], [501, 467], [506, 474], [469, 466], [523, 437], [524, 443], [993, 511], [987, 522], [969, 576], [919, 600], [959, 571]]}\n", + "Received data: {\"poses\": [[490, 367], [583, 338], [585, 344], [570, 352], [534, 370], [535, 370], [543, 369], [593, 372], [509, 388], [560, 381], [557, 375], [561, 384], [558, 381], [636, 357], [568, 346], [537, 357], [992, 618], [1045, 587], [976, 665], [946, 700]]}\n", + "Received data: {\"poses\": [[532, 275], [529, 280], [613, 247], [615, 254], [620, 261], [581, 286], [594, 284], [590, 283], [652, 285], [550, 296], [608, 291], [591, 280], [609, 301], [552, 275], [590, 241], [635, 236], [1004, 715], [1020, 735], [935, 799], [973, 791]]}\n", + "Received data: {\"poses\": [[559, 177], [552, 177], [657, 157], [662, 158], [668, 192], [632, 203], [645, 195], [639, 195], [641, 201], [690, 192], [590, 191], [661, 200], [635, 187], [662, 213], [587, 184], [639, 149], [610, 173], [1038, 808], [1038, 830], [990, 883]]}\n", + "Received data: {\"poses\": [[576, 169], [572, 169], [669, 145], [670, 151], [681, 184], [642, 196], [655, 194], [649, 189], [652, 195], [712, 189], [601, 197], [665, 187], [665, 198], [672, 207], [595, 174], [664, 152], [627, 165], [1034, 820], [1034, 842], [997, 873]]}\n", + "Received data: {\"poses\": [[652, 143], [755, 128], [760, 133], [773, 164], [743, 183], [731, 175], [742, 173], [809, 187], [756, 179], [763, 189], [750, 188], [682, 157], [760, 142], [720, 147], [955, 894], [960, 899], [965, 910], [932, 947], [932, 939], [869, 963]]}\n", + "Received data: {\"poses\": [[763, 122], [857, 108], [874, 153], [841, 182], [837, 169], [848, 166], [903, 186], [837, 159], [872, 197], [787, 136], [862, 132], [870, 952], [877, 965], [890, 946], [887, 969], [890, 980], [773, 1027], [844, 1002], [847, 1003], [779, 1024]]}\n", + "Received data: {\"poses\": [[960, 108], [961, 92], [940, 170], [945, 165], [940, 161], [959, 185], [959, 169], [954, 166], [968, 172], [954, 166], [879, 115], [954, 111], [793, 1019], [799, 1017], [819, 1012], [813, 1038], [898, 1015], [681, 1086], [780, 1070], [700, 1082]]}\n", + "Received data: {\"poses\": [[962, 72], [981, 58], [1064, 70], [1048, 160], [1046, 152], [1033, 147], [1055, 146], [1119, 178], [1062, 157], [1057, 157], [1069, 149], [1055, 159], [978, 86], [1065, 103], [713, 1091], [730, 1086], [741, 1111], [833, 1108], [614, 1146], [706, 1140]]}\n", + "Received data: {\"poses\": [[965, 61], [1061, 69], [1052, 102], [1048, 183], [1060, 183], [1044, 150], [1056, 145], [1099, 139], [998, 133], [1080, 157], [1044, 128], [1076, 161], [1053, 160], [982, 87], [1071, 104], [717, 1083], [735, 1110], [830, 1109], [597, 1150], [704, 1148]]}\n", + "Received data: {\"poses\": [[951, 50], [965, 64], [1069, 95], [1048, 108], [1085, 134], [1066, 181], [1058, 151], [1099, 141], [999, 136], [998, 135], [1064, 148], [1046, 131], [1067, 151], [1070, 165], [992, 86], [986, 94], [983, 90], [1072, 107], [727, 1110], [702, 1147]]}\n", + "Received data: {\"poses\": [[947, 164], [941, 141], [947, 148], [1041, 183], [1014, 192], [1057, 215], [1022, 267], [1021, 237], [1030, 234], [971, 220], [971, 221], [1037, 236], [1039, 235], [1041, 250], [1049, 247], [973, 172], [968, 179], [964, 178], [1044, 191], [1027, 148]]}\n", + "Received data: {\"poses\": [[931, 243], [924, 249], [925, 247], [924, 255], [1026, 263], [1024, 315], [977, 364], [989, 336], [998, 335], [1005, 326], [1004, 338], [1008, 352], [1009, 350], [949, 280], [952, 274], [944, 285], [943, 282], [1006, 251], [1005, 252], [1002, 257]]}\n", + "Received data: {\"poses\": [[904, 342], [906, 340], [904, 341], [906, 338], [906, 345], [953, 375], [952, 379], [960, 425], [967, 427], [974, 428], [975, 425], [979, 439], [980, 436], [930, 370], [929, 373], [924, 381], [922, 372], [985, 344], [984, 343], [983, 352]]}\n", + "Received data: {\"poses\": [[884, 439], [886, 437], [886, 438], [885, 437], [885, 444], [886, 438], [924, 468], [929, 523], [937, 519], [944, 519], [947, 532], [948, 534], [948, 530], [909, 469], [909, 470], [904, 480], [904, 473], [902, 467], [963, 440], [962, 453]]}\n", + "Received data: {\"poses\": [[863, 531], [866, 531], [866, 533], [866, 527], [863, 544], [867, 530], [892, 562], [908, 611], [906, 612], [914, 614], [917, 622], [917, 625], [916, 620], [888, 560], [889, 561], [883, 571], [885, 557], [880, 563], [943, 533], [943, 543]]}\n", + "Received data: {\"poses\": [[838, 625], [848, 626], [848, 624], [846, 627], [841, 633], [864, 653], [871, 707], [875, 699], [875, 710], [883, 713], [886, 709], [883, 712], [887, 709], [867, 659], [869, 658], [864, 665], [867, 653], [857, 661], [919, 627], [920, 641]]}\n", + "Received data: {\"poses\": [[896, 731], [831, 726], [834, 727], [833, 728], [823, 726], [959, 751], [838, 762], [844, 803], [854, 808], [857, 802], [857, 811], [861, 820], [853, 813], [848, 756], [849, 760], [842, 769], [845, 762], [836, 767], [847, 750], [898, 728]]}\n", + "Received data: {\"poses\": [[891, 834], [819, 836], [822, 825], [821, 828], [805, 827], [841, 850], [815, 861], [818, 900], [829, 910], [836, 915], [823, 910], [823, 912], [826, 906], [833, 860], [829, 854], [825, 867], [841, 856], [819, 869], [834, 854], [877, 828]]}\n", + "Received data: {\"poses\": [[812, 932], [812, 930], [809, 932], [792, 931], [796, 930], [794, 930], [786, 947], [801, 1006], [783, 991], [794, 992], [797, 1002], [813, 1006], [791, 1003], [819, 955], [813, 962], [822, 961], [832, 950], [797, 958], [806, 952], [865, 928]]}\n", + "Received data: {\"poses\": [[792, 1032], [794, 1021], [784, 1029], [781, 1038], [774, 1029], [766, 1051], [783, 1113], [753, 1093], [770, 1094], [773, 1105], [789, 1110], [780, 1115], [779, 1110], [825, 1065], [832, 1070], [814, 1060], [804, 1066], [789, 1069], [869, 1039], [871, 1046]]}\n", + "Received data: {\"poses\": [[782, 1146], [806, 1144], [787, 1129], [770, 1144], [801, 1159], [781, 1146], [753, 1175], [749, 1202], [747, 1204], [745, 1206], [749, 1227], [750, 1219], [752, 1213], [792, 1176], [801, 1171], [777, 1182], [816, 1171], [776, 1179], [792, 1175], [866, 1153]]}\n", + "Received data: {\"poses\": [[920, 1241], [774, 1250], [808, 1245], [752, 1247], [799, 1240], [751, 1244], [743, 1237], [784, 1260], [754, 1260], [730, 1304], [727, 1306], [723, 1308], [724, 1324], [727, 1318], [722, 1317], [822, 1272], [824, 1280], [823, 1272], [757, 1279], [825, 1235]]}\n", + "Received data: {\"poses\": [[919, 1251], [748, 1252], [802, 1253], [780, 1241], [749, 1251], [740, 1241], [735, 1262], [726, 1306], [724, 1312], [713, 1322], [720, 1310], [739, 1326], [726, 1329], [723, 1328], [718, 1321], [780, 1280], [767, 1289], [821, 1277], [794, 1280], [822, 1240]]}\n", + "Received data: {\"poses\": [[916, 1246], [797, 1264], [800, 1253], [775, 1237], [782, 1257], [738, 1241], [750, 1253], [735, 1321], [727, 1306], [721, 1312], [737, 1319], [725, 1314], [723, 1330], [722, 1322], [729, 1323], [762, 1333], [777, 1284], [781, 1277], [767, 1287], [819, 1239]]}\n", + "Received data: {\"poses\": [[825, 1206], [690, 1185], [666, 1186], [690, 1173], [701, 1192], [668, 1191], [669, 1189], [652, 1198], [648, 1232], [648, 1236], [638, 1254], [643, 1235], [647, 1257], [645, 1250], [641, 1252], [692, 1216], [729, 1225], [732, 1220], [710, 1217], [739, 1176]]}\n", + "Received data: {\"poses\": [[732, 1162], [622, 1154], [621, 1138], [606, 1110], [619, 1129], [620, 1154], [569, 1116], [572, 1130], [576, 1158], [575, 1164], [590, 1173], [578, 1173], [578, 1185], [577, 1179], [600, 1200], [604, 1159], [648, 1156], [642, 1169], [632, 1161], [655, 1112]]}\n", + "Received data: {\"poses\": [[633, 1115], [525, 1096], [528, 1081], [526, 1054], [531, 1065], [529, 1100], [489, 1048], [490, 1067], [469, 1082], [515, 1138], [479, 1097], [498, 1098], [496, 1106], [505, 1084], [529, 1081], [551, 1125], [503, 1072], [549, 1115], [531, 1091], [563, 1044]]}\n", + "Received data: {\"poses\": [[534, 1072], [437, 1050], [440, 1043], [433, 987], [443, 1026], [417, 995], [406, 996], [423, 1000], [412, 1004], [420, 1011], [422, 1012], [440, 1033], [420, 1042], [415, 1049], [446, 1018], [458, 1064], [423, 1013], [463, 1051], [456, 1031], [486, 986]]}\n", + "Received data: {\"poses\": [[450, 1020], [434, 1029], [347, 997], [345, 995], [350, 931], [348, 992], [324, 944], [337, 940], [324, 944], [322, 965], [340, 945], [357, 956], [341, 970], [348, 938], [361, 954], [367, 1013], [334, 951], [334, 950], [374, 998], [392, 935]]}\n", + "Received data: {\"poses\": [[360, 982], [349, 981], [346, 998], [261, 950], [273, 947], [250, 883], [249, 875], [238, 889], [226, 912], [238, 886], [270, 938], [268, 881], [268, 885], [258, 901], [282, 895], [261, 930], [286, 949], [250, 889], [287, 948], [248, 915]]}\n", + "Received data: {\"poses\": [[354, 974], [343, 973], [336, 982], [263, 924], [268, 939], [246, 874], [242, 855], [233, 880], [239, 878], [271, 875], [268, 942], [280, 878], [262, 894], [271, 864], [275, 897], [275, 957], [273, 957], [252, 886], [282, 941], [273, 893]]}\n", + "Received data: {\"poses\": [[341, 882], [325, 887], [339, 878], [259, 830], [247, 855], [243, 832], [251, 765], [237, 787], [250, 790], [288, 782], [275, 850], [261, 787], [231, 834], [267, 798], [251, 838], [259, 829], [279, 871], [258, 794], [282, 851], [244, 809]]}\n", + "Received data: {\"poses\": [[324, 774], [305, 777], [327, 773], [255, 723], [262, 744], [261, 667], [233, 730], [249, 747], [245, 686], [308, 676], [283, 744], [279, 685], [300, 701], [257, 754], [264, 722], [269, 759], [269, 684], [274, 752], [279, 741], [290, 695]]}\n", + "Received data: {\"poses\": [[288, 683], [298, 683], [269, 621], [232, 642], [274, 582], [229, 621], [269, 567], [229, 561], [261, 593], [261, 603], [361, 585], [317, 586], [249, 628], [300, 590], [266, 628], [263, 591], [271, 587], [269, 644], [263, 611], [326, 568]]}\n", + "Received data: {\"poses\": [[291, 672], [307, 671], [257, 622], [259, 628], [235, 644], [232, 614], [250, 641], [258, 583], [268, 588], [330, 575], [334, 589], [319, 580], [292, 600], [274, 616], [255, 650], [279, 581], [273, 638], [265, 589], [301, 589], [330, 560]]}\n", + "Received data: {\"poses\": [[384, 613], [372, 618], [369, 624], [318, 586], [314, 594], [356, 516], [312, 573], [325, 592], [344, 542], [354, 549], [414, 542], [391, 549], [405, 547], [379, 568], [352, 569], [355, 542], [363, 537], [348, 548], [349, 563], [413, 520]]}\n", + "Received data: {\"poses\": [[445, 547], [449, 557], [426, 516], [423, 522], [401, 540], [447, 474], [464, 492], [426, 486], [445, 485], [513, 505], [469, 548], [520, 523], [508, 516], [481, 497], [444, 533], [458, 494], [451, 493], [441, 507], [508, 482], [508, 472]]}\n", + "Received data: {\"poses\": [[531, 494], [524, 499], [507, 466], [488, 485], [532, 427], [549, 447], [520, 510], [522, 453], [563, 469], [605, 474], [651, 509], [656, 508], [602, 477], [569, 455], [516, 493], [539, 452], [546, 456], [527, 483], [526, 463], [589, 432]]}\n", + "Received data: {\"poses\": [[591, 425], [610, 435], [591, 411], [573, 421], [597, 396], [623, 389], [644, 405], [585, 433], [615, 402], [699, 439], [702, 437], [754, 486], [697, 442], [663, 408], [596, 442], [631, 404], [637, 406], [614, 426], [613, 429], [616, 416]]}\n", + "Received data: {\"poses\": [[668, 354], [688, 368], [682, 355], [680, 356], [689, 347], [717, 341], [728, 350], [671, 377], [718, 340], [794, 395], [734, 406], [851, 456], [800, 412], [788, 424], [708, 384], [722, 358], [731, 357], [700, 369], [703, 372], [713, 372]]}\n", + "Received data: {\"poses\": [[756, 284], [765, 301], [762, 304], [760, 300], [728, 309], [788, 275], [725, 288], [784, 366], [782, 312], [838, 354], [880, 357], [944, 427], [941, 427], [878, 360], [830, 323], [764, 317], [816, 314], [781, 317], [783, 320], [863, 275]]}\n", + "Received data: {\"poses\": [[814, 218], [825, 209], [839, 225], [844, 224], [833, 232], [816, 240], [896, 251], [900, 246], [840, 261], [879, 254], [977, 319], [908, 302], [1037, 391], [985, 327], [926, 325], [877, 283], [898, 253], [896, 257], [869, 261], [897, 282]]}\n", + "Received data: {\"poses\": [[885, 141], [896, 137], [913, 154], [927, 181], [925, 183], [895, 184], [964, 198], [992, 195], [924, 201], [961, 200], [1070, 273], [996, 246], [1134, 355], [1070, 288], [962, 226], [974, 191], [1003, 215], [968, 197], [941, 192], [987, 231]]}\n", + "Received data: {\"poses\": [[954, 69], [963, 60], [977, 87], [1008, 118], [982, 136], [972, 109], [1060, 123], [1075, 143], [1055, 203], [1045, 150], [1064, 161], [1078, 188], [1230, 316], [1167, 233], [1101, 175], [994, 129], [1077, 158], [1069, 144], [1020, 124], [1073, 176]]}\n", + "Received data: {\"poses\": [[1018, -8], [1028, -18], [1087, 49], [1078, 52], [1045, 36], [1145, 61], [1157, 78], [1121, 84], [1151, 58], [1256, 173], [1159, 121], [1330, 304], [1322, 274], [1246, 180], [1192, 101], [1068, 57], [1151, 71], [1106, 68], [1152, 113], [1132, 98]]}\n", + "Received data: {\"poses\": [[1022, -12], [1031, -20], [1066, 24], [1065, 29], [1052, 36], [1154, 75], [1159, 75], [1065, 61], [1151, 101], [1261, 171], [1254, 162], [1324, 297], [1334, 303], [1333, 287], [1260, 184], [1250, 184], [1072, 56], [1153, 79], [1109, 66], [1161, 118]]}\n", + "Received data: {\"poses\": [[1030, -8], [1035, -13], [1066, 25], [1066, 30], [1049, 39], [1116, 89], [1160, 76], [1142, 142], [1116, 86], [1151, 100], [1261, 174], [1333, 281], [1335, 304], [1336, 287], [1260, 179], [1129, 108], [1078, 53], [1137, 78], [1110, 67], [1160, 109]]}\n", + "Received data: {\"poses\": [[1082, 103], [1080, 97], [1085, 160], [1105, 149], [1069, 146], [1167, 175], [1176, 170], [1088, 154], [1129, 183], [1165, 199], [1262, 274], [1178, 217], [1323, 399], [1324, 384], [1262, 275], [1141, 204], [1097, 149], [1166, 183], [1134, 164], [1173, 204]]}\n", + "Received data: {\"poses\": [[1099, 179], [1100, 180], [1116, 223], [1129, 240], [1095, 250], [1090, 236], [1183, 261], [1167, 348], [1145, 287], [1172, 305], [1267, 379], [1310, 491], [1317, 510], [1310, 487], [1317, 492], [1129, 250], [1121, 255], [1158, 281], [1162, 266], [1193, 322]]}\n", + "Received data: {\"poses\": [[1135, 270], [1160, 314], [1145, 322], [1120, 347], [1114, 333], [1200, 378], [1178, 436], [1141, 356], [1185, 405], [1273, 484], [1267, 471], [1316, 608], [1307, 574], [1302, 587], [1314, 592], [1143, 361], [1216, 395], [1191, 363], [1209, 410], [1170, 405]]}\n", + "Received data: {\"poses\": [[1185, 401], [1175, 371], [1175, 452], [1148, 447], [1148, 439], [1142, 446], [1223, 482], [1223, 477], [1160, 459], [1183, 488], [1283, 574], [1286, 576], [1278, 701], [1305, 674], [1299, 695], [1190, 508], [1216, 505], [1188, 478], [1214, 442], [1186, 506]]}\n", + "Received data: {\"poses\": [[1223, 457], [1214, 461], [1204, 551], [1176, 538], [1169, 541], [1245, 579], [1228, 581], [1224, 644], [1181, 552], [1218, 596], [1289, 678], [1283, 788], [1315, 811], [1295, 789], [1289, 787], [1210, 617], [1271, 594], [1208, 576], [1244, 534], [1198, 605]]}\n", + "Received data: {\"poses\": [[1274, 555], [1259, 556], [1250, 641], [1216, 644], [1198, 647], [1270, 683], [1266, 680], [1253, 752], [1213, 654], [1238, 700], [1323, 783], [1310, 790], [1322, 914], [1318, 925], [1314, 890], [1234, 706], [1302, 700], [1235, 685], [1297, 650], [1285, 716]]}\n", + "Received data: {\"poses\": [[1264, 561], [1282, 602], [1228, 667], [1198, 650], [1220, 629], [1246, 687], [1235, 739], [1221, 660], [1236, 693], [1234, 717], [1322, 787], [1311, 796], [1319, 919], [1322, 924], [1312, 895], [1272, 645], [1279, 708], [1283, 658], [1271, 721], [1219, 716]]}\n", + "Received data: {\"poses\": [[1265, 598], [1261, 561], [1254, 560], [1281, 603], [1226, 668], [1246, 645], [1196, 651], [1196, 652], [1198, 638], [1266, 688], [1233, 739], [1220, 661], [1231, 711], [1290, 903], [1285, 922], [1308, 924], [1284, 903], [1234, 699], [1282, 658], [1282, 658]]}\n", + "Received data: {\"poses\": [[1164, 589], [1162, 550], [1153, 552], [1177, 595], [1125, 649], [1145, 623], [1100, 632], [1097, 633], [1106, 619], [1136, 707], [1111, 640], [1176, 682], [1226, 879], [1196, 871], [1218, 870], [1197, 851], [1180, 677], [1131, 654], [1184, 637], [1177, 708]]}\n", + "Received data: {\"poses\": [[1052, 577], [1049, 540], [1051, 542], [1024, 628], [1041, 602], [994, 608], [993, 610], [996, 597], [1044, 611], [1051, 690], [1076, 650], [1075, 649], [1130, 836], [1129, 833], [1129, 817], [1039, 659], [1035, 635], [1032, 620], [1079, 615], [1075, 686]]}\n", + "Received data: {\"poses\": [[947, 573], [943, 534], [970, 580], [921, 605], [938, 585], [891, 590], [891, 592], [901, 581], [943, 638], [951, 659], [975, 620], [1036, 796], [1042, 792], [1037, 764], [1018, 744], [977, 615], [935, 607], [937, 590], [978, 595], [970, 666]]}\n", + "Received data: {\"poses\": [[851, 520], [841, 520], [812, 593], [843, 570], [788, 576], [786, 576], [798, 560], [865, 564], [832, 621], [796, 576], [901, 662], [943, 749], [942, 713], [932, 697], [841, 600], [878, 587], [839, 583], [831, 555], [872, 651], [863, 646]]}\n", + "Received data: {\"poses\": [[753, 555], [753, 512], [738, 511], [727, 567], [683, 554], [688, 566], [698, 544], [744, 590], [744, 581], [732, 556], [785, 565], [836, 721], [828, 661], [857, 664], [843, 645], [747, 575], [780, 572], [744, 551], [774, 563], [765, 631]]}\n", + "Received data: {\"poses\": [[642, 507], [640, 505], [636, 532], [585, 543], [582, 544], [597, 526], [675, 513], [644, 554], [622, 543], [706, 612], [748, 681], [743, 616], [767, 620], [754, 590], [748, 596], [688, 535], [642, 524], [668, 550], [671, 612], [667, 617]]}\n", + "Received data: {\"poses\": [[553, 540], [526, 536], [566, 569], [531, 540], [485, 535], [487, 516], [565, 484], [554, 525], [537, 523], [519, 538], [652, 669], [655, 644], [676, 572], [661, 555], [552, 534], [573, 516], [544, 502], [568, 524], [562, 604], [562, 606]]}\n", + "Received data: {\"poses\": [[449, 540], [449, 522], [428, 506], [411, 544], [427, 538], [392, 521], [454, 465], [447, 499], [443, 505], [415, 528], [503, 563], [530, 635], [547, 538], [557, 490], [554, 516], [493, 477], [445, 471], [442, 456], [462, 592], [451, 593]]}\n", + "Received data: {\"poses\": [[338, 558], [322, 559], [327, 509], [325, 541], [284, 496], [291, 527], [366, 443], [347, 479], [340, 482], [316, 540], [378, 498], [452, 624], [456, 600], [489, 510], [463, 482], [338, 477], [356, 447], [342, 448], [337, 430], [355, 610]]}\n", + "Received data: {\"poses\": [[247, 533], [219, 514], [227, 505], [163, 515], [188, 528], [260, 423], [247, 460], [233, 493], [218, 537], [200, 536], [300, 526], [327, 593], [352, 481], [382, 469], [368, 448], [277, 468], [247, 429], [239, 432], [232, 415], [253, 610]]}\n", + "Received data: {\"poses\": [[221, 549], [201, 538], [220, 536], [174, 485], [257, 418], [229, 506], [242, 456], [234, 466], [211, 534], [194, 533], [294, 522], [355, 548], [352, 476], [344, 473], [223, 460], [238, 422], [226, 420], [230, 421], [251, 529], [235, 611]]}\n", + "Received data: {\"poses\": [[225, 546], [255, 587], [219, 514], [218, 534], [176, 497], [176, 505], [229, 504], [242, 454], [231, 457], [211, 531], [262, 489], [298, 519], [327, 587], [349, 463], [363, 440], [229, 449], [237, 422], [228, 416], [227, 420], [247, 604]]}\n", + "Received data: {\"poses\": [[264, 462], [297, 501], [270, 446], [267, 454], [232, 409], [227, 420], [307, 376], [307, 388], [300, 389], [264, 455], [244, 454], [325, 409], [383, 518], [414, 408], [435, 380], [292, 385], [302, 355], [294, 347], [291, 351], [297, 531]]}\n", + "Received data: {\"poses\": [[340, 407], [339, 405], [323, 347], [322, 364], [298, 325], [285, 358], [350, 347], [380, 310], [375, 312], [317, 350], [384, 335], [488, 439], [458, 443], [496, 340], [365, 329], [373, 276], [370, 275], [373, 275], [367, 261], [326, 430]]}\n", + "Received data: {\"poses\": [[386, 307], [358, 281], [369, 281], [359, 241], [336, 271], [409, 269], [455, 235], [435, 238], [371, 275], [351, 279], [500, 299], [552, 365], [527, 367], [571, 279], [414, 228], [441, 206], [438, 202], [444, 202], [437, 187], [367, 341]]}\n", + "Received data: {\"poses\": [[390, 174], [431, 212], [422, 214], [426, 154], [431, 190], [398, 153], [475, 172], [504, 142], [526, 149], [430, 183], [410, 181], [572, 228], [624, 286], [604, 288], [675, 191], [475, 167], [513, 123], [515, 115], [488, 98], [436, 235]]}\n", + "Received data: {\"poses\": [[469, 54], [426, 80], [464, 121], [478, 86], [449, 81], [472, 61], [543, 22], [542, 104], [592, 78], [571, 81], [473, 101], [433, 81], [689, 202], [657, 208], [726, 124], [742, 101], [525, 80], [572, 45], [587, 51], [501, 86]]}\n", + "Received data: {\"poses\": [[464, -5], [503, 25], [496, 35], [482, -4], [535, -10], [487, 1], [607, 18], [657, 13], [639, 5], [520, 16], [494, -3], [692, 54], [749, 134], [734, 139], [790, 71], [810, 34], [621, -4], [642, -27], [580, -71], [554, -7]]}\n", + "Received data: {\"poses\": [[466, -11], [500, 28], [499, 32], [483, -5], [519, 6], [474, -36], [586, 10], [622, -22], [657, 7], [638, 8], [487, -3], [695, 52], [723, 102], [722, 137], [809, 64], [794, 76], [585, 7], [643, -24], [656, -28], [550, -1]]}\n", + "Received data: {\"poses\": [[468, -11], [502, 28], [509, 24], [485, -4], [542, 0], [604, -58], [604, -57], [671, 13], [665, 10], [661, 6], [525, 15], [715, 78], [724, 103], [717, 122], [737, 143], [802, 53], [656, -15], [645, -24], [658, -26], [559, -8]]}\n", + "Received data: {\"poses\": [[525, 59], [565, 91], [565, 93], [580, 68], [540, 65], [643, 24], [633, 86], [701, 99], [694, 96], [691, 90], [571, 88], [736, 137], [761, 183], [754, 203], [767, 230], [766, 226], [628, 75], [686, 70], [678, 59], [687, 60]]}\n", + "Received data: {\"poses\": [[588, 149], [625, 169], [634, 153], [604, 141], [621, 170], [687, 117], [714, 152], [733, 193], [729, 193], [725, 183], [624, 177], [834, 299], [799, 293], [801, 325], [802, 326], [799, 320], [683, 162], [717, 165], [710, 158], [718, 152]]}\n", + "Received data: {\"poses\": [[648, 218], [703, 231], [683, 229], [684, 228], [657, 190], [763, 279], [767, 278], [758, 279], [755, 278], [769, 258], [821, 308], [875, 382], [841, 383], [833, 407], [830, 409], [937, 354], [731, 268], [746, 251], [749, 239], [752, 244]]}\n", + "Received data: {\"poses\": [[714, 299], [754, 325], [741, 316], [734, 309], [720, 271], [799, 378], [799, 376], [790, 373], [790, 375], [876, 411], [921, 474], [889, 478], [868, 507], [873, 511], [867, 506], [791, 328], [769, 367], [787, 354], [787, 339], [788, 344]]}\n", + "Received data: {\"poses\": [[854, 380], [801, 402], [798, 395], [827, 393], [832, 478], [834, 482], [826, 475], [862, 440], [967, 576], [973, 575], [937, 573], [912, 608], [905, 608], [905, 604], [989, 557], [805, 465], [822, 447], [827, 439], [828, 441], [825, 437]]}\n", + "Received data: {\"poses\": [[846, 458], [853, 492], [850, 488], [844, 475], [876, 564], [875, 573], [863, 572], [859, 559], [841, 517], [1010, 661], [1006, 653], [986, 655], [941, 705], [944, 699], [937, 698], [853, 561], [838, 560], [857, 542], [865, 534], [863, 536]]}\n", + "Received data: {\"poses\": [[1001, 524], [917, 572], [909, 573], [913, 508], [904, 672], [907, 670], [897, 665], [908, 658], [898, 603], [1059, 756], [1056, 752], [1021, 752], [987, 791], [998, 791], [1010, 793], [886, 654], [876, 653], [896, 640], [898, 631], [902, 628]]}\n", + "Received data: {\"poses\": [[983, 615], [972, 669], [968, 656], [990, 590], [942, 757], [944, 767], [935, 758], [935, 749], [1005, 702], [1109, 847], [1098, 843], [1069, 841], [1032, 887], [1043, 877], [1034, 879], [1054, 879], [911, 753], [910, 747], [925, 709], [940, 723]]}\n", + "Received data: {\"poses\": [[1033, 757], [1036, 736], [1011, 843], [983, 859], [973, 852], [976, 847], [979, 853], [1136, 840], [1147, 939], [1123, 941], [1086, 977], [1078, 988], [1048, 991], [1089, 972], [1057, 990], [1102, 969], [949, 848], [993, 810], [1002, 811], [990, 814]]}\n", + "Received data: {\"poses\": [[1089, 838], [1075, 816], [1055, 928], [1017, 962], [1010, 944], [1017, 955], [1010, 948], [1106, 1001], [1190, 1016], [1204, 1023], [1170, 1029], [1130, 1063], [1120, 1074], [1087, 1084], [1140, 1060], [1103, 1070], [1037, 919], [1012, 894], [1049, 903], [1007, 917]]}\n", + "Received data: {\"poses\": [[1228, 735], [1091, 847], [1124, 747], [1014, 961], [1010, 954], [1016, 964], [1012, 953], [1193, 932], [1189, 1026], [1194, 1035], [1212, 1014], [1129, 1068], [1124, 1077], [1119, 1083], [1137, 1063], [1109, 1079], [1151, 1065], [1013, 933], [996, 908], [1051, 909]]}\n", + "Received data: {\"poses\": [[1210, 834], [1049, 937], [1035, 917], [946, 1043], [947, 1035], [952, 1022], [1049, 1094], [1153, 1114], [1138, 1108], [1154, 1117], [1169, 1099], [1125, 1113], [1077, 1156], [1026, 1173], [1088, 1152], [1090, 1152], [1048, 1163], [1104, 1157], [981, 991], [1002, 993]]}\n", + "Received data: {\"poses\": [[1029, 1013], [1009, 1017], [897, 1122], [887, 1116], [886, 1118], [1095, 1105], [1100, 1198], [1091, 1214], [1099, 1208], [1127, 1196], [1064, 1213], [1074, 1201], [1023, 1246], [1040, 1242], [1036, 1242], [1037, 1246], [1026, 1239], [1042, 1250], [923, 1077], [960, 1098]]}\n", + "Received data: {\"poses\": [[1184, 947], [997, 1043], [979, 1014], [881, 1127], [880, 1123], [881, 1132], [990, 1188], [1091, 1207], [1070, 1206], [1077, 1211], [1117, 1205], [1054, 1221], [1007, 1243], [1013, 1252], [1031, 1248], [1023, 1254], [985, 1247], [1033, 1254], [911, 1077], [937, 1091]]}\n", + "Received data: {\"poses\": [[922, 1048], [902, 1055], [880, 1025], [784, 1128], [772, 1124], [831, 1119], [1000, 1134], [990, 1210], [967, 1203], [980, 1222], [1007, 1219], [954, 1223], [965, 1211], [911, 1257], [932, 1254], [927, 1258], [936, 1254], [827, 1125], [819, 1087], [851, 1110]]}\n", + "Received data: {\"poses\": [[993, 1026], [794, 1070], [721, 1109], [689, 1110], [727, 1127], [905, 1151], [889, 1210], [885, 1215], [863, 1216], [882, 1228], [905, 1235], [852, 1230], [861, 1223], [809, 1266], [787, 1258], [824, 1262], [810, 1251], [832, 1251], [706, 1089], [735, 1113]]}\n", + "Received data: {\"poses\": [[718, 1063], [634, 1128], [586, 1104], [561, 1084], [803, 1164], [788, 1221], [782, 1218], [770, 1222], [773, 1236], [815, 1259], [748, 1245], [756, 1234], [710, 1254], [714, 1257], [640, 1224], [679, 1252], [705, 1258], [729, 1254], [599, 1088], [647, 1132]]}\n", + "Received data: {\"poses\": [[593, 1096], [492, 1097], [597, 1223], [687, 1215], [694, 1220], [687, 1224], [667, 1215], [675, 1233], [708, 1264], [650, 1218], [603, 1262], [605, 1273], [613, 1261], [546, 1219], [630, 1270], [582, 1258], [612, 1261], [633, 1264], [650, 1272], [528, 1099]]}\n", + "Received data: {\"poses\": [[491, 1099], [691, 1216], [694, 1222], [688, 1221], [686, 1222], [672, 1228], [674, 1235], [649, 1238], [651, 1218], [612, 1254], [603, 1272], [611, 1260], [586, 1265], [543, 1216], [617, 1262], [607, 1257], [611, 1261], [630, 1259], [492, 1112], [462, 1065]]}\n", + "Received data: {\"poses\": [[468, 1116], [691, 1212], [685, 1210], [687, 1209], [687, 1217], [656, 1223], [705, 1258], [647, 1212], [606, 1251], [605, 1258], [611, 1256], [611, 1256], [544, 1212], [542, 1214], [607, 1253], [607, 1254], [609, 1256], [630, 1255], [500, 1090], [525, 1093]]}\n", + "Received data: {\"poses\": [[514, 1039], [738, 1131], [733, 1128], [735, 1128], [732, 1129], [726, 1135], [711, 1152], [740, 1176], [653, 1165], [651, 1184], [657, 1176], [657, 1176], [658, 1175], [633, 1180], [599, 1139], [654, 1172], [655, 1173], [655, 1175], [681, 1170], [565, 1012]]}\n", + "Received data: {\"poses\": [[642, 949], [792, 1037], [791, 1035], [785, 1035], [787, 1037], [790, 1047], [780, 1041], [755, 1059], [782, 1077], [709, 1082], [708, 1087], [709, 1083], [712, 1084], [709, 1084], [668, 1047], [717, 1080], [710, 1076], [709, 1084], [708, 1081], [577, 926]]}\n", + "Received data: {\"poses\": [[624, 856], [843, 949], [843, 951], [837, 943], [836, 945], [843, 958], [831, 954], [825, 981], [774, 965], [765, 989], [764, 994], [763, 1002], [762, 995], [741, 998], [723, 973], [766, 997], [764, 995], [764, 989], [784, 997], [682, 831]]}\n", + "Received data: {\"poses\": [[733, 767], [892, 866], [898, 859], [889, 859], [889, 856], [895, 875], [882, 872], [866, 892], [839, 866], [815, 910], [778, 894], [817, 903], [817, 909], [788, 912], [793, 890], [824, 912], [816, 903], [813, 908], [810, 903], [716, 748]]}\n", + "Received data: {\"poses\": [[732, 685], [939, 781], [942, 779], [946, 776], [946, 779], [934, 786], [886, 788], [904, 781], [861, 818], [863, 826], [864, 821], [859, 818], [860, 823], [849, 810], [862, 818], [867, 823], [864, 815], [864, 816], [867, 818], [787, 666]]}\n", + "Received data: {\"poses\": [[844, 593], [778, 595], [1000, 690], [979, 674], [983, 677], [973, 682], [987, 699], [926, 695], [945, 709], [925, 692], [910, 742], [924, 749], [907, 725], [909, 720], [895, 735], [855, 706], [915, 726], [912, 730], [913, 726], [913, 724]]}\n", + "Received data: {\"poses\": [[828, 515], [1051, 606], [1025, 590], [1035, 601], [1020, 597], [966, 604], [984, 608], [968, 607], [962, 643], [958, 651], [961, 638], [966, 646], [938, 649], [962, 643], [905, 622], [964, 652], [972, 646], [962, 641], [964, 642], [886, 495]]}\n", + "Received data: {\"poses\": [[873, 425], [1105, 516], [1074, 513], [1083, 511], [1063, 513], [1022, 513], [1017, 509], [1000, 551], [1002, 555], [1025, 579], [1011, 546], [996, 555], [987, 559], [1020, 573], [1016, 557], [1011, 546], [1004, 564], [1006, 557], [994, 544], [935, 411]]}\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "163" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "poses_lines = poses_raw_data.split(\"\\n\")\n", + "poses_lines = [line.replace(\"Received data: \", \"\") for line in poses_lines if line]\n", + "len(poses_lines)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([1029, 243])" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "poses_dicts = [json.loads(line) for line in poses_lines]\n", + "poses_over_time = np.array([poses_dict[\"poses\"] for poses_dict in poses_dicts])\n", + "# ThreeD array = time, pose number, [x, y]\n", + "poses_over_time[0,0]" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjAAAAGdCAYAAAAMm0nCAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/av/WaAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA30ElEQVR4nO3df3BU9aH//9duYhJIyIaEJpvVgCnXUSJUBQrGX3d6iRClab2l7cUGpJaBKw1VhCLwtUBpqyB2VLA01E4rzIDVOiNYuDU0BWu0jQkkRgwgUpsCSjapxuwmoYGQfX//4JMjCwES2GRzNs/HzM6w57xz9v124p5X3r+OwxhjBAAAYCPOcFcAAACguwgwAADAdggwAADAdggwAADAdggwAADAdggwAADAdggwAADAdggwAADAdqLDXYGeEggEdOzYMQ0aNEgOhyPc1QEAAF1gjFFTU5M8Ho+czvP3s0RsgDl27JgyMjLCXQ0AAHAJjh49qquuuuq85yM2wAwaNEjS6f8AiYmJYa4NAADoCr/fr4yMDOs+fj4RG2A6ho0SExMJMAAA2MzFpn8wiRcAANgOAQYAANgOAQYAANgOAQYAANgOAQYAANgOAQYAANgOAQYAANgOAQYAANgOAQYAANgOAQYAANgOAQYAANhOxD4LqScEAgF98sknkqSBAwde9DkNAABEGmOMjh8/LkkaMmSInM7w9IUQYLrhk08+UVpaWrirAQBAn1BXV6fU1NSwfDZDSAAAwHbogemGgQMHWv+uq6tTfHx8GGsDAH1P8T6vHnqxSuas4x0D7mum3qg7r3f3drUQQi0tLdZoxJn3xd5GgOmGM+e8xMfHE2AA4AztAaMndv5Tjpg4dTZD0CHpiZ3/VN7YLyrKyRzCSBDOuaAMIQEAQqK8pkG1vtbznjeSan2tKq9p6L1KIWIRYAAAIVHfdP7wcinlgAshwAAAQiJ1UFxIywEXQoABAITEuMxkpbs6n/8inZ4Dk+6K07jM5N6sFiIUAQYAEBJRToeW52VJ0jkhpuP98rwsJvAiJAgwAICQyR2ZrsJpo+V2BQ8TuV1xKpw2Wrkj08NUM0QallEDAEIqd2S67sxyq7ymQfVNrUoddHrYiJ4XhBIBBgAQclFOh7KHp4S7GohgDCEBAADbIcAAAADbIcAAAADbIcAAAADbIcAAAADbIcAAAADbIcAAAADbIcAAAADb6XaAKSkpUV5enjwejxwOh7Zu3Xresg888IAcDoeeeeaZoOMNDQ3Kz89XYmKikpKSNHPmTDU3NweV2bt3r26//XbFxcUpIyNDq1ev7m5VAQBAhOp2gGlpadENN9ygdevWXbDcli1b9Pbbb8vj8ZxzLj8/X/v27VNxcbG2b9+ukpISzZ492zrv9/s1ceJEDRs2TBUVFXryySf14x//WM8991x3qwsAACJQtx8lcNddd+muu+66YJmPP/5YP/jBD7Rjxw5Nnjw56NyBAwdUVFSk3bt3a+zYsZKkZ599Vnfffbd+/vOfy+PxaPPmzTp58qR++9vfKiYmRtdff72qqqr01FNPBQUdAADQP4V8DkwgEND06dO1cOFCXX/99eecLy0tVVJSkhVeJCknJ0dOp1NlZWVWmTvuuEMxMTFWmUmTJungwYP67LPPOv3cEydOyO/3B70AAEBkCnmAeeKJJxQdHa0HH3yw0/Ner1epqalBx6Kjo5WcnCyv12uVSUtLCyrT8b6jzNlWrlwpl8tlvTIyMi63KQAAoI8KaYCpqKjQmjVrtGHDBjkcvfvY9CVLlsjn81mvo0eP9urnAwCA3hPSAPPmm2+qvr5eQ4cOVXR0tKKjo3X48GEtWLBAV199tSTJ7Xarvr4+6OdOnTqlhoYGud1uq0xdXV1QmY73HWXOFhsbq8TExKAXAACITCENMNOnT9fevXtVVVVlvTwejxYuXKgdO3ZIkrKzs9XY2KiKigrr53bt2qVAIKDx48dbZUpKStTW1maVKS4u1rXXXqvBgweHssoAAMCGur0Kqbm5WX//+9+t9zU1NaqqqlJycrKGDh2qlJSUoPJXXHGF3G63rr32WknSiBEjlJubq1mzZmn9+vVqa2vT3LlzNXXqVGvJ9Xe+8x2tWLFCM2fO1KJFi1RdXa01a9bo6aefvpy2AgCACNHtALNnzx595Stfsd7Pnz9fkjRjxgxt2LChS9fYvHmz5s6dqwkTJsjpdGrKlClau3atdd7lculPf/qTCgoKNGbMGA0ZMkTLli1jCTUAAJAkOYwxJtyV6Al+v18ul0s+ny9k82FaWlqUkJAg6XRPVHx8fEiuez7tAaPymgbVN7UqdVCcxmUmK8rZu5OjAQA4U0/fC7t6/+52Dwx6R1F1rVZs269aX6t1LN0Vp+V5WcodmR7GmgEAEH48zLEPKqqu1ZxNlUHhRZK8vlbN2VSpouraMNUMQF/QHjAq/fBTvVr1sUo//FTtgYjsSAcuiB6YPqY9YLRi23519nVkJDkkrdi2X3dmuRlOgi0xNHp56J0FTiPA9DHlNQ3n9LycyUiq9bWqvKZB2cNTzlsO6Iu4+V6ejt7Zs//A6eidLZw2mv+O6DcYQupj6pvOH14upRzQVzA0enku1jsrne6dZTgJ/QUBpo9JHRQX0nJAX8DN9/J1p3cW6A8IMH3MuMxkpbvidL4ZAQ6d7nIfl5ncm9UCLgs338tH7ywQjADTx0Q5HVqelyVJ54SYjvfL87KY9Ahb4eZ7+eidBYIRYPqg3JHpKpw2Wm5X8BeR2xXHJD3YEjffy0fvLBCMVUh9VO7IdN2Z5Wa5KSJCx83X62vtdB6MQ6cDOjff8+vonZ2zqVIOKei/I72z6I/ogenDopwOZQ9P0ddvvFLZw1P4YoJtMTQaGvTOAp+jBwZAr+i4+Z69D4ybfWC6hd5Z4DQCDIBew803NDp6Z4H+jAADoFdx8wUQCsyBAQAAtkOAAQAAtkOAAQAAtkOAAQAAtkOAAQAAtkOAAQAAtkOAAQAAtkOAAQAAtkOAAQAAtkOAAQAAtkOAAQAAtkOAAQAAtkOAAQAAtkOAAQAAtkOAAQAAtkOAAQAAtkOAAQAAtkOAAQAAtkOAAQAAtkOAAQAAttPtAFNSUqK8vDx5PB45HA5t3brVOtfW1qZFixZp1KhRio+Pl8fj0X333adjx44FXaOhoUH5+flKTExUUlKSZs6cqebm5qAye/fu1e233664uDhlZGRo9erVl9ZCAAAQcbodYFpaWnTDDTdo3bp155w7fvy4KisrtXTpUlVWVuqVV17RwYMH9bWvfS2oXH5+vvbt26fi4mJt375dJSUlmj17tnXe7/dr4sSJGjZsmCoqKvTkk0/qxz/+sZ577rlLaCIAAIg0DmOMueQfdji0ZcsW3XPPPects3v3bo0bN06HDx/W0KFDdeDAAWVlZWn37t0aO3asJKmoqEh33323PvroI3k8HhUWFurRRx+V1+tVTEyMJGnx4sXaunWr3n///S7Vze/3y+VyyefzKTEx8VKbGKSlpUUJCQmSpObmZsXHx4fkugAA2EVP3wu7ev/u8TkwPp9PDodDSUlJkqTS0lIlJSVZ4UWScnJy5HQ6VVZWZpW54447rPAiSZMmTdLBgwf12Wefdfo5J06ckN/vD3oBAIDI1KMBprW1VYsWLdK9995rpSiv16vU1NSgctHR0UpOTpbX67XKpKWlBZXpeN9R5mwrV66Uy+WyXhkZGaFuDgAA6CN6LMC0tbXp29/+towxKiws7KmPsSxZskQ+n896HT16tMc/EwAAhEd0T1y0I7wcPnxYu3btChrDcrvdqq+vDyp/6tQpNTQ0yO12W2Xq6uqCynS87yhzttjYWMXGxoayGQAAoI8KeQ9MR3g5dOiQ/vznPyslJSXofHZ2thobG1VRUWEd27VrlwKBgMaPH2+VKSkpUVtbm1WmuLhY1157rQYPHhzqKgMAAJvpdoBpbm5WVVWVqqqqJEk1NTWqqqrSkSNH1NbWpm9+85vas2ePNm/erPb2dnm9Xnm9Xp08eVKSNGLECOXm5mrWrFkqLy/XX//6V82dO1dTp06Vx+ORJH3nO99RTEyMZs6cqX379umll17SmjVrNH/+/NC1HAAA2Jfpptdff91IOuc1Y8YMU1NT0+k5Seb111+3rvHpp5+ae++91yQkJJjExERz//33m6ampqDPeffdd81tt91mYmNjzZVXXmlWrVrVrXr6fD4jyfh8vu428byam5ut9jQ3N4fsugAA2EVP3wu7ev++rH1g+jL2gQEAIPT6yj4wPTKJFxfXHjAqr2lQfVOrUgfFaVxmsqKcjnBXCwAAWyDAhEFRda1WbNuvWl+rdSzdFafleVnKHZkexpoBAGAPPI26lxVV12rOpsqg8CJJXl+r5myqVFF1bZhqBgCAfRBgelF7wGjFtv3qbNJRx7EV2/arPRCR05IAAAgZAkyItQeMSj/8VK9WfazSDz8NCiPlNQ3n9LycyUiq9bWqvKahF2oKAIB9MQcmhC42t6W+6fzh5UxdLQcAQH9FD0yIdGVuS+qguC5dq6vlAADorwgwIdDVuS1jhg1WuitO51ss7dDpHptxmck9U1EAACIEASYEujq3peLwZ1qelyVJ54SYjvfL87LYDwYAgIsgwIRAd+a25I5MV+G00XK7goeJ3K44FU4bzT4wAAB0AZN4Q6C7c1tyR6brziw3O/ECAHCJCDAhMC4zWemuOHl9rZ3Og3HodA/LmXNbopwOZQ9P6bU6AgAQSRhCCoEop4O5LQAA9CICTIgwtwUAgN7DEFIIMbcFAIDeQYAJMea2AADQ8xhCAgAAtkOAAQAAtkOAAQAAtkOAAQAAtsMkXgCwsfaAYeUj+iUCDADYVFF1rVZs2x/0MNl0V5yW52Wx9xQiHkNIAGBDRdW1mrOpMii8SJLX16o5mypVVF0bppoBvYMAAwA20x4wWrFtf6fPXus4tmLbfrUHOisBRAYCDADYTHlNwzk9L2cykmp9rSqvaei9SgG9jAADADZT33T+8HIp5QA7IsAAgM2kDoq7eKFulAPsiFVIAGAz4zKTle6Kk9fX2uk8GIckt+v0kmpEtv68jJ4AAwA2E+V0aHleluZsqpRDCgoxHbeu5XlZ/eZG1l/192X0DCEBgA3ljkxX4bTRcruCh4ncrjgVThvdL25g/RnL6OmBAQDbyh2Zrjuz3P12CKG/utgyeodOL6O/M8sd0b8LBBgAsLEop0PZw1PCXQ30ou4so4/k3w2GkAAAsBGW0Z/W7QBTUlKivLw8eTweORwObd26Nei8MUbLli1Tenq6BgwYoJycHB06dCioTENDg/Lz85WYmKikpCTNnDlTzc3NQWX27t2r22+/XXFxccrIyNDq1au73zoAACIMy+hP63aAaWlp0Q033KB169Z1en716tVau3at1q9fr7KyMsXHx2vSpElqbf08Cebn52vfvn0qLi7W9u3bVVJSotmzZ1vn/X6/Jk6cqGHDhqmiokJPPvmkfvzjH+u55567hCYCABA5OpbRn292i0OnVyNF+jJ6hzHmkh+W4XA4tGXLFt1zzz2STve+eDweLViwQD/84Q8lST6fT2lpadqwYYOmTp2qAwcOKCsrS7t379bYsWMlSUVFRbr77rv10UcfyePxqLCwUI8++qi8Xq9iYmIkSYsXL9bWrVv1/vvvd6lufr9fLpdLPp9PiYmJl9rEIC0tLUpISJAkNTc3Kz4+PiTXBQCgOzpWIUmdL6PvyZVoPX0v7Or9O6RzYGpqauT1epWTk2Mdc7lcGj9+vEpLSyVJpaWlSkpKssKLJOXk5MjpdKqsrMwqc8cdd1jhRZImTZqkgwcP6rPPPuv0s0+cOCG/3x/0AgAgErGMPsSrkLxeryQpLS0t6HhaWpp1zuv1KjU1NbgS0dFKTk4OKpOZmXnONTrODR48+JzPXrlypVasWBGahgAA0Mf192X0EbOMesmSJZo/f7713u/3KyMjI4w1Cq/+vL00APQX/XkZfUgDjNvtliTV1dUpPf3z7qu6ujrdeOONVpn6+vqgnzt16pQaGhqsn3e73aqrqwsq0/G+o8zZYmNjFRsbG5J22F1/314aABD5QjoHJjMzU263Wzt37rSO+f1+lZWVKTs7W5KUnZ2txsZGVVRUWGV27dqlQCCg8ePHW2VKSkrU1tZmlSkuLta1117b6fARPsf20gCA/qDbAaa5uVlVVVWqqqqSdHriblVVlY4cOSKHw6F58+bpZz/7mf7whz/ovffe03333SePx2OtVBoxYoRyc3M1a9YslZeX669//avmzp2rqVOnyuPxSJK+853vKCYmRjNnztS+ffv00ksvac2aNUFDRDjXxbaXlk5vL90euOSFZwAA9AndHkLas2ePvvKVr1jvO0LFjBkztGHDBj3yyCNqaWnR7Nmz1djYqNtuu01FRUWKi/t8pvTmzZs1d+5cTZgwQU6nU1OmTNHatWut8y6XS3/6059UUFCgMWPGaMiQIVq2bFnQXjE4F9tLAwD6i8vaB6Yv64/7wLxa9bEeerHqouXWTL1RX7/xyp6vEAAg4kTkPjAIL7aXBgD0FwSYCML20gCA/oIAE0GinA4tz8uSpHNCTMf75XlZ7AcDALA9AkyEYXtpAEB/EDE78eJz/X17aQBA5CPARKj+vL00ACDyMYQEAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABsJzrcFQAAAD2jPWBUXtOg+qZWpQ6K07jMZEU5HeGuVkgQYAAAiEBF1bVasW2/an2t1rF0V5yW52Upd2R6GGsWGgwhAQAQYYqqazVnU2VQeJEkr69VczZVqqi6Nkw1Cx0CDAAAEaQ9YLRi236ZTs51HFuxbb/aA52VsA8CDAAAEaS8puGcnpczGUm1vlaV1zT0XqV6AAEGAIAIUt90/vByKeX6KgIMAAARJHVQXEjL9VUEGAAAIsi4zGSlu+J0vsXSDp1ejTQuM7k3qxVyIQ8w7e3tWrp0qTIzMzVgwAANHz5cP/3pT2XM55OFjDFatmyZ0tPTNWDAAOXk5OjQoUNB12loaFB+fr4SExOVlJSkmTNnqrm5OdTVBQAgokQ5HVqe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AEDkogcGAADYDgEGAADYDgEGAADYDgEGAADYDgGmm9atW6err75acXFxGj9+vMrLy8NdpW5buXKlvvzlL2vQoEFKTU3VPffco4MHDwaVaW1tVUFBgVJSUpSQkKApU6aorq4uqMyRI0c0efJkDRw4UKmpqVq4cKFOnTrVm025JKtWrZLD4dC8efOsY5HY3o8//ljTpk1TSkqKBgwYoFGjRmnPnj3WeWOMli1bpvT0dA0YMEA5OTk6dOhQ0DUaGhqUn5+vxMREJSUlaebMmWpubu7tplxUe3u7li5dqszMTA0YMEDDhw/XT3/606Bnqdi5vSUlJcrLy5PH45HD4dDWrVuDzoeqbXv37tXtt9+uuLg4ZWRkaPXq1T3dtE5dqL1tbW1atGiRRo0apfj4eHk8Ht133306duxY0DUipb1ne+CBB+RwOPTMM88EHbdTe0PGoMtefPFFExMTY37729+affv2mVmzZpmkpCRTV1cX7qp1y6RJk8zzzz9vqqurTVVVlbn77rvN0KFDTXNzs1XmgQceMBkZGWbnzp1mz5495uabbza33HKLdf7UqVNm5MiRJicnx7zzzjvmj3/8oxkyZIhZsmRJOJrUZeXl5ebqq682X/rSl8xDDz1kHY+09jY0NJhhw4aZ7373u6asrMz84x//MDt27DB///vfrTKrVq0yLpfLbN261bz77rvma1/7msnMzDT//ve/rTK5ubnmhhtuMG+//bZ58803zX/8x3+Ye++9NxxNuqDHHnvMpKSkmO3bt5uamhrz8ssvm4SEBLNmzRqrjJ3b+8c//tE8+uij5pVXXjGSzJYtW4LOh6JtPp/PpKWlmfz8fFNdXW1+97vfmQEDBphf/epXvdVMy4Xa29jYaHJycsxLL71k3n//fVNaWmrGjRtnxowZE3SNSGnvmV555RVzww03GI/HY55++umgc3Zqb6gQYLph3LhxpqCgwHrf3t5uPB6PWblyZRhrdfnq6+uNJPPGG28YY05/QVxxxRXm5ZdftsocOHDASDKlpaXGmNP/wzmdTuP1eq0yhYWFJjEx0Zw4caJ3G9BFTU1N5pprrjHFxcXmP//zP60AE4ntXbRokbntttvOez4QCBi3222efPJJ61hjY6OJjY01v/vd74wxxuzfv99IMrt377bKvPbaa8bhcJiPP/645yp/CSZPnmy+973vBR37xje+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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots()\n", + "\n", + "time_index = 0\n", + "ax.scatter(poses_over_time[time_index, :, 0], poses_over_time[time_index, :, 1])\n", + "for line in arena.boundary_lines:\n", + " plt.plot([line[0][0], line[1][0]], [line[0][1], line[1][1]], color=\"black\")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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KKnbKioqzFVXXWW++MUvmvvvv99aH2v1NjY2mpEjR5rvfve7pry83Pz1r381r732mvnLX/5itVmzZo1xuVxm69at5r333jNf+9rXTFZWlvnb3/5mtZk6daq5/vrrzdtvv23eeOMN84//+I9m1qxZkSjpgh555BEzbNgws337dlNbW2tefvllk5KSYp566imrjZ3r/f3vf28eeugh88orrxhJZsuWLSHbw1Gb3+83brfb5Ofnm+rqavOb3/zGDBo0yPzyl7/sqzItF6q3qanJ5Obmmpdeesl88MEHpqyszEycONGMHz8+ZB+xUu+ZXnnlFXP99dcbr9drnnjiiZBtdqo3XAgwPTBx4kRTUFBgve7o6DBer9cUFhZGsFeXr6GhwUgyu3btMsac/oIYOHCgefnll602Bw4cMJJMWVmZMeb0X7i4uDjj8/msNkVFRcbpdJoTJ070bQHd1NzcbK655hpTUlJi/vmf/9kKMLFY79KlS83kyZPPuz0YDBqPx2Mee+wxa11TU5NJTEw0v/nNb4wxxuzfv99IMrt377ba/OEPfzAOh8N88sknvdf5SzBt2jTzve99L2Td17/+dZOfn2+Mia16zz7Ahau2Z555xgwdOjTk93np0qXm2muv7eWKLuxCB/ROFRUVRpI5dOiQMSY26/3444/NFVdcYaqrq83IkSNDAoyd670cXELqppMnT6qyslK5ubnWuri4OOXm5qqsrCyCPbt8fr9fkpSWliZJqqysVHt7e0ito0aN0ogRI6xay8rKNHbsWLndbqtNXl6eAoGA9u3b14e9776CggJNmzYtpC4pNuv93e9+pwkTJuib3/ym0tPTdeONN+rZZ5+1ttfW1srn84XU7HK5NGnSpJCaU1NTNWHCBKtNbm6u4uLiVF5e3nfFdMPNN9+sHTt26MMPP5Qkvffee3rzzTd1xx13SIq9es8UrtrKysp02223KSEhwWqTl5enmpoaff75531UzaXx+/1yOBxKTU2VFHv1BoNBzZ49W0uWLNF11113zvZYq7e7CDDddOzYMXV0dIQcwCTJ7XbL5/NFqFeXLxgMatGiRbrllls0ZswYSZLP51NCQoL1ZdDpzFp9Pl+X/y86t0WbF198UXv27FFhYeE522Kx3r/+9a8qKirSNddco9dee00LFizQfffdp+eff17S3/t8od9nn8+n9PT0kO3x8fFKS0uLupqXLVummTNnatSoURo4cKBuvPFGLVq0SPn5+ZJir94zhas2u/2Od2pra9PSpUs1a9Ys62GGsVbvo48+qvj4eN13331dbo+1ersrZp9Gje4pKChQdXW13nzzzUh3pdccOXJE999/v0pKSpSUlBTp7vSJYDCoCRMm6Gc/+5kk6cYbb1R1dbXWr1+vOXPmRLh34ffb3/5Wmzdv1gsvvKDrrrtOVVVVWrRokbxeb0zWi9Pa29v1rW99S8YYFRUVRbo7vaKyslJPPfWU9uzZI4fDEenuRBXOwHTT8OHDNWDAgHNGptTX18vj8USoV5dn4cKF2r59u15//XVdeeWV1nqPx6OTJ0+qqakppP2ZtXo8ni7/X3RuiyaVlZVqaGjQuHHjFB8fr/j4eO3atUvr1q1TfHy83G53TNUrSRkZGcrOzg5ZN3r0aB0+fFjS3/t8od9nj8ejhoaGkO2nTp1SY2Nj1NW8ZMkS6yzM2LFjNXv2bD3wwAPWGbdYq/dM4arNbr/jneHl0KFDKikpsc6+SLFV7xtvvKGGhgaNGDHC+v46dOiQHnzwQV111VWSYqveniDAdFNCQoLGjx+vHTt2WOuCwaB27NihnJycCPas54wxWrhwobZs2aKdO3cqKysrZPv48eM1cODAkFpramp0+PBhq9acnBy9//77IX9pOr9Ezj5wRtrtt9+u999/X1VVVdYyYcIE5efnW3+OpXol6ZZbbjlnaPyHH36okSNHSpKysrLk8XhCag4EAiovLw+puampSZWVlVabnTt3KhgMatKkSX1QRfcdP35ccXGhX2cDBgxQMBiUFHv1nilcteXk5Ki0tFTt7e1Wm5KSEl177bUaOnRoH1XTPZ3h5eDBg/rTn/6kYcOGhWyPpXpnz56tvXv3hnx/eb1eLVmyRK+99pqk2Kq3RyJ9F7GdvPjiiyYxMdFs3LjR7N+/38yfP9+kpqaGjEyxgwULFhiXy2X+93//19TV1VnL8ePHrTb33nuvGTFihNm5c6d55513TE5OjsnJybG2dw4rnjJliqmqqjLFxcXmC1/4QtQOKz7bmaOQjIm9eisqKkx8fLx55JFHzMGDB83mzZvN4MGDzaZNm6w2a9asMampqebVV181e/fuNf/2b//W5dDbG2+80ZSXl5s333zTXHPNNVExrPhsc+bMMVdccYU1jPqVV14xw4cPNz/84Q+tNnaut7m52bz77rvm3XffNZLM448/bt59911r1E04amtqajJut9vMnj3bVFdXmxdffNEMHjw4IsNsL1TvyZMnzde+9jVz5ZVXmqqqqpDvsDNH2MRKvV05exSSMfaqN1wIMD30i1/8wowYMcIkJCSYiRMnmrfffjvSXeoxSV0uzz33nNXmb3/7m/nP//xPM3ToUDN48GDz7//+76auri5kP//3f/9n7rjjDjNo0CAzfPhw8+CDD5r29vY+rubSnB1gYrHebdu2mTFjxpjExEQzatQos2HDhpDtwWDQrFixwrjdbpOYmGhuv/12U1NTE9Lms88+M7NmzTIpKSnG6XSae+65xzQ3N/dlGd0SCATM/fffb0aMGGGSkpLMP/zDP5iHHnoo5IBm53pff/31Lv/OzpkzxxgTvtree+89M3nyZJOYmGiuuOIKs2bNmr4qMcSF6q2trT3vd9jrr79u7SNW6u1KVwHGTvWGi8OYM6aqBAAAsAHugQEAALZDgAEAALZDgAEAALZDgAEAALZDgAEAALZDgAEAALZDgAEAALZDgAEAALZDgAEAALZDgAEAALZDgAEAALZDgAEAALbz/wDFaq7UotrXVAAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots()\n", + "\n", + "time_index = 1\n", + "ax.scatter(poses_over_time[time_index, :, 0], poses_over_time[time_index, :, 1])\n", + "for line in arena.boundary_lines:\n", + " plt.plot([line[0][0], line[1][0]], [line[0][1], line[1][1]], color=\"black\")" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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AACwDgEGAABYhwADAACsQ4ABAADWIcAAAADrdNlXCXxZrRMMh0KhGI8EAAC0V+tx+2wvCojbAHP48GFJUk5OToxHAgAAOurw4cPyeDynbY/bdyGFw2EdOHBAPXr0kMvlitp2Q6GQcnJytH///q/MO5a+ajVTb3yj3vhGvfYzxujw4cPy+/1KSDj9nS5xewYmISFBF154Yadt3+12x80/lvb6qtVMvfGNeuMb9drtTGdeWnETLwAAsA4BBgAAWIcA00HJycn69a9/reTk5FgP5bz5qtVMvfGNeuMb9X51xO1NvAAAIH5xBgYAAFiHAAMAAKxDgAEAANYhwAAAAOsQYDro8ccf10UXXaSUlBTl5eVp8+bNsR5Sh5WWluqKK65Qjx49lJ2drYkTJ6qmpiaiz9GjR1VcXKxevXopIyNDkyZNUm1tbUSfffv2afz48UpLS1N2drbmzp2r48ePn89SzsnixYvlcrk0e/ZsZ1081vvxxx/rxhtvVK9evZSamqohQ4Zo69atTrsxRosWLVKfPn2UmpqqgoIC7d69O2Ib9fX1KioqktvtVmZmpqZPn67GxsbzXcpZnThxQgsXLlRubq5SU1N18cUX65577ol4l4rN9ZaXl2vChAny+/1yuVx6+eWXI9qjVdv27dt1zTXXKCUlRTk5OVqyZElnl9amM9Xb0tKiefPmaciQIUpPT5ff79ePfvQjHThwIGIb8VLvqW6++Wa5XC498sgjEettqjdqDNpt1apVJikpyfzhD38wO3fuNDNmzDCZmZmmtrY21kPrkMLCQvP000+bHTt2mOrqajNu3DjTt29f09jY6PS5+eabTU5Ojlm3bp3ZunWrufLKK81VV13ltB8/ftwMHjzYFBQUmHfeecf8+c9/Nr179zYLFiyIRUnttnnzZnPRRReZb37zm+a2225z1sdbvfX19aZfv37mxz/+samsrDQffvihef31183f//53p8/ixYuNx+MxL7/8snn33XfN9ddfb3Jzc80///lPp8/YsWPN0KFDzaZNm8wbb7xhvvGNb5gpU6bEoqQzuu+++0yvXr3MmjVrzJ49e8yLL75oMjIyzKOPPur0sbneP//5z+aXv/yleemll4wks3r16oj2aNQWDAaN1+s1RUVFZseOHeb55583qamp5ne/+935KtNxpnobGhpMQUGBeeGFF8zf/vY3U1FRYUaOHGmGDx8esY14qfdkL730khk6dKjx+/3m4Ycfjmizqd5oIcB0wMiRI01xcbHz+cSJE8bv95vS0tIYjurLq6urM5LMxo0bjTGf/0B0797dvPjii06f999/30gyFRUVxpjP/8MlJCSYQCDg9Fm2bJlxu92mubn5/BbQTocPHzaXXHKJKSsrM//2b//mBJh4rHfevHnm6quvPm17OBw2Pp/PPPjgg866hoYGk5ycbJ5//nljjDG7du0yksyWLVucPq+99ppxuVzm448/7rzBn4Px48ebn/zkJxHrbrjhBlNUVGSMia96Tz3ARau2J554wvTs2TPi3/O8efNM//79O7miMzvTAb3V5s2bjSSzd+9eY0x81vvRRx+ZCy64wOzYscP069cvIsDYXO+XwSWkdjp27JiqqqpUUFDgrEtISFBBQYEqKipiOLIvLxgMSpKysrIkSVVVVWppaYmodcCAAerbt69Ta0VFhYYMGSKv1+v0KSwsVCgU0s6dO8/j6NuvuLhY48ePj6hLis96X3nlFY0YMULf//73lZ2drWHDhumpp55y2vfs2aNAIBBRs8fjUV5eXkTNmZmZGjFihNOnoKBACQkJqqysPH/FtMNVV12ldevW6YMPPpAkvfvuu3rzzTd13XXXSYq/ek8WrdoqKip07bXXKikpyelTWFiompoaffbZZ+epmnMTDAblcrmUmZkpKf7qDYfDmjp1qubOnatLL730C+3xVm97EWDa6eDBgzpx4kTEAUySvF6vAoFAjEb15YXDYc2ePVujRo3S4MGDJUmBQEBJSUnOj0Grk2sNBAJt/l20tnU1q1at0rZt21RaWvqFtnis98MPP9SyZct0ySWX6PXXX9esWbN066236plnnpH0rzGf6d9zIBBQdnZ2RHtiYqKysrK6XM3z58/X5MmTNWDAAHXv3l3Dhg3T7NmzVVRUJCn+6j1ZtGqz7d94q6NHj2revHmaMmWK8zLDeKv3gQceUGJiom699dY22+Ot3vaK27dRo32Ki4u1Y8cOvfnmm7EeSqfZv3+/brvtNpWVlSklJSXWwzkvwuGwRowYofvvv1+SNGzYMO3YsUPLly/XtGnTYjy66PvjH/+olStX6rnnntOll16q6upqzZ49W36/Py7rxedaWlr0gx/8QMYYLVu2LNbD6RRVVVV69NFHtW3bNrlcrlgPp0vhDEw79e7dW926dfvCkym1tbXy+XwxGtWXU1JSojVr1mjDhg268MILnfU+n0/Hjh1TQ0NDRP+Ta/X5fG3+XbS2dSVVVVWqq6vT5ZdfrsTERCUmJmrjxo1aunSpEhMT5fV646peSerTp48GDRoUsW7gwIHat2+fpH+N+Uz/nn0+n+rq6iLajx8/rvr6+i5X89y5c52zMEOGDNHUqVN1++23O2fc4q3ek0WrNtv+jbeGl71796qsrMw5+yLFV71vvPGG6urq1LdvX+f3a+/evbrjjjt00UUXSYqvejuCANNOSUlJGj58uNatW+esC4fDWrdunfLz82M4so4zxqikpESrV6/W+vXrlZubG9E+fPhwde/ePaLWmpoa7du3z6k1Pz9f7733XsR/mtYfkVMPnLE2evRovffee6qurnaWESNGqKioyPlzPNUrSaNGjfrCo/EffPCB+vXrJ0nKzc2Vz+eLqDkUCqmysjKi5oaGBlVVVTl91q9fr3A4rLy8vPNQRfsdOXJECQmRP2fdunVTOByWFH/1nixateXn56u8vFwtLS1On7KyMvXv3189e/Y8T9W0T2t42b17t/7617+qV69eEe3xVO/UqVO1ffv2iN8vv9+vuXPn6vXXX5cUX/V2SKzvIrbJqlWrTHJyslmxYoXZtWuXmTlzpsnMzIx4MsUGs2bNMh6Px/zv//6v+eSTT5zlyJEjTp+bb77Z9O3b16xfv95s3brV5Ofnm/z8fKe99bHiMWPGmOrqarN27Vrzta99rcs+Vnyqk59CMib+6t28ebNJTEw09913n9m9e7dZuXKlSUtLM88++6zTZ/HixSYzM9P86U9/Mtu3bzff/e5323z0dtiwYaaystK8+eab5pJLLukSjxWfatq0aeaCCy5wHqN+6aWXTO/evc0vfvELp4/N9R4+fNi888475p133jGSzEMPPWTeeecd56mbaNTW0NBgvF6vmTp1qtmxY4dZtWqVSUtLi8ljtmeq99ixY+b66683F154oamuro74DTv5CZt4qbctpz6FZIxd9UYLAaaDHnvsMdO3b1+TlJRkRo4caTZt2hTrIXWYpDaXp59+2unzz3/+0/zsZz8zPXv2NGlpaeY///M/zSeffBKxnf/7v/8z1113nUlNTTW9e/c2d9xxh2lpaTnP1ZybUwNMPNb76quvmsGDB5vk5GQzYMAA8+STT0a0h8Nhs3DhQuP1ek1ycrIZPXq0qampiehz6NAhM2XKFJORkWHcbre56aabzOHDh89nGe0SCoXMbbfdZvr27WtSUlLM17/+dfPLX/4y4oBmc70bNmxo8//stGnTjDHRq+3dd981V199tUlOTjYXXHCBWbx48fkqMcKZ6t2zZ89pf8M2bNjgbCNe6m1LWwHGpnqjxWXMSVNVAgAAWIB7YAAAgHUIMAAAwDoEGAAAYB0CDAAAsA4BBgAAWIcAAwAArEOAAQAA1iHAAAAA6xBgAACAdQgwAADAOgQYAABgHQIMAACwzv8D8LrQJoT5qbIAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots()\n", + "\n", + "time_index = 100\n", + "ax.scatter(poses_over_time[time_index, :, 0], poses_over_time[time_index, :, 1])\n", + "for line in arena.boundary_lines:\n", + " plt.plot([line[0][0], line[1][0]], [line[0][1], line[1][1]], color=\"black\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "modelling-space-PK-9Kbkb-py3.9", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.15" + }, + "orig_nbformat": 4, + "vscode": { + "interpreter": { + "hash": "0e849ea89ee47e1132ea7296f1ee1190d374e3d2d90c5960d8a36248408ee6b5" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/ch-13/4.3-monte-carlo_perf/display_from_robot.py b/ch-13/4.3-monte-carlo_perf/display_from_robot.py new file mode 100644 index 0000000..50c18d7 --- /dev/null +++ b/ch-13/4.3-monte-carlo_perf/display_from_robot.py @@ -0,0 +1,74 @@ +import asyncio +import json +import numpy as np +import matplotlib.pyplot as plt +from matplotlib.widgets import Button + +from robot_ble_connection import BleConnection + + +class RobotDisplay: + def __init__(self): + self.ble_connection = BleConnection(self.handle_data) + self.buffer = "" + self.arena = {} + self.closed = False + self.fig, self.axes = plt.subplots() + self.poses = None + + def handle_close(self, _): + self.closed = True + + def handle_data(self, data): + self.buffer += data.decode() + # print(f"Received raw data: {data}") + while "\n" in self.buffer: + line, self.buffer = self.buffer.split("\n", 1) + print(f"Received data: {line}") + try: + message = json.loads(line) + except ValueError: + print("Error parsing JSON") + return + if "arena" in message: + self.arena = message + if "poses" in message: + self.poses = np.array(message["poses"], dtype=np.int16) + + def draw(self): + self.axes.clear() + if self.arena: + for line in self.arena["arena"]: + self.axes.plot( + [line[0][0], line[1][0]], [line[0][1], line[1][1]], color="black" + ) + if self.poses is not None: + self.axes.scatter(self.poses[:,0], self.poses[:,1], color="blue") + + async def send_command(self, command): + request = (json.dumps({"command": command}) ).encode() + print(f"Sending request: {request}") + await self.ble_connection.send_uart_data(request) + + def start(self, _): + self.button_task = asyncio.create_task(self.send_command("start")) + + async def main(self): + plt.ion() + await self.ble_connection.connect() + try: + await self.send_command("arena") + self.fig.canvas.mpl_connect("close_event", self.handle_close) + start_button = Button(plt.axes([0.7, 0.05, 0.1, 0.075]), "Start") + start_button.on_clicked(self.start) + while not self.closed: + self.draw() + plt.draw() + plt.pause(0.05) + await asyncio.sleep(0.01) + finally: + await self.ble_connection.close() + + +robot_display = RobotDisplay() +asyncio.run(robot_display.main()) diff --git a/ch-13/4.3-monte-carlo_perf/poetry.lock b/ch-13/4.3-monte-carlo_perf/poetry.lock new file mode 100644 index 0000000..d4e15d9 --- /dev/null +++ b/ch-13/4.3-monte-carlo_perf/poetry.lock @@ -0,0 +1,2572 @@ +[[package]] +name = "anyio" +version = "3.6.2" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +category = "main" +optional = false +python-versions = ">=3.6.2" + +[package.dependencies] +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["contextlib2", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (<0.15)", "uvloop (>=0.15)"] +trio = ["trio (>=0.16,<0.22)"] + +[[package]] +name = "appnope" +version = "0.1.3" +description = "Disable App Nap on macOS >= 10.9" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "argon2-cffi" +version = "21.3.0" +description = "The secure Argon2 password hashing algorithm." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +argon2-cffi-bindings = "*" + +[package.extras] +dev = ["cogapp", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "pre-commit", "pytest", "sphinx", "sphinx-notfound-page", "tomli"] +docs = ["furo", "sphinx", "sphinx-notfound-page"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest"] + +[[package]] +name = "argon2-cffi-bindings" +version = "21.2.0" +description = "Low-level CFFI bindings for Argon2" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +cffi = ">=1.0.1" + +[package.extras] +dev = ["cogapp", "pre-commit", "pytest", "wheel"] +tests = ["pytest"] + +[[package]] +name = "arrow" +version = "1.2.3" +description = "Better dates & times for Python" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +python-dateutil = ">=2.7.0" + +[[package]] +name = "asttokens" +version = "2.2.1" +description = "Annotate AST trees with source code positions" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +six = "*" + +[package.extras] +test = ["astroid", "pytest"] + +[[package]] +name = "async-timeout" +version = "4.0.2" +description = "Timeout context manager for asyncio programs" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "attrs" +version = "22.2.0" +description = "Classes Without Boilerplate" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +cov = ["attrs[tests]", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope.interface"] +tests = ["attrs[tests-no-zope]", "zope.interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=0.971,<0.990)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests_no_zope = ["cloudpickle", "hypothesis", "mypy (>=0.971,<0.990)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] + +[[package]] +name = "backcall" +version = "0.2.0" +description = "Specifications for callback functions passed in to an API" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "beautifulsoup4" +version = "4.11.1" +description = "Screen-scraping library" +category = "main" +optional = false +python-versions = ">=3.6.0" + +[package.dependencies] +soupsieve = ">1.2" + +[package.extras] +html5lib = ["html5lib"] +lxml = ["lxml"] + +[[package]] +name = "black" +version = "22.10.0" +description = "The uncompromising code formatter." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +pathspec = ">=0.9.0" +platformdirs = ">=2" +tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} +typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "bleach" +version = "5.0.1" +description = "An easy safelist-based HTML-sanitizing tool." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +six = ">=1.9.0" +webencodings = "*" + +[package.extras] +css = ["tinycss2 (>=1.1.0,<1.2)"] +dev = ["Sphinx (==4.3.2)", "black (==22.3.0)", "build (==0.8.0)", "flake8 (==4.0.1)", "hashin (==0.17.0)", "mypy (==0.961)", "pip-tools (==6.6.2)", "pytest (==7.1.2)", "tox (==3.25.0)", "twine (==4.0.1)", "wheel (==0.37.1)"] + +[[package]] +name = "bleak" +version = "0.19.0" +description = "Bluetooth Low Energy platform Agnostic Klient" +category = "main" +optional = false +python-versions = ">=3.7,<4.0" + +[package.dependencies] +async-timeout = ">=3.0.0,<5" +bleak-winrt = {version = ">=1.2.0,<2.0.0", markers = "platform_system == \"Windows\""} +dbus-fast = {version = ">=1.22.0,<2.0.0", markers = "platform_system == \"Linux\""} +pyobjc-core = {version = ">=8.5.1,<9.0.0", markers = "platform_system == \"Darwin\""} +pyobjc-framework-CoreBluetooth = {version = ">=8.5.1,<9.0.0", markers = "platform_system == \"Darwin\""} +pyobjc-framework-libdispatch = {version = ">=8.5.1,<9.0.0", markers = "platform_system == \"Darwin\""} + +[[package]] +name = "bleak-winrt" +version = "1.2.0" +description = "Python WinRT bindings for Bleak" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "cffi" +version = "1.15.1" +description = "Foreign Function Interface for Python calling C code." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "click" +version = "8.1.3" +description = "Composable command line interface toolkit" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" + +[[package]] +name = "comm" +version = "0.1.2" +description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +traitlets = ">=5.3" + +[package.extras] +test = ["pytest"] + +[[package]] +name = "contourpy" +version = "1.0.6" +description = "Python library for calculating contours of 2D quadrilateral grids" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +numpy = ">=1.16" + +[package.extras] +bokeh = ["bokeh", "selenium"] +docs = ["docutils (<0.18)", "sphinx (<=5.2.0)", "sphinx-rtd-theme"] +test = ["Pillow", "flake8", "isort", "matplotlib", "pytest"] +test-minimal = ["pytest"] +test-no-codebase = ["Pillow", "matplotlib", "pytest"] + +[[package]] +name = "cycler" +version = "0.11.0" +description = "Composable style cycles" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "dbus-fast" +version = "1.64.0" +description = "A faster version of dbus-next" +category = "main" +optional = false +python-versions = ">=3.7,<4.0" + +[package.dependencies] +async-timeout = {version = ">=3.0.0", markers = "python_version < \"3.11\""} + +[[package]] +name = "debugpy" +version = "1.6.4" +description = "An implementation of the Debug Adapter Protocol for Python" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "decorator" +version = "5.1.1" +description = "Decorators for Humans" +category = "main" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "defusedxml" +version = "0.7.1" +description = "XML bomb protection for Python stdlib modules" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "entrypoints" +version = "0.4" +description = "Discover and load entry points from installed packages." +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "executing" +version = "1.2.0" +description = "Get the currently executing AST node of a frame, and other information" +category = "main" +optional = false +python-versions = "*" + +[package.extras] +tests = ["asttokens", "littleutils", "pytest", "rich"] + +[[package]] +name = "fastjsonschema" +version = "2.16.2" +description = "Fastest Python implementation of JSON schema" +category = "main" +optional = false +python-versions = "*" + +[package.extras] +devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] + +[[package]] +name = "fonttools" +version = "4.38.0" +description = "Tools to manipulate font files" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=14.0.0)", "xattr", "zopfli (>=0.1.4)"] +graphite = ["lz4 (>=1.7.4.2)"] +interpolatable = ["munkres", "scipy"] +lxml = ["lxml (>=4.0,<5)"] +pathops = ["skia-pathops (>=0.5.0)"] +plot = ["matplotlib"] +repacker = ["uharfbuzz (>=0.23.0)"] +symfont = ["sympy"] +type1 = ["xattr"] +ufo = ["fs (>=2.2.0,<3)"] +unicode = ["unicodedata2 (>=14.0.0)"] +woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] + +[[package]] +name = "fqdn" +version = "1.5.1" +description = "Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4, <4" + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "importlib-metadata" +version = "5.2.0" +description = "Read metadata from Python packages" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +perf = ["ipython"] +testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] + +[[package]] +name = "ipykernel" +version = "6.19.4" +description = "IPython Kernel for Jupyter" +category = "main" +optional = false +python-versions = ">=3.8" + +[package.dependencies] +appnope = {version = "*", markers = "platform_system == \"Darwin\""} +comm = ">=0.1.1" +debugpy = ">=1.0" +ipython = ">=7.23.1" +jupyter-client = ">=6.1.12" +matplotlib-inline = ">=0.1" +nest-asyncio = "*" +packaging = "*" +psutil = "*" +pyzmq = ">=17" +tornado = ">=6.1" +traitlets = ">=5.4.0" + +[package.extras] +cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinxcontrib-github-alt"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "ipython" +version = "8.7.0" +description = "IPython: Productive Interactive Computing" +category = "main" +optional = false +python-versions = ">=3.8" + +[package.dependencies] +appnope = {version = "*", markers = "sys_platform == \"darwin\""} +backcall = "*" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +jedi = ">=0.16" +matplotlib-inline = "*" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} +pickleshare = "*" +prompt-toolkit = ">=3.0.11,<3.1.0" +pygments = ">=2.4.0" +stack-data = "*" +traitlets = ">=5" + +[package.extras] +all = ["black", "curio", "docrepr", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.20)", "pandas", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] +black = ["black"] +doc = ["docrepr", "ipykernel", "matplotlib", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] +kernel = ["ipykernel"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["ipywidgets", "notebook"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] +test_extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.20)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"] + +[[package]] +name = "ipython_genutils" +version = "0.2.0" +description = "Vestigial utilities from IPython" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "ipywidgets" +version = "8.0.4" +description = "Jupyter interactive widgets" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +ipykernel = ">=4.5.1" +ipython = ">=6.1.0" +jupyterlab-widgets = ">=3.0,<4.0" +traitlets = ">=4.3.1" +widgetsnbextension = ">=4.0,<5.0" + +[package.extras] +test = ["jsonschema", "pytest (>=3.6.0)", "pytest-cov", "pytz"] + +[[package]] +name = "isoduration" +version = "20.11.0" +description = "Operations with ISO 8601 durations" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +arrow = ">=0.15.0" + +[[package]] +name = "jedi" +version = "0.18.2" +description = "An autocompletion tool for Python that can be used for text editors." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +parso = ">=0.8.0,<0.9.0" + +[package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] + +[[package]] +name = "Jinja2" +version = "3.1.2" +description = "A very fast and expressive template engine." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "jsonpointer" +version = "2.3" +description = "Identify specific nodes in a JSON document (RFC 6901)" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "jsonschema" +version = "4.17.3" +description = "An implementation of JSON Schema validation for Python" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +attrs = ">=17.4.0" +fqdn = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +idna = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +isoduration = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +jsonpointer = {version = ">1.13", optional = true, markers = "extra == \"format-nongpl\""} +pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2" +rfc3339-validator = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +rfc3986-validator = {version = ">0.1.0", optional = true, markers = "extra == \"format-nongpl\""} +uri-template = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +webcolors = {version = ">=1.11", optional = true, markers = "extra == \"format-nongpl\""} + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] + +[[package]] +name = "jupyter" +version = "1.0.0" +description = "Jupyter metapackage. Install all the Jupyter components in one go." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +ipykernel = "*" +ipywidgets = "*" +jupyter-console = "*" +nbconvert = "*" +notebook = "*" +qtconsole = "*" + +[[package]] +name = "jupyter-client" +version = "7.4.8" +description = "Jupyter protocol implementation and client libraries" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +entrypoints = "*" +jupyter-core = ">=4.9.2" +nest-asyncio = ">=1.5.4" +python-dateutil = ">=2.8.2" +pyzmq = ">=23.0" +tornado = ">=6.2" +traitlets = "*" + +[package.extras] +doc = ["ipykernel", "myst-parser", "sphinx (>=1.3.6)", "sphinx-rtd-theme", "sphinxcontrib-github-alt"] +test = ["codecov", "coverage", "ipykernel (>=6.12)", "ipython", "mypy", "pre-commit", "pytest", "pytest-asyncio (>=0.18)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "jupyter-console" +version = "6.4.4" +description = "Jupyter terminal console" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +ipykernel = "*" +ipython = "*" +jupyter-client = ">=7.0.0" +prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0" +pygments = "*" + +[package.extras] +test = ["pexpect"] + +[[package]] +name = "jupyter-core" +version = "5.1.1" +description = "Jupyter core package. A base package on which Jupyter projects rely." +category = "main" +optional = false +python-versions = ">=3.8" + +[package.dependencies] +platformdirs = ">=2.5" +pywin32 = {version = ">=1.0", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} +traitlets = ">=5.3" + +[package.extras] +docs = ["myst-parser", "sphinxcontrib-github-alt", "traitlets"] +test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "jupyter-events" +version = "0.5.0" +description = "Jupyter Event System library" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +jsonschema = {version = ">=4.3.0", extras = ["format-nongpl"]} +python-json-logger = "*" +pyyaml = "*" +traitlets = "*" + +[package.extras] +cli = ["click", "rich"] +test = ["click", "coverage", "pre-commit", "pytest (>=6.1.0)", "pytest-asyncio (>=0.19.0)", "pytest-console-scripts", "pytest-cov", "rich"] + +[[package]] +name = "jupyter-server" +version = "2.0.5" +description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." +category = "main" +optional = false +python-versions = ">=3.8" + +[package.dependencies] +anyio = ">=3.1.0,<4" +argon2-cffi = "*" +jinja2 = "*" +jupyter-client = ">=7.4.4" +jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +jupyter-events = ">=0.4.0" +jupyter-server-terminals = "*" +nbconvert = ">=6.4.4" +nbformat = ">=5.3.0" +packaging = "*" +prometheus-client = "*" +pywinpty = {version = "*", markers = "os_name == \"nt\""} +pyzmq = ">=24" +send2trash = "*" +terminado = ">=0.8.3" +tornado = ">=6.2.0" +traitlets = ">=5.6.0" +websocket-client = "*" + +[package.extras] +docs = ["docutils (<0.20)", "ipykernel", "jinja2", "jupyter-client", "jupyter-server", "mistune (<1.0.0)", "myst-parser", "nbformat", "prometheus-client", "pydata-sphinx-theme", "send2trash", "sphinxcontrib-github-alt", "sphinxcontrib-openapi", "sphinxemoji", "tornado"] +test = ["ipykernel", "pre-commit", "pytest (>=7.0)", "pytest-console-scripts", "pytest-jupyter[server] (>=0.4)", "pytest-timeout", "requests"] + +[[package]] +name = "jupyter-server-terminals" +version = "0.4.3" +description = "A Jupyter Server Extension Providing Terminals." +category = "main" +optional = false +python-versions = ">=3.8" + +[package.dependencies] +pywinpty = {version = ">=2.0.3", markers = "os_name == \"nt\""} +terminado = ">=0.8.3" + +[package.extras] +docs = ["jinja2", "jupyter-server", "mistune (<3.0)", "myst-parser", "nbformat", "packaging", "pydata-sphinx-theme", "sphinxcontrib-github-alt", "sphinxcontrib-openapi", "sphinxemoji", "tornado"] +test = ["coverage", "jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-cov", "pytest-jupyter[server] (>=0.5.3)", "pytest-timeout"] + +[[package]] +name = "jupyterlab-pygments" +version = "0.2.2" +description = "Pygments theme using JupyterLab CSS variables" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "jupyterlab-widgets" +version = "3.0.5" +description = "Jupyter interactive widgets for JupyterLab" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "kiwisolver" +version = "1.4.4" +description = "A fast implementation of the Cassowary constraint solver" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "MarkupSafe" +version = "2.1.1" +description = "Safely add untrusted strings to HTML/XML markup." +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "matplotlib" +version = "3.6.1" +description = "Python plotting package" +category = "main" +optional = false +python-versions = ">=3.8" + +[package.dependencies] +contourpy = ">=1.0.1" +cycler = ">=0.10" +fonttools = ">=4.22.0" +kiwisolver = ">=1.0.1" +numpy = ">=1.19" +packaging = ">=20.0" +pillow = ">=6.2.0" +pyparsing = ">=2.2.1" +python-dateutil = ">=2.7" +setuptools_scm = ">=7" + +[[package]] +name = "matplotlib-inline" +version = "0.1.6" +description = "Inline Matplotlib backend for Jupyter" +category = "main" +optional = false +python-versions = ">=3.5" + +[package.dependencies] +traitlets = "*" + +[[package]] +name = "mistune" +version = "2.0.4" +description = "A sane Markdown parser with useful plugins and renderers" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "mypy-extensions" +version = "0.4.3" +description = "Experimental type system extensions for programs checked with the mypy typechecker." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "nbclassic" +version = "0.4.8" +description = "A web-based notebook environment for interactive computing" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +argon2-cffi = "*" +ipykernel = "*" +ipython-genutils = "*" +jinja2 = "*" +jupyter-client = ">=6.1.1" +jupyter-core = ">=4.6.1" +jupyter-server = ">=1.8" +nbconvert = ">=5" +nbformat = "*" +nest-asyncio = ">=1.5" +notebook-shim = ">=0.1.0" +prometheus-client = "*" +pyzmq = ">=17" +Send2Trash = ">=1.8.0" +terminado = ">=0.8.3" +tornado = ">=6.1" +traitlets = ">=4.2.1" + +[package.extras] +docs = ["myst-parser", "nbsphinx", "sphinx", "sphinx-rtd-theme", "sphinxcontrib-github-alt"] +json-logging = ["json-logging"] +test = ["coverage", "nbval", "pytest", "pytest-cov", "pytest-playwright", "pytest-tornasync", "requests", "requests-unixsocket", "testpath"] + +[[package]] +name = "nbclient" +version = "0.7.2" +description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." +category = "main" +optional = false +python-versions = ">=3.7.0" + +[package.dependencies] +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +nbformat = ">=5.1" +traitlets = ">=5.3" + +[package.extras] +dev = ["pre-commit"] +docs = ["autodoc-traits", "mock", "moto", "myst-parser", "nbclient[test]", "sphinx (>=1.7)", "sphinx-book-theme"] +test = ["ipykernel", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] + +[[package]] +name = "nbconvert" +version = "7.2.7" +description = "Converting Jupyter Notebooks" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +beautifulsoup4 = "*" +bleach = "*" +defusedxml = "*" +importlib-metadata = {version = ">=3.6", markers = "python_version < \"3.10\""} +jinja2 = ">=3.0" +jupyter-core = ">=4.7" +jupyterlab-pygments = "*" +markupsafe = ">=2.0" +mistune = ">=2.0.3,<3" +nbclient = ">=0.5.0" +nbformat = ">=5.1" +packaging = "*" +pandocfilters = ">=1.4.1" +pygments = ">=2.4.1" +tinycss2 = "*" +traitlets = ">=5.0" + +[package.extras] +all = ["nbconvert[docs,qtpdf,serve,test,webpdf]"] +docs = ["ipykernel", "ipython", "myst-parser", "nbsphinx (>=0.2.12)", "pydata-sphinx-theme", "sphinx (==5.0.2)"] +qtpdf = ["nbconvert[qtpng]"] +qtpng = ["pyqtwebengine (>=5.15)"] +serve = ["tornado (>=6.1)"] +test = ["ipykernel", "ipywidgets (>=7)", "pre-commit", "pytest", "pytest-dependency"] +webpdf = ["pyppeteer (>=1,<1.1)"] + +[[package]] +name = "nbformat" +version = "5.7.1" +description = "The Jupyter Notebook format" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +fastjsonschema = "*" +jsonschema = ">=2.6" +jupyter-core = "*" +traitlets = ">=5.1" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinxcontrib-github-alt"] +test = ["pep440", "pre-commit", "pytest", "testpath"] + +[[package]] +name = "nest-asyncio" +version = "1.5.6" +description = "Patch asyncio to allow nested event loops" +category = "main" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "notebook" +version = "6.5.2" +description = "A web-based notebook environment for interactive computing" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +argon2-cffi = "*" +ipykernel = "*" +ipython-genutils = "*" +jinja2 = "*" +jupyter-client = ">=5.3.4" +jupyter-core = ">=4.6.1" +nbclassic = ">=0.4.7" +nbconvert = ">=5" +nbformat = "*" +nest-asyncio = ">=1.5" +prometheus-client = "*" +pyzmq = ">=17" +Send2Trash = ">=1.8.0" +terminado = ">=0.8.3" +tornado = ">=6.1" +traitlets = ">=4.2.1" + +[package.extras] +docs = ["myst-parser", "nbsphinx", "sphinx", "sphinx-rtd-theme", "sphinxcontrib-github-alt"] +json-logging = ["json-logging"] +test = ["coverage", "nbval", "pytest", "pytest-cov", "requests", "requests-unixsocket", "selenium (==4.1.5)", "testpath"] + +[[package]] +name = "notebook-shim" +version = "0.2.2" +description = "A shim layer for notebook traits and config" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +jupyter-server = ">=1.8,<3" + +[package.extras] +test = ["pytest", "pytest-console-scripts", "pytest-tornasync"] + +[[package]] +name = "numpy" +version = "1.23.4" +description = "NumPy is the fundamental package for array computing with Python." +category = "main" +optional = false +python-versions = ">=3.8" + +[[package]] +name = "packaging" +version = "21.3" +description = "Core utilities for Python packages" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" + +[[package]] +name = "pandocfilters" +version = "1.5.0" +description = "Utilities for writing pandoc filters in python" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "parso" +version = "0.8.3" +description = "A Python Parser" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +testing = ["docopt", "pytest (<6.0.0)"] + +[[package]] +name = "pathspec" +version = "0.10.1" +description = "Utility library for gitignore style pattern matching of file paths." +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "pexpect" +version = "4.8.0" +description = "Pexpect allows easy control of interactive console applications." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +name = "pickleshare" +version = "0.7.5" +description = "Tiny 'shelve'-like database with concurrency support" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "Pillow" +version = "9.3.0" +description = "Python Imaging Library (Fork)" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-issues (>=3.0.1)", "sphinx-removed-in", "sphinxext-opengraph"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "platformdirs" +version = "2.5.2" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx (>=4)", "sphinx-autodoc-typehints (>=1.12)"] +test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] + +[[package]] +name = "prometheus-client" +version = "0.15.0" +description = "Python client for the Prometheus monitoring system." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +twisted = ["twisted"] + +[[package]] +name = "prompt-toolkit" +version = "3.0.36" +description = "Library for building powerful interactive command lines in Python" +category = "main" +optional = false +python-versions = ">=3.6.2" + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "psutil" +version = "5.9.4" +description = "Cross-platform lib for process and system monitoring in Python." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.extras] +test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "pure-eval" +version = "0.2.2" +description = "Safely evaluate AST nodes without side effects" +category = "main" +optional = false +python-versions = "*" + +[package.extras] +tests = ["pytest"] + +[[package]] +name = "py" +version = "1.11.0" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "Pygments" +version = "2.13.0" +description = "Pygments is a syntax highlighting package written in Python." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +plugins = ["importlib-metadata"] + +[[package]] +name = "pyobjc-core" +version = "8.5.1" +description = "Python<->ObjC Interoperability Module" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "pyobjc-framework-Cocoa" +version = "8.5.1" +description = "Wrappers for the Cocoa frameworks on macOS" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +pyobjc-core = ">=8.5.1" + +[[package]] +name = "pyobjc-framework-CoreBluetooth" +version = "8.5.1" +description = "Wrappers for the framework CoreBluetooth on macOS" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +pyobjc-core = ">=8.5.1" +pyobjc-framework-Cocoa = ">=8.5.1" + +[[package]] +name = "pyobjc-framework-libdispatch" +version = "8.5.1" +description = "Wrappers for libdispatch on macOS" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +pyobjc-core = ">=8.5.1" + +[[package]] +name = "pyparsing" +version = "3.0.9" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +category = "main" +optional = false +python-versions = ">=3.6.8" + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + +[[package]] +name = "pyrsistent" +version = "0.19.2" +description = "Persistent/Functional/Immutable data structures" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-json-logger" +version = "2.0.4" +description = "A python library adding a json log formatter" +category = "main" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "pywin32" +version = "305" +description = "Python for Window Extensions" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "pywinpty" +version = "2.0.9" +description = "Pseudo terminal support for Windows from Python." +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "PyYAML" +version = "6.0" +description = "YAML parser and emitter for Python" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "pyzmq" +version = "24.0.1" +description = "Python bindings for 0MQ" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +cffi = {version = "*", markers = "implementation_name == \"pypy\""} +py = {version = "*", markers = "implementation_name == \"pypy\""} + +[[package]] +name = "qtconsole" +version = "5.4.0" +description = "Jupyter Qt console" +category = "main" +optional = false +python-versions = ">= 3.7" + +[package.dependencies] +ipykernel = ">=4.1" +ipython-genutils = "*" +jupyter-client = ">=4.1" +jupyter-core = "*" +pygments = "*" +pyzmq = ">=17.1" +qtpy = ">=2.0.1" +traitlets = "<5.2.1 || >5.2.1,<5.2.2 || >5.2.2" + +[package.extras] +doc = ["Sphinx (>=1.3)"] +test = ["flaky", "pytest", "pytest-qt"] + +[[package]] +name = "QtPy" +version = "2.3.0" +description = "Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6)." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +packaging = "*" + +[package.extras] +test = ["pytest (>=6,!=7.0.0,!=7.0.1)", "pytest-cov (>=3.0.0)", "pytest-qt"] + +[[package]] +name = "rfc3339-validator" +version = "0.1.4" +description = "A pure python RFC3339 validator" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +six = "*" + +[[package]] +name = "rfc3986-validator" +version = "0.1.1" +description = "Pure python rfc3986 validator" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "Send2Trash" +version = "1.8.0" +description = "Send file to trash natively under Mac OS X, Windows and Linux." +category = "main" +optional = false +python-versions = "*" + +[package.extras] +nativelib = ["pyobjc-framework-Cocoa", "pywin32"] +objc = ["pyobjc-framework-Cocoa"] +win32 = ["pywin32"] + +[[package]] +name = "setuptools" +version = "65.5.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mock", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "setuptools-scm" +version = "7.0.5" +description = "the blessed package to manage your versions by scm tags" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +packaging = ">=20.0" +setuptools = "*" +tomli = ">=1.0.0" +typing-extensions = "*" + +[package.extras] +test = ["pytest (>=6.2)", "virtualenv (>20)"] +toml = ["setuptools (>=42)"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "sniffio" +version = "1.3.0" +description = "Sniff out which async library your code is running under" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "soupsieve" +version = "2.3.2.post1" +description = "A modern CSS selector implementation for Beautiful Soup." +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "stack-data" +version = "0.6.2" +description = "Extract data from python stack frames and tracebacks for informative displays" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +asttokens = ">=2.1.0" +executing = ">=1.2.0" +pure-eval = "*" + +[package.extras] +tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] + +[[package]] +name = "terminado" +version = "0.17.1" +description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +ptyprocess = {version = "*", markers = "os_name != \"nt\""} +pywinpty = {version = ">=1.1.0", markers = "os_name == \"nt\""} +tornado = ">=6.1.0" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["pre-commit", "pytest (>=7.0)", "pytest-timeout"] + +[[package]] +name = "tinycss2" +version = "1.2.1" +description = "A tiny CSS parser" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +webencodings = ">=0.4" + +[package.extras] +doc = ["sphinx", "sphinx_rtd_theme"] +test = ["flake8", "isort", "pytest"] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "tornado" +version = "6.2" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +category = "main" +optional = false +python-versions = ">= 3.7" + +[[package]] +name = "traitlets" +version = "5.8.0" +description = "Traitlets Python configuration system" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] + +[[package]] +name = "typing-extensions" +version = "4.4.0" +description = "Backported and Experimental Type Hints for Python 3.7+" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "uri-template" +version = "1.2.0" +description = "RFC 6570 URI Template Processor" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +dev = ["flake8 (<4.0.0)", "flake8-annotations", "flake8-bugbear", "flake8-commas", "flake8-comprehensions", "flake8-continuation", "flake8-datetimez", "flake8-docstrings", "flake8-import-order", "flake8-literal", "flake8-noqa", "flake8-requirements", "flake8-type-annotations", "flake8-use-fstring", "mypy", "pep8-naming"] + +[[package]] +name = "wcwidth" +version = "0.2.5" +description = "Measures the displayed width of unicode strings in a terminal" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "webcolors" +version = "1.12" +description = "A library for working with color names and color values formats defined by HTML and CSS." +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "websocket-client" +version = "1.4.2" +description = "WebSocket client for Python with low level API options" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["Sphinx (>=3.4)", "sphinx-rtd-theme (>=0.5)"] +optional = ["python-socks", "wsaccel"] +test = ["websockets"] + +[[package]] +name = "widgetsnbextension" +version = "4.0.5" +description = "Jupyter interactive widgets for Jupyter Notebook" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "zipp" +version = "3.11.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] +testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] + +[metadata] +lock-version = "1.1" +python-versions = "^3.9" +content-hash = "d840857060a2396d6f1dfc8d2fdbdfc646e4043d8b4809259ef0f9b6f0c94c3d" + +[metadata.files] +anyio = [ + {file = "anyio-3.6.2-py3-none-any.whl", hash = "sha256:fbbe32bd270d2a2ef3ed1c5d45041250284e31fc0a4df4a5a6071842051a51e3"}, + {file = "anyio-3.6.2.tar.gz", hash = "sha256:25ea0d673ae30af41a0c442f81cf3b38c7e79fdc7b60335a4c14e05eb0947421"}, +] +appnope = [ + {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, + {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, +] +argon2-cffi = [ + {file = "argon2-cffi-21.3.0.tar.gz", hash = "sha256:d384164d944190a7dd7ef22c6aa3ff197da12962bd04b17f64d4e93d934dba5b"}, + {file = "argon2_cffi-21.3.0-py3-none-any.whl", hash = "sha256:8c976986f2c5c0e5000919e6de187906cfd81fb1c72bf9d88c01177e77da7f80"}, +] +argon2-cffi-bindings = [ + {file = "argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f"}, + {file = "argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3e385d1c39c520c08b53d63300c3ecc28622f076f4c2b0e6d7e796e9f6502194"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3e3cc67fdb7d82c4718f19b4e7a87123caf8a93fde7e23cf66ac0337d3cb3f"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a22ad9800121b71099d0fb0a65323810a15f2e292f2ba450810a7316e128ee5"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9f8b450ed0547e3d473fdc8612083fd08dd2120d6ac8f73828df9b7d45bb351"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:93f9bf70084f97245ba10ee36575f0c3f1e7d7724d67d8e5b08e61787c320ed7"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3b9ef65804859d335dc6b31582cad2c5166f0c3e7975f324d9ffaa34ee7e6583"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4966ef5848d820776f5f562a7d45fdd70c2f330c961d0d745b784034bd9f48d"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ef543a89dee4db46a1a6e206cd015360e5a75822f76df533845c3cbaf72670"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2937d286e2ad0cc79a7087d3c272832865f779430e0cc2b4f3718d3159b0cb"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5e00316dabdaea0b2dd82d141cc66889ced0cdcbfa599e8b471cf22c620c329a"}, +] +arrow = [ + {file = "arrow-1.2.3-py3-none-any.whl", hash = "sha256:5a49ab92e3b7b71d96cd6bfcc4df14efefc9dfa96ea19045815914a6ab6b1fe2"}, + {file = "arrow-1.2.3.tar.gz", hash = "sha256:3934b30ca1b9f292376d9db15b19446088d12ec58629bc3f0da28fd55fb633a1"}, +] +asttokens = [ + {file = "asttokens-2.2.1-py2.py3-none-any.whl", hash = "sha256:6b0ac9e93fb0335014d382b8fa9b3afa7df546984258005da0b9e7095b3deb1c"}, + {file = "asttokens-2.2.1.tar.gz", hash = "sha256:4622110b2a6f30b77e1473affaa97e711bc2f07d3f10848420ff1898edbe94f3"}, +] +async-timeout = [ + {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, + {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, +] +attrs = [ + {file = "attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"}, + {file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"}, +] +backcall = [ + {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, + {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, +] +beautifulsoup4 = [ + {file = "beautifulsoup4-4.11.1-py3-none-any.whl", hash = "sha256:58d5c3d29f5a36ffeb94f02f0d786cd53014cf9b3b3951d42e0080d8a9498d30"}, + {file = "beautifulsoup4-4.11.1.tar.gz", hash = "sha256:ad9aa55b65ef2808eb405f46cf74df7fcb7044d5cbc26487f96eb2ef2e436693"}, +] +black = [ + {file = "black-22.10.0-1fixedarch-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:5cc42ca67989e9c3cf859e84c2bf014f6633db63d1cbdf8fdb666dcd9e77e3fa"}, + {file = "black-22.10.0-1fixedarch-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:5d8f74030e67087b219b032aa33a919fae8806d49c867846bfacde57f43972ef"}, + {file = "black-22.10.0-1fixedarch-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:197df8509263b0b8614e1df1756b1dd41be6738eed2ba9e9769f3880c2b9d7b6"}, + {file = "black-22.10.0-1fixedarch-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:2644b5d63633702bc2c5f3754b1b475378fbbfb481f62319388235d0cd104c2d"}, + {file = "black-22.10.0-1fixedarch-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:e41a86c6c650bcecc6633ee3180d80a025db041a8e2398dcc059b3afa8382cd4"}, + {file = "black-22.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2039230db3c6c639bd84efe3292ec7b06e9214a2992cd9beb293d639c6402edb"}, + {file = "black-22.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14ff67aec0a47c424bc99b71005202045dc09270da44a27848d534600ac64fc7"}, + {file = "black-22.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:819dc789f4498ecc91438a7de64427c73b45035e2e3680c92e18795a839ebb66"}, + {file = "black-22.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5b9b29da4f564ba8787c119f37d174f2b69cdfdf9015b7d8c5c16121ddc054ae"}, + {file = "black-22.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b49776299fece66bffaafe357d929ca9451450f5466e997a7285ab0fe28e3b"}, + {file = "black-22.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:21199526696b8f09c3997e2b4db8d0b108d801a348414264d2eb8eb2532e540d"}, + {file = "black-22.10.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e464456d24e23d11fced2bc8c47ef66d471f845c7b7a42f3bd77bf3d1789650"}, + {file = "black-22.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9311e99228ae10023300ecac05be5a296f60d2fd10fff31cf5c1fa4ca4b1988d"}, + {file = "black-22.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fba8a281e570adafb79f7755ac8721b6cf1bbf691186a287e990c7929c7692ff"}, + {file = "black-22.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:915ace4ff03fdfff953962fa672d44be269deb2eaf88499a0f8805221bc68c87"}, + {file = "black-22.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:444ebfb4e441254e87bad00c661fe32df9969b2bf224373a448d8aca2132b395"}, + {file = "black-22.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:974308c58d057a651d182208a484ce80a26dac0caef2895836a92dd6ebd725e0"}, + {file = "black-22.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72ef3925f30e12a184889aac03d77d031056860ccae8a1e519f6cbb742736383"}, + {file = "black-22.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:432247333090c8c5366e69627ccb363bc58514ae3e63f7fc75c54b1ea80fa7de"}, + {file = "black-22.10.0-py3-none-any.whl", hash = "sha256:c957b2b4ea88587b46cf49d1dc17681c1e672864fd7af32fc1e9664d572b3458"}, + {file = "black-22.10.0.tar.gz", hash = "sha256:f513588da599943e0cde4e32cc9879e825d58720d6557062d1098c5ad80080e1"}, +] +bleach = [ + {file = "bleach-5.0.1-py3-none-any.whl", hash = "sha256:085f7f33c15bd408dd9b17a4ad77c577db66d76203e5984b1bd59baeee948b2a"}, + {file = "bleach-5.0.1.tar.gz", hash = "sha256:0d03255c47eb9bd2f26aa9bb7f2107732e7e8fe195ca2f64709fcf3b0a4a085c"}, +] +bleak = [ + {file = "bleak-0.19.0-py3-none-any.whl", hash = "sha256:ccdba0d17dcceb1326e4e46600b37e9019cd52ce01948e2a3dbd6c94d1e4de01"}, + {file = "bleak-0.19.0.tar.gz", hash = "sha256:cce5200ca9bac7daaa74dd009c867c8c2b161a124e234c74307462e86caf50e6"}, +] +bleak-winrt = [ + {file = "bleak-winrt-1.2.0.tar.gz", hash = "sha256:0577d070251b9354fc6c45ffac57e39341ebb08ead014b1bdbd43e211d2ce1d6"}, + {file = "bleak_winrt-1.2.0-cp310-cp310-win32.whl", hash = "sha256:a2ae3054d6843ae0cfd3b94c83293a1dfd5804393977dd69bde91cb5099fc47c"}, + {file = "bleak_winrt-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:677df51dc825c6657b3ae94f00bd09b8ab88422b40d6a7bdbf7972a63bc44e9a"}, + {file = "bleak_winrt-1.2.0-cp311-cp311-win32.whl", hash = "sha256:9449cdb942f22c9892bc1ada99e2ccce9bea8a8af1493e81fefb6de2cb3a7b80"}, + {file = "bleak_winrt-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:98c1b5a6a6c431ac7f76aa4285b752fe14a1c626bd8a1dfa56f66173ff120bee"}, + {file = "bleak_winrt-1.2.0-cp37-cp37m-win32.whl", hash = "sha256:623ac511696e1f58d83cb9c431e32f613395f2199b3db7f125a3d872cab968a4"}, + {file = "bleak_winrt-1.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:13ab06dec55469cf51a2c187be7b630a7a2922e1ea9ac1998135974a7239b1e3"}, + {file = "bleak_winrt-1.2.0-cp38-cp38-win32.whl", hash = "sha256:5a36ff8cd53068c01a795a75d2c13054ddc5f99ce6de62c1a97cd343fc4d0727"}, + {file = "bleak_winrt-1.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:810c00726653a962256b7acd8edf81ab9e4a3c66e936a342ce4aec7dbd3a7263"}, + {file = "bleak_winrt-1.2.0-cp39-cp39-win32.whl", hash = "sha256:dd740047a08925bde54bec357391fcee595d7b8ca0c74c87170a5cbc3f97aa0a"}, + {file = "bleak_winrt-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:63130c11acfe75c504a79c01f9919e87f009f5e742bfc7b7a5c2a9c72bf591a7"}, +] +cffi = [ + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, +] +click = [ + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, +] +colorama = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] +comm = [ + {file = "comm-0.1.2-py3-none-any.whl", hash = "sha256:9f3abf3515112fa7c55a42a6a5ab358735c9dccc8b5910a9d8e3ef5998130666"}, + {file = "comm-0.1.2.tar.gz", hash = "sha256:3e2f5826578e683999b93716285b3b1f344f157bf75fa9ce0a797564e742f062"}, +] +contourpy = [ + {file = "contourpy-1.0.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:613c665529899b5d9fade7e5d1760111a0b011231277a0d36c49f0d3d6914bd6"}, + {file = "contourpy-1.0.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:78ced51807ccb2f45d4ea73aca339756d75d021069604c2fccd05390dc3c28eb"}, + {file = "contourpy-1.0.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b3b1bd7577c530eaf9d2bc52d1a93fef50ac516a8b1062c3d1b9bcec9ebe329b"}, + {file = "contourpy-1.0.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8834c14b8c3dd849005e06703469db9bf96ba2d66a3f88ecc539c9a8982e0ee"}, + {file = "contourpy-1.0.6-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4052a8a4926d4468416fc7d4b2a7b2a3e35f25b39f4061a7e2a3a2748c4fc48"}, + {file = "contourpy-1.0.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c0e1308307a75e07d1f1b5f0f56b5af84538a5e9027109a7bcf6cb47c434e72"}, + {file = "contourpy-1.0.6-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9fc4e7973ed0e1fe689435842a6e6b330eb7ccc696080dda9a97b1a1b78e41db"}, + {file = "contourpy-1.0.6-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:08e8d09d96219ace6cb596506fb9b64ea5f270b2fb9121158b976d88871fcfd1"}, + {file = "contourpy-1.0.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f33da6b5d19ad1bb5e7ad38bb8ba5c426d2178928bc2b2c44e8823ea0ecb6ff3"}, + {file = "contourpy-1.0.6-cp310-cp310-win32.whl", hash = "sha256:12a7dc8439544ed05c6553bf026d5e8fa7fad48d63958a95d61698df0e00092b"}, + {file = "contourpy-1.0.6-cp310-cp310-win_amd64.whl", hash = "sha256:eadad75bf91897f922e0fb3dca1b322a58b1726a953f98c2e5f0606bd8408621"}, + {file = "contourpy-1.0.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:913bac9d064cff033cf3719e855d4f1db9f1c179e0ecf3ba9fdef21c21c6a16a"}, + {file = "contourpy-1.0.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46deb310a276cc5c1fd27958e358cce68b1e8a515fa5a574c670a504c3a3fe30"}, + {file = "contourpy-1.0.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b64f747e92af7da3b85631a55d68c45a2d728b4036b03cdaba4bd94bcc85bd6f"}, + {file = "contourpy-1.0.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50627bf76abb6ba291ad08db583161939c2c5fab38c38181b7833423ab9c7de3"}, + {file = "contourpy-1.0.6-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:358f6364e4873f4d73360b35da30066f40387dd3c427a3e5432c6b28dd24a8fa"}, + {file = "contourpy-1.0.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c78bfbc1a7bff053baf7e508449d2765964d67735c909b583204e3240a2aca45"}, + {file = "contourpy-1.0.6-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e43255a83835a129ef98f75d13d643844d8c646b258bebd11e4a0975203e018f"}, + {file = "contourpy-1.0.6-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:375d81366afd547b8558c4720337218345148bc2fcffa3a9870cab82b29667f2"}, + {file = "contourpy-1.0.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b98c820608e2dca6442e786817f646d11057c09a23b68d2b3737e6dcb6e4a49b"}, + {file = "contourpy-1.0.6-cp311-cp311-win32.whl", hash = "sha256:0e4854cc02006ad6684ce092bdadab6f0912d131f91c2450ce6dbdea78ee3c0b"}, + {file = "contourpy-1.0.6-cp311-cp311-win_amd64.whl", hash = "sha256:d2eff2af97ea0b61381828b1ad6cd249bbd41d280e53aea5cccd7b2b31b8225c"}, + {file = "contourpy-1.0.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5b117d29433fc8393b18a696d794961464e37afb34a6eeb8b2c37b5f4128a83e"}, + {file = "contourpy-1.0.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:341330ed19074f956cb20877ad8d2ae50e458884bfa6a6df3ae28487cc76c768"}, + {file = "contourpy-1.0.6-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:371f6570a81dfdddbb837ba432293a63b4babb942a9eb7aaa699997adfb53278"}, + {file = "contourpy-1.0.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9447c45df407d3ecb717d837af3b70cfef432138530712263730783b3d016512"}, + {file = "contourpy-1.0.6-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:730c27978a0003b47b359935478b7d63fd8386dbb2dcd36c1e8de88cbfc1e9de"}, + {file = "contourpy-1.0.6-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:da1ef35fd79be2926ba80fbb36327463e3656c02526e9b5b4c2b366588b74d9a"}, + {file = "contourpy-1.0.6-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:cd2bc0c8f2e8de7dd89a7f1c10b8844e291bca17d359373203ef2e6100819edd"}, + {file = "contourpy-1.0.6-cp37-cp37m-win32.whl", hash = "sha256:3a1917d3941dd58732c449c810fa7ce46cc305ce9325a11261d740118b85e6f3"}, + {file = "contourpy-1.0.6-cp37-cp37m-win_amd64.whl", hash = "sha256:06ca79e1efbbe2df795822df2fa173d1a2b38b6e0f047a0ec7903fbca1d1847e"}, + {file = "contourpy-1.0.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e626cefff8491bce356221c22af5a3ea528b0b41fbabc719c00ae233819ea0bf"}, + {file = "contourpy-1.0.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dbe6fe7a1166b1ddd7b6d887ea6fa8389d3f28b5ed3f73a8f40ece1fc5a3d340"}, + {file = "contourpy-1.0.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e13b31d1b4b68db60b3b29f8e337908f328c7f05b9add4b1b5c74e0691180109"}, + {file = "contourpy-1.0.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a79d239fc22c3b8d9d3de492aa0c245533f4f4c7608e5749af866949c0f1b1b9"}, + {file = "contourpy-1.0.6-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e8e686a6db92a46111a1ee0ee6f7fbfae4048f0019de207149f43ac1812cf95"}, + {file = "contourpy-1.0.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acd2bd02f1a7adff3a1f33e431eb96ab6d7987b039d2946a9b39fe6fb16a1036"}, + {file = "contourpy-1.0.6-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:03d1b9c6b44a9e30d554654c72be89af94fab7510b4b9f62356c64c81cec8b7d"}, + {file = "contourpy-1.0.6-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b48d94386f1994db7c70c76b5808c12e23ed7a4ee13693c2fc5ab109d60243c0"}, + {file = "contourpy-1.0.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:208bc904889c910d95aafcf7be9e677726df9ef71e216780170dbb7e37d118fa"}, + {file = "contourpy-1.0.6-cp38-cp38-win32.whl", hash = "sha256:444fb776f58f4906d8d354eb6f6ce59d0a60f7b6a720da6c1ccb839db7c80eb9"}, + {file = "contourpy-1.0.6-cp38-cp38-win_amd64.whl", hash = "sha256:9bc407a6af672da20da74823443707e38ece8b93a04009dca25856c2d9adadb1"}, + {file = "contourpy-1.0.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:aa4674cf3fa2bd9c322982644967f01eed0c91bb890f624e0e0daf7a5c3383e9"}, + {file = "contourpy-1.0.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6f56515e7c6fae4529b731f6c117752247bef9cdad2b12fc5ddf8ca6a50965a5"}, + {file = "contourpy-1.0.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:344cb3badf6fc7316ad51835f56ac387bdf86c8e1b670904f18f437d70da4183"}, + {file = "contourpy-1.0.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b1e66346acfb17694d46175a0cea7d9036f12ed0c31dfe86f0f405eedde2bdd"}, + {file = "contourpy-1.0.6-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8468b40528fa1e15181cccec4198623b55dcd58306f8815a793803f51f6c474a"}, + {file = "contourpy-1.0.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1dedf4c64185a216c35eb488e6f433297c660321275734401760dafaeb0ad5c2"}, + {file = "contourpy-1.0.6-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:494efed2c761f0f37262815f9e3c4bb9917c5c69806abdee1d1cb6611a7174a0"}, + {file = "contourpy-1.0.6-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:75a2e638042118118ab39d337da4c7908c1af74a8464cad59f19fbc5bbafec9b"}, + {file = "contourpy-1.0.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a628bba09ba72e472bf7b31018b6281fd4cc903f0888049a3724afba13b6e0b8"}, + {file = "contourpy-1.0.6-cp39-cp39-win32.whl", hash = "sha256:e1739496c2f0108013629aa095cc32a8c6363444361960c07493818d0dea2da4"}, + {file = "contourpy-1.0.6-cp39-cp39-win_amd64.whl", hash = "sha256:a457ee72d9032e86730f62c5eeddf402e732fdf5ca8b13b41772aa8ae13a4563"}, + {file = "contourpy-1.0.6-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d912f0154a20a80ea449daada904a7eb6941c83281a9fab95de50529bfc3a1da"}, + {file = "contourpy-1.0.6-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4081918147fc4c29fad328d5066cfc751da100a1098398742f9f364be63803fc"}, + {file = "contourpy-1.0.6-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0537cc1195245bbe24f2913d1f9211b8f04eb203de9044630abd3664c6cc339c"}, + {file = "contourpy-1.0.6-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcd556c8fc37a342dd636d7eef150b1399f823a4462f8c968e11e1ebeabee769"}, + {file = "contourpy-1.0.6-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:f6ca38dd8d988eca8f07305125dec6f54ac1c518f1aaddcc14d08c01aebb6efc"}, + {file = "contourpy-1.0.6-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c1baa49ab9fedbf19d40d93163b7d3e735d9cd8d5efe4cce9907902a6dad391f"}, + {file = "contourpy-1.0.6-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:211dfe2bd43bf5791d23afbe23a7952e8ac8b67591d24be3638cabb648b3a6eb"}, + {file = "contourpy-1.0.6-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c38c6536c2d71ca2f7e418acaf5bca30a3af7f2a2fa106083c7d738337848dbe"}, + {file = "contourpy-1.0.6-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b1ee48a130da4dd0eb8055bbab34abf3f6262957832fd575e0cab4979a15a41"}, + {file = "contourpy-1.0.6-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5641927cc5ae66155d0c80195dc35726eae060e7defc18b7ab27600f39dd1fe7"}, + {file = "contourpy-1.0.6-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7ee394502026d68652c2824348a40bf50f31351a668977b51437131a90d777ea"}, + {file = "contourpy-1.0.6-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b97454ed5b1368b66ed414c754cba15b9750ce69938fc6153679787402e4cdf"}, + {file = "contourpy-1.0.6-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0236875c5a0784215b49d00ebbe80c5b6b5d5244b3655a36dda88105334dea17"}, + {file = "contourpy-1.0.6-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84c593aeff7a0171f639da92cb86d24954bbb61f8a1b530f74eb750a14685832"}, + {file = "contourpy-1.0.6-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:9b0e7fe7f949fb719b206548e5cde2518ffb29936afa4303d8a1c4db43dcb675"}, + {file = "contourpy-1.0.6.tar.gz", hash = "sha256:6e459ebb8bb5ee4c22c19cc000174f8059981971a33ce11e17dddf6aca97a142"}, +] +cycler = [ + {file = "cycler-0.11.0-py3-none-any.whl", hash = "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3"}, + {file = "cycler-0.11.0.tar.gz", hash = "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"}, +] +dbus-fast = [ + {file = "dbus_fast-1.64.0-cp310-cp310-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:d6ee2acd48a6f22836a0782786c0f617a70bd33353100028a26b351e653c83a4"}, + {file = "dbus_fast-1.64.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff97c83a30ccf9ffe43df1721f0bff90fdfbe39a583c77a52932046b5f707b9c"}, + {file = "dbus_fast-1.64.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6d912844d3763140fdb4d9c474d1d86e8129c9a498e1cbcdf54ac71811a081df"}, + {file = "dbus_fast-1.64.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:48248467c8cc25af0bf42676f337ee8b56a2c8c3b9df1eb7a51f649e74401343"}, + {file = "dbus_fast-1.64.0-cp311-cp311-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:f44e5b3025db2f0c689afc34478fa3d522c45af5721aacebcfc4c3e9c268b23a"}, + {file = "dbus_fast-1.64.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:939417ecc4ea438ba9287f2a8df92329eb87179c69f627d3eb27af609ac59446"}, + {file = "dbus_fast-1.64.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3cace85b55be5f82f2bb51f98d834f92e572668a05f6492e96ea90a8728a2983"}, + {file = "dbus_fast-1.64.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fa2e77bef181d3e9f72176ad750da2b448b2000238cef56dafa1b08093a78a90"}, + {file = "dbus_fast-1.64.0-cp37-cp37m-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:5b04c84d0345fba5ceb6bb56bfa5c3f34a3a9995a2d1ea17857c1e2e50cc4a26"}, + {file = "dbus_fast-1.64.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72275f7054c683b2c340d0a6baf922fa0d0cef9ec00cb2262d2242d3c428b8d8"}, + {file = "dbus_fast-1.64.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b235c111dd9746f3d2a4c2ce1f9d7c255fe6ba64537551154d10599f9aef279c"}, + {file = "dbus_fast-1.64.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:fad7108eddd552ccca7a7b49bd61848bc6936bdaf1dd9a4e4c6b031c25b61c9c"}, + {file = "dbus_fast-1.64.0-cp38-cp38-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:76301537ebf0ca4fe9b42f1463038386728d5655817639b1f62737126f85ed09"}, + {file = "dbus_fast-1.64.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99eda460d32673d1261cfa9422d356f5d09dc10dd094158a9e8e19903991af3c"}, + {file = "dbus_fast-1.64.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:78cee1896db352fbddac0c3eb91f0c97f93627b6f010b4987ac0b724a88020fa"}, + {file = "dbus_fast-1.64.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:660f824f3a13d5b18140ee356823ae0fb263d4c182451130fd2b1e594b9bad1a"}, + {file = "dbus_fast-1.64.0-cp39-cp39-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:838254b626427d919c652fe3fc5841a6c6f20b3c12e5335d7d32124111161461"}, + {file = "dbus_fast-1.64.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb73f5a364ab22151892d349991ae57a3d4e18fa4c6a6d0134f5a0b8cfaefc8"}, + {file = "dbus_fast-1.64.0-cp39-cp39-manylinux_2_31_x86_64.whl", hash = "sha256:c0d3e18a2b793e7e774773190db631b729bd7ca0b88c63415e286fbe7f4c8320"}, + {file = "dbus_fast-1.64.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a0a4e64ac5a994239cb1200cfc7ce9d2173233c9a5f3f48dca3bf3ca3e8e132a"}, + {file = "dbus_fast-1.64.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d27260f6998f614dfb9c9fa2c9674402134e8a221b57f52a7dfecce2bed2df37"}, + {file = "dbus_fast-1.64.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:735feead084951a1daf9c71480f4bfe84b127cacd9af0fddf70cdf7043f7a29c"}, + {file = "dbus_fast-1.64.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:025583c613beb58abd24e993e3be6098002eac9d01afff1e7180e5ddbbf74772"}, + {file = "dbus_fast-1.64.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:09488197ffc535ad62d048e532e127d12e4878a3af8b7cd5cf34819f1bd6ddca"}, + {file = "dbus_fast-1.64.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9d395687bcd0098cdacdfb8c1897c81998aabd07c13dd599e8fa2e73f04f704"}, + {file = "dbus_fast-1.64.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:830f028efa0753f6833a7f6491789436cfc63debdfac697465e334f3dd7c14d6"}, + {file = "dbus_fast-1.64.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d2cec285c42c1fe4921ae879e975693376bd9c815494c354aa1b63fb40bbfaf"}, + {file = "dbus_fast-1.64.0.tar.gz", hash = "sha256:794d67fc6369962bb291edf68c76a4b10a5f019c6c9b0458ca22c0d318cea659"}, +] +debugpy = [ + {file = "debugpy-1.6.4-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:6ae238943482c78867ac707c09122688efb700372b617ffd364261e5e41f7a2f"}, + {file = "debugpy-1.6.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a39e7da178e1f22f4bc04b57f085e785ed1bcf424aaf318835a1a7129eefe35"}, + {file = "debugpy-1.6.4-cp310-cp310-win32.whl", hash = "sha256:143f79d0798a9acea21cd1d111badb789f19d414aec95fa6389cfea9485ddfb1"}, + {file = "debugpy-1.6.4-cp310-cp310-win_amd64.whl", hash = "sha256:563f148f94434365ec0ce94739c749aabf60bf67339e68a9446499f3582d62f3"}, + {file = "debugpy-1.6.4-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:1caee68f7e254267df908576c0d0938f8f88af16383f172cb9f0602e24c30c01"}, + {file = "debugpy-1.6.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40e2a83d31a16b83666f19fa06d97b2cc311af88e6266590579737949971a17e"}, + {file = "debugpy-1.6.4-cp37-cp37m-win32.whl", hash = "sha256:82229790442856962aec4767b98ba2559fe0998f897e9f21fb10b4fd24b6c436"}, + {file = "debugpy-1.6.4-cp37-cp37m-win_amd64.whl", hash = "sha256:67edf033f9e512958f7b472975ff9d9b7ff64bf4440f6f6ae44afdc66b89e6b6"}, + {file = "debugpy-1.6.4-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:4ab5e938925e5d973f567d6ef32751b17d10f3be3a8c4d73c52f53e727f69bf1"}, + {file = "debugpy-1.6.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8df268e9f72fc06efc2e75e8dc8e2b881d6a397356faec26efb2ee70b6863b7"}, + {file = "debugpy-1.6.4-cp38-cp38-win32.whl", hash = "sha256:86bd25f38f8b6c5d430a5e2931eebbd5f580c640f4819fcd236d0498790c7204"}, + {file = "debugpy-1.6.4-cp38-cp38-win_amd64.whl", hash = "sha256:62ba4179b372a62abf9c89b56997d70a4100c6dea6c2a4e0e4be5f45920b3253"}, + {file = "debugpy-1.6.4-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:d2968e589bda4e485a9c61f113754a28e48d88c5152ed8e0b2564a1fadbe50a5"}, + {file = "debugpy-1.6.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e62b8034ede98932b92268669318848a0d42133d857087a3b9cec03bb844c615"}, + {file = "debugpy-1.6.4-cp39-cp39-win32.whl", hash = "sha256:3d9c31baf64bf959a593996c108e911c5a9aa1693a296840e5469473f064bcec"}, + {file = "debugpy-1.6.4-cp39-cp39-win_amd64.whl", hash = "sha256:ea4bf208054e6d41749f17612066da861dff10102729d32c85b47f155223cf2b"}, + {file = "debugpy-1.6.4-py2.py3-none-any.whl", hash = "sha256:e886a1296cd20a10172e94788009ce74b759e54229ebd64a43fa5c2b4e62cd76"}, + {file = "debugpy-1.6.4.zip", hash = "sha256:d5ab9bd3f4e7faf3765fd52c7c43c074104ab1e109621dc73219099ed1a5399d"}, +] +decorator = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] +defusedxml = [ + {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, + {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, +] +entrypoints = [ + {file = "entrypoints-0.4-py3-none-any.whl", hash = "sha256:f174b5ff827504fd3cd97cc3f8649f3693f51538c7e4bdf3ef002c8429d42f9f"}, + {file = "entrypoints-0.4.tar.gz", hash = "sha256:b706eddaa9218a19ebcd67b56818f05bb27589b1ca9e8d797b74affad4ccacd4"}, +] +executing = [ + {file = "executing-1.2.0-py2.py3-none-any.whl", hash = "sha256:0314a69e37426e3608aada02473b4161d4caf5a4b244d1d0c48072b8fee7bacc"}, + {file = "executing-1.2.0.tar.gz", hash = "sha256:19da64c18d2d851112f09c287f8d3dbbdf725ab0e569077efb6cdcbd3497c107"}, +] +fastjsonschema = [ + {file = "fastjsonschema-2.16.2-py3-none-any.whl", hash = "sha256:21f918e8d9a1a4ba9c22e09574ba72267a6762d47822db9add95f6454e51cc1c"}, + {file = "fastjsonschema-2.16.2.tar.gz", hash = "sha256:01e366f25d9047816fe3d288cbfc3e10541daf0af2044763f3d0ade42476da18"}, +] +fonttools = [ + {file = "fonttools-4.38.0-py3-none-any.whl", hash = "sha256:820466f43c8be8c3009aef8b87e785014133508f0de64ec469e4efb643ae54fb"}, + {file = "fonttools-4.38.0.zip", hash = "sha256:2bb244009f9bf3fa100fc3ead6aeb99febe5985fa20afbfbaa2f8946c2fbdaf1"}, +] +fqdn = [ + {file = "fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014"}, + {file = "fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f"}, +] +idna = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] +importlib-metadata = [ + {file = "importlib_metadata-5.2.0-py3-none-any.whl", hash = "sha256:0eafa39ba42bf225fc00e67f701d71f85aead9f878569caf13c3724f704b970f"}, + {file = "importlib_metadata-5.2.0.tar.gz", hash = "sha256:404d48d62bba0b7a77ff9d405efd91501bef2e67ff4ace0bed40a0cf28c3c7cd"}, +] +ipykernel = [ + {file = "ipykernel-6.19.4-py3-none-any.whl", hash = "sha256:0ecdae0060da61c5222ad221681f3b99b5bef739e11a3b1eb5778aa47f056f1f"}, + {file = "ipykernel-6.19.4.tar.gz", hash = "sha256:4140c282a6c71cdde59abe5eae2c71bf1eeb4a69316ab76e1c4c25150a49722b"}, +] +ipython = [ + {file = "ipython-8.7.0-py3-none-any.whl", hash = "sha256:352042ddcb019f7c04e48171b4dd78e4c4bb67bf97030d170e154aac42b656d9"}, + {file = "ipython-8.7.0.tar.gz", hash = "sha256:882899fe78d5417a0aa07f995db298fa28b58faeba2112d2e3a4c95fe14bb738"}, +] +ipython_genutils = [ + {file = "ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8"}, + {file = "ipython_genutils-0.2.0.tar.gz", hash = "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"}, +] +ipywidgets = [ + {file = "ipywidgets-8.0.4-py3-none-any.whl", hash = "sha256:ebb195e743b16c3947fe8827190fb87b4d00979c0fbf685afe4d2c4927059fa1"}, + {file = "ipywidgets-8.0.4.tar.gz", hash = "sha256:c0005a77a47d77889cafed892b58e33b4a2a96712154404c6548ec22272811ea"}, +] +isoduration = [ + {file = "isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042"}, + {file = "isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9"}, +] +jedi = [ + {file = "jedi-0.18.2-py2.py3-none-any.whl", hash = "sha256:203c1fd9d969ab8f2119ec0a3342e0b49910045abe6af0a3ae83a5764d54639e"}, + {file = "jedi-0.18.2.tar.gz", hash = "sha256:bae794c30d07f6d910d32a7048af09b5a39ed740918da923c6b780790ebac612"}, +] +Jinja2 = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] +jsonpointer = [ + {file = "jsonpointer-2.3-py2.py3-none-any.whl", hash = "sha256:51801e558539b4e9cd268638c078c6c5746c9ac96bc38152d443400e4f3793e9"}, + {file = "jsonpointer-2.3.tar.gz", hash = "sha256:97cba51526c829282218feb99dab1b1e6bdf8efd1c43dc9d57be093c0d69c99a"}, +] +jsonschema = [ + {file = "jsonschema-4.17.3-py3-none-any.whl", hash = "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6"}, + {file = "jsonschema-4.17.3.tar.gz", hash = "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d"}, +] +jupyter = [ + {file = "jupyter-1.0.0-py2.py3-none-any.whl", hash = "sha256:5b290f93b98ffbc21c0c7e749f054b3267782166d72fa5e3ed1ed4eaf34a2b78"}, + {file = "jupyter-1.0.0.tar.gz", hash = "sha256:d9dc4b3318f310e34c82951ea5d6683f67bed7def4b259fafbfe4f1beb1d8e5f"}, + {file = "jupyter-1.0.0.zip", hash = "sha256:3e1f86076bbb7c8c207829390305a2b1fe836d471ed54be66a3b8c41e7f46cc7"}, +] +jupyter-client = [ + {file = "jupyter_client-7.4.8-py3-none-any.whl", hash = "sha256:d4a67ae86ee014bcb96bd8190714f6af921f2b0f52f4208b086aa5acfd9f8d65"}, + {file = "jupyter_client-7.4.8.tar.gz", hash = "sha256:109a3c33b62a9cf65aa8325850a0999a795fac155d9de4f7555aef5f310ee35a"}, +] +jupyter-console = [ + {file = "jupyter_console-6.4.4-py3-none-any.whl", hash = "sha256:756df7f4f60c986e7bc0172e4493d3830a7e6e75c08750bbe59c0a5403ad6dee"}, + {file = "jupyter_console-6.4.4.tar.gz", hash = "sha256:172f5335e31d600df61613a97b7f0352f2c8250bbd1092ef2d658f77249f89fb"}, +] +jupyter-core = [ + {file = "jupyter_core-5.1.1-py3-none-any.whl", hash = "sha256:f1038179d0f179b0e92c8fa2289c012b29dafdc9484b41821079f1a496f5a0f2"}, + {file = "jupyter_core-5.1.1.tar.gz", hash = "sha256:f342d29eb6edb06f8dffa69adea987b3a9ee2b6702338a8cb6911516ea0b432d"}, +] +jupyter-events = [ + {file = "jupyter_events-0.5.0-py3-none-any.whl", hash = "sha256:6f7b67bf42b8a370c992187194ed02847dfa02307a7aebe9913e2d3979b9b6b8"}, + {file = "jupyter_events-0.5.0.tar.gz", hash = "sha256:e27ffdd6138699d47d42cb65ae6d79334ff7c0d923694381c991ce56a140f2cd"}, +] +jupyter-server = [ + {file = "jupyter_server-2.0.5-py3-none-any.whl", hash = "sha256:18a952c0b75c18f801e91221798fd3e91aef09562896f03877db39db332f7cd2"}, + {file = "jupyter_server-2.0.5.tar.gz", hash = "sha256:0d9e63d40412334dfa348cef8bfe8415b973752d12ca3afd64f0ea478e52aa4a"}, +] +jupyter-server-terminals = [ + {file = "jupyter_server_terminals-0.4.3-py3-none-any.whl", hash = "sha256:ec67d3f1895d25cfb586a87a50b8eee13b709898a4afd721058e551e0a0f480d"}, + {file = "jupyter_server_terminals-0.4.3.tar.gz", hash = "sha256:8421438d95a1f1f6994c48dd5dc10ad167ea7c196972bb5d1d7a9da1e30fde02"}, +] +jupyterlab-pygments = [ + {file = "jupyterlab_pygments-0.2.2-py2.py3-none-any.whl", hash = "sha256:2405800db07c9f770863bcf8049a529c3dd4d3e28536638bd7c1c01d2748309f"}, + {file = "jupyterlab_pygments-0.2.2.tar.gz", hash = "sha256:7405d7fde60819d905a9fa8ce89e4cd830e318cdad22a0030f7a901da705585d"}, +] +jupyterlab-widgets = [ + {file = "jupyterlab_widgets-3.0.5-py3-none-any.whl", hash = "sha256:a04a42e50231b355b7087e16a818f541e53589f7647144ea0344c4bf16f300e5"}, + {file = "jupyterlab_widgets-3.0.5.tar.gz", hash = "sha256:eeaecdeaf6c03afc960ddae201ced88d5979b4ca9c3891bcb8f6631af705f5ef"}, +] +kiwisolver = [ + {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2f5e60fabb7343a836360c4f0919b8cd0d6dbf08ad2ca6b9cf90bf0c76a3c4f6"}, + {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:10ee06759482c78bdb864f4109886dff7b8a56529bc1609d4f1112b93fe6423c"}, + {file = "kiwisolver-1.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c79ebe8f3676a4c6630fd3f777f3cfecf9289666c84e775a67d1d358578dc2e3"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:abbe9fa13da955feb8202e215c4018f4bb57469b1b78c7a4c5c7b93001699938"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7577c1987baa3adc4b3c62c33bd1118c3ef5c8ddef36f0f2c950ae0b199e100d"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ad8285b01b0d4695102546b342b493b3ccc6781fc28c8c6a1bb63e95d22f09"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ed58b8acf29798b036d347791141767ccf65eee7f26bde03a71c944449e53de"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a68b62a02953b9841730db7797422f983935aeefceb1679f0fc85cbfbd311c32"}, + {file = "kiwisolver-1.4.4-cp310-cp310-win32.whl", hash = "sha256:e92a513161077b53447160b9bd8f522edfbed4bd9759e4c18ab05d7ef7e49408"}, + {file = "kiwisolver-1.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:3fe20f63c9ecee44560d0e7f116b3a747a5d7203376abeea292ab3152334d004"}, + {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ea21f66820452a3f5d1655f8704a60d66ba1191359b96541eaf457710a5fc6"}, + {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bc9db8a3efb3e403e4ecc6cd9489ea2bac94244f80c78e27c31dcc00d2790ac2"}, + {file = "kiwisolver-1.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d5b61785a9ce44e5a4b880272baa7cf6c8f48a5180c3e81c59553ba0cb0821ca"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c2dbb44c3f7e6c4d3487b31037b1bdbf424d97687c1747ce4ff2895795c9bf69"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6295ecd49304dcf3bfbfa45d9a081c96509e95f4b9d0eb7ee4ec0530c4a96514"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4bd472dbe5e136f96a4b18f295d159d7f26fd399136f5b17b08c4e5f498cd494"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf7d9fce9bcc4752ca4a1b80aabd38f6d19009ea5cbda0e0856983cf6d0023f5"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d6601aed50c74e0ef02f4204da1816147a6d3fbdc8b3872d263338a9052c51"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:877272cf6b4b7e94c9614f9b10140e198d2186363728ed0f701c6eee1baec1da"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:db608a6757adabb32f1cfe6066e39b3706d8c3aa69bbc353a5b61edad36a5cb4"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5853eb494c71e267912275e5586fe281444eb5e722de4e131cddf9d442615626"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f0a1dbdb5ecbef0d34eb77e56fcb3e95bbd7e50835d9782a45df81cc46949750"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:283dffbf061a4ec60391d51e6155e372a1f7a4f5b15d59c8505339454f8989e4"}, + {file = "kiwisolver-1.4.4-cp311-cp311-win32.whl", hash = "sha256:d06adcfa62a4431d404c31216f0f8ac97397d799cd53800e9d3efc2fbb3cf14e"}, + {file = "kiwisolver-1.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:e7da3fec7408813a7cebc9e4ec55afed2d0fd65c4754bc376bf03498d4e92686"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:62ac9cc684da4cf1778d07a89bf5f81b35834cb96ca523d3a7fb32509380cbf6"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41dae968a94b1ef1897cb322b39360a0812661dba7c682aa45098eb8e193dbdf"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02f79693ec433cb4b5f51694e8477ae83b3205768a6fb48ffba60549080e295b"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d0611a0a2a518464c05ddd5a3a1a0e856ccc10e67079bb17f265ad19ab3c7597"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:db5283d90da4174865d520e7366801a93777201e91e79bacbac6e6927cbceede"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1041feb4cda8708ce73bb4dcb9ce1ccf49d553bf87c3954bdfa46f0c3f77252c"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-win32.whl", hash = "sha256:a553dadda40fef6bfa1456dc4be49b113aa92c2a9a9e8711e955618cd69622e3"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:03baab2d6b4a54ddbb43bba1a3a2d1627e82d205c5cf8f4c924dc49284b87166"}, + {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:841293b17ad704d70c578f1f0013c890e219952169ce8a24ebc063eecf775454"}, + {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f4f270de01dd3e129a72efad823da90cc4d6aafb64c410c9033aba70db9f1ff0"}, + {file = "kiwisolver-1.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f9f39e2f049db33a908319cf46624a569b36983c7c78318e9726a4cb8923b26c"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c97528e64cb9ebeff9701e7938653a9951922f2a38bd847787d4a8e498cc83ae"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d1573129aa0fd901076e2bfb4275a35f5b7aa60fbfb984499d661ec950320b0"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ad881edc7ccb9d65b0224f4e4d05a1e85cf62d73aab798943df6d48ab0cd79a1"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b428ef021242344340460fa4c9185d0b1f66fbdbfecc6c63eff4b7c29fad429d"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2e407cb4bd5a13984a6c2c0fe1845e4e41e96f183e5e5cd4d77a857d9693494c"}, + {file = "kiwisolver-1.4.4-cp38-cp38-win32.whl", hash = "sha256:75facbe9606748f43428fc91a43edb46c7ff68889b91fa31f53b58894503a191"}, + {file = "kiwisolver-1.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:5bce61af018b0cb2055e0e72e7d65290d822d3feee430b7b8203d8a855e78766"}, + {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8c808594c88a025d4e322d5bb549282c93c8e1ba71b790f539567932722d7bd8"}, + {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0a71d85ecdd570ded8ac3d1c0f480842f49a40beb423bb8014539a9f32a5897"}, + {file = "kiwisolver-1.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b533558eae785e33e8c148a8d9921692a9fe5aa516efbdff8606e7d87b9d5824"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:efda5fc8cc1c61e4f639b8067d118e742b812c930f708e6667a5ce0d13499e29"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7c43e1e1206cd421cd92e6b3280d4385d41d7166b3ed577ac20444b6995a445f"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc8d3bd6c72b2dd9decf16ce70e20abcb3274ba01b4e1c96031e0c4067d1e7cd"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ea39b0ccc4f5d803e3337dd46bcce60b702be4d86fd0b3d7531ef10fd99a1ac"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:968f44fdbf6dd757d12920d63b566eeb4d5b395fd2d00d29d7ef00a00582aac9"}, + {file = "kiwisolver-1.4.4-cp39-cp39-win32.whl", hash = "sha256:da7e547706e69e45d95e116e6939488d62174e033b763ab1496b4c29b76fabea"}, + {file = "kiwisolver-1.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:ba59c92039ec0a66103b1d5fe588fa546373587a7d68f5c96f743c3396afc04b"}, + {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:91672bacaa030f92fc2f43b620d7b337fd9a5af28b0d6ed3f77afc43c4a64b5a"}, + {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:787518a6789009c159453da4d6b683f468ef7a65bbde796bcea803ccf191058d"}, + {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da152d8cdcab0e56e4f45eb08b9aea6455845ec83172092f09b0e077ece2cf7a"}, + {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ecb1fa0db7bf4cff9dac752abb19505a233c7f16684c5826d1f11ebd9472b871"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:28bc5b299f48150b5f822ce68624e445040595a4ac3d59251703779836eceff9"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:81e38381b782cc7e1e46c4e14cd997ee6040768101aefc8fa3c24a4cc58e98f8"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2a66fdfb34e05b705620dd567f5a03f239a088d5a3f321e7b6ac3239d22aa286"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:872b8ca05c40d309ed13eb2e582cab0c5a05e81e987ab9c521bf05ad1d5cf5cb"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:70e7c2e7b750585569564e2e5ca9845acfaa5da56ac46df68414f29fea97be9f"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9f85003f5dfa867e86d53fac6f7e6f30c045673fa27b603c397753bebadc3008"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e307eb9bd99801f82789b44bb45e9f541961831c7311521b13a6c85afc09767"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1792d939ec70abe76f5054d3f36ed5656021dcad1322d1cc996d4e54165cef9"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6cb459eea32a4e2cf18ba5fcece2dbdf496384413bc1bae15583f19e567f3b2"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36dafec3d6d6088d34e2de6b85f9d8e2324eb734162fba59d2ba9ed7a2043d5b"}, + {file = "kiwisolver-1.4.4.tar.gz", hash = "sha256:d41997519fcba4a1e46eb4a2fe31bc12f0ff957b2b81bac28db24744f333e955"}, +] +MarkupSafe = [ + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, + {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, +] +matplotlib = [ + {file = "matplotlib-3.6.1-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:7730e60e751cfcfe7fcb223cf03c0b979e9a064c239783ad37929d340a364cef"}, + {file = "matplotlib-3.6.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:9dd40505ccc526acaf9a5db1b3029e237c64b58f1249983b28a291c2d6a1d0fa"}, + {file = "matplotlib-3.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:85948b303534b69fd771126764cf883fde2af9b003eb5778cb60f3b46f93d3f6"}, + {file = "matplotlib-3.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71eced071825005011cdc64efbae2e2c76b8209c18aa487dedf69796fe4b1e40"}, + {file = "matplotlib-3.6.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:220314c2d6b9ca11570d7cd4b841c9f3137546f188336003b9fb8def4dcb804d"}, + {file = "matplotlib-3.6.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2cc5d726d4d42865f909c5208a7841109d76584950dd0587b01a77cc279d4ab7"}, + {file = "matplotlib-3.6.1-cp310-cp310-win32.whl", hash = "sha256:183bf3ac6a6023ee590aa4b677f391ceed65ec0d6b930901a8483c267bd12995"}, + {file = "matplotlib-3.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:a68b91ac7e6bb26100a540a033f54c95fe06d9c0aa51312c2a52d07d1bde78f4"}, + {file = "matplotlib-3.6.1-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:4648f0d79a87bf50ee740058305c91091ee5e1fbb71a7d2f5fe6707bfe328d1c"}, + {file = "matplotlib-3.6.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:9403764017d20ff570f7ce973a8b9637f08a6109118f4e0ce6c7493d8849a0d3"}, + {file = "matplotlib-3.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4c8b5a243dd29d50289d694e931bd6cb6ae0b5bd654d12c647543d63862540c"}, + {file = "matplotlib-3.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1effccef0cea2d4da9feeed22079adf6786f92c800a7d0d2ef2104318a1c66c"}, + {file = "matplotlib-3.6.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8dc25473319afabe49150267e54648ac559c33b0fc2a80c8caecfbbc2948a820"}, + {file = "matplotlib-3.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47cb088bbce82ae9fc2edf3c25e56a5c6142ce2553fea2b781679f960a70c207"}, + {file = "matplotlib-3.6.1-cp311-cp311-win32.whl", hash = "sha256:4d3b0e0a4611bd22065bbf47e9b2f689ac9e575bcb850a9f0ae2bbed75cab956"}, + {file = "matplotlib-3.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:e3c116e779fbbf421a9e4d3060db259a9bb486d98f4e3c5a0877c599bd173582"}, + {file = "matplotlib-3.6.1-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:565f514dec81a41cbed10eb6011501879695087fc2787fb89423a466508abbbd"}, + {file = "matplotlib-3.6.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:05e86446562063d6186ff6d700118c0dbd5dccc403a6187351ee526c48878f10"}, + {file = "matplotlib-3.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8245e85fd793f58edf29b8a9e3be47e8ecf76ea1a1e8240545f2746181ca5787"}, + {file = "matplotlib-3.6.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1e2c75d5d1ff6b7ef9870360bfa23bea076b8dc0945a60d19453d7619ed9ea8f"}, + {file = "matplotlib-3.6.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c9756a8e69f6e1f76d47eb42132175b6814da1fbeae0545304c6d0fc2aae252a"}, + {file = "matplotlib-3.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f5788168da2661b42f7468063b725cc73fdbeeb80f2704cb2d8c415e9a57c50"}, + {file = "matplotlib-3.6.1-cp38-cp38-win32.whl", hash = "sha256:0bab7564aafd5902128d54b68dca04f5755413fb6b502100bb0235a545882c48"}, + {file = "matplotlib-3.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:3c53486278a0629fd892783271dc994b962fba8dfe207445d039e14f1928ea46"}, + {file = "matplotlib-3.6.1-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:27337bcb38d5db7430c14f350924542d75416ec1546d5d9d9f39b362b71db3fb"}, + {file = "matplotlib-3.6.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:fad858519bd6d52dbfeebdbe04d00dd8e932ed436f1c535e61bcc970a96c11e4"}, + {file = "matplotlib-3.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4a3d903588b519b38ed085d0ae762a1dcd4b70164617292175cfd91b90d6c415"}, + {file = "matplotlib-3.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87bdbd37d0a41e025879863fe9b17bab15c0421313bc33e77e5e1aa54215c9c5"}, + {file = "matplotlib-3.6.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e632f66218811d4cf8b7a2a649e25ec15406c3c498f72d19e2bcf8377f38445d"}, + {file = "matplotlib-3.6.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ddd58324dc9a77e2e56d7b7aea7dbd0575b6f7cd1333c3ca9d388ac70978344"}, + {file = "matplotlib-3.6.1-cp39-cp39-win32.whl", hash = "sha256:12ab21d0cad122f5b23688d453a0280676e7c42f634f0dbd093d15d42d142b1f"}, + {file = "matplotlib-3.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:563896ba269324872ace436a57775dcc8322678a9496b28a8c25cdafa5ec2b92"}, + {file = "matplotlib-3.6.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:52935b7d4ccbf0dbc9cf454dbb10ca99c11cbe8da9467596b96e5e21fd4dfc5c"}, + {file = "matplotlib-3.6.1-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87027ff7b2edeb14476900261ef04d4beae949e1dfa0a3eb3ad6a6efbf9d0e1d"}, + {file = "matplotlib-3.6.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4de03085afb3b80fab341afaf8e60dfe06ce439b6dfed55d657cf34a7bc3c40"}, + {file = "matplotlib-3.6.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b53387d4e59432ff221540a4ffb5ee9669c69417805e4faf0148a00d701c61f9"}, + {file = "matplotlib-3.6.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:02561141c434154f7bae8e5449909d152367cb40aa57bfb2a27f2748b9c5f95f"}, + {file = "matplotlib-3.6.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0161ebf87518ecfe0980c942d5f0d5df0e080c1746ebaab2027a969967014b7"}, + {file = "matplotlib-3.6.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2469f57e4c5cc0e85eddc7b30995ea9c404a78c0b1856da75d1a5887156ca350"}, + {file = "matplotlib-3.6.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:5f97141e05baf160c3ec125f06ceb2a44c9bb62f42fcb8ee1c05313c73e99432"}, + {file = "matplotlib-3.6.1.tar.gz", hash = "sha256:e2d1b7225666f7e1bcc94c0bc9c587a82e3e8691da4757e357e5c2515222ee37"}, +] +matplotlib-inline = [ + {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, + {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, +] +mistune = [ + {file = "mistune-2.0.4-py2.py3-none-any.whl", hash = "sha256:182cc5ee6f8ed1b807de6b7bb50155df7b66495412836b9a74c8fbdfc75fe36d"}, + {file = "mistune-2.0.4.tar.gz", hash = "sha256:9ee0a66053e2267aba772c71e06891fa8f1af6d4b01d5e84e267b4570d4d9808"}, +] +mypy-extensions = [ + {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, + {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, +] +nbclassic = [ + {file = "nbclassic-0.4.8-py3-none-any.whl", hash = "sha256:cbf05df5842b420d5cece0143462380ea9d308ff57c2dc0eb4d6e035b18fbfb3"}, + {file = "nbclassic-0.4.8.tar.gz", hash = "sha256:c74d8a500f8e058d46b576a41e5bc640711e1032cf7541dde5f73ea49497e283"}, +] +nbclient = [ + {file = "nbclient-0.7.2-py3-none-any.whl", hash = "sha256:d97ac6257de2794f5397609df754fcbca1a603e94e924eb9b99787c031ae2e7c"}, + {file = "nbclient-0.7.2.tar.gz", hash = "sha256:884a3f4a8c4fc24bb9302f263e0af47d97f0d01fe11ba714171b320c8ac09547"}, +] +nbconvert = [ + {file = "nbconvert-7.2.7-py3-none-any.whl", hash = "sha256:e057f1f87a6ac50629b724d9a46b40e2ba394d6f20ee7f33f4acef1928a15af3"}, + {file = "nbconvert-7.2.7.tar.gz", hash = "sha256:8b727b0503bf4e0ff3907c8bea030d3fc4015fbee8669ac6ac2a5a6668b49d5e"}, +] +nbformat = [ + {file = "nbformat-5.7.1-py3-none-any.whl", hash = "sha256:e52ab802ce7f7a2863861e914642f021b9d7c23ad9726d14c36df92a79acd754"}, + {file = "nbformat-5.7.1.tar.gz", hash = "sha256:3810a0130453ed031970521d20989b8a592f3c2e73283a8280ae34ae1f75b3f8"}, +] +nest-asyncio = [ + {file = "nest_asyncio-1.5.6-py3-none-any.whl", hash = "sha256:b9a953fb40dceaa587d109609098db21900182b16440652454a146cffb06e8b8"}, + {file = "nest_asyncio-1.5.6.tar.gz", hash = "sha256:d267cc1ff794403f7df692964d1d2a3fa9418ffea2a3f6859a439ff482fef290"}, +] +notebook = [ + {file = "notebook-6.5.2-py3-none-any.whl", hash = "sha256:e04f9018ceb86e4fa841e92ea8fb214f8d23c1cedfde530cc96f92446924f0e4"}, + {file = "notebook-6.5.2.tar.gz", hash = "sha256:c1897e5317e225fc78b45549a6ab4b668e4c996fd03a04e938fe5e7af2bfffd0"}, +] +notebook-shim = [ + {file = "notebook_shim-0.2.2-py3-none-any.whl", hash = "sha256:9c6c30f74c4fbea6fce55c1be58e7fd0409b1c681b075dcedceb005db5026949"}, + {file = "notebook_shim-0.2.2.tar.gz", hash = "sha256:090e0baf9a5582ff59b607af523ca2db68ff216da0c69956b62cab2ef4fc9c3f"}, +] +numpy = [ + {file = "numpy-1.23.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:95d79ada05005f6f4f337d3bb9de8a7774f259341c70bc88047a1f7b96a4bcb2"}, + {file = "numpy-1.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:926db372bc4ac1edf81cfb6c59e2a881606b409ddc0d0920b988174b2e2a767f"}, + {file = "numpy-1.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c237129f0e732885c9a6076a537e974160482eab8f10db6292e92154d4c67d71"}, + {file = "numpy-1.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8365b942f9c1a7d0f0dc974747d99dd0a0cdfc5949a33119caf05cb314682d3"}, + {file = "numpy-1.23.4-cp310-cp310-win32.whl", hash = "sha256:2341f4ab6dba0834b685cce16dad5f9b6606ea8a00e6da154f5dbded70fdc4dd"}, + {file = "numpy-1.23.4-cp310-cp310-win_amd64.whl", hash = "sha256:d331afac87c92373826af83d2b2b435f57b17a5c74e6268b79355b970626e329"}, + {file = "numpy-1.23.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:488a66cb667359534bc70028d653ba1cf307bae88eab5929cd707c761ff037db"}, + {file = "numpy-1.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ce03305dd694c4873b9429274fd41fc7eb4e0e4dea07e0af97a933b079a5814f"}, + {file = "numpy-1.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8981d9b5619569899666170c7c9748920f4a5005bf79c72c07d08c8a035757b0"}, + {file = "numpy-1.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a70a7d3ce4c0e9284e92285cba91a4a3f5214d87ee0e95928f3614a256a1488"}, + {file = "numpy-1.23.4-cp311-cp311-win32.whl", hash = "sha256:5e13030f8793e9ee42f9c7d5777465a560eb78fa7e11b1c053427f2ccab90c79"}, + {file = "numpy-1.23.4-cp311-cp311-win_amd64.whl", hash = "sha256:7607b598217745cc40f751da38ffd03512d33ec06f3523fb0b5f82e09f6f676d"}, + {file = "numpy-1.23.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7ab46e4e7ec63c8a5e6dbf5c1b9e1c92ba23a7ebecc86c336cb7bf3bd2fb10e5"}, + {file = "numpy-1.23.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a8aae2fb3180940011b4862b2dd3756616841c53db9734b27bb93813cd79fce6"}, + {file = "numpy-1.23.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c053d7557a8f022ec823196d242464b6955a7e7e5015b719e76003f63f82d0f"}, + {file = "numpy-1.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0882323e0ca4245eb0a3d0a74f88ce581cc33aedcfa396e415e5bba7bf05f68"}, + {file = "numpy-1.23.4-cp38-cp38-win32.whl", hash = "sha256:dada341ebb79619fe00a291185bba370c9803b1e1d7051610e01ed809ef3a4ba"}, + {file = "numpy-1.23.4-cp38-cp38-win_amd64.whl", hash = "sha256:0fe563fc8ed9dc4474cbf70742673fc4391d70f4363f917599a7fa99f042d5a8"}, + {file = "numpy-1.23.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c67b833dbccefe97cdd3f52798d430b9d3430396af7cdb2a0c32954c3ef73894"}, + {file = "numpy-1.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f76025acc8e2114bb664294a07ede0727aa75d63a06d2fae96bf29a81747e4a7"}, + {file = "numpy-1.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12ac457b63ec8ded85d85c1e17d85efd3c2b0967ca39560b307a35a6703a4735"}, + {file = "numpy-1.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95de7dc7dc47a312f6feddd3da2500826defdccbc41608d0031276a24181a2c0"}, + {file = "numpy-1.23.4-cp39-cp39-win32.whl", hash = "sha256:f2f390aa4da44454db40a1f0201401f9036e8d578a25f01a6e237cea238337ef"}, + {file = "numpy-1.23.4-cp39-cp39-win_amd64.whl", hash = "sha256:f260da502d7441a45695199b4e7fd8ca87db659ba1c78f2bbf31f934fe76ae0e"}, + {file = "numpy-1.23.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:61be02e3bf810b60ab74e81d6d0d36246dbfb644a462458bb53b595791251911"}, + {file = "numpy-1.23.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:296d17aed51161dbad3c67ed6d164e51fcd18dbcd5dd4f9d0a9c6055dce30810"}, + {file = "numpy-1.23.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4d52914c88b4930dafb6c48ba5115a96cbab40f45740239d9f4159c4ba779962"}, + {file = "numpy-1.23.4.tar.gz", hash = "sha256:ed2cc92af0efad20198638c69bb0fc2870a58dabfba6eb722c933b48556c686c"}, +] +packaging = [ + {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, + {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, +] +pandocfilters = [ + {file = "pandocfilters-1.5.0-py2.py3-none-any.whl", hash = "sha256:33aae3f25fd1a026079f5d27bdd52496f0e0803b3469282162bafdcbdf6ef14f"}, + {file = "pandocfilters-1.5.0.tar.gz", hash = "sha256:0b679503337d233b4339a817bfc8c50064e2eff681314376a47cb582305a7a38"}, +] +parso = [ + {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, + {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, +] +pathspec = [ + {file = "pathspec-0.10.1-py3-none-any.whl", hash = "sha256:46846318467efc4556ccfd27816e004270a9eeeeb4d062ce5e6fc7a87c573f93"}, + {file = "pathspec-0.10.1.tar.gz", hash = "sha256:7ace6161b621d31e7902eb6b5ae148d12cfd23f4a249b9ffb6b9fee12084323d"}, +] +pexpect = [ + {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, + {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, +] +pickleshare = [ + {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, + {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, +] +Pillow = [ + {file = "Pillow-9.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:0b7257127d646ff8676ec8a15520013a698d1fdc48bc2a79ba4e53df792526f2"}, + {file = "Pillow-9.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b90f7616ea170e92820775ed47e136208e04c967271c9ef615b6fbd08d9af0e3"}, + {file = "Pillow-9.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68943d632f1f9e3dce98908e873b3a090f6cba1cbb1b892a9e8d97c938871fbe"}, + {file = "Pillow-9.3.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:be55f8457cd1eac957af0c3f5ece7bc3f033f89b114ef30f710882717670b2a8"}, + {file = "Pillow-9.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d77adcd56a42d00cc1be30843d3426aa4e660cab4a61021dc84467123f7a00c"}, + {file = "Pillow-9.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:829f97c8e258593b9daa80638aee3789b7df9da5cf1336035016d76f03b8860c"}, + {file = "Pillow-9.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:801ec82e4188e935c7f5e22e006d01611d6b41661bba9fe45b60e7ac1a8f84de"}, + {file = "Pillow-9.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:871b72c3643e516db4ecf20efe735deb27fe30ca17800e661d769faab45a18d7"}, + {file = "Pillow-9.3.0-cp310-cp310-win32.whl", hash = "sha256:655a83b0058ba47c7c52e4e2df5ecf484c1b0b0349805896dd350cbc416bdd91"}, + {file = "Pillow-9.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:9f47eabcd2ded7698106b05c2c338672d16a6f2a485e74481f524e2a23c2794b"}, + {file = "Pillow-9.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:57751894f6618fd4308ed8e0c36c333e2f5469744c34729a27532b3db106ee20"}, + {file = "Pillow-9.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7db8b751ad307d7cf238f02101e8e36a128a6cb199326e867d1398067381bff4"}, + {file = "Pillow-9.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3033fbe1feb1b59394615a1cafaee85e49d01b51d54de0cbf6aa8e64182518a1"}, + {file = "Pillow-9.3.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22b012ea2d065fd163ca096f4e37e47cd8b59cf4b0fd47bfca6abb93df70b34c"}, + {file = "Pillow-9.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9a65733d103311331875c1dca05cb4606997fd33d6acfed695b1232ba1df193"}, + {file = "Pillow-9.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:502526a2cbfa431d9fc2a079bdd9061a2397b842bb6bc4239bb176da00993812"}, + {file = "Pillow-9.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:90fb88843d3902fe7c9586d439d1e8c05258f41da473952aa8b328d8b907498c"}, + {file = "Pillow-9.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:89dca0ce00a2b49024df6325925555d406b14aa3efc2f752dbb5940c52c56b11"}, + {file = "Pillow-9.3.0-cp311-cp311-win32.whl", hash = "sha256:3168434d303babf495d4ba58fc22d6604f6e2afb97adc6a423e917dab828939c"}, + {file = "Pillow-9.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:18498994b29e1cf86d505edcb7edbe814d133d2232d256db8c7a8ceb34d18cef"}, + {file = "Pillow-9.3.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:772a91fc0e03eaf922c63badeca75e91baa80fe2f5f87bdaed4280662aad25c9"}, + {file = "Pillow-9.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa4107d1b306cdf8953edde0534562607fe8811b6c4d9a486298ad31de733b2"}, + {file = "Pillow-9.3.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4012d06c846dc2b80651b120e2cdd787b013deb39c09f407727ba90015c684f"}, + {file = "Pillow-9.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77ec3e7be99629898c9a6d24a09de089fa5356ee408cdffffe62d67bb75fdd72"}, + {file = "Pillow-9.3.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:6c738585d7a9961d8c2821a1eb3dcb978d14e238be3d70f0a706f7fa9316946b"}, + {file = "Pillow-9.3.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:828989c45c245518065a110434246c44a56a8b2b2f6347d1409c787e6e4651ee"}, + {file = "Pillow-9.3.0-cp37-cp37m-win32.whl", hash = "sha256:82409ffe29d70fd733ff3c1025a602abb3e67405d41b9403b00b01debc4c9a29"}, + {file = "Pillow-9.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:41e0051336807468be450d52b8edd12ac60bebaa97fe10c8b660f116e50b30e4"}, + {file = "Pillow-9.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:b03ae6f1a1878233ac620c98f3459f79fd77c7e3c2b20d460284e1fb370557d4"}, + {file = "Pillow-9.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4390e9ce199fc1951fcfa65795f239a8a4944117b5935a9317fb320e7767b40f"}, + {file = "Pillow-9.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40e1ce476a7804b0fb74bcfa80b0a2206ea6a882938eaba917f7a0f004b42502"}, + {file = "Pillow-9.3.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0a06a052c5f37b4ed81c613a455a81f9a3a69429b4fd7bb913c3fa98abefc20"}, + {file = "Pillow-9.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03150abd92771742d4a8cd6f2fa6246d847dcd2e332a18d0c15cc75bf6703040"}, + {file = "Pillow-9.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:15c42fb9dea42465dfd902fb0ecf584b8848ceb28b41ee2b58f866411be33f07"}, + {file = "Pillow-9.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:51e0e543a33ed92db9f5ef69a0356e0b1a7a6b6a71b80df99f1d181ae5875636"}, + {file = "Pillow-9.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3dd6caf940756101205dffc5367babf288a30043d35f80936f9bfb37f8355b32"}, + {file = "Pillow-9.3.0-cp38-cp38-win32.whl", hash = "sha256:f1ff2ee69f10f13a9596480335f406dd1f70c3650349e2be67ca3139280cade0"}, + {file = "Pillow-9.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:276a5ca930c913f714e372b2591a22c4bd3b81a418c0f6635ba832daec1cbcfc"}, + {file = "Pillow-9.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:73bd195e43f3fadecfc50c682f5055ec32ee2c933243cafbfdec69ab1aa87cad"}, + {file = "Pillow-9.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1c7c8ae3864846fc95f4611c78129301e203aaa2af813b703c55d10cc1628535"}, + {file = "Pillow-9.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e0918e03aa0c72ea56edbb00d4d664294815aa11291a11504a377ea018330d3"}, + {file = "Pillow-9.3.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0915e734b33a474d76c28e07292f196cdf2a590a0d25bcc06e64e545f2d146c"}, + {file = "Pillow-9.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af0372acb5d3598f36ec0914deed2a63f6bcdb7b606da04dc19a88d31bf0c05b"}, + {file = "Pillow-9.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:ad58d27a5b0262c0c19b47d54c5802db9b34d38bbf886665b626aff83c74bacd"}, + {file = "Pillow-9.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:97aabc5c50312afa5e0a2b07c17d4ac5e865b250986f8afe2b02d772567a380c"}, + {file = "Pillow-9.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9aaa107275d8527e9d6e7670b64aabaaa36e5b6bd71a1015ddd21da0d4e06448"}, + {file = "Pillow-9.3.0-cp39-cp39-win32.whl", hash = "sha256:bac18ab8d2d1e6b4ce25e3424f709aceef668347db8637c2296bcf41acb7cf48"}, + {file = "Pillow-9.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:b472b5ea442148d1c3e2209f20f1e0bb0eb556538690fa70b5e1f79fa0ba8dc2"}, + {file = "Pillow-9.3.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:ab388aaa3f6ce52ac1cb8e122c4bd46657c15905904b3120a6248b5b8b0bc228"}, + {file = "Pillow-9.3.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbb8e7f2abee51cef77673be97760abff1674ed32847ce04b4af90f610144c7b"}, + {file = "Pillow-9.3.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca31dd6014cb8b0b2db1e46081b0ca7d936f856da3b39744aef499db5d84d02"}, + {file = "Pillow-9.3.0-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c7025dce65566eb6e89f56c9509d4f628fddcedb131d9465cacd3d8bac337e7e"}, + {file = "Pillow-9.3.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ebf2029c1f464c59b8bdbe5143c79fa2045a581ac53679733d3a91d400ff9efb"}, + {file = "Pillow-9.3.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b59430236b8e58840a0dfb4099a0e8717ffb779c952426a69ae435ca1f57210c"}, + {file = "Pillow-9.3.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12ce4932caf2ddf3e41d17fc9c02d67126935a44b86df6a206cf0d7161548627"}, + {file = "Pillow-9.3.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae5331c23ce118c53b172fa64a4c037eb83c9165aba3a7ba9ddd3ec9fa64a699"}, + {file = "Pillow-9.3.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:0b07fffc13f474264c336298d1b4ce01d9c5a011415b79d4ee5527bb69ae6f65"}, + {file = "Pillow-9.3.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:073adb2ae23431d3b9bcbcff3fe698b62ed47211d0716b067385538a1b0f28b8"}, + {file = "Pillow-9.3.0.tar.gz", hash = "sha256:c935a22a557a560108d780f9a0fc426dd7459940dc54faa49d83249c8d3e760f"}, +] +platformdirs = [ + {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, + {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, +] +prometheus-client = [ + {file = "prometheus_client-0.15.0-py3-none-any.whl", hash = "sha256:db7c05cbd13a0f79975592d112320f2605a325969b270a94b71dcabc47b931d2"}, + {file = "prometheus_client-0.15.0.tar.gz", hash = "sha256:be26aa452490cfcf6da953f9436e95a9f2b4d578ca80094b4458930e5f584ab1"}, +] +prompt-toolkit = [ + {file = "prompt_toolkit-3.0.36-py3-none-any.whl", hash = "sha256:aa64ad242a462c5ff0363a7b9cfe696c20d55d9fc60c11fd8e632d064804d305"}, + {file = "prompt_toolkit-3.0.36.tar.gz", hash = "sha256:3e163f254bef5a03b146397d7c1963bd3e2812f0964bb9a24e6ec761fd28db63"}, +] +psutil = [ + {file = "psutil-5.9.4-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c1ca331af862803a42677c120aff8a814a804e09832f166f226bfd22b56feee8"}, + {file = "psutil-5.9.4-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:68908971daf802203f3d37e78d3f8831b6d1014864d7a85937941bb35f09aefe"}, + {file = "psutil-5.9.4-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:3ff89f9b835100a825b14c2808a106b6fdcc4b15483141482a12c725e7f78549"}, + {file = "psutil-5.9.4-cp27-cp27m-win32.whl", hash = "sha256:852dd5d9f8a47169fe62fd4a971aa07859476c2ba22c2254d4a1baa4e10b95ad"}, + {file = "psutil-5.9.4-cp27-cp27m-win_amd64.whl", hash = "sha256:9120cd39dca5c5e1c54b59a41d205023d436799b1c8c4d3ff71af18535728e94"}, + {file = "psutil-5.9.4-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:6b92c532979bafc2df23ddc785ed116fced1f492ad90a6830cf24f4d1ea27d24"}, + {file = "psutil-5.9.4-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:efeae04f9516907be44904cc7ce08defb6b665128992a56957abc9b61dca94b7"}, + {file = "psutil-5.9.4-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:54d5b184728298f2ca8567bf83c422b706200bcbbfafdc06718264f9393cfeb7"}, + {file = "psutil-5.9.4-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:16653106f3b59386ffe10e0bad3bb6299e169d5327d3f187614b1cb8f24cf2e1"}, + {file = "psutil-5.9.4-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54c0d3d8e0078b7666984e11b12b88af2db11d11249a8ac8920dd5ef68a66e08"}, + {file = "psutil-5.9.4-cp36-abi3-win32.whl", hash = "sha256:149555f59a69b33f056ba1c4eb22bb7bf24332ce631c44a319cec09f876aaeff"}, + {file = "psutil-5.9.4-cp36-abi3-win_amd64.whl", hash = "sha256:fd8522436a6ada7b4aad6638662966de0d61d241cb821239b2ae7013d41a43d4"}, + {file = "psutil-5.9.4-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:6001c809253a29599bc0dfd5179d9f8a5779f9dffea1da0f13c53ee568115e1e"}, + {file = "psutil-5.9.4.tar.gz", hash = "sha256:3d7f9739eb435d4b1338944abe23f49584bde5395f27487d2ee25ad9a8774a62"}, +] +ptyprocess = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] +pure-eval = [ + {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, + {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, +] +py = [ + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, +] +pycparser = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] +Pygments = [ + {file = "Pygments-2.13.0-py3-none-any.whl", hash = "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"}, + {file = "Pygments-2.13.0.tar.gz", hash = "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1"}, +] +pyobjc-core = [ + {file = "pyobjc-core-8.5.1.tar.gz", hash = "sha256:f8592a12de076c27006700c4a46164478564fa33d7da41e7cbdd0a3bf9ddbccf"}, + {file = "pyobjc_core-8.5.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b62dcf987cc511188fc2aa5b4d3b9fd895361ea4984380463497ce4b0752ddf4"}, + {file = "pyobjc_core-8.5.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0accc653501a655f66c13f149a1d3d30e6cb65824edf852f7960a00c4f930d5b"}, + {file = "pyobjc_core-8.5.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f82b32affc898e9e5af041c1cecde2c99f2ce160b87df77f678c99f1550a4655"}, + {file = "pyobjc_core-8.5.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f7b2f6b6f3caeb882c658fe0c7098be2e8b79893d84daa8e636cb3e58a07df00"}, + {file = "pyobjc_core-8.5.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:872c0202c911a5a2f1269261c168e36569f6ddac17e5d854ac19e581726570cc"}, + {file = "pyobjc_core-8.5.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:21f92e231a4bae7f2d160d065f5afbf5e859a1e37f29d34ac12592205fc8c108"}, + {file = "pyobjc_core-8.5.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:315334dd09781129af6a39641248891c4caa57043901750b0139c6614ce84ec0"}, +] +pyobjc-framework-Cocoa = [ + {file = "pyobjc-framework-Cocoa-8.5.1.tar.gz", hash = "sha256:9a3de5cdb4644e85daf53f2ed912ef6c16ea5804a9e65552eafe62c2e139eb8c"}, + {file = "pyobjc_framework_Cocoa-8.5.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:aa572acc2628488a47be8d19f4701fc96fce7377cc4da18316e1e08c3918521a"}, + {file = "pyobjc_framework_Cocoa-8.5.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cb3ae21c8d81b7f02a891088c623cef61bca89bd671eff58c632d2f926b649f3"}, + {file = "pyobjc_framework_Cocoa-8.5.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:88f08f5bd94c66d373d8413c1d08218aff4cff0b586e0cc4249b2284023e7577"}, + {file = "pyobjc_framework_Cocoa-8.5.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:063683b57e4bd88cb0f9631ae65d25ec4eecf427d2fe8d0c578f88da9c896f3f"}, + {file = "pyobjc_framework_Cocoa-8.5.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8f8806ddfac40620fb27f185d0f8937e69e330617319ecc2eccf6b9c8451bdd1"}, + {file = "pyobjc_framework_Cocoa-8.5.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:7733a9a201df9e0cc2a0cf7bf54d76bd7981cba9b599353b243e3e0c9eefec10"}, + {file = "pyobjc_framework_Cocoa-8.5.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f0ab227f99d3e25dd3db73f8cde0999914a5f0dd6a08600349d25f95eaa0da63"}, +] +pyobjc-framework-CoreBluetooth = [ + {file = "pyobjc-framework-CoreBluetooth-8.5.1.tar.gz", hash = "sha256:b4f621fc3b5bf289db58e64fd746773b18297f87a0ffc5502de74f69133301c1"}, + {file = "pyobjc_framework_CoreBluetooth-8.5.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:bc720f2987a4d28dc73b13146e7c104d717100deb75c244da68f1d0849096661"}, + {file = "pyobjc_framework_CoreBluetooth-8.5.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2167f22886beb5b3ae69e475e055403f28eab065c49a25e2b98b050b483be799"}, + {file = "pyobjc_framework_CoreBluetooth-8.5.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:aa9587a36eca143701731e8bb6c369148f8cc48c28168d41e7323828e5117f2d"}, +] +pyobjc-framework-libdispatch = [ + {file = "pyobjc-framework-libdispatch-8.5.1.tar.gz", hash = "sha256:066fb34fceb326307559104d45532ec2c7b55426f9910b70dbefd5d1b8fd530f"}, + {file = "pyobjc_framework_libdispatch-8.5.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a316646ab30ba2a97bc828f8e27e7bb79efdf993d218a9c5118396b4f81dc762"}, + {file = "pyobjc_framework_libdispatch-8.5.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7730a29e4d9c7d8c2e8d9ffb60af0ab6699b2186296d2bff0a2dd54527578bc3"}, + {file = "pyobjc_framework_libdispatch-8.5.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:76208d9d2b0071df2950800495ac0300360bb5f25cbe9ab880b65cb809764979"}, + {file = "pyobjc_framework_libdispatch-8.5.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:1ad9aa4773ff1d89bf4385c081824c4f8708b50e3ac2fe0a9d590153242c0f67"}, + {file = "pyobjc_framework_libdispatch-8.5.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:81e1833bd26f15930faba678f9efdffafc79ec04e2ea8b6d1b88cafc0883af97"}, + {file = "pyobjc_framework_libdispatch-8.5.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:73226e224436eb6383e7a8a811c90ed597995adb155b4f46d727881a383ac550"}, + {file = "pyobjc_framework_libdispatch-8.5.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d115355ce446fc073c75cedfd7ab0a13958adda8e3a3b1e421e1f1e5f65640da"}, +] +pyparsing = [ + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, +] +pyrsistent = [ + {file = "pyrsistent-0.19.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d6982b5a0237e1b7d876b60265564648a69b14017f3b5f908c5be2de3f9abb7a"}, + {file = "pyrsistent-0.19.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:187d5730b0507d9285a96fca9716310d572e5464cadd19f22b63a6976254d77a"}, + {file = "pyrsistent-0.19.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:055ab45d5911d7cae397dc418808d8802fb95262751872c841c170b0dbf51eed"}, + {file = "pyrsistent-0.19.2-cp310-cp310-win32.whl", hash = "sha256:456cb30ca8bff00596519f2c53e42c245c09e1a4543945703acd4312949bfd41"}, + {file = "pyrsistent-0.19.2-cp310-cp310-win_amd64.whl", hash = "sha256:b39725209e06759217d1ac5fcdb510e98670af9e37223985f330b611f62e7425"}, + {file = "pyrsistent-0.19.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2aede922a488861de0ad00c7630a6e2d57e8023e4be72d9d7147a9fcd2d30712"}, + {file = "pyrsistent-0.19.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:879b4c2f4d41585c42df4d7654ddffff1239dc4065bc88b745f0341828b83e78"}, + {file = "pyrsistent-0.19.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c43bec251bbd10e3cb58ced80609c5c1eb238da9ca78b964aea410fb820d00d6"}, + {file = "pyrsistent-0.19.2-cp37-cp37m-win32.whl", hash = "sha256:d690b18ac4b3e3cab73b0b7aa7dbe65978a172ff94970ff98d82f2031f8971c2"}, + {file = "pyrsistent-0.19.2-cp37-cp37m-win_amd64.whl", hash = "sha256:3ba4134a3ff0fc7ad225b6b457d1309f4698108fb6b35532d015dca8f5abed73"}, + {file = "pyrsistent-0.19.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a178209e2df710e3f142cbd05313ba0c5ebed0a55d78d9945ac7a4e09d923308"}, + {file = "pyrsistent-0.19.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e371b844cec09d8dc424d940e54bba8f67a03ebea20ff7b7b0d56f526c71d584"}, + {file = "pyrsistent-0.19.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:111156137b2e71f3a9936baf27cb322e8024dac3dc54ec7fb9f0bcf3249e68bb"}, + {file = "pyrsistent-0.19.2-cp38-cp38-win32.whl", hash = "sha256:e5d8f84d81e3729c3b506657dddfe46e8ba9c330bf1858ee33108f8bb2adb38a"}, + {file = "pyrsistent-0.19.2-cp38-cp38-win_amd64.whl", hash = "sha256:9cd3e9978d12b5d99cbdc727a3022da0430ad007dacf33d0bf554b96427f33ab"}, + {file = "pyrsistent-0.19.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f1258f4e6c42ad0b20f9cfcc3ada5bd6b83374516cd01c0960e3cb75fdca6770"}, + {file = "pyrsistent-0.19.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21455e2b16000440e896ab99e8304617151981ed40c29e9507ef1c2e4314ee95"}, + {file = "pyrsistent-0.19.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfd880614c6237243ff53a0539f1cb26987a6dc8ac6e66e0c5a40617296a045e"}, + {file = "pyrsistent-0.19.2-cp39-cp39-win32.whl", hash = "sha256:71d332b0320642b3261e9fee47ab9e65872c2bd90260e5d225dabeed93cbd42b"}, + {file = "pyrsistent-0.19.2-cp39-cp39-win_amd64.whl", hash = "sha256:dec3eac7549869365fe263831f576c8457f6c833937c68542d08fde73457d291"}, + {file = "pyrsistent-0.19.2-py3-none-any.whl", hash = "sha256:ea6b79a02a28550c98b6ca9c35b9f492beaa54d7c5c9e9949555893c8a9234d0"}, + {file = "pyrsistent-0.19.2.tar.gz", hash = "sha256:bfa0351be89c9fcbcb8c9879b826f4353be10f58f8a677efab0c017bf7137ec2"}, +] +python-dateutil = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] +python-json-logger = [ + {file = "python-json-logger-2.0.4.tar.gz", hash = "sha256:764d762175f99fcc4630bd4853b09632acb60a6224acb27ce08cd70f0b1b81bd"}, + {file = "python_json_logger-2.0.4-py3-none-any.whl", hash = "sha256:3b03487b14eb9e4f77e4fc2a023358b5394b82fd89cecf5586259baed57d8c6f"}, +] +pywin32 = [ + {file = "pywin32-305-cp310-cp310-win32.whl", hash = "sha256:421f6cd86e84bbb696d54563c48014b12a23ef95a14e0bdba526be756d89f116"}, + {file = "pywin32-305-cp310-cp310-win_amd64.whl", hash = "sha256:73e819c6bed89f44ff1d690498c0a811948f73777e5f97c494c152b850fad478"}, + {file = "pywin32-305-cp310-cp310-win_arm64.whl", hash = "sha256:742eb905ce2187133a29365b428e6c3b9001d79accdc30aa8969afba1d8470f4"}, + {file = "pywin32-305-cp311-cp311-win32.whl", hash = "sha256:19ca459cd2e66c0e2cc9a09d589f71d827f26d47fe4a9d09175f6aa0256b51c2"}, + {file = "pywin32-305-cp311-cp311-win_amd64.whl", hash = "sha256:326f42ab4cfff56e77e3e595aeaf6c216712bbdd91e464d167c6434b28d65990"}, + {file = "pywin32-305-cp311-cp311-win_arm64.whl", hash = "sha256:4ecd404b2c6eceaca52f8b2e3e91b2187850a1ad3f8b746d0796a98b4cea04db"}, + {file = "pywin32-305-cp36-cp36m-win32.whl", hash = "sha256:48d8b1659284f3c17b68587af047d110d8c44837736b8932c034091683e05863"}, + {file = "pywin32-305-cp36-cp36m-win_amd64.whl", hash = "sha256:13362cc5aa93c2beaf489c9c9017c793722aeb56d3e5166dadd5ef82da021fe1"}, + {file = "pywin32-305-cp37-cp37m-win32.whl", hash = "sha256:a55db448124d1c1484df22fa8bbcbc45c64da5e6eae74ab095b9ea62e6d00496"}, + {file = "pywin32-305-cp37-cp37m-win_amd64.whl", hash = "sha256:109f98980bfb27e78f4df8a51a8198e10b0f347257d1e265bb1a32993d0c973d"}, + {file = "pywin32-305-cp38-cp38-win32.whl", hash = "sha256:9dd98384da775afa009bc04863426cb30596fd78c6f8e4e2e5bbf4edf8029504"}, + {file = "pywin32-305-cp38-cp38-win_amd64.whl", hash = "sha256:56d7a9c6e1a6835f521788f53b5af7912090674bb84ef5611663ee1595860fc7"}, + {file = "pywin32-305-cp39-cp39-win32.whl", hash = "sha256:9d968c677ac4d5cbdaa62fd3014ab241718e619d8e36ef8e11fb930515a1e918"}, + {file = "pywin32-305-cp39-cp39-win_amd64.whl", hash = "sha256:50768c6b7c3f0b38b7fb14dd4104da93ebced5f1a50dc0e834594bff6fbe1271"}, +] +pywinpty = [ + {file = "pywinpty-2.0.9-cp310-none-win_amd64.whl", hash = "sha256:30a7b371446a694a6ce5ef906d70ac04e569de5308c42a2bdc9c3bc9275ec51f"}, + {file = "pywinpty-2.0.9-cp311-none-win_amd64.whl", hash = "sha256:d78ef6f4bd7a6c6f94dc1a39ba8fb028540cc39f5cb593e756506db17843125f"}, + {file = "pywinpty-2.0.9-cp37-none-win_amd64.whl", hash = "sha256:5ed36aa087e35a3a183f833631b3e4c1ae92fe2faabfce0fa91b77ed3f0f1382"}, + {file = "pywinpty-2.0.9-cp38-none-win_amd64.whl", hash = "sha256:2352f44ee913faaec0a02d3c112595e56b8af7feeb8100efc6dc1a8685044199"}, + {file = "pywinpty-2.0.9-cp39-none-win_amd64.whl", hash = "sha256:ba75ec55f46c9e17db961d26485b033deb20758b1731e8e208e1e8a387fcf70c"}, + {file = "pywinpty-2.0.9.tar.gz", hash = "sha256:01b6400dd79212f50a2f01af1c65b781290ff39610853db99bf03962eb9a615f"}, +] +PyYAML = [ + {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, + {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, + {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, + {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, + {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, + {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, + {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, + {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, + {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, + {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, + {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, + {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, + {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, + {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, + {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, + {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, + {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, +] +pyzmq = [ + {file = "pyzmq-24.0.1-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:28b119ba97129d3001673a697b7cce47fe6de1f7255d104c2f01108a5179a066"}, + {file = "pyzmq-24.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bcbebd369493d68162cddb74a9c1fcebd139dfbb7ddb23d8f8e43e6c87bac3a6"}, + {file = "pyzmq-24.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae61446166983c663cee42c852ed63899e43e484abf080089f771df4b9d272ef"}, + {file = "pyzmq-24.0.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87f7ac99b15270db8d53f28c3c7b968612993a90a5cf359da354efe96f5372b4"}, + {file = "pyzmq-24.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9dca7c3956b03b7663fac4d150f5e6d4f6f38b2462c1e9afd83bcf7019f17913"}, + {file = "pyzmq-24.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8c78bfe20d4c890cb5580a3b9290f700c570e167d4cdcc55feec07030297a5e3"}, + {file = "pyzmq-24.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:48f721f070726cd2a6e44f3c33f8ee4b24188e4b816e6dd8ba542c8c3bb5b246"}, + {file = "pyzmq-24.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:afe1f3bc486d0ce40abb0a0c9adb39aed3bbac36ebdc596487b0cceba55c21c1"}, + {file = "pyzmq-24.0.1-cp310-cp310-win32.whl", hash = "sha256:3e6192dbcefaaa52ed81be88525a54a445f4b4fe2fffcae7fe40ebb58bd06bfd"}, + {file = "pyzmq-24.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:86de64468cad9c6d269f32a6390e210ca5ada568c7a55de8e681ca3b897bb340"}, + {file = "pyzmq-24.0.1-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:838812c65ed5f7c2bd11f7b098d2e5d01685a3f6d1f82849423b570bae698c00"}, + {file = "pyzmq-24.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dfb992dbcd88d8254471760879d48fb20836d91baa90f181c957122f9592b3dc"}, + {file = "pyzmq-24.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7abddb2bd5489d30ffeb4b93a428130886c171b4d355ccd226e83254fcb6b9ef"}, + {file = "pyzmq-24.0.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:94010bd61bc168c103a5b3b0f56ed3b616688192db7cd5b1d626e49f28ff51b3"}, + {file = "pyzmq-24.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8242543c522d84d033fe79be04cb559b80d7eb98ad81b137ff7e0a9020f00ace"}, + {file = "pyzmq-24.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ccb94342d13e3bf3ffa6e62f95b5e3f0bc6bfa94558cb37f4b3d09d6feb536ff"}, + {file = "pyzmq-24.0.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6640f83df0ae4ae1104d4c62b77e9ef39be85ebe53f636388707d532bee2b7b8"}, + {file = "pyzmq-24.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a180dbd5ea5d47c2d3b716d5c19cc3fb162d1c8db93b21a1295d69585bfddac1"}, + {file = "pyzmq-24.0.1-cp311-cp311-win32.whl", hash = "sha256:624321120f7e60336be8ec74a172ae7fba5c3ed5bf787cc85f7e9986c9e0ebc2"}, + {file = "pyzmq-24.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:1724117bae69e091309ffb8255412c4651d3f6355560d9af312d547f6c5bc8b8"}, + {file = "pyzmq-24.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:15975747462ec49fdc863af906bab87c43b2491403ab37a6d88410635786b0f4"}, + {file = "pyzmq-24.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b947e264f0e77d30dcbccbb00f49f900b204b922eb0c3a9f0afd61aaa1cedc3d"}, + {file = "pyzmq-24.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0ec91f1bad66f3ee8c6deb65fa1fe418e8ad803efedd69c35f3b5502f43bd1dc"}, + {file = "pyzmq-24.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:db03704b3506455d86ec72c3358a779e9b1d07b61220dfb43702b7b668edcd0d"}, + {file = "pyzmq-24.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:e7e66b4e403c2836ac74f26c4b65d8ac0ca1eef41dfcac2d013b7482befaad83"}, + {file = "pyzmq-24.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:7a23ccc1083c260fa9685c93e3b170baba45aeed4b524deb3f426b0c40c11639"}, + {file = "pyzmq-24.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:fa0ae3275ef706c0309556061185dd0e4c4cd3b7d6f67ae617e4e677c7a41e2e"}, + {file = "pyzmq-24.0.1-cp36-cp36m-win32.whl", hash = "sha256:f01de4ec083daebf210531e2cca3bdb1608dbbbe00a9723e261d92087a1f6ebc"}, + {file = "pyzmq-24.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:de4217b9eb8b541cf2b7fde4401ce9d9a411cc0af85d410f9d6f4333f43640be"}, + {file = "pyzmq-24.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:78068e8678ca023594e4a0ab558905c1033b2d3e806a0ad9e3094e231e115a33"}, + {file = "pyzmq-24.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77c2713faf25a953c69cf0f723d1b7dd83827b0834e6c41e3fb3bbc6765914a1"}, + {file = "pyzmq-24.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8bb4af15f305056e95ca1bd086239b9ebc6ad55e9f49076d27d80027f72752f6"}, + {file = "pyzmq-24.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:0f14cffd32e9c4c73da66db97853a6aeceaac34acdc0fae9e5bbc9370281864c"}, + {file = "pyzmq-24.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0108358dab8c6b27ff6b985c2af4b12665c1bc659648284153ee501000f5c107"}, + {file = "pyzmq-24.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d66689e840e75221b0b290b0befa86f059fb35e1ee6443bce51516d4d61b6b99"}, + {file = "pyzmq-24.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ae08ac90aa8fa14caafc7a6251bd218bf6dac518b7bff09caaa5e781119ba3f2"}, + {file = "pyzmq-24.0.1-cp37-cp37m-win32.whl", hash = "sha256:8421aa8c9b45ea608c205db9e1c0c855c7e54d0e9c2c2f337ce024f6843cab3b"}, + {file = "pyzmq-24.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:54d8b9c5e288362ec8595c1d98666d36f2070fd0c2f76e2b3c60fbad9bd76227"}, + {file = "pyzmq-24.0.1-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:acbd0a6d61cc954b9f535daaa9ec26b0a60a0d4353c5f7c1438ebc88a359a47e"}, + {file = "pyzmq-24.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:47b11a729d61a47df56346283a4a800fa379ae6a85870d5a2e1e4956c828eedc"}, + {file = "pyzmq-24.0.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:abe6eb10122f0d746a0d510c2039ae8edb27bc9af29f6d1b05a66cc2401353ff"}, + {file = "pyzmq-24.0.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:07bec1a1b22dacf718f2c0e71b49600bb6a31a88f06527dfd0b5aababe3fa3f7"}, + {file = "pyzmq-24.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0d945a85b70da97ae86113faf9f1b9294efe66bd4a5d6f82f2676d567338b66"}, + {file = "pyzmq-24.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1b7928bb7580736ffac5baf814097be342ba08d3cfdfb48e52773ec959572287"}, + {file = "pyzmq-24.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b946da90dc2799bcafa682692c1d2139b2a96ec3c24fa9fc6f5b0da782675330"}, + {file = "pyzmq-24.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c8840f064b1fb377cffd3efeaad2b190c14d4c8da02316dae07571252d20b31f"}, + {file = "pyzmq-24.0.1-cp38-cp38-win32.whl", hash = "sha256:4854f9edc5208f63f0841c0c667260ae8d6846cfa233c479e29fdc85d42ebd58"}, + {file = "pyzmq-24.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:42d4f97b9795a7aafa152a36fe2ad44549b83a743fd3e77011136def512e6c2a"}, + {file = "pyzmq-24.0.1-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:52afb0ac962963fff30cf1be775bc51ae083ef4c1e354266ab20e5382057dd62"}, + {file = "pyzmq-24.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8bad8210ad4df68c44ff3685cca3cda448ee46e20d13edcff8909eba6ec01ca4"}, + {file = "pyzmq-24.0.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dabf1a05318d95b1537fd61d9330ef4313ea1216eea128a17615038859da3b3b"}, + {file = "pyzmq-24.0.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5bd3d7dfd9cd058eb68d9a905dec854f86649f64d4ddf21f3ec289341386c44b"}, + {file = "pyzmq-24.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8012bce6836d3f20a6c9599f81dfa945f433dab4dbd0c4917a6fb1f998ab33d"}, + {file = "pyzmq-24.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c31805d2c8ade9b11feca4674eee2b9cce1fec3e8ddb7bbdd961a09dc76a80ea"}, + {file = "pyzmq-24.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:3104f4b084ad5d9c0cb87445cc8cfd96bba710bef4a66c2674910127044df209"}, + {file = "pyzmq-24.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:df0841f94928f8af9c7a1f0aaaffba1fb74607af023a152f59379c01c53aee58"}, + {file = "pyzmq-24.0.1-cp39-cp39-win32.whl", hash = "sha256:a435ef8a3bd95c8a2d316d6e0ff70d0db524f6037411652803e118871d703333"}, + {file = "pyzmq-24.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:2032d9cb994ce3b4cba2b8dfae08c7e25bc14ba484c770d4d3be33c27de8c45b"}, + {file = "pyzmq-24.0.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bb5635c851eef3a7a54becde6da99485eecf7d068bd885ac8e6d173c4ecd68b0"}, + {file = "pyzmq-24.0.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:83ea1a398f192957cb986d9206ce229efe0ee75e3c6635baff53ddf39bd718d5"}, + {file = "pyzmq-24.0.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:941fab0073f0a54dc33d1a0460cb04e0d85893cb0c5e1476c785000f8b359409"}, + {file = "pyzmq-24.0.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e8f482c44ccb5884bf3f638f29bea0f8dc68c97e38b2061769c4cb697f6140d"}, + {file = "pyzmq-24.0.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:613010b5d17906c4367609e6f52e9a2595e35d5cc27d36ff3f1b6fa6e954d944"}, + {file = "pyzmq-24.0.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:65c94410b5a8355cfcf12fd600a313efee46ce96a09e911ea92cf2acf6708804"}, + {file = "pyzmq-24.0.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:20e7eeb1166087db636c06cae04a1ef59298627f56fb17da10528ab52a14c87f"}, + {file = "pyzmq-24.0.1-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a2712aee7b3834ace51738c15d9ee152cc5a98dc7d57dd93300461b792ab7b43"}, + {file = "pyzmq-24.0.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a7c280185c4da99e0cc06c63bdf91f5b0b71deb70d8717f0ab870a43e376db8"}, + {file = "pyzmq-24.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:858375573c9225cc8e5b49bfac846a77b696b8d5e815711b8d4ba3141e6e8879"}, + {file = "pyzmq-24.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:80093b595921eed1a2cead546a683b9e2ae7f4a4592bb2ab22f70d30174f003a"}, + {file = "pyzmq-24.0.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f3f3154fde2b1ff3aa7b4f9326347ebc89c8ef425ca1db8f665175e6d3bd42f"}, + {file = "pyzmq-24.0.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abb756147314430bee5d10919b8493c0ccb109ddb7f5dfd2fcd7441266a25b75"}, + {file = "pyzmq-24.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44e706bac34e9f50779cb8c39f10b53a4d15aebb97235643d3112ac20bd577b4"}, + {file = "pyzmq-24.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:687700f8371643916a1d2c61f3fdaa630407dd205c38afff936545d7b7466066"}, + {file = "pyzmq-24.0.1.tar.gz", hash = "sha256:216f5d7dbb67166759e59b0479bca82b8acf9bed6015b526b8eb10143fb08e77"}, +] +qtconsole = [ + {file = "qtconsole-5.4.0-py3-none-any.whl", hash = "sha256:be13560c19bdb3b54ed9741a915aa701a68d424519e8341ac479a91209e694b2"}, + {file = "qtconsole-5.4.0.tar.gz", hash = "sha256:57748ea2fd26320a0b77adba20131cfbb13818c7c96d83fafcb110ff55f58b35"}, +] +QtPy = [ + {file = "QtPy-2.3.0-py3-none-any.whl", hash = "sha256:8d6d544fc20facd27360ea189592e6135c614785f0dec0b4f083289de6beb408"}, + {file = "QtPy-2.3.0.tar.gz", hash = "sha256:0603c9c83ccc035a4717a12908bf6bc6cb22509827ea2ec0e94c2da7c9ed57c5"}, +] +rfc3339-validator = [ + {file = "rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa"}, + {file = "rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b"}, +] +rfc3986-validator = [ + {file = "rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9"}, + {file = "rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055"}, +] +Send2Trash = [ + {file = "Send2Trash-1.8.0-py3-none-any.whl", hash = "sha256:f20eaadfdb517eaca5ce077640cb261c7d2698385a6a0f072a4a5447fd49fa08"}, + {file = "Send2Trash-1.8.0.tar.gz", hash = "sha256:d2c24762fd3759860a0aff155e45871447ea58d2be6bdd39b5c8f966a0c99c2d"}, +] +setuptools = [ + {file = "setuptools-65.5.0-py3-none-any.whl", hash = "sha256:f62ea9da9ed6289bfe868cd6845968a2c854d1427f8548d52cae02a42b4f0356"}, + {file = "setuptools-65.5.0.tar.gz", hash = "sha256:512e5536220e38146176efb833d4a62aa726b7bbff82cfbc8ba9eaa3996e0b17"}, +] +setuptools-scm = [ + {file = "setuptools_scm-7.0.5-py3-none-any.whl", hash = "sha256:7930f720905e03ccd1e1d821db521bff7ec2ac9cf0ceb6552dd73d24a45d3b02"}, + {file = "setuptools_scm-7.0.5.tar.gz", hash = "sha256:031e13af771d6f892b941adb6ea04545bbf91ebc5ce68c78aaf3fff6e1fb4844"}, +] +six = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] +sniffio = [ + {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, + {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, +] +soupsieve = [ + {file = "soupsieve-2.3.2.post1-py3-none-any.whl", hash = "sha256:3b2503d3c7084a42b1ebd08116e5f81aadfaea95863628c80a3b774a11b7c759"}, + {file = "soupsieve-2.3.2.post1.tar.gz", hash = "sha256:fc53893b3da2c33de295667a0e19f078c14bf86544af307354de5fcf12a3f30d"}, +] +stack-data = [ + {file = "stack_data-0.6.2-py3-none-any.whl", hash = "sha256:cbb2a53eb64e5785878201a97ed7c7b94883f48b87bfb0bbe8b623c74679e4a8"}, + {file = "stack_data-0.6.2.tar.gz", hash = "sha256:32d2dd0376772d01b6cb9fc996f3c8b57a357089dec328ed4b6553d037eaf815"}, +] +terminado = [ + {file = "terminado-0.17.1-py3-none-any.whl", hash = "sha256:8650d44334eba354dd591129ca3124a6ba42c3d5b70df5051b6921d506fdaeae"}, + {file = "terminado-0.17.1.tar.gz", hash = "sha256:6ccbbcd3a4f8a25a5ec04991f39a0b8db52dfcd487ea0e578d977e6752380333"}, +] +tinycss2 = [ + {file = "tinycss2-1.2.1-py3-none-any.whl", hash = "sha256:2b80a96d41e7c3914b8cda8bc7f705a4d9c49275616e886103dd839dfc847847"}, + {file = "tinycss2-1.2.1.tar.gz", hash = "sha256:8cff3a8f066c2ec677c06dbc7b45619804a6938478d9d73c284b29d14ecb0627"}, +] +tomli = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] +tornado = [ + {file = "tornado-6.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:20f638fd8cc85f3cbae3c732326e96addff0a15e22d80f049e00121651e82e72"}, + {file = "tornado-6.2-cp37-abi3-macosx_10_9_x86_64.whl", hash = "sha256:87dcafae3e884462f90c90ecc200defe5e580a7fbbb4365eda7c7c1eb809ebc9"}, + {file = "tornado-6.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba09ef14ca9893954244fd872798b4ccb2367c165946ce2dd7376aebdde8e3ac"}, + {file = "tornado-6.2-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b8150f721c101abdef99073bf66d3903e292d851bee51910839831caba341a75"}, + {file = "tornado-6.2-cp37-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3a2f5999215a3a06a4fc218026cd84c61b8b2b40ac5296a6db1f1451ef04c1e"}, + {file = "tornado-6.2-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:5f8c52d219d4995388119af7ccaa0bcec289535747620116a58d830e7c25d8a8"}, + {file = "tornado-6.2-cp37-abi3-musllinux_1_1_i686.whl", hash = "sha256:6fdfabffd8dfcb6cf887428849d30cf19a3ea34c2c248461e1f7d718ad30b66b"}, + {file = "tornado-6.2-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:1d54d13ab8414ed44de07efecb97d4ef7c39f7438cf5e976ccd356bebb1b5fca"}, + {file = "tornado-6.2-cp37-abi3-win32.whl", hash = "sha256:5c87076709343557ef8032934ce5f637dbb552efa7b21d08e89ae7619ed0eb23"}, + {file = "tornado-6.2-cp37-abi3-win_amd64.whl", hash = "sha256:e5f923aa6a47e133d1cf87d60700889d7eae68988704e20c75fb2d65677a8e4b"}, + {file = "tornado-6.2.tar.gz", hash = "sha256:9b630419bde84ec666bfd7ea0a4cb2a8a651c2d5cccdbdd1972a0c859dfc3c13"}, +] +traitlets = [ + {file = "traitlets-5.8.0-py3-none-any.whl", hash = "sha256:c864831efa0ba6576d09b44884b34e41defc18c0d7e720b4a2d6698c842cab3e"}, + {file = "traitlets-5.8.0.tar.gz", hash = "sha256:6cc57d6dc28c85d5365961726ffd19b538739347749e13ebe34e03323a0e8f84"}, +] +typing-extensions = [ + {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, + {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, +] +uri-template = [ + {file = "uri_template-1.2.0-py3-none-any.whl", hash = "sha256:f1699c77b73b925cf4937eae31ab282a86dc885c333f2e942513f08f691fc7db"}, + {file = "uri_template-1.2.0.tar.gz", hash = "sha256:934e4d09d108b70eb8a24410af8615294d09d279ce0e7cbcdaef1bd21f932b06"}, +] +wcwidth = [ + {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, + {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, +] +webcolors = [ + {file = "webcolors-1.12-py3-none-any.whl", hash = "sha256:d98743d81d498a2d3eaf165196e65481f0d2ea85281463d856b1e51b09f62dce"}, + {file = "webcolors-1.12.tar.gz", hash = "sha256:16d043d3a08fd6a1b1b7e3e9e62640d09790dce80d2bdd4792a175b35fe794a9"}, +] +webencodings = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] +websocket-client = [ + {file = "websocket-client-1.4.2.tar.gz", hash = "sha256:d6e8f90ca8e2dd4e8027c4561adeb9456b54044312dba655e7cae652ceb9ae59"}, + {file = "websocket_client-1.4.2-py3-none-any.whl", hash = "sha256:d6b06432f184438d99ac1f456eaf22fe1ade524c3dd16e661142dc54e9cba574"}, +] +widgetsnbextension = [ + {file = "widgetsnbextension-4.0.5-py3-none-any.whl", hash = "sha256:eaaaf434fb9b08bd197b2a14ffe45ddb5ac3897593d43c69287091e5f3147bf7"}, + {file = "widgetsnbextension-4.0.5.tar.gz", hash = "sha256:003f716d930d385be3fd9de42dd9bf008e30053f73bddde235d14fbeaeff19af"}, +] +zipp = [ + {file = "zipp-3.11.0-py3-none-any.whl", hash = "sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa"}, + {file = "zipp-3.11.0.tar.gz", hash = "sha256:a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766"}, +] diff --git a/ch-13/4.3-monte-carlo_perf/pyproject.toml b/ch-13/4.3-monte-carlo_perf/pyproject.toml new file mode 100644 index 0000000..8e33d98 --- /dev/null +++ b/ch-13/4.3-monte-carlo_perf/pyproject.toml @@ -0,0 +1,22 @@ +[tool.poetry] +name = "modelling-space" +version = "0.1.0" +description = "" +authors = ["Danny Staple "] +readme = "README.md" +packages = [{include = "modelling_space"}] + +[tool.poetry.dependencies] +python = "^3.9" +matplotlib = "3.6.1" +numpy = "1.23.4" +bleak = "0.19.0" +jupyter = "^1.0.0" + + +[tool.poetry.group.dev.dependencies] +black = "^22.10.0" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/ch-13/4.3-monte-carlo_perf/requirements.txt b/ch-13/4.3-monte-carlo_perf/requirements.txt new file mode 100644 index 0000000..01fedac --- /dev/null +++ b/ch-13/4.3-monte-carlo_perf/requirements.txt @@ -0,0 +1,3 @@ +matplotlib==3.6.1 +numpy==1.23.4 +bleak==0.19.0 diff --git a/ch-13/4.3-monte-carlo_perf/robot/arena.py b/ch-13/4.3-monte-carlo_perf/robot/arena.py new file mode 100644 index 0000000..5425679 --- /dev/null +++ b/ch-13/4.3-monte-carlo_perf/robot/arena.py @@ -0,0 +1,97 @@ +"""Represent the lines of the arena""" +try: + from ulab import numpy as np +except ImportError: + import numpy as np + +width = 1500 +height = 1500 +cutout_width = 500 +cutout_height = 500 + +boundary_lines = [ + [(0,0), (0, height)], + [(0, height), (width, height)], + [(width, height), (width, cutout_height)], + [(width, cutout_height), (width - cutout_width, cutout_height)], + [(width - cutout_width, cutout_height), (width - cutout_width, 0)], + [(width - cutout_width, 0), (0, 0)], +] + +def contains(x, y): + """Return True if the point is inside the arena. + if the point is inside the rectangle, but not inside the cutout, it's inside the arena. + """ + # is it inside the rectangle? + if x < 0 or x > width \ + or y < 0 or y > height: + return False + # is it inside the cutout? + if x > (width - cutout_width) and y < cutout_height: + return False + return True + + +grid_cell_size = 50 +overscan = 10 # 10 each way + + +def get_distance_to_segment(x, y, segment): + """Return the distance from the point to the segment. + Segment -> ((x1, y1), (x2, y2)) + All segments are horizontal or vertical. + """ + x1, y1 = segment[0] + x2, y2 = segment[1] + # if the segment is horizontal, the point will be closest to the y value of the segment + if y1 == y2 and x >= min(x1, x2) and x <= max(x1, x2): + return abs(y - y1) + # if the segment is vertical, the point will be closest to the x value of the segment + if x1 == x2 and y >= min(y1, y2) and y <= max(y1, y2): + return abs(x - x1) + # the point will be closest to one of the end points + return np.sqrt( + min( + (x - x1) ** 2 + (y - y1) ** 2, + (x - x2) ** 2 + (y - y2) ** 2 + ) + ) + + +def get_distance_likelihood(x, y): + """Return the distance from the point to the nearest segment as a decay function.""" + min_distance = None + for segment in boundary_lines: + distance = get_distance_to_segment(x, y, segment) + if min_distance is None or distance < min_distance: + min_distance = distance + return 1.0 / (1 + min_distance/250) ** 2 + + +# beam endpoint model +def make_distance_grid(): + """Take the boundary lines. With and overscan of 10 cells, and grid cell size of 5cm (50mm), + make a grid of the distance to the nearest boundary line. + """ + grid = np.zeros(( + width // grid_cell_size + 2 * overscan, + height // grid_cell_size + 2 * overscan + ), dtype=np.float) + for x in range(grid.shape[0]): + column_x = x * grid_cell_size - (overscan * grid_cell_size) + for y in range(grid.shape[1]): + row_y = y * grid_cell_size - (overscan * grid_cell_size) + grid[x, y] = get_distance_likelihood( + column_x, row_y + ) + return grid + +distance_grid = make_distance_grid() + +def get_distance_grid_at_point(x, y): + """Return the distance grid value at the given point.""" + grid_x = int(x // grid_cell_size + overscan) + grid_y = int(y // grid_cell_size + overscan) + if grid_x < 0 or grid_x >= distance_grid.shape[0] or grid_y < 0 or grid_y >= distance_grid.shape[1]: + return 0 + return distance_grid[grid_x, grid_y] diff --git a/ch-13/4.3-monte-carlo_perf/robot/code.py b/ch-13/4.3-monte-carlo_perf/robot/code.py new file mode 100644 index 0000000..cef6236 --- /dev/null +++ b/ch-13/4.3-monte-carlo_perf/robot/code.py @@ -0,0 +1,290 @@ +import asyncio +import json +import random +from ulab import numpy as np + +import arena +import robot +import traceback + +from performance_counter import PerformanceCounter + +class DistanceSensorTracker: + def __init__(self): + robot.left_distance.distance_mode = 2 + robot.right_distance.distance_mode = 2 + self.left = 300 + self.right = 300 + + async def main(self): + robot.left_distance.start_ranging() + robot.right_distance.start_ranging() + while True: + if robot.left_distance.data_ready and robot.left_distance.distance: + self.left = robot.left_distance.distance * 10 # convert to mm + robot.left_distance.clear_interrupt() + if robot.right_distance.data_ready and robot.right_distance.distance: + self.right = robot.right_distance.distance * 10 + robot.right_distance.clear_interrupt() + await asyncio.sleep(0.01) + + +class CollisionAvoid: + def __init__(self, distance_sensors): + self.speed = 0.6 + self.distance_sensors = distance_sensors + + async def main(self): + try: + while True: + robot.set_right(self.speed) + while self.distance_sensors.left < 300 or \ + self.distance_sensors.right < 300: + robot.set_left(-self.speed) + await asyncio.sleep(0.3) + robot.set_left(self.speed) + await asyncio.sleep(0) + except Exception as e: + send_json({"exception": traceback.format_exception(e)}) + raise + +def get_random_sample(mean, scale): + return mean + (random.uniform(-scale, scale) + random.uniform(-scale, scale)) / 2 + +def send_json(data): + robot.uart.write((json.dumps(data) + "\n").encode()) + +def read_json(): + try: + data = robot.uart.readline() + decoded = data.decode() + return json.loads(decoded) + except (UnicodeError, ValueError): + print("Invalid data") + return None + + +def send_poses(samples): + print(f"sending {len(samples)} poses") + send_json({ + "poses": np.array(samples[:,:2], dtype=np.int16).tolist(), + }) + + +class Simulation: + def __init__(self): + self.population_size = 200 + self.poses = np.array( + [( + int(random.uniform(0, arena.width)), + int(random.uniform(0, arena.height)), + int(random.uniform(0, 360))) for _ in range(self.population_size)], + dtype=np.float, + ) + self.distance_sensors = DistanceSensorTracker() + self.collision_avoider = CollisionAvoid(self.distance_sensors) + self.last_encoder_left = robot.left_encoder.read() + self.last_encoder_right = robot.right_encoder.read() + self.alpha_rot = 0.05 + self.alpha_rot_trans = 0.01 + self.alpha_trans = 0.05 + self.alpha_trans_rot = 0.01 + + # profiling + self.pc_resample = PerformanceCounter() + self.pc_odometry = PerformanceCounter() + self.pc_move_poses = PerformanceCounter() # superset of odometry time + self.pc_randomise_motion = PerformanceCounter() + self.pc_motion_model = PerformanceCounter() + self.pc_observe_distance_sensors = PerformanceCounter() + self.pc_observation_model = PerformanceCounter() + + def resample(self, weights, sample_count): + """Return sample_count number of samples from the + poses, based on the weights array. + Uses low variance resampling""" + self.pc_resample.start() + samples = np.zeros((sample_count, 3)) + interval = 1 / sample_count + shift = random.uniform(0, interval) + cumulative_weights = weights[0] + source_index = 0 + for current_index in range(sample_count): + weight_index = shift + current_index * interval + while weight_index >= cumulative_weights: + source_index += 1 + source_index = min(len(weights), source_index) + cumulative_weights += weights[source_index] + samples[current_index] = self.poses[source_index] + self.pc_resample.stop() + return samples + + def convert_odometry_to_motion(self, left_encoder_delta, right_encoder_delta): + """ + left_encoder is the change in the left encoder + right_encoder is the change in the right encoder + returns rot1, trans, rot2 + rot1 is the rotation of the robot in degrees before the translation + trans is the distance the robot has moved in mm + rot2 is the rotation of the robot in degrees + """ + self.pc_odometry.start() + left_mm = left_encoder_delta * robot.ticks_to_mm + right_mm = right_encoder_delta * robot.ticks_to_mm + + if left_mm == right_mm: + return 0, left_mm, 0 + + # calculate the radius of the arc + radius = (robot.wheelbase_mm / 2) * (left_mm + right_mm) / (right_mm - left_mm) + ## angle = difference in steps / wheelbase + d_theta = (right_mm - left_mm) / robot.wheelbase_mm + # For a small enough motion, assume that the chord length = arc length + arc_length = d_theta * radius + rot1 = np.degrees(d_theta/2) + rot2 = rot1 + self.pc_odometry.stop() + return rot1, arc_length, rot2 + + def move_poses(self, rot1, trans, rot2): + self.pc_move_poses.start() + self.poses[:,2] += rot1 + rot1_radians = np.radians(self.poses[:,2]) + self.poses[:,0] += trans * np.cos(rot1_radians) + self.poses[:,1] += trans * np.sin(rot1_radians) + self.poses[:,2] += rot2 + self.poses[:,2] = np.array([float(theta % 360) for theta in self.poses[:,2]]) + self.pc_move_poses.stop() + + def randomise_motion(self, rot1, trans, rot2): + self.pc_randomise_motion.start() + rot1_scale = self.alpha_rot * abs(rot1) + self.alpha_rot_trans * abs(trans) + trans_scale = self.alpha_trans * abs(trans) + self.alpha_trans_rot * (abs(rot1) + abs(rot2)) + rot2_scale = self.alpha_rot * abs(rot2) + self.alpha_rot_trans * abs(trans) + rot1_model = np.array([get_random_sample(rot1, rot1_scale) for _ in range(self.poses.shape[0])]) + trans_model = np.array([get_random_sample(trans, trans_scale) for _ in range(self.poses.shape[0])]) + rot2_model = np.array([get_random_sample(rot2, rot2_scale) for _ in range(self.poses.shape[0])]) + self.pc_randomise_motion.stop() + return rot1_model, trans_model, rot2_model + + def motion_model(self): + """Apply the motion model""" + self.pc_motion_model.start() + new_encoder_left = robot.left_encoder.read() + new_encoder_right = robot.right_encoder.read() + + rot1, trans, rot2 = self.convert_odometry_to_motion( + new_encoder_left - self.last_encoder_left, + new_encoder_right - self.last_encoder_right) + self.last_encoder_left = new_encoder_left + self.last_encoder_right = new_encoder_right + + rot1_model, trans_model, rot2_model = self.randomise_motion(rot1, trans, rot2) + self.move_poses(rot1_model, trans_model, rot2_model) +# +# print( +# json.dumps( +# [self.poses.tolist(), rot1, trans, rot2] +# ) +# ) + self.pc_motion_model.stop() + + def observe_distance_sensors(self, weights): + self.pc_observe_distance_sensors.start() + # Sensor triangle left + opposite = self.distance_sensors.left + robot.dist_forward_mm + adjacent = robot.dist_side_mm + left_angle = np.atan(opposite / adjacent) + left_hypotenuse = np.sqrt(opposite**2 + adjacent**2) + # Sensor triangle right + opposite = self.distance_sensors.right + robot.dist_forward_mm + adjacent = robot.dist_side_mm + right_angle = np.atan(opposite / adjacent) + right_hypotenuse = np.sqrt(opposite**2 + adjacent**2) + + # modify the current weights based on the distance sensors + left_sensor = np.zeros((self.poses.shape[0], 2), dtype=np.float) + right_sensor = np.zeros((self.poses.shape[0], 2), dtype=np.float) + # left sensor + poses_left_angle = np.radians(self.poses[:, 2]) + left_angle + left_sensor[:, 0] = self.poses[:, 0] + np.cos(poses_left_angle) * left_hypotenuse + left_sensor[:, 1] = self.poses[:, 1] + np.sin(poses_left_angle) * left_hypotenuse + + # right sensor + poses_right_angle = np.radians(self.poses[:, 2]) - right_angle + right_sensor[:, 0] = self.poses[:, 0] + np.cos(poses_right_angle) * right_hypotenuse + right_sensor[:, 1] = self.poses[:, 1] + np.sin(poses_right_angle) * right_hypotenuse + + # Look up the distance in the arena + for index in range(self.poses.shape[0]): + sensor_weight = arena.get_distance_grid_at_point(left_sensor[index,0], left_sensor[index,1]) + sensor_weight += arena.get_distance_grid_at_point(right_sensor[index,0], right_sensor[index,1]) + weights[index] *= sensor_weight + self.pc_observe_distance_sensors.stop() + return weights + + def observation_model(self): + self.pc_observation_model.start() + weights = np.ones(self.poses.shape[0], dtype=np.float) + for index, pose in enumerate(self.poses): + if not arena.contains(pose[:1], pose[:2]): + weights[index] = 0.01 + weights = self.observe_distance_sensors(weights) + weights = weights / np.sum(weights) + self.pc_observation_model.stop() + return weights + + def print_pc_lines(self): + if self.pc_odometry.count % 10 != 0: + return + + print("Resample: ", self.pc_resample.performance_line()) + print("Odometry: ", self.pc_odometry.performance_line()) + print("Move Poses: ", self.pc_move_poses.performance_line()) + print("Randomise Motion: ", self.pc_randomise_motion.performance_line()) + print("Motion Model: ", self.pc_motion_model.performance_line()) + print("Observe Distance Sensors: ", self.pc_observe_distance_sensors.performance_line()) + print("Observation Model: ", self.pc_observation_model.performance_line()) + + async def main(self): + asyncio.create_task(self.distance_sensors.main()) + collision_avoider = asyncio.create_task(self.collision_avoider.main()) + try: + while True: + weights = self.observation_model() + print("Weights: ", weights) + send_poses(self.resample(weights, 20)) + self.poses = self.resample(weights, self.population_size) + await asyncio.sleep(0.05) + self.motion_model() + self.print_pc_lines() + except Exception as e: + send_json({"exception": traceback.format_exception(e)}) + raise + finally: + collision_avoider.cancel() + robot.stop() + + +async def command_handler(simulation): + print("Starting handler") + simulation_task = None + while True: + if robot.uart.in_waiting: + request = read_json() + if not request: + continue + print("Received: ", request) + if request["command"] == "arena": + send_json({ + "arena": arena.boundary_lines, + }) + elif request["command"] == "start": + if not simulation_task: + simulation_task = asyncio.create_task(simulation.main()) + + await asyncio.sleep(0.1) + + +simulation = Simulation() +asyncio.run(command_handler(simulation)) diff --git a/ch-13/4.3-monte-carlo_perf/robot/performance_counter.py b/ch-13/4.3-monte-carlo_perf/robot/performance_counter.py new file mode 100644 index 0000000..c8e2505 --- /dev/null +++ b/ch-13/4.3-monte-carlo_perf/robot/performance_counter.py @@ -0,0 +1,85 @@ +import time + + +class PerformanceCounter: + def __init__(self): + self.count = 0 + self.total_time = 0 + self.start_time = 0 + + def start(self): + self.start_time = time.monotonic() + + def stop(self): + end = time.monotonic() + self.total_time += (end - self.start_time) + self.count += 1 + + def per_call(self): + return self.total_time / self.count + + def total_call_time(self): + return self.total_time + + def call_count(self): + return self.count + + def performance_line(self): + return f"Calls: {self.count}, Total time: {self.total_time} s, Per call: {self.per_call()}" + + +# class PerformanceCounterDecorator: +# def __init__(self, fn): +# self.count = 0 +# self.total_time = 0 +# self.fn = fn + +# def __call__(self, *args, **kwargs): +# start = time.monotonic() +# try: +# print(f"Calling method with {args}, {kwargs}") +# return self.fn(*args, **kwargs) +# finally: +# end = time.monotonic() +# self.total_time += (end - start) +# self.count += 1 + +# def per_call(self): +# return self.total_time / self.count + +# def total_call_time(self): +# return self.total_time + +# def call_count(self): +# return self.count + +# def performance_line(self): +# return f"Calls: {self.count}, Total time: {self.total_time} s, Per call: {self.per_call()}" + + +# @PerformanceCounter +# def slow_printer(stuff): +# print(f"Hello, {stuff}") +# time.sleep(0.05) +# return "hello" + +# class SomeClass: +# def __init__(self, stuff): +# self.stuff = stuff + +# @PerformanceCounter +# def test(self, more_stuff): +# print(self.stuff, more_stuff) +# return 5 + +# result = slow_printer("first_thing") +# print(f"result is {result}") +# # for n in range(1000): +# # slow_printer("first_thing") +# # slow_printer("second_thing") +# print(slow_printer.performance_line()) + +# some_instance = SomeClass("foo") +# result = some_instance.test("bar") +# print(result) +# print(SomeClass.test.performance_line()) diff --git a/ch-13/4.3-monte-carlo_perf/robot/pid_controller.py b/ch-13/4.3-monte-carlo_perf/robot/pid_controller.py new file mode 100644 index 0000000..a09358f --- /dev/null +++ b/ch-13/4.3-monte-carlo_perf/robot/pid_controller.py @@ -0,0 +1,27 @@ +class PIDController: + def __init__(self, kp, ki, kd, d_filter_gain=0.1, imax=None, imin=None): + self.kp = kp + self.ki = ki + self.kd = kd + self.d_filter_gain = d_filter_gain + self.imax = imax + self.imin = imin + self.reset() + + def reset(self): + self.integral = 0 + self.error_prev = 0 + self.derivative = 0 + + def calculate(self, error, dt): + self.integral += error * dt + if self.imax is not None and self.integral > self.imax: + self.integral = self.imax + if self.imin is not None and self.integral < self.imin: + self.integral = self.imin + # Add a low pass filter to the difference + difference = (error - self.error_prev) * self.d_filter_gain + self.error_prev += difference + self.derivative = difference / dt + + return self.kp * error + self.ki * self.integral + self.kd * self.derivative diff --git a/ch-13/4.3-monte-carlo_perf/robot/pio_encoder.py b/ch-13/4.3-monte-carlo_perf/robot/pio_encoder.py new file mode 100644 index 0000000..b831bf4 --- /dev/null +++ b/ch-13/4.3-monte-carlo_perf/robot/pio_encoder.py @@ -0,0 +1,84 @@ +import rp2pio +import adafruit_pioasm +import array +import asyncio + + +program = """ +; use the osr for count +; input pins c1 c2 + + set y, 0 ; clear y + mov osr, y ; and clear osr +read: + ; x will be the old value + ; y the new values + mov x, y ; store old Y in x + in null, 32 ; Clear ISR - using y + in pins, 2 ; read two pins into y + mov y, isr + jmp x!=y, different ; Jump if its different + jmp read ; otherwise loop back to read + +different: + ; x has old value, y has new. + ; extract the upper bit of X. + in x, 31 ; get bit 31 - old p1 (remember which direction it came in) + in null, 31 ; keep only 1 bit + mov x, isr ; put this back in x + jmp !x, c1_old_zero + +c1_old_not_zero: + jmp pin, count_up + jmp count_down + +c1_old_zero: + jmp pin, count_down + ; fall through +count_up: + ; for a clockwise move - we'll add 1 by inverting + mov x, ~ osr ; store inverted OSR on x + jmp x--, fake ; use jump to take off 1 +fake: + mov x, ~ x ; invert back + jmp send +count_down: + ; for a clockwise move, just take one off + mov x, osr ; store osr in x + jmp x--, send ; dec and send +send: + ; send x. + mov isr, x ; send it + push noblock ; put ISR into input FIFO + mov osr, x ; put X back in OSR + jmp read ; loop back +""" + +assembled = adafruit_pioasm.assemble(program) + + +class QuadratureEncoder: + def __init__(self, first_pin, second_pin, reversed=False): + """Encoder with 2 pins. Must use sequential pins on the board""" + self.sm = rp2pio.StateMachine( + assembled, + frequency=0, + first_in_pin=first_pin, + jmp_pin=second_pin, + in_pin_count=2, + ) + self.reversed = reversed + self._buffer = array.array("i", [0]) + asyncio.create_task(self.poll_loop()) + + async def poll_loop(self): + while True: + await asyncio.sleep(0) + while self.sm.in_waiting: + self.sm.readinto(self._buffer) + + def read(self): + if self.reversed: + return -self._buffer[0] + else: + return self._buffer[0] diff --git a/ch-13/4.3-monte-carlo_perf/robot/robot.py b/ch-13/4.3-monte-carlo_perf/robot/robot.py new file mode 100755 index 0000000..6cd1c28 --- /dev/null +++ b/ch-13/4.3-monte-carlo_perf/robot/robot.py @@ -0,0 +1,80 @@ +import board +import pwmio +import pio_encoder +import busio +import adafruit_vl53l1x +import math +import adafruit_bno055 + +uart = busio.UART(board.GP12, board.GP13, baudrate=9600, timeout=0.1) + +wheel_diameter_mm = 69.5 +wheel_circumference_mm = math.pi * wheel_diameter_mm +gear_ratio = 298 +encoder_poles = 28 +ticks_per_revolution = encoder_poles * gear_ratio +ticks_to_mm = wheel_circumference_mm / ticks_per_revolution +ticks_to_m = ticks_to_mm / 1000 +m_to_ticks = 1 / ticks_to_m +wheelbase_mm = 170 +dist_side_mm = 37 # approx mm +dist_forward_mm = 66 # approx mm + +motor_A2 = pwmio.PWMOut(board.GP17, frequency=100) +motor_A1 = pwmio.PWMOut(board.GP16, frequency=100) +motor_B2 = pwmio.PWMOut(board.GP18, frequency=100) +motor_B1 = pwmio.PWMOut(board.GP19, frequency=100) + +right_motor = motor_A1, motor_A2 +left_motor = motor_B1, motor_B2 + +right_encoder = pio_encoder.QuadratureEncoder(board.GP20, board.GP21) +left_encoder = pio_encoder.QuadratureEncoder(board.GP26, board.GP27, reversed=True) + +i2c0 = busio.I2C(sda=board.GP0, scl=board.GP1) +i2c1 = busio.I2C(sda=board.GP2, scl=board.GP3) + +left_distance = adafruit_vl53l1x.VL53L1X(i2c0) +right_distance = adafruit_vl53l1x.VL53L1X(i2c1) + +imu = adafruit_bno055.BNO055_I2C(i2c0) + +def stop(): + motor_A1.duty_cycle = 0 + motor_A2.duty_cycle = 0 + motor_B1.duty_cycle = 0 + motor_B2.duty_cycle = 0 + + +def set_speed(motor, speed): + # Swap motor pins if we reverse the speed + if abs(speed) < 0.1: + motor[0].duty_cycle = 0 + motor[1].duty_cycle = 1 + return + if speed < 0: + direction = motor[1], motor[0] + speed = -speed + else: + direction = motor + speed = min(speed, 1) # limit to 1.0 + max_speed = 2 ** 16 - 1 + + direction[0].duty_cycle = int(max_speed * speed) + direction[1].duty_cycle = 0 + + +def set_left(speed): + set_speed(left_motor, speed) + + +def set_right(speed): + set_speed(right_motor, speed) + +def send_line(message): + uart.write(f"{message}\n".encode()) + +def check_imu_status(): + sys_status, gyro, accel, mag = imu.calibration_status + send_line(f"Sys: {sys_status}, Gyro: {gyro}, Accel: {accel}, Mag: {mag}") + return sys_status == 3 diff --git a/ch-13/4.3-monte-carlo_perf/robot_ble_connection.py b/ch-13/4.3-monte-carlo_perf/robot_ble_connection.py new file mode 100644 index 0000000..66dd100 --- /dev/null +++ b/ch-13/4.3-monte-carlo_perf/robot_ble_connection.py @@ -0,0 +1,38 @@ +import asyncio + +import bleak + + +class BleConnection: + # See https://learn.adafruit.com/introducing-adafruit-ble-bluetooth-low-energy-friend/uart-service + ble_uuid = "6E400001-B5A3-F393-E0A9-E50E24DCCA9E" + rx_gatt = "6E400003-B5A3-F393-E0A9-E50E24DCCA9E" + tx_gatt = "6E400002-B5A3-F393-E0A9-E50E24DCCA9E" + ble_name = "Adafruit Bluefruit LE" + + def __init__(self, receive_handler): + self.ble_client = None + self.receive_handler = receive_handler + + def _uart_handler(self, _, data: bytes): + self.receive_handler(data) + + async def connect(self): + print("Scanning for devices...") + devices = await bleak.BleakScanner.discover(service_uuids=[self.ble_uuid]) + print(f"Found {len(devices)} devices") + print([device.name for device in devices]) + ble_device_info = [device for device in devices if device.name==self.ble_name][0] + print(f"Connecting to {ble_device_info.name}...") + self.ble_client = bleak.BleakClient(ble_device_info.address) + await self.ble_client.connect() + print("Connected to {}".format(ble_device_info.name)) + self.notify_task = asyncio.create_task( + self.ble_client.start_notify(self.rx_gatt, self._uart_handler) + ) + + async def close(self): + await self.ble_client.disconnect() + + async def send_uart_data(self, data): + await self.ble_client.write_gatt_char(self.tx_gatt, data)