Compare commits
11040 commits
longlong-m
...
1.12-more-
| Author | SHA1 | Date | |
|---|---|---|---|
| 63a4610221 | |||
| a9f67ed70f | |||
| 9795197c99 | |||
|
|
023a56fe43 | ||
|
|
17fcd499b2 | ||
|
|
f99deeda68 | ||
|
|
9e183bbbba | ||
|
|
36f1ac38cb | ||
|
|
4e1d2fa056 | ||
|
|
d7faac11b8 | ||
|
|
91739de71a | ||
|
|
76033d5115 | ||
|
|
65c1ddb570 | ||
|
|
5bd1da21a2 | ||
|
|
92919c25c2 | ||
|
|
7cf8f79dbf | ||
|
|
de3c5ff976 | ||
|
|
4bafbca0c3 | ||
|
|
453fd9234f | ||
|
|
d1861a6b9c | ||
|
|
6571e6d7b5 | ||
|
|
f7f6a42f3d | ||
|
|
7f81e15007 | ||
|
|
38f6b9c969 | ||
|
|
9700295ebe | ||
|
|
927d5a0455 | ||
|
|
889da596ff | ||
|
|
30f31639d3 | ||
|
|
75349191a6 | ||
|
|
ed374a89fb | ||
|
|
929485e7ce | ||
|
|
2ba2574ebf | ||
|
|
ccbd1073cc | ||
|
|
a680b37232 | ||
|
|
7b492773e3 | ||
|
|
80f05c76a8 | ||
|
|
b21afac006 | ||
|
|
63fd57a5bc | ||
|
|
7e5f00a0e2 | ||
|
|
79fb03c240 | ||
|
|
80e8b4ac14 | ||
| 8565a9ab90 | |||
|
|
454e78f41f | ||
|
|
e2e414927d | ||
|
|
4e3c1d4a4c | ||
| 05a81a066e | |||
| 34c4cc1bd9 | |||
| f838ff9528 | |||
|
|
9d8545e5e2 | ||
|
|
47a673b67d | ||
|
|
81313348bd | ||
|
|
346740e152 | ||
|
|
0ced0f9713 | ||
|
|
eb93317aef | ||
|
|
71ec48a6db | ||
|
|
6d7045398d | ||
|
|
954d3dcbf9 | ||
|
|
4c6bfc8399 | ||
|
|
8f73270f2b | ||
| 10fee3e673 | |||
| 2def016fd0 | |||
| 7fb751808f | |||
|
|
c931c84e49 | ||
|
|
f1b5249d3c | ||
|
|
09f7b43c64 | ||
|
|
7a47213701 | ||
|
|
b3ffb3ab1f | ||
|
|
e90c52e06b | ||
|
|
b8253680bf | ||
|
|
22b72ad9a7 | ||
|
|
0e2431048d | ||
| 46c9b1bc37 | |||
| d50feebd2c | |||
| 4dcbdac97e | |||
|
|
5f1201e7e7 | ||
|
|
c0f37c20cc | ||
|
|
cd5763d368 | ||
|
|
01979acd48 | ||
|
|
14abea2af7 | ||
| 5c5736ee1e | |||
| 99799cded6 | |||
|
|
b057fb8a4b | ||
|
|
c9b02e0f80 | ||
|
|
18548fc5d2 | ||
|
|
68d5839f64 | ||
|
|
6620ac8bec | ||
|
|
0120f15530 | ||
|
|
4701f0a2ef | ||
|
|
396f9072be | ||
|
|
e54e5e3575 | ||
|
|
6ded933295 | ||
|
|
d46630b70a | ||
|
|
83c768b25d | ||
|
|
0c1f36b1e1 | ||
|
|
17e419f129 | ||
|
|
ac69f7a175 | ||
|
|
b25829ecd9 | ||
|
|
24fb3ccca6 | ||
|
|
f0b04d403d | ||
| 76d68f21ac | |||
|
|
0e8b99dc65 | ||
|
|
626f786e6b | ||
|
|
fce6226ca5 | ||
|
|
efdbc6be08 | ||
|
|
f83a925715 | ||
|
|
b6fa90d0b5 | ||
|
|
b665f981dc | ||
|
|
be21589722 | ||
|
|
34ba3ad242 | ||
|
|
090f5b77fd | ||
|
|
2198b1a4df | ||
|
|
5bd2e97865 | ||
|
|
493127f4bc | ||
|
|
e0bb7385a1 | ||
|
|
b2160bdddd | ||
|
|
b0a6395ef0 | ||
| fc4538f845 | |||
|
|
390398371d | ||
|
|
0189b80aa4 | ||
|
|
5ccd5dc08b | ||
|
|
81e11ae063 | ||
|
|
efa9cfa5ec | ||
|
|
15f8b80005 | ||
|
|
43c16c89c4 | ||
|
|
f55d684057 | ||
|
|
00f9891cfa | ||
|
|
0be5cbb5b6 | ||
|
|
dfdd6b0365 | ||
|
|
827f67813f | ||
|
|
63d71dc079 | ||
|
|
eb44d130c6 | ||
|
|
017bd6362e | ||
|
|
51570eb58b | ||
|
|
1c700a82c9 | ||
|
|
f69bf8beb9 | ||
|
|
d67ccb625c | ||
|
|
aa28d4f315 | ||
|
|
223027fe9e | ||
|
|
e4456bd756 | ||
|
|
fc39acb612 | ||
|
|
3978b50b8d | ||
|
|
103deb2f5f | ||
|
|
8bef15aa2d | ||
|
|
8ef6d0c9a9 | ||
|
|
d9e15adb01 | ||
|
|
0d743224f2 | ||
|
|
b273f59c4e | ||
|
|
cd8deb0b72 | ||
|
|
84b980ddbd | ||
|
|
46de3ca203 | ||
|
|
23b248f1de | ||
|
|
2d9a5fcbab | ||
|
|
036e3cf412 | ||
|
|
4bf9243de9 | ||
|
|
cca57fa16d | ||
|
|
b1f4a9a9fd | ||
|
|
9a3f04a1b8 | ||
|
|
1163af5d48 | ||
|
|
cc36402a64 | ||
| 95a75b0410 | |||
|
|
92d7f31046 | ||
|
|
c6ee471b52 | ||
|
|
37887c42a4 | ||
|
|
7ace53f22c | ||
|
|
d5768c5338 | ||
|
|
d136078768 | ||
|
|
2a78a5154f | ||
|
|
bd5a3a3ba4 | ||
|
|
a490376576 | ||
|
|
b8d55d6dbf | ||
|
|
8053d4a7a3 | ||
| 4f36504aeb | |||
|
|
42abb982fe | ||
|
|
ff07b8f2d1 | ||
|
|
9dc6d691b8 | ||
|
|
56be8306cd | ||
|
|
137745e911 | ||
|
|
2506ed7855 | ||
|
|
05af973478 | ||
|
|
b6a3a07fe1 | ||
|
|
8956ad8f15 | ||
|
|
c333acdbad | ||
|
|
36f3897fe3 | ||
|
|
2a6386fb59 | ||
|
|
0365755ebd | ||
|
|
eacb7dbe58 | ||
|
|
991413a469 | ||
|
|
cd7f5fe350 | ||
|
|
ebfe36c9aa | ||
|
|
11b9a5e605 | ||
|
|
1b60c9d033 | ||
|
|
35d618b656 | ||
|
|
371862cf5c | ||
|
|
61e33a5619 | ||
| 280aefffb7 | |||
|
|
ddca91020e | ||
|
|
dcee89ade7 | ||
|
|
68920682b6 | ||
|
|
ca6dda4d2b | ||
|
|
4fb3139273 | ||
|
|
c672b33770 | ||
|
|
8a86f9dff6 | ||
|
|
fdc5bb41f4 | ||
|
|
72055ff02b | ||
| d69ca4a8ae | |||
| 3aec1032f7 | |||
| 3ce0b512f8 | |||
|
|
5ec195b5ef | ||
|
|
e3b3f97fa6 | ||
|
|
19235d9c31 | ||
|
|
5d6bef569d | ||
|
|
e5cffa94e8 | ||
|
|
0539b88a6b | ||
|
|
af4b6e3598 | ||
|
|
8544249fc0 | ||
|
|
203e3c8fee | ||
|
|
088c51cc80 | ||
|
|
e6aaf9924f | ||
| 2fb5eb3b11 | |||
|
|
82479b6a2c | ||
|
|
6097afdaa5 | ||
|
|
e532e6a529 | ||
|
|
c3e40d50ab | ||
|
|
2a5fe57e43 | ||
|
|
e0386a8598 | ||
|
|
d133eeedc2 | ||
|
|
30c02df4a5 | ||
|
|
354be8cbcc | ||
| 1a2ce27b73 | |||
| 1a163dd70d | |||
|
|
8958c1e227 | ||
|
|
71eabe814c | ||
|
|
1c98b823b6 | ||
|
|
27361e1187 | ||
|
|
322174a492 | ||
|
|
334a1e3ba6 | ||
|
|
989f9b52be | ||
|
|
bf58afdb2a | ||
|
|
e962b24da1 | ||
|
|
3e558a89ac | ||
|
|
a1562430f6 | ||
|
|
0357af1726 | ||
|
|
71576932a3 | ||
| fc86475de5 | |||
| 93d6ceedd9 | |||
| bcd90dd927 | |||
|
|
ae80378c4e | ||
|
|
57e70adc69 | ||
|
|
8a8deb4c6f | ||
| 234fa2a226 | |||
|
|
8b6ffba392 | ||
|
|
27d8832868 | ||
|
|
d04eab530e | ||
|
|
cc44554165 | ||
|
|
a9b42a0e27 | ||
|
|
ca1467187e | ||
|
|
61414ea1f8 | ||
|
|
cf51640157 | ||
|
|
3969ce2990 | ||
|
|
22e8863a00 | ||
|
|
e1e4d21db4 | ||
|
|
59fa9b01ad | ||
|
|
1d55dee15b | ||
|
|
6e17db3286 | ||
| 97fd77b3bb | |||
|
|
4ee781227f | ||
| 30e612fd55 | |||
| 78089107bc | |||
|
|
43ba81ffa1 | ||
|
|
a78d00a73d | ||
|
|
bb19264880 | ||
|
|
54a6bf4f54 | ||
|
|
3af02b692b | ||
|
|
d4a45d401d | ||
|
|
9bf4b4d81e | ||
|
|
53f3282e9c | ||
|
|
f8da94b8ba | ||
|
|
7c164f0786 | ||
|
|
c1987b7311 | ||
|
|
7c36e53b5b | ||
|
|
2adb4b5e49 | ||
|
|
72d970ad98 | ||
|
|
c4a90d8857 | ||
|
|
1afd204828 | ||
| fb7b968b10 | |||
| 3f158450f9 | |||
| 5a56df989f | |||
| 758dc81fcb | |||
| b1dfd64fdc | |||
| 4c0245bac6 | |||
| dc9daba906 | |||
|
|
51c09e877d | ||
|
|
3451c25a75 | ||
|
|
ecf38fdfd4 | ||
|
|
12b0ee0a3e | ||
|
|
7c3975ecf2 | ||
|
|
da16e4dce1 | ||
|
|
5b7f90bc3d | ||
|
|
58835e5a5b | ||
|
|
a9b4e04643 | ||
| 3f3cb79b7d | |||
| 89fc0298ce | |||
|
|
0135c5cc79 | ||
|
|
5425242195 | ||
|
|
49b878d8f5 | ||
|
|
4909160135 | ||
| 489163b74e | |||
|
|
1ae6f362e1 | ||
|
|
57011c8611 | ||
|
|
41eb9cb255 | ||
|
|
fbc1b467aa | ||
|
|
6b22e8fbc0 | ||
|
|
7ad6058837 | ||
|
|
77889fe70c | ||
|
|
171820e53f | ||
|
|
5f77d07760 | ||
|
|
3c4d763fef | ||
|
|
7810cb275c | ||
|
|
be50732515 | ||
|
|
f4bf8e468d | ||
|
|
d0ba75e6dc | ||
|
|
0752bbd5fd | ||
|
|
3e8e683a73 | ||
|
|
0e915dc3fb | ||
|
|
c41639f30a | ||
|
|
5d8bdd20b4 | ||
|
|
0582d639c1 | ||
| cce8b2be07 | |||
| cb29ad0846 | |||
|
|
c9f2591d7c | ||
|
|
7471e978bb | ||
|
|
ea7ca8ae96 | ||
| 71eee45a37 | |||
|
|
2453d70e4c | ||
| 1bb5bed80f | |||
|
|
38382bfd12 | ||
|
|
580456719c | ||
|
|
65759622ea | ||
|
|
840373f5c2 | ||
|
|
b274a0497b | ||
|
|
8e0834d74c | ||
|
|
38072a139e | ||
|
|
f73625877d | ||
|
|
f143e5d049 | ||
|
|
dfac6d9f62 | ||
|
|
00178ca5e0 | ||
|
|
277b0d1f0d | ||
|
|
010232574e | ||
|
|
b04f9130c7 | ||
|
|
bca327ec9a | ||
|
|
a13da2ad57 | ||
|
|
0280064640 | ||
|
|
9ac8ea587a | ||
|
|
9f1b68578b | ||
|
|
f8cd7d777f | ||
|
|
03340a3fcd | ||
| 583fc76cf5 | |||
|
|
8056af8648 | ||
|
|
0501c8d79f | ||
|
|
999f713423 | ||
|
|
172715194f | ||
|
|
d7dc3801ab | ||
|
|
a70b679ed5 | ||
|
|
b40d072648 | ||
|
|
2bc61b4580 | ||
|
|
231cb1ffd9 | ||
|
|
1d48054aea | ||
|
|
ffb70a8737 | ||
|
|
9e110f120a | ||
|
|
8b448eb491 | ||
|
|
155b61f027 | ||
|
|
abdc6d59ec | ||
|
|
0b212e2243 | ||
|
|
5810461adf | ||
|
|
01c153cd7e | ||
|
|
da4dceea15 | ||
|
|
0105b30a07 | ||
|
|
aec0ef3cbf | ||
|
|
56362a9806 | ||
|
|
9485805b6a | ||
|
|
e9ceb9263e | ||
|
|
7831be5a55 | ||
|
|
3785eb7779 | ||
|
|
47801bb73c | ||
|
|
6b89883797 | ||
|
|
36f91fe022 | ||
|
|
f79d60b205 | ||
|
|
b440883fe5 | ||
|
|
5314fddca0 | ||
|
|
c81007afb0 | ||
|
|
f8cea3ba3b | ||
|
|
cde659651b | ||
|
|
278d53c512 | ||
|
|
36edc4bb89 | ||
|
|
3b613ff97c | ||
|
|
c106b432c5 | ||
|
|
67c039db43 | ||
|
|
98425c9a9d | ||
|
|
d52662856b | ||
|
|
7867632a81 | ||
|
|
f200e6a21e | ||
|
|
24831a79d3 | ||
|
|
904e94abeb | ||
|
|
03d3e1f6e8 | ||
| 5a0e9945e6 | |||
|
|
2373e64780 | ||
|
|
76c1ae7194 | ||
|
|
b56c16c684 | ||
|
|
a05aab8304 | ||
|
|
d8af26b729 | ||
|
|
e4572ebdc2 | ||
|
|
10c9f61352 | ||
|
|
36ae69ab6f | ||
|
|
ea23a74d2f | ||
|
|
488e20dc43 | ||
|
|
c63093c130 | ||
|
|
56160f8c1a | ||
|
|
ebd6011633 | ||
| c64fccbeee | |||
| 7229fe631d | |||
|
|
e084a92671 | ||
|
|
4b42932188 | ||
|
|
8884682cac | ||
|
|
7970a2fee1 | ||
|
|
9b188934d1 | ||
| 39500cdeab | |||
| 95ac6c716b | |||
|
|
40829d4cc8 | ||
|
|
4aea7f8f52 | ||
|
|
0d8b2723c0 | ||
|
|
22906ac95e | ||
|
|
90724dca43 | ||
|
|
4e7ad1e59c | ||
|
|
3fcb6b278f | ||
|
|
9d38e1a16d | ||
|
|
c0ec904c7a | ||
|
|
7ae7bf68c0 | ||
|
|
caafae3b3d | ||
|
|
38e791381e | ||
|
|
0615876d9f | ||
| ee59c75f62 | |||
| 06743d91ed | |||
|
|
d7a2ae9df7 | ||
| 01a1cdf13a | |||
|
|
1512ca520b | ||
| 6abea8a4aa | |||
|
|
8293e1eedc | ||
|
|
47437cb415 | ||
|
|
ea82ca1d02 | ||
|
|
21c55f8e75 | ||
|
|
b2d913412f | ||
|
|
ac232f297f | ||
|
|
5d2b60cbf6 | ||
|
|
0d52725b36 | ||
|
|
c54468a45b | ||
|
|
768c9db058 | ||
|
|
d0125617fd | ||
|
|
623ece2c73 | ||
|
|
2589515342 | ||
| 0b22a9397a | |||
| 0ba0fae495 | |||
| 74243fd71a | |||
|
|
e3c54b0660 | ||
|
|
c480047880 | ||
| f5fd42c393 | |||
| 36d608aa67 | |||
| 3b506f0fa5 | |||
| f40c0c13ad | |||
|
|
bd95914e88 | ||
| 47ca792765 | |||
|
|
11e510a06a | ||
|
|
670375dc0d | ||
|
|
588e4b8421 | ||
| 720d242b4f | |||
| c157ada90c | |||
|
|
d27055aa4a | ||
|
|
36aa861458 | ||
|
|
4d89893aff | ||
|
|
719e8710f2 | ||
|
|
b8d4f9655f | ||
|
|
c37a1f45f3 | ||
|
|
580121d46e | ||
|
|
ef91e1752c | ||
|
|
f6cabccd9e | ||
|
|
bfc8c89536 | ||
|
|
592f89f6ae | ||
|
|
5c3cce6f5d | ||
|
|
337727ba0c | ||
| 074ba1daff | |||
| 94fa8e8a60 | |||
| 5810004bc9 | |||
|
|
75ba26ee7c | ||
|
|
1be5ca7881 | ||
|
|
856bf302b4 | ||
| df2d08366a | |||
| e1dd396de7 | |||
|
|
dcd9a8ab91 | ||
|
|
5bc132a209 | ||
|
|
b5333f2bdf | ||
|
|
3d15877639 | ||
|
|
cae3397ea0 | ||
|
|
f13bee0471 | ||
|
|
9e0cfcff96 | ||
| 58679dc038 | |||
| 97b6664201 | |||
|
|
2b910b7292 | ||
|
|
870dadc85a | ||
|
|
e16c0f38e8 | ||
|
|
a367e84cea | ||
|
|
227ac67463 | ||
|
|
5167e9cbac | ||
|
|
4a5df5ab9b | ||
|
|
cd108e50ba | ||
|
|
9d523fd6da | ||
|
|
c6e696ae11 | ||
|
|
bc690d4070 | ||
|
|
bdc368895f | ||
|
|
0890b54cd9 | ||
|
|
fb437d8280 | ||
|
|
3b01a65743 | ||
|
|
361cb1ca11 | ||
|
|
9de40f56f3 | ||
|
|
c9427780b3 | ||
|
|
ea578a10a6 | ||
|
|
49baa94446 | ||
| 542fb58673 | |||
|
|
288415f867 | ||
|
|
30a74b3d92 | ||
|
|
e326d7ca80 | ||
|
|
2115a76c2f | ||
|
|
f7a988b9b3 | ||
|
|
65cc95da3f | ||
|
|
c8b3562de7 | ||
|
|
a5e2b73936 | ||
|
|
c560e79a31 | ||
|
|
477a58f8bf | ||
|
|
0a39e01237 | ||
|
|
9cb8ce67ed | ||
| 1af6aa25ce | |||
| 3963031ef9 | |||
| b9a973c8e0 | |||
|
|
921bf6de7c | ||
| d3bf1fe15d | |||
| 253385d9b7 | |||
| 0403a2cca5 | |||
| ed61e8955d | |||
| d0e3848b24 | |||
| cc1dd73e94 | |||
|
|
4538d973d2 | ||
| c2ed1b0942 | |||
|
|
05ed179e11 | ||
|
|
f9b4189b4c | ||
|
|
ed3f636be5 | ||
|
|
22ed0abf6c | ||
|
|
0567d06936 | ||
| 2e2b40be01 | |||
|
|
a52eb88031 | ||
|
|
090b6ba42f | ||
|
|
6c32a1f67f | ||
|
|
3cbff45f9a | ||
|
|
4fdcddaa4d | ||
| b33d77bfe8 | |||
|
|
0eec279371 | ||
| 651f54b4cc | |||
| 094265cb86 | |||
|
|
1386a8104a | ||
|
|
9a83501982 | ||
| 6e9a44bbfd | |||
|
|
da030ce7d8 | ||
|
|
4b567178f1 | ||
|
|
9133b23a37 | ||
|
|
6a56d5dc73 | ||
|
|
d2563c57de | ||
|
|
1fbfd4f5d5 | ||
|
|
8e425a9354 | ||
|
|
a339e31e4d | ||
|
|
550eab2ddd | ||
|
|
a8ea24849f | ||
|
|
b413535ee1 | ||
|
|
1b106de4e0 | ||
|
|
45487f14a0 | ||
|
|
96ce43e6d6 | ||
|
|
6628f49852 | ||
|
|
a5c6759325 | ||
|
|
aec03a409f | ||
|
|
2009aecac3 | ||
|
|
de93df6444 | ||
|
|
bbb1a8b7fa | ||
|
|
8265c321f6 | ||
|
|
73139102fc | ||
|
|
0ce5b2f594 | ||
|
|
054908b912 | ||
|
|
8d3217cbf3 | ||
|
|
307d2a99fe | ||
|
|
06cabd6995 | ||
|
|
fa34b8a404 | ||
|
|
5689307798 | ||
|
|
b02b1e9979 | ||
|
|
1658fe04f9 | ||
|
|
c384ebe5c0 | ||
|
|
7321411962 | ||
|
|
56a219911f | ||
|
|
b080d6207b | ||
|
|
c6aaab6f64 | ||
|
|
c71b6cb699 | ||
|
|
a9afa0d9d4 | ||
|
|
f75a009ed4 | ||
|
|
b5d2cc6f46 | ||
|
|
24f4d981bd | ||
|
|
0e451a1681 | ||
|
|
40886d198d | ||
|
|
a32359b0a2 | ||
|
|
3b948b244e | ||
|
|
de88fa37fb | ||
|
|
061d5910cb | ||
|
|
18668f6e28 | ||
|
|
76d0870fba | ||
|
|
0b73c7a212 | ||
|
|
5ace7af933 | ||
|
|
1ebbd14d0f | ||
|
|
15e97f12a1 | ||
|
|
08c5dbb003 | ||
| 16bfe3b41c | |||
|
|
f0965b1ef7 | ||
| c95def0b32 | |||
|
|
ef0ce0df72 | ||
|
|
85f0f07d51 | ||
|
|
be9e045ee3 | ||
|
|
58fb011070 | ||
|
|
d1c6bb0927 | ||
|
|
a3c3e8a0fa | ||
|
|
3b46f2c878 | ||
|
|
d5365cb066 | ||
|
|
5beb529f61 | ||
|
|
fe0655e121 | ||
|
|
0c58cc4772 | ||
|
|
1ae858126a | ||
|
|
c7eb174361 | ||
|
|
d650849581 | ||
|
|
ff2f402ac9 | ||
|
|
2c3002b327 | ||
|
|
c39e1e9f55 | ||
|
|
709cee0aaf | ||
|
|
a61db7f12e | ||
|
|
f0e3274a33 | ||
| 1e5ffe1a53 | |||
|
|
1aad93baa3 | ||
|
|
c4b30420f1 | ||
|
|
e3b314e1e6 | ||
|
|
48c486807b | ||
|
|
d1e3626460 | ||
|
|
7d92f5aa5a | ||
|
|
c6eb3f98be | ||
|
|
be90fa80e8 | ||
|
|
6f4510d7aa | ||
|
|
576da73a17 | ||
|
|
95b7a59156 | ||
|
|
3db0fec267 | ||
|
|
88650bc4d0 | ||
|
|
7029783985 | ||
|
|
f83465e371 | ||
|
|
f6fe8440d0 | ||
|
|
183fbbfe23 | ||
|
|
775f1b9e0d | ||
|
|
e3d4036f2e | ||
|
|
8dc6c5bf24 | ||
|
|
4fc6c7d8c9 | ||
|
|
b5a955a168 | ||
|
|
240909ed57 | ||
|
|
88542e1826 | ||
|
|
27703f3156 | ||
|
|
069cf60138 | ||
|
|
5d2631281a | ||
|
|
6052b4e06b | ||
|
|
9b0b59d75f | ||
|
|
fe29780afb | ||
|
|
2771e7fe75 | ||
|
|
16f82b9797 | ||
| cdb0fda72a | |||
|
|
24ac8152dd | ||
|
|
26eb429cc6 | ||
|
|
1a6c021239 | ||
|
|
b77d0e5736 | ||
|
|
7ab75fa398 | ||
|
|
e1f8b8a5b8 | ||
|
|
8f64aae9ca | ||
|
|
a6cb7d7069 | ||
|
|
d919b7fa4a | ||
|
|
8594396a07 | ||
| 32475ce98c | |||
|
|
f1ada8e880 | ||
|
|
804ab4c1d6 | ||
|
|
103632f444 | ||
|
|
a23129bc49 | ||
|
|
0c012da080 | ||
|
|
baeb3e91a6 | ||
|
|
a4133c4545 | ||
|
|
1c2a1a672f | ||
|
|
156ee4833a | ||
|
|
1d33353ed3 | ||
|
|
8e8368d594 | ||
|
|
3b76299f39 | ||
|
|
17aa9ae3f6 | ||
|
|
4a50f1dd6f | ||
|
|
e68ab5ae2a | ||
|
|
67e598a863 | ||
|
|
48e727f7d6 | ||
|
|
6cf9c5158c | ||
|
|
08e1f926fe | ||
| b23c5b2d68 | |||
|
|
4f040af481 | ||
|
|
67fb3054b4 | ||
|
|
7b359d7a8a | ||
|
|
28638df589 | ||
|
|
d2056a46ee | ||
|
|
bed96a98d2 | ||
|
|
2881699cf9 | ||
|
|
dfcc9c6d8b | ||
|
|
bff585ffd2 | ||
| cd1f19020f | |||
| f7e42bfebc | |||
|
|
3c50918adc | ||
|
|
2ae1e7de61 | ||
|
|
915a5eddeb | ||
|
|
4cf6579e22 | ||
|
|
e0b96c0f43 | ||
|
|
4720dc179a | ||
|
|
c97721455a | ||
|
|
c68073e12b | ||
|
|
2ab13d6d1e | ||
|
|
a4dda3a5ba | ||
|
|
c9dea3d72d | ||
|
|
b1268107af | ||
|
|
68552e90e8 | ||
|
|
c5c297d2c0 | ||
|
|
b7f03f9487 | ||
|
|
2d941b070f | ||
|
|
d1184e7e94 | ||
|
|
bc14ed31f6 | ||
|
|
c023ec03ff | ||
|
|
7970c882a6 | ||
|
|
3698d4bc5d | ||
|
|
bd01d31542 | ||
|
|
ff62b0d2c0 | ||
|
|
68ac14b309 | ||
|
|
2ae8a44b2a | ||
|
|
627c5f5bd4 | ||
|
|
c26120a3ac | ||
|
|
6f99026a64 | ||
|
|
13453d35c6 | ||
|
|
dca2989df8 | ||
|
|
cca7679146 | ||
|
|
b71f3e1385 | ||
| 2be302fa0b | |||
|
|
29575ee439 | ||
|
|
bd06992a37 | ||
|
|
71c43ca2dd | ||
|
|
3babdf7c7e | ||
|
|
ac308872d6 | ||
|
|
c5feceeafc | ||
|
|
9aa11ec51e | ||
| b0fca4fcda | |||
|
|
d6836047a8 | ||
|
|
66fd861b22 | ||
|
|
20d2088851 | ||
|
|
cd48c5ee83 | ||
|
|
88353f2f5b | ||
|
|
ced707ed32 | ||
|
|
6281a9024b | ||
|
|
9dff2d8b29 | ||
|
|
8a23298bfe | ||
|
|
514b73bcf8 | ||
|
|
1d8933dd05 | ||
|
|
55e41d43eb | ||
|
|
7c2a291bd1 | ||
|
|
fb7a0f7efc | ||
|
|
eafcd7d364 | ||
|
|
afa508cb47 | ||
|
|
98075c5255 | ||
|
|
e3ab394cd6 | ||
|
|
dd88904cc1 | ||
|
|
4167778bbc | ||
|
|
9b96bae668 | ||
|
|
30d491e136 | ||
|
|
58fb7b9b32 | ||
|
|
6046d37f31 | ||
|
|
37ee18349f | ||
|
|
4246cc3f6d | ||
| b27afad9cb | |||
|
|
9a98f590e4 | ||
|
|
e9bb215bc2 | ||
|
|
efc2667b5f | ||
|
|
a8964c3bcd | ||
|
|
f50f276100 | ||
|
|
38f7f23803 | ||
|
|
15615effc2 | ||
|
|
0a58d451ad | ||
|
|
f31b472309 | ||
|
|
9939c59caa | ||
| 8bfd308d37 | |||
|
|
e4f0e47d9f | ||
|
|
ce70b95990 | ||
|
|
8bf5dd93c1 | ||
|
|
248acd07c8 | ||
|
|
3268330b3a | ||
|
|
f41fb6fafc | ||
|
|
9f6ebf3012 | ||
|
|
2651e15a52 | ||
|
|
722a7150ca | ||
|
|
ffd0807680 | ||
| f560b5f3a3 | |||
|
|
7c921b808b | ||
|
|
f9d21637a3 | ||
|
|
cb2cf81136 | ||
|
|
b029031286 | ||
|
|
a6b9523337 | ||
|
|
64192b0ebf | ||
|
|
6fc5e8eb3a | ||
|
|
54d11a8e2d | ||
| 5a00862b1d | |||
| 4b63a8c9b4 | |||
|
|
5a62a0ec90 | ||
|
|
ef628c4521 | ||
|
|
c940e112a0 | ||
|
|
d0eab5c561 | ||
|
|
7991ac56a0 | ||
|
|
7441625f37 | ||
|
|
0dabd1ace2 | ||
| bddd6b013d | |||
|
|
cc15f9d211 | ||
|
|
1b3bca14cb | ||
|
|
1e939d24f5 | ||
|
|
c33d86f78f | ||
|
|
01bd93721c | ||
|
|
21a8752166 | ||
| 238484ec26 | |||
|
|
d140066a26 | ||
|
|
532e7db293 | ||
| 407a8c222a | |||
|
|
af9dfccab1 | ||
|
|
dac047db61 | ||
|
|
f722df70c8 | ||
|
|
41105d24a9 | ||
|
|
1fcc0e47ff | ||
|
|
5c2c743bbd | ||
|
|
173608f1aa | ||
|
|
58de611217 | ||
|
|
d68fdf3a3d | ||
|
|
0178c44aaa | ||
|
|
ebecb28a33 | ||
|
|
07b3a7f6d7 | ||
|
|
538cd7eada | ||
|
|
347d0fcb49 | ||
|
|
34917b8e8e | ||
|
|
2a3cd5b294 | ||
|
|
d7bc8a46a5 | ||
|
|
24473b7983 | ||
|
|
38fb7b511b | ||
|
|
9c41753e44 | ||
|
|
e9953754ea | ||
|
|
e505c59ed8 | ||
|
|
121c6bcc9b | ||
|
|
6e0ce23f3e | ||
|
|
19178a1767 | ||
|
|
6c3fcead62 | ||
|
|
6520d169e4 | ||
|
|
f4886a6f46 | ||
|
|
8c8d60fb80 | ||
|
|
29c89a2487 | ||
|
|
f3515502b7 | ||
|
|
6374408c06 | ||
|
|
94edff9063 | ||
|
|
3afc269b18 | ||
|
|
24fdda038e | ||
|
|
f7eac46c78 | ||
|
|
776301c932 | ||
|
|
8aacd3f40a | ||
|
|
888a0c5f08 | ||
|
|
d9234ffa82 | ||
|
|
7942932176 | ||
|
|
7562b0cbb8 | ||
|
|
2e6e91dc5c | ||
|
|
3ea89b86c1 | ||
|
|
7c8d7d77dd | ||
|
|
60d600d2ce | ||
|
|
caedc3bba6 | ||
| 1d1ff5f308 | |||
|
|
db2bea8e48 | ||
|
|
5158aec8c1 | ||
|
|
ac880152a1 | ||
|
|
fb4af7e77e | ||
|
|
0259e1a89a | ||
|
|
3f08cb47b8 | ||
|
|
52bc935fa7 | ||
|
|
f0432b9d6f | ||
|
|
ec4cd68edc | ||
|
|
d0f1cfb039 | ||
|
|
2b163ccd6a | ||
|
|
1b00d94b23 | ||
|
|
80f7972f72 | ||
|
|
b69cb0144c | ||
| 22276710e6 | |||
|
|
a7a4f93ff8 | ||
|
|
4097c949a3 | ||
|
|
94d7bfb1c9 | ||
|
|
199a8ce8b0 | ||
|
|
d4bf0d5e2d | ||
|
|
f8eb5bc275 | ||
|
|
8170e26a86 | ||
|
|
bbe0602738 | ||
|
|
a7120bfad9 | ||
|
|
fb32e0a7fd | ||
|
|
69b10d7925 | ||
|
|
d9a2c8308f | ||
|
|
a52132c170 | ||
|
|
00b1d4e167 | ||
|
|
abfacc3742 | ||
|
|
86e60f5f35 | ||
|
|
17ff5dcc99 | ||
|
|
8e15f36baa | ||
| dac4ac5d2a | |||
|
|
c883bb773b | ||
|
|
5d7fdafcde | ||
|
|
ef3a61432b | ||
|
|
dafdd246bc | ||
|
|
e369473794 | ||
|
|
ced820c8a7 | ||
|
|
eeb89a97b4 | ||
| b7f5c277ad | |||
|
|
cd4d55a573 | ||
|
|
e858db07f0 | ||
|
|
2815c6dafa | ||
|
|
af5ad50125 | ||
|
|
18658b77f3 | ||
|
|
b720028642 | ||
|
|
b935dcafdc | ||
|
|
379f454ce6 | ||
|
|
889f02abe4 | ||
|
|
abbbb91fa8 | ||
|
|
360475e266 | ||
|
|
e41137c745 | ||
|
|
001d7299b2 | ||
|
|
8b626a4800 | ||
|
|
137a995ef5 | ||
|
|
7a4198885e | ||
|
|
1a0bf4c33f | ||
|
|
a9951c9b6c | ||
|
|
ca9b7debe0 | ||
|
|
78b2daa2a7 | ||
|
|
a30d4ad25d | ||
|
|
cca6cfe026 | ||
|
|
3fdf29e773 | ||
|
|
863981a5b8 | ||
|
|
0aafeac209 | ||
|
|
b19e7c9148 | ||
|
|
2262af0b52 | ||
|
|
244b7e2300 | ||
| aa1de69645 | |||
| 144acfcb98 | |||
|
|
d3742a2a1f | ||
|
|
07576b1c22 | ||
|
|
8b7674f0c5 | ||
|
|
51e712a9de | ||
|
|
96c3b20d0e | ||
|
|
79b1226759 | ||
|
|
8470f0fdb7 | ||
|
|
93bf269c0d | ||
|
|
8caa72cfc2 | ||
|
|
8b5e0f2c62 | ||
|
|
a7baca2149 | ||
|
|
7113bd13f1 | ||
|
|
410e728c85 | ||
|
|
9905e841f3 | ||
|
|
38b5a14421 | ||
|
|
2830984aef | ||
|
|
9df8d8269c | ||
|
|
eb8f6e30f1 | ||
|
|
156cc4b577 | ||
| a04369e0f5 | |||
|
|
cf3217e6d4 | ||
| 1a3b12a3bc | |||
|
|
d8715ac92a | ||
|
|
a9a2145238 | ||
|
|
2074244bce | ||
|
|
52f2fd6d53 | ||
|
|
417173b752 | ||
|
|
9a4b8c5ed9 | ||
|
|
dea498a51f | ||
|
|
9fbeb0baea | ||
|
|
03577ec81c | ||
|
|
dac81ea545 | ||
|
|
0a00f91979 | ||
|
|
f1df07002f | ||
| 646eb9a7db | |||
| dde2b8dfb3 | |||
|
|
27bc5492f5 | ||
|
|
e9c7af1dee | ||
|
|
fb7cce6503 | ||
|
|
7ac20bfb8b | ||
|
|
66dd74cd12 | ||
|
|
ad8916499d | ||
|
|
5d154937d6 | ||
|
|
fdf9d04a75 | ||
|
|
7b6f89a074 | ||
|
|
220f86f873 | ||
|
|
2529c263de | ||
|
|
985e020936 | ||
|
|
076a7b7161 | ||
|
|
67406488d1 | ||
|
|
9d4442e298 | ||
|
|
ee5a48fece | ||
|
|
db102ab1ad | ||
|
|
312bbdaa6c | ||
| f50e7c71f8 | |||
|
|
b12ccefbe6 | ||
|
|
e37ec5199c | ||
|
|
552f25255f | ||
|
|
df1789c270 | ||
|
|
1cd4e4552e | ||
| b854c06a0c | |||
| 5c758523c0 | |||
| ffae89b191 | |||
| 72e8fb085c | |||
|
|
d56fe7691d | ||
|
|
7fd4567893 | ||
|
|
e77981f86e | ||
|
|
0ecb24c3e5 | ||
|
|
e344c6d684 | ||
|
|
e29178cf94 | ||
|
|
6921862d67 | ||
|
|
53a002a096 | ||
| ac0ffc5656 | |||
| c284728621 | |||
| 9cf7d73c6c | |||
|
|
5c37b73c6d | ||
|
|
84d3c0d02f | ||
|
|
696d212dc7 | ||
|
|
ed49c02feb | ||
| ab5eb86118 | |||
|
|
59429cdcbe | ||
|
|
a3aa48b8df | ||
|
|
261b077209 | ||
|
|
2d23b79551 | ||
|
|
c26de0136a | ||
|
|
0b8f1b9a90 | ||
|
|
93d788543c | ||
|
|
c47b2ad921 | ||
|
|
5ccbb0be62 | ||
|
|
a424dbcbbd | ||
|
|
2a467f1376 | ||
|
|
d696c8f3b5 | ||
|
|
91b137ec2b | ||
|
|
f8f59598c7 | ||
|
|
6d5ffc677b | ||
|
|
8942d7f089 | ||
|
|
6e338842fc | ||
|
|
0ec99b37e0 | ||
|
|
d54b5861a3 | ||
|
|
3e4328140c | ||
|
|
766e79ad3d | ||
|
|
9aecbd6432 | ||
| ff1942cff6 | |||
|
|
f2d7a5f1e1 | ||
|
|
527b11f99e | ||
|
|
418f52177d | ||
|
|
0399010ead | ||
|
|
08f30fedf5 | ||
|
|
6428b9e728 | ||
|
|
6c914b8722 | ||
|
|
f0564b4986 | ||
|
|
2d2c40b3d4 | ||
|
|
ac6695faba | ||
|
|
edb7f2d807 | ||
|
|
a061768ceb | ||
|
|
1207dcd127 | ||
|
|
aae10fb37f | ||
|
|
e15f157826 | ||
|
|
d7305182f0 | ||
|
|
205837c47b | ||
|
|
206109763f | ||
|
|
95a7f47f01 | ||
|
|
d00bee2149 | ||
|
|
f6603aa566 | ||
|
|
795ec21f6c | ||
|
|
4c8ba3519b | ||
|
|
983c75fb24 | ||
|
|
48d4d2b1cf | ||
|
|
191b143e7b | ||
|
|
b19c700d4a | ||
|
|
9a28f0bf45 | ||
|
|
cd05aa5223 | ||
|
|
f88357a5df | ||
|
|
ba2b65586f | ||
|
|
c53155c9d6 | ||
|
|
fd3f5708dc | ||
|
|
cfcc0f1843 | ||
|
|
5ba28e9861 | ||
|
|
989921dd43 | ||
|
|
6efd87b3c6 | ||
|
|
9e3df2f6f2 | ||
|
|
0ceac79dfb | ||
|
|
cf059b7745 | ||
|
|
3c99b09993 | ||
|
|
f6506e939f | ||
|
|
3a68ac8abb | ||
|
|
2fde67ef84 | ||
|
|
b0ed258302 | ||
|
|
a644513150 | ||
|
|
f171660870 | ||
|
|
36e90309bc | ||
|
|
5936208088 | ||
|
|
be500fd15c | ||
|
|
581bd2c137 | ||
|
|
d96f2fd2a5 | ||
|
|
c8cf1258ac | ||
|
|
386b49c3e1 | ||
|
|
c3a1bd8f13 | ||
|
|
cec921f374 | ||
|
|
785fb0e161 | ||
|
|
482e583077 | ||
|
|
7abbfb239d | ||
|
|
f66caa29b9 | ||
|
|
154496ab16 | ||
|
|
1043d619fd | ||
|
|
1b7f3d11e7 | ||
| 5423e4966c | |||
|
|
92d76f6d2f | ||
|
|
5bf08c503b | ||
|
|
ae91b12aea | ||
|
|
127cc6204a | ||
|
|
6be2466d6f | ||
|
|
ea4a12005a | ||
|
|
ae262cde55 | ||
|
|
a10ce39ae6 | ||
|
|
22dc7d5359 | ||
|
|
e12d38c147 | ||
|
|
5c3371bd1a | ||
|
|
582bc59d39 | ||
|
|
6e1c6cfc42 | ||
|
|
c6a7b00030 | ||
|
|
d0c5c7bd10 | ||
|
|
e7438c481e | ||
|
|
5136220d51 | ||
|
|
ccdf3c0b79 | ||
|
|
a310d4336b | ||
|
|
857bb8a534 | ||
|
|
8214d67e5f | ||
|
|
1292c35d59 | ||
|
|
a158dde628 | ||
|
|
4d26ffb447 | ||
|
|
0383402cd7 | ||
| 433cbc6be1 | |||
|
|
804563a4aa | ||
|
|
5bb722b927 | ||
|
|
0a55cfbde8 | ||
|
|
70e15d61b2 | ||
|
|
53f0bb3601 | ||
|
|
54bd79a51a | ||
|
|
25d456a5b8 | ||
|
|
0802b22ed6 | ||
|
|
f6e881e820 | ||
|
|
1352938504 | ||
|
|
b6ce29bc1f | ||
|
|
c4a795b1e7 | ||
|
|
e72069e241 | ||
|
|
210d0f8798 | ||
|
|
7a17c75256 | ||
|
|
3a952e96ea | ||
| 6e153d9948 | |||
|
|
d357a05870 | ||
|
|
ff7b296b04 | ||
|
|
cf9a00dcba | ||
|
|
87fe58fea5 | ||
|
|
3bf8ef4c14 | ||
|
|
8d7b1f9e8c | ||
|
|
4d90f198ec | ||
|
|
f2067730cb | ||
|
|
215a56c920 | ||
|
|
00926b687a | ||
|
|
adaf43d6d8 | ||
|
|
7083161261 | ||
|
|
491badc766 | ||
|
|
a4fa9219a9 | ||
|
|
cd616f6393 | ||
|
|
4eb396806c | ||
|
|
e699a59890 | ||
|
|
042c09dab2 | ||
|
|
2656c84b01 | ||
|
|
2afb58f2e7 | ||
|
|
32c4610957 | ||
|
|
9140bfb5b2 | ||
|
|
47665c9a81 | ||
|
|
a861498404 | ||
|
|
1a8bb1cb8b | ||
|
|
8fd6bff727 | ||
|
|
829a88d204 | ||
|
|
9aa73fe2db | ||
|
|
8789a2c8a9 | ||
|
|
a4eabdb79d | ||
|
|
56e53881d3 | ||
|
|
386deb2ac4 | ||
|
|
ced3dc70ff | ||
|
|
db7a962802 | ||
|
|
5414363965 | ||
|
|
e79283932d | ||
|
|
1a9e4f5613 | ||
|
|
817ca39f59 | ||
|
|
0cf2df48c4 | ||
|
|
e1618c21b2 | ||
|
|
ec03267035 | ||
|
|
4db7772d4e | ||
|
|
c3aa1ec10e | ||
|
|
459f323247 | ||
|
|
745ba01768 | ||
|
|
66639b237f | ||
|
|
8277ffca86 | ||
|
|
47fe99963c | ||
|
|
0c0b517112 | ||
|
|
86fbf5cc3d | ||
|
|
6d0339432c | ||
|
|
529114c162 | ||
|
|
9e160985d7 | ||
|
|
ee3eff9a07 | ||
|
|
17cf03c8e4 | ||
|
|
d51176d05c | ||
|
|
a52395a4bb | ||
|
|
6dba7a146d | ||
|
|
414db718e4 | ||
|
|
0dbd3293a9 | ||
|
|
06c58b03d3 | ||
|
|
9bceb32de7 | ||
|
|
ddd516a683 | ||
|
|
34fe152fcf | ||
|
|
75f7753a73 | ||
|
|
5975dee4d7 | ||
|
|
65da2bb125 | ||
|
|
5345128784 | ||
|
|
acbf66dacc | ||
|
|
067f42b4f8 | ||
|
|
70a5f464df | ||
|
|
e1838ff335 | ||
|
|
d4780a5192 | ||
|
|
5b2e29d000 | ||
| 66e0f2dcff | |||
|
|
a724f6f954 | ||
| 689fba764a | |||
|
|
63f9b12fe6 | ||
|
|
cfd6ffc649 | ||
|
|
f6f007a9f4 | ||
|
|
67f128c0cf | ||
| 65a883a74c | |||
| 0098909757 | |||
|
|
76256821ec | ||
|
|
a54b57ea40 | ||
|
|
9325509b54 | ||
|
|
c1c1a5d036 | ||
|
|
0d3771ece3 | ||
|
|
e285b5b98c | ||
|
|
16d54586c1 | ||
|
|
1b031508e1 | ||
|
|
c1b1ddd724 | ||
|
|
83a99cbc33 | ||
|
|
2918b73828 | ||
|
|
45b3c9ae42 | ||
|
|
b152c658e2 | ||
| 189ec2fc60 | |||
|
|
85508d7cc1 | ||
|
|
351a0e747d | ||
| 1c10ec99a7 | |||
| 20c9f25a65 | |||
| 368977fb90 | |||
|
|
d116ad042f | ||
|
|
29e672fe86 | ||
|
|
815ab5277b | ||
|
|
a9227e15d0 | ||
|
|
13812a788f | ||
| 345c2ae8a9 | |||
|
|
b42e94ee2c | ||
|
|
365fafb32b | ||
|
|
ccdc97d23e | ||
|
|
f154ee855d | ||
| 51f0544405 | |||
|
|
da6869dbd5 | ||
|
|
0ba49d7303 | ||
|
|
5b4249e365 | ||
|
|
a9f339b461 | ||
|
|
be4cfdd3d6 | ||
|
|
fbfb7b68cc | ||
|
|
61850acd14 | ||
|
|
4241fd4b18 | ||
|
|
a2ac2da7cc | ||
|
|
c075e89258 | ||
|
|
4140012430 | ||
|
|
6370e9d187 | ||
|
|
ba84cff4cb | ||
|
|
9f34ec78c4 | ||
|
|
0fa5aa359d | ||
|
|
2a55ff73b1 | ||
|
|
d6c04e85d0 | ||
|
|
30a1c52e75 | ||
|
|
c5992a3101 | ||
|
|
69c71bd522 | ||
|
|
1e97d384ff | ||
|
|
34d63debd5 | ||
|
|
69869e1439 | ||
|
|
abd9f7894d | ||
|
|
10965e5989 | ||
|
|
97f5d218a5 | ||
|
|
dc421a6ca8 | ||
|
|
34aa01c5f9 | ||
|
|
de6b05a17b | ||
|
|
dff3423c23 | ||
|
|
811a34fc3d | ||
|
|
0dfa9fb7c1 | ||
|
|
8c49c8df0a | ||
|
|
d08f991299 | ||
|
|
4e11e2d584 | ||
|
|
f50edc2904 | ||
|
|
9ce33a5771 | ||
|
|
19da28d817 | ||
|
|
64e06ccf51 | ||
|
|
ec8a42d7c9 | ||
|
|
f72c1474c5 | ||
|
|
d74097c8a7 | ||
|
|
9dbf2039f2 | ||
|
|
380338f113 | ||
|
|
500512fb53 | ||
|
|
e3275be8b1 | ||
|
|
63b5e56c72 | ||
|
|
e8e8c593ac | ||
|
|
4ae122f17b | ||
|
|
10a44af536 | ||
|
|
ea9fe24971 | ||
|
|
f39ca0a1d6 | ||
|
|
3aab17c98e | ||
|
|
2c086d68f8 | ||
|
|
e30bd35423 | ||
|
|
7263302c8c | ||
|
|
f88a896c03 | ||
|
|
6043fdf940 | ||
|
|
2249a33203 | ||
|
|
9b8246f889 | ||
|
|
1f6cd496c7 | ||
|
|
b73b30ff9f | ||
|
|
af8cc9345d | ||
|
|
b7a63dc498 | ||
|
|
b47fd08b20 | ||
|
|
dbd5b7d9f0 | ||
|
|
b0f7fd933f | ||
|
|
6a6f22b0e6 | ||
|
|
fb1e0106b5 | ||
|
|
48721584f9 | ||
|
|
2b4ad1ed03 | ||
|
|
733094aead | ||
|
|
84d7a0da9d | ||
|
|
eff68b0d9f | ||
|
|
333c932adf | ||
|
|
984f1a1af5 | ||
|
|
328d1ee592 | ||
|
|
f1e4960d14 | ||
|
|
15a6e8c136 | ||
|
|
a805ff45b2 | ||
|
|
54e2f85c9b | ||
|
|
47be90fbb3 | ||
|
|
409b5ff009 | ||
|
|
55c6d3e92f | ||
|
|
b4bdf55eda | ||
|
|
4804032f09 | ||
|
|
c8046af6e7 | ||
|
|
35c836f096 | ||
|
|
0240ab9f7a | ||
|
|
914326872f | ||
|
|
368751b6e9 | ||
|
|
ebb4df846f | ||
|
|
7076da3040 | ||
|
|
672d0e27a3 | ||
|
|
a01ff658ea | ||
|
|
e27dd26dc7 | ||
|
|
1e88b9411d | ||
|
|
41459d15d9 | ||
|
|
ee48e4b452 | ||
|
|
dea2bcd8f0 | ||
|
|
07a9593abc | ||
|
|
e867d1915e | ||
|
|
c524900a1b | ||
|
|
6710d737d6 | ||
|
|
a2a32907eb | ||
|
|
4b23a7872b | ||
|
|
377cb517cf | ||
|
|
6a76b60027 | ||
|
|
a9389343a8 | ||
|
|
41b9196167 | ||
|
|
d43eb7e84b | ||
|
|
49e059cdaf | ||
|
|
f50c9f4145 | ||
|
|
d3995eaf97 | ||
|
|
b609bc0124 | ||
|
|
ea0e2f80b7 | ||
|
|
0e3da9b6a3 | ||
|
|
239f73f42d | ||
|
|
816cbe4704 | ||
|
|
fe5acae318 | ||
|
|
fac4d9c5b9 | ||
|
|
cab9139975 | ||
|
|
a9a776890c | ||
|
|
05cc67f537 | ||
|
|
03e9415b86 | ||
|
|
c843122d3d | ||
|
|
4bc664fe5f | ||
|
|
a98df7209d | ||
|
|
8094435193 | ||
|
|
d88bb0b09b | ||
|
|
d85e071616 | ||
|
|
564dce858f | ||
|
|
c4f0325ff8 | ||
|
|
8c0a9a2486 | ||
|
|
0ef73fba54 | ||
|
|
e6b49d95ee | ||
|
|
59003e96af | ||
|
|
ad87f37689 | ||
| 059363f0e2 | |||
|
|
8e51139da0 | ||
|
|
aedc8efeda | ||
|
|
90a6581acb | ||
|
|
54cc9ab4b9 | ||
|
|
b05c6bac21 | ||
|
|
e424c84249 | ||
|
|
287770f885 | ||
|
|
8febdee264 | ||
|
|
d1249fbe47 | ||
|
|
f75bb5c50f | ||
|
|
e519dd3c52 | ||
|
|
c63d5a44a0 | ||
|
|
5f8ad0c5e6 | ||
|
|
8f8af90098 | ||
|
|
47015d7789 | ||
|
|
37a8c1c575 | ||
|
|
ccace62ac9 | ||
|
|
e703e06595 | ||
|
|
3c474204a4 | ||
|
|
92a4398996 | ||
|
|
a1d685b947 | ||
|
|
b4eb46b9ef | ||
|
|
8f9db7717e | ||
|
|
1d75e55bb5 | ||
|
|
c44c99398d | ||
|
|
35a10952b2 | ||
|
|
e33a421785 | ||
|
|
0a13eff940 | ||
|
|
8d24e72981 | ||
| 88ce6911b7 | |||
|
|
5e52ca0530 | ||
|
|
4b30412871 | ||
| f95d10b2a6 | |||
| ed0cb248e9 | |||
|
|
4cdb298a20 | ||
|
|
f07dd487af | ||
|
|
a07b59552d | ||
|
|
9b6cad380a | ||
|
|
f9c762256f | ||
|
|
1b54597789 | ||
|
|
4be5e914ac | ||
|
|
748d44892d | ||
|
|
f7f97ae1b7 | ||
|
|
db40f004c2 | ||
|
|
bfdaa6eb9c | ||
|
|
af4732a716 | ||
|
|
b8fa8198f0 | ||
|
|
1f53d5a4b9 | ||
|
|
679b465d96 | ||
| 1ca29ec47c | |||
|
|
87849fb62c | ||
|
|
cd16f29efd | ||
|
|
5949516ece | ||
|
|
bc3a40f967 | ||
|
|
047708e36e | ||
|
|
9bdae2f1a6 | ||
|
|
4db55652a3 | ||
|
|
2d8404c599 | ||
|
|
8b26caea30 | ||
|
|
2e1d3320b4 | ||
|
|
452d66dd0e | ||
|
|
ceb81b0ce9 | ||
|
|
081249f796 | ||
|
|
7709327873 | ||
|
|
3cf4d9c57f | ||
|
|
c784edf24d | ||
|
|
b669b622a3 | ||
|
|
ddddaf06e2 | ||
|
|
ba507a8193 | ||
|
|
d0527dd36c | ||
|
|
10093d37c5 | ||
|
|
43e0cd59ad | ||
|
|
a92712acc5 | ||
|
|
6b260e6184 | ||
|
|
3a7755b311 | ||
|
|
0bc5461dc7 | ||
|
|
91245297e8 | ||
|
|
1fb3d2448c | ||
|
|
b0eb91dfef | ||
|
|
1c12d8351c | ||
|
|
95d32a9a59 | ||
|
|
09596ddca2 | ||
|
|
9e9291777f | ||
| 0593e464bf | |||
|
|
5f448139e0 | ||
|
|
316bd0c72d | ||
|
|
6928de0364 | ||
|
|
ce59b54361 | ||
|
|
a397af9bdf | ||
|
|
c87e1a6527 | ||
|
|
53e4d78a3c | ||
|
|
8652d69614 | ||
|
|
d036620c70 | ||
|
|
5b9ce9e7cf | ||
|
|
b5b0d45b73 | ||
|
|
68a5e6dcba | ||
|
|
908e02439d | ||
| e20c65d8f0 | |||
| 4735cf4747 | |||
| 10861b4038 | |||
|
|
a600fd3478 | ||
|
|
301facf102 | ||
|
|
7de1da45da | ||
|
|
813fa671f3 | ||
|
|
9253351fa4 | ||
|
|
999ee68e12 | ||
|
|
13efbf24e5 | ||
|
|
255ffa979c | ||
|
|
dd10c534c5 | ||
| 288c54c70a | |||
| 96dd3d3fef | |||
|
|
7b4558b750 | ||
|
|
06ab848a0d | ||
|
|
de5b138dcf | ||
|
|
7556f38f04 | ||
|
|
39c166ba6a | ||
| 5f0e41ad60 | |||
| 430bcdb59d | |||
| 12264cca34 | |||
| 0b7a4c4b2b | |||
| 873a300d02 | |||
| cfd8288dfa | |||
| d3afda61d8 | |||
| 352226402c | |||
| 010a4e7b0f | |||
|
|
c7dc5f2507 | ||
|
|
115f3e0867 | ||
| 7bb196b9d2 | |||
| 1dda33dc41 | |||
| e79ee785ac | |||
| e4129ecf00 | |||
| 30c6dd3f76 | |||
|
|
6976ec6ef9 | ||
|
|
b65d91dbeb | ||
|
|
55c80754c7 | ||
|
|
2719411405 | ||
|
|
0b0b476be6 | ||
|
|
0476e4f64b | ||
|
|
a03f35e093 | ||
|
|
5358524941 | ||
|
|
30ed8d136c | ||
|
|
18122e0455 | ||
|
|
092331eee1 | ||
|
|
66d87782be | ||
|
|
9db0a4f265 | ||
|
|
cdad59fbc2 | ||
|
|
a33359762d | ||
|
|
9a1d864331 | ||
|
|
14e2a02c04 | ||
|
|
98c9492a8c | ||
|
|
7e59ff379b | ||
|
|
8c25f54f38 | ||
|
|
590fe8e8b1 | ||
|
|
9eb2ca02a5 | ||
|
|
03a6db36b4 | ||
|
|
794327254e | ||
|
|
0057e1dc2c | ||
|
|
69de4f913a | ||
|
|
1a82555803 | ||
|
|
90a299bb1e | ||
|
|
79e3c3d2fd | ||
|
|
ce55822680 | ||
|
|
76e9f495c7 | ||
|
|
bbd4de33d1 | ||
|
|
4135ccb100 | ||
|
|
d2c71fd5a3 | ||
|
|
f6f1ef7dc2 | ||
| f87ce01b8f | |||
| 09bf58407f | |||
|
|
ec02102409 | ||
|
|
4a9f33a796 | ||
|
|
dcf88e1e91 | ||
|
|
dfcdad3c81 | ||
|
|
46ec95d297 | ||
|
|
10f178d162 | ||
|
|
2a5f3de1cd | ||
|
|
d8721e3e2f | ||
|
|
d0e54993e9 | ||
|
|
9286f26831 | ||
|
|
8c8961ad01 | ||
|
|
9d5587fb08 | ||
|
|
80fa60d4ef | ||
|
|
3a51ffeb9d | ||
|
|
ad2ee0954c | ||
|
|
2ce07209df | ||
|
|
df4c028d29 | ||
|
|
71cc9b60ea | ||
|
|
80e5899b30 | ||
|
|
220501e159 | ||
|
|
43f93b097f | ||
|
|
d0bc5e4e57 | ||
|
|
9e559ac3ec | ||
|
|
ad7f4d8ae9 | ||
|
|
1407af7291 | ||
|
|
c056ac3499 | ||
|
|
70bd3c50eb | ||
|
|
334207c365 | ||
|
|
c27030ba7c | ||
|
|
7cae612ad0 | ||
|
|
5698b8bb0a | ||
|
|
7e78af7aca | ||
|
|
0bad6110d4 | ||
|
|
b83bdc540d | ||
|
|
3b72d502a4 | ||
|
|
fb216148ec | ||
|
|
fc20a3797b | ||
|
|
28ce5e8988 | ||
| 83c6774a44 | |||
|
|
c7f68022ef | ||
|
|
d537d94a4c | ||
|
|
0914b71653 | ||
|
|
7c9f63105b | ||
|
|
72cad49c69 | ||
|
|
48de52c8ab | ||
| 42cad23dea | |||
| a7542598a0 | |||
|
|
ffbe37b056 | ||
| 2cd377f1a7 | |||
| 537a4daabd | |||
| b40a579d18 | |||
| 05ba1431c3 | |||
| d024df6b06 | |||
|
|
8666083bd0 | ||
|
|
9993814f7c | ||
|
|
6348e2fbbc | ||
|
|
62eb65e401 | ||
|
|
7401aa8e85 | ||
|
|
b6f6af2699 | ||
|
|
f9d9c031a9 | ||
|
|
3332206d22 | ||
|
|
c3396e4b49 | ||
|
|
860c4d5af4 | ||
|
|
759321a32b | ||
|
|
dc8593db93 | ||
|
|
171efd55e0 | ||
|
|
9c14593d62 | ||
|
|
dc332baa87 | ||
|
|
6c7e6abcfd | ||
|
|
938a0fa2fc | ||
|
|
18047d0a2f | ||
|
|
1b7fbaf31e | ||
|
|
f7cafbf5f9 | ||
|
|
ffedfdd6e0 | ||
|
|
5c4cb43679 | ||
|
|
2729666d82 | ||
|
|
64bb055700 | ||
|
|
2f95cc95a4 | ||
|
|
f3e54414e5 | ||
|
|
578abae0f5 | ||
|
|
cf4862e96e | ||
|
|
8061a2574d | ||
|
|
ce01aed5cf | ||
|
|
34c90b6ecd | ||
|
|
a1e3ab1293 | ||
|
|
1a6b1b1953 | ||
|
|
c371119da4 | ||
|
|
98afc9a066 | ||
|
|
966f4de215 | ||
|
|
153a686837 | ||
|
|
a11ad25727 | ||
|
|
1a8033470a | ||
|
|
414d21626b | ||
|
|
ad4939ed5c | ||
|
|
eb65765d52 | ||
| 42a229c08b | |||
|
|
e9c9fce15d | ||
|
|
1fca297a2d | ||
|
|
89079039ad | ||
|
|
cda6de8c7d | ||
|
|
8b03951fee | ||
|
|
e31ecd602d | ||
|
|
8b5b602ea7 | ||
|
|
3fbd45d08d | ||
|
|
4db2d692e3 | ||
|
|
65b295cd03 | ||
| da8f023665 | |||
|
|
d4e9eea397 | ||
|
|
d3ae03b32e | ||
|
|
f226f4a233 | ||
|
|
aaa3c61819 | ||
|
|
9e725dfcda | ||
|
|
d6df43b943 | ||
|
|
17e7973ff2 | ||
|
|
f814a34714 | ||
|
|
39ca406a31 | ||
|
|
aa1f0e93ba | ||
|
|
6347a3fcdb | ||
|
|
737828ccb1 | ||
|
|
df8cba1068 | ||
|
|
3b4c14f3ec | ||
|
|
fb0c74c5f1 | ||
|
|
ae3b440835 | ||
|
|
233ccaac58 | ||
|
|
9a86829d01 | ||
|
|
75620884e6 | ||
|
|
32736dd2c3 | ||
|
|
d24a5d6270 | ||
|
|
2e393ed195 | ||
|
|
bd3c5c33fb | ||
|
|
88b1e2fe61 | ||
|
|
c875d7c22d | ||
|
|
ecd7c0878e | ||
|
|
a60fabdffa | ||
|
|
fd21ff59d9 | ||
|
|
f202eb734a | ||
|
|
79658adc10 | ||
| 6c4df5a8b4 | |||
|
|
8eaf2b0c19 | ||
|
|
4512290ba0 | ||
|
|
4863413bc9 | ||
| f224ed1848 | |||
|
|
8f9cd7075e | ||
|
|
7afa1a1d76 | ||
|
|
06022a5e91 | ||
|
|
81ff95a8eb | ||
|
|
c6de41b4ea | ||
|
|
bc95c7f219 | ||
|
|
f3fb014166 | ||
|
|
1284418fa7 | ||
|
|
736c0d4c3d | ||
|
|
0a7c74230c | ||
|
|
109e147b46 | ||
|
|
23ad9c7402 | ||
|
|
3d9e4958c5 | ||
|
|
f3b7cd6a5d | ||
|
|
70739ff639 | ||
|
|
70a9c601a8 | ||
|
|
fac0bf1db8 | ||
|
|
68dd4b2b37 | ||
|
|
10d735db9f | ||
| 28bd29eb42 | |||
|
|
109b6baee4 | ||
|
|
74805527e8 | ||
|
|
1f58795c56 | ||
|
|
8fcb28e89e | ||
|
|
2f476731ec | ||
|
|
ca757f2ead | ||
|
|
0dcc659d53 | ||
|
|
1ad49d9a18 | ||
|
|
f2204d7d88 | ||
|
|
1d37d3f43b | ||
|
|
2de9f18121 | ||
|
|
a2d2d699e4 | ||
|
|
3ad4b12ce1 | ||
|
|
4521dfb732 | ||
|
|
fb33c4e1c0 | ||
| bbbd621b18 | |||
| 3c4562c3ca | |||
| dc9bc8fc9a | |||
|
|
9f9ab44acc | ||
|
|
afcc00fed4 | ||
|
|
b810b384c9 | ||
|
|
97947b4fe9 | ||
|
|
9fd652111a | ||
|
|
f267c327bd | ||
|
|
d076296659 | ||
|
|
2c4b1f251d | ||
|
|
d6ee17c6fd | ||
|
|
1bacfacfb3 | ||
|
|
a1f773d9ed | ||
|
|
b98da3d89f | ||
|
|
dc473b29e3 | ||
|
|
6abe3cd0ef | ||
|
|
c16b8f1ee5 | ||
|
|
6d8642bf41 | ||
|
|
731cdefe80 | ||
|
|
845cf03a45 | ||
|
|
d2cb58a2df | ||
|
|
eea8bc4999 | ||
|
|
d793ec2872 | ||
|
|
cac755ba16 | ||
|
|
dc560f0eee | ||
|
|
f15e2d86c0 | ||
|
|
e0bb4a808a | ||
|
|
e0afa32cfa | ||
|
|
210c0ec89c | ||
|
|
9acdd91c91 | ||
|
|
6cced49402 | ||
|
|
fe32dd08b8 | ||
|
|
37ee5e683d | ||
|
|
c5c13620f2 | ||
|
|
92098ca06b | ||
|
|
54fcf127c7 | ||
|
|
eda3392f50 | ||
|
|
81c4871fdf | ||
|
|
37c9f768b5 | ||
|
|
2de5eba6d1 | ||
|
|
e3194ad54e | ||
|
|
344d3c59cb | ||
|
|
4becc00a7b | ||
|
|
8d9d53a07c | ||
|
|
d920750756 | ||
|
|
08e94e6a20 | ||
|
|
39124b888b | ||
|
|
1daad63d2b | ||
|
|
cf938983e9 | ||
|
|
d29184b5a0 | ||
|
|
cb35abfd04 | ||
|
|
d83d46a52d | ||
|
|
55f4110983 | ||
|
|
6d2329fb09 | ||
|
|
3d5c77c601 | ||
|
|
5964163649 | ||
|
|
6a4f74946f | ||
|
|
07015ad527 | ||
|
|
bfa2c604ef | ||
|
|
ed5add37f6 | ||
|
|
dee86a014b | ||
|
|
20c3184c87 | ||
|
|
3c724321d8 | ||
|
|
8b98867f07 | ||
|
|
e9fd689d57 | ||
|
|
6af532f4f0 | ||
|
|
e14b148e62 | ||
|
|
eedcc98cc5 | ||
|
|
cea6c3d8d6 | ||
|
|
fea25c1c5e | ||
|
|
133013083a | ||
|
|
57101d7da6 | ||
|
|
f7c7324e60 | ||
|
|
a5c3dc286c | ||
|
|
9a5006e241 | ||
|
|
9e7a7b9dc4 | ||
|
|
0b4bcd9599 | ||
|
|
1f14d39364 | ||
|
|
a3fc20df0f | ||
|
|
0ff0bb9ec4 | ||
|
|
93fade24ef | ||
|
|
d0a806d797 | ||
|
|
40118bcf57 | ||
|
|
f261004080 | ||
|
|
1df033465a | ||
|
|
2c546ab768 | ||
|
|
2f95c94ad8 | ||
|
|
602243748b | ||
|
|
fc23a0cc8a | ||
|
|
a31fc3b08c | ||
|
|
7250925b98 | ||
|
|
571c063c2a | ||
|
|
413885a529 | ||
|
|
9903c9e855 | ||
|
|
44b56f76c4 | ||
|
|
5875a27fa8 | ||
|
|
9412c3f58e | ||
|
|
534b48fcfe | ||
|
|
b5b6b6d0f2 | ||
|
|
3b5be929e0 | ||
|
|
054eafd42f | ||
|
|
458f55714d | ||
|
|
22ad76bb48 | ||
|
|
4e7668d69b | ||
|
|
ac8a9625de | ||
|
|
7ac200017d | ||
|
|
c1a2ea27ce | ||
|
|
c7b5928833 | ||
|
|
40a536904f | ||
|
|
169b487509 | ||
|
|
70827ac3da | ||
|
|
9391c8f9dd | ||
|
|
bb1b2bd787 | ||
|
|
e58c3852f1 | ||
|
|
11d829e20e | ||
|
|
a7ec4a0489 | ||
|
|
d64d48ed3a | ||
|
|
db04582af9 | ||
|
|
2f0e676fcb | ||
|
|
57fa6bece8 | ||
|
|
fb90f51082 | ||
|
|
03d0ec85a1 | ||
|
|
079bf7ab94 | ||
|
|
1130b80e2a | ||
|
|
a483cd1acb | ||
|
|
348392f8cc | ||
|
|
c7749a569d | ||
|
|
9b3186b625 | ||
|
|
608c98501b | ||
|
|
51fd678ee0 | ||
|
|
31acfedf93 | ||
|
|
34bbcc4910 | ||
|
|
7655102ef2 | ||
|
|
8f6baa212f | ||
|
|
d7ba641ff6 | ||
|
|
9e6b2b1da8 | ||
|
|
1c00deb8be | ||
|
|
cb863e4c5c | ||
|
|
546b15bf1a | ||
|
|
87d4184dd5 | ||
|
|
582a47d71a | ||
|
|
59c3e25168 | ||
|
|
4b71079628 | ||
|
|
a310cde8c1 | ||
|
|
b805bf8a62 | ||
|
|
44bc75af37 | ||
|
|
f91932d783 | ||
|
|
f38bd59c6b | ||
|
|
912691e0d2 | ||
|
|
e19782633a | ||
|
|
513253bc3f | ||
|
|
748472de7a | ||
|
|
90c203a3dd | ||
|
|
73e22f9eeb | ||
|
|
72fa7d88b8 | ||
|
|
fe1c2fa6f0 | ||
|
|
8b7c23c1ee | ||
|
|
d3bbb99e07 | ||
|
|
237385798c | ||
|
|
2b9ca4d48a | ||
|
|
44e0d98c62 | ||
|
|
f6cba4c974 | ||
|
|
a95285ad36 | ||
|
|
9a9e972242 | ||
|
|
927624468d | ||
|
|
4ac4faaaf6 | ||
|
|
5b3c930e38 | ||
|
|
a975ef4971 | ||
|
|
299b6efd84 | ||
|
|
d6f8a43f6c | ||
|
|
1395ce9a7b | ||
|
|
98cf7f67d4 | ||
|
|
205d135e1a | ||
|
|
f65449027a | ||
|
|
5e5045ddf1 | ||
|
|
0f0bbd85c8 | ||
|
|
dbfabddf58 | ||
|
|
9768951a2a | ||
|
|
11ed6f86f0 | ||
|
|
9ecaa16ece | ||
|
|
bde1c4166d | ||
|
|
848eb28132 | ||
|
|
993a581f5e | ||
|
|
7ca36d45a4 | ||
|
|
a4b84cf0e1 | ||
|
|
ac91220361 | ||
|
|
2ba9805f84 | ||
|
|
c7404a3ff8 | ||
|
|
28d9e9186e | ||
|
|
2830cc9433 | ||
|
|
65e2fe4654 | ||
|
|
f96475cbbf | ||
|
|
596e0e4bd2 | ||
|
|
e308a9ec11 | ||
|
|
bd87201c4f | ||
|
|
a4e310cfc2 | ||
|
|
884028c748 | ||
|
|
518328c71e | ||
|
|
9b2eae49f9 | ||
|
|
3cde6c3fdc | ||
|
|
104a089677 | ||
|
|
e90cb3ad86 | ||
|
|
6af48bb24c | ||
|
|
9c779c7ab7 | ||
|
|
c1be2c0c19 | ||
|
|
cb14a2a824 | ||
|
|
715b09bff2 | ||
|
|
7923aa0a62 | ||
|
|
6fd123a5c4 | ||
|
|
abff2615cb | ||
|
|
015ba00212 | ||
|
|
904fadbb5c | ||
|
|
ef0830bfe2 | ||
|
|
c284a57a99 | ||
|
|
35086587aa | ||
|
|
5e38716817 | ||
|
|
e7bab9e86b | ||
|
|
9dbea36eac | ||
|
|
a854da35d3 | ||
|
|
c9bc877683 | ||
|
|
f868cc5dd0 | ||
|
|
0d9a0235a2 | ||
|
|
ca1a85c47f | ||
|
|
9a692c3222 | ||
|
|
4ac11c8d31 | ||
|
|
fc344bc818 | ||
|
|
8e76fce60a | ||
|
|
be44c16e25 | ||
|
|
e778fc1f87 | ||
|
|
510f464234 | ||
|
|
fcafeb1766 | ||
|
|
4ca50982b7 | ||
|
|
8364734ba3 | ||
| c451b22255 | |||
|
|
ff7bab12aa | ||
|
|
7ca1cf6e22 | ||
|
|
241d920757 | ||
|
|
966e0b256c | ||
|
|
669f17e5bf | ||
|
|
59458a9013 | ||
|
|
e83c481f0f | ||
|
|
d0e75e635a | ||
|
|
0c5e0954db | ||
|
|
1031fe2992 | ||
| 1553a647ca | |||
|
|
ba6e15b070 | ||
|
|
0836abba41 | ||
|
|
6a9339169a | ||
|
|
22af5a1fe9 | ||
|
|
52e86f8de4 | ||
|
|
bafa0501d1 | ||
|
|
686edcef3f | ||
|
|
f8499a468e | ||
|
|
bbe13490b5 | ||
|
|
570353b946 | ||
|
|
6ff24410eb | ||
|
|
9dd1783da5 | ||
|
|
7a45afc549 | ||
|
|
ea57615782 | ||
|
|
ebdc48ae22 | ||
|
|
e5cee98977 | ||
|
|
0e628caa6f | ||
|
|
2635132ce5 | ||
|
|
1c9f33a372 | ||
|
|
86694262b8 | ||
|
|
8ffd973e22 | ||
|
|
8aba80c033 | ||
|
|
a80bf22211 | ||
|
|
bb064d7198 | ||
|
|
f8dcb25170 | ||
|
|
491e314799 | ||
|
|
c67f5892ff | ||
|
|
7928a0d454 | ||
|
|
3730862362 | ||
|
|
efda912437 | ||
|
|
368fa88312 | ||
|
|
16fe2de703 | ||
| 70e978f48b | |||
|
|
9d8be648ee | ||
|
|
4c5e7520f5 | ||
|
|
5351a93c70 | ||
|
|
3abee9b256 | ||
|
|
211d084429 | ||
|
|
7a5e355775 | ||
|
|
661c20dd18 | ||
|
|
25591a3f8a | ||
|
|
a0f1ec3c4a | ||
|
|
f62ea25331 | ||
|
|
f3b5ca5f01 | ||
|
|
048ca2a570 | ||
|
|
fe6e50b770 | ||
|
|
56634eb00e | ||
|
|
381889f6bc | ||
|
|
0b858440b0 | ||
|
|
63b0bf9075 | ||
|
|
75559f35cc | ||
|
|
e4c66990e2 | ||
|
|
7b5e826b18 | ||
|
|
f25ac45534 | ||
|
|
8301dcada0 | ||
|
|
0fb075ab7e | ||
|
|
b34e36d1db | ||
|
|
1c92b1bf61 | ||
|
|
c4f4cdd8c1 | ||
|
|
29e91424d4 | ||
|
|
b69bbfa3d6 | ||
|
|
0a06530d52 | ||
|
|
2773f534c9 | ||
|
|
123210a989 | ||
|
|
6760cdf678 | ||
|
|
39e1f52e28 | ||
|
|
17a8bafe05 | ||
|
|
2f14609044 | ||
| 982bce7259 | |||
| aaca3eccf1 | |||
| b2b8520880 | |||
| c06fc8e02d | |||
| d5f6748d1b | |||
| 0556f9f851 | |||
|
|
cd436bad1a | ||
|
|
649c930536 | ||
|
|
a25b27520d | ||
|
|
bc9036f353 | ||
| 331aa6e59f | |||
| dd108b755d | |||
|
|
60c608b927 | ||
|
|
142f281153 | ||
|
|
d53ecac888 | ||
|
|
838f66de89 | ||
|
|
f1e2931752 | ||
|
|
062f4b9c18 | ||
|
|
3e6661bc9d | ||
|
|
76d4824728 | ||
|
|
040eaa0443 | ||
|
|
b56645808c | ||
|
|
5bb3c321e9 | ||
|
|
682054a216 | ||
| 9a642fc049 | |||
|
|
b9bec87f29 | ||
|
|
b98835a1d7 | ||
|
|
081aec4429 | ||
|
|
2463a6d6ac | ||
| f61f8f999b | |||
| 83d790ad8f | |||
|
|
8ac9b176c9 | ||
|
|
0d3e81f969 | ||
|
|
bab41afce7 | ||
|
|
c457d373e1 | ||
|
|
ff987e7496 | ||
|
|
d999a1d6a9 | ||
|
|
18513dedd1 | ||
|
|
ec591e9d7d | ||
|
|
226715b147 | ||
|
|
8ae7b99627 | ||
| 9206925bf8 | |||
| 1bc770c3dc | |||
|
|
e2b5ae2d77 | ||
|
|
a185549316 | ||
|
|
0bbdf05936 | ||
| a0d305042c | |||
| 7750b4d671 | |||
|
|
5f0a372a22 | ||
|
|
119e9d3820 | ||
|
|
33ca357094 | ||
|
|
089fa82067 | ||
|
|
3b27810a3a | ||
|
|
66fb095069 | ||
|
|
f4fd236605 | ||
|
|
516a85aafe | ||
|
|
f8eed1f74c | ||
|
|
45ea2c5fb6 | ||
| 9c4b6c34b8 | |||
|
|
0686cde226 | ||
|
|
18e463cca5 | ||
|
|
ffff02c053 | ||
|
|
bb77f1d130 | ||
|
|
0cd951fb73 | ||
|
|
3abc671bbd | ||
|
|
bff40fc1c9 | ||
|
|
f2824f6a68 | ||
|
|
2bec02738f | ||
|
|
d4ab00f734 | ||
|
|
c4917cdabd | ||
|
|
64725190f4 | ||
|
|
8218eb2ddf | ||
|
|
76d60ba95b | ||
|
|
6c3c076cc1 | ||
|
|
f2e911ad91 | ||
| 231e3d362d | |||
|
|
146adca060 | ||
|
|
bda3267432 | ||
|
|
68eb809fbf | ||
|
|
78ccac930f | ||
|
|
8d4296f964 | ||
|
|
9169878ebb | ||
|
|
7253b2eb31 | ||
| 0f7081781e | |||
|
|
1145fcaf3e | ||
|
|
281e10fff5 | ||
|
|
2f2fe10e12 | ||
|
|
8d3a878152 | ||
|
|
c9952798fb | ||
|
|
5f84b790a7 | ||
|
|
42ca57ff8f | ||
|
|
f4b10879fb | ||
|
|
aa68b17223 | ||
|
|
9774736a50 | ||
|
|
ff41180237 | ||
|
|
105ec12144 | ||
|
|
a47dea4922 | ||
|
|
51beeb017b | ||
|
|
42ca0806ba | ||
|
|
35248fd0a4 | ||
|
|
c96a86bd8a | ||
|
|
53e9c7b3bc | ||
|
|
fdb92b92fa | ||
|
|
9817672df7 | ||
|
|
35ef6c687f | ||
|
|
23ed3ef971 | ||
|
|
f61c4e62c1 | ||
|
|
03b110b44c | ||
|
|
118ca7cff4 | ||
|
|
92d83f740d | ||
|
|
f9842566d8 | ||
|
|
9da99675b1 | ||
|
|
8373146c56 | ||
|
|
3e1414395d | ||
|
|
a1276be482 | ||
|
|
ddb3590944 | ||
|
|
b9294818da | ||
|
|
b8f83643b5 | ||
|
|
1192eebcdf | ||
|
|
b9ccc62b97 | ||
|
|
21ca1b8c2b | ||
|
|
d16d27a449 | ||
|
|
75a977febd | ||
|
|
10e8b8cf45 | ||
|
|
40b8bc0c84 | ||
|
|
fe7ed99939 | ||
|
|
fd43c0a9fe | ||
|
|
44425b8d94 | ||
| 2d8ebfcf63 | |||
| b293aa7e09 | |||
|
|
34ee6e3344 | ||
|
|
57b5a5e756 | ||
|
|
6c59836c5d | ||
|
|
46c9b28dd8 | ||
|
|
61bf0e99c6 | ||
|
|
0ebd4e615e | ||
|
|
d1f15d314b | ||
|
|
ee57bc4d83 | ||
|
|
78dffd8ef8 | ||
| 5554c27600 | |||
| 0ff20cdd85 | |||
|
|
9adb77a2d0 | ||
|
|
cf21c4da60 | ||
|
|
eec9821fdc | ||
|
|
5505a3649f | ||
|
|
7ba2c5772c | ||
|
|
55e0e2c4ba | ||
|
|
6a6e998ea5 | ||
|
|
479567059e | ||
|
|
9ef23e8659 | ||
|
|
b2e83952c0 | ||
|
|
18079c5bbe | ||
|
|
cb159569c2 | ||
|
|
de7461dcfb | ||
|
|
93193f2f0b | ||
|
|
01c7a06dcc | ||
|
|
ec12477f5c | ||
|
|
f5f2036881 | ||
|
|
d948e6570f | ||
|
|
f43a5ab324 | ||
|
|
36a8828fa3 | ||
|
|
8ce852e652 | ||
|
|
da04efbf2e | ||
|
|
ac8a0faa0d | ||
|
|
81bb92bdd2 | ||
|
|
8fc1be5ef2 | ||
|
|
c2aa54ae66 | ||
|
|
d8ef9a127b | ||
|
|
92cd599ea3 | ||
|
|
2b4d12abcc | ||
|
|
e02539bdf5 | ||
|
|
fe6bfde590 | ||
|
|
4c93db3595 | ||
|
|
197539bd82 | ||
|
|
472a5a99ec | ||
|
|
5a079256d5 | ||
|
|
ca935c0daf | ||
|
|
441c2c41fb | ||
|
|
4055c5ac61 | ||
|
|
4938054c05 | ||
|
|
f94cc090bb | ||
|
|
0d0436bf69 | ||
|
|
c4521287e3 | ||
|
|
9bf77905e3 | ||
|
|
7441344c6f | ||
|
|
88fcf4ef7e | ||
|
|
18838e390a | ||
|
|
9765b2c237 | ||
|
|
73582c9ceb | ||
|
|
6c61a53e0f | ||
|
|
23afe08b6f | ||
|
|
1f7a3f0dfa | ||
|
|
041c2a9f61 | ||
|
|
8bbbb2833a | ||
|
|
4e52757f26 | ||
|
|
72b829dff0 | ||
|
|
b468bb6b92 | ||
|
|
7dd53804a0 | ||
|
|
7a07e8fa32 | ||
|
|
856a6d4558 | ||
|
|
76c1153380 | ||
|
|
a3f60e114a | ||
|
|
4438050f79 | ||
|
|
1762a36438 | ||
|
|
6fba68b054 | ||
|
|
3845db4bb9 | ||
|
|
073dc8751c | ||
|
|
aca53cf419 | ||
|
|
5ea09fe348 | ||
|
|
0c30a26c9b | ||
|
|
78477a374a | ||
| 80ad300cad | |||
|
|
144eb131ae | ||
|
|
0938d4e9c1 | ||
|
|
bbed1b0354 | ||
|
|
9a8484b853 | ||
|
|
a7616808e9 | ||
|
|
1f179b3317 | ||
|
|
345d84ffde | ||
|
|
8e72b68e3d | ||
|
|
6a63d20a5d | ||
|
|
09ae9aefa8 | ||
|
|
f47ec650ca | ||
|
|
c7db9e5b53 | ||
|
|
9f3a1fe27b | ||
|
|
ad166ca479 | ||
|
|
e7da852db7 | ||
|
|
05d663b183 | ||
|
|
c6e842cf9e | ||
|
|
937462df3c | ||
|
|
aba4447a22 | ||
|
|
7fd73c7d39 | ||
|
|
59b9ca409c | ||
|
|
25bad660c6 | ||
| e83be19d0f | |||
|
|
d6f3d59487 | ||
|
|
a28755d53d | ||
|
|
cbad75a7d2 | ||
|
|
7cbc50962b | ||
|
|
34ce8d8642 | ||
|
|
3dcee5be80 | ||
|
|
5ab2f16f64 | ||
|
|
5e3bfa1956 | ||
|
|
9a4efed8cb | ||
|
|
b44011d196 | ||
|
|
b5c95e3b1a | ||
|
|
9b911b2211 | ||
|
|
27827a4fef | ||
|
|
85dadf3a56 | ||
|
|
1196d4bcf6 | ||
|
|
354536c09f | ||
|
|
0e444f0de8 | ||
|
|
930cf14dce | ||
|
|
e35938971a | ||
|
|
59df1a11ad | ||
|
|
da449723df | ||
|
|
4d8ffdca8d | ||
|
|
e5ff55b15c | ||
|
|
21ba61afbb | ||
|
|
05a3f203db | ||
|
|
e310b871c8 | ||
|
|
3a30887b44 | ||
|
|
90b9ec6f2c | ||
|
|
d0426b3438 | ||
|
|
34a0fec18e | ||
|
|
557a58b244 | ||
|
|
32f6f64a28 | ||
|
|
e1be1e4f80 | ||
|
|
54c26a772b | ||
|
|
91e85e8037 | ||
|
|
73162bda85 | ||
|
|
54c0e98a37 | ||
|
|
563a8934b7 | ||
|
|
80029f6929 | ||
|
|
e00ae204db | ||
|
|
2cb9d2368c | ||
|
|
f2e79ce89d | ||
|
|
ba0a3769e3 | ||
|
|
5110fec312 | ||
|
|
2374b0d013 | ||
|
|
9ec224539b | ||
| 3a501a0495 | |||
| 2ba6659967 | |||
|
|
d86c6a74a4 | ||
|
|
95cb5961d2 | ||
|
|
0d1649880f | ||
|
|
fc591c8d84 | ||
|
|
cfaa02ef19 | ||
|
|
5deb045a81 | ||
|
|
8a379830a8 | ||
|
|
fa35c3fa7c | ||
|
|
99a3750a2c | ||
|
|
f4f80e07ca | ||
|
|
1117edae63 | ||
|
|
81ab6a05d0 | ||
|
|
1e0f12d504 | ||
|
|
caca0609bd | ||
| c9f7df3bab | |||
|
|
32f2a8d54c | ||
| bdc1343791 | |||
| 396d92f867 | |||
|
|
b5b9392a3a | ||
|
|
a891321f4f | ||
|
|
998661246c | ||
|
|
3f529855d1 | ||
|
|
c43011f149 | ||
| 85aa851714 | |||
| 543316a8fb | |||
|
|
12d770b427 | ||
|
|
b637d3911e | ||
| 4cad5478e6 | |||
|
|
b4eb27557d | ||
|
|
9df61899a2 | ||
|
|
2ebd06f8ee | ||
|
|
c676385200 | ||
|
|
ef97ed6ab6 | ||
|
|
e2c833adf4 | ||
|
|
2581d099ca | ||
|
|
987ee3bf22 | ||
|
|
efd8f1ab88 | ||
|
|
64c6d6d7e9 | ||
|
|
73aae6bbcd | ||
|
|
a899433dab | ||
|
|
f4f6b082b4 | ||
|
|
04cf88deae | ||
|
|
c8808f41a5 | ||
| b520498c73 | |||
|
|
f431f859e7 | ||
|
|
e2b7fe3f0e | ||
|
|
2d2503c49d | ||
|
|
4f92deedcc | ||
|
|
05e4172ea0 | ||
|
|
fa4c4c2c10 | ||
|
|
ff69ab603d | ||
|
|
7d1c1c815d | ||
|
|
41d02fd53d | ||
|
|
c65b0985b8 | ||
|
|
ea6ef8b142 | ||
|
|
50e90088a2 | ||
|
|
1921143838 | ||
|
|
e202da4dad | ||
|
|
c58b0adf64 | ||
| 599bacb0b4 | |||
|
|
1a677406bf | ||
|
|
098fd3efd2 | ||
|
|
30691e66e3 | ||
|
|
1092890266 | ||
|
|
8beb36c240 | ||
|
|
1eab0692b5 | ||
| 543073b198 | |||
|
|
a2fce305d6 | ||
|
|
13387121fe | ||
|
|
eb139c9bab | ||
|
|
38c8248b9e | ||
|
|
c5d8c12e34 | ||
|
|
d2dada869c | ||
|
|
d606a3e968 | ||
|
|
d98b312886 | ||
|
|
3856da9968 | ||
|
|
f8d37c0074 | ||
|
|
d6805c0dd4 | ||
|
|
64eb159d6a | ||
|
|
579f9b0cfa | ||
|
|
852c57c661 | ||
| cc411f47eb | |||
| fb768dfc14 | |||
| 194d99f588 | |||
| eb0b023dee | |||
| 4b9fc5de53 | |||
| aa3c890ead | |||
| 396979a67e | |||
|
|
c85a845ff4 | ||
|
|
a71885c391 | ||
|
|
539e6c6bf6 | ||
|
|
7cf776d39e | ||
|
|
dc10e96814 | ||
|
|
76f1db7a87 | ||
|
|
1e7e5eb1ff | ||
|
|
1efcb975ab | ||
|
|
3c05a8c68c | ||
|
|
fc3f2a3f7f | ||
|
|
575b2e607b | ||
|
|
74c07a4bdc | ||
|
|
8e6d3e5b91 | ||
|
|
de328c3be9 | ||
|
|
645382d51d | ||
|
|
f0b37313c5 | ||
|
|
fdb5ce477e | ||
|
|
878f2322e7 | ||
|
|
6e355ec598 | ||
|
|
6631c8d393 | ||
|
|
9d840aab0b | ||
|
|
b336039aab | ||
|
|
2ab1552484 | ||
|
|
fa75231ae3 | ||
|
|
12ed3fc72f | ||
|
|
6b272eeb27 | ||
|
|
31223e4ae5 | ||
|
|
1d05ad6b22 | ||
| 88d07ef35b | |||
|
|
a57c5a10f6 | ||
|
|
45a3bd1c04 | ||
|
|
f51e75c1d2 | ||
|
|
6bfb6afaca | ||
| 9a2ab36fa5 | |||
| f36336e171 | |||
|
|
b67acea587 | ||
|
|
82b49afe43 | ||
|
|
97fae54659 | ||
|
|
26fd2c6223 | ||
|
|
b02a5bcbd5 | ||
|
|
cb0a4abc95 | ||
|
|
3c5a08628a | ||
|
|
2517e4b486 | ||
|
|
f1e8f2b404 | ||
|
|
f6f89565d8 | ||
|
|
0a9bcc538b | ||
|
|
b84f22aa0c | ||
|
|
e6d0b207ec | ||
|
|
fead0433bd | ||
|
|
cc8f8d8604 | ||
|
|
5f3ef9f7c6 | ||
|
|
579e508769 | ||
|
|
852a91e1b7 | ||
|
|
18fbff4f57 | ||
|
|
e9c04bc1f0 | ||
|
|
4270061db4 | ||
|
|
af2a23bd18 | ||
|
|
56427d9abe | ||
|
|
2b33968a1e | ||
|
|
3d21eec3cd | ||
|
|
a010dc35fa | ||
|
|
2bc40bcadf | ||
|
|
b9c5fb57ff | ||
|
|
6e38bf629b | ||
|
|
1d4d269092 | ||
|
|
cfa3163a7e | ||
|
|
33dee4ae07 | ||
|
|
ceb531086e | ||
|
|
de9ea47e8e | ||
|
|
337019626a | ||
|
|
b359e2945a | ||
|
|
57b44928a3 | ||
|
|
379e73af2e | ||
|
|
a0e5e961c5 | ||
|
|
9de96786ad | ||
|
|
1eb1434fc9 | ||
|
|
179e13f103 | ||
|
|
bb046f9983 | ||
|
|
2e5bea2629 | ||
|
|
4a95965b1a | ||
|
|
638c7f7b57 | ||
|
|
0a60a42396 | ||
| 8ddbebd2c1 | |||
| 9696dbfd38 | |||
|
|
10badd93c3 | ||
|
|
94beeabc51 | ||
| 479552ce56 | |||
| 774f2e16ba | |||
| 607e4a905a | |||
| c139eccc92 | |||
|
|
3c46e3a6aa | ||
|
|
88db16a2c6 | ||
|
|
98aa4b7943 | ||
|
|
6583e1087c | ||
|
|
e3378b7ccb | ||
|
|
f987b363c8 | ||
|
|
940013a621 | ||
|
|
92fcb92138 | ||
|
|
40a3d11d64 | ||
|
|
60deb321d1 | ||
|
|
5d96afc5c2 | ||
|
|
bf849ff674 | ||
|
|
5cadf525bd | ||
|
|
f5f1e29dc0 | ||
|
|
d94d2d2975 | ||
|
|
3f6ca7bd32 | ||
|
|
5721cf0710 | ||
|
|
2aee2b7dc7 | ||
|
|
ead0d51fd7 | ||
|
|
cd935346ec | ||
|
|
74954286f0 | ||
|
|
f38e868e90 | ||
|
|
b9e308c248 | ||
| 5e38bb98cb | |||
|
|
b227b79dec | ||
|
|
70a94c8d2d | ||
|
|
c7d87cea62 | ||
|
|
b435ef0272 | ||
|
|
375676ff58 | ||
|
|
699f19f44a | ||
|
|
3ccf644dd0 | ||
|
|
e1a80aeb03 | ||
|
|
ccbc15046a | ||
|
|
506936ea2e | ||
|
|
1b307c90a7 | ||
|
|
2b2003f3e7 | ||
| 3149f5bfd8 | |||
|
|
b578afa02f | ||
|
|
99f27bea61 | ||
|
|
5af1e054a7 | ||
|
|
763e14f815 | ||
|
|
76f431df70 | ||
|
|
b5f8321d37 | ||
|
|
97d217a764 | ||
|
|
860bba0555 | ||
|
|
e0f6d883f5 | ||
|
|
10b5ab1058 | ||
|
|
4bec77652b | ||
|
|
e1fc85c56b | ||
|
|
d93a1961c4 | ||
|
|
9fcf96cb64 | ||
|
|
ef42d6bb6c | ||
|
|
09bc415751 | ||
|
|
66c25667d8 | ||
|
|
085d2a2274 | ||
|
|
8487a51995 | ||
|
|
b7ed18d622 | ||
|
|
0775e2b20d | ||
|
|
d01b9ce933 | ||
|
|
9ac0aae5a9 | ||
|
|
7386a948bd | ||
| 16ed875f4e | |||
| 81d7ef0256 | |||
| eed3387f4e | |||
| abe0405d6e | |||
| e5a0af9216 | |||
| a7dccb39a4 | |||
| 23bd2496de | |||
| 7df01d3fbd | |||
| 01e9e355ce | |||
|
|
8c428a3bdd | ||
|
|
945f7f2a1c | ||
|
|
455cf654f3 | ||
|
|
d5c8e55769 | ||
|
|
68cb384f8f | ||
|
|
f90eb23db1 | ||
|
|
0d7552b67e | ||
|
|
5c00ba8592 | ||
|
|
e7004af244 | ||
|
|
9ed7cbf7a0 | ||
|
|
e93a274f2f | ||
|
|
0467a82880 | ||
|
|
8e3ec3d520 | ||
| 1cdc91dce6 | |||
|
|
f362a4a338 | ||
|
|
cdf18885ee | ||
|
|
23cd9fcdad | ||
|
|
9535edb8f4 | ||
|
|
62a7eced51 | ||
|
|
be8092f4d3 | ||
|
|
5bdb8c45dd | ||
|
|
d6d02c67d2 | ||
| b1592564b2 | |||
|
|
c4e337e234 | ||
|
|
dd2b40fdf1 | ||
|
|
551f78e10b | ||
|
|
d2d768a936 | ||
|
|
b51a84d1f8 | ||
|
|
7652b3046d | ||
|
|
abe98f13df | ||
|
|
92d15096d2 | ||
|
|
a8dfae58d9 | ||
|
|
d62ac24493 | ||
|
|
160651785a | ||
|
|
c27e3857b6 | ||
|
|
b9890f2d42 | ||
|
|
2ad54f8413 | ||
|
|
f303fb3d41 | ||
|
|
9a3bd82f40 | ||
|
|
be6e6eabd2 | ||
|
|
36bd405380 | ||
|
|
0bbd067a17 | ||
| 618d22cd69 | |||
|
|
e477d27be3 | ||
| d7c3f811af | |||
|
|
4799333ec2 | ||
|
|
9e66c3aee1 | ||
|
|
422a7d4013 | ||
|
|
1a099966ce | ||
|
|
c624c1e838 | ||
|
|
e01e8dd6b9 | ||
|
|
a6cfa507b6 | ||
|
|
a739d314f1 | ||
|
|
b26c34d9e2 | ||
|
|
cebaf99c64 | ||
|
|
9d0d3e3615 | ||
|
|
7f803c0b51 | ||
|
|
5ac3c36d64 | ||
|
|
d1bda47d94 | ||
|
|
2ac2f627d5 | ||
|
|
5ca10e7849 | ||
|
|
a09a158ddc | ||
|
|
29af7068d4 | ||
|
|
ef245ef54e | ||
|
|
9f19a8a760 | ||
|
|
66b8559fd4 | ||
| c129c8f296 | |||
| 88cbf772df | |||
| 8f8326fe57 | |||
| e4b9c16891 | |||
| 176b337611 | |||
|
|
819b5faa71 | ||
|
|
4b1a7d812e | ||
|
|
a2a0aa058f | ||
|
|
2f6d7c9002 | ||
|
|
28353973b2 | ||
|
|
9b3e955bd4 | ||
|
|
38f12185aa | ||
|
|
88749fce64 | ||
|
|
c1ac0eed2f | ||
|
|
2bb44f6c4d | ||
| d79f4e2662 | |||
| 611f81ac1a | |||
| 1bea099eb2 | |||
|
|
4c7d9e3aaf | ||
|
|
d4ee440a91 | ||
| 03bd968450 | |||
| 979ec3a458 | |||
|
|
2a4a244245 | ||
| dd6e7f5a8a | |||
| 1dbb59271c | |||
| 726dcdb60a | |||
|
|
7b7ef8edde | ||
|
|
66d55738c1 | ||
|
|
b1e1237887 | ||
|
|
db74f97e60 | ||
| 809225fd1e | |||
| 04e434a7ce | |||
| f4e36fc7f6 | |||
| 13493730a1 | |||
| 4f7f1e8106 | |||
| a4cc3ad6cb | |||
| 3e97e9c4be | |||
| ea2f5b6396 | |||
| f4fd5bbfc4 | |||
| 8d45be1cd9 | |||
| 48bda589b8 | |||
| 79ca430ddf | |||
| 8b82c239b8 | |||
|
|
abdbbf9e24 | ||
|
|
6bfcb01ee7 | ||
|
|
785f2beed0 | ||
|
|
ffeaef5d82 | ||
|
|
4d4dbbcafe | ||
|
|
8e4f08a109 | ||
|
|
128b4a013b | ||
|
|
96323ac3ac | ||
|
|
d6da406d0f | ||
|
|
deefeecb45 | ||
|
|
b9968ea801 | ||
|
|
dab4d0effd | ||
| 791d20f16c | |||
| 8b27febf32 | |||
| 9944935fde | |||
|
|
22a7696fac | ||
|
|
b921543571 | ||
|
|
2c8ee08520 | ||
|
|
73d08df9ad | ||
|
|
2b856dbd28 | ||
|
|
c07307a309 | ||
|
|
b9d68bc5a6 | ||
|
|
33952023e8 | ||
|
|
19dbff67f2 | ||
|
|
06a3d15266 | ||
| eadb4de144 | |||
| 6bcbe51f7f | |||
| 832869b257 | |||
|
|
3a6f7986df | ||
|
|
c1830d6212 | ||
|
|
dd86cb00ad | ||
|
|
a8558a48ed | ||
|
|
bcabf5e019 | ||
|
|
00517b2600 | ||
|
|
9db7625717 | ||
|
|
5384479a61 | ||
| 28e80e47d7 | |||
|
|
410d27b746 | ||
|
|
cabd7539d3 | ||
|
|
c2d6405fea | ||
|
|
98185e914b | ||
|
|
5a176c2c67 | ||
| 82f37c9252 | |||
|
|
dbf8a9ad69 | ||
|
|
7ad7e1cf64 | ||
| 9fd9cf1138 | |||
| 59580d0f2d | |||
|
|
9f892cdda8 | ||
|
|
add230b4da | ||
|
|
a77966a736 | ||
|
|
2fa269ccbc | ||
|
|
5536e574db | ||
|
|
08189edf24 | ||
|
|
ff1a90a9c3 | ||
|
|
f21dc253e0 | ||
| 10245c0ff8 | |||
| a8147c125c | |||
| 85756fa0cd | |||
| 4869dbdc67 | |||
| 493679da3b | |||
| 9e8f1820c8 | |||
| 4e4853dcb2 | |||
| fd9df164c0 | |||
| df379b84cb | |||
| 7fd6cab2ac | |||
| 09f8a83a75 | |||
| c39ec1581e | |||
| a76119afcb | |||
| 67d8f108bb | |||
| 44c5b2bbb1 | |||
| a69b298aed | |||
| 58b920ed97 | |||
| 27cbb690e5 | |||
| 2cb4707f92 | |||
| ca32a81bf1 | |||
| 40d4a69133 | |||
| 1eb0587917 | |||
| 635fcadb59 | |||
| f8dcf2118e | |||
| 37af9dde90 | |||
| 65ca1c7bbc | |||
| a2e1867f69 | |||
| e7a213a114 | |||
| 183649aad8 | |||
|
|
22d9a94f2b | ||
|
|
df067b498d | ||
|
|
c963771b4b | ||
| 0318eb359f | |||
|
|
40ec7a66e4 | ||
|
|
8eda9174b2 | ||
|
|
ce266425e1 | ||
|
|
bc8863a3c7 | ||
|
|
04ffd0dca0 | ||
|
|
9d9bc5adee | ||
|
|
54001079f7 | ||
|
|
ed9173498f | ||
|
|
fb123cebf2 | ||
|
|
dd0f5f1b21 | ||
|
|
63ac3a5a43 | ||
|
|
22becafde9 | ||
|
|
07f944bf67 | ||
|
|
e1071bb14a | ||
|
|
aeec662fef | ||
|
|
852bdd2137 | ||
|
|
9cc803eb95 | ||
| bfbbbd6c5c | |||
|
|
b28b31196d | ||
|
|
dfd09bba57 | ||
|
|
8cf0171c06 | ||
|
|
5116375604 | ||
|
|
23dd7c7c96 | ||
|
|
8d6a28a9ff | ||
|
|
550b42e4d3 | ||
|
|
5249a228a0 | ||
|
|
749cbe19ab | ||
|
|
3a59d30e1a | ||
|
|
c58bd4c047 | ||
|
|
db078922e4 | ||
|
|
be3e478fce | ||
| 28043c94b5 | |||
| 45eec5b5a5 | |||
| c73182803d | |||
| 1b29ceaf1a | |||
|
|
17bdc969db | ||
|
|
1805e92038 | ||
|
|
7f60ebd6c7 | ||
|
|
4b827b25ad | ||
|
|
9cf9441ba6 | ||
|
|
78338ac12b | ||
|
|
1e3241ec6d | ||
|
|
6a323a583f | ||
|
|
daa1dd278d | ||
|
|
81ee874531 | ||
|
|
847d609ddc | ||
|
|
c55deb54f0 | ||
|
|
00ee94d24b | ||
|
|
fb90daa0ff | ||
|
|
750bc1e04a | ||
|
|
18285f96e8 | ||
|
|
d774678a0f | ||
|
|
478a4b6405 | ||
|
|
1fc797132a | ||
| a8e98cda83 | |||
|
|
4225f8348f | ||
|
|
d538918cfd | ||
|
|
61687c81d8 | ||
|
|
8be5d616e4 | ||
|
|
c06aeda399 | ||
|
|
fead60d2d8 | ||
|
|
2bd169ec32 | ||
|
|
95e27bb8bf | ||
|
|
bd381e434f | ||
|
|
f9f614b3a2 | ||
| d9e336d39f | |||
|
|
8fcdc7da16 | ||
|
|
3c6af94fb3 | ||
| 067a975875 | |||
|
|
a60906d7df | ||
|
|
2a2a8d6457 | ||
|
|
ecd8d49e38 | ||
|
|
3d8bac50e4 | ||
|
|
3640ef2b7f | ||
|
|
4a3be4df91 | ||
|
|
43d5892baa | ||
|
|
16a601e3bd | ||
|
|
f963d06643 | ||
|
|
1f43ddcbf1 | ||
| 30cfac08e2 | |||
|
|
6ecfdda580 | ||
|
|
32c8d9ec83 | ||
|
|
4ca8c35f1f | ||
|
|
da0a0f88f9 | ||
|
|
c812bee8f1 | ||
|
|
2eca4ee902 | ||
|
|
e504438fd2 | ||
|
|
c014ac3089 | ||
|
|
6b93f97de1 | ||
|
|
127346f7ae | ||
|
|
c68098777d | ||
|
|
ecc219fe50 | ||
|
|
6bf6995022 | ||
|
|
94e261370b | ||
|
|
ce7ee58e92 | ||
|
|
a25e3c2858 | ||
|
|
c2fc592c2c | ||
|
|
143a1ff94a | ||
|
|
fbf4431aa0 | ||
|
|
1fde8ef9bc | ||
|
|
064c597b60 | ||
|
|
90b21ce548 | ||
|
|
814339abb9 | ||
|
|
9409a2c34c | ||
| b3bdd4686b | |||
| af24c8ae06 | |||
|
|
bbf2e98827 | ||
|
|
73ad78ed1b | ||
| 90f7340bfc | |||
|
|
9abfc51ced | ||
|
|
a81a2cff02 | ||
|
|
506bb097f7 | ||
|
|
36da92075b | ||
| e5122b1acf | |||
|
|
d18d79ac47 | ||
|
|
5deac8d249 | ||
|
|
ca136db210 | ||
| 15964a4750 | |||
|
|
cc57ef8368 | ||
|
|
2fac4851a5 | ||
|
|
6fff4ec00d | ||
|
|
11eb55cade | ||
| 01fdd9598a | |||
| 7151ee85ce | |||
|
|
2f058029e9 | ||
|
|
487de0551c | ||
| 5729097bc4 | |||
| 12d826d941 | |||
| 4d70872b2b | |||
| 54d97251fe | |||
|
|
7cb60d3b69 | ||
|
|
b24d3b886a | ||
|
|
4fa419a751 | ||
| 40ab5c6b21 | |||
|
|
e9f411bebc | ||
|
|
4da478382d | ||
|
|
e114b5ab54 | ||
|
|
8f58669ddd | ||
|
|
5197085d79 | ||
|
|
7611e71a1b | ||
|
|
01daf5b8ce | ||
|
|
72bda346db | ||
|
|
870326b221 | ||
|
|
305bed6d9e | ||
|
|
37e85aebd2 | ||
| cacb0124ac | |||
|
|
9256e6b376 | ||
|
|
c7c90f47b0 | ||
|
|
f95ad7b27c | ||
|
|
9e722c8c99 | ||
|
|
e5dd2a32f4 | ||
|
|
1ba28b3edc | ||
|
|
f0bb9635bf | ||
|
|
683462c1b1 | ||
|
|
40f3cd3615 | ||
|
|
af742b9ba7 | ||
|
|
f3fc7c1c72 | ||
|
|
2529ee2359 | ||
|
|
be199983c1 | ||
|
|
5322aa5fcd | ||
|
|
66cf6c46c0 | ||
|
|
59165cabbe | ||
|
|
61e1c906bf | ||
|
|
24a18c63f9 | ||
| 0eee93729a | |||
|
|
d600759bc8 | ||
| bdb07adfcc | |||
|
|
99f5011d74 | ||
| b49099c8f3 | |||
|
|
bbd802940e | ||
| baa2d7fd56 | |||
| e066448e36 | |||
|
|
14af8e4b42 | ||
|
|
c68723db3c | ||
|
|
540e6d4285 | ||
|
|
d2d5fe938d | ||
|
|
19594f4adf | ||
|
|
918a4733b4 | ||
|
|
7c162cd1c6 | ||
| 7d58cdb12c | |||
|
|
8d27533cd4 | ||
| 73858ea682 | |||
| 20c2dd0c08 | |||
|
|
a9779b99fa | ||
|
|
2690faec43 | ||
|
|
297b7195b0 | ||
|
|
ed6cc64c49 | ||
|
|
95db456a7e | ||
|
|
9edad9ea85 | ||
|
|
f7714649ee | ||
|
|
e13698f8f7 | ||
|
|
42df254683 | ||
|
|
96cf60fbbd | ||
|
|
0b94638aeb | ||
|
|
960888a3bd | ||
| cbfd38d1ce | |||
|
|
5d17d6402d | ||
|
|
786f4ed114 | ||
| c34cb82ecb | |||
| f1c7389b29 | |||
|
|
17a5a85528 | ||
|
|
d224183a7e | ||
|
|
8256bf7ea6 | ||
|
|
4733a67226 | ||
|
|
4b9306aa7c | ||
|
|
07740d19f3 | ||
|
|
f27b89632d | ||
|
|
554cc356db | ||
|
|
7b6d805580 | ||
|
|
649a955a74 | ||
|
|
c6529daac5 | ||
|
|
f5015e4485 | ||
|
|
e14de38528 | ||
| bb17882065 | |||
|
|
00eb0b5a1a | ||
|
|
23fc7a573e | ||
|
|
51acfbbb01 | ||
|
|
f0e60da51f | ||
|
|
4e3cb55ce7 | ||
| 3c083330f8 | |||
| 71c63c2812 | |||
| ce603dfebf | |||
| dfa90cc11d | |||
| e01ade3848 | |||
| 2f120c70ee | |||
| 9bd2a61d8b | |||
| 952d9bbb4a | |||
| ad4bf75367 | |||
|
|
8be862e644 | ||
|
|
c4b1db006f | ||
|
|
fc513956be | ||
|
|
ee1b142f5d | ||
|
|
e8a29ece23 | ||
|
|
4ac7650f22 | ||
|
|
877a4f47cc | ||
|
|
8b2ae355ef | ||
|
|
07e2fc721a | ||
| ef8cde94a4 | |||
|
|
5084d2b56b | ||
| aba27c12e5 | |||
|
|
f5a5fc4c84 | ||
|
|
6dbd369272 | ||
|
|
767f3d0feb | ||
|
|
6b506ab0ad | ||
|
|
aeeec58178 | ||
|
|
b27d511251 | ||
|
|
6357093334 | ||
| 455226ffde | |||
|
|
0adccc50dc | ||
| 28f0139e6e | |||
|
|
7b59ede25e | ||
|
|
d858d048c1 | ||
|
|
0bb5c6c07f | ||
|
|
81870413af | ||
|
|
a09243472c | ||
|
|
893a125dd0 | ||
|
|
ac06202c21 | ||
|
|
5d8ac0428b | ||
| 563e038c0d | |||
| a03b6a99e6 | |||
|
|
2b71635c49 | ||
|
|
fd6e63d806 | ||
|
|
767ca5c3dc | ||
|
|
49a22b0c55 | ||
|
|
24fb08dbd9 | ||
|
|
350e88d4b9 | ||
|
|
6100027243 | ||
|
|
e2559efb93 | ||
|
|
8021da08d3 | ||
|
|
772052598d | ||
|
|
a15f948a40 | ||
|
|
fe73cfb922 | ||
|
|
58d5f99394 | ||
| 200a296b5c | |||
|
|
46dc133d04 | ||
|
|
8d2299e61e | ||
|
|
c229345741 | ||
|
|
553ac576eb | ||
|
|
ad733e6c4a | ||
|
|
58a7419b4f | ||
|
|
c77523503b | ||
|
|
4a682cd720 | ||
| e121e267ad | |||
| 5422dd682c | |||
|
|
44342732a4 | ||
|
|
5755160720 | ||
|
|
f26d15c5c9 | ||
|
|
01ddb177fc | ||
|
|
5f5a0e749b | ||
|
|
3f5dd5ce58 | ||
|
|
f7d224705f | ||
|
|
0c9513a2e7 | ||
|
|
0425305a73 | ||
|
|
b019ef2e43 | ||
|
|
f1f316c502 | ||
|
|
3f699024d9 | ||
|
|
1dce6bd7ca | ||
|
|
bf2b594066 | ||
|
|
964a39164e | ||
|
|
2e0a109331 | ||
|
|
6fbeb28bd6 | ||
|
|
8b71e26abd | ||
|
|
380cbfba55 | ||
|
|
f3bc712539 | ||
|
|
69fc872944 | ||
|
|
78c512e86b | ||
|
|
f71f6631cc | ||
|
|
05bde255f7 | ||
|
|
c0753c1afb | ||
|
|
e9bc8e892b | ||
|
|
2529c0aa83 | ||
|
|
89c6a44e4e | ||
|
|
645adaadb0 | ||
|
|
de9fd4a0fb | ||
|
|
2b470b1486 | ||
|
|
0cc438e6b9 | ||
|
|
1527a3ce92 | ||
|
|
5b1a1c773f | ||
|
|
5b8ded20a5 | ||
|
|
c137a16121 | ||
|
|
3eea3b5311 | ||
|
|
c79389c4d4 | ||
| 1033e89561 | |||
|
|
f8a9e11ff4 | ||
|
|
dc36a2c0b6 | ||
|
|
f55f2bfee1 | ||
|
|
7f629624db | ||
|
|
fe0f79adce | ||
|
|
983e1af33d | ||
|
|
dc502a5f26 | ||
|
|
f39708abb2 | ||
|
|
5b6313e642 | ||
|
|
f1fb2cde17 | ||
|
|
770c204d5a | ||
|
|
da61845f56 | ||
|
|
9a6a156512 | ||
|
|
644d2ba7a2 | ||
|
|
a9f6d147c4 | ||
|
|
7e529ed4c5 | ||
|
|
3753ea3cd8 | ||
|
|
24ca133396 | ||
|
|
1e7e42b221 | ||
|
|
3747ea29c2 | ||
|
|
9a8b4e98bf | ||
|
|
1fc551054a | ||
|
|
5771be9510 | ||
|
|
83deea0e03 | ||
|
|
a5b01f7361 | ||
|
|
701e80a025 | ||
|
|
6553628fcb | ||
|
|
8d785cbbe5 | ||
|
|
58573a70e1 | ||
|
|
988e5caafc | ||
|
|
c21c39be5a | ||
|
|
f714f53552 | ||
|
|
097f93a630 | ||
|
|
490380a504 | ||
|
|
0e30dd8bcc | ||
|
|
f62b07cc8c | ||
|
|
ba2db853a4 | ||
|
|
5b228a77e6 | ||
|
|
7e7f3b41b5 | ||
|
|
43aef8af2f | ||
|
|
6eae7ce78f | ||
|
|
135626a038 | ||
|
|
0084f0af24 | ||
|
|
400701004b | ||
|
|
e47447ba59 | ||
|
|
27f0308662 | ||
|
|
31a3d0e815 | ||
|
|
a86d6aeac4 | ||
|
|
e2891bc7d4 | ||
|
|
ebabc5db37 | ||
|
|
80b15f6b3b | ||
| 23aefe9509 | |||
|
|
eb8b42aff1 | ||
|
|
9602ee6265 | ||
|
|
dcc42f6281 | ||
|
|
1034cc1217 | ||
|
|
b3a449c276 | ||
|
|
430530c74b | ||
|
|
eb2c38825e | ||
|
|
c9ece21c28 | ||
|
|
7bdd243bf6 | ||
|
|
3860991111 | ||
|
|
c53a72d3f5 | ||
|
|
cdab5e793e | ||
|
|
c62ab6e09a | ||
|
|
ddcff85fa2 | ||
|
|
1a6f4e0fe0 | ||
|
|
c5b8401a15 | ||
|
|
837abd6da0 | ||
| 6ae5bedf3b | |||
|
|
9aca580195 | ||
|
|
8bab7b664c | ||
| 5056027238 | |||
|
|
0311c34746 | ||
|
|
dfe50d08d5 | ||
|
|
6857f98426 | ||
|
|
8e77981ad5 | ||
|
|
dd425ee6c5 | ||
|
|
24ca5c0218 | ||
|
|
33c9bdb778 | ||
|
|
771388cde2 | ||
| f2f18da189 | |||
|
|
6136ca38d1 | ||
|
|
da75445cd5 | ||
| 9e66f71a31 | |||
| 0bec39118f | |||
| b542c1486f | |||
|
|
79a3796b1c | ||
|
|
c08fc93d16 | ||
|
|
211c134950 | ||
|
|
a4508f846d | ||
| 6d2d36db3d | |||
|
|
6425a411ca | ||
|
|
d01f5dc0bd | ||
|
|
57a7114892 | ||
|
|
747711c7ca | ||
|
|
ec3d99950e | ||
|
|
94ecf33a5c | ||
|
|
abfe718f46 | ||
|
|
19706a7eec | ||
|
|
377503e61c | ||
|
|
b1a8fb83fa | ||
|
|
6e5c2b3fe2 | ||
| 1ccd2e234f | |||
|
|
d0d6a951da | ||
|
|
16ff7b167c | ||
|
|
e1a843878e | ||
|
|
dcbd3b4994 | ||
|
|
6ebcf5b929 | ||
|
|
da48ab0568 | ||
| b1d210cca7 | |||
| ead2554c78 | |||
| 880fe1a694 | |||
| 08ed09acc6 | |||
|
|
d27a1aca18 | ||
|
|
ddd79a2483 | ||
|
|
7604114b47 | ||
|
|
4074915779 | ||
|
|
da89c30498 | ||
|
|
e0fd85bc45 | ||
|
|
6c199c5d69 | ||
|
|
6e67c4f7d4 | ||
|
|
97415fc604 | ||
|
|
670b6ebecc | ||
|
|
ffffccf7a0 | ||
|
|
6e3ac5adc8 | ||
|
|
41be0fdd81 | ||
|
|
ef40f83f99 | ||
| ac15726e13 | |||
| 4296aa262e | |||
|
|
cf0f3d70b5 | ||
|
|
1c8e11b2cb | ||
|
|
7078c63062 | ||
|
|
0fc730bc5a | ||
|
|
88fcc19e24 | ||
|
|
bfa9904f3e | ||
|
|
e84723abba | ||
|
|
0c1768010b | ||
|
|
fc1347ac2a | ||
|
|
ba5dedc1df | ||
|
|
b1fce9e933 | ||
|
|
a66ef32da2 | ||
|
|
824f47d6e9 | ||
|
|
4ba9ff892c | ||
|
|
f9512983ff | ||
|
|
98469322b7 | ||
|
|
e81fa3d181 | ||
|
|
52990a332d | ||
|
|
14f5d03b6d | ||
|
|
d0ffdda5bb | ||
|
|
ff5902f9f8 | ||
|
|
a28d0f6c80 | ||
|
|
329f4fb2e6 | ||
| 42b860e91a | |||
|
|
e7da652711 | ||
|
|
44c9c43cd1 | ||
| 239c8ff87f | |||
|
|
7ffa2a103c | ||
| aa0b4f7045 | |||
| ea8e9b8cef | |||
| 299894025a | |||
| f08ee0db20 | |||
| 7bd42244c9 | |||
| 45f6bc1f3e | |||
| 36bfbaae69 | |||
| 58a1361d3e | |||
| 195c0ea986 | |||
| 06f6cd067d | |||
| d61f66d173 | |||
| 813dcd1b73 | |||
| 88f222f1a1 | |||
| ba91023fff | |||
| 6b9f7c9047 | |||
| 58afda342d | |||
| 27c2eb1869 | |||
| 8865e4ca97 | |||
| f3748fe20d | |||
| f9d1d9d114 | |||
| 454e616d13 | |||
|
|
3197c579e0 | ||
| cff448205f | |||
| 759ded9c38 | |||
|
|
0e09c26b54 | ||
| 65f91f69cc | |||
| c1400bae9b | |||
| 9c4f644641 | |||
| 5e4ed93415 | |||
| 1ee2062c1b | |||
| a33e48c065 | |||
| 8021f3b4cb | |||
| a84cc19499 | |||
| 6d19a09888 | |||
| 5a7b2a2038 | |||
| ffc488e748 | |||
| 32fc8b0676 | |||
| 760a171903 | |||
|
|
49407b6c06 | ||
|
|
e34fac6645 | ||
|
|
06f3b4048a | ||
|
|
228d9b5a12 | ||
|
|
22ae1dbac8 | ||
|
|
795ee3d36a | ||
|
|
00676ff5a9 | ||
|
|
8488b31aa0 | ||
|
|
bbac68e77c | ||
|
|
92cf56004f | ||
|
|
87c78be8f4 | ||
|
|
74034d6b9d | ||
|
|
1b7709f325 | ||
|
|
4613b58a31 | ||
|
|
bccfb8b4cd | ||
|
|
4fd474dd08 | ||
|
|
807f049dc3 | ||
|
|
1607100fc2 | ||
|
|
78f90db72f | ||
| 1cf3762392 | |||
|
|
d47bd5529c | ||
|
|
fbcbc93b6e | ||
| 8a9a44731b | |||
|
|
ce911c5f50 | ||
|
|
ef1782f85e | ||
|
|
398be76bf6 | ||
|
|
93829e57b2 | ||
|
|
41ccbbd4e9 | ||
|
|
71ce480dbb | ||
|
|
1d410bb68b | ||
|
|
fee3c0afbd | ||
|
|
5f60bec85b | ||
|
|
71698c5d46 | ||
|
|
00a3a25b94 | ||
|
|
ce9bc1258a | ||
|
|
0f4b969d62 | ||
|
|
c374368053 | ||
|
|
ad04b8cfd3 | ||
|
|
e73dba21d2 | ||
|
|
b6008d0032 | ||
|
|
64c9baa6aa | ||
|
|
707eed0a73 | ||
|
|
1d980d527e | ||
|
|
272d300fc8 | ||
|
|
5eef3c47eb | ||
|
|
49969e08c3 | ||
|
|
354edd9431 | ||
|
|
8f6950eb3c | ||
|
|
d8cc4795be | ||
|
|
af1291ec28 | ||
|
|
56c898da80 | ||
|
|
887eb3b6d9 | ||
|
|
f7961b96a9 | ||
|
|
c42ffb8f3d | ||
|
|
d8257380d7 | ||
|
|
16170d44ab | ||
|
|
c69dd3c32b | ||
|
|
78d049d0f1 | ||
|
|
333a10deda | ||
|
|
432f43a472 | ||
|
|
a778163d0f | ||
|
|
c7b6e66426 | ||
|
|
7854625c4e | ||
|
|
dbe47a6a2a | ||
|
|
3a95480178 | ||
|
|
d8d36a4fb0 | ||
| 93b373d617 | |||
|
|
14b3b51c58 | ||
|
|
ac95106b88 | ||
| 6669cedf5b | |||
| 65e26f4a06 | |||
| c0b32976e8 | |||
| d3fb6c96da | |||
| 710c2dc54b | |||
| d92a77fdd3 | |||
| a85b6441fc | |||
| 024c8da578 | |||
| d0427cf60c | |||
| c849b781c0 | |||
| 89797fd3f9 | |||
| c37a25f0e5 | |||
| 92917b84f1 | |||
| 67eb93fc98 | |||
| dddd25a776 | |||
|
|
6dc0f4f1b6 | ||
|
|
9582cc5bd5 | ||
|
|
19af89cbee | ||
| 0e2d231445 | |||
|
|
a995a5c58f | ||
|
|
c394af4128 | ||
|
|
93d76778c9 | ||
|
|
d7eedc5e38 | ||
|
|
1f759537c9 | ||
|
|
9203a77804 | ||
|
|
4900668778 | ||
| 04734ca7ae | |||
|
|
034b1bb903 | ||
|
|
9b3af2b7e3 | ||
| e666e86035 | |||
|
|
0e30fe1cc5 | ||
|
|
16b7d99041 | ||
|
|
accc454644 | ||
|
|
0a60aee3e4 | ||
|
|
b074f8a161 | ||
|
|
45dee6e77b | ||
|
|
fea1cad02c | ||
| 64df244cf5 | |||
|
|
32bcf88e18 | ||
|
|
0ef68d6aea | ||
|
|
a3d8567d2c | ||
|
|
12b81618a3 | ||
|
|
9477f222be | ||
|
|
e7a78e0847 | ||
|
|
a44c09e286 | ||
|
|
4860e0cf62 | ||
|
|
1771858f4a | ||
|
|
4b71831d8b | ||
|
|
94b2561860 | ||
|
|
1c1df053d5 | ||
|
|
a76ad3415c | ||
| 27c6ffb9a2 | |||
|
|
b49f7d1da5 | ||
|
|
2b1fc15707 | ||
| d69f081c04 | |||
|
|
531c1e046c | ||
| 59ebad6acb | |||
| f175a49444 | |||
| b57e6e9856 | |||
| d73505a027 | |||
| 60dd5a8d7d | |||
| ccd3013396 | |||
| 3cf1258c87 | |||
| 6a99a7b551 | |||
| 92d2f47503 | |||
| 4adbd23b75 | |||
| d30f11163c | |||
| af135a7560 | |||
|
|
d4801b8c54 | ||
|
|
510985ffbc | ||
|
|
31b8ecdcbd | ||
| 40eab95d3d | |||
|
|
8498e7f2cd | ||
|
|
1b5f171081 | ||
|
|
887f6f3f23 | ||
|
|
7c387c6d2b | ||
|
|
31bea079cf | ||
|
|
5c4fab744e | ||
|
|
1c6bff6755 | ||
|
|
7316644bb4 | ||
|
|
3563c3725c | ||
|
|
6dc01e179a | ||
|
|
06f820c0d6 | ||
|
|
1ea227716d | ||
|
|
9f8823e455 | ||
|
|
c754e01711 | ||
|
|
61d1148bb3 | ||
|
|
8acec2ca35 | ||
|
|
5e86262694 | ||
|
|
b76d37f24a | ||
|
|
05a1519e5d | ||
|
|
ea9bc9b4b6 | ||
|
|
4d54cbc6a7 | ||
|
|
5cb7e64cc8 | ||
|
|
b2ec77e554 | ||
|
|
fbc78972eb | ||
|
|
f01c7745a5 | ||
|
|
b93ee1e6f8 | ||
|
|
2b6b0e949d | ||
|
|
93cc505144 | ||
|
|
9f3bddbcb2 | ||
|
|
b6724e843c | ||
|
|
1f4fcb399b | ||
|
|
d8fef207d2 | ||
|
|
6063828279 | ||
|
|
4c2d0c3dc5 | ||
|
|
715ea13273 | ||
|
|
e6bd99a5ee | ||
| 9b8df7f635 | |||
|
|
65c22aa434 | ||
|
|
6afbefc739 | ||
|
|
0887bc2112 | ||
|
|
076c5f946f | ||
|
|
fd7801415a | ||
|
|
ca9eae8eea | ||
|
|
824a57c6f4 | ||
|
|
b30d89131b | ||
|
|
efee11dffe | ||
|
|
0619966c19 | ||
|
|
57464998c0 | ||
|
|
5b675cc83f | ||
|
|
649e6d59ce | ||
|
|
aa97ea2501 | ||
|
|
92216d6417 | ||
|
|
9572f306d3 | ||
|
|
e5e132a364 | ||
|
|
9fc7118861 | ||
|
|
e15bcebb6e | ||
|
|
c010cc2c41 | ||
|
|
d37326326d | ||
|
|
db26e894fb | ||
|
|
945736e9bb | ||
|
|
2bdd62220e | ||
|
|
01cd1c5b34 | ||
|
|
debbf1028a | ||
|
|
7f804fdc5d | ||
|
|
f4f2018952 | ||
|
|
7be9837f73 | ||
|
|
d356581651 | ||
|
|
b2c4b0bcfa | ||
|
|
b1b253c012 | ||
|
|
7ab5c520e6 | ||
|
|
b7e6bf959e | ||
|
|
c4a5297ee2 | ||
|
|
ebc1373c08 | ||
|
|
6696915801 | ||
|
|
901f3dce6e | ||
|
|
11d225fe62 | ||
|
|
c4817968ee | ||
|
|
d9503e579b | ||
|
|
eac639a72c | ||
|
|
a6b5870514 | ||
|
|
9a1f1236cc | ||
|
|
3dfed3c4aa | ||
|
|
739981b34e | ||
|
|
a6e048686f | ||
|
|
a14101cd13 | ||
|
|
a5725941a0 | ||
|
|
356b1a8d6d | ||
|
|
c735dceed5 | ||
|
|
b9cdf195e2 | ||
|
|
204cdada7c | ||
|
|
54a342a7f5 | ||
|
|
e9b4e0bd35 | ||
|
|
652767fb1c | ||
|
|
764d49e641 | ||
|
|
51a79b1af7 | ||
|
|
ce37a442e8 | ||
|
|
c937fa1760 | ||
|
|
778e8bfda9 | ||
|
|
f6f45c82a1 | ||
|
|
703fb9d4a1 | ||
|
|
543708416b | ||
|
|
060ab8a1f0 | ||
|
|
1ee8a09da2 | ||
|
|
6a46fd5b91 | ||
|
|
4b6e02949d | ||
|
|
cf0a4d208e | ||
|
|
bca89c260f | ||
|
|
226efb37bc | ||
|
|
f43834aba2 | ||
|
|
2bd6d05663 | ||
|
|
441d9d2286 | ||
|
|
b42dc3b884 | ||
|
|
d22283c9c4 | ||
|
|
049921fec8 | ||
|
|
02b71e013a | ||
|
|
61a2e4f94b | ||
|
|
1ec3580946 | ||
|
|
c1f731d62e | ||
|
|
e232ec10ce | ||
|
|
138189bad1 | ||
|
|
d83a4ac72d | ||
|
|
2aef9b02bd | ||
|
|
39e01c3938 | ||
|
|
05a10f7905 | ||
|
|
946373fdcd | ||
|
|
aaa7198071 | ||
|
|
8e90c1996c | ||
|
|
eb24653d3f | ||
|
|
8ff2846bb2 | ||
|
|
ee019a96ba | ||
|
|
db5c3c9676 | ||
|
|
6db10f9c7d | ||
|
|
1b3bc98068 | ||
|
|
cb7df2e1ed | ||
|
|
9e3fa863f1 | ||
|
|
e047ea287f | ||
|
|
da1c7f2a79 | ||
|
|
900edb2b8e | ||
|
|
5e3a853db4 | ||
|
|
a3a601d0c6 | ||
|
|
678faff464 | ||
|
|
7f27fcd63a | ||
|
|
a29105fefd | ||
|
|
49decf90c9 | ||
|
|
e977b427aa | ||
|
|
389c81341d | ||
|
|
0c6935e336 | ||
|
|
12edb57aac | ||
|
|
e759769635 | ||
|
|
565d002a80 | ||
|
|
e2d252a6d5 | ||
| c243c13f02 | |||
| 9fd10322fe | |||
| db43c56f79 | |||
|
|
efeae0d84f | ||
|
|
8f928340c6 | ||
|
|
7ba89f5330 | ||
|
|
11ef43b071 | ||
|
|
8d692f33a8 | ||
|
|
ac5ad030f4 | ||
|
|
90ae1efa00 | ||
|
|
6ac2fe58fd | ||
|
|
693b3e7704 | ||
|
|
f38a9c8d29 | ||
|
|
610e0171aa | ||
|
|
07f031c708 | ||
|
|
a1e4814a27 | ||
|
|
518d909b2c | ||
|
|
384a7f7e70 | ||
|
|
4b157aa6b8 | ||
|
|
1160635608 | ||
|
|
207369ec09 | ||
|
|
9cdf5e148a | ||
| 98eef79faa | |||
| 6912d31560 | |||
|
|
612c6bb86b | ||
|
|
d64b4e3059 | ||
| a18a392109 | |||
|
|
6494bbdc64 | ||
|
|
dc6902a33e | ||
|
|
bfcaa4b2b4 | ||
|
|
6a49766df0 | ||
|
|
88d8956378 | ||
|
|
72f6d7ee21 | ||
|
|
7bb508bf43 | ||
|
|
3610520ca4 | ||
|
|
cdfc3a2d37 | ||
|
|
416a32ab01 | ||
|
|
49fcfd14d2 | ||
| 81105cb9ef | |||
| 1df48176ce | |||
| 6160d11c5a | |||
| a2919a6fb2 | |||
| 910f69c42b | |||
| 36b4646516 | |||
| af520729fe | |||
| bdab6c12d4 | |||
| 742aa740f6 | |||
| 8c4a9f6444 | |||
| 1474fccd2f | |||
| dc74ae83da | |||
| 51b9a1aeca | |||
|
|
b08b0264cc | ||
|
|
818b96ae61 | ||
|
|
a6c20208b3 | ||
|
|
e5f7adcf5d | ||
|
|
14799f9ee6 | ||
|
|
30361f6f2a | ||
|
|
e963cff72d | ||
|
|
40f1bd0c7c | ||
|
|
a2233ced87 | ||
|
|
90ad9beff5 | ||
|
|
08375c7930 | ||
|
|
51c888d4be | ||
|
|
3ddb598f0d | ||
|
|
d712d1281c | ||
|
|
0ab2c7b10a | ||
|
|
f1b3c88d6e | ||
|
|
7b31ededcd | ||
|
|
8e7dab34c2 | ||
|
|
9f81922be3 | ||
|
|
0354d4a225 | ||
|
|
3fcd999130 | ||
|
|
b81195d1d5 | ||
|
|
b8910676db | ||
|
|
f6869c69c5 | ||
|
|
85fef83f73 | ||
|
|
c8752ff93e | ||
|
|
8e26fdc0e9 | ||
|
|
372bcf8a95 | ||
|
|
734661e79c | ||
|
|
b1ac6b4444 | ||
|
|
742f9cfdb0 | ||
|
|
37e77b21cd | ||
|
|
7ff499046b | ||
|
|
eb86010176 | ||
|
|
a7634e8bf2 | ||
|
|
41fe62929f | ||
|
|
0068c76fa6 | ||
|
|
121044cd57 | ||
|
|
edc48a505f | ||
|
|
2bcc5c06c2 | ||
| f1509debc3 | |||
|
|
678f266394 | ||
|
|
e0733d153e | ||
|
|
8fef69809c | ||
|
|
96f6ce222c | ||
|
|
e81d22cd67 | ||
|
|
f03045b97e | ||
|
|
bb5cdcf954 | ||
| 6d97f6fccc | |||
|
|
9c38f5dcb1 | ||
|
|
ce214e82a5 | ||
|
|
dcf80e39dc | ||
|
|
83a27edd20 | ||
|
|
768149fb01 | ||
|
|
a5ab2829eb | ||
|
|
959b4da9bb | ||
|
|
5a9aac472a | ||
| 57ab4f1329 | |||
|
|
dc2f729d19 | ||
|
|
9b4b655b03 | ||
|
|
3a9e01e185 | ||
|
|
b5af05cd31 | ||
|
|
cceab2af65 | ||
|
|
d73d7488b7 | ||
|
|
965a4961ce | ||
|
|
0932b64ae7 | ||
|
|
1b3cb17abd | ||
|
|
ab4a453006 | ||
|
|
a7844205bd | ||
|
|
846f01b2c8 | ||
|
|
34b4993d63 | ||
|
|
d7e57259f9 | ||
|
|
eed7e84d94 | ||
|
|
f4a1cfb116 | ||
|
|
9dbb6fdb38 | ||
|
|
2f80460a2f | ||
|
|
632cd9f992 | ||
|
|
97355f8fb7 | ||
|
|
d1c9bb30e2 | ||
|
|
ac33c3fe2c | ||
|
|
94d90742dd | ||
|
|
22d67b45f0 | ||
|
|
e514782cc6 | ||
|
|
f6aee98000 | ||
|
|
36ef3476de | ||
| 01b2682842 | |||
|
|
2345b57373 | ||
|
|
4df19753e0 | ||
|
|
5375e54603 | ||
|
|
77b5a38ec7 | ||
|
|
bce77adecd | ||
|
|
50a6342f6d | ||
|
|
9911b64fa1 | ||
|
|
657c651e0e | ||
|
|
4c5a9d1e3a | ||
|
|
4758081e10 | ||
|
|
45b6e0174e | ||
|
|
a88004e509 | ||
|
|
97d405e109 | ||
|
|
e237dfe3c5 | ||
|
|
aaa550b33e | ||
|
|
9122d0b9f4 | ||
|
|
591cc1a243 | ||
|
|
f56deb60c6 | ||
|
|
d0d949cd24 | ||
|
|
d358c915c3 | ||
|
|
3df03a5650 | ||
|
|
843ff5d302 | ||
|
|
5163618d23 | ||
|
|
9c842c5a67 | ||
|
|
e089862a6c | ||
|
|
0a657091c6 | ||
|
|
f8229372bd | ||
|
|
6e4c76a926 | ||
|
|
9116470fd7 | ||
|
|
71ec419da6 | ||
|
|
48443ce02b | ||
|
|
d9a98bd05c | ||
|
|
c8437e6595 | ||
|
|
93d20077cc | ||
|
|
a2c7e2795b | ||
|
|
41f12a7a6c | ||
|
|
e273b9a11f | ||
|
|
0abf45a446 | ||
|
|
0a8d9eed45 | ||
|
|
2e8b8c7b95 | ||
|
|
6a3968d805 | ||
|
|
d73348f673 | ||
|
|
ff8604bb82 | ||
|
|
51841447be | ||
|
|
ca0e8ea1eb | ||
|
|
48ea2271b7 | ||
|
|
783cc4de39 | ||
|
|
c72e3536f1 | ||
|
|
2ecb46f192 | ||
|
|
2a92cf8d8b | ||
|
|
49aacc8596 | ||
|
|
4d7b9cde33 | ||
|
|
70fdde4aaa | ||
|
|
ed34d52efd | ||
|
|
9b4ffc0571 | ||
|
|
fce35c3481 | ||
|
|
c33542f978 | ||
|
|
35e35e61d3 | ||
|
|
8f921cf138 | ||
|
|
185a149da4 | ||
|
|
eec42d4cb5 | ||
|
|
4a21426377 | ||
|
|
4b66483757 | ||
|
|
d901b056dc | ||
|
|
dd27fdfbe3 | ||
|
|
51fd286cbf | ||
|
|
26f1fd0071 | ||
|
|
54cb1feea0 | ||
|
|
522b17ca93 | ||
|
|
ac113fdc81 | ||
|
|
ffc5f0c338 | ||
|
|
ed476a417c | ||
|
|
e169da3532 | ||
|
|
e114b31a7a | ||
|
|
24bca06db0 | ||
|
|
3d1e0051e6 | ||
|
|
b26ee6c1f6 | ||
|
|
2681bd52b5 | ||
|
|
427733af04 | ||
|
|
627ecadb3f | ||
|
|
1e96ca582e | ||
|
|
d1664bdde2 | ||
|
|
596f2f6e7d | ||
|
|
cb259de5ef | ||
|
|
6fd6747e9e | ||
|
|
e808dca893 | ||
|
|
22f0c14fdb | ||
|
|
7aa689823e | ||
|
|
f4a2474447 | ||
|
|
75bcd73439 | ||
|
|
a301a9d9b1 | ||
|
|
fcddfd0f39 | ||
|
|
87d58b3b0a | ||
|
|
367d3800fc | ||
|
|
0e5dfbaf8f | ||
|
|
0537f4e775 | ||
|
|
c759c9a2aa | ||
|
|
b80dbb4b2c | ||
|
|
34646c5565 | ||
| 48bc4bd5d6 | |||
| e33accae4d | |||
| 783846c605 | |||
|
|
ab9a64eafa | ||
|
|
0a9c6fbb7f | ||
|
|
3a17a79bf2 | ||
|
|
d4e28dd233 | ||
|
|
11cb3e3b4b | ||
|
|
c3d1256d76 | ||
|
|
5028804878 | ||
|
|
1ce682d404 | ||
|
|
74ad5e80ce | ||
|
|
35b81440c7 | ||
|
|
d9e623eb09 | ||
|
|
69b3d47564 | ||
|
|
965a40b6a1 | ||
|
|
1a0c10c328 | ||
|
|
c1e7a254a3 | ||
|
|
3f764d99ee | ||
|
|
4d9fcc6ed0 | ||
|
|
fc0cb8fb29 | ||
|
|
111f7ddf69 | ||
|
|
ceb2efcbc3 | ||
|
|
47849a9e58 | ||
|
|
7750eb0dcc | ||
|
|
c84c30846c | ||
|
|
367e16304f | ||
|
|
4613f80d7a | ||
|
|
0dd17f4418 | ||
|
|
d911dc98d9 | ||
|
|
928433f2e3 | ||
|
|
87e4f47866 | ||
|
|
c9d8cfc9fa | ||
|
|
b0440a90a7 | ||
|
|
39fc16deae | ||
|
|
5f3843df71 | ||
|
|
5015125526 | ||
|
|
bbedd43273 | ||
|
|
8abf8c2c50 | ||
|
|
7f6bef3251 | ||
|
|
08749630a2 | ||
|
|
f879114c43 | ||
|
|
ba0911b0f6 | ||
|
|
1bc2e979eb | ||
| e40539caca | |||
| 56367b197b | |||
| 844f575a90 | |||
| 2019d47ed5 | |||
|
|
2d579cc995 | ||
|
|
a9f257bcd6 | ||
| 472a04ba4b | |||
| c5db97c50f | |||
|
|
0f2fb93d14 | ||
|
|
0f074fb956 | ||
| f496c0b58d | |||
| d4b9458512 | |||
| 05837b2841 | |||
| 159728b550 | |||
| 57fde2e07b | |||
|
|
9ec9644928 | ||
|
|
57bac9a1fc | ||
|
|
12df4ce221 | ||
|
|
3e616ccead | ||
|
|
017c188ab5 | ||
|
|
759929c24a | ||
|
|
a80d7479d0 | ||
|
|
0a41b86f6b | ||
|
|
6c91af7d56 | ||
|
|
bc4c74517a | ||
| 66d031fc18 | |||
|
|
e7923c068e | ||
| 103ad9966a | |||
| 4f8b37042d | |||
| d82292fa1f | |||
| 3c11f6cc05 | |||
| 1d2cc0b968 | |||
| 9737dd9c30 | |||
| 9110e36636 | |||
| 2a1c37cf8b | |||
| ce95b9379d | |||
|
|
07eb7d653c | ||
|
|
3abdf744d5 | ||
|
|
f552d854f4 | ||
|
|
076a96ccc6 | ||
|
|
436b15e558 | ||
|
|
d768d4d37a | ||
|
|
03e5043af4 | ||
|
|
ed6e81d688 | ||
|
|
496e16d99b | ||
|
|
c5fa9730a8 | ||
|
|
fc9c0ba573 | ||
|
|
f52f60b17d | ||
|
|
7b56617f8e | ||
|
|
a26102607e | ||
|
|
6f050d7af3 | ||
|
|
ae52d052cb | ||
|
|
d0401f02a9 | ||
|
|
87835c77e8 | ||
|
|
bf460ddf25 | ||
|
|
1537e7ae77 | ||
|
|
ab4c09cea7 | ||
|
|
3509dad5b3 | ||
|
|
c49f4bcc85 | ||
|
|
fc8908b6a4 | ||
|
|
343f093ead | ||
|
|
84f424f631 | ||
|
|
f232aef786 | ||
|
|
741e1d9828 | ||
|
|
f67b307371 | ||
|
|
b80abf1a90 | ||
| 93d3629da2 | |||
| 0110463811 | |||
| 3f112d28e3 | |||
| 458eef052e | |||
| 38659b566c | |||
|
|
d5074220a8 | ||
|
|
da733c01da | ||
|
|
30a1624d59 | ||
|
|
0b99baccb8 | ||
|
|
54b66d9484 | ||
|
|
65512cef1c | ||
|
|
f1a497e293 | ||
| d43449a6d6 | |||
| a7b36f724f | |||
| a770b5a919 | |||
| 6638bc32c3 | |||
| 8a760b0657 | |||
| a580f0f1c4 | |||
| 5a3a0a5092 | |||
| de14b5b02f | |||
|
|
1504d9005d | ||
|
|
579784c4a0 | ||
|
|
ac2a4608da | ||
|
|
04c562cae6 | ||
|
|
dff1c07e18 | ||
|
|
182a8733a4 | ||
|
|
5d158d884d | ||
|
|
023054e67a | ||
|
|
0b52359190 | ||
|
|
e381f593ff | ||
|
|
986664659e | ||
|
|
1687c8b1e3 | ||
|
|
beb80e7545 | ||
|
|
99789289d8 | ||
|
|
6a76e1571b | ||
|
|
b316549590 | ||
|
|
178be2e3c9 | ||
|
|
23da0fa99c | ||
|
|
80fdb18da1 | ||
|
|
25d5f2cfc6 | ||
|
|
73ce75c3f8 | ||
|
|
47425f21cc | ||
|
|
0e3cad04b7 | ||
|
|
a345223dac | ||
|
|
dffac11c2f | ||
|
|
fd4aafacbe | ||
|
|
37793044fc | ||
|
|
8bbd539031 | ||
|
|
c91435eff2 | ||
|
|
b3b38c18c5 | ||
|
|
08c8198fbc | ||
|
|
7a51719fa2 | ||
|
|
8ff0a3df42 | ||
|
|
6fd24725b8 | ||
|
|
81896930c7 | ||
|
|
9d5ccccf7d | ||
|
|
a9614bb964 | ||
|
|
2aac3cbdce | ||
| 03c04e77ae | |||
| 32a29ffdff | |||
| cb8539b06d | |||
| f83b0c2507 | |||
| 3c3cad5ae6 | |||
|
|
9285252fbc | ||
|
|
750037a4c4 | ||
|
|
e27f68ffe7 | ||
|
|
724637faa3 | ||
|
|
058c16e98c | ||
|
|
8104b42894 | ||
|
|
c08702414e | ||
|
|
bf3a5afca1 | ||
|
|
c88a8e66c6 | ||
|
|
ca3e55bfab | ||
|
|
7cc8b784c3 | ||
|
|
b414f82669 | ||
|
|
eeb3825646 | ||
|
|
9b8d648986 | ||
|
|
ec7a3feeba | ||
|
|
0ba541d498 | ||
|
|
2de20e06d0 | ||
|
|
d8bb2d7c6d | ||
|
|
ef87cc3ed3 | ||
|
|
6502ec5dff | ||
|
|
53a1b68649 | ||
|
|
07fa458767 | ||
|
|
004d644184 | ||
|
|
6ff7e25397 | ||
|
|
33496e9c68 | ||
|
|
3cf96a554d | ||
|
|
93cffaa87e | ||
|
|
ad0971fb25 | ||
|
|
6400113bb9 | ||
|
|
a0977cac7b | ||
|
|
74effeeefd | ||
|
|
d14e34449b | ||
|
|
1e7ff52bb7 | ||
|
|
fffe171d5f | ||
|
|
074697a89f | ||
|
|
cf9da59829 | ||
|
|
660081ece2 | ||
|
|
547beb5d47 | ||
|
|
01e294536c | ||
|
|
c93ccd1e91 | ||
|
|
79cd86445e | ||
|
|
dd5d7c86d2 | ||
|
|
60df6170cc | ||
|
|
b5b9a56918 | ||
|
|
cc1e5d29c7 | ||
|
|
5f1398f272 | ||
|
|
fa8890f7ba | ||
| 048b30d654 | |||
|
|
3f26a56fff | ||
|
|
97f6fbc614 | ||
|
|
96c6fbd10b | ||
|
|
bb3f54a1cd | ||
|
|
db04fd1725 | ||
|
|
aae7a459f3 | ||
|
|
ed8a52d1db | ||
| 0722dafc24 | |||
|
|
7e632c9414 | ||
|
|
959f7297da | ||
|
|
e889287f6c | ||
|
|
4146d6f872 | ||
|
|
dd2cd6f002 | ||
|
|
a170c5e13a | ||
|
|
323cca8910 | ||
|
|
bdbb16ec83 | ||
|
|
e7abd8a0ab | ||
|
|
f4d3c352ae | ||
|
|
2e29f26e53 | ||
|
|
70e99e78b6 | ||
|
|
75eb44f234 | ||
| 7f3fd20ea9 | |||
| 8af77cb91f | |||
| 5061405eb3 | |||
| 9f7a874d02 | |||
| 18c659780e | |||
| f211a090e2 | |||
| 1cc281b6a4 | |||
| 81452475e4 | |||
|
|
c909b733a8 | ||
| 9cffe28ae7 | |||
|
|
cd5577c4d9 | ||
| 79e2ede7c1 | |||
|
|
ce337eaa27 | ||
|
|
e0ca70119c | ||
| 89bd87d9fc | |||
|
|
47efd595fc | ||
|
|
b354c9e2e8 | ||
|
|
a76447ea6c | ||
|
|
cf888dc02b | ||
|
|
1616f7cf95 | ||
|
|
2303291f38 | ||
|
|
5cd6bb4d56 | ||
|
|
4667d4de8c | ||
|
|
0fe7efdf36 | ||
|
|
ddcae19254 | ||
|
|
0e6813d084 | ||
|
|
2fd7a43f2f | ||
|
|
fe75c7793c | ||
|
|
0d2fee95e2 | ||
|
|
7ea95457ee | ||
|
|
6ace4ee7e8 | ||
|
|
2fb4fa3289 | ||
|
|
d98151a434 | ||
|
|
796373b8be | ||
|
|
a9419b5d46 | ||
|
|
b901def8b3 | ||
| d0f9b5901e | |||
|
|
9ee278d2ac | ||
|
|
fd00bb8b7f | ||
| fe3e8d1589 | |||
| f3ac3ead8d | |||
|
|
198f9579f3 | ||
| 3ecd8cbd20 | |||
|
|
f72d166e51 | ||
|
|
c7b6d35fd4 | ||
|
|
8e64b12408 | ||
|
|
de0afcdf2d | ||
| 90571e7b7f | |||
|
|
1ed4978620 | ||
|
|
9380c34cf7 | ||
|
|
0db8b888d3 | ||
|
|
7cd92dd94c | ||
|
|
820d5092b3 | ||
|
|
a59798ed49 | ||
|
|
9a9cb2e7d3 | ||
|
|
2f6e1d85d2 | ||
|
|
9f5520135c | ||
|
|
a25e10ed59 | ||
|
|
1e914ac2b0 | ||
|
|
d06a7c4671 | ||
|
|
53fb699436 | ||
|
|
4e22b9a346 | ||
|
|
ad988013f0 | ||
|
|
aa0445228b | ||
|
|
aac5a4f178 | ||
|
|
dbf1bef56a | ||
|
|
e470376c12 | ||
|
|
296ba101ec | ||
|
|
d0f1b59be5 | ||
|
|
33001f4e19 | ||
|
|
daf7c2857d | ||
|
|
5edc29c6a5 | ||
|
|
c7efc94a33 | ||
|
|
c5c13a8ba1 | ||
|
|
108409c6cd | ||
|
|
15530a69c7 | ||
|
|
bd086a102e | ||
|
|
589cb1af6d | ||
|
|
e738f5eaa1 | ||
|
|
8c5df5f732 | ||
|
|
08362c9cab | ||
|
|
ec99dae953 | ||
|
|
ae950bc050 | ||
|
|
0169ea5155 | ||
|
|
87737fb50a | ||
|
|
8f46133917 | ||
|
|
595f6387c2 | ||
|
|
c23f151b6b | ||
|
|
fbe1c05832 | ||
|
|
abd01c5fbb | ||
|
|
f4719609f7 | ||
|
|
17ef2df2ca | ||
|
|
739b42e3e0 | ||
|
|
51edfb992a | ||
| d8608e5229 | |||
|
|
3574670226 | ||
|
|
c917270da7 | ||
|
|
ffe0e0edc3 | ||
|
|
f3e1c8fd36 | ||
|
|
d6c59c4de0 | ||
|
|
665fe7a839 | ||
|
|
86a5a6d646 | ||
|
|
2ffd70417d | ||
|
|
19f0d82048 | ||
| 9966bf86da | |||
|
|
8371eb27bd | ||
|
|
4974c933b1 | ||
| 8f81beea7e | |||
| 76149ebf57 | |||
| 894bb3c003 | |||
|
|
6356e0c2f1 | ||
| 32de8b437c | |||
|
|
ece892299a | ||
|
|
fa377fdcba | ||
|
|
ef4292c1b8 | ||
|
|
7d26240444 | ||
|
|
e62880a594 | ||
|
|
8e06b6f964 | ||
|
|
e14b064cbb | ||
|
|
5820a6a700 | ||
|
|
b35ab3effb | ||
|
|
f1436410bd | ||
|
|
e79340601f | ||
|
|
8e24d1f4b7 | ||
|
|
d13d0244ec | ||
|
|
dd980249c6 | ||
|
|
37a7cf9934 | ||
|
|
c09f0c888b | ||
|
|
5cffd7e88d | ||
|
|
eb85304d04 | ||
|
|
03866c0598 | ||
|
|
2ed40075a5 | ||
|
|
285eb71db6 | ||
| 51bed1e7df | |||
| 6a5eabaa26 | |||
|
|
c592a2b4db | ||
|
|
f078055f59 | ||
|
|
d95022f7bb | ||
|
|
4c01ddcbab | ||
|
|
fe10a45533 | ||
|
|
75b5142954 | ||
|
|
93df3b89e8 | ||
|
|
16ffc731f3 | ||
|
|
67cb48acbf | ||
|
|
eea01c32b8 | ||
|
|
2e05f628f0 | ||
|
|
1f40f9e04f | ||
|
|
3bb6a32a20 | ||
|
|
67cf005ee5 | ||
|
|
fd4ef233c6 | ||
|
|
77cf4dce8f | ||
|
|
d1a7fdd9d4 | ||
|
|
5ed4e4d0ab | ||
|
|
edc5d8938e | ||
|
|
4f54514be4 | ||
|
|
54a38fdf01 | ||
|
|
709d3230a5 | ||
|
|
02d0881fca | ||
|
|
cee4286637 | ||
|
|
c32214ccc7 | ||
|
|
a43876ad1e | ||
|
|
0af5dd59f2 | ||
|
|
8a42c33dca | ||
|
|
ba724fffb4 | ||
|
|
42baf0061b | ||
|
|
66c09efae2 | ||
|
|
fd0420d432 | ||
|
|
0543a64dc1 | ||
|
|
4cca455c9b | ||
|
|
80517c4cf6 | ||
|
|
49090d1378 | ||
|
|
916ca9f8a6 | ||
|
|
38fd9c25f2 | ||
|
|
bdc5a6b7c0 | ||
|
|
58b07ecb43 | ||
|
|
acf4b1bede | ||
|
|
09abd3d95d | ||
|
|
b310b04007 | ||
|
|
9eb85a5feb | ||
|
|
2acd173e14 | ||
|
|
dbb304f4cf | ||
|
|
1d77000c19 | ||
|
|
f874e21ad7 | ||
|
|
bbe6ed5319 | ||
|
|
ebea4d158d | ||
| 2f3a6773fc | |||
|
|
4e5df0e36d | ||
|
|
7fa5009674 | ||
|
|
c1bcc25b88 | ||
|
|
f56188c261 | ||
|
|
34f91f01c6 | ||
|
|
cfe65742a3 | ||
|
|
2c2b53303d | ||
|
|
03b6f7b87b | ||
|
|
164628282d | ||
|
|
007c92ee6a | ||
|
|
cf690bd390 | ||
|
|
1e9436519b | ||
|
|
0fa5f6a0dd | ||
|
|
cf524cb6b1 | ||
|
|
32617d5f2f | ||
|
|
ebfc1f2599 | ||
|
|
962c320adf | ||
|
|
af68ddebef | ||
|
|
9811c1fe4b | ||
|
|
2e950a059c | ||
|
|
a78f245ea6 | ||
|
|
dde66cadde | ||
|
|
4bbb80e31a | ||
|
|
058a73128c | ||
|
|
f92d53eaab | ||
|
|
9f7c26c60d | ||
|
|
83680c41db | ||
|
|
3b5f5ddaa6 | ||
|
|
192bb155fa | ||
|
|
f002c784c0 | ||
|
|
2314f988b1 | ||
| 66b79c994e | |||
|
|
cb3c8f1423 | ||
|
|
f362ee1e75 | ||
|
|
4d1cbf3d63 | ||
| bc64b8b358 | |||
| 5454877fb8 | |||
|
|
5506765db5 | ||
|
|
b7292a3c34 | ||
| a04d453e5c | |||
|
|
85fb231639 | ||
| 2c4e18be60 | |||
|
|
a543f9fd71 | ||
| 360777e7fe | |||
|
|
0d7e22b36d | ||
| 5eb43a35a2 | |||
|
|
edb033c63b | ||
| 68406d0eea | |||
|
|
f48a50fdd1 | ||
| a0d7f5cce3 | |||
|
|
4642c60f14 | ||
| f4e8213439 | |||
|
|
b88541158c | ||
| 2f363b5052 | |||
|
|
e942dd6f78 | ||
| 362c4d3443 | |||
|
|
a65182dccf | ||
| a7f4a35d80 | |||
|
|
992f290eb8 | ||
| d40ac8e65d | |||
|
|
c51f5a6b26 | ||
| 19eec97959 | |||
|
|
aa0b21a852 | ||
| 8ed19c16e2 | |||
|
|
56c8a3d5bd | ||
| 9aee97c0a0 | |||
|
|
0475897b69 | ||
| 78506469e5 | |||
|
|
1238850bc6 | ||
| fbdd45cbb7 | |||
|
|
eee39afdbe | ||
| 2263b3c536 | |||
|
|
4341b4a356 | ||
| d5097891f1 | |||
|
|
ce1767ef08 | ||
| bb962554ad | |||
|
|
5ebc1d4746 | ||
| 7adc63125e | |||
|
|
0cd6e233ba | ||
| c51ef20642 | |||
|
|
b2f4c8cb98 | ||
| ce8896844c | |||
|
|
63e2536023 | ||
| f6d057fe10 | |||
|
|
0480776e85 | ||
|
|
9ef61896d8 | ||
| ad06264e66 | |||
|
|
1689cc6ec0 | ||
| 5c950fc2bc | |||
|
|
1a7fbd83fa | ||
| 8a58d1a42e | |||
|
|
2edb2c86f2 | ||
| fb18924099 | |||
|
|
292d61b0d7 | ||
| ec1e51c683 | |||
|
|
69d1a91ede | ||
| d05c0ec590 | |||
|
|
a0b1d98c79 | ||
| 94868852a1 | |||
|
|
fa418945b7 | ||
| f67e35a88b | |||
|
|
50dab65dd9 | ||
| e054e7ec9a | |||
|
|
e8adbdbddc | ||
| eed21c4886 | |||
|
|
aea15ad169 | ||
| 530469ff69 | |||
|
|
9e590c14e3 | ||
| aa57a2c800 | |||
|
|
1d3447b5a3 | ||
|
|
58e7f28057 | ||
|
|
8fd733c54b | ||
|
|
4f7b4241a2 | ||
|
|
e51822133f | ||
|
|
2addfff228 | ||
| 5e43f7a361 | |||
|
|
c6406c74ec | ||
|
|
f76ff1eb69 | ||
|
|
db924fb01e | ||
|
|
7424e41827 | ||
|
|
e175a64036 | ||
|
|
a57da6b808 | ||
|
|
8edb8e87c8 | ||
|
|
bad635e117 | ||
|
|
1af5f6dc6d | ||
|
|
86f865afe0 | ||
|
|
3c1469b0a5 | ||
|
|
6aaab005c5 | ||
|
|
a3ca9401b4 | ||
|
|
e67d6756d1 | ||
|
|
7d167560af | ||
|
|
0876034adb | ||
|
|
99538c2414 | ||
|
|
acf88d7c00 | ||
|
|
0e39d4398c | ||
|
|
416da442c0 | ||
|
|
0d8bca92e2 | ||
|
|
49cd9ac36e | ||
|
|
fe3e8ee02c | ||
|
|
bd78ab3c28 | ||
|
|
f9ed3acf6d | ||
|
|
aba36e4abf | ||
| 52b3e1faba | |||
|
|
8ac3e7977f | ||
|
|
15c2d16bf9 | ||
|
|
afc84c2fd1 | ||
|
|
9613cdd184 | ||
|
|
a16edbc45c | ||
|
|
b477c4812d | ||
|
|
0f55f58652 | ||
|
|
09e740d6ea | ||
|
|
b446d3eee1 | ||
|
|
3d6a23411f | ||
|
|
794d5f5900 | ||
|
|
db4dbe0752 | ||
| eb876e21c3 | |||
| 011acf41c0 | |||
|
|
3ffa5604fc | ||
| adef45403b | |||
|
|
7546d47f77 | ||
|
|
82fdced180 | ||
| 23ba58bbf5 | |||
| fbf052bb27 | |||
|
|
2efe17bcb7 | ||
|
|
4612270f98 | ||
|
|
80129c5a21 | ||
|
|
4e646ee6e4 | ||
|
|
cde6651721 | ||
|
|
277e8d528b | ||
|
|
c816cfed58 | ||
|
|
4e8de3c554 | ||
|
|
75f9969860 | ||
|
|
5a80f5e606 | ||
|
|
8a9579c7a5 | ||
|
|
d274074f01 | ||
|
|
bc40034a08 | ||
|
|
f7303e6bd0 | ||
|
|
fd94c08cf4 | ||
|
|
6aa9709d98 | ||
|
|
5af59cbabe | ||
|
|
a1091bbfbb | ||
|
|
6c5874c5a5 | ||
|
|
c534a872a2 | ||
|
|
6490137812 | ||
|
|
e4589543fb | ||
|
|
991045b9ce | ||
|
|
62bdfb74e3 | ||
|
|
c00f81c0a3 | ||
|
|
5e5461e77e | ||
|
|
22bf99ccc4 | ||
|
|
ee2cb703c8 | ||
|
|
78444a1018 | ||
|
|
040beb0577 | ||
|
|
cfd0de9c11 | ||
|
|
114f06d825 | ||
|
|
4712f9f104 | ||
|
|
ebcda59e53 | ||
|
|
f446f6c2ee | ||
|
|
ffaeeda749 | ||
|
|
f7fcd43516 | ||
|
|
370fc7293a | ||
|
|
79c055f958 | ||
|
|
235098efb8 | ||
|
|
62b835ad76 | ||
|
|
4937d5f1ca | ||
|
|
1b0c52c8ca | ||
|
|
55f78bfb70 | ||
|
|
801d9655e5 | ||
|
|
94949fb46f | ||
|
|
6cfd73f480 | ||
|
|
61450cbd56 | ||
|
|
248704b262 | ||
|
|
603df58f97 | ||
|
|
407938bf3a | ||
|
|
c7a9d49cba | ||
|
|
2ddfab315c | ||
|
|
581c9cee08 | ||
|
|
838b6c5685 | ||
|
|
d8491f3176 | ||
|
|
eb3d5fa453 | ||
|
|
09fedb3fd5 | ||
|
|
70f2ef3f8e | ||
|
|
32f85f7a44 | ||
|
|
58c8e00745 | ||
|
|
6660311a96 | ||
|
|
2f7c0ec8e4 | ||
|
|
4086600b61 | ||
|
|
1c6e646f56 | ||
|
|
7697c419b4 | ||
|
|
206d0e598a | ||
|
|
e6df8e0989 | ||
|
|
964040b770 | ||
|
|
8b6587a0c6 | ||
|
|
9e01bb2136 | ||
|
|
90bd931808 | ||
|
|
9ef28d8536 | ||
|
|
e947e4eb58 | ||
|
|
8d00d99ca0 | ||
|
|
4435cf0020 | ||
|
|
e7fc806034 | ||
|
|
d5671bdba5 | ||
|
|
09530e5dc3 | ||
|
|
a83d1d7b4b | ||
|
|
37e5ff7757 | ||
|
|
5249a7b02c | ||
|
|
6a5ab57c18 | ||
| 182ae10080 | |||
|
|
d750096bef | ||
|
|
94ca233d97 | ||
|
|
e31e9eeaa1 | ||
|
|
4f33a20d17 | ||
|
|
7eb60b62b8 | ||
|
|
a3d5adb43c | ||
|
|
2ebe3035df | ||
|
|
84c806a4be | ||
|
|
af55af216a | ||
|
|
241ef52841 | ||
|
|
c3b3eb4c21 | ||
|
|
4519ddebeb | ||
|
|
b9f62ab14a | ||
|
|
b168784fa0 | ||
|
|
8961dd9fe7 | ||
|
|
7f1be814c8 | ||
|
|
90625d169a | ||
| 2e29f7f141 | |||
|
|
4e786fa63a | ||
|
|
a1330747e8 | ||
|
|
c311b5c002 | ||
| fdd0deb0e1 | |||
|
|
c1eb33347f | ||
|
|
e8ad37c7ea | ||
|
|
a129be22b8 | ||
|
|
f40db45009 | ||
|
|
f63ee9fb9b | ||
|
|
d5c24b99b8 | ||
|
|
0ecc515544 | ||
|
|
b43102342a | ||
|
|
bfa5cd9c13 | ||
|
|
e1366d78b1 | ||
|
|
b23ff41606 | ||
|
|
0105acb231 | ||
|
|
c0af9f67b5 | ||
|
|
b7836aeac6 | ||
|
|
dd216b6cad | ||
|
|
fd383c8047 | ||
|
|
6957aaf4d0 | ||
|
|
54eb6d39e4 | ||
|
|
bae7a5e433 | ||
|
|
602eabe668 | ||
|
|
c377d4bea7 | ||
|
|
d6c6f9f4f0 | ||
|
|
4d7e341e44 | ||
|
|
e1b5ae36bd | ||
|
|
b128399d1e | ||
|
|
cb4fc894d7 | ||
|
|
28179a3aaf | ||
|
|
0e465e63b9 | ||
|
|
61b0994631 | ||
|
|
242063e1d0 | ||
|
|
bc581fbdfb | ||
|
|
7dd3ddc06b | ||
|
|
a3a2dd0f70 | ||
|
|
b3b6a64ed7 | ||
|
|
a863b0a349 | ||
|
|
1ca90572f1 | ||
|
|
10c5bf666e | ||
|
|
06b62721b3 | ||
|
|
74a2d0944a | ||
|
|
435aa3d055 | ||
|
|
4f71bd295d | ||
|
|
f44e1d6a8d | ||
|
|
7c4f307db3 | ||
|
|
d65e851044 | ||
|
|
89ff5589c4 | ||
|
|
14f6f082ad | ||
| e5be728c1c | |||
|
|
36a71560c2 | ||
|
|
b0383f4aff | ||
|
|
4393a88fb6 | ||
|
|
7337ea4955 | ||
|
|
46298ddcb4 | ||
|
|
241d7e2ae6 | ||
|
|
f3078511a6 | ||
|
|
6aac9233db | ||
|
|
180f5c6a94 | ||
|
|
3d62f87e29 | ||
|
|
84cee1ab8d | ||
|
|
7ff9b9bc80 | ||
|
|
3799c34564 | ||
|
|
a2a32fea1a | ||
|
|
093461e816 | ||
|
|
deccdcc1d6 | ||
|
|
93d1e53c66 | ||
|
|
18657b6539 | ||
|
|
a30ff70b4e | ||
|
|
8cdc67a157 | ||
|
|
8c77252adf | ||
|
|
1327b62c8d | ||
|
|
1d0781bf12 | ||
|
|
cc290c50c6 | ||
|
|
c7b721f4f1 | ||
|
|
aacca61598 | ||
|
|
c3897d0add | ||
|
|
724dcda3ec | ||
|
|
2d7cf4b792 | ||
|
|
b2de5a9df9 | ||
|
|
1e56de02e5 | ||
|
|
10675bba3e | ||
|
|
6c4decd4e2 | ||
|
|
baad9c11df | ||
|
|
b9e494b85a | ||
|
|
b7804f450b | ||
|
|
e45de39998 | ||
|
|
76b466a38a | ||
|
|
48a191a126 | ||
|
|
2a0e176a77 | ||
|
|
de42e4af02 | ||
|
|
40a1f3edbc | ||
|
|
755d404edf | ||
|
|
faa50df05f | ||
|
|
78ea3ff584 | ||
| 7f0f0b30d3 | |||
|
|
46713482f4 | ||
|
|
829da5c127 | ||
|
|
8330471068 | ||
|
|
2b1d3c2399 | ||
|
|
1363e6e724 | ||
|
|
86943ca8a1 | ||
|
|
088b5b1785 | ||
| 1efa7076b0 | |||
|
|
e96235d0cf | ||
| 7eff89e9f9 | |||
|
|
8344fce994 | ||
|
|
d9e4155815 | ||
|
|
29e7d00050 | ||
|
|
31d8e46063 | ||
|
|
f9096d83ac | ||
| 85a4dd939f | |||
| 6f6dc835d2 | |||
| 808b456927 | |||
| aff42defda | |||
| 485f667141 | |||
| 1a6df71cec | |||
|
|
9e4b94f466 | ||
| 2c78a7400a | |||
| c016ea6f0a | |||
|
|
27e085ec36 | ||
|
|
e7874277ab | ||
|
|
7070fe1995 | ||
|
|
28430a9919 | ||
|
|
652a5de242 | ||
|
|
8814dd038e | ||
|
|
67c053e9c4 | ||
|
|
5c7f6e6211 | ||
|
|
b351e9b257 | ||
|
|
91fbbcab19 | ||
|
|
1f034f0f59 | ||
| f1bf4de452 | |||
| 7126a2f522 | |||
|
|
5a22a5d016 | ||
|
|
982a755eae | ||
|
|
5a7652ff86 | ||
|
|
bd0df9e3bc | ||
|
|
55bdee688f | ||
|
|
855c2033b5 | ||
|
|
de71a8ccb2 | ||
|
|
b6f07a1c41 | ||
|
|
c6c77726e7 | ||
|
|
8791ca6af3 | ||
|
|
ead7c6c887 | ||
|
|
83cc9783cc | ||
|
|
8afa9878fd | ||
|
|
f13de32208 | ||
|
|
d0a2106547 | ||
|
|
a18b991ca9 | ||
|
|
1e94d18db5 | ||
|
|
0cb34316cd | ||
|
|
b277944cf0 | ||
| b87af3b071 | |||
|
|
689dd61379 | ||
|
|
09bef7b0e1 | ||
|
|
2f86e31501 | ||
|
|
fbc8719fad | ||
|
|
77cd93ac2d | ||
|
|
38ec3bc574 | ||
|
|
dcb0e50f04 | ||
|
|
5cc8a3ec82 | ||
|
|
17d038830d | ||
|
|
51dbe9109f | ||
| 507e17fbf1 | |||
|
|
ff9e388910 | ||
|
|
bb317c1e76 | ||
|
|
c04e6d6f52 | ||
|
|
3537ad4059 | ||
|
|
33720af0c6 | ||
|
|
3ed5b87b8f | ||
|
|
4ad1cbeea3 | ||
|
|
066f486b28 | ||
|
|
ac9d336f40 | ||
|
|
05b5356acc | ||
|
|
bebf27e733 | ||
|
|
a4d86b96fd | ||
|
|
2c92befae1 | ||
|
|
506f340c7d | ||
|
|
276241b962 | ||
| 898c09c35e | |||
| b4c1b355bb | |||
| 9bfe6b7197 | |||
| 8c455f24bf | |||
| 37cb6bafa8 | |||
| 5fcc6d6286 | |||
| 1b478bbae6 | |||
| 57ce2d1f41 | |||
| 3d6258f63d | |||
| 64c3968a2e | |||
| 545b6e560a | |||
| 1a91a75b9c | |||
| a32337718d | |||
| d1ff23e004 | |||
| d2aac7a754 | |||
|
|
7e3d4c61b5 | ||
|
|
25245bc442 | ||
|
|
1a71c8c515 | ||
|
|
f572b72306 | ||
|
|
43022d8294 | ||
|
|
669ac3f7f2 | ||
|
|
9e49fc13f4 | ||
|
|
5b0d9bdeb0 | ||
|
|
abd340a8e4 | ||
|
|
b3552efc76 | ||
|
|
f7e8987929 | ||
|
|
61f777c9c6 | ||
|
|
bb527ac9ea | ||
|
|
db3933429a | ||
|
|
6885ffc9af | ||
|
|
f39ca6052e | ||
|
|
00b2e6a1db | ||
|
|
a1451aae51 | ||
|
|
54abfc2e8b | ||
|
|
0f87a75f4f | ||
|
|
6427994b14 | ||
|
|
ae549fc9da | ||
|
|
b580b34cbf | ||
|
|
7dfcae6067 | ||
|
|
11d6e177c0 | ||
|
|
7ed1483b89 | ||
|
|
ebd98bfc7b | ||
| 3c018bf7fd | |||
| d8362ef654 | |||
| 0ce9c008c5 | |||
| 880fff80e9 | |||
| 5d328c3b44 | |||
| ba20bc8b43 | |||
| 129c6369cf | |||
| 4a05e938ed | |||
| e4c6b241a9 | |||
| 9019710a1e | |||
| b1fab1cdac | |||
| 5dae23c0e7 | |||
| 0ca270172f | |||
| 23bced26da | |||
| baf04b7738 | |||
| 50219862e1 | |||
| a663a7dd30 | |||
| caea4e010f | |||
| 5fcba97a51 | |||
| 89eb45a13c | |||
| 759fdffda5 | |||
| 1f3821220e | |||
| 3a94412cd3 | |||
| 1d8a073c05 | |||
| 09dc46a984 | |||
| a51d4f7a45 | |||
|
|
094fe05bdd | ||
| 8cba145c90 | |||
| 6378d600c4 | |||
|
|
ada102dd98 | ||
| 135fb5b887 | |||
|
|
e063b066f0 | ||
| cc21bed0e4 | |||
|
|
693928d201 | ||
|
|
db01f88cc3 | ||
|
|
d19700e975 | ||
| d1a2a1a333 | |||
| ca97964701 | |||
|
|
a9fb34eb93 | ||
|
|
83a55f65a4 | ||
|
|
426d2afe28 | ||
|
|
1f17bdb4ff | ||
|
|
6227e63cc5 | ||
|
|
5ac38c95cc | ||
| f817bfe3c6 | |||
|
|
76f3aa4766 | ||
|
|
a4c86e1e12 | ||
|
|
8797e3347f | ||
|
|
abf79de785 | ||
|
|
44cf7988c0 | ||
|
|
2e29cbf598 | ||
|
|
0e06a88fdd | ||
|
|
cac4fb0318 | ||
|
|
2a47623283 | ||
|
|
a6fb0beaa9 | ||
|
|
1d64c51b7e | ||
|
|
49771b4d7f | ||
|
|
92a0621e59 | ||
|
|
dc75746842 | ||
|
|
49fff2d9b4 | ||
|
|
4ac88e4df8 | ||
|
|
b5d98da6fc | ||
|
|
ae07ced795 | ||
|
|
cb818ca832 | ||
|
|
61bab8e62e | ||
|
|
1c45a261c4 | ||
|
|
b3b8b5ca71 | ||
|
|
01941c027b | ||
|
|
01e260b276 | ||
|
|
9e34da44c3 | ||
|
|
d0a25ca9ac | ||
|
|
4ee6754ccd | ||
|
|
181ecf4a9b | ||
|
|
a53a26be70 | ||
|
|
826837186c | ||
|
|
6544bf52fb | ||
|
|
aae0ce6bad | ||
|
|
a8dfba235c | ||
|
|
78c1448764 | ||
|
|
fa7e35ab4a | ||
|
|
c49d2ea278 | ||
|
|
c0ba2a839f | ||
|
|
2900d92235 | ||
|
|
08f369ea96 | ||
|
|
e99cf6e441 | ||
|
|
7e69d30c02 | ||
|
|
9761672d42 | ||
|
|
c248730bd1 | ||
|
|
46af4bdd0e | ||
|
|
e6f11947cb | ||
|
|
8fffbaf103 | ||
|
|
47a5d83267 | ||
|
|
9845a064ad | ||
| ffe73a4c3f | |||
|
|
aa10e5c334 | ||
|
|
80b08bfaec | ||
|
|
2f764ded63 | ||
|
|
5703d1d73f | ||
|
|
a89928c13c | ||
|
|
77562a2acd | ||
|
|
75b7f583d2 | ||
|
|
1071924701 | ||
|
|
317b96e93a | ||
|
|
764e65fb11 | ||
|
|
8f0147cf00 | ||
|
|
4c4f81f8f2 | ||
|
|
8b5fd95897 | ||
|
|
8fe512c7e9 | ||
|
|
4b063aeb29 | ||
|
|
f47b964c5f | ||
|
|
cbe9512691 | ||
|
|
7959544322 | ||
|
|
c69f7f8657 | ||
|
|
e8db880e7f | ||
|
|
34ea140783 | ||
|
|
c91d364a58 | ||
|
|
3c767cc5e1 | ||
|
|
56ef51d392 | ||
|
|
065441e58c | ||
|
|
1902579b46 | ||
|
|
786e79ebc9 | ||
|
|
e8cffcf978 | ||
|
|
81139aec23 | ||
|
|
7bfc8b437b | ||
|
|
13022be299 | ||
|
|
7cfa8e1a68 | ||
|
|
e2be069686 | ||
|
|
54e8c63b4f | ||
|
|
a4a458943d | ||
|
|
798118b74f | ||
|
|
e4c4a4a3de | ||
|
|
b043384949 | ||
|
|
eeca3b10c9 | ||
|
|
7995bcac40 | ||
|
|
7fa38e8725 | ||
|
|
08ea95b22c | ||
|
|
5e1b6b11e6 | ||
|
|
d8769e32e1 | ||
|
|
14a1e5756e | ||
|
|
2ae9edcbff | ||
|
|
348df4be2b | ||
|
|
c4db8b87e2 | ||
|
|
a870908718 | ||
|
|
aec3b2419b | ||
|
|
3959548054 | ||
|
|
4d2e986b9b | ||
|
|
e2785f9c5f | ||
|
|
ff67571e9a | ||
|
|
9e0c00dfd4 | ||
|
|
7bba79363a | ||
|
|
8a5d3cd6c4 | ||
|
|
18c12e7822 | ||
|
|
b1d83c3f5e | ||
|
|
3551b769a2 | ||
|
|
6b7acc65b6 | ||
|
|
59eb35da30 | ||
|
|
62ba45e9fa | ||
|
|
ea0ce39962 | ||
|
|
5e1e4d32db | ||
|
|
5e559be9b5 | ||
|
|
5c36c73a3d | ||
|
|
f414f2b588 | ||
|
|
385ea9d61d | ||
|
|
c961ed9025 | ||
|
|
8ed4deee9d | ||
|
|
a8ed6d993c | ||
|
|
653b7619ec | ||
|
|
a56170d7f8 | ||
|
|
c0c4c4403a | ||
|
|
29ce756709 | ||
|
|
a79ac35173 | ||
|
|
68195a8dfe | ||
|
|
39a19d54c2 | ||
|
|
5f7e51756f | ||
|
|
d76b76cb1d | ||
|
|
fa95c1d09f | ||
|
|
c62b724b24 | ||
|
|
7e56f6eac2 | ||
| 9d2270a979 | |||
|
|
2623022c84 | ||
|
|
98f5cf25a5 | ||
|
|
d9e491a9e8 | ||
|
|
284073584a | ||
|
|
9be2ab6008 | ||
|
|
5dc3a8960b | ||
|
|
e027aaf433 | ||
|
|
25188f53a7 | ||
|
|
7332adfa21 | ||
| 310f2ccdf4 | |||
|
|
679314a22e | ||
|
|
4603c6ddd7 | ||
| 38a718ff55 | |||
| aaf07ce72f | |||
|
|
6db11cf68b | ||
|
|
9453e10c57 | ||
|
|
612ba2f45d | ||
|
|
d9e68156b2 | ||
|
|
4297ae2d0b | ||
| 96f2288b84 | |||
| d6342af980 | |||
| aa54a7e76e | |||
| 69aa010cfc | |||
| 772ac705d3 | |||
|
|
24d1fd2bf1 | ||
|
|
d41ef45a9b | ||
|
|
cbc0e0344d | ||
|
|
07549b7fd9 | ||
|
|
c8d9edd939 | ||
|
|
2317fb5873 | ||
|
|
bb3ed3a827 | ||
|
|
8ae103e07c | ||
|
|
8a93a81a26 | ||
|
|
5dbdf72472 | ||
|
|
f884c2b9b6 | ||
|
|
6f153804da | ||
|
|
76ca13b6ed | ||
|
|
7100d5e485 | ||
|
|
df5be65423 | ||
|
|
9fa270e330 | ||
|
|
c9aa50817c | ||
|
|
4fba4eb133 | ||
|
|
48b5f2a384 | ||
|
|
affd3fcc2a | ||
|
|
00d5f63e7c | ||
|
|
ed5cdd7e09 | ||
|
|
418333979a | ||
|
|
6f60afe8c5 | ||
|
|
3a5f79acef | ||
|
|
85f44e20cb | ||
|
|
137d5c34fa | ||
|
|
7907ef5979 | ||
|
|
ef7370d023 | ||
|
|
0f64663c40 | ||
|
|
18442c5b00 | ||
|
|
dd21ec048a | ||
|
|
0155fab356 | ||
|
|
bb167f04fa | ||
|
|
ead32ea6e6 | ||
|
|
197dc344af | ||
|
|
f81e2c0487 | ||
|
|
7ff336fbc5 | ||
|
|
127e531271 | ||
|
|
be7def128a | ||
|
|
53b1544f41 | ||
|
|
2a082baa63 | ||
|
|
38064750f9 | ||
|
|
2b161d37df | ||
|
|
b967a2071f | ||
|
|
50b451ae0c | ||
|
|
d988af02d1 | ||
|
|
6363b5ad06 | ||
| 03a2b2faf1 | |||
| ef195d6e1b | |||
|
|
df88939128 | ||
|
|
eebe769973 | ||
| 491a31a731 | |||
| 66aa0dec60 | |||
| e128d770f1 | |||
| eab9b670d8 | |||
| 473e9c5ffb | |||
| 32647cd9b4 | |||
| acd7b8932f | |||
|
|
40bc05ee1e | ||
|
|
3a7a5ba686 | ||
|
|
83d5da95b7 | ||
|
|
125409fe95 | ||
|
|
fec84054d9 | ||
|
|
fdcdc1320b | ||
|
|
7198056bc3 | ||
|
|
03dfd28121 | ||
|
|
127e6fa27e | ||
|
|
b492ea69cb | ||
|
|
210c3274e5 | ||
|
|
817b5be320 | ||
|
|
4fa90261a3 | ||
|
|
e81930fb9e | ||
|
|
409a4a9490 | ||
|
|
b4e1955526 | ||
|
|
4aec5d1e83 | ||
| da31acfcc4 | |||
|
|
e98991fd7e | ||
|
|
55e13715a9 | ||
|
|
6468ca04a4 | ||
|
|
3178462218 | ||
|
|
2fea811c30 | ||
|
|
17458ad81a | ||
|
|
274cb597b0 | ||
|
|
c0bfa11766 | ||
|
|
2e370008c3 | ||
|
|
eb71bfe9d3 | ||
|
|
402262a843 | ||
|
|
ba0c14f9dd | ||
| 74bf17bb0d | |||
|
|
898f67ac2e | ||
|
|
7528814617 | ||
| 862830da32 | |||
| 511c180869 | |||
|
|
dc64857a7d | ||
|
|
e30b1d3121 | ||
|
|
5bb23536b7 | ||
|
|
8435935429 | ||
|
|
6bb1649b4b | ||
|
|
611ef27ac2 | ||
|
|
b6206406de | ||
|
|
ce9a7d7e2a | ||
|
|
98a03fc935 | ||
|
|
29e44721d2 | ||
|
|
0af00cf914 | ||
|
|
3f26a0b06b | ||
|
|
c24a4f7d66 | ||
|
|
1b8a4791f5 | ||
|
|
eef742bf45 | ||
|
|
1e6c08fc30 | ||
|
|
0c2894c725 | ||
|
|
527eb2444c | ||
|
|
75aea6b1ca | ||
|
|
6d4ffc69fd | ||
|
|
39cfe32c34 | ||
|
|
645df931ae | ||
| fa3b9eba92 | |||
| 4c710cf13b | |||
| 50438b51aa | |||
| 41e71485af | |||
|
|
09a3153bf4 | ||
|
|
6375d8699e | ||
|
|
1b33cd11fc | ||
|
|
aadb0bfc1e | ||
|
|
3dc98a7a79 | ||
|
|
86fd93bd03 | ||
|
|
86e9fd170a | ||
|
|
415cb351c7 | ||
|
|
7037ebe0ec | ||
| f20255813f | |||
|
|
09ab24b967 | ||
|
|
28c7a1e9c3 | ||
|
|
876c646d09 | ||
|
|
90c67673ad | ||
|
|
d41cf2e926 | ||
|
|
dcc8abf74e | ||
|
|
96db16a7a2 | ||
|
|
bd9572c8a4 | ||
|
|
f63b2c0d0c | ||
|
|
9e6a9e46da | ||
|
|
e9ade63ae0 | ||
|
|
9cf46ec947 | ||
|
|
23d6a3dc1f | ||
|
|
e31ac710be | ||
|
|
39ec5d0e51 | ||
|
|
675930083d | ||
|
|
634d246910 | ||
|
|
0afb8991fa | ||
|
|
e8f7141564 | ||
|
|
1e7ec1b952 | ||
|
|
a5b7a128aa | ||
|
|
feac87901a | ||
|
|
aa0cf38084 | ||
|
|
4552aff125 | ||
|
|
1ed5afeaec | ||
|
|
4615d172c7 | ||
|
|
fba0b302ff | ||
|
|
63bcd52a5a | ||
|
|
1f148242db | ||
|
|
24405cabaf | ||
|
|
490a808bf6 | ||
|
|
f0e5341b0f | ||
|
|
d388899985 | ||
|
|
84ad3d8393 | ||
|
|
6f06f92bb1 | ||
|
|
2b79d8ffe9 | ||
|
|
2063867899 | ||
|
|
850e655a4c | ||
|
|
52d96ca151 | ||
|
|
aca53aa1a2 | ||
|
|
93760042fa | ||
|
|
77ad9aff3c | ||
|
|
e0753c4ad2 | ||
|
|
d13f04f953 | ||
|
|
c592bd612a | ||
|
|
e0b8529d8d | ||
|
|
33774e790c | ||
|
|
cabc30e9a5 | ||
|
|
dc97b0d844 | ||
|
|
e97b0cfc61 | ||
|
|
a0760206c6 | ||
|
|
bfadcdb099 | ||
|
|
b02937d1a7 | ||
|
|
a65ca3ab19 | ||
|
|
4de2a1eb62 | ||
|
|
01fb668904 | ||
|
|
afc1c88046 | ||
|
|
fd2982f5c9 | ||
|
|
e00b3269fe | ||
|
|
6d91ed2156 | ||
|
|
b248486c3b | ||
|
|
dd57d83926 | ||
|
|
b7bb85a4da | ||
|
|
7831c475b9 | ||
|
|
a7aa74efa3 | ||
|
|
35abc48a65 | ||
|
|
cde9b63eab | ||
|
|
01507a91db | ||
|
|
8e8eb07791 | ||
|
|
4bc093675c | ||
|
|
42ceb97f2c | ||
|
|
bfca65d86f | ||
|
|
d0870ce484 | ||
|
|
07708f1518 | ||
|
|
fb8fbbf42e | ||
|
|
36e6cc8feb | ||
|
|
a4d197a6ef | ||
|
|
c57ccd5eb4 | ||
|
|
f73b58a2c6 | ||
|
|
2e029d55fc | ||
|
|
f3e4fbd7ba | ||
|
|
a87dee2f66 | ||
|
|
1f44029c56 | ||
|
|
842fe54c83 | ||
|
|
8364c60eb2 | ||
|
|
c4436910c3 | ||
|
|
80ba4c8661 | ||
|
|
a0ba501849 | ||
|
|
3f700e7e68 | ||
|
|
b4c60c3355 | ||
|
|
a8f5fcc400 | ||
|
|
baf8d9ef5f | ||
|
|
ea7f80e8a7 | ||
|
|
8f9ff3d49c | ||
|
|
e15982993a | ||
|
|
3bf4b42e2e | ||
|
|
0a54f88751 | ||
|
|
7bdc8b36a6 | ||
|
|
ffd15c29dc | ||
|
|
b91c4e66cb | ||
|
|
723a64cbda | ||
|
|
84fa0c187e | ||
|
|
db8365c79e | ||
|
|
f101ff60c5 | ||
|
|
c631b4d60e | ||
|
|
b93d6e861b | ||
|
|
2b8f9b2617 | ||
|
|
51004f8336 | ||
|
|
5c6d94d3e5 | ||
|
|
71672fd244 | ||
|
|
b245f9ca5b | ||
|
|
005c4caf8c | ||
|
|
cbd519bfa6 | ||
|
|
857d8ab40a | ||
|
|
76d8e5b399 | ||
|
|
41b5f73785 | ||
|
|
789e311b63 | ||
|
|
d93d491a61 | ||
|
|
3c50098dfc | ||
|
|
848577e830 | ||
|
|
aee26b1c79 | ||
|
|
4122f85888 | ||
|
|
a20490c0b3 | ||
|
|
383854ac50 | ||
|
|
08cf152aa8 | ||
|
|
698ad745f6 | ||
|
|
a63f49cb83 | ||
|
|
09a9e365dd | ||
|
|
acef93a253 | ||
|
|
a9b34f45dc | ||
|
|
53f7e2be4f | ||
|
|
72a1bdab30 | ||
|
|
cdd1622350 | ||
|
|
e28d244a0d | ||
|
|
9e34483419 | ||
|
|
f3188669e4 | ||
|
|
788464a594 | ||
|
|
06b43069a1 | ||
|
|
cedf6489f7 | ||
|
|
b6da2fa173 | ||
|
|
433671f5eb | ||
|
|
280e20adbe | ||
|
|
e13642351c | ||
|
|
7fe959ab39 | ||
|
|
4ba050d46d | ||
|
|
5164719e67 | ||
|
|
65045eb3bc | ||
|
|
57b566e736 | ||
|
|
c10479f2bb | ||
|
|
6f73126756 | ||
|
|
04f93c8273 | ||
|
|
c1fded5062 | ||
|
|
3ce6fc89a4 | ||
|
|
66ca659709 | ||
|
|
8347f2b5c3 | ||
|
|
a4ebd2f7c1 | ||
|
|
0bcfabbc87 | ||
|
|
7fd30e7d20 | ||
|
|
67440acd3e | ||
|
|
391ca918b1 | ||
|
|
5a29b222eb | ||
|
|
97de075f12 | ||
|
|
64cafe82bc | ||
|
|
6804b2a7fd | ||
|
|
33dcdd7c03 | ||
|
|
d99c2ffe4f | ||
|
|
3aed0a1fd7 | ||
|
|
dc964b346c | ||
|
|
19f1234997 | ||
|
|
be4e681d07 | ||
|
|
fa11912b9b | ||
|
|
61944ef08e | ||
|
|
8258cb851e | ||
|
|
4abd5f1f7b | ||
|
|
cabc3aa90e | ||
|
|
41aefc819b | ||
|
|
19553b8f7c | ||
|
|
c1cf80180d | ||
|
|
ab031bc25f | ||
|
|
f38e12f0ab | ||
|
|
a10e5d1da2 | ||
|
|
7085d91278 | ||
|
|
b4dcecb266 | ||
|
|
d8016bd52b | ||
|
|
d378bebaa3 | ||
|
|
3b95d7c16a | ||
|
|
89829aea85 | ||
|
|
b6358182d3 | ||
|
|
ba47aa25a1 | ||
|
|
55eb1730b8 | ||
|
|
2cc20e8816 | ||
|
|
d22e95eeda | ||
|
|
298bca3fdd | ||
|
|
87f73e2729 | ||
|
|
27c36eea2b | ||
|
|
5d24ade5c9 | ||
|
|
0b761f60ea | ||
|
|
1a25d3ca83 | ||
|
|
710c1985ba | ||
|
|
d655c785b6 | ||
|
|
898f4e1f72 | ||
|
|
100409961a | ||
|
|
b9bed98538 | ||
|
|
8a9c3097e3 | ||
|
|
947c2243bd | ||
|
|
5b6b4eb326 | ||
|
|
7d4f9fc99f | ||
|
|
ac55143c64 | ||
|
|
3c86005546 | ||
|
|
ab9483b7fb | ||
| 03cdc5ef76 | |||
|
|
84b055362f | ||
|
|
df5e58fc6e | ||
|
|
5e789b3850 | ||
|
|
f6a635b102 | ||
|
|
eb0ef3726f | ||
|
|
b36b2493bc | ||
|
|
e21580b67f | ||
|
|
7c11a5ad6d | ||
| c8f969feb5 | |||
|
|
f2dfcee042 | ||
| cb6193bbc7 | |||
| 0b7551f4c7 | |||
| eee9159a91 | |||
| b5b7b6fd0f | |||
| f13f9c7f30 | |||
| 9673ea4a50 | |||
| d9e0742a07 | |||
| a43a19728c | |||
| ebf0fe0a8c | |||
|
|
c2fd30364e | ||
|
|
39971794dd | ||
|
|
81c3bc411f | ||
|
|
b5b94b72c1 | ||
|
|
70932cab42 | ||
|
|
ad6e8ea6f7 | ||
|
|
2afca4e942 | ||
|
|
6f13979c9b | ||
|
|
68f9aee992 | ||
|
|
d8bc57c1dc | ||
|
|
1831f5164c | ||
|
|
fe70072d68 | ||
|
|
4675783545 | ||
|
|
41a85b71fc | ||
|
|
e9f9cee4d6 | ||
|
|
b3c09e1bc0 | ||
|
|
36792926d2 | ||
|
|
154124f369 | ||
|
|
2614671af1 | ||
|
|
203403c5d0 | ||
|
|
b326ee0a3d | ||
|
|
085242bf5c | ||
|
|
87344ff53a | ||
|
|
f99157b811 | ||
|
|
ed2d94cae9 | ||
|
|
4923caf85e | ||
|
|
e1840f6abc | ||
|
|
b66abd47b8 | ||
|
|
1daac3a5f4 | ||
| b4ddee2bb6 | |||
| 982c63a717 | |||
|
|
97420994e8 | ||
|
|
1c39606345 | ||
|
|
834259a2cf | ||
|
|
9d5742ebd1 | ||
|
|
9f4ea2122a | ||
|
|
7d8dac9211 | ||
|
|
3f43155b63 | ||
|
|
85c731734a | ||
|
|
69785cccfe | ||
|
|
d11a112389 | ||
|
|
cc77e86408 | ||
|
|
cc03d68984 | ||
|
|
b61014a7b8 | ||
|
|
86d454adf3 | ||
| 449dbea456 | |||
| e6869c8983 | |||
|
|
8b61333937 | ||
|
|
765a54afb5 | ||
|
|
4bf10a75c7 | ||
|
|
f496b6cdc8 | ||
|
|
c1ed78de79 | ||
|
|
85dc4089b9 | ||
|
|
d6e657b593 | ||
|
|
eb481c9247 | ||
|
|
1070f2c853 | ||
|
|
05093f7f54 | ||
|
|
7775513a5b | ||
|
|
b5df5ce1ce | ||
|
|
1d2e262a59 | ||
|
|
ed811fb9c0 | ||
|
|
5aae8df5d7 | ||
|
|
c0dacba80f | ||
|
|
5b1139db3e | ||
|
|
50e718be99 | ||
|
|
18957786f2 | ||
|
|
c735289ddf | ||
|
|
0367ba7495 | ||
|
|
2a75196aa3 | ||
|
|
4ad004f24e | ||
|
|
de2379bc30 | ||
|
|
2eb26a6d0b | ||
|
|
cd842d363a | ||
|
|
402f6f66bd | ||
|
|
9e7f8743c2 | ||
|
|
dd4b0f6e9c | ||
|
|
73e076a40c | ||
|
|
346ce3b73b | ||
|
|
6ea1785457 | ||
|
|
6ea8d8a6c2 | ||
|
|
8708d3dc45 | ||
|
|
1544d60000 | ||
|
|
1229de4499 | ||
|
|
360c876be4 | ||
|
|
357506dd9a | ||
|
|
2cb8f7b2df | ||
|
|
9c167af17a | ||
|
|
189f2d5f07 | ||
|
|
4ec588bb37 | ||
|
|
e509115630 | ||
|
|
d7c6d9cabd | ||
| 1c6efb9e66 | |||
|
|
10eed78dd8 | ||
| f1c2dee1c0 | |||
|
|
b74e78d2c0 | ||
|
|
270f0dfc7c | ||
|
|
ae22305869 | ||
|
|
a10cd8580c | ||
|
|
a9633a3c94 | ||
|
|
1caf6bd8d3 | ||
|
|
e1c1e32ceb | ||
|
|
4e040b0152 | ||
|
|
34c9e00f08 | ||
|
|
28c1e4f48e | ||
|
|
7a94940c89 | ||
|
|
d4492aaed0 | ||
|
|
d222c64538 | ||
|
|
90613aa5fb | ||
|
|
b0f08ba465 | ||
| b3fb024301 | |||
|
|
3d5528b88f | ||
| 6735283d8f | |||
| 5baaac55ce | |||
|
|
22644d33c9 | ||
|
|
c4a64ae7a0 | ||
|
|
11a8fc726d | ||
|
|
5531253c76 | ||
|
|
8d629a957d | ||
|
|
817c4af60c | ||
|
|
cc7b57c8d4 | ||
|
|
866ac13405 | ||
|
|
19803c664f | ||
|
|
d645ea222d | ||
|
|
6ab75fe8c5 | ||
|
|
ff6d9d8a52 | ||
|
|
5b127bd78c | ||
|
|
b778aee21d | ||
|
|
0bbeae1786 | ||
|
|
0068bafbb6 | ||
|
|
13e0cba6f1 | ||
| dd6010a17e | |||
|
|
fff5f8eb65 | ||
|
|
7198cc8ed6 | ||
| b1b4a9e842 | |||
| dc729718eb | |||
|
|
59ded1131f | ||
|
|
390337b9a5 | ||
|
|
f355642eab | ||
|
|
53238ad9b2 | ||
|
|
d0fab1c728 | ||
|
|
36088becc9 | ||
|
|
3ad3d49959 | ||
|
|
d2b2cf0add | ||
|
|
82fb761c0f | ||
|
|
776c9b011c | ||
|
|
f6ec1ea172 | ||
|
|
6afb8dadbc | ||
|
|
fc5f776429 | ||
|
|
242d572470 | ||
| bd8650d35b | |||
|
|
767ce1cdf8 | ||
|
|
ccf158b030 | ||
|
|
fdddb54db4 | ||
| ec22520992 | |||
|
|
4e1996856f | ||
|
|
12193913a8 | ||
|
|
8129a8503a | ||
|
|
ca5b2770cf | ||
|
|
32b82032a1 | ||
|
|
64556e017d | ||
|
|
1bc9279ba0 | ||
|
|
c7d68fc3bc | ||
|
|
775adaec97 | ||
|
|
f0d34da556 | ||
|
|
3f9ebd2fed | ||
|
|
28b1d718a3 | ||
|
|
0223589e6c | ||
|
|
e1d026f815 | ||
|
|
264abd4741 | ||
|
|
385ed1154f | ||
|
|
e9dbc34d80 | ||
|
|
5b9209aa02 | ||
|
|
01d49eb0a7 | ||
|
|
023d64fe4a | ||
|
|
f1a9039632 | ||
|
|
cfd71d9023 | ||
|
|
adff14c5bc | ||
|
|
6205b55b19 | ||
|
|
62c4028cde | ||
|
|
7387f60920 | ||
|
|
d38a0007f1 | ||
|
|
3492ba33d5 | ||
| 97bb46c047 | |||
| 5aa3e3eabb | |||
|
|
9ba40de538 | ||
|
|
b49ecc52b9 | ||
|
|
b06057395b | ||
| 00628a7ddd | |||
| 02154caf24 | |||
|
|
21cbd5ce96 | ||
|
|
09d4fe0324 | ||
|
|
e6fd513cfa | ||
|
|
f60b6481e0 | ||
|
|
b859e2b710 | ||
|
|
5fc20145d1 | ||
|
|
663f61cbf3 | ||
|
|
f08c7d470d | ||
|
|
773e1316d2 | ||
|
|
f90fa5ea5f | ||
|
|
00538bd181 | ||
|
|
cca5260612 | ||
|
|
a93475707e | ||
|
|
00c226738d | ||
|
|
8d2a3e94d7 | ||
|
|
cc3ef2d5e6 | ||
|
|
5f0af77880 | ||
|
|
d31a387ace | ||
|
|
516d930e6c | ||
| 4700f7cf23 | |||
| 51af8aadb7 | |||
|
|
16688180c6 | ||
|
|
5c42ae1e13 | ||
|
|
902e242237 | ||
|
|
5b70fa0a64 | ||
|
|
3a5de7effd | ||
|
|
8e38ca1911 | ||
|
|
a3559f14e7 | ||
|
|
b90c39456b | ||
|
|
d1f045880d | ||
|
|
25df6e613a | ||
|
|
dad2663337 | ||
|
|
f2b1aeeed1 | ||
|
|
561fdfb279 | ||
|
|
7571f9790b | ||
|
|
d267dac4ac | ||
|
|
e9cb47ffbd | ||
|
|
ba19cd9ecb | ||
|
|
c7a2228b1b | ||
|
|
7b1ad3ee65 | ||
|
|
f136ef2b91 | ||
|
|
1108e8f2cc | ||
|
|
4bfb255a1c | ||
|
|
409b5ffe9e | ||
|
|
be644228a2 | ||
| 6a8efa6ef1 | |||
|
|
554373fdd9 | ||
| 8137ac4c49 | |||
|
|
a7f8a0afd7 | ||
|
|
894cad2e17 | ||
|
|
ebc21144b8 | ||
|
|
20f7fbc6f5 | ||
|
|
2cb04737f1 | ||
|
|
a46adb6175 | ||
|
|
81581b345c | ||
| 201f4648c4 | |||
|
|
03ea9ff66e | ||
| a63da7a6c0 | |||
|
|
822828b9a4 | ||
|
|
ef2a8906dd | ||
|
|
83d1aac671 | ||
|
|
2abccc1745 | ||
|
|
89ed64157d | ||
|
|
87dc9bee8b | ||
|
|
6f6d6c01ab | ||
|
|
8384e4676b | ||
|
|
cca42e94d7 | ||
|
|
b26f8a7815 | ||
| 91a1706160 | |||
| bf9b7e7ece | |||
| a854a76819 | |||
|
|
d8e66a5f32 | ||
|
|
7f7105d36d | ||
|
|
dc8dd6df20 | ||
|
|
15072c69c9 | ||
|
|
cc31f2d10f | ||
|
|
72ad2e9259 | ||
|
|
32744a04e1 | ||
|
|
1c466f460a | ||
|
|
3992a870e5 | ||
|
|
4bee6536c9 | ||
|
|
b484c89b73 | ||
|
|
6c3d555b87 | ||
|
|
51ba0ed250 | ||
|
|
99c02b5afb | ||
|
|
e4fb414b91 | ||
|
|
9a3d45e7d0 | ||
|
|
ab3762d8f5 | ||
|
|
10183d5924 | ||
|
|
7e0719117b | ||
|
|
2be18a7b53 | ||
|
|
842f8b2d3d | ||
|
|
ef2ef7a6b8 | ||
|
|
bcd03ed7ee | ||
|
|
e11fabd5e0 | ||
|
|
1b3028bed1 | ||
|
|
f1404638f6 | ||
|
|
7889b999cc | ||
|
|
767d47dd60 | ||
|
|
1cf0ce094a | ||
|
|
63046d800d | ||
|
|
9339903a30 | ||
|
|
887f64eed8 | ||
|
|
bf8796bca4 | ||
|
|
d44a758a2d | ||
|
|
39f3063ed4 | ||
|
|
885a1415d0 | ||
|
|
1244125bdc | ||
| 1cdac3f16a | |||
|
|
dde7c5e145 | ||
|
|
bf4138b0e4 | ||
|
|
1e95466bac | ||
|
|
fd03fd5e4f | ||
| 8c841af946 | |||
|
|
8176325130 | ||
|
|
70d899d354 | ||
|
|
b220befef8 | ||
|
|
ae64a669dd | ||
|
|
0da5dceccf | ||
|
|
a273a7c55e | ||
|
|
006d85d5c2 | ||
|
|
d67a9a8271 | ||
|
|
ce8d400819 | ||
|
|
e5adf3c43f | ||
|
|
1e11f2708b | ||
|
|
73b6e5d8e6 | ||
|
|
d9ca4c9a60 | ||
|
|
c6221c5956 | ||
|
|
68ae47907c | ||
|
|
0326c98fd5 | ||
|
|
222dd29a14 | ||
|
|
013c840862 | ||
| 6305d48947 | |||
| f4a5c17b5e | |||
| b22fbcd77d | |||
|
|
024ba978ec | ||
|
|
30aba46735 | ||
|
|
33233934e9 | ||
|
|
0e2a03e3bd | ||
| a08d9e6d8e | |||
| a484a93b29 | |||
|
|
e328e9c106 | ||
|
|
387ab6c87e | ||
|
|
dda9ea09b1 | ||
|
|
8497ea8aab | ||
|
|
dbc28e35c5 | ||
|
|
0712c95225 | ||
|
|
60f399395a | ||
|
|
19ac8aea8c | ||
|
|
2379cd9ef4 | ||
|
|
b0a5e81c46 | ||
|
|
00e953e86c | ||
| 13620cc4db | |||
|
|
dd7ac68fb0 | ||
| 1905d0746d | |||
|
|
f5e913101c | ||
|
|
fe05be86e5 | ||
|
|
da0ea979ff | ||
|
|
dd4d3a662d | ||
|
|
252da17bc9 | ||
|
|
559ce6a949 | ||
|
|
d628d2a261 | ||
| d5eca87ca2 | |||
| c38a2ac334 | |||
|
|
e8a54eacaa | ||
|
|
840f88b8f0 | ||
|
|
6c8503b3c6 | ||
|
|
2a01f0806e | ||
|
|
0ae08e275d | ||
|
|
f6d0e912c9 | ||
|
|
2dcfc9d411 | ||
|
|
a0721fc94a | ||
|
|
40434d6919 | ||
|
|
9b43d5ced4 | ||
| 60f489d36a | |||
| 49a547eed8 | |||
|
|
12f64c7c16 | ||
|
|
d50f93058d | ||
|
|
c53496a55e | ||
|
|
ab74f45bfb | ||
|
|
f3f2c7f5de | ||
|
|
e30dde0afc | ||
|
|
17c8356b8c | ||
|
|
19dc219ff7 | ||
| e2f319fc6b | |||
|
|
3de1b9edbe | ||
| feb8eb935b | |||
| 238e121236 | |||
|
|
e6b45656f9 | ||
|
|
012b3bdf18 | ||
|
|
45a6b03d40 | ||
|
|
15886b1505 | ||
|
|
fce81e6868 | ||
|
|
e1a904f74a | ||
|
|
dd30a7fe88 | ||
| 1a0dcb5caa | |||
|
|
0d267eaee1 | ||
|
|
659dcce635 | ||
|
|
a4bbf35092 | ||
|
|
12737e2821 | ||
| 879e1041c9 | |||
| e06a3bbceb | |||
| 002f5c0f1c | |||
| 899202aca7 | |||
|
|
5a49e58fb4 | ||
| 95d9c49e43 | |||
| d843156a5e | |||
|
|
83ecb1b65e | ||
|
|
ae52ec7c85 | ||
|
|
d089f16656 | ||
|
|
dd6dfeb30a | ||
|
|
778a7a73e5 | ||
|
|
b32a9192df | ||
| d9c808d938 | |||
|
|
a9624fff25 | ||
|
|
cc008598d0 | ||
|
|
56720eae0a | ||
|
|
0b0aa5c5cf | ||
|
|
f7426e0e61 | ||
|
|
3fc58cee38 | ||
|
|
84e1d7f304 | ||
|
|
d32dc814d3 | ||
|
|
e560b419f8 | ||
|
|
97d90c6039 | ||
|
|
5b412362c5 | ||
|
|
e77046d49b | ||
|
|
2647ea0754 | ||
|
|
8d7c58f82e | ||
|
|
58ad38a88e | ||
| 82f55dc046 | |||
| 3ed6de7baf | |||
| 2e4a6b94e7 | |||
| e188ae8b23 | |||
| 8f24ea48fb | |||
|
|
0ef9344c17 | ||
|
|
d4ed258b74 | ||
|
|
e5dd78d393 | ||
|
|
2653455ded | ||
|
|
11dc572bce | ||
|
|
718a28c886 | ||
|
|
5e1740d11f | ||
| 1ee35fd6fd | |||
| 47a6eaa297 | |||
|
|
9c6466cffb | ||
| 8f4bab2d24 | |||
|
|
3091952c90 | ||
|
|
fc71ed9789 | ||
|
|
d154d11911 | ||
| 5115fdaa6f | |||
| c9946dfd63 | |||
| 19d122e546 | |||
|
|
6e3b363f50 | ||
|
|
f047f3ce93 | ||
|
|
7422f430b2 | ||
|
|
a9baa441c9 | ||
|
|
75e1e7da4b | ||
|
|
03b892379a | ||
|
|
6108fa3766 | ||
|
|
27979f51ac | ||
|
|
c770ccd939 | ||
|
|
180b485f8b | ||
|
|
262cfd4ea3 | ||
|
|
5823f5ed04 | ||
|
|
1ccb7b4c5e | ||
|
|
13375d16f1 | ||
| bfdfe0e681 | |||
| 77b78d7fb9 | |||
| eb44b2bb26 | |||
| 1c6c9a3e1f | |||
|
|
e18d3e0f76 | ||
| aabb56c840 | |||
|
|
1a62a9cb17 | ||
|
|
2e9aa38700 | ||
|
|
f13ba7e8d9 | ||
|
|
1d411d2874 | ||
|
|
352bd95f5a | ||
|
|
228a619af5 | ||
|
|
0d8eb3cfb4 | ||
|
|
c000567d88 | ||
|
|
6a7c8d6341 | ||
|
|
46cc9b934b | ||
|
|
743bc829ab | ||
|
|
e63796c7bc | ||
|
|
39f4046f70 | ||
|
|
5b907aa076 | ||
|
|
b3ad823b4c | ||
|
|
b5ff9684bb | ||
|
|
4e4ecafd97 | ||
|
|
2adecda5eb | ||
|
|
e06dc72359 | ||
|
|
98e55eb577 | ||
|
|
a96317d566 | ||
|
|
13d786b2ef | ||
|
|
521c7531bc | ||
|
|
5e857fdb67 | ||
|
|
372f22c0b3 | ||
|
|
006182f4e8 | ||
|
|
d8d95d9998 | ||
| 46c5775ba4 | |||
| a9baa0f954 | |||
| 70719597ab | |||
|
|
cf4a3237e7 | ||
|
|
9764006f81 | ||
|
|
3d1b6d9fc8 | ||
|
|
bd9893ab98 | ||
|
|
0b558e8714 | ||
| eae201a6dd | |||
|
|
eb39fcc947 | ||
|
|
8d72233afd | ||
|
|
fce7b89087 | ||
|
|
41fb6e7824 | ||
|
|
d763559120 | ||
|
|
fde9dd539d | ||
|
|
fe6ec9a7d4 | ||
|
|
11c2c3443f | ||
|
|
b3d7467719 | ||
|
|
1a22d8a0f2 | ||
|
|
41aa214589 | ||
|
|
4a25c2344e | ||
|
|
256abf5505 | ||
|
|
a0ef667a14 | ||
|
|
a4797327cd | ||
|
|
2da1b68956 | ||
| 568636d562 | |||
| 40a47d41df | |||
| 7f744a2369 | |||
| 45d1b290ee | |||
| acde22a436 | |||
|
|
9000c88965 | ||
| 37fd08e637 | |||
| 8e9ac59396 | |||
| 900e365f93 | |||
| 6700a58a17 | |||
| c449748663 | |||
| 25273f9e87 | |||
|
|
8778f367e8 | ||
|
|
e7df288a34 | ||
|
|
fa57de0688 | ||
|
|
51078cc38f | ||
|
|
5d9ac8b1d9 | ||
|
|
98fd372d5b | ||
|
|
ee1559b921 | ||
|
|
81223c76bd | ||
|
|
5f290d091e | ||
|
|
2c6781f74d | ||
|
|
8a58af3e96 | ||
|
|
8ff1bc0132 | ||
|
|
e1579a1cc5 | ||
|
|
de5691acf5 | ||
|
|
6cce2d6d14 | ||
|
|
f3038e53d1 | ||
|
|
8134ceec83 | ||
|
|
799770926b | ||
|
|
949f87fd25 | ||
|
|
3db7f2798f | ||
|
|
4c55431bb3 | ||
|
|
8584c1e824 | ||
| 66148ee7f0 | |||
|
|
6e96b1945e | ||
|
|
9ce2087a75 | ||
|
|
99952c0df0 | ||
|
|
040f201fab | ||
|
|
f6577fc9f7 | ||
|
|
5493dd5dba | ||
|
|
b269fb4bfa | ||
|
|
166518fc9b | ||
|
|
67ff1c92f0 | ||
|
|
356aa2ea28 | ||
|
|
e40bd07fcf | ||
|
|
bbc366b85b | ||
|
|
6161c72270 | ||
|
|
ed3e377390 | ||
|
|
3c6c798018 | ||
|
|
91123ab688 | ||
|
|
d745c1023e | ||
|
|
14b70806a5 | ||
|
|
e076f14ea3 | ||
|
|
c38086fc4a | ||
|
|
3f8b4727f5 | ||
|
|
93cdf51b7f | ||
|
|
39b38256fd | ||
|
|
91156670e9 | ||
|
|
147a1bb860 | ||
|
|
d42c4b082d | ||
|
|
39dbcb529a | ||
|
|
adfef8b520 | ||
|
|
b8373aca0c | ||
|
|
3439c36197 | ||
|
|
c7195c4bc5 | ||
|
|
e66fcb5e1f | ||
|
|
8a098c154d | ||
|
|
1a7060af25 | ||
|
|
1006c5600c | ||
|
|
ba83a4a2ac | ||
|
|
0b85c4bb20 | ||
|
|
8ab3ef44dd | ||
|
|
dfe73a063d | ||
|
|
01bf932169 | ||
|
|
73989dbcaf | ||
|
|
8cd2f87e99 | ||
|
|
c87d6cc6a5 | ||
|
|
f185b30d71 | ||
|
|
38e38b9f8d | ||
|
|
632b3267dc | ||
|
|
b9063dd226 | ||
|
|
9d4c95deeb | ||
|
|
40f920fbdf | ||
|
|
ca1eb4def1 | ||
|
|
2111a7c4cf | ||
|
|
3526fed611 | ||
|
|
15d8d88950 | ||
|
|
ccff7e70ca | ||
|
|
e3638ffaad | ||
|
|
1c4f49bb83 | ||
|
|
cd3fcc87ab | ||
|
|
85a648224f | ||
| 2bdccf03a7 | |||
| fe47eba97f | |||
|
|
8d0cc71aee | ||
|
|
c36931384f | ||
|
|
c1f56501de | ||
|
|
47e50e5659 | ||
|
|
e605ce6317 | ||
|
|
99fe905039 | ||
|
|
e4803a7973 | ||
|
|
0a1a12b867 | ||
|
|
08d1019f2b | ||
|
|
2f04c5891f | ||
|
|
ab3da3071c | ||
|
|
c78d79938d | ||
|
|
a8070a4185 | ||
|
|
bb8046dbb3 | ||
|
|
d2b613134d | ||
|
|
1e869d1334 | ||
|
|
6b0cb87cbf | ||
|
|
4de5a33a43 | ||
|
|
43b8d5e8ab | ||
|
|
33deb6752b | ||
|
|
e35eb08f1d | ||
|
|
1505da784f | ||
|
|
56ac41fabf | ||
|
|
cc13fc3433 | ||
|
|
0192268f67 | ||
|
|
ec32731b50 | ||
|
|
3034cfc82f | ||
|
|
69bf926211 | ||
|
|
855de943a7 | ||
|
|
1d7d9043c1 | ||
|
|
358920db0e | ||
|
|
c0f1ce590e | ||
|
|
7fd5e9b867 | ||
|
|
0cd8c3d5a8 | ||
| 1103490223 | |||
| c208586bf1 | |||
| 0657884fca | |||
| 978cec0316 | |||
|
|
cb491e855c | ||
|
|
2b02750f11 | ||
|
|
d0044c74b6 | ||
|
|
7dadf9b748 | ||
|
|
76817eaa10 | ||
|
|
ab6fd34828 | ||
|
|
7d04d9109e | ||
|
|
6782948751 | ||
|
|
4b742f88d9 | ||
|
|
cdeb0857a9 | ||
|
|
cf7efee0d3 | ||
|
|
7f769580bd | ||
|
|
3683ee3ffa | ||
|
|
511071e1ba | ||
|
|
64337775f8 | ||
|
|
4a55c48dbf | ||
|
|
51c7bb7118 | ||
|
|
673d2fb4b7 | ||
|
|
4fdf518251 | ||
|
|
ece1cd0fdd | ||
|
|
4cd5571203 | ||
|
|
af1fab1915 | ||
|
|
8f1421ea0b | ||
|
|
91c9d519ae | ||
|
|
ece8352126 | ||
|
|
9d7b984f3b | ||
|
|
dadfa69061 | ||
|
|
1d8a75fa3f | ||
|
|
ca4b7f81e5 | ||
|
|
aeee15eae8 | ||
| 4d53dd29a3 | |||
|
|
ae30a1e5aa | ||
|
|
a596213526 | ||
|
|
e4574fa3bf | ||
|
|
84c0d6cdf8 | ||
|
|
7b79ac3739 | ||
|
|
2fd8038d87 | ||
|
|
2970680e6a | ||
|
|
af28474b06 | ||
|
|
98e7579dee | ||
|
|
e2cb29f2a0 | ||
|
|
3ad13e14d8 | ||
|
|
b39ca3f8be | ||
|
|
1decd111d5 | ||
|
|
4338511b28 | ||
|
|
f3151bb6c4 | ||
|
|
96756b3945 | ||
|
|
30c9ad2b2a | ||
|
|
bd6c7c5546 | ||
|
|
d0d31bcc3b | ||
|
|
8f2e5990db | ||
|
|
a0d1280853 | ||
|
|
14c64159c8 | ||
|
|
323fe418f7 | ||
|
|
552900f18e | ||
|
|
b4a6246e30 | ||
|
|
14eefaafee | ||
|
|
64c1484bd7 | ||
|
|
be8136dc6d | ||
|
|
63790f01f8 | ||
|
|
6f2e2faff2 | ||
|
|
b80048bf07 | ||
|
|
a0d18ac4e6 | ||
|
|
eca73436c9 | ||
|
|
9de155a132 | ||
|
|
fdd7ebef2d | ||
|
|
6aad70b109 | ||
|
|
1610d06bb4 | ||
|
|
820ebcbf93 | ||
|
|
1a7c787d3c | ||
|
|
79cea72e29 | ||
|
|
9435e01f9e | ||
|
|
756e4a41da | ||
|
|
615ec7f74d | ||
|
|
5971794e54 | ||
|
|
e0f60d0c17 | ||
|
|
2b9bb78d3e | ||
|
|
51582abc87 | ||
|
|
f1ab9aaa9c | ||
|
|
bd608e0807 | ||
|
|
b04a218bbc | ||
|
|
44ebc4c95d | ||
|
|
051670038e | ||
|
|
150f9041e3 | ||
|
|
b750ed3a0f | ||
|
|
8dfc8b584f | ||
|
|
c67b2c1661 | ||
|
|
995a37f0cc | ||
|
|
f14fbd4aab | ||
|
|
e89bcce711 | ||
|
|
9c8f969b34 | ||
|
|
0bed5f490a | ||
|
|
8f792127da | ||
|
|
fc033bd954 | ||
|
|
7bc02ad3ba | ||
|
|
6dcaeae8c7 | ||
|
|
c575cd7bc7 | ||
|
|
7692e06230 | ||
|
|
41ef2ab591 | ||
|
|
b0d656683b | ||
|
|
3d17e1d418 | ||
|
|
c1ab2486f9 | ||
|
|
1a53ced167 | ||
| fae6e29546 | |||
| ef459326cb | |||
|
|
1140ff5cd5 | ||
|
|
6b9375804c | ||
|
|
771f43591a | ||
|
|
eb1dfd2312 | ||
|
|
954c1942f6 | ||
|
|
5cf66dfec2 | ||
|
|
0d139e4eca | ||
|
|
c062990830 | ||
|
|
8f653d6238 | ||
|
|
5f09609d41 | ||
|
|
1fa8841d20 | ||
|
|
0ccab508f1 | ||
|
|
18e91d9302 | ||
|
|
bfebbaee32 | ||
| cd0ed65b29 | |||
|
|
06b2fed518 | ||
|
|
4ce7a4cfdb | ||
|
|
5f33c542b4 | ||
|
|
8a94f25181 | ||
|
|
cb0ed264c4 | ||
|
|
0a48282e51 | ||
|
|
24c0fe26d8 | ||
|
|
6d1748fd59 | ||
|
|
49db102bdd | ||
|
|
526925f1c6 | ||
|
|
f58d54cd22 | ||
|
|
cc3e0a0d52 | ||
|
|
810d802ca8 | ||
|
|
f6e553f89f | ||
|
|
79096dbacd | ||
|
|
29844db332 | ||
| 8fbe19b993 | |||
| 85f0048d22 | |||
| 46b6870ffa | |||
| 0d96f1906b | |||
|
|
4eb11fbde6 | ||
|
|
137a4f8a5d | ||
|
|
cc3a17845c | ||
|
|
45c57db0ed | ||
|
|
59ed879c8f | ||
|
|
a020f203dc | ||
|
|
badf32e88d | ||
|
|
1205d3e305 | ||
|
|
7aefcc449a | ||
|
|
dc8c27d129 | ||
|
|
fc19e03128 | ||
|
|
55c688cbeb | ||
|
|
000ae6bf17 | ||
|
|
84b8ae1302 | ||
|
|
4d8aae12b5 | ||
|
|
e017a5925d | ||
|
|
0b85172ba6 | ||
|
|
51901f7de0 | ||
|
|
ef42abb818 | ||
|
|
dfad1352ad | ||
|
|
00032619bd | ||
|
|
7507b206be | ||
|
|
1051001495 | ||
|
|
dc4abb922b | ||
|
|
f4922a530a | ||
|
|
7a2f60c43d | ||
|
|
eacdb1da6e | ||
|
|
6827354527 | ||
|
|
463415a7ef | ||
|
|
83c49a5c80 | ||
|
|
8a4bbae077 | ||
|
|
5a6194839b | ||
|
|
86305bfdfe | ||
|
|
9aa6d215fd | ||
|
|
5a2f82095a | ||
|
|
22b7050c4c | ||
|
|
01ec3b995e | ||
|
|
05038ea1e5 | ||
|
|
d6e987e587 | ||
|
|
b66700720b | ||
|
|
3ff53a64cb | ||
|
|
25cefc16a5 | ||
|
|
c12c837abd | ||
|
|
8048dcb76c | ||
|
|
060e81ded0 | ||
|
|
33af5a913e | ||
|
|
7848d0dbe5 | ||
|
|
1a7a235b05 | ||
|
|
1f90cffc89 | ||
|
|
56eb9666ea | ||
|
|
a475b667b5 | ||
|
|
492bc3eedc | ||
|
|
e2d0ad6adc | ||
|
|
bf7b841020 | ||
|
|
89315999e2 | ||
|
|
270396a882 | ||
|
|
c53ad5fe8a | ||
|
|
c3dda7c535 | ||
|
|
d7443fce54 | ||
|
|
ad33950966 | ||
|
|
aa1eed3bd3 | ||
|
|
cdc116291b | ||
|
|
51df8d18b4 | ||
|
|
8221553600 | ||
|
|
9511d24727 | ||
|
|
f4a31a7843 | ||
|
|
f08127bfcc | ||
|
|
21f8c3e40a | ||
|
|
3c99a23adb | ||
|
|
533a5bc7a3 | ||
|
|
5cd10b3ba0 | ||
|
|
39265fccf3 | ||
|
|
db9495b04b | ||
|
|
08b0f80879 | ||
|
|
b7e8a031d0 | ||
|
|
ff13b6f682 | ||
|
|
a926d01509 | ||
|
|
f286737868 | ||
|
|
6058677979 | ||
|
|
742e747609 | ||
|
|
c3baf286c1 | ||
|
|
d597410330 | ||
|
|
dc1109dba7 | ||
|
|
61a45cdaed | ||
|
|
31a22858d5 | ||
|
|
2b65a0e95f | ||
|
|
f1cd1c5d4d | ||
|
|
19cf716461 | ||
|
|
60bb6acf38 | ||
|
|
fd1a257df3 | ||
|
|
70860e1352 | ||
|
|
7f1bc48a88 | ||
|
|
200c474a13 | ||
|
|
00f1e4f1ad | ||
|
|
8d16379634 | ||
|
|
9af5f3a7a7 | ||
|
|
ef15ebe8c7 | ||
|
|
13a9c446ee | ||
|
|
19c6c96929 | ||
|
|
67c35bbbf0 | ||
|
|
7cea078494 | ||
|
|
9a74bf929b | ||
|
|
b7598f7058 | ||
|
|
3f6379e6b4 | ||
|
|
18c5be8835 | ||
|
|
9da5723c59 | ||
|
|
c12860ff7d | ||
|
|
b325eadc33 | ||
|
|
0fed65e7d2 | ||
|
|
341428b4da | ||
|
|
76d463e8ec | ||
|
|
d56b62e44c | ||
|
|
8dfb2237d9 | ||
|
|
c85873e4e6 | ||
|
|
60985968a8 | ||
|
|
12cd009bb9 | ||
|
|
72fa4e250d | ||
|
|
013aea3bb9 | ||
|
|
bf62477ff9 | ||
|
|
cd5ec365d3 | ||
|
|
d60ecc5e3d | ||
|
|
69a0bfaf34 | ||
|
|
c9b86111f4 | ||
|
|
601c3ea8dc | ||
|
|
97b1208829 | ||
|
|
48ae684c6e | ||
|
|
69234cc8d6 | ||
|
|
863655044e | ||
|
|
71531dd4d1 | ||
|
|
7c713b9e3b | ||
|
|
168823e096 | ||
|
|
fc90c942f5 | ||
|
|
b5a9ed3688 | ||
|
|
178419658b | ||
|
|
fbe5da4090 | ||
| dffedd7c86 | |||
| d39c85e3f5 | |||
| c56186da8c | |||
|
|
bd4282adfd | ||
|
|
3a989acd1d | ||
|
|
aa9b57fc81 | ||
|
|
e1679acaec | ||
| 39c2a88c67 | |||
| 61698eb5d8 | |||
|
|
c94310411b | ||
|
|
78318ae441 | ||
|
|
54b03a7476 | ||
|
|
53d474075f | ||
|
|
28bb901d1e | ||
|
|
78de4b70ed | ||
|
|
157429f20d | ||
|
|
3422e53bd1 | ||
|
|
d96aa8dac4 | ||
|
|
42d37c5c51 | ||
| 523025ce8c | |||
|
|
f5cb2cc14e | ||
|
|
e445e7930e | ||
|
|
6b6178613d | ||
|
|
1fda6d4a48 | ||
|
|
55eb8dcfa0 | ||
| 70daf007ae | |||
| df48312ce7 | |||
|
|
57ce381bcd | ||
|
|
7f54630224 | ||
|
|
4b3796a303 | ||
|
|
a59a8e7a19 | ||
|
|
6e007f4e8c | ||
|
|
d888922db6 | ||
|
|
3d2a4d4165 | ||
|
|
9e25d9a9be | ||
|
|
9f8c8c6504 | ||
|
|
37248037d7 | ||
|
|
99c3cab00f | ||
|
|
500b21c236 | ||
|
|
49b04f4b77 | ||
|
|
89fed709ad | ||
|
|
9d95cc7ef9 | ||
|
|
b8200d7295 | ||
|
|
2b560015c9 | ||
| 932ac0960b | |||
| 676f7aa808 | |||
| d9c8460934 | |||
| 7b9dfc9952 | |||
| c66f5a8536 | |||
| fe9605a6a3 | |||
|
|
4282ff42ca | ||
|
|
53b0b35e34 | ||
|
|
c438468a82 | ||
|
|
8f6267115c | ||
|
|
d8251ae4ab | ||
|
|
6ad860a963 | ||
|
|
129615a724 | ||
|
|
426ddb356e | ||
|
|
d9e0641606 | ||
| 82427612d1 | |||
| ccf08aa3df | |||
| 8768896d6b | |||
| e890bc8efe | |||
|
|
b613a50d8c | ||
| f38ee42874 | |||
|
|
bd7b03fc7e | ||
|
|
0d2e9c3762 | ||
|
|
beb40a62a7 | ||
|
|
642f4535f4 | ||
|
|
4490fb196d | ||
|
|
a3ed5ec27b | ||
|
|
589b502bfc | ||
|
|
a932d2c4a1 | ||
|
|
8c0be5fbe2 | ||
|
|
8e55232492 | ||
|
|
b2fb5ac1c1 | ||
|
|
cf6fbcbf2d | ||
|
|
3c22c690c8 | ||
|
|
3156ee1acb | ||
|
|
ba45f98073 | ||
|
|
bc37649884 | ||
|
|
4604a69498 | ||
|
|
5e754f1694 | ||
|
|
8066810abb | ||
|
|
c5caacafdd | ||
|
|
5c436342ca | ||
|
|
cf9d3f66ab | ||
|
|
96d1711296 | ||
|
|
296e8589b0 | ||
|
|
d50ed3b6e7 | ||
|
|
f3af2a6fb7 | ||
|
|
28e17feb93 | ||
|
|
195de97c67 | ||
|
|
3ab6a23434 | ||
|
|
dab345ce58 | ||
|
|
ff3d04f4d1 | ||
|
|
e92a21cb0a | ||
|
|
1862e9c5da | ||
|
|
0cd5f4c12b | ||
|
|
779ee3238c | ||
|
|
e6f8ad65c1 | ||
|
|
fca440fb66 | ||
|
|
321b57a5d2 | ||
|
|
b46c8dcc62 | ||
|
|
7951646b9a | ||
|
|
479b047618 | ||
|
|
70407e4d87 | ||
|
|
16a8a34688 | ||
|
|
5f6228b6f0 | ||
|
|
95a5a57f94 | ||
|
|
da912e8c74 | ||
|
|
edfcee29ff | ||
|
|
d3cb1030c8 | ||
|
|
e921314f43 | ||
|
|
94ba027544 | ||
|
|
949f8761b8 | ||
|
|
321835cb47 | ||
|
|
e92b5f7e3e | ||
|
|
4651f91f94 | ||
|
|
b53f169824 | ||
|
|
b3549980aa | ||
|
|
e4b5257d4c | ||
|
|
42f5edbd33 | ||
|
|
6c2dff1efd | ||
|
|
b318896b85 | ||
|
|
de7a603c06 | ||
|
|
35c7646ee4 | ||
|
|
a480b70488 | ||
|
|
4e19158e0e | ||
|
|
12c97b42a4 | ||
|
|
febfc7e4e9 | ||
|
|
4b97ec9d23 | ||
|
|
b1c3d47413 | ||
|
|
c4d6f4f536 | ||
|
|
362c1664ae | ||
|
|
d87bfaf480 | ||
|
|
3c7c3c98d7 | ||
|
|
398e7ff6d3 | ||
|
|
f82c61732a | ||
|
|
b954b2f5df | ||
|
|
e3ccd97563 | ||
|
|
8120f5cdad | ||
|
|
6a68d0b4d0 | ||
|
|
e618441e18 | ||
|
|
318d704887 | ||
|
|
7a64af9280 | ||
|
|
2b5ce666be | ||
|
|
b11b7916fd | ||
|
|
9730d4aa1c | ||
|
|
8d14266bc3 | ||
|
|
0aa5507c4c | ||
|
|
b114bbee06 | ||
|
|
193df55bec | ||
|
|
84839de56f | ||
|
|
2c17d235b2 | ||
|
|
f17059b10b | ||
| 30a9346373 | |||
| 0b00787b4d | |||
|
|
19c59b41ed | ||
|
|
a72bcab0fd | ||
|
|
6106909c10 | ||
|
|
7cbae3d20c | ||
|
|
0876d5c4ad | ||
|
|
966a48b23a | ||
|
|
d956b3b359 | ||
|
|
42956a62a3 | ||
|
|
bea77c651a | ||
|
|
0364f1dc85 | ||
|
|
76446f634b | ||
|
|
750ffcc81a | ||
|
|
696117b048 | ||
|
|
7f64af38cb | ||
|
|
2e4b687ba5 | ||
|
|
0a8c0733ad | ||
|
|
df5568d993 | ||
|
|
b54fd961cb | ||
|
|
db32a79596 | ||
|
|
965f2bf799 | ||
|
|
d02d474cac | ||
|
|
93e557e167 | ||
|
|
2c55b40a53 | ||
|
|
7324b70a7c | ||
|
|
5662b5813e | ||
|
|
b992ca80e7 | ||
|
|
72e7ffa324 | ||
|
|
1ec4faee55 | ||
|
|
fd8050b369 | ||
|
|
d2d27a01b9 | ||
|
|
8d836fa248 | ||
|
|
9993a99906 | ||
|
|
2497cbe186 | ||
|
|
f8e4ccac45 | ||
|
|
f2a1972ba8 | ||
|
|
3a98de1236 | ||
|
|
24b30965c4 | ||
|
|
36a23e0fe3 | ||
|
|
c247e7df9c | ||
|
|
d37dd4d758 | ||
|
|
70680d5b22 | ||
|
|
8fa8737465 | ||
|
|
1d973a0803 | ||
|
|
82d436d05e | ||
|
|
7cc15e56c8 | ||
|
|
18f441ae35 | ||
|
|
0b7291d767 | ||
|
|
6aa311aabd | ||
|
|
acc6df4959 | ||
|
|
d94023e9b3 | ||
|
|
524fa82092 | ||
|
|
389e7cc35d | ||
|
|
99a3da3b60 | ||
|
|
d547d59cba | ||
|
|
dcf36db263 | ||
|
|
8b2a1b9e97 | ||
|
|
5023b62268 | ||
|
|
8bbab01316 | ||
|
|
5cd04366fe | ||
|
|
56aad056da | ||
|
|
fe2ec6c887 | ||
|
|
6e3a6d0ac5 | ||
|
|
95d728faf0 | ||
|
|
eb0a8cc0bf | ||
|
|
0fd886fa7f | ||
|
|
e00696de7f | ||
|
|
58d29feab1 | ||
|
|
f3d476aad8 | ||
|
|
53bb95a023 | ||
|
|
10bc0d29d1 | ||
|
|
2b7897cded | ||
|
|
e9efc2fe25 | ||
|
|
cccbbd956d | ||
|
|
42143ca056 | ||
|
|
e92ef7b018 | ||
|
|
bd4d3c6393 | ||
|
|
eb8f1cc1dc | ||
|
|
1b2996a75e | ||
|
|
17190ae63e | ||
|
|
44b28d1187 | ||
|
|
0ddfbb0c20 | ||
|
|
fc7ae2aa6f | ||
|
|
e3dc5e3a66 | ||
|
|
6b54e6749e | ||
|
|
308efbeb04 | ||
|
|
e490e6361f | ||
|
|
1a818c60cb | ||
|
|
9343d09321 | ||
| dc5b795647 | |||
| 26a05d01dc | |||
| 388dd5e1c4 | |||
|
|
f17e95bac1 | ||
|
|
95411a62b3 | ||
| 912fd7759d | |||
| 79f8a85786 | |||
|
|
1e13cd23b1 | ||
|
|
a18824ad82 | ||
|
|
27afaea2b9 | ||
|
|
da4a45ae0b | ||
|
|
e6480ea288 | ||
|
|
3f7321af00 | ||
|
|
1dbb559792 | ||
| f384d2dd80 | |||
|
|
e2a4c76a37 | ||
| 9d164965c9 | |||
| 47d6dd843e | |||
|
|
58b4cd4956 | ||
|
|
7a235f3746 | ||
|
|
85d7398476 | ||
|
|
630c92392a | ||
|
|
d244f7e070 | ||
| 49d8ea648d | |||
|
|
af29fc3ea8 | ||
|
|
7dbf1a8caa | ||
|
|
1f42ce5f40 | ||
|
|
bc7ba33892 | ||
|
|
a9d3ad86e5 | ||
|
|
0fdb5a032f | ||
|
|
620d3d14dd | ||
|
|
485dd8a673 | ||
|
|
fc772b42dd | ||
|
|
b3de7efc07 | ||
|
|
e0a49532f0 | ||
|
|
60b4cd64f1 | ||
|
|
1539dca7f0 | ||
|
|
5877bd6036 | ||
|
|
614962ad6f | ||
|
|
c4c55fffb1 | ||
|
|
583392a5c6 | ||
|
|
49cb72d585 | ||
|
|
c565ea6c29 | ||
|
|
9a6e603ced | ||
|
|
eb1a158c1b | ||
| e3c0428838 | |||
| 32a6d36405 | |||
| 11dd3a260e | |||
| d9ee2d28a0 | |||
| 076cbcc4f8 | |||
| 568dfc73a9 | |||
|
|
300dc68955 | ||
| 3eb418af39 | |||
| be5205d020 | |||
|
|
294d6dc867 | ||
|
|
5a8846d33c | ||
|
|
1b7e213be4 | ||
|
|
f87f48ab88 | ||
|
|
d5658860aa | ||
|
|
fb2712410e | ||
|
|
1570ef2dd4 | ||
| 33b949abfa | |||
| 500d1bb168 | |||
|
|
1d4700cb6c | ||
|
|
c375a5d37f | ||
|
|
8f6eac98f3 | ||
|
|
239ad19765 | ||
|
|
263f6f439b | ||
|
|
d047b73a9c | ||
| 39c64bf83c | |||
| 8b717955ba | |||
|
|
d74c8b9425 | ||
| 6253f11503 | |||
|
|
47a0b7cba1 | ||
| c4f3a02b3b | |||
| a0877b3d0c | |||
|
|
243334da75 | ||
|
|
1e8800117a | ||
|
|
59efce3035 | ||
|
|
c542663a33 | ||
|
|
26f64dd8ec | ||
|
|
b675a27e16 | ||
|
|
c56566179a | ||
|
|
b67d04a5b1 | ||
|
|
2489c09b44 | ||
|
|
a635d46b1a | ||
|
|
0c43bae01d | ||
|
|
268cf0a3cc | ||
|
|
3cf9a475b9 | ||
|
|
7d938ebe4d | ||
|
|
5c08182c73 | ||
|
|
065efb05b7 | ||
| 77bc1ba03e | |||
|
|
9907e3fa28 | ||
| 4bae29b925 | |||
|
|
347fbb652f | ||
|
|
7ce3776b80 | ||
|
|
c1e5247d51 | ||
|
|
64bf0f8f1f | ||
|
|
08718993be | ||
| 28b7cbfca6 | |||
|
|
cff9c9bc95 | ||
|
|
34e2bab96a | ||
|
|
fd2299e51a | ||
| 76f65ac694 | |||
|
|
95d2694bc3 | ||
|
|
eee759455a | ||
|
|
cd092df9d8 | ||
|
|
9939d0c4f4 | ||
| b0f7c7bc4c | |||
|
|
c4c5d8c5e7 | ||
|
|
06d53ef8a7 | ||
|
|
1f9cb44fa3 | ||
|
|
e2fc55f829 | ||
|
|
741cd9c40a | ||
|
|
ee518b9141 | ||
|
|
91d791afd0 | ||
|
|
366fdcce18 | ||
|
|
9dd56b1566 | ||
|
|
bb04fbf410 | ||
|
|
83129b8c63 | ||
|
|
ecfffac3a8 | ||
|
|
ff6ae1aefb | ||
|
|
f9d314b263 | ||
|
|
3b3a7bbd06 | ||
|
|
3961014a9e | ||
| b72352949b | |||
|
|
c6e4ddc88a | ||
|
|
9a37c8a4b3 | ||
|
|
a108554a85 | ||
|
|
e5860f83bc | ||
|
|
4387ecfdfb | ||
|
|
326df70ac2 | ||
|
|
7736e71e91 | ||
|
|
56f710f64f | ||
|
|
6c7723905c | ||
|
|
dc1eb73ee7 | ||
|
|
8974c7e843 | ||
|
|
9e0bea405d | ||
|
|
4d30efdc2a | ||
|
|
8838e25cb2 | ||
|
|
8eab946c5b | ||
|
|
bbc5255f04 | ||
|
|
f7b10b1fde | ||
|
|
6454eb1384 | ||
|
|
6129a58508 | ||
|
|
8c75962850 | ||
|
|
d489c7a057 | ||
|
|
a2bab9f172 | ||
|
|
6afb758bdc | ||
|
|
28ca05ccdc | ||
|
|
143275db04 | ||
|
|
cebdadd0f6 | ||
|
|
c335f170d7 | ||
|
|
69bbdcab91 | ||
|
|
c6ac0ba683 | ||
|
|
19e504f182 | ||
|
|
a184380dc9 | ||
|
|
c22c13110b | ||
|
|
0f30070d58 | ||
|
|
b06fa48735 | ||
|
|
9c57f52d1e | ||
|
|
24e84adc6d | ||
|
|
e2b83e2dd9 | ||
|
|
36008de2ed | ||
|
|
eda3423e35 | ||
|
|
cf3bb7e118 | ||
|
|
343d5aa0ac | ||
|
|
90b1701b6c | ||
|
|
45d1c9f02e | ||
| aa1398e696 | |||
| 91b7ba7dcc | |||
| a53720810b | |||
| 324d31225c | |||
| a183425e00 | |||
| 2bc704fe07 | |||
| 7b9d26cefe | |||
| 54cde56ec5 | |||
|
|
c61c874a6d | ||
|
|
a87094e01f | ||
|
|
f8d2776177 | ||
|
|
1dd4bf0280 | ||
|
|
4e7de436b4 | ||
|
|
af8cfbedfb | ||
|
|
be1fd5e995 | ||
|
|
7e4d7a5373 | ||
|
|
d99d3bd471 | ||
|
|
b6178c9d85 | ||
|
|
7fd1a6c8a8 | ||
|
|
485f06e36f | ||
| 6b44e40ee8 | |||
|
|
8ec2d6ce49 | ||
|
|
295afaaf6c | ||
|
|
981398406c | ||
|
|
21f1ae51df | ||
|
|
d66c9590af | ||
|
|
a63df51893 | ||
|
|
f39a6f40fd | ||
|
|
5d03cda01a | ||
|
|
c921f6637f | ||
|
|
45a54c3fd7 | ||
|
|
136bbc1690 | ||
|
|
b90b63bb2b | ||
|
|
267468834d | ||
|
|
7b67ef15c4 | ||
|
|
172ab190b5 | ||
|
|
0dee1a1646 | ||
|
|
5ee5c35833 | ||
|
|
f9b5a9af4e | ||
|
|
5cfde7b6ea | ||
|
|
8864cefba6 | ||
|
|
c316231dd2 | ||
|
|
9c1487cff6 | ||
|
|
82ab998cd5 | ||
|
|
7cb2aa2d62 | ||
|
|
3e04744f75 | ||
|
|
a3673cc79b | ||
|
|
10aac2be05 | ||
|
|
ee75f1aaaf | ||
|
|
f65404cc05 | ||
|
|
58630a844a | ||
|
|
e4d92a3aad | ||
|
|
31e4591691 | ||
|
|
a62a1ae2bd | ||
|
|
db84445a62 | ||
|
|
b630e561a7 | ||
|
|
d1fecf5025 | ||
|
|
06cb075025 | ||
|
|
1d1b8703b6 | ||
|
|
b9b9ef227f | ||
|
|
cdfc169ab6 | ||
|
|
e4611b6e3e | ||
|
|
6797ec6ed3 | ||
|
|
00d91bed32 | ||
|
|
22c265b170 | ||
|
|
10b9ca5a92 | ||
|
|
dbab5380b2 | ||
|
|
fc1594104b | ||
|
|
a98bfa628e | ||
|
|
d9089f52ce | ||
|
|
653f511792 | ||
|
|
ae41bb369f | ||
|
|
b279d6b335 | ||
|
|
a1db6c4379 | ||
|
|
724ce4acba | ||
|
|
4a6bdb6fe4 | ||
|
|
734012aa8b | ||
|
|
755b86e38b | ||
|
|
74be29cbf9 | ||
|
|
43e8a4110f | ||
|
|
45e73c414a | ||
|
|
c588cc6db0 | ||
|
|
1c31cf5f6a | ||
|
|
364ee62d10 | ||
|
|
cb99546ea5 | ||
|
|
12b98be744 | ||
|
|
1cf8a3e8d8 | ||
|
|
514d4146d3 | ||
|
|
f31a0d9cf5 | ||
|
|
db702053c3 | ||
|
|
d12e1a8d74 | ||
|
|
a0e6975b9d | ||
|
|
582acdaa0a | ||
|
|
d905958db1 | ||
|
|
6fad383367 | ||
|
|
7742a97c22 | ||
|
|
f0cf9a4e75 | ||
|
|
d8a4f71ec7 | ||
|
|
6a001786a9 | ||
|
|
ddd4d616db | ||
|
|
118b26b335 | ||
|
|
40fbac13cd | ||
|
|
96cf9053f4 | ||
|
|
f4a64a2e80 | ||
|
|
7f97cc1940 | ||
|
|
324cbe4327 | ||
|
|
380f1d6ae6 | ||
|
|
64507207da | ||
|
|
fce1efc74c | ||
|
|
09ddff8df1 | ||
|
|
fae1039401 | ||
|
|
46b7575550 | ||
|
|
5610e05b8c | ||
|
|
86e885c5fc | ||
|
|
7378744bb2 | ||
|
|
4c72a3991e | ||
|
|
55f15e3c05 | ||
|
|
97e7fea517 | ||
|
|
539502c891 | ||
|
|
42ed84141e | ||
|
|
9ccebb0968 | ||
|
|
4342383d95 | ||
|
|
f1256c0b35 | ||
|
|
6e5d70fa19 | ||
|
|
69460b943b | ||
|
|
bf8a35b2f8 | ||
|
|
745ff8f8c1 | ||
|
|
2761ae6754 | ||
|
|
040acc3a32 | ||
|
|
e45eac5016 | ||
|
|
f76021ef82 | ||
|
|
7c908b08ee | ||
|
|
6ea01ea9b0 | ||
|
|
94a2eff05c | ||
|
|
04a9bc0d35 | ||
|
|
b93f93f174 | ||
|
|
caed59ec64 | ||
|
|
16ba035ba7 | ||
|
|
f0a112ef5d | ||
|
|
0cce7fcaa3 | ||
|
|
72ea216dce | ||
|
|
c562b19238 | ||
|
|
2004be96ac | ||
|
|
fe507db45f | ||
|
|
1f105e0ac0 | ||
|
|
f77abbd960 | ||
|
|
6785e0259f | ||
|
|
6d2072f9cb | ||
|
|
2494bfdc86 | ||
|
|
77355cbb2f | ||
|
|
330517bde9 | ||
|
|
d3adfde22a | ||
|
|
863de45c0a | ||
|
|
48443c9c3f | ||
|
|
ecf24420d5 | ||
|
|
140904ec84 | ||
|
|
4881e1ff55 | ||
|
|
23bd861c9a | ||
|
|
24ac1fdcab | ||
|
|
3863a6ab8c | ||
|
|
232e7c7cb0 | ||
|
|
14d0606fa0 | ||
|
|
7ad229ec27 | ||
|
|
a7bed2a74e | ||
|
|
edecddcb33 | ||
|
|
a1b5d800f3 | ||
|
|
35b9191857 | ||
|
|
5e5252ced0 | ||
|
|
09e7f4db00 | ||
|
|
e442efbdec | ||
|
|
0bb92d4fc3 | ||
|
|
db74b92e77 | ||
|
|
d852d0f043 | ||
|
|
352bf7eaf5 | ||
|
|
13c3d06c6a | ||
|
|
e6ded8dd22 | ||
|
|
5803245009 | ||
|
|
1356819de1 | ||
|
|
b11cbbaa55 | ||
|
|
2dddccb99e | ||
|
|
4013bcde9e | ||
|
|
7490adf8e9 | ||
|
|
da3d75f7b1 | ||
|
|
c4170d2f18 | ||
|
|
ea2c068e11 | ||
|
|
cde8000f66 | ||
|
|
32462a6e83 | ||
|
|
06f9e94ff7 | ||
|
|
6a37f4f7b1 | ||
|
|
99bcb4e2a4 | ||
|
|
207dc885a6 | ||
|
|
4092294e7c | ||
|
|
0bc74172a2 | ||
|
|
cfa8b4b5a9 | ||
|
|
bed6d43a76 | ||
|
|
6d388a34eb | ||
|
|
6be7cf7440 | ||
|
|
6f6dcafd90 | ||
|
|
d2ec43113e | ||
|
|
076a3f8a9b | ||
|
|
0b1f605a9b | ||
|
|
5e265f4fbd | ||
|
|
a91ad05774 | ||
|
|
a35d9b469d | ||
|
|
6db4f45754 | ||
|
|
eb21fc3e31 | ||
|
|
a06a97e2cb | ||
|
|
ba1b36a800 | ||
|
|
1bb4fccc3b | ||
|
|
0b3f29780a | ||
|
|
aa3316b619 | ||
|
|
541c2a70ac | ||
|
|
4fc189b60c | ||
|
|
036e7a332b | ||
|
|
5164a6eb26 | ||
|
|
ea760c042b | ||
|
|
c85e111675 | ||
|
|
6fed24e1b6 | ||
|
|
9c49af0597 | ||
|
|
9e4396bdcd | ||
|
|
fecd3f835b | ||
|
|
62de2506e4 | ||
|
|
84e89146d0 | ||
|
|
a6ad332436 | ||
|
|
f45daae09c | ||
|
|
1905d90eaa | ||
|
|
8f57841593 | ||
|
|
671178c8c4 | ||
|
|
9de46f3edd | ||
|
|
1da8d4b4da | ||
|
|
c90ce2b9fa | ||
|
|
4a7122d354 | ||
|
|
c5a4e19d6f | ||
|
|
613e12f99f | ||
|
|
63ac37946d | ||
|
|
e8521c8379 | ||
|
|
f831d84435 | ||
|
|
bcda5e133d | ||
|
|
5d0791cafb | ||
|
|
12f1d9d30c | ||
|
|
cfe24b8532 | ||
|
|
cbb102f541 | ||
|
|
812a31c78f | ||
|
|
71c7aca29c | ||
|
|
a9a2227167 | ||
|
|
7f7665c1c0 | ||
|
|
4e85c1ef91 | ||
|
|
6cec81bcb5 | ||
|
|
e84f3b1c6a | ||
|
|
b5fc646e3d | ||
|
|
1639354e5f | ||
|
|
63b253c33a | ||
|
|
7a117f52ed | ||
|
|
32b0f1c78e | ||
|
|
9ae3d92179 | ||
|
|
3fad7de8db | ||
|
|
70e0b5c0d0 | ||
|
|
b71f6c97ce | ||
|
|
0199d9810b | ||
|
|
da77eedafa | ||
|
|
ee8119779e | ||
|
|
aae7cb3eb0 | ||
|
|
c9a87eb7fd | ||
|
|
2abf99aa32 | ||
|
|
008bbc944c | ||
|
|
bd17fc12ac | ||
|
|
a7e97405e2 | ||
|
|
0d64ddaf84 | ||
|
|
a888fe4c8e | ||
|
|
00c39805f1 | ||
|
|
5608e273a0 | ||
|
|
b7b55e0c0a | ||
|
|
bd69212a19 | ||
|
|
acfabab751 | ||
|
|
f3ab820fc2 | ||
|
|
d3ce9280e2 | ||
|
|
a0497553fc | ||
|
|
e74f5d5d76 | ||
|
|
420dbafa9d | ||
|
|
bf682d14b3 | ||
|
|
c6c6171472 | ||
|
|
0b1c1c1d92 | ||
|
|
2fdaabd02c | ||
|
|
6756821fd9 | ||
|
|
f29de51325 | ||
|
|
a6785d7ff7 | ||
|
|
52a8150df3 | ||
|
|
d845ce9eee | ||
|
|
589755e1bf | ||
|
|
9f082ba5cb | ||
|
|
8664a6574b | ||
|
|
99164a9a13 | ||
|
|
d103ac1d63 | ||
|
|
63c720bcfb | ||
|
|
31e5e6ea98 | ||
|
|
b3939e2513 | ||
|
|
ad211b23be | ||
|
|
214dfed703 | ||
|
|
36e2faf8d2 | ||
|
|
da2c88eaac | ||
|
|
8663de5586 | ||
|
|
d174ce8821 | ||
|
|
46164c6ec6 | ||
|
|
67007282c9 | ||
|
|
03e000c4be | ||
|
|
1d7a49d9de | ||
|
|
80a752da87 | ||
|
|
0d08dde62e | ||
|
|
af0bba0622 | ||
|
|
dae8b21bb9 | ||
|
|
23145137be | ||
|
|
1d0c61642b | ||
|
|
e00a702ce9 | ||
|
|
e64bbc41ec | ||
|
|
7bfee580b1 | ||
|
|
b87565138e | ||
|
|
4863574a4d | ||
|
|
fb7bb40575 | ||
|
|
f325bd848b | ||
|
|
095c844004 | ||
|
|
e041df73bb | ||
|
|
a89ac96485 | ||
|
|
9ce042ad07 | ||
|
|
019254a9d2 | ||
|
|
839bac47d4 | ||
|
|
9feb844b7e | ||
|
|
837d3f57ee | ||
|
|
6440af5c06 | ||
|
|
8d9c2f3e9d | ||
|
|
27ea1df710 | ||
|
|
082cd7a64b | ||
|
|
eadab914f6 | ||
|
|
54b4a20ca2 | ||
|
|
a9b05d37d7 | ||
|
|
bec84f20ab | ||
|
|
9ba8191a04 | ||
|
|
559635a2eb | ||
|
|
909210e00d | ||
|
|
6e842aa66f | ||
|
|
04b5c8c867 | ||
|
|
08a170388d | ||
|
|
7cfe4783ee | ||
|
|
493fe971b5 | ||
|
|
786cb40073 | ||
|
|
b7a79dac5d | ||
|
|
662a98a2a6 | ||
|
|
eb3cb4d99b | ||
|
|
1ad20cf69b | ||
|
|
27ab71bea5 | ||
|
|
86ac94bb6e | ||
|
|
aa0a65b197 | ||
|
|
832f07a6e9 | ||
|
|
264fc2b070 | ||
|
|
24934a1e8a | ||
|
|
f59dadbb4f | ||
|
|
33b5cff8db | ||
|
|
77f177be9c | ||
|
|
a27bc6c90a | ||
|
|
d6f9fcc8f8 | ||
|
|
54aa1ce6de | ||
|
|
4e0c18ee1f | ||
|
|
eaa689f477 | ||
|
|
ccd22ab26a | ||
|
|
b9b6f0dc4c | ||
|
|
cfd80761a3 | ||
|
|
1a8e50c773 | ||
|
|
6b45c85978 | ||
|
|
d97c81b0c9 | ||
|
|
baa9c02c8b | ||
|
|
09d0e99d5b | ||
|
|
09b83e96b3 | ||
|
|
58d1d99701 | ||
|
|
dc7603155d | ||
|
|
6f6a964e7e | ||
|
|
eb021157f8 | ||
|
|
740c4193a8 | ||
|
|
ed8e6e8f45 | ||
|
|
fa3a52bc1e | ||
|
|
c960f8cec4 | ||
|
|
06db5379b0 | ||
|
|
25a468799f | ||
|
|
aa3c28787c | ||
|
|
be96b09623 | ||
|
|
0ff68d67e8 | ||
|
|
b4a70daf17 | ||
|
|
b852087d27 | ||
|
|
cd4aaa13a3 | ||
|
|
e072f0d893 | ||
|
|
a995d4c968 | ||
|
|
681bfcbb41 | ||
|
|
9b593cd154 | ||
|
|
a5697470e1 | ||
|
|
b87ce5bf9e | ||
|
|
b5508ed832 | ||
|
|
4a251158a9 | ||
|
|
15b7946fc4 | ||
|
|
03f9048778 | ||
|
|
f548305c07 | ||
|
|
54ef87c6de | ||
|
|
0113e0970e | ||
|
|
4fc0f8b25c | ||
|
|
70dd6167c0 | ||
|
|
5f5e456e58 | ||
|
|
00379dbb7e | ||
|
|
fcfafe6ced | ||
|
|
c372567330 | ||
|
|
5b94b7727d | ||
|
|
92ba5c26b0 | ||
|
|
f7c7904e2b | ||
|
|
49c4c1e2ac | ||
|
|
45b26ec383 | ||
|
|
71c4f100de | ||
|
|
5865b28592 | ||
|
|
65cc366280 | ||
|
|
9f63125345 | ||
|
|
c415d114e1 | ||
|
|
bfbe9323ee | ||
|
|
713a38d1a2 | ||
|
|
3a65ff970a | ||
|
|
b5e283af68 | ||
|
|
6684a3c723 | ||
|
|
e46bf7e7c6 | ||
|
|
8b60b20f88 | ||
|
|
bebf32ad6f | ||
|
|
608bf5076b | ||
|
|
c0ce820974 | ||
|
|
2fa1bf4351 | ||
|
|
2011bc3485 | ||
|
|
55782901d0 | ||
|
|
190bdf8117 | ||
|
|
f58446e937 | ||
|
|
6132a05fd9 | ||
|
|
7822d013cd | ||
|
|
0e03a321e4 | ||
|
|
2d303213ed | ||
|
|
4f5a7ffe46 | ||
|
|
32a0855d18 | ||
|
|
9c42a72275 | ||
|
|
83dad37562 | ||
|
|
02dd32da60 | ||
|
|
f22c01a05e | ||
|
|
66e8ceafad | ||
|
|
fd83cf2048 | ||
|
|
d0e5af3b09 | ||
|
|
531cf7eb4c | ||
|
|
933500c448 | ||
|
|
df89156f2f | ||
|
|
4826994599 | ||
|
|
254d0a53ac | ||
|
|
c927e6b938 | ||
|
|
22889ca29a | ||
|
|
7573da03f6 | ||
|
|
7ef3f37772 | ||
|
|
2ef9cec613 | ||
|
|
0c6a568438 | ||
|
|
b6f0b4148c | ||
|
|
2023c8329f | ||
|
|
ade6bd8185 | ||
|
|
5135ee52d9 | ||
|
|
c57e07789d | ||
|
|
75c7dc486a | ||
|
|
e6e76a06b7 | ||
|
|
e3cfd1693c | ||
|
|
eeef5359f9 | ||
|
|
9ace5c8ecf | ||
|
|
f8473f4a39 | ||
|
|
defc6dceb0 | ||
|
|
5d205b6749 | ||
|
|
796fc3f5ab | ||
|
|
c0a553e90f | ||
|
|
c064deaaf5 | ||
|
|
016efb5c68 | ||
|
|
22ca98501b | ||
|
|
a123cdc5ac | ||
|
|
f36572f322 | ||
|
|
b4509362ef | ||
|
|
0e5385006b | ||
|
|
57f5284ef7 | ||
|
|
2056eaa49b | ||
|
|
60cb6b709a | ||
|
|
dbd532b8f2 | ||
|
|
1efe6877f4 | ||
|
|
6c75e40293 | ||
|
|
aa9a1c538c | ||
|
|
f7b17f711a | ||
|
|
7aab3e8c93 | ||
|
|
7161038d6b | ||
|
|
0599286e32 | ||
|
|
4dc286fa14 | ||
|
|
049e80993d | ||
|
|
947662415c | ||
|
|
5915126030 | ||
|
|
bfe63e9528 | ||
|
|
ae60968563 | ||
|
|
7e89beeb31 | ||
|
|
3469b1ec5d | ||
|
|
b485e45f4f | ||
|
|
a7925930fa | ||
|
|
6ff4e0ecb0 | ||
|
|
7b3e7cf9a3 | ||
|
|
41499ac315 | ||
|
|
e85b6fb83c | ||
|
|
29615dae06 | ||
|
|
d39e7e7dd5 | ||
|
|
1eede2d1e3 | ||
|
|
dabbded622 | ||
|
|
c3136f4f32 | ||
|
|
121d532a0e | ||
|
|
1eb1430d82 | ||
|
|
959258b3ab | ||
|
|
5603d0cd38 | ||
|
|
864910559b | ||
|
|
cf3f3e510c | ||
|
|
debff19126 | ||
|
|
9f4f689879 | ||
|
|
3618461f9b | ||
|
|
a152ac1cef | ||
|
|
f115ec2193 | ||
|
|
894c1e9590 | ||
|
|
203d795bd6 | ||
|
|
44e32506ed | ||
|
|
de38ce798c | ||
|
|
c0c809ad4b | ||
|
|
ac2fd2fa80 | ||
|
|
34c8c669a3 | ||
|
|
5028f87b09 | ||
|
|
d8763debf5 | ||
|
|
fc9cb038c4 | ||
|
|
d633928a16 | ||
|
|
ee7a77db65 | ||
|
|
9026f13a25 | ||
|
|
129e725599 | ||
|
|
0e98eeb63b | ||
|
|
ef23ffe584 | ||
|
|
72992070c5 | ||
|
|
18908c21f7 | ||
|
|
fdaff00c78 | ||
|
|
bcb87ffd6c | ||
|
|
bc92441803 | ||
|
|
cd69db7770 | ||
|
|
8e7fee2246 | ||
|
|
592bd0140a | ||
|
|
492431a694 | ||
|
|
f8e5e2da64 | ||
|
|
ac7822ba4c | ||
|
|
de48e4b262 | ||
|
|
5015036c06 | ||
|
|
0f003ac5b8 | ||
|
|
049b9ca094 | ||
|
|
672a102fdf | ||
|
|
8323721232 | ||
|
|
4b3cb7b6db | ||
|
|
7686f93ef4 | ||
|
|
8b9e93329d | ||
|
|
04a4e8a38d | ||
|
|
df058c971f | ||
|
|
8428fa0f64 | ||
|
|
b6b5eaa878 | ||
|
|
a20aab0491 | ||
|
|
af38f882ec | ||
|
|
7549326ceb | ||
|
|
d1698230a1 | ||
|
|
36b10104d6 | ||
|
|
97baa7899f | ||
|
|
7872a33f8b | ||
|
|
b9e37818ea | ||
|
|
7798eb983d | ||
|
|
5f057d183a | ||
|
|
50d72ed993 | ||
|
|
4f201964a6 | ||
|
|
af3d809980 | ||
|
|
8f1fc6c07d | ||
|
|
b5bc8b3fc2 | ||
|
|
682e83a63c | ||
|
|
e5e9d2ba47 | ||
|
|
35cfc61607 | ||
|
|
9d43a25d6e | ||
|
|
29df5930dd | ||
|
|
99b4913fda | ||
|
|
2528b67e77 | ||
|
|
cdd77b5972 | ||
|
|
6fcda1dec4 | ||
|
|
5b0c1c8df9 | ||
|
|
ceb6f2e4fc | ||
|
|
a5520f8a3d | ||
|
|
9bfa625170 | ||
|
|
5298119aa2 | ||
|
|
19c6b8aa0c | ||
|
|
19278e0284 | ||
|
|
709de9ce9f | ||
|
|
2dda3df637 | ||
|
|
39098af7c1 | ||
|
|
f1e4a2ffb9 | ||
|
|
fbcea96ec0 | ||
|
|
781d301bb6 | ||
|
|
92095eb666 | ||
|
|
94bda3bde1 | ||
|
|
6afe23d0b0 | ||
|
|
6206fa9a82 | ||
|
|
f846fa109e | ||
|
|
f88f9fd748 | ||
|
|
4a5c52fbd6 | ||
|
|
8e9f75bff9 | ||
|
|
c9571fe1ea | ||
|
|
367f6584ae | ||
|
|
10e35f30f0 | ||
|
|
8159272a8b | ||
|
|
89cf60eac3 | ||
|
|
8b4ca24e56 | ||
|
|
bd4a156b9d | ||
|
|
bbed7b813b | ||
|
|
bb7bb80b4a | ||
|
|
5cc52fb7b7 | ||
|
|
5ad69b2907 | ||
|
|
ab6896206d | ||
|
|
0653bca323 | ||
|
|
aca74a5394 | ||
|
|
a0ffd1717c | ||
|
|
5478610e59 | ||
|
|
7e99b2dbba | ||
|
|
7fe3fb480d | ||
|
|
e254597c24 | ||
|
|
a30bbe6294 | ||
|
|
9ff54fdf72 | ||
|
|
98811a9675 | ||
|
|
c6e3b17203 | ||
|
|
5b98102677 | ||
|
|
54a41e0812 | ||
|
|
02f1939df2 | ||
|
|
8087cb41e5 | ||
|
|
2e0268cb09 | ||
|
|
f3ec0514cd | ||
|
|
fd134df552 | ||
|
|
2cc3159f73 | ||
|
|
a06ce33472 | ||
|
|
93684737eb | ||
|
|
71622a4515 | ||
|
|
28254def0b | ||
|
|
ff6395fa4e | ||
|
|
b09d2c3c62 | ||
|
|
69cf33e6a1 | ||
|
|
77f307c642 | ||
|
|
9232ec50f1 | ||
|
|
f118aef283 | ||
|
|
88068876ed | ||
|
|
35ab1a1983 | ||
|
|
b7a68a7020 | ||
|
|
cc2513748e | ||
|
|
f6892ce3ff | ||
|
|
94822ee208 | ||
|
|
129cc7cb67 | ||
|
|
df79e9a732 | ||
|
|
83f5414bdb | ||
|
|
6cd874cc47 | ||
|
|
374f210771 | ||
|
|
4c1849ae7c | ||
|
|
2f7b338a4b | ||
|
|
f4cede4747 | ||
|
|
b2ad16f5c8 | ||
|
|
5f0e71ccb4 | ||
|
|
0df40534f3 | ||
|
|
503642e794 | ||
|
|
1b97325418 | ||
|
|
3f42a49a6b | ||
|
|
8ea5fedf19 | ||
|
|
2c93ce5a28 | ||
|
|
a54493b4ae | ||
|
|
09a1f06bbf | ||
|
|
cc96c39e6d | ||
|
|
2229f17911 | ||
|
|
952c9c56b2 | ||
|
|
2b7a211249 | ||
|
|
a9e2592425 | ||
|
|
d553df95b0 | ||
|
|
81fe8060d7 | ||
|
|
7bac10ab6e | ||
|
|
74c5705a9a | ||
|
|
8115301588 | ||
|
|
994f292b3b | ||
|
|
5ed11ddfc3 | ||
|
|
dfc5602fa0 | ||
|
|
12865ce7d0 | ||
|
|
af04307c83 | ||
|
|
a9f18cc4bd | ||
|
|
54b41e42d9 | ||
|
|
0698e61553 | ||
|
|
f440e41819 | ||
|
|
18d67be7a8 | ||
|
|
a88990aa68 | ||
|
|
74b1c11e8c | ||
|
|
4886451000 | ||
|
|
bb10a8aaa1 | ||
|
|
c3329e224d | ||
|
|
705929a40a | ||
|
|
cc6fb4595e | ||
|
|
41f4f269f1 | ||
|
|
d6c7bda6d1 | ||
|
|
d9de1b9926 | ||
|
|
b25c4baeec | ||
|
|
0c33f7fdb4 | ||
|
|
d2a0ec28a0 | ||
|
|
2bb63cbeb3 | ||
|
|
fadb5a1024 | ||
|
|
e23bad3a3a | ||
|
|
fce63b17c6 | ||
|
|
fe555a4098 | ||
|
|
26262cd477 | ||
|
|
6f288ebb56 | ||
|
|
9f3ca66f97 | ||
|
|
eca23a7279 | ||
|
|
f5cfd6e1f1 | ||
|
|
fbf166af1a | ||
|
|
2459eabd66 | ||
|
|
4d4b7adcd8 | ||
|
|
4b0afc855d | ||
|
|
5e2fec714c | ||
|
|
8543695f9d | ||
|
|
d81db3bced | ||
|
|
b4b8ffa0e2 | ||
|
|
aff4e341f9 | ||
|
|
9cceea0d68 | ||
|
|
60f76941ef | ||
|
|
a50ee4f650 | ||
|
|
a10e4fe21e | ||
|
|
43915133a1 | ||
|
|
0cdb5fcfd9 | ||
|
|
a086631607 | ||
|
|
634791acdc | ||
|
|
ff7e729032 | ||
|
|
74083dafed | ||
|
|
e05ab64398 | ||
|
|
6c01aba05b | ||
|
|
7482870164 | ||
|
|
494a9d3825 | ||
|
|
b4601a351c | ||
|
|
f72d2733df | ||
|
|
97140e6a62 | ||
|
|
946790bfb5 | ||
|
|
afbf59019e | ||
|
|
224e9b1009 | ||
|
|
96a924f5f0 | ||
|
|
ea45877ca5 | ||
|
|
2169a62409 | ||
|
|
a498bcd94d | ||
|
|
2e500a8a29 | ||
|
|
911509c80c | ||
|
|
3f6713abc1 | ||
|
|
d6b2199f36 | ||
|
|
545574dad9 | ||
|
|
b1c572e82e | ||
|
|
37e10d4a81 | ||
|
|
03be42ab84 | ||
|
|
ef4a74e201 | ||
|
|
cfb54f0263 | ||
|
|
7aa0840b73 | ||
|
|
c4586c0531 | ||
|
|
8f57606513 | ||
|
|
eec144d901 | ||
|
|
46fc8a8a86 | ||
|
|
cac9da37f9 | ||
|
|
e3e35a5048 | ||
|
|
15a1647c5c | ||
|
|
ac136a21b1 | ||
|
|
53b7055283 | ||
|
|
caf51cf4eb | ||
|
|
5c104c934f | ||
|
|
186e315911 | ||
|
|
e2fd34d7cc | ||
|
|
3f5559df9e | ||
|
|
3a738af510 | ||
|
|
c4d627a877 | ||
|
|
2de8236979 | ||
|
|
26ed411936 | ||
|
|
1f31877d55 | ||
|
|
c854f6617a | ||
|
|
2eaa98ad71 | ||
|
|
4145f87fcd | ||
|
|
233cfcd4a2 | ||
|
|
b1d194505e | ||
|
|
e6339656fc | ||
|
|
146271fa58 | ||
|
|
8de4cf6b10 | ||
|
|
b7b74d1f78 | ||
|
|
9737a45b33 | ||
|
|
b2520f3147 | ||
|
|
0ac40235b8 | ||
|
|
945550f4bd | ||
|
|
c9eb02d9d2 | ||
|
|
2cd6a79016 | ||
|
|
438eadd63a | ||
|
|
a44bfc2730 | ||
|
|
17bf2afa41 | ||
|
|
263134dcd3 | ||
|
|
1ba761086a | ||
|
|
7535326d38 | ||
|
|
2bfafd1fc9 | ||
|
|
7afbfc7003 | ||
|
|
ea78417f7f | ||
|
|
76dc8e1ac8 | ||
|
|
5d85d54026 | ||
|
|
e9f18122e9 | ||
|
|
014595bff5 | ||
|
|
a9074f7bd1 | ||
|
|
5af2c7fc16 | ||
|
|
89b2788d11 | ||
|
|
8e50aeb06f | ||
|
|
3826ca4194 | ||
|
|
f5f4932220 | ||
|
|
18870255ea | ||
|
|
fb027f2024 | ||
|
|
45fea86554 | ||
|
|
398c7060f8 | ||
|
|
3c24e893e9 | ||
|
|
ced37c1001 | ||
|
|
808304e827 | ||
|
|
48f0a5163e | ||
|
|
59f63eaef6 | ||
|
|
0a5c1c9402 | ||
|
|
55b511a5d8 | ||
|
|
88e40193ae | ||
|
|
7ac11ed8e1 | ||
|
|
5a1e69f5b8 | ||
|
|
a41ea27596 | ||
|
|
4d47ce5c60 | ||
|
|
9d20380bd4 | ||
|
|
4a9f05a44f | ||
|
|
f127be4dd2 | ||
|
|
a8204f1bf9 | ||
|
|
f602fa3d9f | ||
|
|
9d3fcf9a0d | ||
|
|
2c9fbb5d40 | ||
|
|
8b6dc446d3 | ||
|
|
e3606461c5 | ||
|
|
9888b81bdc | ||
|
|
bd13834a74 | ||
|
|
d26ae6f81e | ||
|
|
3afcd3f5bc | ||
|
|
2cb31ea546 | ||
|
|
3843e96edc | ||
|
|
3b58be9c76 | ||
|
|
85421f9766 | ||
|
|
ebbac61231 | ||
|
|
c8a5d1c38d | ||
|
|
b81072e750 | ||
|
|
cad97801bf | ||
|
|
66a230c1b7 | ||
|
|
6a8f735641 | ||
|
|
785edf719e | ||
|
|
2437ab9605 | ||
|
|
a1060747f8 | ||
|
|
8cfc4ed9ca | ||
|
|
2a5a735d94 | ||
|
|
d33923942b | ||
|
|
10cdf9a480 | ||
|
|
1d3489fef5 | ||
|
|
af863a3780 | ||
|
|
a3f387274f | ||
|
|
7a7f6638d2 | ||
|
|
d218069f03 | ||
|
|
3e877e0f6a | ||
|
|
0261c57d32 | ||
|
|
ed1ace09e9 | ||
|
|
daee83c10b | ||
|
|
b8678c936b | ||
|
|
01e5a82f1c | ||
|
|
08158a7c34 | ||
|
|
1a0596a2fb | ||
|
|
f3e50b9df2 | ||
|
|
10d3a20f8a | ||
|
|
d7f23c7883 | ||
|
|
c5dbdbe88c | ||
|
|
99da3b9646 | ||
|
|
1532863d83 | ||
|
|
fd62ec89da | ||
|
|
55e7c5a41b | ||
|
|
0dc2600587 | ||
|
|
3e24b9668e | ||
|
|
b1e8c43679 | ||
|
|
53fa65e318 | ||
|
|
46fd60c703 | ||
|
|
4e75aaecd0 | ||
|
|
1177c32679 | ||
|
|
9c24c804fb | ||
|
|
ef802c91e7 | ||
|
|
d453b605d3 | ||
|
|
263e9822ea | ||
|
|
ba77a9ca80 | ||
|
|
339a22752b | ||
|
|
5c884bf6d6 | ||
|
|
c1144a288f | ||
|
|
97aeb1953b | ||
|
|
fd3e9ce2f8 | ||
|
|
cc51cad813 | ||
|
|
5ec92415b0 | ||
|
|
b0c2c3c756 | ||
|
|
94e51de166 | ||
|
|
dafc370d22 | ||
|
|
ea9200a042 | ||
|
|
071a21af16 | ||
|
|
4f85a78daf | ||
|
|
90bc09a31e | ||
|
|
f7a397d527 | ||
|
|
619b4f13fd | ||
|
|
11ef64ef51 | ||
|
|
7b3f7605b8 | ||
|
|
e6b140e7a0 | ||
|
|
72c03268a4 | ||
|
|
5a32c88db3 | ||
|
|
c80e22b6fc | ||
|
|
68d39d1f3f | ||
|
|
a345ef28f2 | ||
|
|
c9f036ed40 | ||
|
|
cf545cd477 | ||
|
|
156b0d286a | ||
|
|
5154e0581e | ||
|
|
12ccd5ec55 | ||
|
|
35e3d99f62 | ||
|
|
0edd739609 | ||
|
|
77ff17cc8d | ||
|
|
9cdffe5e8c | ||
|
|
0865c9d381 | ||
|
|
20a787adb4 | ||
|
|
b9dc23c070 | ||
|
|
cbeac094ef | ||
|
|
a24fabbb6f | ||
|
|
379258112a | ||
|
|
f99b9ddcf1 | ||
|
|
b13adfc228 | ||
|
|
a1a4959071 | ||
|
|
d6cbd5be92 | ||
|
|
ab4194f752 | ||
|
|
473bdf48f6 | ||
|
|
78f51792a7 | ||
|
|
da5008f4d8 | ||
|
|
f391a9eaa5 | ||
|
|
e92d90ce9c | ||
|
|
e901317fd7 | ||
|
|
66b0c67f54 | ||
|
|
e674f11df2 | ||
|
|
a61f68f0fe | ||
|
|
df00d74db8 | ||
|
|
4fbbb999b9 | ||
|
|
1e16b3e134 | ||
|
|
70f40a03cb | ||
|
|
b4306314aa | ||
|
|
5258bc4318 | ||
|
|
9f7d19a937 | ||
|
|
c17f147be9 | ||
|
|
1a6ad20943 | ||
|
|
f34360bba7 | ||
|
|
b8856c71d1 | ||
|
|
72f0783b60 | ||
|
|
591eb23e0f | ||
|
|
943216deda | ||
|
|
011b53fb97 | ||
|
|
37b9cd5974 | ||
|
|
62389f07b8 | ||
|
|
c981559c16 | ||
|
|
3fccdabd32 | ||
|
|
de43911a68 | ||
|
|
b9db977a2d | ||
|
|
1662e02c1b | ||
|
|
2e48739a4e | ||
|
|
4c1b85cdcd | ||
|
|
30fcb14017 | ||
|
|
a2936c4c20 | ||
|
|
a7c349bc6e | ||
|
|
95454ecde0 | ||
|
|
041a84e8f9 | ||
|
|
21eb7e8e64 | ||
|
|
ee21cc163f | ||
|
|
844c20106b | ||
|
|
0c50154c83 | ||
|
|
c60f77d5ab | ||
|
|
9bcc38e995 | ||
|
|
b249243a9f | ||
|
|
90e5964703 | ||
|
|
a393a6e0c5 | ||
|
|
3d07571029 | ||
|
|
5555a24479 | ||
|
|
a39fc94dde | ||
|
|
3af57f3e92 | ||
|
|
12917d323d | ||
|
|
845783a457 | ||
|
|
7d039a5467 | ||
|
|
03068a9388 | ||
|
|
9a9d85fadc | ||
|
|
448ae64d8e | ||
|
|
6ee16c0aae | ||
|
|
7c443fbef2 | ||
|
|
d72cd5b2d6 | ||
|
|
354a26963b | ||
|
|
2c069a5685 | ||
|
|
da206012e2 | ||
|
|
73bc614a4b | ||
|
|
ec03887040 | ||
|
|
4672866eec | ||
|
|
601a910f4e | ||
|
|
6145f08cc8 | ||
|
|
69bc5e189b | ||
|
|
1a1dbef992 | ||
|
|
590e029198 | ||
|
|
fb0970ec6e | ||
|
|
73cf490635 | ||
|
|
63d456127b | ||
|
|
39240516f3 | ||
|
|
323108e2ba | ||
|
|
1c3106e56e | ||
|
|
3225878f63 | ||
|
|
fe2a092f1c | ||
|
|
68d524fc2a | ||
|
|
b124071e10 | ||
|
|
9984b26a32 | ||
|
|
178cfc1623 | ||
|
|
a51f2b0716 | ||
|
|
164e1e2341 | ||
|
|
d1fb384a4a | ||
|
|
765d877dfa | ||
|
|
294b026aca | ||
|
|
825c80a48f | ||
|
|
2bb89c6fde | ||
|
|
07b96fa15d | ||
|
|
de2861969b | ||
|
|
b16f489d58 | ||
|
|
539aaf08b5 | ||
|
|
4a093294ac | ||
|
|
cd0aacccbd | ||
|
|
44bd9d1013 | ||
|
|
dd5165c92c | ||
|
|
468faf4e2b | ||
|
|
65dc8d0c74 | ||
|
|
e9538dbc7f | ||
|
|
d79615f96b | ||
|
|
d10fa4a8cb | ||
|
|
6be4b07e17 | ||
|
|
d30bdd4cb3 | ||
|
|
de628ac963 | ||
|
|
e77872f9c6 | ||
|
|
04aa906fac | ||
|
|
7998a7696d | ||
|
|
b1f1bb1389 | ||
|
|
49581f9e1c | ||
|
|
b2f2abcb22 | ||
|
|
3139d0dc20 | ||
|
|
f6fd65b41c | ||
|
|
e82334942a | ||
|
|
be3df58ca4 | ||
|
|
2ff3b84452 | ||
|
|
f7277b5b9f | ||
|
|
07a4cc0c48 | ||
|
|
aaa644b223 | ||
|
|
0cdbc004e6 | ||
|
|
fb2d87bf4f | ||
|
|
0a3f62d8d4 | ||
|
|
cef6e0895a | ||
|
|
f43379c771 | ||
|
|
603f64d731 | ||
|
|
a380865655 | ||
|
|
f46ec0253d | ||
|
|
736d21fce8 | ||
|
|
3d3c50f927 | ||
|
|
6aa9f69b19 | ||
|
|
e170e03f8c | ||
|
|
9e8d182fe1 | ||
|
|
777408ff8d | ||
|
|
92dd9072cd | ||
|
|
2bcf81fb9e | ||
|
|
b369fa9013 | ||
|
|
ab2ad7ba45 | ||
|
|
9558b3afa7 | ||
|
|
a8f4aa4796 | ||
|
|
6b88d0f94e | ||
|
|
3d11dd077c | ||
|
|
479b286600 | ||
|
|
5ddc50473a | ||
|
|
7a09af73ec | ||
|
|
62df7ab730 | ||
|
|
e44ba8b9c4 | ||
|
|
28cfd8a513 | ||
|
|
02266eafd8 | ||
|
|
8fa81fe003 | ||
|
|
79d9c9cd56 | ||
|
|
b82e1d7fcb | ||
|
|
50af08a6f3 | ||
|
|
b569e8bab0 | ||
|
|
b41d386d02 | ||
|
|
edc8383e22 | ||
|
|
d2a7cd6c5a | ||
|
|
4768d4ff93 | ||
|
|
ae52c964c2 | ||
|
|
dc024cf411 | ||
|
|
58a2009cc1 | ||
|
|
0318a9a9bc | ||
|
|
427766ac69 | ||
|
|
41dad1ea1e | ||
|
|
96e2c717fc | ||
|
|
fddc98858a | ||
|
|
6404aaf411 | ||
|
|
760bd8d8a4 | ||
|
|
2d136d58bf | ||
|
|
5277138c99 | ||
|
|
84292ad890 | ||
|
|
7a33e588d4 | ||
|
|
05d8885a1a | ||
|
|
076ddfd66b | ||
|
|
c1e6624f8f | ||
|
|
19b6c5c802 | ||
|
|
91452ec9cb | ||
|
|
4d9f138e32 | ||
|
|
ea5acb7987 | ||
|
|
af0f1a7542 | ||
|
|
c2d39a7ab7 | ||
|
|
ac238838f2 | ||
|
|
c1dfee6575 | ||
|
|
7659648594 | ||
|
|
bfd531281a | ||
|
|
15edc96540 | ||
|
|
7669ab83e1 | ||
|
|
7296b647ef | ||
|
|
043a9e0e7e | ||
|
|
c1cfe5f5f0 | ||
|
|
d1204c7cf3 | ||
|
|
6962c04f66 | ||
|
|
c271754962 | ||
|
|
bd3c36ce6d | ||
|
|
12c8b00556 | ||
|
|
747f2cfe26 | ||
|
|
72d993d60c | ||
|
|
619bc4caae | ||
|
|
a14762a16c | ||
|
|
738e8f0028 | ||
|
|
b5f35b82e1 | ||
|
|
3aeadb9f0c | ||
|
|
f667d4d887 | ||
|
|
6c1d671c7e | ||
|
|
be9caeb915 | ||
|
|
ffe734edf7 | ||
|
|
ef6c9e7df6 | ||
|
|
309a02efa1 | ||
|
|
9678a5a328 | ||
|
|
5f9980fb6b | ||
|
|
42e95e2877 | ||
|
|
c5e1f0b6af | ||
|
|
6eecf96710 | ||
|
|
62a8cc2825 | ||
|
|
948cc03031 | ||
|
|
135b50a650 | ||
|
|
b2cec6275c | ||
|
|
573c6d60ba | ||
|
|
c863ad442f | ||
|
|
50ee5ef24c | ||
|
|
c80b5f4f4c | ||
|
|
6594937a65 | ||
|
|
19db886645 | ||
|
|
516d7da641 | ||
|
|
16b4fa7ea7 | ||
|
|
580f73df94 | ||
|
|
41d3ea231b | ||
|
|
3dd59c3d5f | ||
|
|
bbf77a7efb | ||
|
|
62ea1bd43e | ||
|
|
07ae65dfc7 | ||
|
|
a6e0ea3e23 | ||
|
|
ee410b2cf1 | ||
|
|
d3b8581ce0 | ||
|
|
5c15a19c32 | ||
|
|
dabb8ffdaa | ||
|
|
b5e40f52c2 | ||
|
|
d41ed768dc | ||
|
|
382467904a | ||
|
|
617c23618b | ||
|
|
e47decbdc5 | ||
|
|
47a9d14ba6 | ||
|
|
89af666093 | ||
|
|
5fc28970b4 | ||
|
|
f366e3feea | ||
|
|
cfc4c8cbfa | ||
|
|
db82160eef | ||
|
|
0599fbf7d8 | ||
|
|
13d607698e | ||
|
|
50641c4152 | ||
|
|
1c47cb24af | ||
|
|
dda139a557 | ||
|
|
ea7791f66e | ||
|
|
025852c805 | ||
|
|
172311fad8 | ||
|
|
f66f55b4ed | ||
|
|
a00420bafd | ||
|
|
a49683e93f | ||
|
|
d3aeca104e | ||
|
|
180c7b4b79 | ||
|
|
4d3ae04e2b | ||
|
|
04b9a789ff | ||
|
|
2df3e7b0fc | ||
|
|
215008f78c | ||
|
|
a77b2363ef | ||
|
|
8dea6f53bb | ||
|
|
ccb3c6fac6 | ||
|
|
c46d06f34c | ||
|
|
87c6f33bcc | ||
|
|
941ccf87c8 | ||
|
|
b6b5ed9c89 | ||
|
|
1dc3957e72 | ||
|
|
ef39e72c7c | ||
|
|
de7cadb9b2 | ||
|
|
145e110915 | ||
|
|
4d1f0ec07b | ||
|
|
555da95cf5 | ||
|
|
a48a08d314 | ||
|
|
0757f54882 | ||
|
|
715064abeb | ||
|
|
84060e6124 | ||
|
|
6b0d93cea3 | ||
|
|
a4ee80832a | ||
|
|
e699d107a1 | ||
|
|
a8486c6b7e | ||
|
|
dcdd82ce85 | ||
|
|
3ee766bc01 | ||
|
|
d092722ae8 | ||
|
|
ddf0d3fc53 | ||
|
|
55084b30ef | ||
|
|
4167bf5b24 | ||
|
|
6d60b817f3 | ||
|
|
60a509bea1 | ||
|
|
5c776db9b1 | ||
|
|
0b35227bf5 | ||
|
|
4f25cc1cbd | ||
|
|
c8397b098e | ||
|
|
f5b15c9b4d | ||
|
|
0dfe2dbff0 | ||
|
|
9c26c5829e | ||
|
|
e312b93cb0 | ||
|
|
bce6d124af | ||
|
|
5f3a259827 | ||
|
|
ca60a034c7 | ||
|
|
a9f0b31a15 | ||
|
|
6752266673 | ||
|
|
bfa66861ef | ||
|
|
5e4b3a8fb6 | ||
|
|
b37b2fa7e7 | ||
|
|
e136222ae2 | ||
|
|
749b2b0aac | ||
|
|
6773fe6a42 | ||
|
|
9e97f9e406 | ||
|
|
87073b4fbe | ||
|
|
1361391ed9 | ||
|
|
69bb4ae670 | ||
|
|
17255bc065 | ||
|
|
29f9794dcf | ||
|
|
b1c882a26b | ||
|
|
70939ad517 | ||
|
|
a9d2bfada4 | ||
|
|
ed8ee24fcc | ||
|
|
8fc72e8978 | ||
|
|
8a981dc8e8 | ||
|
|
1dc4c4757e | ||
|
|
c3c600dfa3 | ||
|
|
a90343022a | ||
|
|
4f7380147d | ||
|
|
96e65fa641 | ||
|
|
f9862f1c15 | ||
|
|
21e2928313 | ||
|
|
7da85f5a4f | ||
|
|
901db4797e | ||
|
|
f8ded46ad6 | ||
|
|
4c81d9a9ac | ||
|
|
a3f46a3ccb | ||
|
|
7d6ceeac56 | ||
|
|
9d6d94b5f5 | ||
|
|
52dbbcb23f | ||
|
|
2b739e1eb6 | ||
|
|
2a5891809a | ||
|
|
06c4938120 | ||
|
|
801d9a5abc | ||
|
|
a7a24096f4 | ||
|
|
2fbaceb2b1 | ||
|
|
89ef6eef57 | ||
|
|
df84da5913 | ||
|
|
808ca676b6 | ||
|
|
288ec84c21 | ||
|
|
481c4954af | ||
|
|
332ea8853f | ||
|
|
817766acdc | ||
|
|
45b301856c | ||
|
|
df6c8eaed7 | ||
|
|
6ef8639971 | ||
|
|
125901e4e2 | ||
|
|
ca3c992037 | ||
|
|
58f230d632 | ||
|
|
56b71281b3 | ||
|
|
d2398dacfe | ||
|
|
396248d4f9 | ||
|
|
7ad2e6ace3 | ||
|
|
4b5edd3c03 | ||
|
|
f59c3bd726 | ||
|
|
b0da9ac780 | ||
|
|
b25bf062fb | ||
|
|
3f5d917b39 | ||
|
|
15c1fc873c | ||
|
|
dbd3a77908 | ||
|
|
8b034b8d1d | ||
|
|
63cd9209f1 | ||
|
|
452a622459 | ||
|
|
7f6da78be3 | ||
|
|
1b4359eaec | ||
|
|
963a9a7428 | ||
|
|
b3575180e1 | ||
|
|
80db2cec99 | ||
|
|
72e3cfdfb8 | ||
|
|
7a52712b38 | ||
|
|
3d597aae92 | ||
|
|
e766f6e4ad | ||
|
|
9aebe2f1ef | ||
|
|
57c2c4134c | ||
|
|
c55183f71a | ||
|
|
48928d4b25 | ||
|
|
3fa8796668 | ||
|
|
dbc7e7c16b | ||
|
|
77760090e2 | ||
|
|
57b61a9141 | ||
|
|
95e0309263 | ||
|
|
754d6afd16 | ||
|
|
09316b35d7 | ||
|
|
6e15ab6385 | ||
|
|
df18d22a93 | ||
|
|
f67814fc97 | ||
|
|
cf70dc4f1c | ||
|
|
56345ff997 | ||
|
|
e7fda9c4be | ||
|
|
e26fcd15db | ||
|
|
9d07e95351 | ||
|
|
99c1f4f375 | ||
|
|
2eb4fe6469 | ||
|
|
dcd1e419c0 | ||
|
|
fa041bddc2 | ||
|
|
7d8e63c05b | ||
|
|
ab94344bae | ||
|
|
f13fac0fb4 | ||
|
|
f4e7d7fbb4 | ||
|
|
272be10914 | ||
|
|
c47c495aca | ||
|
|
f6c73b35f9 | ||
|
|
913b513929 | ||
|
|
60480ff4ed | ||
|
|
4e8531f4a2 | ||
|
|
d446d328d8 | ||
|
|
027ed82c2c | ||
|
|
3164b16196 | ||
|
|
a053eb2205 | ||
|
|
1da2425612 | ||
|
|
0c55ddf0fc | ||
|
|
6fb7590280 | ||
|
|
292737fa2b | ||
|
|
15eeac5d4b | ||
|
|
e77c06e8c3 | ||
|
|
324301e3bc | ||
|
|
3ca74d8693 | ||
| 52fd151c9c | |||
| 78972cc879 | |||
|
|
5fe746f643 | ||
|
|
f0d02fcbf0 | ||
|
|
4254ae6d5b | ||
|
|
59430ea26d | ||
|
|
d7aa790e4b | ||
|
|
1763ffe245 | ||
|
|
c424ad844b | ||
|
|
69eb2efced | ||
|
|
1bf6c588e7 | ||
|
|
7d1a62e4ba | ||
|
|
c344d48840 | ||
|
|
31cc71f7fb | ||
|
|
b823cbd089 | ||
|
|
060b84a0fa | ||
|
|
55a9e2d697 | ||
|
|
05ff3feea5 | ||
|
|
acb9bd7618 | ||
|
|
0ea31ec15d | ||
|
|
feef177858 | ||
|
|
11de8fdca7 | ||
|
|
dd05aafb9b | ||
|
|
3ace9ea9ea | ||
|
|
3f9b0f764d | ||
|
|
df663e42e9 | ||
|
|
7e2a3bf52e | ||
|
|
b67c53edfa | ||
|
|
9be61fec41 | ||
|
|
87ddd64481 | ||
|
|
47212ee31e | ||
|
|
7b4521f039 | ||
|
|
59c6ed34fd | ||
|
|
fd3178b2fe | ||
|
|
e2bfe91700 | ||
|
|
c669f7563c | ||
|
|
a7a66e9399 | ||
|
|
b68517fbab | ||
|
|
028915d6f7 | ||
|
|
a42515abbc | ||
|
|
704d0c606b | ||
|
|
c5aa2e9300 | ||
|
|
f190bb2c26 | ||
|
|
c63376c5fa | ||
|
|
4ae4cc11e0 | ||
|
|
a3a690dc01 | ||
|
|
ed9db80760 | ||
|
|
50f5d27c43 | ||
|
|
d012fd1553 | ||
|
|
355abc835e | ||
|
|
97bc95183d | ||
|
|
43f7ca7985 | ||
|
|
28383afa11 | ||
|
|
688f0e388b | ||
|
|
be6b49c712 | ||
|
|
168e23e466 | ||
|
|
9d91111b1b | ||
|
|
d08747d374 | ||
|
|
64d457dad9 | ||
|
|
283e07254e | ||
|
|
55cbeb6fc6 | ||
|
|
85fbdefe77 | ||
|
|
f24c225664 | ||
|
|
adf9b2108f | ||
|
|
6aca9762c9 | ||
|
|
e1531854fd | ||
|
|
a15ed0b912 | ||
|
|
bd4188a092 | ||
|
|
4f2f571536 | ||
|
|
fa1edb2a01 | ||
|
|
4dfba2f8ac | ||
|
|
844b674a1e | ||
|
|
a0aba2b9c0 | ||
|
|
e203ce9ce5 | ||
|
|
46f1a0719e | ||
|
|
008799dc52 | ||
|
|
dc82fd556b | ||
|
|
7dc6b1da08 | ||
|
|
1a3d467ba4 | ||
|
|
450c06ee09 | ||
|
|
efaf09da31 | ||
|
|
c7deb37d36 | ||
|
|
bd79c0c0de | ||
|
|
20bc52ae59 | ||
|
|
893bde1f78 | ||
|
|
cd0b2e31aa | ||
|
|
aec39fd027 | ||
|
|
7a144413d1 | ||
|
|
fd89cdd197 | ||
|
|
ba98d4ce9c | ||
|
|
bbf8334166 | ||
|
|
c9279e8d3a | ||
|
|
f6482699a0 | ||
|
|
9c904358a9 | ||
|
|
b714f5d650 | ||
|
|
dc9d338612 | ||
|
|
7e295973db | ||
|
|
d882ff6328 | ||
|
|
1b86e5fc83 | ||
|
|
cec9a69a15 | ||
|
|
fbadfd5998 | ||
|
|
5360a41618 | ||
|
|
e02811054e | ||
|
|
09c44743b0 | ||
|
|
1936cd3f38 | ||
|
|
cb47d9edee | ||
|
|
41f62d84cb | ||
|
|
59e43a2be4 | ||
|
|
554f82fe9b | ||
|
|
74e01423eb | ||
|
|
b6951007b0 | ||
|
|
37d784bcdc | ||
|
|
dcb59178f8 | ||
|
|
f0d7073a12 | ||
|
|
71ac9d16a7 | ||
|
|
c16ef428ab | ||
| ec1aec1921 | |||
|
|
4bc24c4f60 | ||
|
|
c62b708012 | ||
|
|
5354aeab4c | ||
|
|
13dd27a047 | ||
|
|
eceb21a017 | ||
|
|
ad466b3edb | ||
|
|
beee58a56f | ||
|
|
684f2673ce | ||
|
|
19fab4af5a | ||
|
|
b5e5805bb4 | ||
|
|
c7b42d80b3 | ||
|
|
cf79316002 | ||
|
|
d5a71a4b8a | ||
|
|
17f13ecc2c | ||
|
|
77eeecbfd9 | ||
|
|
a126897f52 | ||
|
|
6545aa99a9 | ||
|
|
98aa8c5923 | ||
|
|
3df7dea2cc | ||
|
|
4b344812bf | ||
|
|
5412bf66c3 | ||
|
|
3bd65fbae5 | ||
|
|
bda734223e | ||
|
|
cc78249226 | ||
|
|
fb422ccf5e | ||
|
|
61bf4a16a7 | ||
|
|
1c6bf9a150 | ||
|
|
7390dc7dab | ||
|
|
345334aaf1 | ||
|
|
d5f942a971 | ||
|
|
20b8d5169d | ||
|
|
f4940c9aec | ||
|
|
aeb5385217 | ||
|
|
e3041e8ca8 | ||
|
|
4a40919228 | ||
|
|
aefabc5353 | ||
|
|
4c75a60bd3 | ||
|
|
99edeed2e7 | ||
|
|
16ca9c8c7c | ||
|
|
3d7b96aeb1 | ||
|
|
5d190a5615 | ||
|
|
548e6893cd | ||
|
|
88fd5d7daa | ||
|
|
1593f4e3a8 | ||
|
|
6d974593c7 | ||
|
|
b4dcbb79b2 | ||
|
|
cb0126131a | ||
|
|
4f9c8b7361 | ||
|
|
b436666e85 | ||
|
|
298756eef8 | ||
|
|
8161178415 | ||
|
|
4eb1fe18e5 | ||
|
|
c209165d43 | ||
|
|
089e2cc099 | ||
|
|
b24fdcab35 | ||
|
|
6a1a2c7c7b | ||
|
|
ab02a034f6 | ||
|
|
c69b67f453 | ||
|
|
b3c7746a7f | ||
|
|
2262efc311 | ||
|
|
06894be294 | ||
|
|
45974978ef | ||
|
|
a15f3361aa | ||
|
|
1f760bded8 | ||
|
|
fe86731057 | ||
|
|
f6c0a23fa8 | ||
|
|
c103a05579 | ||
|
|
1447df3fa6 | ||
|
|
5cf8b998d1 | ||
|
|
f1028b5f96 | ||
|
|
88af5815ee | ||
|
|
c8d0509eb2 | ||
|
|
2933451195 | ||
|
|
5bb12793a0 | ||
|
|
a4a0cf826b | ||
|
|
a580e870c3 | ||
|
|
bb239052ea | ||
|
|
8b531f3fba | ||
|
|
aab28748bb | ||
|
|
09e6127435 | ||
|
|
823ff779ca | ||
|
|
8d75c3d339 | ||
|
|
c7629bdd56 | ||
|
|
6ff614caae | ||
|
|
1c953d44b0 | ||
|
|
852cbca9d4 | ||
|
|
e5d2fae801 | ||
|
|
b5e26130d7 | ||
|
|
8d58093328 | ||
|
|
df80ad8e6e | ||
|
|
0688709c4f | ||
|
|
24e4574470 | ||
|
|
05d4b8cf50 | ||
|
|
ca737e6f7c | ||
|
|
012cc466a4 | ||
|
|
91a88cf568 | ||
|
|
3206d9a5da | ||
|
|
9f94712ad1 | ||
|
|
bc0a135524 | ||
|
|
570ac05145 | ||
|
|
a647ab83df | ||
|
|
6da25c8893 | ||
|
|
e9aefccdb5 | ||
|
|
38798446b5 | ||
|
|
6d9c2c5254 | ||
|
|
ae47c23aa6 | ||
|
|
a60700b1c5 | ||
|
|
a1d539941d | ||
|
|
9b36d33df1 | ||
|
|
6e624b9c6a | ||
|
|
4b767ff080 | ||
|
|
db4a8f5d1a | ||
|
|
b897603cfa | ||
|
|
a63555abc1 | ||
|
|
c23d2028a8 | ||
|
|
cea079a022 | ||
|
|
4745dda9e6 | ||
|
|
f7f723c590 | ||
|
|
122859447e | ||
|
|
fd0ea85549 | ||
|
|
2b0356c61f | ||
|
|
3c6812f2c1 | ||
|
|
15d80a8c46 | ||
|
|
8587d8edf0 | ||
|
|
2ec7f98c90 | ||
|
|
623f8d3b8c | ||
|
|
76008ce304 | ||
|
|
7b95818c4f | ||
|
|
21ddb6b9b9 | ||
|
|
bd2044fb39 | ||
|
|
22f6869bdf | ||
|
|
14f52c52cb | ||
|
|
091c5106ef | ||
|
|
62d316bffb | ||
|
|
2ef29c2cec | ||
|
|
f6b9f101dc | ||
|
|
661743ebff | ||
|
|
15b59bee1b | ||
|
|
f9bda0ff93 | ||
|
|
d33f6214f1 | ||
|
|
f4c32139f5 | ||
|
|
27fc84a157 | ||
|
|
3c32d046bf | ||
|
|
8670215ecc | ||
|
|
38d99b11c1 | ||
|
|
f7ebbacf58 | ||
|
|
6049776b26 | ||
|
|
86ae707b08 | ||
|
|
a47eaa521b | ||
|
|
b8884ccc8b | ||
|
|
b95865939f | ||
|
|
d79b0a6b17 | ||
|
|
4b9099358f | ||
|
|
08cbb03bdd | ||
|
|
f543c8415d | ||
|
|
67d9aef4c7 | ||
|
|
da48fc9d45 | ||
|
|
ddd2a90eee | ||
|
|
73de5f7980 | ||
|
|
1d287d066b | ||
|
|
21d331c8cc | ||
|
|
036a1490e3 | ||
|
|
3c743f2664 | ||
|
|
0db68a8f4d | ||
|
|
cc68964d13 | ||
|
|
5cfd28b78a | ||
|
|
6c7195b130 | ||
|
|
aa95526428 | ||
|
|
b263690e66 | ||
|
|
1f3a3fe5a0 | ||
|
|
fb5ca35293 | ||
|
|
1ae4616ee2 | ||
|
|
862d5a06fd | ||
|
|
8e52d922cc | ||
|
|
5ab4f09b2f | ||
|
|
4acca8b90b | ||
|
|
13364f90fe | ||
|
|
f3f549b455 | ||
|
|
48a3aafdd2 | ||
|
|
76d6fb03f0 | ||
|
|
eba80f7a99 | ||
|
|
52328c88cd | ||
|
|
74cc55b107 | ||
|
|
f724647a45 | ||
|
|
dec5c50c45 | ||
|
|
2f0e0bdcaf | ||
|
|
9017c9d29a | ||
|
|
d3e5ba83eb | ||
|
|
d714479924 | ||
|
|
01c1296197 | ||
|
|
1782ceab35 | ||
|
|
4015023e01 | ||
|
|
7bbd449f06 | ||
|
|
fdd3e91753 | ||
|
|
7a1b4ccc9b | ||
|
|
f09537bbc4 | ||
|
|
fa11a4294a | ||
|
|
f2c960e89b | ||
|
|
e1fe7e71a1 | ||
|
|
839b791253 | ||
|
|
a9d094ab74 | ||
|
|
e5274959f2 | ||
|
|
0015db1c4c | ||
|
|
48e558b2d6 | ||
|
|
2c15d12f2f | ||
|
|
816ff05253 | ||
|
|
dddc437ea7 | ||
|
|
fe1a297889 | ||
|
|
2309e60c0d | ||
|
|
9c25306877 | ||
|
|
3f380ded6b | ||
|
|
c5593ec074 | ||
|
|
1df3bcf392 | ||
|
|
91cc23f9b7 | ||
|
|
cf3b40207e | ||
|
|
af7a0eedf0 | ||
|
|
8172a2ca9d | ||
|
|
655f223916 | ||
|
|
56b7f3ba64 | ||
|
|
b5373978d8 | ||
|
|
bc510e714f | ||
|
|
d8c8c5f005 | ||
|
|
53fcc5a3a2 | ||
|
|
aaa61d06e3 | ||
|
|
b61214db41 | ||
|
|
d7517409e9 | ||
|
|
14ad7d31db | ||
|
|
53853289eb | ||
|
|
521a14e942 | ||
|
|
994c066b21 | ||
|
|
bec42671b1 | ||
|
|
28aabb4d5c | ||
|
|
7e8816ad6f | ||
|
|
8eda4bb473 | ||
|
|
101531bc69 | ||
|
|
75d497bcc8 | ||
|
|
fb833b25d5 | ||
|
|
2dd9407f21 | ||
|
|
6a72084198 | ||
|
|
f21cf15c38 | ||
|
|
beb9446f30 | ||
|
|
6a046f55c4 | ||
|
|
2bd7040fe0 | ||
|
|
02b3f62460 | ||
|
|
b923324e73 | ||
|
|
2cb703913d | ||
|
|
f289863088 | ||
|
|
c3918bae57 | ||
|
|
2138b04e45 | ||
|
|
c7cf38186d | ||
|
|
08a2d962e3 | ||
|
|
b2f5511de2 | ||
|
|
b03037e512 | ||
|
|
9ace50a18a | ||
|
|
d9f62a43cb | ||
| 014857b34b | |||
|
|
e335c74ac6 | ||
|
|
1164d5285f | ||
|
|
12e2a26406 | ||
|
|
06a610fd0c | ||
|
|
34bcb069cf | ||
|
|
449756ef27 | ||
|
|
e29cbf694b | ||
|
|
3ac03a31d8 | ||
|
|
62fab2e9c4 | ||
|
|
32c616b5dd | ||
|
|
86288f14f1 | ||
|
|
c2e49dc87f | ||
|
|
1683eb913d | ||
|
|
23b23dd2b8 | ||
|
|
100603a60b | ||
|
|
4c3b4cacfa | ||
|
|
a0872e8761 | ||
|
|
ccd87a33b6 | ||
|
|
b5c03a7085 | ||
|
|
7654106a2c | ||
|
|
f4a98e909c | ||
|
|
b9e8e3cd1f | ||
|
|
ba6e1b6772 | ||
|
|
1fe3ed87eb | ||
|
|
0d92c65829 | ||
|
|
3ae24d9f9a | ||
|
|
11906370c9 | ||
|
|
e17253071e | ||
|
|
2d3f1a10bf | ||
|
|
4382389e6f | ||
|
|
9ea809bef7 | ||
|
|
585597a252 | ||
|
|
0e8d146184 | ||
|
|
121903b6ee | ||
|
|
6697544cdf | ||
|
|
9b98ad7794 | ||
|
|
f7bb3803af | ||
|
|
245e995392 | ||
|
|
1ca11dcd94 | ||
|
|
836d5c2eac | ||
|
|
2b003477df | ||
|
|
64a333eeaf | ||
|
|
9ad94f0815 | ||
|
|
de9f9e8504 | ||
|
|
93100a7517 | ||
|
|
87811ec3a0 | ||
|
|
ba26ca9e41 | ||
|
|
569a050e82 | ||
|
|
9a10849afd | ||
|
|
ded38d30b6 | ||
|
|
b02ac1267a | ||
|
|
7d18d0c1ed | ||
|
|
361f057927 | ||
|
|
b61cf8d81f | ||
|
|
39ee12d1ac | ||
|
|
2a2699bef6 | ||
|
|
5c3fcc7490 | ||
|
|
2d1fecc804 | ||
|
|
0aef043867 | ||
|
|
caa232823e | ||
|
|
e8b94d0024 | ||
|
|
d1b588375b | ||
|
|
245a7b72a6 | ||
|
|
9353385aa9 | ||
|
|
e6d79103ae | ||
|
|
6493c164fc | ||
|
|
4cc33f8de6 | ||
|
|
728622f09d | ||
|
|
c135c7f376 | ||
|
|
4a8cd03de1 | ||
|
|
fed1960424 | ||
|
|
0c0ac06fc7 | ||
|
|
7961103ee6 | ||
|
|
05ea9fd296 | ||
|
|
eaf4d19dbb | ||
|
|
6bfff29d22 | ||
|
|
a516d1123f | ||
|
|
02b1b53153 | ||
|
|
fc955b1591 | ||
|
|
c503cf990b | ||
|
|
85df32907f | ||
|
|
df4184e478 | ||
|
|
1c4accfa39 | ||
|
|
b7dd33b76e | ||
|
|
182a8d7120 | ||
|
|
2b6b0ffcd2 | ||
|
|
4a8dd7e96d | ||
|
|
44de3d49a8 | ||
|
|
580a191cc8 | ||
|
|
aeeb40e02c | ||
|
|
1768057e87 | ||
|
|
4c5a2380d0 | ||
|
|
867a9c551f | ||
|
|
ea6b363c86 | ||
|
|
eefb6842a0 | ||
|
|
f3f33a6455 | ||
|
|
d622ab480f | ||
|
|
35df2a0ac7 | ||
|
|
f8b5bf55a0 | ||
|
|
4d7989a9c0 | ||
|
|
9770d122fb | ||
|
|
ef87941235 | ||
|
|
db62fe679a | ||
|
|
3a4eb6514f | ||
|
|
f47484c266 | ||
|
|
a2a1cfac30 | ||
|
|
c8311f911b | ||
|
|
d12ea41614 | ||
|
|
93c7f85c80 | ||
|
|
493de0f988 | ||
|
|
e8e74fba62 | ||
|
|
7641c3b973 | ||
|
|
1a6f6ff8e4 | ||
|
|
4a4d84ba42 | ||
|
|
bcb6e20b5f | ||
|
|
c1a6637293 | ||
|
|
18e9f74738 | ||
|
|
5dd420f7ff | ||
|
|
e8cf6a9072 | ||
|
|
c3c5951d44 | ||
|
|
96534e598e | ||
|
|
76e0373576 | ||
|
|
2cd166b573 | ||
|
|
137a30ad75 | ||
|
|
de5a9d72dc | ||
|
|
92ed5d7bf2 | ||
|
|
11cbeb87ad | ||
|
|
1ed0e45fc2 | ||
|
|
b6822b86ac | ||
|
|
e72cebbad6 | ||
|
|
9efe1053aa | ||
|
|
b20df07eff | ||
|
|
4b54d966b0 | ||
|
|
2acee61394 | ||
|
|
ca46705df3 | ||
|
|
c059e2543b | ||
|
|
401dd1f84b | ||
|
|
053277ee17 | ||
|
|
1ac0cc140d | ||
|
|
ee854a71a3 | ||
|
|
7f5f6ae994 | ||
|
|
65f15abac2 | ||
|
|
5f08ebdfc8 | ||
|
|
d8f2a61c39 | ||
|
|
3e97d3e710 | ||
|
|
e1ccc07841 | ||
|
|
a5c857b302 | ||
|
|
17d776d4e7 | ||
|
|
3700bc83b3 | ||
|
|
4513bd6ea3 | ||
|
|
bbc034cd3d | ||
|
|
b735b9dbed | ||
|
|
24e53ad591 | ||
|
|
1835f1ab14 | ||
|
|
3123cc69c4 | ||
|
|
96ebf5bc3f | ||
|
|
86d2154d71 | ||
|
|
94c5ceab36 | ||
|
|
cac760aa6f | ||
|
|
b0e33f6a11 | ||
| e1b4e9b7c7 | |||
|
|
9da79c880e | ||
|
|
2e80f37709 | ||
|
|
b0dd645e27 | ||
|
|
933add6cd8 | ||
|
|
2029c4e87e | ||
|
|
498fec64e2 | ||
|
|
dfa2581ffd | ||
|
|
4b247eacd8 | ||
|
|
5704bc8c93 | ||
|
|
88ae7a9b21 | ||
|
|
64e5691fe7 | ||
|
|
168aa394db | ||
|
|
e7ae5a3070 | ||
|
|
b50f46d4be | ||
|
|
f6d1b63ecd | ||
|
|
8cf03d2d00 | ||
|
|
24b4f28b9f | ||
|
|
0bc3432106 | ||
|
|
65bd07bb0b | ||
|
|
592c190069 | ||
|
|
8640d37149 | ||
|
|
6333cffa7d | ||
|
|
200669216e | ||
|
|
bac233e99b | ||
|
|
533d8dda96 | ||
|
|
6ddd8583da | ||
|
|
761f9a938e | ||
|
|
0bf999f52a | ||
|
|
a88cdaca6a | ||
|
|
1e524f1b98 | ||
|
|
20c25f61d9 | ||
|
|
85bd46a4e1 | ||
|
|
4bece22c92 | ||
|
|
05139e2aee | ||
|
|
2c85f42330 | ||
|
|
ef58adacd3 | ||
|
|
fd661c1d57 | ||
|
|
b334289669 | ||
|
|
12cf5e51c2 | ||
|
|
777542c716 | ||
|
|
27b2a9fe59 | ||
|
|
d15caf0dbd | ||
|
|
221d54a595 | ||
|
|
ae783b0b1a | ||
|
|
bf033123a7 | ||
|
|
0a02d77d64 | ||
|
|
76971d9907 | ||
|
|
a6d94b6845 | ||
|
|
b1006170f1 | ||
|
|
433a29bb70 | ||
|
|
fbe98ff9a9 | ||
|
|
680597547c | ||
|
|
c76a4d477f | ||
|
|
bfbb5cde5a | ||
|
|
a5068eae0d | ||
|
|
2e260a0eab | ||
|
|
f48b70050e | ||
|
|
a99f942742 | ||
|
|
368d59796f | ||
|
|
21339c4155 | ||
|
|
e86f7d0b88 | ||
|
|
5bdf40901f | ||
|
|
fbfc9c3995 | ||
|
|
f6d09d0605 | ||
|
|
ef46a0a554 | ||
|
|
6b01f37bbf | ||
|
|
1ffb0a714f | ||
|
|
d855f322b9 | ||
|
|
70df242f72 | ||
|
|
055725f744 | ||
|
|
bc760dd341 | ||
|
|
08def6b51e | ||
|
|
be1d882a8b | ||
|
|
1fb81979b2 | ||
|
|
bb28faf39c | ||
|
|
a0b9871ba9 | ||
|
|
d4e84a9bd4 | ||
|
|
3525d65af3 | ||
|
|
2809b4f9dd | ||
|
|
617351aebc | ||
|
|
a20ab40ed2 | ||
|
|
6c5a152a51 | ||
|
|
6dfa527f79 | ||
|
|
e2e01efa84 | ||
|
|
bfe14ff824 | ||
|
|
414267388d | ||
|
|
05c1384b67 | ||
|
|
2f877bd851 | ||
|
|
883ca21321 | ||
|
|
9729fc3d31 | ||
|
|
75f48a5bc7 | ||
|
|
0d27f4d9a6 | ||
|
|
862ae2ff8d | ||
|
|
7c219600a2 | ||
|
|
873e20273e | ||
|
|
4b1f880904 | ||
|
|
f98c7f708e | ||
|
|
1c92c3317b | ||
|
|
10846d316b | ||
|
|
d305e7d6cf | ||
|
|
4962468fff | ||
|
|
a53b1c7cf1 | ||
|
|
85d5d321e2 | ||
|
|
eab00ff140 | ||
|
|
2c63fb2a94 | ||
|
|
1163462635 | ||
|
|
ce01496d44 | ||
|
|
e875f4e52e | ||
|
|
85a5276f36 | ||
|
|
8bb363f7c4 | ||
|
|
69f224aec3 | ||
|
|
0e819599e7 | ||
|
|
7715d19efe | ||
|
|
97a1ae911e | ||
|
|
f199e87085 | ||
|
|
c5089d7274 | ||
|
|
64b9ee9c74 | ||
|
|
a45659c59a | ||
|
|
133b99b6f2 | ||
|
|
fd5634e4aa | ||
|
|
8985b1aa6c | ||
|
|
388f554ff6 | ||
|
|
25ece8fb3d | ||
|
|
c6a2a55bc9 | ||
|
|
887486582e | ||
|
|
1ea633c484 | ||
|
|
da27253693 | ||
|
|
ac74edb4e4 | ||
|
|
baf68a936e | ||
|
|
3e319694aa | ||
|
|
948ddf8463 | ||
|
|
6ef3a0b181 | ||
|
|
fba2d9fa6c | ||
|
|
53d821332f | ||
|
|
54179a0189 | ||
|
|
0806c0a38b | ||
|
|
4e5d9a029d | ||
|
|
0365912e28 | ||
|
|
3564e98181 | ||
|
|
1745e20391 | ||
|
|
be2ff20e42 | ||
|
|
6d0cb96c85 | ||
|
|
7fff7f5e70 | ||
|
|
ff0a6f4ec3 | ||
|
|
074c5ea144 | ||
|
|
bf9981e8db | ||
|
|
a73effa5b6 | ||
|
|
8fb976f0bd | ||
|
|
d9723bb613 | ||
|
|
dbc977485c | ||
|
|
f3f8e13b88 | ||
|
|
cced51cbd2 | ||
|
|
9de611c056 | ||
|
|
519287550c | ||
|
|
ec78d3cefd | ||
|
|
252aacdddf | ||
|
|
36e2f38933 | ||
|
|
46c453cf0a | ||
|
|
b14b28067e | ||
|
|
321daa3523 | ||
|
|
bf00cde37d | ||
|
|
b91202969a | ||
|
|
05a088b369 | ||
|
|
da491ec961 | ||
|
|
923ef3d702 | ||
|
|
a0c5182548 | ||
|
|
a10c61ef89 | ||
|
|
f1248dcdf4 | ||
|
|
b68cd14391 | ||
|
|
7c9a0e2996 | ||
|
|
7028a399c2 | ||
|
|
2a0b857643 | ||
|
|
df4469f92b | ||
|
|
a405892d8a | ||
|
|
d392f01f2c | ||
|
|
b4fd77bb7c | ||
|
|
52a11547cb | ||
|
|
3aa4b18aed | ||
|
|
429168d4ac | ||
|
|
007155276a | ||
|
|
039b4dc00a | ||
|
|
ae82a93b56 | ||
|
|
a0425d9134 | ||
|
|
6908eed7ef | ||
|
|
178c089045 | ||
|
|
d98701c8d1 | ||
|
|
051c9dac19 | ||
|
|
6e6a500801 | ||
|
|
af5cb9c492 | ||
|
|
b87bba8a28 | ||
|
|
1fa8fac5d7 | ||
|
|
b9f02ca3c5 | ||
|
|
2a12fcd18b | ||
|
|
c4f11dfd32 | ||
|
|
8fbe1d73e9 | ||
|
|
4920cc47ca | ||
|
|
bed7310fd7 | ||
|
|
ecd3993d43 | ||
|
|
f5df3d37ea | ||
|
|
1f3de5174e | ||
|
|
91427b0b23 | ||
|
|
d7d132d5a3 | ||
|
|
479dbfe720 | ||
|
|
dc9e9317ca | ||
|
|
a7d3053049 | ||
|
|
16973d0559 | ||
|
|
2f1e678d60 | ||
|
|
b14d13e318 | ||
|
|
8d065fe0e6 | ||
|
|
54547683f9 | ||
|
|
4d45565663 | ||
|
|
4722371be9 | ||
|
|
f5be5ed6ee | ||
|
|
c1924f375d | ||
|
|
5ae8094747 | ||
|
|
596a1d8843 | ||
|
|
dbf1a2f7d5 | ||
|
|
0686857e3c | ||
|
|
de4cd1ee73 | ||
|
|
25e71a56d4 | ||
|
|
deec17e4fe | ||
|
|
9c08db55ff | ||
|
|
c2d4d0a10b | ||
|
|
ff918556cd | ||
|
|
5509f394dc | ||
|
|
7cd34f2a94 | ||
|
|
97f10241f9 | ||
|
|
b47a67d566 | ||
|
|
5fb4cdce45 | ||
|
|
80d16cb7df | ||
|
|
61437106e7 | ||
|
|
6d2702ed98 | ||
|
|
4e7eee3553 | ||
|
|
f5fab358aa | ||
|
|
c90abb1370 | ||
|
|
feee808955 | ||
|
|
724bd7c17f | ||
|
|
05547b72ac | ||
|
|
be5eb91df8 | ||
|
|
35ead7bf39 | ||
|
|
92b531d0c3 | ||
|
|
e475256b38 | ||
|
|
b4338921de | ||
|
|
a5e03b76a6 | ||
|
|
f152889938 | ||
|
|
9fc0ec6af8 | ||
|
|
5ce1d71206 | ||
|
|
327b0f76da | ||
|
|
23b6d33455 | ||
|
|
720042f964 | ||
|
|
fa814a32ce | ||
|
|
e724bc1c4e | ||
|
|
35d38dbfed | ||
|
|
618943d90a | ||
|
|
144c0597e9 | ||
|
|
ee817a2fa8 | ||
|
|
ab0bc1c2f8 | ||
|
|
4691b30c02 | ||
|
|
d427ed64a2 | ||
|
|
73dadb0669 | ||
|
|
1e6363cbcc | ||
|
|
6a0fc96af3 | ||
|
|
85c5e88e17 | ||
|
|
df4d40471a | ||
|
|
83b0f620c6 | ||
| 52c0fc421b | |||
| bbba3e505f | |||
|
|
068ffd04a6 | ||
|
|
a250224c66 | ||
|
|
f72dcc64e6 | ||
|
|
b25cbd340b | ||
|
|
972b03850f | ||
|
|
8150150a24 | ||
|
|
2129bbe160 | ||
|
|
5724fd795a | ||
|
|
c903fc8e20 | ||
|
|
b2d98edb4e | ||
|
|
8fb34a5846 | ||
|
|
4e4d795da5 | ||
|
|
8195df1b55 | ||
|
|
66b79723b6 | ||
|
|
769788d3c7 | ||
|
|
383bf9a59e | ||
|
|
07a8899c72 | ||
|
|
2fbab8067a | ||
|
|
218930d18b | ||
|
|
418e28c7dc | ||
|
|
2b3436e87c | ||
|
|
c10899d13f | ||
|
|
6af1fbacc9 | ||
|
|
011edf2472 | ||
|
|
c4cf1c5221 | ||
|
|
7adc69baf9 | ||
|
|
c01ce175bb | ||
|
|
0ecfd2923f | ||
|
|
f36fa308e7 | ||
|
|
ba7e0e2f86 | ||
|
|
7b2875d54a | ||
|
|
0ab2a60dcd | ||
|
|
c854e2dc17 | ||
|
|
9bb4ded5fa | ||
|
|
44721cba3d | ||
|
|
3a38172627 | ||
|
|
ca24cad60a | ||
|
|
1079f94fc5 | ||
|
|
654591e11f | ||
|
|
aa636841a2 | ||
|
|
a4e06bd998 | ||
|
|
36a7ebe88e | ||
|
|
9ba6990228 | ||
|
|
74ced174ce | ||
|
|
7e7e33e460 | ||
|
|
52cc3ed76a | ||
|
|
0c7c0821fc | ||
|
|
9a6a5ea2d9 | ||
|
|
47b60fd3fa | ||
|
|
0ed946c5b8 | ||
|
|
27eba65dc7 | ||
|
|
41865887f7 | ||
|
|
6e6bfc4d57 | ||
|
|
d08cc2ab17 | ||
|
|
e37d5622fe | ||
|
|
d0e6bb269f | ||
|
|
e580d22f4a | ||
|
|
22f4438787 | ||
|
|
e798b67ca2 | ||
|
|
1c35dbfb5d | ||
|
|
de61bd0d05 | ||
|
|
717199018b | ||
|
|
f386144428 | ||
|
|
9920f0a5de | ||
|
|
d0fb6e7a2f | ||
|
|
fd71e56891 | ||
|
|
ae31c4ac18 | ||
|
|
ea95eb730a | ||
|
|
317bb6d2ce | ||
|
|
f38ce1060c | ||
|
|
bf1f0b3d11 | ||
|
|
e158702a68 | ||
|
|
ab7ddfddd5 | ||
|
|
5c6aea9fd8 | ||
|
|
6479cb0806 | ||
|
|
d02899f822 | ||
|
|
b219ce6d37 | ||
|
|
c37b69e1a5 | ||
|
|
1897ce478b | ||
|
|
09504159b8 | ||
|
|
eab8e43188 | ||
|
|
754c36bb37 | ||
|
|
052a9ff378 | ||
|
|
e1762f5bf1 | ||
|
|
a5e1174926 | ||
|
|
ee896cdd41 | ||
|
|
7380e077ae | ||
|
|
42bf3a1306 | ||
|
|
b9f36184f5 | ||
|
|
083f91363a | ||
|
|
ff592ac791 | ||
|
|
8e6feecf11 | ||
|
|
42e36a883b | ||
|
|
f17a235b40 | ||
|
|
240678e714 | ||
|
|
65cfbda79b | ||
|
|
2fd9e9a744 | ||
|
|
bbdca2f352 | ||
|
|
6a63ff096a | ||
|
|
aa86a1457f | ||
|
|
27551cbb4d | ||
|
|
079c20e58e | ||
|
|
6af5fc2796 | ||
|
|
641caaa6dd | ||
|
|
edf2935ab1 | ||
|
|
52d05bbc37 | ||
|
|
20a13fa9fb | ||
|
|
59615fc993 | ||
|
|
e65cc07764 | ||
|
|
e274a02ff0 | ||
|
|
783ffe6824 | ||
|
|
3607d3ba2c | ||
|
|
31bcd1c45c | ||
|
|
99123a8621 | ||
|
|
22405d6bdb | ||
|
|
165b28438a | ||
|
|
0d7db29630 | ||
|
|
422525fa4c | ||
|
|
49a81d5c4b | ||
|
|
45db48bbaa | ||
|
|
5680933483 | ||
|
|
6a6ab2b0ec | ||
|
|
be12e07d74 | ||
|
|
14ca3dc42f | ||
|
|
ebeb32307d | ||
|
|
1d9bcc5ddf | ||
|
|
990da6d363 | ||
|
|
95e70cd0ea | ||
|
|
cf33ad9a54 | ||
|
|
1eb412b44d | ||
|
|
06b293af29 | ||
|
|
a84845c0ae | ||
|
|
173a0a5faa | ||
|
|
fc2b4526d3 | ||
|
|
e1cccd3dac | ||
|
|
2210fc60b1 | ||
|
|
8581ee3f0e | ||
|
|
c846f4bdae | ||
|
|
75cb1d1746 | ||
|
|
4fd4adf974 | ||
|
|
91db71ed45 | ||
|
|
6d4a2f5524 | ||
|
|
52ebfd07a5 | ||
|
|
30c625ff46 | ||
|
|
0511becd55 | ||
|
|
6a8db03ade | ||
|
|
b9b742cc69 | ||
|
|
c2fa892a02 | ||
|
|
cc52f8efd9 | ||
|
|
918d30cb97 | ||
|
|
0a185c4d2d | ||
|
|
e8e75c056a | ||
|
|
07c0a3227d | ||
|
|
4f93467841 | ||
|
|
de885e81b1 | ||
|
|
8a351595ef | ||
|
|
2c067edf54 | ||
|
|
3144654854 | ||
|
|
244866c2c3 | ||
|
|
10888be8e8 | ||
|
|
8d1d821876 | ||
|
|
99e34e38eb | ||
|
|
9a2cda7fd3 | ||
|
|
78f806c891 | ||
|
|
fbb57f902d | ||
|
|
ff6e6b5155 | ||
|
|
4e65752d6e | ||
|
|
90a09dba59 | ||
|
|
9f2026158b | ||
|
|
cdeb7ddff8 | ||
|
|
cd1f6627e4 | ||
|
|
bd7f603748 | ||
|
|
7d443c87b3 | ||
|
|
a10f04ad6e | ||
|
|
b0bacd9b0b | ||
|
|
3fd9900ea7 | ||
|
|
54293397c5 | ||
|
|
53593d1315 | ||
|
|
05f36ebeb1 | ||
|
|
dadf831fe9 | ||
|
|
5365e51e39 | ||
|
|
3d8bb96f75 | ||
|
|
086bffb594 | ||
|
|
06b6a10a5e | ||
|
|
92b1cb5743 | ||
|
|
698912633f | ||
|
|
567f3e30a7 | ||
|
|
d655e2194c | ||
|
|
321f882b6c | ||
|
|
10054b2b02 | ||
|
|
1fde63b23e | ||
|
|
27f2421e45 | ||
|
|
5833cbe6de | ||
|
|
0518cc1d94 | ||
|
|
bf26ffbf56 | ||
|
|
a8cc4a1a62 | ||
|
|
2ff7148d09 | ||
|
|
c43a75b115 | ||
|
|
f9ae1ee172 | ||
|
|
a0954b9e11 | ||
|
|
f004da1b37 | ||
|
|
ad82a2d08d | ||
|
|
1661cbb6e1 | ||
|
|
d9f1b1f5b7 | ||
|
|
aa9309704b | ||
|
|
d6c26942a5 | ||
|
|
ce5eae1c76 | ||
|
|
471fdae993 | ||
|
|
51106db93d | ||
|
|
240659da0e | ||
|
|
80acef52a6 | ||
| 2acd5d88b6 | |||
|
|
e4ec672464 | ||
|
|
82b5efa7bc | ||
|
|
fba1e221c6 | ||
|
|
734596c90a | ||
|
|
fc7c25af6d | ||
|
|
24116eff23 | ||
|
|
50fc90bc5f | ||
|
|
d3a5d40374 | ||
|
|
64bd95ea01 | ||
|
|
b46cc9d29a | ||
|
|
e82f37c60e | ||
| a6072f7ae3 | |||
|
|
5d5d14709f | ||
|
|
b0fba2864c | ||
|
|
56bf411d21 | ||
|
|
bca5aec5f4 | ||
|
|
b617271191 | ||
|
|
d42c83ff41 | ||
|
|
c4cfd1170e | ||
|
|
224e245e05 | ||
|
|
fc214fb320 | ||
| 2955ada22f | |||
| 11a97bdffe | |||
| 005226ae54 | |||
| b2084d37d6 | |||
|
|
2893e795fc | ||
|
|
4adba51569 | ||
|
|
d32349cee8 | ||
|
|
034b189c75 | ||
|
|
32363b801b | ||
|
|
f73e06d910 | ||
|
|
f21c2494cb | ||
|
|
4a2a553647 | ||
|
|
f486ead84a | ||
|
|
a8bd37f14d | ||
|
|
2fe552694b | ||
|
|
37bf61f6ac | ||
|
|
1e0353e2db | ||
| 647ff387d9 | |||
|
|
ad1b16a3ec | ||
|
|
9d484c4935 | ||
|
|
04f75b8903 | ||
|
|
22b7cd3d51 | ||
|
|
449385b250 | ||
|
|
33b9c39f58 | ||
|
|
3d36f63f9e | ||
|
|
41101bc2c6 | ||
|
|
61d3dd85ec | ||
|
|
3e35cbcd5b | ||
|
|
4e977aafe4 | ||
|
|
e565282da9 | ||
|
|
3a2b4af830 | ||
|
|
681399f8db | ||
| c2f0c57a26 | |||
|
|
cfea51ec68 | ||
| 0f869bbbf1 | |||
| e7f463320f | |||
|
|
dd0f8689a1 | ||
|
|
6855541e33 | ||
|
|
62d7a800d7 | ||
|
|
396e4ffc34 | ||
|
|
4e1f7d43eb | ||
|
|
441ce2a78f | ||
|
|
83e390714f | ||
|
|
3d6a6b81a0 | ||
|
|
bd5a5daaae | ||
|
|
e70ece4c41 | ||
|
|
8cadcc8e83 | ||
|
|
48f595ee13 | ||
|
|
9daa1a68d8 | ||
|
|
d0e00d7fbe | ||
|
|
0de8697315 | ||
|
|
ce9f05f91b | ||
|
|
50e7a4caa8 | ||
|
|
58ba74194e | ||
|
|
bef05ffbf1 | ||
|
|
fe738598da | ||
|
|
77092f2380 | ||
|
|
16bb40b110 | ||
|
|
3399d541c3 | ||
|
|
321fa206c9 | ||
|
|
8193a6eb18 | ||
|
|
898a7d92e3 | ||
|
|
59be777764 | ||
|
|
a0eb51cc97 | ||
|
|
e09d95067c | ||
|
|
7f7cbe8efa | ||
|
|
81d395d825 | ||
|
|
eba10eab49 | ||
|
|
301479cd44 | ||
|
|
84d4be279e | ||
|
|
e55e06d501 | ||
|
|
8e2080411f | ||
|
|
8d1719f190 | ||
|
|
5af4e79ed3 | ||
|
|
812fe0c93f | ||
|
|
10eabf6bc2 | ||
|
|
926849d7a8 | ||
|
|
22194d5977 | ||
|
|
0f4a2032b7 | ||
|
|
1418445b5e | ||
|
|
ce6b94f5e2 | ||
|
|
8dcfeb6240 | ||
|
|
28642ab10d | ||
|
|
12f1aa25fd | ||
|
|
5f9b3f2b87 | ||
|
|
e311d17905 | ||
|
|
2a26dac2bc | ||
|
|
f02cbeabab | ||
|
|
eaa9923a8f | ||
|
|
1b12c42477 | ||
|
|
80fb61ea44 | ||
|
|
04b2c8be5a | ||
|
|
5f98953ed8 | ||
| 1e9a27177c | |||
|
|
fd70383aa0 | ||
|
|
3b511e503a | ||
| eb7d0e317a | |||
|
|
a0cd94c184 | ||
| c5d2a0da04 | |||
|
|
3883a9fb7a | ||
|
|
d203d1c1cb | ||
|
|
7dd1d6afcc | ||
|
|
619b0ec164 | ||
|
|
e7b8b13186 | ||
| 88bbe425db | |||
|
|
aa8c262d14 | ||
|
|
4e053cea0d | ||
|
|
93e09e7ee5 | ||
|
|
1e87a785b9 | ||
|
|
e7305ce15f | ||
|
|
726d5e52a3 | ||
|
|
32048cdeeb | ||
|
|
a159b85340 | ||
|
|
9672f3891e | ||
| d69ef6bfd3 | |||
|
|
4982a3ad32 | ||
|
|
cc644032ea | ||
|
|
d1974e0038 | ||
|
|
8f3bf5faf6 | ||
| 92853e611d | |||
| fe6f5aaa70 | |||
|
|
5939497218 | ||
| 5eb9f9d060 | |||
|
|
beb6ad2e40 | ||
|
|
435e894fa0 | ||
|
|
d005b12326 | ||
|
|
98c7d70fe4 | ||
|
|
b0184362a2 | ||
| c0ef427a98 | |||
| c592b0e0f8 | |||
|
|
fc9340ca17 | ||
|
|
630352c25d | ||
|
|
e4ae1e3d59 | ||
|
|
b62d8faaec | ||
| a909007fef | |||
| 0041df0c6b | |||
|
|
280374fa63 | ||
|
|
6ca4fd82ed | ||
|
|
3215b85568 | ||
|
|
d65ea992bf | ||
| f8e0baa0b7 | |||
| b59964f707 | |||
| 0dfc3be903 | |||
| c1cd259529 | |||
| c2b8529698 | |||
| a3309ebb80 | |||
| b9dd6a5bb4 | |||
| a73f005e00 | |||
| 4767d23db3 | |||
| 853f7ac4d0 | |||
|
|
c00b25ec45 | ||
|
|
df91878d2e | ||
|
|
1489450693 | ||
|
|
8af98d0dc9 | ||
|
|
a5b60647be | ||
|
|
7c0be04696 | ||
|
|
c70acab8b3 | ||
|
|
6ee573c7c9 | ||
|
|
bee0d2edb4 | ||
|
|
ff06a45599 | ||
|
|
6da8d7c465 | ||
|
|
a55988a547 | ||
|
|
676ed4e199 | ||
|
|
7b2215a27c | ||
|
|
19b0b414e6 | ||
|
|
abec199c19 | ||
|
|
6711c5c90d | ||
| 34f5498760 | |||
| 9c47fd9c13 | |||
| fe7f405fc7 | |||
| c08f5a3a00 | |||
| 968763aa1d | |||
|
|
1eba580443 | ||
|
|
f4563d11d1 | ||
|
|
4c2f729a7a | ||
|
|
4517ab8ba4 | ||
|
|
77938db8c8 | ||
|
|
4190aa2eed | ||
|
|
047a4f59c5 | ||
|
|
cebcec5e63 | ||
|
|
355bf8b553 | ||
|
|
25ba8ee489 | ||
|
|
37538fc0e7 | ||
|
|
ea39f4378e | ||
|
|
9bd55cf4c7 | ||
|
|
23009fdd63 | ||
|
|
8b6aeb9e19 | ||
|
|
df731884a6 | ||
|
|
d57397f9c8 | ||
|
|
74fefe45a4 | ||
|
|
922b7c3131 | ||
|
|
c0029e1d97 | ||
|
|
31f5b6a238 | ||
|
|
d80e54458d | ||
|
|
6205ed9a0c | ||
|
|
ef16109c5d | ||
|
|
fa88446679 | ||
|
|
8d376a3efb | ||
|
|
f237657e5e | ||
|
|
ce8f7e69bf | ||
|
|
63d826a52a | ||
|
|
ccbe557e30 | ||
|
|
d434635822 | ||
|
|
fa55b15ac6 | ||
|
|
261586518a | ||
|
|
cdb83b18ec | ||
|
|
fd7dcff4e9 | ||
|
|
00eacbf45e | ||
|
|
06b4c83f59 | ||
|
|
3bf4d69f67 | ||
|
|
0c4bbefdf0 | ||
|
|
f8bee74e8e | ||
|
|
a7e3c74fed | ||
|
|
9ddf60f8b4 | ||
|
|
edfc76be4d | ||
|
|
9ab39eb2d2 | ||
|
|
286e342a9a | ||
|
|
0f90f35606 | ||
|
|
3f82fe8da9 | ||
|
|
fa491b4c32 | ||
|
|
002797a3b4 | ||
|
|
4e3748d0ae | ||
|
|
dddfad6594 | ||
|
|
05e2a7d1ac | ||
|
|
bf42611738 | ||
|
|
04b4026666 | ||
|
|
f173d45941 | ||
|
|
88aa0e2660 | ||
|
|
07dd26d722 | ||
|
|
7a3f86d184 | ||
|
|
c37ade9aeb | ||
|
|
b64d568267 | ||
|
|
15dd2fc0ab | ||
|
|
8157248189 | ||
|
|
945f2f5aa1 | ||
|
|
9d928b5726 | ||
|
|
ae3021bc9f | ||
|
|
81ab2526e4 | ||
|
|
493c1452f3 | ||
|
|
dde5ade524 | ||
|
|
8c9cc6b7c0 | ||
|
|
2569b33c84 | ||
|
|
e7fc0b6aa7 | ||
|
|
f21038b913 | ||
|
|
f00d2814b7 | ||
|
|
9bcdf40410 | ||
|
|
942b7ffbe0 | ||
|
|
01471e1e22 | ||
|
|
c1c3a79ec4 | ||
|
|
fa8f1a29e5 | ||
|
|
2de471950a | ||
|
|
402e71dcdd | ||
|
|
4f55205bf5 | ||
|
|
f16619ad3c | ||
|
|
15b8455cc4 | ||
|
|
01aceaae50 | ||
|
|
2ab923862b | ||
|
|
568c04e6af | ||
|
|
ea633117d0 | ||
|
|
737007cdd8 | ||
|
|
ebf326f565 | ||
|
|
bf05183158 | ||
|
|
6a2379fd0b | ||
|
|
5c24023240 | ||
|
|
4895a9d1d8 | ||
|
|
5eb3b208e8 | ||
|
|
e42209a6b2 | ||
|
|
586be2eb22 | ||
|
|
6723c44d5a | ||
|
|
83635f22c4 | ||
|
|
cc7acfd491 | ||
|
|
907b4417c0 | ||
|
|
892d5cda63 | ||
|
|
6daf4bd222 | ||
|
|
641a44e3e9 | ||
|
|
957a82b592 | ||
|
|
7399a1a5c7 | ||
|
|
5f101f3535 | ||
|
|
0a3d9cf482 | ||
|
|
419920987c | ||
|
|
9b4477e1dc | ||
|
|
9c5a9e3411 | ||
|
|
e667bdfe05 | ||
|
|
20dd3b1e43 | ||
|
|
fd9d3de208 | ||
|
|
d02251f8cd | ||
|
|
06d3c5aed7 | ||
|
|
653fc8877d | ||
|
|
60d6ccc731 | ||
|
|
5de8df7997 | ||
|
|
15f626be58 | ||
|
|
f20d5723aa | ||
|
|
4710a2adba | ||
|
|
a2bd772d5c | ||
|
|
9ee4d13756 | ||
|
|
fca9c66c27 | ||
|
|
3642fcbb23 | ||
|
|
cb39bfcad9 | ||
|
|
a2b18b75d4 | ||
|
|
ea30622318 | ||
|
|
ee90056866 | ||
|
|
eb2b41810a | ||
|
|
538081528d | ||
|
|
fcde138ea3 | ||
|
|
fb5f653442 | ||
|
|
fce0b0858f | ||
|
|
10497d1db0 | ||
|
|
6544f4cb5c | ||
|
|
da15053e0a | ||
|
|
d4356f9416 | ||
|
|
cd7baed14d | ||
|
|
70596b6641 | ||
|
|
f989db25b5 | ||
|
|
2e0edd5a63 | ||
|
|
2c9cd38547 | ||
|
|
446a31302c | ||
|
|
07230f2637 | ||
|
|
c7af17525b | ||
|
|
6a7d889dd4 | ||
|
|
8479eef578 | ||
|
|
6c3075bec6 | ||
|
|
06c944519d | ||
|
|
0981c579f0 | ||
|
|
b65e97bdb3 | ||
|
|
5160dda473 | ||
|
|
7b1cc9985b | ||
|
|
fac488fbf8 | ||
|
|
283be4f58e | ||
|
|
7b6d1052d9 | ||
|
|
6a8bafc91b | ||
|
|
fc28fc4f0b | ||
|
|
4745272d6c | ||
|
|
76eacad27b | ||
|
|
9f1cd41d77 | ||
|
|
d2b8ae66cb | ||
|
|
cc616aea4e | ||
|
|
59f25fb7a5 | ||
|
|
3a54a67f3d | ||
|
|
3bb45511fa | ||
|
|
a5220010f2 | ||
|
|
4cc2cf0e8f | ||
|
|
4f32732c95 | ||
|
|
7579057ee2 | ||
|
|
9962ea6449 | ||
|
|
0388a57f77 | ||
|
|
5d99cd0a20 | ||
|
|
c0e52f5fa2 | ||
|
|
59ad16b506 | ||
|
|
2a3de8d185 | ||
|
|
f1d8a2d149 | ||
|
|
0397202288 | ||
|
|
0398f308fa | ||
|
|
190e7d629e | ||
|
|
e2d1e1e281 | ||
|
|
b001c0711b | ||
|
|
09bf06bc6b | ||
|
|
6be6df6ae4 | ||
|
|
af566e1135 | ||
|
|
3e63f59867 | ||
|
|
aeae0090af | ||
|
|
82bc11585e | ||
|
|
f0232c99c5 | ||
|
|
0d25cbecd9 | ||
|
|
3e79638b9c | ||
|
|
e5f0cfcf20 | ||
|
|
dfc2b82ede | ||
|
|
71128b575f | ||
|
|
a7cde0e49a | ||
|
|
381f47bfb0 | ||
|
|
8bfdaa89b9 | ||
|
|
05bd5d4ee6 | ||
|
|
29ae4cdd1c | ||
|
|
47c8e20e5a | ||
|
|
9d191f7f9f | ||
|
|
15db02664d | ||
|
|
620bfc64d2 | ||
|
|
77c70c7e50 | ||
|
|
afaee7f782 | ||
|
|
ff041caa52 | ||
|
|
243279fdc3 | ||
|
|
021df5d3d3 | ||
|
|
6c5cb01b4a | ||
|
|
c433a82082 | ||
|
|
c33db95066 | ||
|
|
668524b8e1 | ||
|
|
d1b2f69771 | ||
|
|
1de2ee6884 | ||
|
|
76f5c01798 | ||
|
|
68309c3fac | ||
|
|
f4018bd6b6 | ||
|
|
b6114d1f75 | ||
|
|
80ff1c49a6 | ||
|
|
a64b5c84de | ||
|
|
6731b47d5a | ||
|
|
c6a542d166 | ||
|
|
fed9087274 | ||
|
|
616cbc6271 | ||
|
|
d0b451be94 | ||
|
|
a776c2a51c | ||
|
|
dfd57e4ad4 | ||
|
|
7c6adaa661 | ||
|
|
737178e0d2 | ||
|
|
0e13aba2fe | ||
|
|
d556ce291f | ||
|
|
a7f72eb2d8 | ||
|
|
eb49359aec | ||
|
|
6085599963 | ||
|
|
cc87363234 | ||
|
|
64831f4e7d | ||
|
|
e550b024c5 | ||
|
|
448d13e7b4 | ||
|
|
a1e279a9d8 | ||
|
|
36ffd31712 | ||
|
|
d595a03bbd | ||
|
|
189c62ac7d | ||
|
|
271c4bead6 | ||
|
|
a1254f1255 | ||
|
|
dff744558b | ||
|
|
efbf08266b | ||
|
|
302ad40fb2 | ||
|
|
5de29acbd2 | ||
|
|
aa0ce98b3e | ||
|
|
da330f0cab | ||
|
|
416abe33ed | ||
|
|
a5bfbbc12a | ||
|
|
1e94c4240c | ||
|
|
4b1e9d8f92 | ||
|
|
56bd0789af | ||
|
|
6560596864 | ||
|
|
fe851fc15e | ||
|
|
ab1f133667 | ||
|
|
544b9e4ba0 | ||
|
|
6b66c3b7a3 | ||
|
|
3b946f667e | ||
|
|
4bd1d09d74 | ||
|
|
d16af1fbb2 | ||
|
|
44bc1711aa | ||
|
|
dfa6b6e9c5 | ||
|
|
17ff1b2b46 | ||
|
|
d5af898999 | ||
|
|
5e6f113779 | ||
|
|
fda065ea89 | ||
|
|
e2ebcbe514 | ||
|
|
1276c12097 | ||
|
|
23eb79ca8f | ||
|
|
01443a9619 | ||
|
|
8251abba8a | ||
|
|
0ff128ec03 | ||
|
|
d201ac20af | ||
|
|
2d5483082d | ||
|
|
1805bcac76 | ||
|
|
b1b89c409e | ||
|
|
7e390886fb | ||
|
|
5cb361cf1f | ||
|
|
d0cc8abd31 | ||
|
|
19d353ccd9 | ||
|
|
d8686cc002 | ||
|
|
7d3bec46ae | ||
|
|
065e82015f | ||
|
|
ce81c8dda9 | ||
|
|
3be456629b | ||
|
|
a1a02c5427 | ||
|
|
d9ae709045 | ||
|
|
9a50fa4a50 | ||
|
|
18f3dfcd90 | ||
|
|
881fa8e2b9 | ||
|
|
a997ab258e | ||
|
|
6c8d60afc0 | ||
|
|
7f79a0e78c | ||
|
|
a021a9e5f0 | ||
|
|
7a69382f36 | ||
|
|
5da455e398 | ||
|
|
178925640b | ||
|
|
f1e1699c9f | ||
|
|
94e645defa | ||
|
|
31be20744d | ||
|
|
644ad74ea1 | ||
|
|
2dcb2f06cb | ||
|
|
e44fbca272 | ||
|
|
7918714043 | ||
|
|
a14bfeba64 | ||
|
|
60feb1a9aa | ||
|
|
b3928288f0 | ||
|
|
8dcd9cc35c | ||
|
|
de72f7fabb | ||
|
|
ad7cd0399d | ||
|
|
b9e229f739 | ||
|
|
ace872bf11 | ||
|
|
a3289c3c2f | ||
|
|
393bc9bce9 | ||
|
|
c868b66f5b | ||
|
|
99dd0a61ff | ||
|
|
2d2735c9d4 | ||
|
|
60a23f0fb6 | ||
|
|
e671fa2f7a | ||
|
|
39f30aeec6 | ||
|
|
ec1d29f4ae | ||
|
|
23dd19757a | ||
|
|
22bbb6ab86 | ||
|
|
7f8972b842 | ||
|
|
e3df0104b0 | ||
|
|
aca4b60d28 | ||
|
|
054cac3e4b | ||
|
|
0c0a09aeb6 | ||
|
|
6d603e462d | ||
|
|
a37cc171e8 | ||
|
|
36ec29d4e8 | ||
|
|
f2ad1a3679 | ||
|
|
43650b6896 | ||
|
|
00bf60db28 | ||
|
|
8a50fe8982 | ||
|
|
3c49f53eac | ||
|
|
a91e1cb682 | ||
|
|
b4d3699047 | ||
|
|
78db6c32cd | ||
|
|
2900ed22e7 | ||
|
|
e75fd0e166 | ||
|
|
9ac6890d20 | ||
|
|
b31c2ea748 | ||
|
|
93978bcd25 | ||
|
|
72c911be97 | ||
|
|
fb1dcd326d | ||
|
|
a41272dcd3 | ||
|
|
5eb7958425 | ||
|
|
ce75a21e50 | ||
|
|
92113dde81 | ||
|
|
a38d8948b3 | ||
|
|
d016bcdf82 | ||
|
|
4902f0937f | ||
|
|
e0eae5cb2a | ||
|
|
26862f8a52 | ||
|
|
1276ce59c3 | ||
|
|
6f662e9bbc | ||
|
|
1d6bf8e04a | ||
|
|
27d5f27831 | ||
|
|
a9f75a71c5 | ||
|
|
312444bbd2 | ||
|
|
ea4b08de20 | ||
|
|
99153569f4 | ||
|
|
ecc47d5258 | ||
|
|
2d34450872 | ||
|
|
b1998cb0b1 | ||
|
|
065a319100 | ||
|
|
2d0d1ef5f2 | ||
|
|
237cc954e3 | ||
|
|
9564f7b90e | ||
|
|
5e04780148 | ||
|
|
609ebe5cad | ||
|
|
b82cfcb064 | ||
|
|
0e6928b087 | ||
|
|
ef9a7f262a | ||
|
|
971bd7e9a6 | ||
|
|
7a901cfccd | ||
|
|
bfe7e055e9 | ||
|
|
b4fc464a4d | ||
|
|
1c12e9aaba | ||
|
|
d183b66e52 | ||
|
|
aa817de7f0 | ||
|
|
3cb5e7ea58 | ||
|
|
9060df5af6 | ||
|
|
216fcedfbb | ||
|
|
7292984204 | ||
|
|
048f0f0e4f | ||
|
|
d9a19c4c65 | ||
|
|
ddc8570137 | ||
|
|
182a946b0e | ||
|
|
a8ee0012d7 | ||
|
|
e2867eb4e9 | ||
|
|
3c1486a5c7 | ||
|
|
5ff641772a | ||
|
|
4140b3b944 | ||
|
|
4869599f89 | ||
|
|
78f6c2232c | ||
|
|
e7d6df7f7c | ||
|
|
c90a2d9b42 | ||
|
|
e267b2c666 | ||
|
|
a49200d5cb | ||
|
|
7b393bc406 | ||
|
|
3cfb06042e | ||
|
|
c066e4da8b | ||
|
|
b6587b3b60 | ||
|
|
6370b5225a | ||
|
|
dcede575ff | ||
|
|
a8dae22ae9 | ||
|
|
3b17980822 | ||
|
|
cfbb74ffe7 | ||
|
|
0076a3c868 | ||
|
|
f4c8256345 | ||
|
|
54f2b698ce | ||
|
|
3177e10e9e | ||
|
|
dc3f13d13f | ||
|
|
d023879bea | ||
|
|
15dcc7011c | ||
|
|
9db321d505 | ||
|
|
268bf6f99e | ||
|
|
8c7571a75d | ||
|
|
8c1f5427bc | ||
|
|
123c2262e9 | ||
|
|
f738996164 | ||
|
|
4aeef100f6 | ||
|
|
1893669833 | ||
|
|
949a8f5043 | ||
|
|
8e45dc041f | ||
|
|
10b3a90189 | ||
|
|
7f88ba3b26 | ||
|
|
2487226dff | ||
|
|
f0a12d9620 | ||
|
|
0e83f8c752 | ||
|
|
046092e8a2 | ||
|
|
2b80add22f | ||
|
|
e7e8e0a95d | ||
|
|
4232a0a196 | ||
|
|
ee18b5cbab | ||
|
|
d613776f0d | ||
|
|
ab7da9353a | ||
|
|
db918da5f0 | ||
|
|
ca1a9b9a10 | ||
|
|
bd7abcda97 | ||
|
|
b31d673207 | ||
|
|
5a59a10bf2 | ||
|
|
d2ddf36c1d | ||
|
|
c966976591 | ||
|
|
00766e43a0 | ||
|
|
60e9b8f70a | ||
|
|
d665334e94 | ||
|
|
2c26f35429 | ||
|
|
73c15dcf8b | ||
|
|
d43564f854 | ||
|
|
ee1092fcaf | ||
|
|
6df99b5d0e | ||
|
|
e08241de41 | ||
|
|
1c97b7f4df | ||
|
|
a1be272b1e | ||
|
|
9bcc1057ca | ||
|
|
bb008cdbc9 | ||
|
|
536bcb42c9 | ||
|
|
a800a25e88 | ||
|
|
3ba5ba6e66 | ||
|
|
535c0059d7 | ||
|
|
b41cbe9256 | ||
|
|
88c6d2349b | ||
|
|
f31a7b70e8 | ||
|
|
51cd4da76e | ||
|
|
c80e1908c5 | ||
|
|
a1409d1432 | ||
|
|
4f4ddf00dc | ||
|
|
c6a15f76ad | ||
|
|
e2ce87e250 | ||
|
|
2148211314 | ||
|
|
c216c2876f | ||
|
|
6c7d35c40c | ||
|
|
5f6df7f54a | ||
|
|
1709fbb65a | ||
|
|
274fff4226 | ||
|
|
dbd3f15168 | ||
|
|
8f3be0a037 | ||
|
|
cfd1809b2b | ||
|
|
6e8fa8b3c9 | ||
|
|
f57be619fc | ||
|
|
3c54e2c03c | ||
|
|
fabaa2ec30 | ||
|
|
61b6faed15 | ||
|
|
922006dd59 | ||
|
|
b7591cfd19 | ||
|
|
80654779e1 | ||
|
|
d18bf876e3 | ||
|
|
ef65ee78c5 | ||
|
|
9a9584aee0 | ||
|
|
a414199793 | ||
|
|
831759faaa | ||
|
|
44e2cb415f | ||
|
|
bcab2ba0a8 | ||
|
|
4468731e3d | ||
|
|
795116b432 | ||
|
|
f49b202e7d | ||
|
|
8c0bbb983b | ||
|
|
863a5c1734 | ||
|
|
f4981677b0 | ||
|
|
c478c10923 | ||
|
|
c2bb9e2eb5 | ||
|
|
7f74412882 | ||
|
|
211b44e630 | ||
|
|
bac841df61 | ||
|
|
b2dcc5bb6c | ||
|
|
0bbb7a8199 | ||
|
|
8466d760f9 | ||
|
|
6839fff313 | ||
|
|
3ad01ddb04 | ||
|
|
75c3be37ac | ||
|
|
5aa8922038 | ||
|
|
dd72fe6945 | ||
|
|
ca1f3e5fb7 | ||
|
|
e0ddd528c8 | ||
|
|
6467e3d40b | ||
|
|
acbca44512 | ||
|
|
c0159c5e80 | ||
|
|
6baacf46b7 | ||
|
|
f9c54665f7 | ||
|
|
5c742e0058 | ||
|
|
9df090f66b | ||
|
|
1f71851d3a | ||
|
|
676a5b399e | ||
|
|
6d9d683443 | ||
|
|
e1eb1802a6 | ||
|
|
7932df02ab | ||
|
|
544f5c3fa4 | ||
|
|
a0d0b27faf | ||
|
|
c01bf678fd | ||
|
|
e2f39a8d93 | ||
|
|
4d0dc4b298 | ||
|
|
17ec02a77d | ||
|
|
59faa05a10 | ||
|
|
fdb97eda09 | ||
|
|
f3cd6b0232 | ||
|
|
aa700a8b42 | ||
|
|
447a4b1ecd | ||
|
|
c679c80c71 | ||
|
|
4e63d55d8d | ||
|
|
ef61b5ecb5 | ||
|
|
266be30777 | ||
|
|
dd1c4fc8c7 | ||
|
|
774bf0cf0a | ||
|
|
74cfdeb316 | ||
|
|
16ef611b0b | ||
|
|
f570b53d44 | ||
|
|
45a31b1c2a | ||
|
|
c281b44cbd | ||
|
|
e00b3190ed | ||
|
|
fab634e3ee | ||
|
|
f6a702538a | ||
|
|
5c32a5aa6a | ||
|
|
42156484ae | ||
|
|
785fb6928b | ||
|
|
37c72adc0f | ||
|
|
2e155bcc31 | ||
|
|
509d5223ea | ||
|
|
b53b691314 | ||
|
|
3e0d3d283d | ||
|
|
6ace744667 | ||
|
|
5d509ecace | ||
|
|
91d4cdb476 | ||
|
|
c017f2d267 | ||
|
|
def719e7a7 | ||
|
|
13cb4aa89d | ||
|
|
8f3c5ebdc8 | ||
|
|
c08cc4106b | ||
|
|
1dfe277a15 | ||
|
|
9f6b828924 | ||
|
|
6446fcd500 | ||
|
|
557ceded00 | ||
|
|
48375ba954 | ||
|
|
f91493c97e | ||
|
|
af1ede930b | ||
|
|
bd4a975530 | ||
|
|
0d2c1bf2bb | ||
|
|
af823e64c4 | ||
|
|
c82b84e0a9 | ||
|
|
3660023046 | ||
|
|
b69507fc64 | ||
|
|
1e04e8ea1c | ||
|
|
09b80b10d1 | ||
|
|
94346d97ba | ||
|
|
e02e423510 | ||
|
|
ffc37faadc | ||
|
|
309daaf5fc | ||
|
|
97df799e2c | ||
|
|
2cd62b46cd | ||
|
|
f878bc4efc | ||
|
|
5e231bd8f9 | ||
|
|
b6ebf855d3 | ||
|
|
3bf6303081 | ||
|
|
725d715a1b | ||
|
|
1e16e813e8 | ||
|
|
05f0681966 | ||
|
|
d6a24afd71 | ||
|
|
5ddbf26b62 | ||
|
|
c797f3cb24 | ||
|
|
a0058e6712 | ||
|
|
265d5dab05 | ||
|
|
778e975936 | ||
|
|
e87a61ffb4 | ||
|
|
8251d8cb2a | ||
|
|
df20b28805 | ||
|
|
03a7069d60 | ||
|
|
30ee7019ca | ||
|
|
97fcdfbd08 | ||
|
|
a715bf6bac | ||
|
|
3e23464b1e | ||
|
|
c7efd2cae9 | ||
|
|
58ab5844cb | ||
|
|
c61e1b89aa | ||
|
|
736a63e85a | ||
|
|
3658c92270 | ||
|
|
9434db07b2 | ||
|
|
1ac8f67e3b | ||
|
|
3193bcc7ee | ||
|
|
a6b138c9ef | ||
|
|
43881f933d | ||
|
|
c9a7a50c74 | ||
|
|
60ad0157f7 | ||
|
|
8326d777cc | ||
|
|
decb260890 | ||
|
|
a884acc7f6 | ||
|
|
72a564b065 | ||
|
|
30b27b1370 | ||
|
|
708571834a | ||
|
|
5d28a99114 | ||
|
|
8906084d80 | ||
|
|
362e2946a5 | ||
|
|
4b4fee8b78 | ||
|
|
9345562cc8 | ||
|
|
714521a4c7 | ||
|
|
f730ea9602 | ||
|
|
52f1fbdd70 | ||
|
|
10965eef5c | ||
|
|
c5e515b8fe | ||
|
|
2ecb9a3dbf | ||
|
|
d6905b961e | ||
|
|
6d1be3dc65 | ||
|
|
bf09cdff60 | ||
|
|
f0485c06a1 | ||
|
|
fc26a2ef7c | ||
|
|
d53596145a | ||
|
|
4a52f8401b | ||
|
|
e5802fd9f8 | ||
|
|
5552864196 | ||
|
|
0dbb06f9a5 | ||
|
|
277905534b | ||
|
|
9de43eb545 | ||
|
|
bc1aec8a0d | ||
|
|
50a12a40a3 | ||
|
|
c0e1f58b67 | ||
|
|
c8dc091288 | ||
|
|
b5f50fadf9 | ||
|
|
391cb3ebe8 | ||
|
|
d21b11fe0e | ||
|
|
dbc184816a | ||
|
|
de3a78a097 | ||
|
|
e35a552f1f | ||
|
|
9805abd858 | ||
|
|
56c28d2ba6 | ||
|
|
35a3abb998 | ||
|
|
2f983d3ef9 | ||
|
|
9779910e3e | ||
|
|
044e36f26f | ||
|
|
c4304d69e0 | ||
|
|
e645b0b425 | ||
|
|
88b449a8cd | ||
|
|
3996ed7183 | ||
|
|
227eeb1408 | ||
|
|
d83c4fa130 | ||
|
|
5be53808c9 | ||
|
|
bbd778c690 | ||
|
|
e619b837c0 | ||
|
|
baedc380bf | ||
|
|
f22639d9b0 | ||
|
|
235e848ea7 | ||
|
|
dbf33fdc46 | ||
|
|
a2a8115ed4 | ||
|
|
a37416dc2d | ||
|
|
65b3e9875d | ||
|
|
db0fa6aafb | ||
|
|
d5acc13d5e | ||
|
|
db0f4963b7 | ||
|
|
ea95dcba4d | ||
|
|
c28e94b534 | ||
|
|
6ddaba532a | ||
|
|
f49f20a24e | ||
|
|
ac7fae2e0a | ||
|
|
daf3474247 | ||
|
|
ad1076b206 | ||
|
|
45303796d7 | ||
|
|
b785e145d2 | ||
|
|
5cfd6d166c | ||
|
|
147e579e28 | ||
|
|
a81de242c5 | ||
|
|
b17665b8ad | ||
|
|
1eb8792fa5 | ||
|
|
66db079192 | ||
|
|
66c421f401 | ||
|
|
e07088ce23 | ||
|
|
94b94d7ff4 | ||
|
|
0bce2ea74a | ||
|
|
8b9f14244d | ||
|
|
7dac28575d | ||
|
|
95b01db098 | ||
|
|
5fb937f147 | ||
|
|
933507e980 | ||
|
|
f3909c49f5 | ||
|
|
cb9ed6bb55 | ||
|
|
44673de114 | ||
|
|
cb7a0aefa0 | ||
|
|
88b4ebc715 | ||
|
|
aaf01481aa | ||
|
|
32a4eb2c53 | ||
|
|
aba5fcbf0f | ||
|
|
d9813910da | ||
|
|
aa9ad6be01 | ||
|
|
ed93392d87 | ||
|
|
2f40c61c3e | ||
|
|
c7cc57eaa0 | ||
|
|
1280e9122b | ||
|
|
3cad7b7b03 | ||
|
|
b444788451 | ||
|
|
517590a58a | ||
|
|
907188972c | ||
|
|
5c7071e92a | ||
|
|
e87dcd8940 | ||
|
|
d580fa4088 | ||
|
|
d7145339aa | ||
|
|
d877e0e533 | ||
|
|
eeced45bed | ||
|
|
253bdf7739 | ||
|
|
0a6bed491f | ||
|
|
4a7716f5dd | ||
|
|
003f43b5c9 | ||
|
|
1192981d24 | ||
|
|
0fa70ec988 | ||
|
|
1ff44dd5b8 | ||
|
|
d06c6f4587 | ||
|
|
c921bbd9ac | ||
|
|
981b3e61dd | ||
|
|
d1a4b19dc5 | ||
|
|
147d03feff | ||
|
|
952c14c4bf | ||
|
|
6f72e73137 | ||
|
|
086d79fbad | ||
|
|
234c9f3688 | ||
|
|
2584684e06 | ||
|
|
c6b36ad4ca | ||
|
|
52be9eec9d | ||
|
|
4c5c83567e | ||
|
|
6330fd4f31 | ||
|
|
d412241143 | ||
|
|
a0ad7ce0b4 | ||
|
|
cab515a022 | ||
|
|
3bc8309dab | ||
|
|
226d872d11 | ||
|
|
d275d5bcf7 | ||
|
|
b1925b1bd8 | ||
|
|
3f5028c666 | ||
|
|
292ba89ac2 | ||
|
|
974847ac8d | ||
|
|
02e215dc59 | ||
|
|
36d9c0cb83 | ||
|
|
e6b49af27e | ||
|
|
acce3a59d5 | ||
|
|
9b76983af9 | ||
|
|
63805bac9c | ||
|
|
d96e2a3e08 | ||
|
|
8f423c26d0 | ||
|
|
ceb2602005 | ||
|
|
1f8ceaa6fb | ||
|
|
fd52691f02 | ||
|
|
5d9c191a19 | ||
|
|
cf0d2bb457 | ||
|
|
f8c0ff6413 | ||
|
|
78c0821216 | ||
|
|
653f4a86d5 | ||
|
|
e8cd010f59 | ||
|
|
370c20ff6c | ||
|
|
b4f96a1dc3 | ||
|
|
3420843774 | ||
|
|
4584ef4ace | ||
|
|
0865fbd92d | ||
|
|
790c38e18c | ||
|
|
7672bf7736 | ||
|
|
e0f931afd3 | ||
|
|
e1a6f6d584 | ||
|
|
7ea76e0889 | ||
|
|
6984425f5d | ||
|
|
18e73d4214 | ||
|
|
96b203b729 | ||
|
|
3d503cf7a8 | ||
|
|
bdaa714f85 | ||
|
|
e69e47bc24 | ||
|
|
4676e5900b | ||
|
|
d61dcf18fb | ||
|
|
c138d0f025 | ||
|
|
f3152571c6 | ||
|
|
b245011259 | ||
|
|
54656044f7 | ||
|
|
00d96f5695 | ||
|
|
1063a44ec6 | ||
|
|
2cf9e3e625 | ||
|
|
9e6cca66b4 | ||
|
|
891bd61bf7 | ||
|
|
bf79699810 | ||
|
|
130a00fdeb | ||
|
|
64f91e01ac | ||
|
|
d3509517f5 | ||
|
|
a84ed760b5 | ||
|
|
24e902aa8f | ||
|
|
cf1c6939ea | ||
|
|
c3ccef800d | ||
|
|
8d06dd3281 | ||
|
|
a4513f0159 | ||
|
|
94efa02084 | ||
|
|
ad6a1d9136 | ||
|
|
10cbc83cf0 | ||
|
|
ef1a4847b3 | ||
|
|
c6d539ace3 | ||
|
|
5ad426124b | ||
|
|
311ae77dc0 | ||
|
|
6512ccf32e | ||
|
|
24a5752f94 | ||
|
|
a7f10336e1 | ||
|
|
d170ca5d03 | ||
|
|
a2c463deb0 | ||
|
|
57442c2b25 | ||
|
|
40b37227a0 | ||
|
|
7187132d24 | ||
|
|
dd64379c0d | ||
|
|
58b9789d0c | ||
|
|
30b8091df0 | ||
|
|
4ad22144b0 | ||
|
|
10e6b4309b | ||
|
|
01441c8f59 | ||
|
|
e766c7ebbe | ||
|
|
5c6fc791e3 | ||
|
|
eedd9eabe9 | ||
|
|
20bdb7dc90 | ||
|
|
f9b9d59434 | ||
|
|
1c756af9a4 | ||
|
|
a0638880b3 | ||
|
|
0437fafaac | ||
|
|
7449f8d861 | ||
|
|
7aa7bad78a | ||
|
|
976785e1d5 | ||
|
|
7bcc61b0c1 | ||
|
|
97d46bae6a | ||
|
|
3286d81a48 | ||
|
|
5f4798b0f2 | ||
|
|
50bb18015a | ||
|
|
6f6c5d30e8 | ||
|
|
4ae600be8a | ||
|
|
8aa6e0388e | ||
|
|
195c492419 | ||
|
|
541d22e8d0 | ||
|
|
8429d022e1 | ||
|
|
7043680f1f | ||
|
|
ec6502c1ea | ||
|
|
0ba9c62940 | ||
|
|
44fc96c8a9 | ||
|
|
f68fb8499d | ||
|
|
2adad5f2a6 | ||
|
|
9abd38a3f2 | ||
|
|
3c8323aff4 | ||
|
|
f4fd45bef3 | ||
|
|
bccfc7262d | ||
|
|
582db669b6 | ||
|
|
39d3d7bb28 | ||
|
|
3f96532952 | ||
|
|
9d91e990f7 | ||
|
|
ca43f42b78 | ||
|
|
f6e612f7d7 | ||
|
|
a76ff755e3 | ||
|
|
10b7f3ef83 | ||
|
|
7501ecec8e | ||
|
|
ef44cec1f1 | ||
|
|
9a5ff7766e | ||
|
|
bc152da3a6 | ||
|
|
4c77f84034 | ||
|
|
f66fcbfa4f | ||
|
|
f6f8097f77 | ||
|
|
bac3a7dcc1 | ||
|
|
98667b1af8 | ||
|
|
a9d25bfae4 | ||
|
|
939c0045db | ||
|
|
076ff82c46 | ||
|
|
aa32dcd0fd | ||
|
|
071e551b79 | ||
|
|
d0d350da16 | ||
|
|
4d56f2a76d | ||
|
|
b97edd4465 | ||
|
|
8d0d5defc7 | ||
|
|
ca176535a9 | ||
|
|
67ec52d7a9 | ||
|
|
225fdb0307 | ||
|
|
2fe6b74e90 | ||
|
|
b653c3c8fc | ||
|
|
f37ce1c595 | ||
|
|
f0e24bd812 | ||
|
|
d1b15cf1a3 | ||
|
|
4a4f29b8f9 | ||
|
|
8505de1ced | ||
|
|
45dfaa835f | ||
|
|
1e8fc15a41 | ||
|
|
2d7f39855b | ||
|
|
1e79bdf0b4 | ||
|
|
81aaf6e906 | ||
|
|
fb53bdf07c | ||
|
|
adf316afaa | ||
|
|
f28f8ba568 | ||
|
|
f8c0a51f5e | ||
|
|
c7c2285ab9 | ||
|
|
320b9ecde7 | ||
|
|
2c90d94dc7 | ||
|
|
a93d462dfd | ||
|
|
435bc5a3d4 | ||
|
|
8c45aca8d2 | ||
|
|
6446105689 | ||
|
|
32083a9443 | ||
|
|
07edf4f26d | ||
|
|
3b15d33809 | ||
|
|
800a399182 | ||
|
|
35f9c8f37f | ||
|
|
d7cfae3639 | ||
|
|
4dd86178bc | ||
|
|
a026d3475f | ||
|
|
360243af92 | ||
|
|
5d06aa3260 | ||
|
|
b92b55bdd0 | ||
|
|
a4173c467f | ||
|
|
587c6277c4 | ||
|
|
31feea4511 | ||
|
|
46c21ff6ba | ||
|
|
0559be4ffc | ||
|
|
ce6221ef61 | ||
|
|
e5fc082366 | ||
|
|
6fcb0a40e9 | ||
|
|
7e52da7ccb | ||
|
|
1402574b7d | ||
|
|
e3773e899f | ||
|
|
c7f0069aac | ||
|
|
c8097eb470 | ||
|
|
f7fbf55a45 | ||
|
|
58238a43b3 | ||
|
|
52c07e7cb2 | ||
|
|
5f645b6c8e | ||
|
|
84e5b828ea | ||
|
|
460f6dee50 | ||
|
|
9568e07159 | ||
|
|
33b1028b50 | ||
|
|
bb196a2b09 | ||
|
|
0887b95bb9 | ||
|
|
706bc97c92 | ||
|
|
276073b494 | ||
|
|
5a7ab4686c | ||
|
|
c88358d84b | ||
|
|
bb7130a813 | ||
|
|
f9a351d527 | ||
|
|
7c6f041b8c | ||
|
|
d24809a2aa | ||
|
|
93b76a66d3 | ||
|
|
ebb7925a16 | ||
|
|
bd2981681f | ||
|
|
31a71517ab | ||
|
|
2200c4c084 | ||
|
|
75148ee6ca | ||
|
|
5b778790ae | ||
|
|
a139d5e8f7 | ||
|
|
8966c68b92 | ||
|
|
61b825d75e | ||
|
|
4810722064 | ||
|
|
3afa09b2fe | ||
|
|
f5caf86870 | ||
|
|
be1ed7aae4 | ||
|
|
06af64a78a | ||
|
|
0914b34193 | ||
|
|
025f07dbab | ||
|
|
49cce723a9 | ||
|
|
2f2e67e9bd | ||
|
|
cd2149a47f | ||
|
|
fb983c7692 | ||
|
|
c230bc021a | ||
|
|
bcf4631e0a | ||
|
|
4d147beedb | ||
|
|
098e64b122 | ||
|
|
ff208d7677 | ||
|
|
7cb54864aa | ||
|
|
f38b0ba037 | ||
|
|
8a884de7b9 | ||
|
|
23163154b9 | ||
|
|
327754a953 | ||
|
|
3468972299 | ||
|
|
442e46f4be | ||
|
|
609a174f8d | ||
|
|
cbfba08ae7 | ||
|
|
445b45ee13 | ||
|
|
08883c619a | ||
|
|
a444390115 | ||
|
|
9a20d9ca91 | ||
|
|
4a97cfe3ea | ||
|
|
c066344a14 | ||
|
|
e028eda0bc | ||
|
|
9b0d893b4d | ||
|
|
6fc806b313 | ||
|
|
ada69c40c6 | ||
|
|
5fc6a9d9a2 | ||
|
|
51c739f64a | ||
|
|
c8127ef337 | ||
|
|
6ea3f3c69b | ||
|
|
a01a3734f8 | ||
|
|
5580ac8200 | ||
|
|
9aa3df7955 | ||
|
|
caf242a5ae | ||
|
|
739bf3a740 | ||
|
|
89095f861f | ||
|
|
471d6a05da | ||
|
|
ee5ecac7cc | ||
|
|
7ea966d844 | ||
|
|
851705fc3a | ||
|
|
242b40e917 | ||
|
|
90e88b2c43 | ||
|
|
2f9fda1367 | ||
|
|
11c40892ac | ||
|
|
91652882a9 | ||
|
|
1aecf560da | ||
|
|
611b829138 | ||
|
|
d200a62164 | ||
|
|
07ea2abcb0 | ||
|
|
bccfbe4e00 | ||
|
|
fcd60915e2 | ||
|
|
f8d1ea80ae | ||
|
|
99f5ecdfad | ||
|
|
3b2ca64738 | ||
|
|
5f9b070f6d | ||
|
|
9689aae45b | ||
|
|
9d2a2d227c | ||
|
|
fd8f2c36f5 | ||
|
|
5f705adae0 | ||
|
|
0f78eea5d8 | ||
|
|
4aaa0ea008 | ||
|
|
3891dde7ff | ||
|
|
2e1335b051 | ||
|
|
4e1b9aca79 | ||
|
|
4afa41ac36 | ||
|
|
5acba015ef | ||
|
|
7c50cd26a2 | ||
|
|
3debb43e83 | ||
|
|
c301cca2a4 | ||
|
|
f50a56dbb5 | ||
|
|
87e1616488 | ||
|
|
7000e0a2a0 | ||
|
|
49b1607bed | ||
|
|
1ef7c732e8 | ||
|
|
7144696e17 | ||
|
|
ff7541599a | ||
|
|
852aaba58b | ||
|
|
9ddd62e73e | ||
|
|
0489153094 | ||
|
|
ee5884bfe9 | ||
|
|
2c61b7f596 | ||
|
|
4a631a0d47 | ||
|
|
ab0d9756f1 | ||
|
|
56d106507a | ||
|
|
9e36242259 | ||
|
|
5e89a27ba1 | ||
|
|
ec35861938 | ||
|
|
309ae12346 | ||
|
|
80c9c2e3c0 | ||
|
|
f2a7e198d2 | ||
|
|
ef6d583ec3 | ||
|
|
1aeb74a426 | ||
|
|
2af06bd3fa | ||
|
|
e95ec1a285 | ||
|
|
c300e3f196 | ||
|
|
159202ad00 | ||
|
|
235c0edacb | ||
|
|
d057a93675 | ||
|
|
df31508d6f | ||
|
|
db3dd8bc8b | ||
|
|
22f66e274d | ||
|
|
4efedb67b6 | ||
|
|
e60fa9b3e1 | ||
|
|
44c9888511 | ||
|
|
f88ad9f5ab | ||
|
|
58cc59cfbe | ||
|
|
ac677efb8b | ||
|
|
e8761682b7 | ||
|
|
84313b0261 | ||
|
|
9472196ee7 | ||
|
|
216c97ff9a | ||
|
|
7ecbc3a148 | ||
|
|
c1ffac9998 | ||
|
|
0e723091f9 | ||
|
|
382f718cfc | ||
|
|
b032d765ff | ||
|
|
12a6cb0fbf | ||
|
|
e52ebb095c | ||
|
|
d598c2a919 | ||
|
|
56cf514627 | ||
|
|
66542c34b9 | ||
|
|
378c40b4da | ||
|
|
d3c3fa4a74 | ||
|
|
dcd980381d | ||
|
|
65f3e16775 | ||
|
|
062fac1d43 | ||
|
|
3fd19c60cc | ||
|
|
aef0586ee1 | ||
|
|
48d7fca25e | ||
|
|
7dbe4e98a7 | ||
|
|
75d6abe3bb | ||
|
|
35071b3681 | ||
|
|
baf3ff377e | ||
|
|
64b23e1127 | ||
|
|
e0ef7e3092 | ||
|
|
12fa5b3a66 | ||
|
|
bfda169dfe | ||
|
|
e60a06563e | ||
|
|
efd429464e | ||
|
|
3882b0e2ff | ||
|
|
6b898d1d67 | ||
|
|
75d0b02b3f | ||
|
|
4c05086661 | ||
|
|
f10abda60a | ||
|
|
7fee0cdde1 | ||
|
|
fc718d9437 | ||
|
|
09fd2b86d1 | ||
|
|
3e66898c37 | ||
|
|
44e5d36086 | ||
|
|
80b2d7e4ad | ||
|
|
acb5c7b4ee | ||
|
|
c9bfcb5bc5 | ||
|
|
7223950864 | ||
|
|
601f07cbf2 | ||
|
|
a973dde603 | ||
|
|
89fc67a9f8 | ||
|
|
7c0195da6c | ||
|
|
f69c1acbbe | ||
|
|
05ec4f64e2 | ||
|
|
486d05ff17 | ||
|
|
261a6ff0bb | ||
|
|
a5a41d7163 | ||
|
|
8584f5fece | ||
|
|
f0b62a2b0e | ||
|
|
710b5d8aff | ||
|
|
e9659e61f8 | ||
|
|
c4ee6d5716 | ||
|
|
d67968e3c3 | ||
|
|
39ac7240a8 | ||
|
|
c81052a256 | ||
|
|
b7ded4c934 | ||
|
|
3dda38c8ab | ||
|
|
1a3bd67833 | ||
|
|
10e7c16351 | ||
|
|
ac14bb4736 | ||
|
|
29b283f697 | ||
|
|
45144ee8a8 | ||
|
|
4fe4c2967f | ||
|
|
842b83cbd8 | ||
|
|
6a374dc5a2 | ||
|
|
98358e4400 | ||
|
|
9a08ed1a08 | ||
|
|
71475bb028 | ||
|
|
655d6c9bcd | ||
|
|
307c2d6aed | ||
|
|
1da82b2aeb | ||
|
|
15d7353cb3 | ||
|
|
63ed32ecaa | ||
|
|
577bf0724a | ||
|
|
8ffd167d4b | ||
|
|
852dde6747 | ||
|
|
f800f22a79 | ||
|
|
04f8891dc9 | ||
|
|
f956947c23 | ||
|
|
f3d8fc830e | ||
|
|
f5324060cc | ||
|
|
292c15bf1a | ||
|
|
e0fc8b88c1 | ||
|
|
af2f32ed6a | ||
|
|
f0f6ad20b2 | ||
|
|
c81b606b01 | ||
|
|
9befd776fa | ||
|
|
21f1d8c640 | ||
|
|
793cf991ad | ||
|
|
5f4c464f29 | ||
|
|
3ff245f667 | ||
|
|
86c900313c | ||
|
|
bba8221aa2 | ||
|
|
7ce31444a0 | ||
|
|
2fd55feb0c | ||
|
|
18365135f7 | ||
|
|
d88320b5b3 | ||
|
|
832a7ffd14 | ||
|
|
d29539a395 | ||
|
|
db75b5535c | ||
|
|
ec517a37f6 | ||
|
|
f511c263a0 | ||
|
|
49287e91b1 | ||
|
|
f2c787d0b4 | ||
|
|
8d1b05563c | ||
|
|
b493bfda64 | ||
|
|
fd4e659da7 | ||
|
|
4f6e235c68 | ||
|
|
8b21ee762e | ||
|
|
881e90f7b5 | ||
|
|
66223b4285 | ||
|
|
b950709bea | ||
|
|
18c299b13d | ||
|
|
44f701946b | ||
|
|
9ed3e11aec | ||
|
|
26c61d43f4 | ||
|
|
a79c5ca7ab | ||
|
|
7a43228a2d | ||
|
|
c4b60e6cf8 | ||
|
|
e432ab4842 | ||
|
|
0a0ab8344e | ||
|
|
2d58fc6625 | ||
|
|
18aab4a6b9 | ||
|
|
2d72fe8518 | ||
|
|
90523d6ae0 | ||
|
|
9d24742351 | ||
|
|
ff9cefa6b2 | ||
|
|
b65553e57f | ||
|
|
3a68e40102 | ||
|
|
1a3ae62fd1 | ||
|
|
8cc0eb23d9 | ||
|
|
d6b12b63d0 | ||
|
|
c9aa561aad | ||
|
|
a43f5cdd4e | ||
|
|
c580633598 | ||
|
|
c127938103 | ||
|
|
7f26704e27 | ||
|
|
5f19113c94 | ||
|
|
fad456d18f | ||
|
|
3223026764 | ||
|
|
ae715a827b | ||
|
|
370d1dec88 | ||
|
|
f549c8df43 | ||
|
|
b93644221e | ||
|
|
8a551e1354 | ||
|
|
ddc31d4084 | ||
|
|
0264f68698 | ||
|
|
9057fe550b | ||
|
|
323533c3d3 | ||
|
|
35a7aa1331 | ||
|
|
0f609cd799 | ||
|
|
122d0430db | ||
|
|
4cf7fd151e | ||
|
|
723943abde | ||
|
|
b6779fa95a | ||
|
|
ef5228ae57 | ||
|
|
4cda1b37fd | ||
|
|
c2fb8bf9c2 | ||
|
|
3cd518af3a | ||
|
|
73d00c98a0 | ||
|
|
21c4e4633b | ||
|
|
2b1ceadfab | ||
|
|
2ad9426917 | ||
|
|
65fb0c9829 | ||
|
|
0983f43ae1 | ||
|
|
9fcef29dfa | ||
|
|
3c71e75461 | ||
|
|
42e9b0f735 | ||
|
|
8601963291 | ||
|
|
a7103ef551 | ||
|
|
9295f2df29 | ||
|
|
93eb533579 | ||
|
|
616d76cb7a | ||
|
|
eea975cd25 | ||
|
|
ab1994b2b2 | ||
|
|
cb2d040726 | ||
|
|
8c404909e1 | ||
|
|
ab21a6a915 | ||
|
|
e68681804e | ||
|
|
357b21ae72 | ||
|
|
f8a71311ed | ||
|
|
b6d54cbcaf | ||
|
|
e9e98e777d | ||
|
|
918617d1eb | ||
|
|
10fbe06757 | ||
|
|
4ddc213d7f | ||
|
|
f6cdfa9edf | ||
|
|
7ab7f41b46 | ||
|
|
5ae960947c | ||
|
|
e8b4a97d7d | ||
|
|
cd096f604e | ||
|
|
2517ce48f8 | ||
|
|
c7162720c1 | ||
|
|
597777e80b | ||
|
|
fed06e278b | ||
|
|
0629abac53 | ||
|
|
70d64e2892 | ||
|
|
5e9e48e9e3 | ||
|
|
4cbdbc9a4b | ||
|
|
14d4a8def8 | ||
|
|
0066f226aa | ||
|
|
44daeb7d94 | ||
|
|
9f6da7b2fe | ||
|
|
1da14b0eec | ||
|
|
8569395b5d | ||
|
|
9e6acda85c | ||
|
|
4b38644531 | ||
|
|
4a568ec1ed | ||
|
|
e3f9ee839a | ||
|
|
5004a6f811 | ||
|
|
ed976e07fe | ||
|
|
8ffe804c24 | ||
|
|
61c026e51f | ||
|
|
bb9cd36314 | ||
|
|
fec5c75068 | ||
|
|
bfc67dd99c | ||
|
|
f529aa9e67 | ||
|
|
1421ca4adc | ||
|
|
97a3fd4f3a | ||
|
|
9787c4af7b | ||
|
|
1c778f020f | ||
|
|
726fe1aa27 | ||
|
|
d37d799204 | ||
|
|
87e7ab8862 | ||
|
|
9009ad67b0 | ||
|
|
6387490e4a | ||
|
|
0b0cb19608 | ||
|
|
b4d53ad560 | ||
|
|
0254cab228 | ||
|
|
632afd1fa8 | ||
|
|
d87d0141b3 | ||
|
|
3c6c6c6d05 | ||
|
|
afcf07ca76 | ||
|
|
f94836ef74 | ||
|
|
8653ac9ef8 | ||
|
|
437f3d2477 | ||
|
|
197c052ca6 | ||
|
|
0fdcd2eac7 | ||
|
|
83b234f878 | ||
|
|
c442588b92 | ||
|
|
5cc4890119 | ||
|
|
fcd9ce2015 | ||
|
|
0662e1ccf5 | ||
|
|
1bd9003338 | ||
|
|
e40c385c6a | ||
|
|
93a245136d | ||
|
|
9397583f6c | ||
|
|
e02c90dca5 | ||
|
|
a7f3217c95 | ||
|
|
2c1420b084 | ||
|
|
e52ec39120 | ||
|
|
c1a609653f | ||
|
|
34aeaf97c1 | ||
|
|
749d22b5e6 | ||
|
|
6124e8db76 | ||
|
|
0156ebd277 | ||
|
|
506601bef7 | ||
|
|
96c8f9c082 | ||
|
|
adccc2fa13 | ||
|
|
1f7bc76361 | ||
|
|
225b3dfd19 | ||
|
|
79024f3fb9 | ||
|
|
8e6b51a605 | ||
|
|
5f9c556092 | ||
|
|
b06114dc8d | ||
|
|
158edcad2c | ||
|
|
dad33e6ad0 | ||
|
|
f74e477966 | ||
|
|
4cef9cd480 | ||
|
|
d29915ca3d | ||
|
|
76a2178bd7 | ||
|
|
ca34429617 | ||
|
|
1a86968912 | ||
|
|
42926c6159 | ||
|
|
179413aec2 | ||
|
|
16489fced2 | ||
|
|
174562f95b | ||
|
|
d239dbdc28 | ||
|
|
00a59ed8d6 | ||
|
|
733040e647 | ||
|
|
40ee000680 | ||
|
|
df96823dee | ||
|
|
6ab233a5ba | ||
|
|
535f44b8bf | ||
|
|
8603fc833f | ||
|
|
5618be883b | ||
|
|
0380d2e781 | ||
|
|
b0a730d482 | ||
|
|
73be85dd6d | ||
|
|
c6fc0a134c | ||
|
|
7edea7848d | ||
|
|
1bbbb9dcae | ||
|
|
13161d0eac | ||
|
|
b609ce85b5 | ||
|
|
bfca15bdff | ||
|
|
4c06455105 | ||
|
|
2b383b4ede | ||
|
|
c87716d715 | ||
|
|
496de3a839 | ||
|
|
63fc32e56f | ||
|
|
56b3655f7e | ||
|
|
46caefbeeb | ||
|
|
78168bc984 | ||
|
|
35a5d44399 | ||
|
|
6c858c7a78 | ||
|
|
0930f7a797 | ||
|
|
f6cf8ae208 | ||
|
|
9ece7c907d | ||
|
|
0d408488c5 | ||
|
|
cea5503ca0 | ||
|
|
a5bb966614 | ||
|
|
6c54ed9a09 | ||
|
|
24abb69eec | ||
|
|
719bdcfed4 | ||
|
|
4da435376d | ||
|
|
38bb518e19 | ||
|
|
994341fc3b | ||
|
|
3e112c40f3 | ||
|
|
8349fd0bb9 | ||
|
|
affe0f8e98 | ||
|
|
5d5d06ff41 | ||
|
|
bcf47b465e | ||
|
|
728f98dc07 | ||
|
|
a0b0e13785 | ||
|
|
e952ab16b3 | ||
|
|
6e6f139868 | ||
|
|
0edf96fba6 | ||
|
|
002ece145e | ||
|
|
7016ece34d | ||
|
|
3b0fe69366 | ||
|
|
d1f5e0992b | ||
|
|
383db817f9 | ||
|
|
8ca63e7196 | ||
|
|
d7eec2032e | ||
|
|
72b7e596ee | ||
|
|
16dbbdfe9c | ||
|
|
dfb61f01db | ||
|
|
ea7416216c | ||
|
|
28e1e506f6 | ||
|
|
073cfc0a2e | ||
|
|
f874edf58e | ||
|
|
d05adc89fa | ||
|
|
1d2bf26373 | ||
|
|
dd7007240c | ||
|
|
1208970f6c | ||
|
|
22c7cf7358 | ||
|
|
2ac3b23c0e | ||
|
|
24765929ea | ||
|
|
161ab018ba | ||
|
|
6b976c410c | ||
|
|
4ca61a9d0e | ||
|
|
9a8bf934c6 | ||
|
|
859380afe8 | ||
|
|
8a69f42f84 | ||
|
|
06e0f5d081 | ||
|
|
b83052f8d1 | ||
|
|
130f407287 | ||
|
|
268d988553 | ||
|
|
c8cc2aa6f9 | ||
|
|
bc22cc9ce8 | ||
|
|
0676c9774a | ||
|
|
604ae87192 | ||
|
|
3e1da27f2b | ||
|
|
43a2355665 | ||
|
|
014e650499 | ||
|
|
ec44f6427b | ||
|
|
8e71bcea07 | ||
|
|
b75cefd383 | ||
|
|
c389872408 | ||
|
|
db9eef64a5 | ||
|
|
392e226b2c | ||
|
|
942942780f | ||
|
|
ef8e679d77 | ||
|
|
6973c13608 | ||
|
|
307f95bd03 | ||
|
|
19d354ed05 | ||
|
|
4f04eed4c5 | ||
|
|
721065b307 | ||
|
|
9214381671 | ||
|
|
a2e2f3c07e | ||
|
|
ad4149cc80 | ||
|
|
37f2ff11e4 | ||
|
|
67683722c8 | ||
|
|
f92e581e13 | ||
|
|
795df06283 | ||
|
|
1c3ed97e3b | ||
|
|
63681a736a | ||
|
|
00a507c875 | ||
|
|
ce94b3f0b4 | ||
|
|
7c302c395e | ||
|
|
25ae844d55 | ||
|
|
89f4a5597b | ||
|
|
e52fbf2e6a | ||
|
|
62c3f9c1e3 | ||
|
|
042e3653cf | ||
|
|
a8dc8cb236 | ||
|
|
a62573ad41 | ||
|
|
5079cb0a25 | ||
|
|
28539221ce | ||
|
|
56d187b942 | ||
|
|
e7c535b0cb | ||
|
|
4c24d39122 | ||
|
|
f9ffcfdb7d | ||
|
|
b85b3b4e24 | ||
|
|
aaadec99e0 | ||
|
|
6cddad02a8 | ||
|
|
4c0bb63e2b | ||
|
|
4bf7c6fb6e | ||
|
|
b6093a2452 | ||
|
|
6a077806c6 | ||
|
|
31a54e063a | ||
|
|
cc3364db7f | ||
|
|
643bf19466 | ||
|
|
d2f5f1fe60 | ||
|
|
6300c6045a | ||
|
|
5875013670 | ||
|
|
25947a1b00 | ||
|
|
87f250deec | ||
|
|
2b92438d94 | ||
|
|
6b492cd8c4 | ||
|
|
bace74fba4 | ||
|
|
f97eded57e | ||
|
|
c82f224598 | ||
|
|
e3aaffc8fd | ||
|
|
bae425ca05 | ||
|
|
5265d70329 | ||
|
|
ef234503ef | ||
|
|
c34127e754 | ||
|
|
7b6bdc4c2b | ||
|
|
70198b07a5 | ||
|
|
11fc46ca6f | ||
|
|
31569dc952 | ||
|
|
4b6a12a251 | ||
|
|
994b1689e3 | ||
|
|
04751defa0 | ||
|
|
bcb0c9d8cb | ||
|
|
1bc50dbeb5 | ||
|
|
3d120ac103 | ||
|
|
5e322ea078 | ||
|
|
c5d77f0e7e | ||
|
|
38607ee445 | ||
|
|
520105aaa7 | ||
|
|
64d2827233 | ||
|
|
a7832a203f | ||
|
|
387725ce60 | ||
|
|
342ffadc59 | ||
|
|
82746d4549 | ||
|
|
c8ff22ced0 | ||
|
|
af116d1d80 | ||
|
|
0626371378 | ||
|
|
6179abd6f7 | ||
|
|
85c9db4bcd | ||
|
|
d14a72795c | ||
|
|
88e45f85c3 | ||
|
|
02203389c2 | ||
|
|
cfbe91a709 | ||
|
|
5f4cf7b908 | ||
|
|
d2969048ff | ||
|
|
cceea0a504 | ||
|
|
db994e2ec0 | ||
|
|
9197739cf4 | ||
|
|
d6300a2e82 | ||
|
|
4fee95c468 | ||
|
|
46ddf2ed70 | ||
|
|
c2d2958205 | ||
|
|
22c62fb53f | ||
|
|
d78d717733 | ||
|
|
bab030d793 | ||
|
|
d79588ddf4 | ||
|
|
a3cc6abba6 | ||
|
|
8e7f9d7c38 | ||
|
|
e4365fcac4 | ||
|
|
9c828c7630 | ||
|
|
53fdcf91d7 | ||
|
|
9b084fc376 | ||
|
|
8cce985765 | ||
|
|
5c327f2f2f | ||
|
|
1e79ccf305 | ||
|
|
1264122e76 | ||
|
|
c1c78404b6 | ||
|
|
d759123886 | ||
|
|
3191a31ce8 | ||
|
|
a9087fbaa2 | ||
|
|
7ce69959f9 | ||
|
|
f48d2df634 | ||
|
|
2db3f0deb7 | ||
|
|
0999226103 | ||
|
|
e8db23d241 | ||
|
|
427d33c706 | ||
|
|
576373552a | ||
|
|
b09a711eb0 | ||
|
|
f2bfbab6a0 | ||
|
|
1598e44231 | ||
|
|
db1faf85f7 | ||
|
|
faa1b77844 | ||
|
|
b4dc9254ac | ||
|
|
b350dc5198 | ||
|
|
dd9812e1e9 | ||
|
|
275bf46831 | ||
|
|
18f528eceb | ||
|
|
3bf2ca05f1 | ||
|
|
abd945fde1 | ||
|
|
7bfe001d22 | ||
|
|
a081bf2f91 | ||
|
|
eaece2734b | ||
|
|
36a232182a | ||
|
|
930112753a | ||
|
|
82f7fe88b0 | ||
|
|
af17b64a58 | ||
|
|
78a807cc26 | ||
|
|
18c1210e87 | ||
|
|
781633c716 | ||
|
|
90730787f3 | ||
|
|
bc1aa84cac | ||
|
|
faa460ae88 | ||
|
|
1a1f9b0c9d | ||
|
|
4344d41b36 | ||
|
|
d7dc0b789d | ||
|
|
227998f9cd | ||
|
|
9ad0da6134 | ||
|
|
52f8e1cbf3 | ||
|
|
3972bc19c7 | ||
|
|
cd09726904 | ||
|
|
b6f1eebab3 | ||
|
|
6225b89c76 | ||
|
|
1b819c6816 | ||
|
|
0ae344841f | ||
|
|
bb9c751b50 | ||
|
|
0ba9aee428 | ||
|
|
26229efe78 | ||
|
|
03f49f8209 | ||
|
|
f4a1da4be9 | ||
|
|
8ef0dd095a | ||
|
|
915e1e5603 | ||
|
|
3628a1ae48 | ||
|
|
9b3afc7b37 | ||
|
|
4933fa1c27 | ||
|
|
72455e441f | ||
|
|
16764dfa31 | ||
|
|
ddfa7595b0 | ||
|
|
94bde17256 | ||
|
|
2d9a0c76c5 | ||
|
|
05c14dfe78 | ||
|
|
2042aad126 | ||
|
|
888efa54e2 | ||
|
|
d2aa05a9fe | ||
|
|
bda6ee9a14 | ||
|
|
55c8c91e07 | ||
|
|
6292f937da | ||
|
|
77db3d450e | ||
|
|
b8bf15de16 | ||
|
|
f8898d01ce | ||
|
|
78f8565270 | ||
|
|
a319ac2f4e | ||
|
|
a8fbad5d8b | ||
|
|
ea1320bee7 | ||
|
|
cc412a80ad | ||
|
|
8d5c90b0d0 | ||
|
|
575d2e7998 | ||
|
|
3b1109c47b | ||
|
|
ccbb5e84f9 | ||
|
|
9321828158 | ||
|
|
f03a9ac505 | ||
|
|
ceeac4791e | ||
|
|
fe9c28538c | ||
|
|
3cfa5b993d | ||
|
|
6e30b8ea92 | ||
|
|
84edec4fad | ||
|
|
ea75d9919f | ||
|
|
60686a3b75 | ||
|
|
839d04f768 | ||
|
|
3e31d31f3e | ||
|
|
ae99d95c1a | ||
|
|
0ab5ef426b | ||
|
|
70956ea969 | ||
|
|
bd36873362 | ||
|
|
722777c2a9 | ||
|
|
acc4fe4d7d | ||
|
|
4f7b5eab7f | ||
|
|
23112a6434 | ||
|
|
674f3d46e8 | ||
|
|
28769f2609 | ||
|
|
19e5f1fef2 | ||
|
|
f42b41e1e9 | ||
|
|
7a24abb27c | ||
|
|
5b3a143ffe | ||
|
|
9008b93962 | ||
|
|
fc78f6950f | ||
|
|
86a1d1db30 | ||
|
|
3a9cb1ac49 | ||
|
|
85e4d3572d | ||
|
|
2098515f6a | ||
|
|
73848f4cd0 | ||
|
|
34fa81eaf3 | ||
|
|
04284a9fe3 | ||
|
|
d189a3f3cf | ||
|
|
614c1fdba2 | ||
|
|
b7768a74a7 | ||
|
|
d05299f57a | ||
|
|
3a5aad516a | ||
|
|
fff96a0ce6 | ||
|
|
16584dfee6 | ||
|
|
82526b803c | ||
|
|
58f37fc013 | ||
|
|
710bf34fbd | ||
|
|
f5ca66805b | ||
|
|
30dc24191f | ||
|
|
b2834c30a6 | ||
|
|
98c8f2f6a3 | ||
|
|
b8ef783052 | ||
|
|
9eb86e8015 | ||
|
|
eb62d03e33 | ||
|
|
8b1526e95e | ||
|
|
bb1822faea | ||
|
|
46f6f9f899 | ||
|
|
aacb1adcd1 | ||
|
|
853e5fc652 | ||
|
|
306c921ed1 | ||
|
|
6fe8c7b32c | ||
|
|
a23cc5aa14 | ||
|
|
f539312af3 | ||
|
|
00a44fa36c | ||
|
|
1f13f870b8 | ||
|
|
0901c145ba | ||
|
|
2cc1b25eef | ||
|
|
5333f5f987 | ||
|
|
0cb0bd0f25 | ||
|
|
7ebc9a4511 | ||
|
|
4c9fcd6d21 | ||
|
|
d28b456b31 | ||
|
|
6fcb54d2ca | ||
|
|
9b1170a65d | ||
|
|
46e7f8e4fb | ||
|
|
cb99ae5032 | ||
|
|
343ff4faed | ||
|
|
c69ea1a143 | ||
|
|
8677f957fb | ||
|
|
005b4505f5 | ||
|
|
0584ba1218 | ||
|
|
fffc6d1a17 | ||
|
|
674038c281 | ||
|
|
8d9da429c2 | ||
|
|
d451f690ef | ||
|
|
2ee52c4fde | ||
|
|
f77113c04f | ||
|
|
903bc8d04e | ||
|
|
011056af15 | ||
|
|
6986aa9aa2 | ||
|
|
14f25337e7 | ||
|
|
a52fd670e6 | ||
|
|
89bfbfdeee | ||
|
|
a6254f4344 | ||
|
|
5d6c4109e9 | ||
|
|
284d3414e1 | ||
|
|
67372b369e | ||
|
|
afedba5c2f | ||
|
|
42f6ba04a2 | ||
|
|
90bf13efd5 | ||
|
|
9c67605233 | ||
|
|
7e08347d5c | ||
|
|
1fa4c20c27 | ||
|
|
98458c56cc | ||
|
|
0a10d17c28 | ||
|
|
ed34c35509 | ||
|
|
b1be9f50ab | ||
|
|
12b6b786fd | ||
|
|
eda33385e6 | ||
|
|
ffdc3f81df | ||
|
|
bbeed82378 | ||
|
|
e56948650f | ||
|
|
0e1fd9a12c | ||
|
|
33b796ed3a | ||
|
|
dbbb2a5ca4 | ||
|
|
005122e581 | ||
|
|
0cae6b8e68 | ||
|
|
0f4f4c7544 | ||
|
|
bb03afdb77 | ||
|
|
345dd1484c | ||
|
|
7fd84e93f4 | ||
|
|
7d8929c470 | ||
|
|
05368d2c58 | ||
|
|
c6c977070e | ||
|
|
09be96a6aa | ||
|
|
559434afca | ||
|
|
594ff413f4 | ||
|
|
1725710feb | ||
|
|
a6bc701917 | ||
|
|
eff137a5f5 | ||
|
|
ccb309bd5c | ||
|
|
b883a15d82 | ||
|
|
16fc045509 | ||
|
|
259ae8a39d | ||
|
|
3cb4938c63 | ||
|
|
dade18bddf | ||
|
|
258804ab16 | ||
|
|
0c4f9b878a | ||
|
|
386ab580cd | ||
|
|
dea22b0b5d | ||
|
|
9485634d41 | ||
|
|
8f26d181c3 | ||
|
|
a5f6cb3c57 |
8395 changed files with 489779 additions and 645766 deletions
|
|
@ -1,68 +0,0 @@
|
|||
# all: Prune trailing whitespace.
|
||||
dda9b9c6da5d3c31fa8769e581a753e95a270803
|
||||
|
||||
# all: Remove the "STATIC" macro and just use "static" instead.
|
||||
decf8e6a8bb940d5829ca3296790631fcece7b21
|
||||
|
||||
# renesas-ra: Fix spelling mistakes found by codespell.
|
||||
b3f2f18f927fa2fad10daf63d8c391331f5edf58
|
||||
|
||||
# all: Update Python formatting to ruff-format.
|
||||
bbd8760bd9a2302e5abee29db279102bb11d7732
|
||||
|
||||
# all: Fix various spelling mistakes found by codespell 2.2.6.
|
||||
cf490a70917a1b2d38ba9b58e763e0837d0f7ca7
|
||||
|
||||
# all: Fix spelling mistakes based on codespell check.
|
||||
b1229efbd1509654dec6053865ab828d769e29db
|
||||
|
||||
# top: Update Python formatting to black "2023 stable style".
|
||||
8b2748269244304854b3462cb8902952b4dcb892
|
||||
|
||||
# all: Reformat remaining C code that doesn't have a space after a comma.
|
||||
5b700b0af90591d6b1a2c087bb8de6b7f1bfdd2d
|
||||
|
||||
# ports: Reformat more C and Python source code.
|
||||
5c32111fa0e31e451b0f1666bdf926be2fdfd82c
|
||||
|
||||
# all: Update Python formatting to latest Black version 22.1.0.
|
||||
ab2923dfa1174dc177f0a90cb00a7e4ff87958d2
|
||||
|
||||
# all: Update Python formatting to latest Black version 21.12b0.
|
||||
3770fab33449a5dadf8eb06edfae0767e75320a6
|
||||
|
||||
# tools/gen-cpydiff.py: Fix formatting of doc strings for new Black.
|
||||
0f78c36c5aa458a954eed39a46942209107a553e
|
||||
|
||||
# tests/run-tests.py: Reformat with Black.
|
||||
2a38d7103672580882fb621a5b76e8d26805d593
|
||||
|
||||
# all: Update Python code to conform to latest black formatting.
|
||||
06659077a81b85882254cf0953c33b27614e018e
|
||||
|
||||
# tools/uncrustify: Enable more opts to remove space between func and '('.
|
||||
77ed6f69ac35c1663a5633a8ee1d8a2446542204
|
||||
|
||||
# tools/codeformat.py: Include extmod/{btstack,nimble} in code formatting.
|
||||
026fda605e03113d6e753290d65fed774418bc53
|
||||
|
||||
# all: Format code to add space after C++-style comment start.
|
||||
84fa3312cfa7d2237d4b56952f2cd6e3591210c4
|
||||
|
||||
# tests: Format all Python code with black, except tests in basics subdir.
|
||||
3dc324d3f1312e40d3a8ed87e7244966bb756f26
|
||||
|
||||
# all: Remove spaces inside and around parenthesis.
|
||||
1a3e386c67e03a79eb768cb6e9f6777e002d6660
|
||||
|
||||
# all: Remove spaces between nested paren and inside function arg paren.
|
||||
feb25775851ba0c04b8d1013716f442258879d9c
|
||||
|
||||
# all: Reformat C and Python source code with tools/codeformat.py.
|
||||
69661f3343bedf86e514337cff63d96cc42f8859
|
||||
|
||||
# stm32/usbdev: Convert files to unix line endings.
|
||||
abde0fa2267f9062b28c3c015d7662a550125cc6
|
||||
|
||||
# all: Remove trailing spaces, per coding conventions.
|
||||
761e4c7ff62896c7d8f8c3dfc3cc98a4cc4f2f6f
|
||||
10
.gitattributes
vendored
10
.gitattributes
vendored
|
|
@ -1,3 +1,7 @@
|
|||
# SPDX-FileCopyrightText: 2014 MicroPython & CircuitPython contributors (https://github.com/adafruit/circuitpython/graphs/contributors)
|
||||
#
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
# Per default everything gets normalized and gets LF line endings on checkout.
|
||||
* text eol=lf
|
||||
|
||||
|
|
@ -8,12 +12,14 @@
|
|||
|
||||
# These are binary so should never be modified by git.
|
||||
*.a binary
|
||||
*.ico binary
|
||||
*.png binary
|
||||
*.jpg binary
|
||||
*.dxf binary
|
||||
*.mpy binary
|
||||
*.der binary
|
||||
*.deb binary
|
||||
*.zip binary
|
||||
*.pdf binary
|
||||
*.wav binary
|
||||
|
||||
# These should also not be modified by git.
|
||||
tests/basics/string_cr_conversion.py -text
|
||||
|
|
|
|||
1
.github/FUNDING.yml
vendored
1
.github/FUNDING.yml
vendored
|
|
@ -1 +0,0 @@
|
|||
github: micropython
|
||||
54
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
54
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
title: ''
|
||||
labels: 'bug'
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
<!-- Thanks! for testing out CircuitPython. Now that you have got a problem...
|
||||
you can file a bug report for it. Feel free to modify the below format to better
|
||||
suit your issue. :) -->
|
||||
|
||||
**Firmware**
|
||||
|
||||
<!-- Include the version of CircuitPython you're running. You can see it in the
|
||||
`boot_out.txt` file, as well as in the REPL. -->
|
||||
|
||||
```python
|
||||
Adafruit CircuitPython 6.2.0-beta.2 on 2021-03-01; Raspberry Pi Pico with rp2040
|
||||
```
|
||||
|
||||
**Code/REPL**
|
||||
|
||||
<!-- Include your code that reproduces the bug here. Try to distill down to the
|
||||
minimum possible to reproduce. -->
|
||||
|
||||
```python
|
||||
import busio, bitbangio
|
||||
i2c = bitbangio.I2C(board.GP1, board.GP0)
|
||||
```
|
||||
|
||||
**Behavior**
|
||||
|
||||
<!-- What happens when you run the code above? Include any error messages. -->
|
||||
|
||||
```python
|
||||
Traceback (most recent call last):
|
||||
File "<stdin>", line 1, in <module>
|
||||
TimeoutError: Clock stretch too long
|
||||
```
|
||||
|
||||
**Description**
|
||||
|
||||
<!-- Optionally, describe the issue in more detail. Here are some examples: -->
|
||||
|
||||
- Error while using i2c...
|
||||
- Only happens when...
|
||||
- might be related to #4291...
|
||||
|
||||
**Additional Info**
|
||||
|
||||
<!-- Optionally, add any other information like hardware connection, scope output etc.
|
||||
If you have already done some debugging, mention it here. -->
|
||||
109
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
109
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
|
|
@ -1,109 +0,0 @@
|
|||
name: Bug report
|
||||
description: Report a bug or unexpected behaviour
|
||||
labels: ["bug"]
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Please provide as much detail as you can, it really helps us find and fix bugs faster.
|
||||
|
||||
#### Not a bug report?
|
||||
|
||||
* If you have a question \"How Do I ...?\", please post it on [GitHub Discussions](https://github.com/orgs/micropython/discussions/) or [Discord](https://discord.gg/RB8HZSAExQ) instead of here.
|
||||
* For missing or incorrect documentation, or feature requests, then please [choose a different issue type](https://github.com/micropython/micropython/issues/new/choose).
|
||||
|
||||
#### Existing issue?
|
||||
|
||||
* Please search for [existing issues](https://github.com/micropython/micropython/issues) matching this bug before reporting.
|
||||
- type: input
|
||||
id: port-board-hw
|
||||
attributes:
|
||||
label: Port, board and/or hardware
|
||||
description: |
|
||||
Which MicroPython port(s) and board(s) are you using?
|
||||
placeholder: |
|
||||
esp32 port, ESP32-Fantastic board.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: version
|
||||
attributes:
|
||||
label: MicroPython version
|
||||
description: |
|
||||
To find the version:
|
||||
|
||||
1. Open a serial REPL.
|
||||
2. Type Ctrl-B to see the startup message.
|
||||
3. Copy-paste that output here.
|
||||
|
||||
If the issue is about building MicroPython, please provide output of `git describe --dirty` and as much information as possible about the build environment.
|
||||
|
||||
If the version or configuration is modified from the official MicroPython releases or the master branch, please tell us the details of this as well.
|
||||
placeholder: |
|
||||
MicroPython v6.28.3 on 2029-01-23; PyBoard 9 with STM32F9
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: steps-reproduce
|
||||
attributes:
|
||||
label: Reproduction
|
||||
description: |
|
||||
What steps will reproduce the problem? Please include all details that could be relevant about the environment, configuration, etc.
|
||||
|
||||
If there is Python code to reproduce this issue then please either:
|
||||
a. Type it into a code block below ([code block guide](https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/creating-and-highlighting-code-blocks)), or
|
||||
b. Post longer code to a [GitHub gist](https://gist.github.com/), or
|
||||
c. Create a sample project on GitHub.
|
||||
|
||||
For build issues, please provide the exact build commands that you ran.
|
||||
placeholder: |
|
||||
1. Copy paste the code provided below into a new file
|
||||
2. Use `mpremote run` to execute it on the board.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: expected
|
||||
attributes:
|
||||
label: Expected behaviour
|
||||
description: |
|
||||
What did you expect MicroPython to do? If comparing output with CPython or a different MicroPython port/version then please provide that output here.
|
||||
placeholder: |
|
||||
Expected to print "Hello World".
|
||||
|
||||
Here is the correct output, seen with previous MicroPython version v3.14.159:
|
||||
|
||||
> [...]
|
||||
- type: textarea
|
||||
id: what-happened
|
||||
attributes:
|
||||
label: Observed behaviour
|
||||
description: |
|
||||
What actually happened? Where possible please paste exact output, or the complete build log, etc. Very long output can be linked in a [GitHub gist](https://gist.github.com/).
|
||||
placeholder: |
|
||||
This unexpected exception appears:
|
||||
|
||||
> [...]
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: additional
|
||||
attributes:
|
||||
label: Additional Information
|
||||
description: |
|
||||
Is there anything else that might help to resolve this issue?
|
||||
value: No, I've provided everything above.
|
||||
- type: dropdown
|
||||
id: code-of-conduct
|
||||
attributes:
|
||||
label: Code of Conduct
|
||||
description: |
|
||||
Do you agree to follow the MicroPython [Code of Conduct](https://github.com/micropython/micropython/blob/master/CODEOFCONDUCT.md) to ensure a safe and respectful space for everyone?
|
||||
options:
|
||||
- "Yes, I agree"
|
||||
multiple: true
|
||||
validations:
|
||||
required: true
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Thanks for taking the time to help improve MicroPython.
|
||||
16
.github/ISSUE_TEMPLATE/config.yml
vendored
16
.github/ISSUE_TEMPLATE/config.yml
vendored
|
|
@ -1,11 +1,7 @@
|
|||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: MicroPython GitHub Discussions
|
||||
url: https://github.com/orgs/micropython/discussions
|
||||
about: Community discussion about all things MicroPython. This is the best place to start if you have questions about using MicroPython or getting started with MicroPython development.
|
||||
- name: MicroPython Documentation
|
||||
url: https://docs.micropython.org/
|
||||
about: Documentation for using and working with MicroPython and libraries.
|
||||
- name: MicroPython Downloads
|
||||
url: https://micropython.org/download/
|
||||
about: Pre-built firmware and information for most supported boards.
|
||||
- name: Adafruit Forum
|
||||
url: https://forums.adafruit.com/
|
||||
about: Official Adafruit technical support forum. Good for getting help on getting a project working.
|
||||
- name: Adafruit Discord
|
||||
url: https://adafru.it/discord
|
||||
about: Unofficial chat with many helpful folks and normally prompt replies.
|
||||
|
|
|
|||
46
.github/ISSUE_TEMPLATE/documentation.yml
vendored
46
.github/ISSUE_TEMPLATE/documentation.yml
vendored
|
|
@ -1,46 +0,0 @@
|
|||
name: Documentation issue
|
||||
description: Report areas of the documentation or examples that need improvement
|
||||
title: "docs: "
|
||||
labels: ["documentation"]
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
This form is for reporting issues with the documentation or examples provided with MicroPython.
|
||||
|
||||
If you have a general question \"How Do I ...?\", please post it on [GitHub Discussions](https://github.com/orgs/micropython/discussions/) or [Discord](https://discord.gg/RB8HZSAExQ) instead of here.
|
||||
|
||||
#### Existing issue?
|
||||
|
||||
* Please search for [existing issues](https://github.com/micropython/micropython/issues) before reporting a new one.
|
||||
- type: input
|
||||
id: page
|
||||
attributes:
|
||||
label: Documentation URL
|
||||
description: |
|
||||
Does this issue relate to a particular page in the [online documentation](https://docs.micropython.org/en/latest/)? If yes, please paste the URL of the page:
|
||||
placeholder: |
|
||||
https://docs.micropython.org/en/latest/
|
||||
- type: textarea
|
||||
id: version
|
||||
attributes:
|
||||
label: Description
|
||||
description: |
|
||||
Please describe what was missing from the documentation and/or what was incorrect/incomplete.
|
||||
validations:
|
||||
required: true
|
||||
- type: dropdown
|
||||
id: code-of-conduct
|
||||
attributes:
|
||||
label: Code of Conduct
|
||||
description: |
|
||||
Do you agree to follow the MicroPython [Code of Conduct](https://github.com/micropython/micropython/blob/master/CODEOFCONDUCT.md) to ensure a safe and respectful space for everyone?
|
||||
options:
|
||||
- "Yes, I agree"
|
||||
multiple: true
|
||||
validations:
|
||||
required: true
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Thanks for taking the time to help improve MicroPython.
|
||||
11
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
11
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
name: Feature request
|
||||
about: Suggest an idea for this project
|
||||
title: ''
|
||||
labels: 'enhancement'
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
<!-- We are always adding new features and enhancements to CircuitPython 🚀
|
||||
and would love ❤ to see what new challenge you have got for us... 🙂 -->
|
||||
74
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
74
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
|
|
@ -1,74 +0,0 @@
|
|||
name: Feature request
|
||||
description: Request a feature or improvement
|
||||
labels: ['enhancement']
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
This form is for requesting features or improvements in MicroPython.
|
||||
|
||||
#### Get feedback first
|
||||
|
||||
Before submitting a new feature idea here, suggest starting a discussion on [Discord](https://discord.gg/RB8HZSAExQ) or [GitHub Discussions](https://github.com/orgs/micropython/discussions/) to get early feedback from the community and maintainers.
|
||||
|
||||
#### Not a MicroPython core feature?
|
||||
|
||||
* If you have a question \"How Do I ...?\", please post it on GitHub Discussions or Discord instead of here.
|
||||
* Could this feature be implemented as a pure Python library? If so, please open the request on the [micropython-lib repository](https://github.com/micropython/micropython-lib/issues) instead.
|
||||
|
||||
#### Existing issue?
|
||||
|
||||
* Please search for [existing issues](https://github.com/micropython/micropython/issues) before opening a new one.
|
||||
- type: textarea
|
||||
id: feature
|
||||
attributes:
|
||||
label: Description
|
||||
description: |
|
||||
Describe the feature you'd like to see added to MicroPython. What does this feature enable and why is it useful?
|
||||
|
||||
* For core Python features, where possible please include a link to the relevant PEP or CPython documentation.
|
||||
* For new architectures / ports / boards, please provide links to relevant documentation, specifications, and toolchains. Any information about the popularity and unique features about this hardware would also be useful.
|
||||
* For features for existing ports (e.g. new peripherals or microcontroller features), please describe which port(s) it applies to, and whether this is could be an extension to the machine API or a port-specific module?
|
||||
* For drivers (e.g. for external hardware), please link to datasheets and/or existing drivers from other sources.
|
||||
|
||||
If there is an existing discussion somewhere about this feature, please add a link to it as well.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: size
|
||||
attributes:
|
||||
label: Code Size
|
||||
description: |
|
||||
MicroPython aims to strike a balance between functionality and code size. Can this feature be optionally enabled?
|
||||
|
||||
If you believe the usefulness of this feature would outweigh the additional code size, please explain. (It's OK to say you're unsure here, we're happy to discuss this with you.)
|
||||
- type: dropdown
|
||||
id: implementation
|
||||
attributes:
|
||||
label: Implementation
|
||||
description: |
|
||||
What is your suggestion for implementing this feature?
|
||||
|
||||
(See also: [How to sponsor](https://github.com/sponsors/micropython#sponsors), [How to submit a Pull Request](https://github.com/micropython/micropython/wiki/ContributorGuidelines).)
|
||||
options:
|
||||
- I hope the MicroPython maintainers or community will implement this feature
|
||||
- I intend to implement this feature and would submit a Pull Request if desirable
|
||||
- I would like to sponsor development of this feature
|
||||
multiple: true
|
||||
validations:
|
||||
required: true
|
||||
- type: dropdown
|
||||
id: code-of-conduct
|
||||
attributes:
|
||||
label: Code of Conduct
|
||||
description: |
|
||||
Do you agree to follow the MicroPython [Code of Conduct](https://github.com/micropython/micropython/blob/master/CODEOFCONDUCT.md) to ensure a safe and respectful space for everyone?
|
||||
options:
|
||||
- "Yes, I agree"
|
||||
multiple: true
|
||||
validations:
|
||||
required: true
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Thanks for taking the time to suggest improvements for MicroPython.
|
||||
60
.github/ISSUE_TEMPLATE/security.yml
vendored
60
.github/ISSUE_TEMPLATE/security.yml
vendored
|
|
@ -1,60 +0,0 @@
|
|||
name: Security report
|
||||
description: Report a security issue or vulnerability in MicroPython
|
||||
labels: ["security"]
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
This form is for reporting security issues in MicroPython that are not readily exploitable.
|
||||
|
||||
1. For issues that are readily exploitable or have high impact, please email contact@micropython.org instead.
|
||||
1. If this is a question about security, please ask it in [Discussions](https://github.com/orgs/micropython/discussions/) or [Discord](https://discord.gg/RB8HZSAExQ) instead.
|
||||
|
||||
#### Existing issue?
|
||||
|
||||
* Please search for [existing issues](https://github.com/micropython/micropython/issues) before reporting a new one.
|
||||
|
||||
- type: input
|
||||
id: port-board-hw
|
||||
attributes:
|
||||
label: Port, board and/or hardware
|
||||
description: |
|
||||
Which MicroPython port(s) and board(s) are you using?
|
||||
placeholder: |
|
||||
esp32 port, ESP32-Duper board.
|
||||
- type: textarea
|
||||
id: version
|
||||
attributes:
|
||||
label: MicroPython version
|
||||
description: |
|
||||
To find the version:
|
||||
|
||||
1. Open a serial REPL.
|
||||
2. Type Ctrl-B to see the startup message.
|
||||
3. Copy-paste that output here.
|
||||
|
||||
If the version or configuration is modified from the official MicroPython releases or the master branch, please tell us the details of this as well.
|
||||
placeholder: |
|
||||
MicroPython v6.28.3 on 2029-01-23; PyBoard 9 with STM32F9
|
||||
- type: textarea
|
||||
id: report
|
||||
attributes:
|
||||
label: Issue Report
|
||||
description: |
|
||||
Please provide a clear and concise description of the security issue.
|
||||
|
||||
* What does this issue allow an attacker to do?
|
||||
* How does the attacker exploit this issue?
|
||||
validations:
|
||||
required: true
|
||||
- type: dropdown
|
||||
id: code-of-conduct
|
||||
attributes:
|
||||
label: Code of Conduct
|
||||
description: |
|
||||
Do you agree to follow the MicroPython [Code of Conduct](https://github.com/micropython/micropython/blob/master/CODEOFCONDUCT.md) to ensure a safe and respectful space for everyone?
|
||||
options:
|
||||
- "Yes, I agree"
|
||||
multiple: true
|
||||
validations:
|
||||
required: true
|
||||
7
.github/dependabot.yml
vendored
7
.github/dependabot.yml
vendored
|
|
@ -1,7 +0,0 @@
|
|||
version: 2
|
||||
updates:
|
||||
# Maintain dependencies for GitHub Actions
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "daily"
|
||||
33
.github/pull_request_template.md
vendored
33
.github/pull_request_template.md
vendored
|
|
@ -1,33 +0,0 @@
|
|||
<!-- Thanks for submitting a Pull Request! We appreciate you spending the
|
||||
time to improve MicroPython. Please provide enough information so that
|
||||
others can review your Pull Request.
|
||||
|
||||
Before submitting, please read:
|
||||
https://github.com/micropython/micropython/blob/master/CODEOFCONDUCT.md
|
||||
https://github.com/micropython/micropython/wiki/ContributorGuidelines
|
||||
|
||||
Please check any CI failures that appear after your Pull Request is opened.
|
||||
-->
|
||||
|
||||
### Summary
|
||||
|
||||
<!-- Explain the reason for making this change. What problem does the pull request
|
||||
solve, or what improvement does it add? Add links if relevant. -->
|
||||
|
||||
|
||||
### Testing
|
||||
|
||||
<!-- Explain what testing you did, and on which boards/ports. If there are
|
||||
boards or ports that you couldn't test, please mention this here as well.
|
||||
|
||||
If you leave this empty then your Pull Request may be closed. -->
|
||||
|
||||
|
||||
### Trade-offs and Alternatives
|
||||
|
||||
<!-- If the Pull Request has some negative impact (i.e. increased code size)
|
||||
then please explain why you think the trade-off improvement is worth it.
|
||||
If you can think of alternative ways to do this, please explain that here too.
|
||||
|
||||
Delete this heading if not relevant (i.e. small fixes) -->
|
||||
|
||||
16
.github/workflows/biome.yml
vendored
16
.github/workflows/biome.yml
vendored
|
|
@ -1,16 +0,0 @@
|
|||
name: JavaScript code lint and formatting with Biome
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
eslint:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v5
|
||||
- name: Setup Biome
|
||||
uses: biomejs/setup-biome@v2
|
||||
with:
|
||||
version: 1.5.3
|
||||
- name: Run Biome
|
||||
run: biome ci --indent-style=space --indent-width=4 tests/ ports/webassembly
|
||||
560
.github/workflows/build.yml
vendored
Normal file
560
.github/workflows/build.yml
vendored
Normal file
|
|
@ -0,0 +1,560 @@
|
|||
# SPDX-FileCopyrightText: 2014 MicroPython & CircuitPython contributors (https://github.com/adafruit/circuitpython/graphs/contributors)
|
||||
#
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
name: Build CI
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
release:
|
||||
types: [published]
|
||||
check_suite:
|
||||
types: [rerequested]
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
- name: Dump GitHub context
|
||||
env:
|
||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||
run: echo "$GITHUB_CONTEXT"
|
||||
- uses: actions/checkout@v2.2.0
|
||||
with:
|
||||
submodules: true
|
||||
fetch-depth: 0
|
||||
- run: git fetch --recurse-submodules=no https://github.com/adafruit/circuitpython refs/tags/*:refs/tags/*
|
||||
- name: CircuitPython version
|
||||
run: |
|
||||
git describe --dirty --tags
|
||||
echo >>$GITHUB_ENV CP_VERSION=$(git describe --dirty --tags)
|
||||
- name: Set up Python 3.8
|
||||
uses: actions/setup-python@v1
|
||||
with:
|
||||
python-version: 3.8
|
||||
- name: Install deps
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y eatmydata
|
||||
sudo eatmydata apt-get install -y gettext librsvg2-bin mingw-w64 latexmk texlive-fonts-recommended texlive-latex-recommended texlive-latex-extra
|
||||
pip install -r requirements-dev.txt
|
||||
- name: Versions
|
||||
run: |
|
||||
gcc --version
|
||||
python3 --version
|
||||
- name: New boards check
|
||||
run: python3 -u ci_new_boards_check.py
|
||||
working-directory: tools
|
||||
- name: Duplicate USB VID/PID Check
|
||||
run: python3 -u -m tools.ci_check_duplicate_usb_vid_pid
|
||||
- name: Build and Validate Stubs
|
||||
run: make check-stubs -j2
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: stubs
|
||||
path: circuitpython-stubs*
|
||||
- name: Test Documentation Build (HTML)
|
||||
run: sphinx-build -E -W -b html -D version=${{ env.CP_VERSION }} -D release=${{ env.CP_VERSION }} . _build/html
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: docs
|
||||
path: _build/html
|
||||
- name: Test Documentation Build (LaTeX/PDF)
|
||||
run: |
|
||||
make latexpdf
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: docs
|
||||
path: _build/latex
|
||||
- name: Build mpy-cross
|
||||
run: make -C mpy-cross -j2
|
||||
- name: Build unix port
|
||||
run: |
|
||||
make -C ports/unix deplibs -j2
|
||||
make -C ports/unix -j2
|
||||
make -C ports/unix coverage -j2
|
||||
- name: Test all
|
||||
run: MICROPY_CPYTHON3=python3.8 MICROPY_MICROPYTHON=../ports/unix/micropython_coverage ./run-tests -j1
|
||||
working-directory: tests
|
||||
- name: Print failure info
|
||||
run: |
|
||||
shopt -s nullglob;
|
||||
for exp in *.exp;
|
||||
do testbase=$(basename $exp .exp);
|
||||
echo -e "\nFAILURE $testbase";
|
||||
diff -u $testbase.exp $testbase.out;
|
||||
done
|
||||
working-directory: tests
|
||||
if: failure()
|
||||
- name: Native Tests
|
||||
run: MICROPY_CPYTHON3=python3.8 MICROPY_MICROPYTHON=../ports/unix/micropython_coverage ./run-tests -j1 --emit native
|
||||
working-directory: tests
|
||||
- name: mpy Tests
|
||||
run: MICROPY_CPYTHON3=python3.8 MICROPY_MICROPYTHON=../ports/unix/micropython_coverage ./run-tests -j1 --via-mpy -d basics float
|
||||
working-directory: tests
|
||||
- name: Build mpy-cross.static-raspbian
|
||||
run: make -C mpy-cross -j2 -f Makefile.static-raspbian
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: mpy-cross.static-raspbian
|
||||
path: mpy-cross/mpy-cross.static-raspbian
|
||||
- name: Build mpy-cross.static
|
||||
run: make -C mpy-cross -j2 -f Makefile.static
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: mpy-cross.static-amd64-linux
|
||||
path: mpy-cross/mpy-cross.static
|
||||
- name: Build mpy-cross.static-mingw
|
||||
run: make -C mpy-cross -j2 -f Makefile.static-mingw
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: mpy-cross.static-x64-windows
|
||||
path: mpy-cross/mpy-cross.static.exe
|
||||
- name: Upload stubs and mpy-cross builds to S3
|
||||
run: |
|
||||
[ -z "$AWS_ACCESS_KEY_ID" ] || aws s3 cp mpy-cross/mpy-cross.static-raspbian s3://adafruit-circuit-python/bin/mpy-cross/mpy-cross.static-raspbian-${{ env.CP_VERSION }} --no-progress --region us-east-1
|
||||
[ -z "$AWS_ACCESS_KEY_ID" ] || aws s3 cp mpy-cross/mpy-cross.static s3://adafruit-circuit-python/bin/mpy-cross/mpy-cross.static-amd64-linux-${{ env.CP_VERSION }} --no-progress --region us-east-1
|
||||
[ -z "$AWS_ACCESS_KEY_ID" ] || aws s3 cp mpy-cross/mpy-cross.static.exe s3://adafruit-circuit-python/bin/mpy-cross/mpy-cross.static-x64-windows-${{ env.CP_VERSION }}.exe --no-progress --region us-east-1
|
||||
zip -9r circuitpython-stubs.zip circuitpython-stubs
|
||||
[ -z "$AWS_ACCESS_KEY_ID" ] || aws s3 cp circuitpython-stubs.zip s3://adafruit-circuit-python/bin/stubs/circuitpython-stubs-${{ env.CP_VERSION }}.zip --no-progress --region us-east-1
|
||||
env:
|
||||
AWS_PAGER: ''
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
if: github.event_name == 'push' || (github.event_name == 'release' && (github.event.action == 'published' || github.event.action == 'rerequested'))
|
||||
|
||||
|
||||
mpy-cross-mac:
|
||||
runs-on: macos-10.15
|
||||
steps:
|
||||
- name: Dump GitHub context
|
||||
env:
|
||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||
run: echo "$GITHUB_CONTEXT"
|
||||
- uses: actions/checkout@v2.2.0
|
||||
with:
|
||||
submodules: true
|
||||
fetch-depth: 0
|
||||
- run: git fetch --recurse-submodules=no https://github.com/adafruit/circuitpython refs/tags/*:refs/tags/*
|
||||
- name: CircuitPython version
|
||||
run: |
|
||||
git describe --dirty --tags
|
||||
echo >>$GITHUB_ENV CP_VERSION=$(git describe --dirty --tags)
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
brew install gettext
|
||||
echo >>$GITHUB_PATH /usr/local/opt/gettext/bin
|
||||
- name: Versions
|
||||
run: |
|
||||
gcc --version
|
||||
python3 --version
|
||||
msgfmt --version
|
||||
- name: Build mpy-cross
|
||||
run: make -C mpy-cross -j2
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: mpy-cross-macos-catalina
|
||||
path: mpy-cross/mpy-cross
|
||||
- name: Upload mpy-cross build to S3
|
||||
run: |
|
||||
[ -z "$AWS_ACCESS_KEY_ID" ] || aws s3 cp mpy-cross/mpy-cross s3://adafruit-circuit-python/bin/mpy-cross/mpy-cross-macos-catalina-${{ env.CP_VERSION }} --no-progress --region us-east-1
|
||||
env:
|
||||
AWS_PAGER: ''
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
if: github.event_name == 'push' || (github.event_name == 'release' && (github.event.action == 'published' || github.event.action == 'rerequested'))
|
||||
|
||||
|
||||
build-arm:
|
||||
runs-on: ubuntu-20.04
|
||||
needs: test
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
board:
|
||||
- "8086_commander"
|
||||
- "ADM_B_NRF52840_1"
|
||||
- "TG-Watch"
|
||||
- "adafruit_feather_rp2040"
|
||||
- "adafruit_itsybitsy_rp2040"
|
||||
- "adafruit_neokey_trinkey_m0"
|
||||
- "adafruit_proxlight_trinkey_m0"
|
||||
- "adafruit_qtpy_rp2040"
|
||||
- "adafruit_rotary_trinkey_m0"
|
||||
- "adafruit_slide_trinkey_m0"
|
||||
- "aloriumtech_evo_m51"
|
||||
- "aramcon2_badge"
|
||||
- "aramcon_badge_2019"
|
||||
- "arduino_mkr1300"
|
||||
- "arduino_mkrzero"
|
||||
- "arduino_nano_33_ble"
|
||||
- "arduino_nano_33_iot"
|
||||
- "arduino_zero"
|
||||
- "bast_pro_mini_m0"
|
||||
- "bastble"
|
||||
- "bdmicro_vina_d21"
|
||||
- "bdmicro_vina_d51"
|
||||
- "bdmicro_vina_d51_pcb7"
|
||||
- "bless_dev_board_multi_sensor"
|
||||
- "blm_badge"
|
||||
- "capablerobot_usbhub"
|
||||
- "catwan_usbstick"
|
||||
- "circuitbrains_basic_m0"
|
||||
- "circuitbrains_deluxe_m4"
|
||||
- "circuitplayground_bluefruit"
|
||||
- "circuitplayground_express"
|
||||
- "circuitplayground_express_crickit"
|
||||
- "circuitplayground_express_displayio"
|
||||
- "clue_nrf52840_express"
|
||||
- "cp32-m4"
|
||||
- "cp_sapling_m0"
|
||||
- "cp_sapling_m0_spiflash"
|
||||
- "datalore_ip_m4"
|
||||
- "datum_distance"
|
||||
- "datum_imu"
|
||||
- "datum_light"
|
||||
- "datum_weather"
|
||||
- "dynalora_usb"
|
||||
- "dynossat_edu_eps"
|
||||
- "dynossat_edu_obc"
|
||||
- "electronut_labs_blip"
|
||||
- "electronut_labs_papyr"
|
||||
- "escornabot_makech"
|
||||
- "espruino_pico"
|
||||
- "espruino_wifi"
|
||||
- "feather_bluefruit_sense"
|
||||
- "feather_m0_adalogger"
|
||||
- "feather_m0_basic"
|
||||
- "feather_m0_express"
|
||||
- "feather_m0_express_crickit"
|
||||
- "feather_m0_rfm69"
|
||||
- "feather_m0_rfm9x"
|
||||
- "feather_m0_supersized"
|
||||
- "feather_m4_can"
|
||||
- "feather_m4_express"
|
||||
- "feather_m7_1011"
|
||||
- "feather_mimxrt1011"
|
||||
- "feather_mimxrt1062"
|
||||
- "feather_nrf52840_express"
|
||||
- "feather_radiofruit_zigbee"
|
||||
- "feather_stm32f405_express"
|
||||
- "fluff_m0"
|
||||
- "gemma_m0"
|
||||
- "grandcentral_m4_express"
|
||||
- "hallowing_m0_express"
|
||||
- "hallowing_m4_express"
|
||||
- "hiibot_bluefi"
|
||||
- "huntercat_nfc"
|
||||
- "ikigaisense_vita"
|
||||
- "imxrt1010_evk"
|
||||
- "imxrt1020_evk"
|
||||
- "imxrt1060_evk"
|
||||
- "itsybitsy_m0_express"
|
||||
- "itsybitsy_m4_express"
|
||||
- "itsybitsy_nrf52840_express"
|
||||
- "kicksat-sprite"
|
||||
- "loc_ber_m4_base_board"
|
||||
- "makerdiary_m60_keyboard"
|
||||
- "makerdiary_nrf52840_m2_devkit"
|
||||
- "makerdiary_nrf52840_mdk"
|
||||
- "makerdiary_nrf52840_mdk_usb_dongle"
|
||||
- "matrixportal_m4"
|
||||
- "meowbit_v121"
|
||||
- "meowmeow"
|
||||
- "metro_m0_express"
|
||||
- "metro_m4_airlift_lite"
|
||||
- "metro_m4_express"
|
||||
- "metro_m7_1011"
|
||||
- "metro_nrf52840_express"
|
||||
- "mini_sam_m4"
|
||||
- "monster_m4sk"
|
||||
- "ndgarage_ndbit6"
|
||||
- "ndgarage_ndbit6_v2"
|
||||
- "neopixel_trinkey_m0"
|
||||
- "nfc_copy_cat"
|
||||
- "nice_nano"
|
||||
- "nucleo_f746zg"
|
||||
- "nucleo_f767zi"
|
||||
- "nucleo_h743zi_2"
|
||||
- "ohs2020_badge"
|
||||
- "openbook_m4"
|
||||
- "openmv_h7"
|
||||
- "particle_argon"
|
||||
- "particle_boron"
|
||||
- "particle_xenon"
|
||||
- "pca10056"
|
||||
- "pca10059"
|
||||
- "pca10100"
|
||||
- "pewpew10"
|
||||
- "pewpew_m4"
|
||||
- "picoplanet"
|
||||
- "pimoroni_keybow2040"
|
||||
- "pimoroni_picolipo_16mb"
|
||||
- "pimoroni_picolipo_4mb"
|
||||
- "pimoroni_picosystem"
|
||||
- "pimoroni_tiny2040"
|
||||
- "pirkey_m0"
|
||||
- "pitaya_go"
|
||||
- "pyb_nano_v2"
|
||||
- "pybadge"
|
||||
- "pybadge_airlift"
|
||||
- "pyboard_v11"
|
||||
- "pycubed"
|
||||
- "pycubed_mram"
|
||||
- "pygamer"
|
||||
- "pygamer_advance"
|
||||
- "pyportal"
|
||||
- "pyportal_titano"
|
||||
- "pyruler"
|
||||
- "qtpy_m0"
|
||||
- "qtpy_m0_haxpress"
|
||||
- "raspberry_pi_pico"
|
||||
- "raytac_mdbt50q-db-40"
|
||||
- "robohatmm1_m4"
|
||||
- "sam32"
|
||||
- "same54_xplained"
|
||||
- "seeeduino_wio_terminal"
|
||||
- "seeeduino_xiao"
|
||||
- "sensebox_mcu"
|
||||
- "serpente"
|
||||
- "shirtty"
|
||||
- "silicognition-m4-shim"
|
||||
- "simmel"
|
||||
- "snekboard"
|
||||
- "sparkfun_lumidrive"
|
||||
- "sparkfun_micromod_rp2040"
|
||||
- "sparkfun_nrf52840_micromod"
|
||||
- "sparkfun_nrf52840_mini"
|
||||
- "sparkfun_pro_micro_rp2040"
|
||||
- "sparkfun_qwiic_micro_no_flash"
|
||||
- "sparkfun_qwiic_micro_with_flash"
|
||||
- "sparkfun_redboard_turbo"
|
||||
- "sparkfun_samd21_dev"
|
||||
- "sparkfun_samd21_mini"
|
||||
- "sparkfun_samd51_thing_plus"
|
||||
- "sparkfun_thing_plus_rp2040"
|
||||
- "spresense"
|
||||
- "stackrduino_m0_pro"
|
||||
- "stm32f411ce_blackpill"
|
||||
- "stm32f411ce_blackpill_with_flash"
|
||||
- "stm32f411ve_discovery"
|
||||
- "stm32f412zg_discovery"
|
||||
- "stm32f4_discovery"
|
||||
- "stm32f746g_discovery"
|
||||
- "stringcar_m0_express"
|
||||
- "teensy40"
|
||||
- "teensy41"
|
||||
- "teknikio_bluebird"
|
||||
- "thunderpack_v11"
|
||||
- "thunderpack_v12"
|
||||
- "tinkeringtech_scoutmakes_azul"
|
||||
- "trellis_m4_express"
|
||||
- "trinket_m0"
|
||||
- "trinket_m0_haxpress"
|
||||
- "uartlogger2"
|
||||
- "uchip"
|
||||
- "ugame10"
|
||||
- "winterbloom_big_honking_button"
|
||||
- "winterbloom_sol"
|
||||
- "xinabox_cc03"
|
||||
- "xinabox_cs11"
|
||||
|
||||
steps:
|
||||
- name: Set up Python 3.8
|
||||
uses: actions/setup-python@v1
|
||||
with:
|
||||
python-version: 3.8
|
||||
- uses: actions/checkout@v2.2.0
|
||||
with:
|
||||
submodules: true
|
||||
fetch-depth: 0
|
||||
- run: git fetch --recurse-submodules=no https://github.com/adafruit/circuitpython refs/tags/*:refs/tags/*
|
||||
- name: Install deps
|
||||
run: |
|
||||
sudo apt-get install -y gettext
|
||||
pip install -r requirements-dev.txt
|
||||
wget --no-verbose https://adafruit-circuit-python.s3.amazonaws.com/gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2
|
||||
sudo tar -C /usr --strip-components=1 -xaf gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2
|
||||
- name: Versions
|
||||
run: |
|
||||
gcc --version
|
||||
arm-none-eabi-gcc --version
|
||||
python3 --version
|
||||
- name: mpy-cross
|
||||
run: make -C mpy-cross -j2
|
||||
- name: Setup build failure matcher
|
||||
run: echo "::add-matcher::$GITHUB_WORKSPACE/.github/workflows/match-build-fail.json"
|
||||
- name: build
|
||||
run: python3 -u build_release_files.py
|
||||
working-directory: tools
|
||||
env:
|
||||
BOARDS: ${{ matrix.board }}
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: ${{ matrix.board }}
|
||||
path: bin/${{ matrix.board }}
|
||||
- name: Upload to S3
|
||||
run: "[ -z \"$AWS_ACCESS_KEY_ID\" ] || aws s3 cp bin/ s3://adafruit-circuit-python/bin/ --recursive --no-progress --region us-east-1"
|
||||
env:
|
||||
AWS_PAGER: ''
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
if: github.event_name == 'push' || (github.event_name == 'release' && (github.event.action == 'published' || github.event.action == 'rerequested'))
|
||||
|
||||
build-riscv:
|
||||
runs-on: ubuntu-20.04
|
||||
needs: test
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
board:
|
||||
- "fomu"
|
||||
|
||||
steps:
|
||||
- name: Set up Python 3.8
|
||||
uses: actions/setup-python@v1
|
||||
with:
|
||||
python-version: 3.8
|
||||
- uses: actions/checkout@v2.2.0
|
||||
with:
|
||||
submodules: true
|
||||
fetch-depth: 0
|
||||
- run: git fetch --recurse-submodules=no https://github.com/adafruit/circuitpython refs/tags/*:refs/tags/*
|
||||
- name: Install deps
|
||||
run: |
|
||||
sudo apt-get install -y gettext
|
||||
pip install requests sh click setuptools awscli
|
||||
wget https://static.dev.sifive.com/dev-tools/riscv64-unknown-elf-gcc-8.3.0-2019.08.0-x86_64-linux-centos6.tar.gz
|
||||
sudo tar -C /usr --strip-components=1 -xaf riscv64-unknown-elf-gcc-8.3.0-2019.08.0-x86_64-linux-centos6.tar.gz
|
||||
- name: Versions
|
||||
run: |
|
||||
gcc --version
|
||||
riscv64-unknown-elf-gcc --version
|
||||
python3 --version
|
||||
- name: mpy-cross
|
||||
run: make -C mpy-cross -j2
|
||||
- name: Setup build failure matcher
|
||||
run: echo "::add-matcher::$GITHUB_WORKSPACE/.github/workflows/match-build-fail.json"
|
||||
- name: build
|
||||
run: python3 -u build_release_files.py
|
||||
working-directory: tools
|
||||
env:
|
||||
BOARDS: ${{ matrix.board }}
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: ${{ matrix.board }}
|
||||
path: bin/${{ matrix.board }}
|
||||
- name: Upload to S3
|
||||
run: "[ -z \"$AWS_ACCESS_KEY_ID\" ] || aws s3 cp bin/ s3://adafruit-circuit-python/bin/ --recursive --no-progress --region us-east-1"
|
||||
env:
|
||||
AWS_PAGER: ''
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
if: github.event_name == 'push' || (github.event_name == 'release' && (github.event.action == 'published' || github.event.action == 'rerequested'))
|
||||
build-xtensa:
|
||||
runs-on: ubuntu-20.04
|
||||
needs: test
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
board:
|
||||
- "adafruit_feather_esp32s2_nopsram"
|
||||
- "adafruit_feather_esp32s2_tftback_nopsram"
|
||||
- "adafruit_funhouse"
|
||||
- "adafruit_magtag_2.9_grayscale"
|
||||
- "adafruit_metro_esp32s2"
|
||||
- "artisense_rd00"
|
||||
- "atmegazero_esp32s2"
|
||||
- "electroniccats_bastwifi"
|
||||
- "espressif_kaluga_1"
|
||||
- "espressif_saola_1_wroom"
|
||||
- "espressif_saola_1_wrover"
|
||||
- "franzininho_wifi_wroom"
|
||||
- "franzininho_wifi_wrover"
|
||||
- "lilygo_ttgo_t8_s2_st7789"
|
||||
- "microdev_micro_s2"
|
||||
- "muselab_nanoesp32_s2"
|
||||
- "targett_module_clip_wroom"
|
||||
- "targett_module_clip_wrover"
|
||||
- "unexpectedmaker_feathers2"
|
||||
- "unexpectedmaker_feathers2_prerelease"
|
||||
- "unexpectedmaker_tinys2"
|
||||
|
||||
steps:
|
||||
- name: Set up Python 3.8
|
||||
uses: actions/setup-python@v1
|
||||
with:
|
||||
python-version: 3.8
|
||||
- uses: actions/checkout@v2.2.0
|
||||
with:
|
||||
submodules: true
|
||||
fetch-depth: 0
|
||||
- run: git fetch --recurse-submodules=no https://github.com/adafruit/circuitpython refs/tags/*:refs/tags/*
|
||||
- name: CircuitPython version
|
||||
run: git describe --dirty --tags
|
||||
- uses: actions/cache@v2
|
||||
name: Fetch IDF tool cache
|
||||
id: idf-cache
|
||||
with:
|
||||
path: ${{ github.workspace }}/.idf_tools
|
||||
key: ${{ runner.os }}-idf-tools-${{ hashFiles('.git/modules/ports/esp32s2/esp-idf/HEAD') }}-20210422
|
||||
- name: Clone IDF submodules
|
||||
run: |
|
||||
(cd $IDF_PATH && git submodule update --init)
|
||||
env:
|
||||
IDF_PATH: ${{ github.workspace }}/ports/esp32s2/esp-idf
|
||||
- name: Install IDF tools
|
||||
run: |
|
||||
$IDF_PATH/tools/idf_tools.py --non-interactive install required
|
||||
$IDF_PATH/tools/idf_tools.py --non-interactive install cmake
|
||||
$IDF_PATH/tools/idf_tools.py --non-interactive install-python-env
|
||||
rm -rf $IDF_TOOLS_PATH/dist
|
||||
env:
|
||||
IDF_PATH: ${{ github.workspace }}/ports/esp32s2/esp-idf
|
||||
IDF_TOOLS_PATH: ${{ github.workspace }}/.idf_tools
|
||||
- name: Install CircuitPython deps
|
||||
run: |
|
||||
source $IDF_PATH/export.sh
|
||||
pip install -r requirements-dev.txt
|
||||
sudo apt-get install -y gettext ninja-build
|
||||
env:
|
||||
IDF_PATH: ${{ github.workspace }}/ports/esp32s2/esp-idf
|
||||
IDF_TOOLS_PATH: ${{ github.workspace }}/.idf_tools
|
||||
- name: Versions
|
||||
run: |
|
||||
source $IDF_PATH/export.sh
|
||||
gcc --version
|
||||
xtensa-esp32s2-elf-gcc --version
|
||||
python3 --version
|
||||
ninja --version
|
||||
cmake --version
|
||||
shell: bash
|
||||
env:
|
||||
IDF_PATH: ${{ github.workspace }}/ports/esp32s2/esp-idf
|
||||
IDF_TOOLS_PATH: ${{ github.workspace }}/.idf_tools
|
||||
- name: mpy-cross
|
||||
run: make -C mpy-cross -j2
|
||||
- name: Setup build failure matcher
|
||||
run: echo "::add-matcher::$GITHUB_WORKSPACE/.github/workflows/match-build-fail.json"
|
||||
- name: build
|
||||
run: |
|
||||
source $IDF_PATH/export.sh
|
||||
python3 -u build_release_files.py
|
||||
working-directory: tools
|
||||
shell: bash
|
||||
env:
|
||||
IDF_PATH: ${{ github.workspace }}/ports/esp32s2/esp-idf
|
||||
IDF_TOOLS_PATH: ${{ github.workspace }}/.idf_tools
|
||||
BOARDS: ${{ matrix.board }}
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: ${{ matrix.board }}
|
||||
path: bin/${{ matrix.board }}
|
||||
- name: Upload to S3
|
||||
run: "[ -z \"$AWS_ACCESS_KEY_ID\" ] || aws s3 cp bin/ s3://adafruit-circuit-python/bin/ --recursive --no-progress --region us-east-1"
|
||||
env:
|
||||
AWS_PAGER: ''
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
if: github.event_name == 'push' || (github.event_name == 'release' && (github.event.action == 'published' || github.event.action == 'rerequested'))
|
||||
20
.github/workflows/code_formatting.yml
vendored
20
.github/workflows/code_formatting.yml
vendored
|
|
@ -1,20 +0,0 @@
|
|||
name: Check code formatting
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
code-formatting:
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- uses: actions/setup-python@v5
|
||||
- name: Install packages
|
||||
run: source tools/ci.sh && ci_c_code_formatting_setup
|
||||
- name: Run code formatting
|
||||
run: source tools/ci.sh && ci_c_code_formatting_run
|
||||
- name: Check code formatting
|
||||
run: git diff --exit-code
|
||||
50
.github/workflows/code_size.yml
vendored
50
.github/workflows/code_size.yml
vendored
|
|
@ -1,50 +0,0 @@
|
|||
name: Check code size
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
paths:
|
||||
- '.github/workflows/*.yml'
|
||||
- 'tools/**'
|
||||
- 'py/**'
|
||||
- 'extmod/**'
|
||||
- 'shared/**'
|
||||
- 'lib/**'
|
||||
- 'ports/bare-arm/**'
|
||||
- 'ports/mimxrt/**'
|
||||
- 'ports/minimal/**'
|
||||
- 'ports/rp2/**'
|
||||
- 'ports/samd/**'
|
||||
- 'ports/stm32/**'
|
||||
- 'ports/unix/**'
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
with:
|
||||
fetch-depth: 100
|
||||
- name: Install packages
|
||||
run: source tools/ci.sh && ci_code_size_setup
|
||||
- name: Build
|
||||
run: source tools/ci.sh && ci_code_size_build
|
||||
- name: Compute code size difference
|
||||
run: tools/metrics.py diff ~/size0 ~/size1 | tee diff
|
||||
- name: Save PR number
|
||||
if: github.event_name == 'pull_request'
|
||||
env:
|
||||
PR_NUMBER: ${{ github.event.number }}
|
||||
run: echo $PR_NUMBER > pr_number
|
||||
- name: Upload diff
|
||||
if: github.event_name == 'pull_request'
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: code-size-report
|
||||
path: |
|
||||
diff
|
||||
pr_number
|
||||
retention-days: 1
|
||||
105
.github/workflows/code_size_comment.yml
vendored
105
.github/workflows/code_size_comment.yml
vendored
|
|
@ -1,105 +0,0 @@
|
|||
name: Code size comment
|
||||
|
||||
on:
|
||||
workflow_run:
|
||||
workflows: [Check code size]
|
||||
types: [completed]
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
comment:
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- name: 'Download artifact'
|
||||
id: download-artifact
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
result-encoding: string
|
||||
script: |
|
||||
const fs = require('fs');
|
||||
|
||||
const allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
run_id: context.payload.workflow_run.id,
|
||||
});
|
||||
|
||||
const matchArtifact = allArtifacts.data.artifacts.filter((artifact) => {
|
||||
return artifact.name == "code-size-report"
|
||||
});
|
||||
|
||||
if (matchArtifact.length === 0) {
|
||||
console.log('no matching artifact found');
|
||||
console.log('result: "skip"');
|
||||
|
||||
return 'skip';
|
||||
}
|
||||
|
||||
const download = await github.rest.actions.downloadArtifact({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
artifact_id: matchArtifact[0].id,
|
||||
archive_format: 'zip',
|
||||
});
|
||||
|
||||
fs.writeFileSync(`${process.env.GITHUB_WORKSPACE}/code-size-report.zip`, Buffer.from(download.data));
|
||||
|
||||
console.log('artifact downloaded to `code-size-report.zip`');
|
||||
console.log('result: "ok"');
|
||||
|
||||
return 'ok';
|
||||
- name: 'Unzip artifact'
|
||||
if: steps.download-artifact.outputs.result == 'ok'
|
||||
run: unzip code-size-report.zip
|
||||
- name: Post comment to pull request
|
||||
if: steps.download-artifact.outputs.result == 'ok'
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
github-token: ${{secrets.GITHUB_TOKEN}}
|
||||
script: |
|
||||
const fs = require('fs');
|
||||
|
||||
const prNumber = Number(fs.readFileSync('pr_number'));
|
||||
const codeSizeReport = `Code size report:
|
||||
|
||||
\`\`\`
|
||||
${fs.readFileSync('diff')}
|
||||
\`\`\`
|
||||
`;
|
||||
|
||||
const comments = await github.paginate(
|
||||
github.rest.issues.listComments,
|
||||
{
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: prNumber,
|
||||
}
|
||||
);
|
||||
|
||||
comments.reverse();
|
||||
|
||||
const previousComment = comments.find(comment =>
|
||||
comment.user.login === 'github-actions[bot]'
|
||||
)
|
||||
|
||||
// if github-actions[bot] already made a comment, update it,
|
||||
// otherwise create a new comment.
|
||||
|
||||
if (previousComment) {
|
||||
await github.rest.issues.updateComment({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
comment_id: previousComment.id,
|
||||
body: codeSizeReport,
|
||||
});
|
||||
} else {
|
||||
await github.rest.issues.createComment({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: prNumber,
|
||||
body: codeSizeReport,
|
||||
});
|
||||
}
|
||||
13
.github/workflows/codespell.yml
vendored
13
.github/workflows/codespell.yml
vendored
|
|
@ -1,13 +0,0 @@
|
|||
name: Check spelling with codespell
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
codespell:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
# codespell version should be kept in sync with .pre-commit-config.yml
|
||||
- run: pip install --user codespell==2.4.1 tomli
|
||||
- run: codespell
|
||||
|
||||
18
.github/workflows/commit_formatting.yml
vendored
18
.github/workflows/commit_formatting.yml
vendored
|
|
@ -1,18 +0,0 @@
|
|||
name: Check commit message formatting
|
||||
|
||||
on: [pull_request]
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
with:
|
||||
fetch-depth: 100
|
||||
- uses: actions/setup-python@v5
|
||||
- name: Check commit message formatting
|
||||
run: source tools/ci.sh && ci_commit_formatting_run
|
||||
43
.github/workflows/create_website_pr.yml
vendored
Normal file
43
.github/workflows/create_website_pr.yml
vendored
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
# SPDX-FileCopyrightText: 2014 MicroPython & CircuitPython contributors (https://github.com/adafruit/circuitpython/graphs/contributors)
|
||||
#
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
name: Update CircuitPython.org
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
|
||||
jobs:
|
||||
website:
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
- name: Dump GitHub context
|
||||
env:
|
||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||
run: echo "$GITHUB_CONTEXT"
|
||||
- uses: actions/checkout@v2.2.0
|
||||
with:
|
||||
submodules: true
|
||||
fetch-depth: 0
|
||||
- name: Set up Python 3.8
|
||||
uses: actions/setup-python@v1
|
||||
with:
|
||||
python-version: 3.8
|
||||
- name: Install deps
|
||||
run: |
|
||||
pip install -r requirements-dev.txt
|
||||
- name: Versions
|
||||
run: |
|
||||
gcc --version
|
||||
python3 --version
|
||||
- run: git fetch --recurse-submodules=no https://github.com/adafruit/circuitpython refs/tags/*:refs/tags/*
|
||||
- name: CircuitPython version
|
||||
run: git describe --dirty --tags
|
||||
- name: Website
|
||||
run: python3 build_board_info.py
|
||||
working-directory: tools
|
||||
env:
|
||||
RELEASE_TAG: ${{ github.event.release.tag_name }}
|
||||
ADABOT_GITHUB_ACCESS_TOKEN: ${{ secrets.BLINKA_GITHUB_ACCESS_TOKEN }}
|
||||
if: github.event_name == 'release' && (github.event.action == 'published' || github.event.action == 'rerequested')
|
||||
27
.github/workflows/docs.yml
vendored
27
.github/workflows/docs.yml
vendored
|
|
@ -1,27 +0,0 @@
|
|||
name: Build docs
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
paths:
|
||||
- docs/**
|
||||
- py/**
|
||||
- tests/cpydiff/**
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- uses: actions/setup-python@v5
|
||||
- name: Install Python packages
|
||||
run: pip install -r docs/requirements.txt
|
||||
- name: Build unix port
|
||||
run: source tools/ci.sh && ci_unix_build_helper
|
||||
- name: Build docs
|
||||
run: make -C docs/ html
|
||||
25
.github/workflows/examples.yml
vendored
25
.github/workflows/examples.yml
vendored
|
|
@ -1,25 +0,0 @@
|
|||
name: Check examples
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
paths:
|
||||
- '.github/workflows/*.yml'
|
||||
- 'examples/**'
|
||||
- 'ports/unix/**'
|
||||
- 'py/**'
|
||||
- 'shared/**'
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
embedding:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- name: Build
|
||||
run: make -C examples/embedding -f micropython_embed.mk && make -C examples/embedding
|
||||
- name: Run
|
||||
run: ./examples/embedding/embed | grep "hello world"
|
||||
14
.github/workflows/match-build-fail.json
vendored
Normal file
14
.github/workflows/match-build-fail.json
vendored
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
{
|
||||
"problemMatcher": [
|
||||
{
|
||||
"severity": "error",
|
||||
"pattern": [
|
||||
{
|
||||
"regexp": "^(Build .+ and \\x1b\\[31mfailed\\x1b\\[0m)$",
|
||||
"message": 1
|
||||
}
|
||||
],
|
||||
"owner": "build-failed"
|
||||
}
|
||||
]
|
||||
}
|
||||
29
.github/workflows/mpremote.yml
vendored
29
.github/workflows/mpremote.yml
vendored
|
|
@ -1,29 +0,0 @@
|
|||
name: Package mpremote
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
paths:
|
||||
- '.github/workflows/*.yml'
|
||||
- 'tools/**'
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
with:
|
||||
# Setting this to zero means fetch all history and tags,
|
||||
# which hatch-vcs can use to discover the version tag.
|
||||
fetch-depth: 0
|
||||
- uses: actions/setup-python@v5
|
||||
- name: Install build tools
|
||||
run: pip install build
|
||||
- name: Build mpremote wheel
|
||||
run: cd tools/mpremote && python -m build --wheel
|
||||
- name: Archive mpremote wheel
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: mpremote
|
||||
path: |
|
||||
tools/mpremote/dist/mpremote*.whl
|
||||
24
.github/workflows/mpy_format.yml
vendored
24
.github/workflows/mpy_format.yml
vendored
|
|
@ -1,24 +0,0 @@
|
|||
name: .mpy file format and tools
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
paths:
|
||||
- '.github/workflows/*.yml'
|
||||
- 'examples/**'
|
||||
- 'tests/**'
|
||||
- 'tools/**'
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-22.04 # use 22.04 to get python2
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- name: Install packages
|
||||
run: source tools/ci.sh && ci_mpy_format_setup
|
||||
- name: Test mpy-tool.py
|
||||
run: source tools/ci.sh && ci_mpy_format_test
|
||||
22
.github/workflows/ports.yml
vendored
22
.github/workflows/ports.yml
vendored
|
|
@ -1,22 +0,0 @@
|
|||
name: Build ports metadata
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
paths:
|
||||
- '.github/workflows/*.yml'
|
||||
- 'tools/**'
|
||||
- ports/**
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- name: Build ports download metadata
|
||||
run: mkdir boards && ./tools/autobuild/build-downloads.py . ./boards
|
||||
33
.github/workflows/ports_alif.yml
vendored
33
.github/workflows/ports_alif.yml
vendored
|
|
@ -1,33 +0,0 @@
|
|||
name: alif port
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
paths:
|
||||
- '.github/workflows/*.yml'
|
||||
- 'tools/**'
|
||||
- 'py/**'
|
||||
- 'extmod/**'
|
||||
- 'shared/**'
|
||||
- 'lib/**'
|
||||
- 'drivers/**'
|
||||
- 'ports/alif/**'
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
build_alif:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
ci_func: # names are functions in ci.sh
|
||||
- alif_ae3_build
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- name: Install packages
|
||||
run: source tools/ci.sh && ci_alif_setup
|
||||
- name: Build ci_${{matrix.ci_func }}
|
||||
run: source tools/ci.sh && ci_${{ matrix.ci_func }}
|
||||
28
.github/workflows/ports_cc3200.yml
vendored
28
.github/workflows/ports_cc3200.yml
vendored
|
|
@ -1,28 +0,0 @@
|
|||
name: cc3200 port
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
paths:
|
||||
- '.github/workflows/*.yml'
|
||||
- 'tools/**'
|
||||
- 'py/**'
|
||||
- 'extmod/**'
|
||||
- 'shared/**'
|
||||
- 'lib/**'
|
||||
- 'drivers/**'
|
||||
- 'ports/cc3200/**'
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- name: Install packages
|
||||
run: source tools/ci.sh && ci_cc3200_setup
|
||||
- name: Build
|
||||
run: source tools/ci.sh && ci_cc3200_build
|
||||
58
.github/workflows/ports_esp32.yml
vendored
58
.github/workflows/ports_esp32.yml
vendored
|
|
@ -1,58 +0,0 @@
|
|||
name: esp32 port
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
paths:
|
||||
- '.github/workflows/*.yml'
|
||||
- 'tools/**'
|
||||
- 'py/**'
|
||||
- 'extmod/**'
|
||||
- 'shared/**'
|
||||
- 'lib/**'
|
||||
- 'drivers/**'
|
||||
- 'ports/esp32/**'
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
build_idf:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
ci_func: # names are functions in ci.sh
|
||||
- esp32_build_cmod_spiram_s2
|
||||
- esp32_build_s3_c3
|
||||
- esp32_build_c2_c6
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
|
||||
- id: idf_ver
|
||||
name: Read the ESP-IDF version (including Python version)
|
||||
run: source tools/ci.sh && echo "IDF_VER=${IDF_VER}-py${PYTHON_VER}" | tee "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Cached ESP-IDF install
|
||||
id: cache_esp_idf
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: |
|
||||
./esp-idf/
|
||||
~/.espressif/
|
||||
!~/.espressif/dist/
|
||||
~/.cache/pip/
|
||||
key: esp-idf-${{ steps.idf_ver.outputs.IDF_VER }}
|
||||
|
||||
- name: Install ESP-IDF packages
|
||||
if: steps.cache_esp_idf.outputs.cache-hit != 'true'
|
||||
run: source tools/ci.sh && ci_esp32_idf_setup
|
||||
|
||||
- name: ccache
|
||||
uses: hendrikmuhs/ccache-action@v1.2
|
||||
with:
|
||||
key: esp32-${{ matrix.ci_func }}
|
||||
|
||||
- name: Build ci_${{matrix.ci_func }}
|
||||
run: source tools/ci.sh && ci_${{ matrix.ci_func }}
|
||||
28
.github/workflows/ports_esp8266.yml
vendored
28
.github/workflows/ports_esp8266.yml
vendored
|
|
@ -1,28 +0,0 @@
|
|||
name: esp8266 port
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
paths:
|
||||
- '.github/workflows/*.yml'
|
||||
- 'tools/**'
|
||||
- 'py/**'
|
||||
- 'extmod/**'
|
||||
- 'shared/**'
|
||||
- 'lib/**'
|
||||
- 'drivers/**'
|
||||
- 'ports/esp8266/**'
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- name: Install packages
|
||||
run: source tools/ci.sh && ci_esp8266_setup && ci_esp8266_path >> $GITHUB_PATH
|
||||
- name: Build
|
||||
run: source tools/ci.sh && ci_esp8266_build
|
||||
33
.github/workflows/ports_mimxrt.yml
vendored
33
.github/workflows/ports_mimxrt.yml
vendored
|
|
@ -1,33 +0,0 @@
|
|||
name: mimxrt port
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
paths:
|
||||
- '.github/workflows/*.yml'
|
||||
- 'tools/**'
|
||||
- 'py/**'
|
||||
- 'extmod/**'
|
||||
- 'shared/**'
|
||||
- 'lib/**'
|
||||
- 'drivers/**'
|
||||
- 'ports/mimxrt/**'
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
defaults:
|
||||
run:
|
||||
working-directory: 'micropython repo' # test build with space in path
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
with:
|
||||
path: 'micropython repo'
|
||||
- name: Install packages
|
||||
run: source tools/ci.sh && ci_mimxrt_setup
|
||||
- name: Build
|
||||
run: source tools/ci.sh && ci_mimxrt_build
|
||||
28
.github/workflows/ports_nrf.yml
vendored
28
.github/workflows/ports_nrf.yml
vendored
|
|
@ -1,28 +0,0 @@
|
|||
name: nrf port
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
paths:
|
||||
- '.github/workflows/*.yml'
|
||||
- 'tools/**'
|
||||
- 'py/**'
|
||||
- 'extmod/**'
|
||||
- 'shared/**'
|
||||
- 'lib/**'
|
||||
- 'drivers/**'
|
||||
- 'ports/nrf/**'
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- name: Install packages
|
||||
run: source tools/ci.sh && ci_nrf_setup
|
||||
- name: Build
|
||||
run: source tools/ci.sh && ci_nrf_build
|
||||
28
.github/workflows/ports_powerpc.yml
vendored
28
.github/workflows/ports_powerpc.yml
vendored
|
|
@ -1,28 +0,0 @@
|
|||
name: powerpc port
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
paths:
|
||||
- '.github/workflows/*.yml'
|
||||
- 'tools/**'
|
||||
- 'py/**'
|
||||
- 'extmod/**'
|
||||
- 'shared/**'
|
||||
- 'lib/**'
|
||||
- 'drivers/**'
|
||||
- 'ports/powerpc/**'
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- name: Install packages
|
||||
run: source tools/ci.sh && ci_powerpc_setup
|
||||
- name: Build
|
||||
run: source tools/ci.sh && ci_powerpc_build
|
||||
52
.github/workflows/ports_qemu.yml
vendored
52
.github/workflows/ports_qemu.yml
vendored
|
|
@ -1,52 +0,0 @@
|
|||
name: qemu port
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
paths:
|
||||
- '.github/workflows/*.yml'
|
||||
- 'tools/**'
|
||||
- 'py/**'
|
||||
- 'extmod/**'
|
||||
- 'shared/**'
|
||||
- 'lib/**'
|
||||
- 'drivers/**'
|
||||
- 'ports/qemu/**'
|
||||
- 'tests/**'
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
build_and_test_arm:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
ci_func: # names are functions in ci.sh
|
||||
- bigendian
|
||||
- sabrelite
|
||||
- thumb_softfp
|
||||
- thumb_hardfp
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- name: Install packages
|
||||
run: source tools/ci.sh && ci_qemu_setup_arm
|
||||
- name: Build and run test suite ci_qemu_build_arm_${{ matrix.ci_func }}
|
||||
run: source tools/ci.sh && ci_qemu_build_arm_${{ matrix.ci_func }}
|
||||
- name: Print failures
|
||||
if: failure()
|
||||
run: tests/run-tests.py --print-failures
|
||||
|
||||
build_and_test_rv32:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- name: Install packages
|
||||
run: source tools/ci.sh && ci_qemu_setup_rv32
|
||||
- name: Build and run test suite
|
||||
run: source tools/ci.sh && ci_qemu_build_rv32
|
||||
- name: Print failures
|
||||
if: failure()
|
||||
run: tests/run-tests.py --print-failures
|
||||
29
.github/workflows/ports_renesas-ra.yml
vendored
29
.github/workflows/ports_renesas-ra.yml
vendored
|
|
@ -1,29 +0,0 @@
|
|||
name: renesas-ra port
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
paths:
|
||||
- '.github/workflows/*.yml'
|
||||
- 'tools/**'
|
||||
- 'py/**'
|
||||
- 'extmod/**'
|
||||
- 'shared/**'
|
||||
- 'lib/**'
|
||||
- 'drivers/**'
|
||||
- 'ports/renesas-ra/**'
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
build_renesas_ra_board:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- name: Install packages
|
||||
run: source tools/ci.sh && ci_renesas_ra_setup
|
||||
- name: Build
|
||||
run: source tools/ci.sh && ci_renesas_ra_board_build
|
||||
|
||||
33
.github/workflows/ports_rp2.yml
vendored
33
.github/workflows/ports_rp2.yml
vendored
|
|
@ -1,33 +0,0 @@
|
|||
name: rp2 port
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
paths:
|
||||
- '.github/workflows/*.yml'
|
||||
- 'tools/**'
|
||||
- 'py/**'
|
||||
- 'extmod/**'
|
||||
- 'shared/**'
|
||||
- 'lib/**'
|
||||
- 'drivers/**'
|
||||
- 'ports/rp2/**'
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
defaults:
|
||||
run:
|
||||
working-directory: 'micropython repo' # test build with space in path
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
with:
|
||||
path: 'micropython repo'
|
||||
- name: Install packages
|
||||
run: source tools/ci.sh && ci_rp2_setup
|
||||
- name: Build
|
||||
run: source tools/ci.sh && ci_rp2_build
|
||||
28
.github/workflows/ports_samd.yml
vendored
28
.github/workflows/ports_samd.yml
vendored
|
|
@ -1,28 +0,0 @@
|
|||
name: samd port
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
paths:
|
||||
- '.github/workflows/*.yml'
|
||||
- 'tools/**'
|
||||
- 'py/**'
|
||||
- 'extmod/**'
|
||||
- 'shared/**'
|
||||
- 'lib/**'
|
||||
- 'drivers/**'
|
||||
- 'ports/samd/**'
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- name: Install packages
|
||||
run: source tools/ci.sh && ci_samd_setup
|
||||
- name: Build
|
||||
run: source tools/ci.sh && ci_samd_build
|
||||
36
.github/workflows/ports_stm32.yml
vendored
36
.github/workflows/ports_stm32.yml
vendored
|
|
@ -1,36 +0,0 @@
|
|||
name: stm32 port
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
paths:
|
||||
- '.github/workflows/*.yml'
|
||||
- 'tools/**'
|
||||
- 'py/**'
|
||||
- 'extmod/**'
|
||||
- 'shared/**'
|
||||
- 'lib/**'
|
||||
- 'drivers/**'
|
||||
- 'ports/stm32/**'
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
build_stm32:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
ci_func: # names are functions in ci.sh
|
||||
- stm32_pyb_build
|
||||
- stm32_nucleo_build
|
||||
- stm32_misc_build
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- name: Install packages
|
||||
run: source tools/ci.sh && ci_stm32_setup
|
||||
- name: Build ci_${{matrix.ci_func }}
|
||||
run: source tools/ci.sh && ci_${{ matrix.ci_func }}
|
||||
|
||||
328
.github/workflows/ports_unix.yml
vendored
328
.github/workflows/ports_unix.yml
vendored
|
|
@ -1,328 +0,0 @@
|
|||
name: unix port
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
paths:
|
||||
- '.github/workflows/*.yml'
|
||||
- 'tools/**'
|
||||
- 'py/**'
|
||||
- 'extmod/**'
|
||||
- 'shared/**'
|
||||
- 'lib/**'
|
||||
- 'examples/**'
|
||||
- 'mpy-cross/**'
|
||||
- 'ports/unix/**'
|
||||
- 'tests/**'
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
minimal:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- name: Build
|
||||
run: source tools/ci.sh && ci_unix_minimal_build
|
||||
- name: Run main test suite
|
||||
run: source tools/ci.sh && ci_unix_minimal_run_tests
|
||||
- name: Print failures
|
||||
if: failure()
|
||||
run: tests/run-tests.py --print-failures
|
||||
|
||||
reproducible:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- name: Build with reproducible date
|
||||
run: source tools/ci.sh && ci_unix_minimal_build
|
||||
env:
|
||||
SOURCE_DATE_EPOCH: 1234567890
|
||||
- name: Check reproducible build date
|
||||
run: echo | ports/unix/build-minimal/micropython -i | grep 'on 2009-02-13;'
|
||||
|
||||
standard:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- name: Build
|
||||
run: source tools/ci.sh && ci_unix_standard_build
|
||||
- name: Run main test suite
|
||||
run: source tools/ci.sh && ci_unix_standard_run_tests
|
||||
- name: Print failures
|
||||
if: failure()
|
||||
run: tests/run-tests.py --print-failures
|
||||
|
||||
standard_v2:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- name: Build
|
||||
run: source tools/ci.sh && ci_unix_standard_v2_build
|
||||
- name: Run main test suite
|
||||
run: source tools/ci.sh && ci_unix_standard_v2_run_tests
|
||||
- name: Print failures
|
||||
if: failure()
|
||||
run: tests/run-tests.py --print-failures
|
||||
|
||||
coverage:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- uses: actions/setup-python@v5
|
||||
# Python 3.12 is the default for ubuntu-24.04, but that has compatibility issues with settrace tests.
|
||||
# Can remove this step when ubuntu-latest uses a more recent Python 3.x as the default.
|
||||
with:
|
||||
python-version: '3.11'
|
||||
- name: Install packages
|
||||
run: source tools/ci.sh && ci_unix_coverage_setup
|
||||
- name: Build
|
||||
run: source tools/ci.sh && ci_unix_coverage_build
|
||||
- name: Run main test suite
|
||||
run: source tools/ci.sh && ci_unix_coverage_run_tests
|
||||
- name: Test merging .mpy files
|
||||
run: source tools/ci.sh && ci_unix_coverage_run_mpy_merge_tests
|
||||
- name: Build native mpy modules
|
||||
run: source tools/ci.sh && ci_native_mpy_modules_build
|
||||
- name: Test importing .mpy generated by mpy_ld.py
|
||||
run: source tools/ci.sh && ci_unix_coverage_run_native_mpy_tests
|
||||
- name: Run gcov coverage analysis
|
||||
run: |
|
||||
(cd ports/unix && gcov -o build-coverage/py ../../py/*.c || true)
|
||||
(cd ports/unix && gcov -o build-coverage/extmod ../../extmod/*.c || true)
|
||||
- name: Upload coverage to Codecov
|
||||
uses: codecov/codecov-action@v5
|
||||
with:
|
||||
fail_ci_if_error: true
|
||||
verbose: true
|
||||
token: ${{ secrets.CODECOV_TOKEN }}
|
||||
- name: Print failures
|
||||
if: failure()
|
||||
run: tests/run-tests.py --print-failures
|
||||
|
||||
coverage_32bit:
|
||||
runs-on: ubuntu-22.04 # use 22.04 to get libffi-dev:i386
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- name: Install packages
|
||||
run: source tools/ci.sh && ci_unix_32bit_setup
|
||||
- name: Build
|
||||
run: source tools/ci.sh && ci_unix_coverage_32bit_build
|
||||
- name: Run main test suite
|
||||
run: source tools/ci.sh && ci_unix_coverage_32bit_run_tests
|
||||
- name: Build native mpy modules
|
||||
run: source tools/ci.sh && ci_native_mpy_modules_32bit_build
|
||||
- name: Test importing .mpy generated by mpy_ld.py
|
||||
run: source tools/ci.sh && ci_unix_coverage_32bit_run_native_mpy_tests
|
||||
- name: Print failures
|
||||
if: failure()
|
||||
run: tests/run-tests.py --print-failures
|
||||
|
||||
nanbox:
|
||||
runs-on: ubuntu-22.04 # use 22.04 to get python2, and libffi-dev:i386
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- name: Install packages
|
||||
run: source tools/ci.sh && ci_unix_32bit_setup
|
||||
- name: Build
|
||||
run: source tools/ci.sh && ci_unix_nanbox_build
|
||||
- name: Run main test suite
|
||||
run: source tools/ci.sh && ci_unix_nanbox_run_tests
|
||||
- name: Print failures
|
||||
if: failure()
|
||||
run: tests/run-tests.py --print-failures
|
||||
|
||||
longlong:
|
||||
runs-on: ubuntu-22.04 # use 22.04 to get python2, and libffi-dev:i386
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- name: Install packages
|
||||
run: source tools/ci.sh && ci_unix_32bit_setup
|
||||
- name: Build
|
||||
run: source tools/ci.sh && ci_unix_longlong_build
|
||||
- name: Run main test suite
|
||||
run: source tools/ci.sh && ci_unix_longlong_run_tests
|
||||
- name: Print failures
|
||||
if: failure()
|
||||
run: tests/run-tests.py --print-failures
|
||||
|
||||
float:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- name: Build
|
||||
run: source tools/ci.sh && ci_unix_float_build
|
||||
- name: Run main test suite
|
||||
run: source tools/ci.sh && ci_unix_float_run_tests
|
||||
- name: Print failures
|
||||
if: failure()
|
||||
run: tests/run-tests.py --print-failures
|
||||
|
||||
gil_enabled:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- name: Build
|
||||
run: source tools/ci.sh && ci_unix_gil_enabled_build
|
||||
- name: Run main test suite
|
||||
run: source tools/ci.sh && ci_unix_gil_enabled_run_tests
|
||||
- name: Print failures
|
||||
if: failure()
|
||||
run: tests/run-tests.py --print-failures
|
||||
|
||||
stackless_clang:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- name: Install packages
|
||||
run: source tools/ci.sh && ci_unix_clang_setup
|
||||
- name: Build
|
||||
run: source tools/ci.sh && ci_unix_stackless_clang_build
|
||||
- name: Run main test suite
|
||||
run: source tools/ci.sh && ci_unix_stackless_clang_run_tests
|
||||
- name: Print failures
|
||||
if: failure()
|
||||
run: tests/run-tests.py --print-failures
|
||||
|
||||
float_clang:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- name: Install packages
|
||||
run: source tools/ci.sh && ci_unix_clang_setup
|
||||
- name: Build
|
||||
run: source tools/ci.sh && ci_unix_float_clang_build
|
||||
- name: Run main test suite
|
||||
run: source tools/ci.sh && ci_unix_float_clang_run_tests
|
||||
- name: Print failures
|
||||
if: failure()
|
||||
run: tests/run-tests.py --print-failures
|
||||
|
||||
settrace_stackless:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- uses: actions/setup-python@v5
|
||||
# Python 3.12 is the default for ubuntu-24.04, but that has compatibility issues with settrace tests.
|
||||
# Can remove this step when ubuntu-latest uses a more recent Python 3.x as the default.
|
||||
with:
|
||||
python-version: '3.11'
|
||||
- name: Build
|
||||
run: source tools/ci.sh && ci_unix_settrace_stackless_build
|
||||
- name: Run main test suite
|
||||
run: source tools/ci.sh && ci_unix_settrace_stackless_run_tests
|
||||
- name: Print failures
|
||||
if: failure()
|
||||
run: tests/run-tests.py --print-failures
|
||||
|
||||
macos:
|
||||
runs-on: macos-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.8'
|
||||
- name: Build
|
||||
run: source tools/ci.sh && ci_unix_macos_build
|
||||
- name: Run tests
|
||||
run: source tools/ci.sh && ci_unix_macos_run_tests
|
||||
- name: Print failures
|
||||
if: failure()
|
||||
run: tests/run-tests.py --print-failures
|
||||
|
||||
qemu_mips:
|
||||
# ubuntu-22.04 is needed for older libffi.
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- name: Install packages
|
||||
run: source tools/ci.sh && ci_unix_qemu_mips_setup
|
||||
- name: Build
|
||||
run: source tools/ci.sh && ci_unix_qemu_mips_build
|
||||
- name: Run main test suite
|
||||
run: source tools/ci.sh && ci_unix_qemu_mips_run_tests
|
||||
- name: Print failures
|
||||
if: failure()
|
||||
run: tests/run-tests.py --print-failures
|
||||
|
||||
qemu_arm:
|
||||
# ubuntu-22.04 is needed for older libffi.
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- name: Install packages
|
||||
run: source tools/ci.sh && ci_unix_qemu_arm_setup
|
||||
- name: Build
|
||||
run: source tools/ci.sh && ci_unix_qemu_arm_build
|
||||
- name: Run main test suite
|
||||
run: source tools/ci.sh && ci_unix_qemu_arm_run_tests
|
||||
- name: Print failures
|
||||
if: failure()
|
||||
run: tests/run-tests.py --print-failures
|
||||
|
||||
qemu_riscv64:
|
||||
# ubuntu-22.04 is needed for older libffi.
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- name: Install packages
|
||||
run: source tools/ci.sh && ci_unix_qemu_riscv64_setup
|
||||
- name: Build
|
||||
run: source tools/ci.sh && ci_unix_qemu_riscv64_build
|
||||
- name: Run main test suite
|
||||
run: source tools/ci.sh && ci_unix_qemu_riscv64_run_tests
|
||||
- name: Print failures
|
||||
if: failure()
|
||||
run: tests/run-tests.py --print-failures
|
||||
|
||||
sanitize_address:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- uses: actions/setup-python@v5
|
||||
# Python 3.12 is the default for ubuntu-24.04, but that has compatibility issues with settrace tests.
|
||||
# Can remove this step when ubuntu-latest uses a more recent Python 3.x as the default.
|
||||
with:
|
||||
python-version: '3.11'
|
||||
- name: Install packages
|
||||
run: source tools/ci.sh && ci_unix_coverage_setup
|
||||
- name: Build
|
||||
run: source tools/ci.sh && ci_unix_sanitize_address_build
|
||||
- name: Run main test suite
|
||||
run: source tools/ci.sh && ci_unix_sanitize_address_run_tests
|
||||
- name: Test merging .mpy files
|
||||
run: source tools/ci.sh && ci_unix_coverage_run_mpy_merge_tests
|
||||
- name: Build native mpy modules
|
||||
run: source tools/ci.sh && ci_native_mpy_modules_build
|
||||
- name: Test importing .mpy generated by mpy_ld.py
|
||||
run: source tools/ci.sh && ci_unix_coverage_run_native_mpy_tests
|
||||
- name: Print failures
|
||||
if: failure()
|
||||
run: tests/run-tests.py --print-failures
|
||||
|
||||
sanitize_undefined:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- uses: actions/setup-python@v5
|
||||
# Python 3.12 is the default for ubuntu-24.04, but that has compatibility issues with settrace tests.
|
||||
# Can remove this step when ubuntu-latest uses a more recent Python 3.x as the default.
|
||||
with:
|
||||
python-version: '3.11'
|
||||
- name: Install packages
|
||||
run: source tools/ci.sh && ci_unix_coverage_setup
|
||||
- name: Build
|
||||
run: source tools/ci.sh && ci_unix_sanitize_undefined_build
|
||||
- name: Run main test suite
|
||||
run: source tools/ci.sh && ci_unix_sanitize_undefined_run_tests
|
||||
- name: Test merging .mpy files
|
||||
run: source tools/ci.sh && ci_unix_coverage_run_mpy_merge_tests
|
||||
- name: Build native mpy modules
|
||||
run: source tools/ci.sh && ci_native_mpy_modules_build
|
||||
- name: Test importing .mpy generated by mpy_ld.py
|
||||
run: source tools/ci.sh && ci_unix_coverage_run_native_mpy_tests
|
||||
- name: Print failures
|
||||
if: failure()
|
||||
run: tests/run-tests.py --print-failures
|
||||
33
.github/workflows/ports_webassembly.yml
vendored
33
.github/workflows/ports_webassembly.yml
vendored
|
|
@ -1,33 +0,0 @@
|
|||
name: webassembly port
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
paths:
|
||||
- '.github/workflows/*.yml'
|
||||
- 'tools/**'
|
||||
- 'py/**'
|
||||
- 'extmod/**'
|
||||
- 'shared/**'
|
||||
- 'lib/**'
|
||||
- 'ports/webassembly/**'
|
||||
- 'tests/**'
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- name: Install packages
|
||||
run: source tools/ci.sh && ci_webassembly_setup
|
||||
- name: Build
|
||||
run: source tools/ci.sh && ci_webassembly_build
|
||||
- name: Run tests
|
||||
run: source tools/ci.sh && ci_webassembly_run_tests
|
||||
- name: Print failures
|
||||
if: failure()
|
||||
run: tests/run-tests.py --print-failures
|
||||
150
.github/workflows/ports_windows.yml
vendored
150
.github/workflows/ports_windows.yml
vendored
|
|
@ -1,150 +0,0 @@
|
|||
name: windows port
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
paths:
|
||||
- '.github/workflows/*.yml'
|
||||
- 'tools/**'
|
||||
- 'py/**'
|
||||
- 'extmod/**'
|
||||
- 'shared/**'
|
||||
- 'lib/**'
|
||||
- 'ports/unix/**'
|
||||
- 'ports/windows/**'
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
build-vs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
platform: [x86, x64]
|
||||
configuration: [Debug, Release]
|
||||
variant: [dev, standard]
|
||||
visualstudio: ['2017', '2019', '2022']
|
||||
include:
|
||||
- visualstudio: '2017'
|
||||
vs_version: '[15, 16)'
|
||||
- visualstudio: '2019'
|
||||
vs_version: '[16, 17)'
|
||||
- visualstudio: '2022'
|
||||
vs_version: '[17, 18)'
|
||||
# trim down the number of jobs in the matrix
|
||||
exclude:
|
||||
- variant: standard
|
||||
configuration: Debug
|
||||
- visualstudio: '2019'
|
||||
configuration: Debug
|
||||
runs-on: windows-latest
|
||||
env:
|
||||
CI_BUILD_CONFIGURATION: ${{ matrix.configuration }}
|
||||
steps:
|
||||
- name: Install Visual Studio 2017
|
||||
if: matrix.visualstudio == '2017'
|
||||
run: |
|
||||
choco install visualstudio2017buildtools
|
||||
choco install visualstudio2017-workload-vctools
|
||||
choco install windows-sdk-8.1
|
||||
- name: Install Visual Studio 2019
|
||||
if: matrix.visualstudio == '2019'
|
||||
run: |
|
||||
choco install visualstudio2019buildtools
|
||||
choco install visualstudio2019-workload-vctools
|
||||
choco install windows-sdk-8.1
|
||||
- uses: microsoft/setup-msbuild@v2
|
||||
with:
|
||||
vs-version: ${{ matrix.vs_version }}
|
||||
- uses: actions/checkout@v5
|
||||
- name: Build mpy-cross.exe
|
||||
run: msbuild mpy-cross\mpy-cross.vcxproj -maxcpucount -property:Configuration=${{ matrix.configuration }} -property:Platform=${{ matrix.platform }}
|
||||
- name: Update submodules
|
||||
run: git submodule update --init lib/micropython-lib
|
||||
- name: Build micropython.exe
|
||||
run: msbuild ports\windows\micropython.vcxproj -maxcpucount -property:Configuration=${{ matrix.configuration }} -property:Platform=${{ matrix.platform }} -property:PyVariant=${{ matrix.variant }}
|
||||
- name: Get micropython.exe path
|
||||
id: get_path
|
||||
run: |
|
||||
$exePath="$(msbuild ports\windows\micropython.vcxproj -nologo -v:m -t:ShowTargetPath -property:Configuration=${{ matrix.configuration }} -property:Platform=${{ matrix.platform }} -property:PyVariant=${{ matrix.variant }})"
|
||||
echo ("micropython=" + $exePath.Trim()) >> $env:GITHUB_OUTPUT
|
||||
- name: Run tests
|
||||
id: test
|
||||
env:
|
||||
MICROPY_MICROPYTHON: ${{ steps.get_path.outputs.micropython }}
|
||||
working-directory: tests
|
||||
run: python run-tests.py
|
||||
- name: Print failures
|
||||
if: failure() && steps.test.conclusion == 'failure'
|
||||
working-directory: tests
|
||||
run: python run-tests.py --print-failures
|
||||
- name: Run mpy tests
|
||||
id: test_mpy
|
||||
env:
|
||||
MICROPY_MICROPYTHON: ${{ steps.get_path.outputs.micropython }}
|
||||
working-directory: tests
|
||||
run: python run-tests.py --via-mpy -d basics float micropython
|
||||
- name: Print mpy failures
|
||||
if: failure() && steps.test_mpy.conclusion == 'failure'
|
||||
working-directory: tests
|
||||
run: python run-tests.py --print-failures
|
||||
|
||||
build-mingw:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
variant: [dev, standard]
|
||||
sys: [mingw32, mingw64]
|
||||
include:
|
||||
- sys: mingw32
|
||||
env: i686
|
||||
- sys: mingw64
|
||||
env: x86_64
|
||||
runs-on: windows-latest
|
||||
env:
|
||||
CHERE_INVOKING: enabled_from_arguments
|
||||
defaults:
|
||||
run:
|
||||
shell: msys2 {0}
|
||||
steps:
|
||||
- uses: actions/setup-python@v5
|
||||
# note: can go back to installing mingw-w64-${{ matrix.env }}-python after
|
||||
# MSYS2 updates to Python >3.12 (due to settrace compatibility issue)
|
||||
with:
|
||||
python-version: '3.11'
|
||||
- uses: msys2/setup-msys2@v2
|
||||
with:
|
||||
msystem: ${{ matrix.sys }}
|
||||
update: true
|
||||
install: >-
|
||||
make
|
||||
mingw-w64-${{ matrix.env }}-gcc
|
||||
pkg-config
|
||||
git
|
||||
diffutils
|
||||
path-type: inherit # Remove when setup-python is removed
|
||||
- uses: actions/checkout@v5
|
||||
- name: Build mpy-cross.exe
|
||||
run: make -C mpy-cross -j2
|
||||
- name: Update submodules
|
||||
run: make -C ports/windows VARIANT=${{ matrix.variant }} submodules
|
||||
- name: Build micropython.exe
|
||||
run: make -C ports/windows -j2 VARIANT=${{ matrix.variant }}
|
||||
- name: Run tests
|
||||
id: test
|
||||
run: make -C ports/windows test_full VARIANT=${{ matrix.variant }}
|
||||
- name: Print failures
|
||||
if: failure() && steps.test.conclusion == 'failure'
|
||||
working-directory: tests
|
||||
run: python run-tests.py --print-failures
|
||||
|
||||
cross-build-on-linux:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- name: Install packages
|
||||
run: source tools/ci.sh && ci_windows_setup
|
||||
- name: Build
|
||||
run: source tools/ci.sh && ci_windows_build
|
||||
61
.github/workflows/ports_zephyr.yml
vendored
61
.github/workflows/ports_zephyr.yml
vendored
|
|
@ -1,61 +0,0 @@
|
|||
name: zephyr port
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
paths:
|
||||
- '.github/workflows/ports_zephyr.yml'
|
||||
- 'tools/**'
|
||||
- 'py/**'
|
||||
- 'extmod/**'
|
||||
- 'shared/**'
|
||||
- 'lib/**'
|
||||
- 'ports/zephyr/**'
|
||||
- 'tests/**'
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: jlumbroso/free-disk-space@main
|
||||
with:
|
||||
# Only free up a few things so this step runs quickly.
|
||||
android: false
|
||||
dotnet: true
|
||||
haskell: true
|
||||
large-packages: false
|
||||
docker-images: false
|
||||
swap-storage: false
|
||||
- uses: actions/checkout@v5
|
||||
- id: versions
|
||||
name: Read Zephyr version
|
||||
run: source tools/ci.sh && echo "ZEPHYR=$ZEPHYR_VERSION" | tee "$GITHUB_OUTPUT"
|
||||
- name: Cached Zephyr Workspace
|
||||
id: cache_workspace
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
# note that the Zephyr CI docker image is 15GB. At time of writing
|
||||
# GitHub caches are limited to 10GB total for a project. So we only
|
||||
# cache the "workspace"
|
||||
path: ./zephyrproject
|
||||
key: zephyr-workspace-${{ steps.versions.outputs.ZEPHYR }}
|
||||
- name: ccache
|
||||
uses: hendrikmuhs/ccache-action@v1.2
|
||||
with:
|
||||
key: zephyr
|
||||
- name: Install packages
|
||||
run: source tools/ci.sh && ci_zephyr_setup
|
||||
- name: Install Zephyr
|
||||
if: steps.cache_workspace.outputs.cache-hit != 'true'
|
||||
run: source tools/ci.sh && ci_zephyr_install
|
||||
- name: Build
|
||||
run: source tools/ci.sh && ci_zephyr_build
|
||||
- name: Run main test suite
|
||||
run: source tools/ci.sh && ci_zephyr_run_tests
|
||||
- name: Print failures
|
||||
if: failure()
|
||||
run: tests/run-tests.py --print-failures
|
||||
30
.github/workflows/pre-commit.yml
vendored
Normal file
30
.github/workflows/pre-commit.yml
vendored
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
# SPDX-FileCopyrightText: Copyright (c) 2019 Anthony Sottile
|
||||
#
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
name: pre-commit
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
push:
|
||||
|
||||
jobs:
|
||||
pre-commit:
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- uses: actions/setup-python@v1
|
||||
- name: Install deps
|
||||
run: |
|
||||
sudo apt-add-repository -y -u ppa:pybricks/ppa
|
||||
sudo apt-get install -y black gettext uncrustify
|
||||
pip3 install -r requirements-dev.txt
|
||||
- name: Populate selected submodules
|
||||
run: git submodule update --init extmod/ulab
|
||||
- name: Set PY
|
||||
run: echo >>$GITHUB_ENV PY="$(python -c 'import hashlib, sys;print(hashlib.sha256(sys.version.encode()+sys.executable.encode()).hexdigest())')"
|
||||
- uses: actions/cache@v2
|
||||
with:
|
||||
path: ~/.cache/pre-commit
|
||||
key: pre-commit|${{ env.PY }}|${{ hashFiles('.pre-commit-config.yaml') }}
|
||||
- uses: pre-commit/action@v1.1.0
|
||||
13
.github/workflows/ruff.yml
vendored
13
.github/workflows/ruff.yml
vendored
|
|
@ -1,13 +0,0 @@
|
|||
name: Python code lint and formatting with ruff
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
ruff:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
# ruff version should be kept in sync with .pre-commit-config.yaml & also micropython-lib
|
||||
- run: pipx install ruff==0.11.6
|
||||
- run: ruff check --output-format=github .
|
||||
- run: ruff format --diff .
|
||||
90
.gitignore
vendored
90
.gitignore
vendored
|
|
@ -1,26 +1,92 @@
|
|||
# This .gitignore file is intended to be minimal.
|
||||
# SPDX-FileCopyrightText: 2014 MicroPython & CircuitPython contributors (https://github.com/adafruit/circuitpython/graphs/contributors)
|
||||
#
|
||||
# If you find that you need additional rules, such as IDE temporary
|
||||
# files, please do so either via a global .gitignore file (registered
|
||||
# with core.excludesFile), or by adding private repository-specific
|
||||
# rules to .git/info/exclude. See https://git-scm.com/docs/gitignore
|
||||
# for more information.
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
# Compiled Sources
|
||||
###################
|
||||
*.o
|
||||
*.a
|
||||
!atmel-samd/asf/**/*.a
|
||||
*.elf
|
||||
*.bin
|
||||
*.map
|
||||
*.hex
|
||||
*.dis
|
||||
*.exe
|
||||
|
||||
# Packages
|
||||
############
|
||||
dist/
|
||||
*.egg-info
|
||||
.eggs
|
||||
|
||||
# Logs and Databases
|
||||
######################
|
||||
*.log
|
||||
|
||||
# VIM Swap Files
|
||||
######################
|
||||
*.swp
|
||||
|
||||
# Build directories
|
||||
######################
|
||||
build/
|
||||
bin/
|
||||
circuitpython-stubs/
|
||||
build-*/
|
||||
docs/genrst/
|
||||
|
||||
# Test failure outputs and intermediate artefacts
|
||||
tests/results/*
|
||||
tests/ports/unix/ffi_lib.so
|
||||
# Test failure outputs
|
||||
######################
|
||||
tests/*.exp
|
||||
tests/*.out
|
||||
|
||||
# Python cache files
|
||||
######################
|
||||
__pycache__/
|
||||
*.pyc
|
||||
|
||||
# Customized Makefile/project overrides
|
||||
######################
|
||||
GNUmakefile
|
||||
user.props
|
||||
|
||||
# MacOS desktop metadata files
|
||||
.DS_Store
|
||||
# Sphinx output
|
||||
###############
|
||||
_build
|
||||
|
||||
# Generated rst files
|
||||
######################
|
||||
genrst/
|
||||
/autoapi/
|
||||
/shared-bindings/*/**/*.rst
|
||||
|
||||
# ctags and similar
|
||||
###################
|
||||
TAGS
|
||||
|
||||
# Merge leftovers
|
||||
#################
|
||||
*.orig
|
||||
|
||||
# Emacs backup files
|
||||
####################
|
||||
*~
|
||||
|
||||
*.DS_Store
|
||||
**/*.DS_Store
|
||||
*.icloud
|
||||
|
||||
# POEdit mo files
|
||||
####################
|
||||
*.mo
|
||||
|
||||
.vscode
|
||||
.idea
|
||||
|
||||
# Python Virtual Environments
|
||||
####################
|
||||
.venv
|
||||
.env
|
||||
|
||||
# Uncrustify formatting
|
||||
*.uncrustify
|
||||
|
|
|
|||
243
.gitmodules
vendored
243
.gitmodules
vendored
|
|
@ -1,76 +1,181 @@
|
|||
# SPDX-FileCopyrightText: 2014 MicroPython & CircuitPython contributors (https://github.com/adafruit/circuitpython/graphs/contributors)
|
||||
#
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
[submodule "lib/axtls"]
|
||||
path = lib/axtls
|
||||
url = https://github.com/micropython/axtls.git
|
||||
url = https://github.com/pfalcon/axtls
|
||||
branch = micropython
|
||||
[submodule "lib/libffi"]
|
||||
path = lib/libffi
|
||||
url = https://github.com/libffi/libffi
|
||||
[submodule "lib/lwip"]
|
||||
path = lib/lwip
|
||||
url = https://github.com/lwip-tcpip/lwip.git
|
||||
url = https://github.com/atgreen/libffi
|
||||
[submodule "lib/berkeley-db-1.xx"]
|
||||
path = lib/berkeley-db-1.xx
|
||||
url = https://github.com/micropython/berkeley-db-1.xx
|
||||
[submodule "lib/stm32lib"]
|
||||
path = lib/stm32lib
|
||||
url = https://github.com/micropython/stm32lib
|
||||
branch = work-F0-1.9.0+F4-1.16.0+F7-1.7.0+G0-1.5.1+G4-1.3.0+H7-1.6.0+L0-1.11.2+L1-1.10.3+L4-1.17.0+WB-1.10.0+WL-1.1.0
|
||||
[submodule "lib/nrfx"]
|
||||
path = lib/nrfx
|
||||
url = https://github.com/NordicSemiconductor/nrfx.git
|
||||
[submodule "lib/mbedtls"]
|
||||
path = lib/mbedtls
|
||||
url = https://github.com/ARMmbed/mbedtls.git
|
||||
[submodule "lib/asf4"]
|
||||
path = lib/asf4
|
||||
url = https://github.com/adafruit/asf4
|
||||
url = https://github.com/pfalcon/berkeley-db-1.xx
|
||||
[submodule "lib/uzlib"]
|
||||
path = lib/uzlib
|
||||
url = https://github.com/pfalcon/uzlib
|
||||
[submodule "tools/uf2"]
|
||||
path = tools/uf2
|
||||
url = https://github.com/Microsoft/uf2.git
|
||||
[submodule "atmel-samd/frozen/Adafruit_CircuitPython_NeoPixel"]
|
||||
path = frozen/Adafruit_CircuitPython_NeoPixel
|
||||
url = https://github.com/adafruit/Adafruit_CircuitPython_NeoPixel
|
||||
[submodule "frozen/Adafruit_CircuitPython_Thermistor"]
|
||||
path = frozen/Adafruit_CircuitPython_Thermistor
|
||||
url = https://github.com/adafruit/Adafruit_CircuitPython_Thermistor.git
|
||||
[submodule "frozen/Adafruit_CircuitPython_LIS3DH"]
|
||||
path = frozen/Adafruit_CircuitPython_LIS3DH
|
||||
url = https://github.com/adafruit/Adafruit_CircuitPython_LIS3DH.git
|
||||
[submodule "frozen/Adafruit_CircuitPython_BusDevice"]
|
||||
path = frozen/Adafruit_CircuitPython_BusDevice
|
||||
url = https://github.com/adafruit/Adafruit_CircuitPython_BusDevice.git
|
||||
[submodule "tools/python-semver"]
|
||||
path = tools/python-semver
|
||||
url = https://github.com/k-bx/python-semver.git
|
||||
[submodule "atmel-samd/asf4"]
|
||||
path = ports/atmel-samd/asf4
|
||||
url = https://github.com/adafruit/asf4.git
|
||||
branch = circuitpython
|
||||
[submodule "lib/tinyusb"]
|
||||
path = lib/tinyusb
|
||||
url = https://github.com/hathach/tinyusb
|
||||
[submodule "lib/mynewt-nimble"]
|
||||
path = lib/mynewt-nimble
|
||||
url = https://github.com/micropython/mynewt-nimble.git
|
||||
[submodule "lib/btstack"]
|
||||
path = lib/btstack
|
||||
url = https://github.com/bluekitchen/btstack.git
|
||||
[submodule "lib/nxp_driver"]
|
||||
path = lib/nxp_driver
|
||||
url = https://github.com/micropython/nxp_driver.git
|
||||
[submodule "lib/libhydrogen"]
|
||||
path = lib/libhydrogen
|
||||
url = https://github.com/jedisct1/libhydrogen.git
|
||||
[submodule "lib/pico-sdk"]
|
||||
path = lib/pico-sdk
|
||||
url = https://github.com/raspberrypi/pico-sdk.git
|
||||
[submodule "lib/fsp"]
|
||||
path = lib/fsp
|
||||
url = https://github.com/renesas/fsp.git
|
||||
[submodule "lib/wiznet"]
|
||||
path = lib/wiznet5k
|
||||
url = https://github.com/andrewleech/wiznet_ioLibrary_Driver.git
|
||||
# Requires https://github.com/Wiznet/ioLibrary_Driver/pull/120
|
||||
# url = https://github.com/Wiznet/ioLibrary_Driver.git
|
||||
[submodule "lib/cyw43-driver"]
|
||||
path = lib/cyw43-driver
|
||||
url = https://github.com/georgerobotics/cyw43-driver.git
|
||||
[submodule "lib/micropython-lib"]
|
||||
path = lib/micropython-lib
|
||||
url = https://github.com/micropython/micropython-lib.git
|
||||
[submodule "lib/protobuf-c"]
|
||||
path = lib/protobuf-c
|
||||
url = https://github.com/protobuf-c/protobuf-c.git
|
||||
[submodule "lib/open-amp"]
|
||||
path = lib/open-amp
|
||||
url = https://github.com/OpenAMP/open-amp.git
|
||||
[submodule "lib/libmetal"]
|
||||
path = lib/libmetal
|
||||
url = https://github.com/OpenAMP/libmetal.git
|
||||
[submodule "lib/arduino-lib"]
|
||||
path = lib/arduino-lib
|
||||
url = https://github.com/arduino/arduino-lib-mpy.git
|
||||
[submodule "lib/alif_ensemble-cmsis-dfp"]
|
||||
path = lib/alif_ensemble-cmsis-dfp
|
||||
url = https://github.com/alifsemi/alif_ensemble-cmsis-dfp.git
|
||||
[submodule "lib/alif-security-toolkit"]
|
||||
path = lib/alif-security-toolkit
|
||||
url = https://github.com/micropython/alif-security-toolkit.git
|
||||
[submodule "tools/usb_descriptor"]
|
||||
path = tools/usb_descriptor
|
||||
url = https://github.com/adafruit/usb_descriptor.git
|
||||
[submodule "lib/nrfutil"]
|
||||
path = lib/nrfutil
|
||||
url = https://github.com/adafruit/nRF52_nrfutil
|
||||
[submodule "ports/atmel-samd/freetouch"]
|
||||
path = ports/atmel-samd/freetouch
|
||||
url = https://github.com/adafruit/Adafruit_FreeTouch.git
|
||||
[submodule "frozen/Adafruit_CircuitPython_CircuitPlayground"]
|
||||
path = frozen/Adafruit_CircuitPython_CircuitPlayground
|
||||
url = https://github.com/adafruit/Adafruit_CircuitPython_CircuitPlayground.git
|
||||
[submodule "frozen/Adafruit_CircuitPython_HID"]
|
||||
path = frozen/Adafruit_CircuitPython_HID
|
||||
url = https://github.com/adafruit/Adafruit_CircuitPython_HID.git
|
||||
[submodule "ports/atmel-samd/Adafruit_CircuitPython_Motor"]
|
||||
path = frozen/Adafruit_CircuitPython_Motor
|
||||
url = https://github.com/adafruit/Adafruit_CircuitPython_Motor.git
|
||||
[submodule "ports/atmel-samd/Adafruit_CircuitPython_seesaw"]
|
||||
path = frozen/Adafruit_CircuitPython_seesaw
|
||||
url = https://github.com/adafruit/Adafruit_CircuitPython_seesaw.git
|
||||
[submodule "frozen/Adafruit_CircuitPython_IRRemote"]
|
||||
path = frozen/Adafruit_CircuitPython_IRRemote
|
||||
url = https://github.com/adafruit/Adafruit_CircuitPython_IRRemote.git
|
||||
[submodule "frozen/Adafruit_CircuitPython_DotStar"]
|
||||
path = frozen/Adafruit_CircuitPython_DotStar
|
||||
url = https://github.com/adafruit/Adafruit_CircuitPython_DotStar.git
|
||||
[submodule "ports/atmel-samd/peripherals"]
|
||||
path = ports/atmel-samd/peripherals
|
||||
url = https://github.com/adafruit/samd-peripherals.git
|
||||
[submodule "frozen/Adafruit_CircuitPython_Crickit"]
|
||||
path = frozen/Adafruit_CircuitPython_Crickit
|
||||
url = https://github.com/adafruit/Adafruit_CircuitPython_Crickit
|
||||
[submodule "ports/nrf/nrfx"]
|
||||
path = ports/nrf/nrfx
|
||||
url = https://github.com/adafruit/nrfx.git
|
||||
[submodule "tools/huffman"]
|
||||
path = tools/huffman
|
||||
url = https://github.com/tannewt/huffman.git
|
||||
[submodule "tools/adabot"]
|
||||
path = tools/adabot
|
||||
url = https://github.com/adafruit/adabot.git
|
||||
[submodule "tools/bitmap_font"]
|
||||
path = tools/bitmap_font
|
||||
url = https://github.com/adafruit/Adafruit_CircuitPython_BitmapFont.git
|
||||
[submodule "tools/Tecate-bitmap-fonts"]
|
||||
path = tools/Tecate-bitmap-fonts
|
||||
url = https://github.com/Tecate/bitmap-fonts.git
|
||||
[submodule "frozen/pew-pewpew-standalone-10.x"]
|
||||
path = frozen/pew-pewpew-standalone-10.x
|
||||
url = https://github.com/pewpew-game/pew-pewpew-standalone-10.x.git
|
||||
[submodule "frozen/circuitpython-stage"]
|
||||
path = frozen/circuitpython-stage
|
||||
url = https://github.com/python-ugame/circuitpython-stage.git
|
||||
[submodule "ports/cxd56/spresense-exported-sdk"]
|
||||
path = ports/cxd56/spresense-exported-sdk
|
||||
url = https://github.com/sonydevworld/spresense-exported-sdk.git
|
||||
[submodule "frozen/Adafruit_CircuitPython_SD"]
|
||||
path = frozen/Adafruit_CircuitPython_SD
|
||||
url = https://github.com/adafruit/Adafruit_CircuitPython_SD.git
|
||||
[submodule "lib/mp3"]
|
||||
path = lib/mp3
|
||||
url = https://github.com/adafruit/Adafruit_MP3
|
||||
[submodule "ports/mimxrt10xx/sdk"]
|
||||
path = ports/mimxrt10xx/sdk
|
||||
url = https://github.com/adafruit/MIMXRT10xx_SDK
|
||||
[submodule "frozen/Adafruit_CircuitPython_Register"]
|
||||
path = frozen/Adafruit_CircuitPython_Register
|
||||
url = https://github.com/adafruit/Adafruit_CircuitPython_Register.git
|
||||
[submodule "extmod/ulab"]
|
||||
path = extmod/ulab
|
||||
url = https://github.com/adafruit/circuitpython-ulab
|
||||
[submodule "frozen/Adafruit_CircuitPython_ESP32SPI"]
|
||||
path = frozen/Adafruit_CircuitPython_ESP32SPI
|
||||
url = https://github.com/adafruit/Adafruit_CircuitPython_ESP32SPI
|
||||
[submodule "frozen/Adafruit_CircuitPython_Requests"]
|
||||
path = frozen/Adafruit_CircuitPython_Requests
|
||||
url = https://github.com/adafruit/Adafruit_CircuitPython_Requests
|
||||
[submodule "ports/stm/st_driver"]
|
||||
path = ports/stm/st_driver
|
||||
url = https://github.com/hathach/st_driver.git
|
||||
[submodule "lib/protomatter"]
|
||||
path = lib/protomatter
|
||||
url = https://github.com/adafruit/Adafruit_Protomatter
|
||||
[submodule "frozen/Adafruit_CircuitPython_LSM6DS"]
|
||||
path = frozen/Adafruit_CircuitPython_LSM6DS
|
||||
url = https://github.com/adafruit/Adafruit_CircuitPython_LSM6DS
|
||||
[submodule "frozen/Adafruit_CircuitPython_FocalTouch"]
|
||||
path = frozen/Adafruit_CircuitPython_FocalTouch
|
||||
url = https://github.com/adafruit/Adafruit_CircuitPython_FocalTouch
|
||||
[submodule "frozen/Adafruit_CircuitPython_DS3231"]
|
||||
path = frozen/Adafruit_CircuitPython_DS3231
|
||||
url = https://github.com/adafruit/Adafruit_CircuitPython_DS3231
|
||||
[submodule "frozen/Adafruit_CircuitPython_DRV2605"]
|
||||
path = frozen/Adafruit_CircuitPython_DRV2605
|
||||
url = https://github.com/adafruit/Adafruit_CircuitPython_DRV2605
|
||||
[submodule "frozen/Adafruit_CircuitPython_BLE"]
|
||||
path = frozen/Adafruit_CircuitPython_BLE
|
||||
url = https://github.com/adafruit/Adafruit_CircuitPython_BLE
|
||||
[submodule "frozen/Adafruit_CircuitPython_BLE_Apple_Notification_Center"]
|
||||
path = frozen/Adafruit_CircuitPython_BLE_Apple_Notification_Center
|
||||
url = https://github.com/adafruit/Adafruit_CircuitPython_BLE_Apple_Notification_Center
|
||||
[submodule "frozen/Adafruit_CircuitPython_RFM9x"]
|
||||
path = frozen/Adafruit_CircuitPython_RFM9x
|
||||
url = https://github.com/adafruit/Adafruit_CircuitPython_RFM9x.git
|
||||
[submodule "frozen/Adafruit_CircuitPython_RFM69"]
|
||||
path = frozen/Adafruit_CircuitPython_RFM69
|
||||
url = https://github.com/adafruit/Adafruit_CircuitPython_RFM69.git
|
||||
[submodule "ports/esp32s2/esp-idf"]
|
||||
path = ports/esp32s2/esp-idf
|
||||
url = https://github.com/adafruit/esp-idf.git
|
||||
[submodule "ports/esp32s2/certificates/nina-fw"]
|
||||
path = ports/esp32s2/certificates/nina-fw
|
||||
url = https://github.com/adafruit/nina-fw.git
|
||||
[submodule "frozen/Adafruit_CircuitPython_ST7789"]
|
||||
path = frozen/Adafruit_CircuitPython_ST7789
|
||||
url = https://github.com/adafruit/Adafruit_CircuitPython_ST7789
|
||||
[submodule "frozen/Adafruit_CircuitPython_Display_Shapes"]
|
||||
path = frozen/Adafruit_CircuitPython_Display_Shapes
|
||||
url = https://github.com/adafruit/Adafruit_CircuitPython_Display_Shapes
|
||||
[submodule "frozen/Adafruit_CircuitPython_Display_Text"]
|
||||
path = frozen/Adafruit_CircuitPython_Display_Text
|
||||
url = https://github.com/adafruit/Adafruit_CircuitPython_Display_Text
|
||||
[submodule "frozen/Adafruit_CircuitPython_ProgressBar"]
|
||||
path = frozen/Adafruit_CircuitPython_ProgressBar
|
||||
url = https://github.com/adafruit/Adafruit_CircuitPython_ProgressBar
|
||||
[submodule "frozen/Adafruit_CircuitPython_LC709203F"]
|
||||
path = frozen/Adafruit_CircuitPython_LC709203F
|
||||
url = https://github.com/adafruit/Adafruit_CircuitPython_LC709203F
|
||||
[submodule "frozen/Adafruit_CircuitPython_SimpleMath"]
|
||||
path = frozen/Adafruit_CircuitPython_SimpleMath
|
||||
url = https://github.com/adafruit/Adafruit_CircuitPython_SimpleMath
|
||||
[submodule "ports/raspberrypi/sdk"]
|
||||
path = ports/raspberrypi/sdk
|
||||
url = https://github.com/adafruit/pico-sdk.git
|
||||
[submodule "data/nvm.toml"]
|
||||
path = data/nvm.toml
|
||||
url = https://github.com/adafruit/nvm.toml.git
|
||||
branch = main
|
||||
[submodule "frozen/Adafruit_CircuitPython_MIDI"]
|
||||
path = frozen/Adafruit_CircuitPython_MIDI
|
||||
url = https://github.com/adafruit/Adafruit_CircuitPython_MIDI
|
||||
|
|
|
|||
112
.mailmap
Normal file
112
.mailmap
Normal file
|
|
@ -0,0 +1,112 @@
|
|||
# SPDX-FileCopyrightText: 2020 Diego Elio Pettenò
|
||||
#
|
||||
# SPDX-License-Identifier: Unlicense
|
||||
|
||||
Alexander Steffen <devel.20.webmeister@spamgourmet.com>
|
||||
Alexander Steffen <devel.20.webmeister@spamgourmet.com> <Alexander.Steffen@infineon.com>
|
||||
Alexander Steffen <devel.20.webmeister@spamgourmet.com> <webmeister@users.noreply.github.com>
|
||||
Benjamin Vernoux <bvernoux@gmail.com>
|
||||
Brent Rubell <robots199@me.com>
|
||||
Brent Rubell <robots199@me.com> <brent@xn.home>
|
||||
Brent Rubell <robots199@me.com> <brentru@users.noreply.github.com>
|
||||
Carlos <carlos.santiago.diaz@gmail.com>
|
||||
Chris Packham <judge.packham@gmail.com>
|
||||
Chris Packham <judge.packham@gmail.com> <chris.packham@alliedtelesis.co.nz>
|
||||
Damiano Mazzella <damianomazzella@gmail.com>
|
||||
Damien George <damien.p.george@gmail.com>
|
||||
Dan Halbert <halbert@adafruit.com>
|
||||
Dan Halbert <halbert@adafruit.com> <halbert@halwitz.org>
|
||||
Daniel Pollard <daniel@learnweaver.com>
|
||||
Daniel Pollard <daniel@learnweaver.com> <daniel.pollard@learnweaver.com>
|
||||
Daniel Tralamazza <daniel@tralamazza.com>
|
||||
Daniel Tralamazza <daniel@tralamazza.com> <tralamazza@users.noreply.github.com>
|
||||
David Glaude <david.glaude@gmail.com>
|
||||
David Glaude <david.glaude@gmail.com> <dglaude@users.noreply.github.com>
|
||||
George Waters <gwatersdev@gmail.com>
|
||||
George Waters <gwatersdev@gmail.com> <george@georgeh2os.com>
|
||||
Ha Thach <thach@tinyusb.org>
|
||||
Henrik Sölver <henrik.solver@gmail.com>
|
||||
Ilya Dmitrichenko <errordeveloper@gmail.com>
|
||||
Ilya Dmitrichenko <errordeveloper@gmail.com> <ilya@xively.com>
|
||||
Jason Pecor <14111408+jpecor@users.noreply.github.com>
|
||||
Jeff Epler <jepler@gmail.com>
|
||||
Jeff Epler <jepler@gmail.com> <jeff@adafruit.com>
|
||||
Jeff Epler <jepler@gmail.com> <jepler@de11.u>
|
||||
Jeff Epler <jepler@gmail.com> <jepler@unpythonic.net>
|
||||
Jerry Needell <jerryneedell@gmail.com>
|
||||
Joe Bakalor <jmbakalor@gmail.com>
|
||||
Josh Klar <josh@klar.sh>
|
||||
Josh Klar <josh@klar.sh> <j@iv597.com>
|
||||
Juan Biondi <juanernestobiondi@gmail.com>
|
||||
Juan Biondi <juanernestobiondi@gmail.com> <juanernestobiondi@hotmail.com>
|
||||
KalbeAbbas <kalbeabbas142@gmail.com>
|
||||
KalbeAbbas <kalbeabbas142@gmail.com> <kalbeabbas@142@gmail.com>
|
||||
Kamil Tomaszewski <kamil.tomaszewski@sony.com>
|
||||
Kamil Tomaszewski <kamil.tomaszewski@sony.com> <46525824+kamtom480@users.noreply.github.com>
|
||||
Kattni <kattni@adafruit.com> <kattni@kittyfish.org>
|
||||
Kattni Rembor <kattni@adafruit.com>
|
||||
Kenny <WarriorOfWire@users.noreply.github.com>
|
||||
Kenny <WarriorOfWire@users.noreply.github.com> <3454741+WarriorOfWire@users.noreply.github.com>
|
||||
Kevin Townsend <contact@microbuilder.eu>
|
||||
Kevin Townsend <contact@microbuilder.eu> <microbuilder@users.noreply.github.com>
|
||||
Krzysztof Blazewicz <blazewicz.krzysztof@gmail.com>
|
||||
Krzysztof Blazewicz <blazewicz.krzysztof@gmail.com> <krzysztof.blazewicz@uxeon.com>
|
||||
Li Weiwei <liweiwei@yeweitech.org>
|
||||
Li Weiwei <liweiwei@yeweitech.org> <liweiwei@yeweitech.com>
|
||||
Limor "Ladyada" Fried <limor@ladyada.net>
|
||||
Limor "Ladyada" Fried <limor@ladyada.net> <ladyada>
|
||||
Lucian Copeland <hierophect@gmail.com>
|
||||
Lucian Copeland <hierophect@gmail.com> <hierophect@Lucians-MacBook-Air-2.local>
|
||||
Mark Olsson <post@markolsson.se>
|
||||
Mark Olsson <post@markolsson.se> <mark@markolsson.se>
|
||||
Matt Land <matt-land@users.noreply.github.com>
|
||||
Matt Land <matt-land@users.noreply.github.com> <mland@sparefoot.com>
|
||||
Matt Wozniski <godlygeek+git@gmail.com>
|
||||
Matt Wozniski <godlygeek+git@gmail.com> <mwozniski@bloomberg.net>
|
||||
Melissa LeBlanc-Williams <melissa@adafruit.com>
|
||||
Melissa LeBlanc-Williams <melissa@adafruit.com> <melissa@melissagirl.com>
|
||||
Metallicow <metaliobovinus@gmail.com>
|
||||
Metallicow <metaliobovinus@gmail.com> <edg62702@yahoo.com>
|
||||
Peter Hinch <peter@hinch.me.uk>
|
||||
Peter Hinch <peter@hinch.me.uk> <peterhinch@users.noreply.github.com>
|
||||
Radomir Dopieralski <openstack@sheep.art.pl>
|
||||
Radomir Dopieralski <openstack@sheep.art.pl> <deshipu@users.noreply.github.com>
|
||||
Rafa Gould <rafagoulds@gmail.com>
|
||||
Rafa Gould <rafagoulds@gmail.com> <50337143+rafa-gould@users.noreply.github.com>
|
||||
Ryan Shaw <ryan.shaw@wisetechglobal.com>
|
||||
Ryan Shaw <ryan.shaw@wisetechglobal.com> <ryannathans@hotmail.com>
|
||||
Sabas <s@electroniccats.com>
|
||||
Sabas <s@electroniccats.com> <s@theinventorhouse.org>
|
||||
Sabas <s@electroniccats.com> <sabasjimenez@gmail.com>
|
||||
Scott Shawcroft <scott@adafruit.com>
|
||||
Scott Shawcroft <scott@adafruit.com> <devnull@unpythonic.net>
|
||||
Scott Shawcroft <scott@adafruit.com> <scott.shawcroft@gmail.com>
|
||||
Scott Shawcroft <scott@adafruit.com> <scott@chickadee.tech>
|
||||
Scott Shawcroft <scott@adafruit.com> <scott@tannewt.org>
|
||||
Sebastian Plamauer <oeplse@gmail.com>
|
||||
Sebastian Plamauer <oeplse@gmail.com> <oepse@gmail.com>
|
||||
Senuros <Senuros@users.noreply.github.com>
|
||||
Senuros <Senuros@users.noreply.github.com> <senuros@noreply.github.com>
|
||||
Stewart Colborne <tscolborne@outlook.com>
|
||||
Stewart Colborne <tscolborne@outlook.com> <tscolborne@hotmail.com>
|
||||
TG-Techie <TGTechie01@gmail.com>
|
||||
TG-Techie <TGTechie01@gmail.com> <39284876+TG-Techie@users.noreply.github.com>
|
||||
Thea Flowers <me@thea.codes>
|
||||
Thea Flowers <me@thea.codes> <theaflowers@google.com>
|
||||
Tobias Badertscher <badi@baerospace.ch>
|
||||
Tobias Badertscher <badi@baerospace.ch> <python@baerospace.ch>
|
||||
danicampora <danicampora@gmail.com>
|
||||
danicampora <danicampora@gmail.com> <daniel@wipy.io>
|
||||
dherrada <dylan.herrada@gmail.com>
|
||||
dherrada <dylan.herrada@gmail.com> <33632497+dherrada@users.noreply.github.com>
|
||||
dherrada <dylan.herrada@gmail.com> <=>
|
||||
glennrub <glennbakke@gmail.com>
|
||||
retoc <retoc@users.noreply.github.com>
|
||||
retoc <retoc@users.noreply.github.com> <Retoc@noreply.github.com>
|
||||
siddacious <nospam187+github@gmail.com>
|
||||
siddacious <nospam187+github@gmail.com> <bsiepert@gmail.com>
|
||||
siddacious <nospam187+github@gmail.com> <bsiepert@lbl.gov>
|
||||
sommersoft <sommersoft@gmail.com>
|
||||
sommersoft <sommersoft@gmail.com> <sommersoft@users.noreply.github.com>
|
||||
stijn <stijn@ignitron.net>
|
||||
stijn <stijn@ignitron.net> <stinos@zoho.com>
|
||||
|
|
@ -1,27 +1,26 @@
|
|||
# SPDX-FileCopyrightText: 2020 Diego Elio Pettenò
|
||||
#
|
||||
# SPDX-License-Identifier: Unlicense
|
||||
|
||||
repos:
|
||||
- repo: local
|
||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||
rev: v2.3.0
|
||||
hooks:
|
||||
- id: codeformat
|
||||
name: MicroPython codeformat.py for changed C files
|
||||
entry: tools/codeformat.py -v -c -f
|
||||
language: python
|
||||
- id: verifygitlog
|
||||
name: MicroPython git commit message format checker
|
||||
entry: tools/verifygitlog.py --check-file --ignore-rebase
|
||||
language: python
|
||||
verbose: true
|
||||
stages: [commit-msg]
|
||||
- repo: https://github.com/charliermarsh/ruff-pre-commit
|
||||
# Version should be kept in sync with .github/workflows/ruff.yml & also micropython-lib
|
||||
rev: v0.11.6
|
||||
- id: check-yaml
|
||||
- id: end-of-file-fixer
|
||||
exclude: '^(tests/.*\.exp|tests/cmdline/.*|tests/.*/data/.*|ports/esp32s2/esp-idf-config/.*|ports/esp32s2/boards/.*/sdkconfig)'
|
||||
- id: trailing-whitespace
|
||||
exclude: '^(tests/.*\.exp|tests/cmdline/.*|tests/.*/data/.*)'
|
||||
- repo: local
|
||||
hooks:
|
||||
- id: ruff
|
||||
- id: ruff-format
|
||||
- repo: https://github.com/codespell-project/codespell
|
||||
# Version should be kept in sync with .github/workflows/codespell.yml
|
||||
rev: v2.4.1
|
||||
hooks:
|
||||
- id: codespell
|
||||
name: Spellcheck for changed files (codespell)
|
||||
additional_dependencies:
|
||||
- tomli
|
||||
- id: translations
|
||||
name: Translations
|
||||
entry: sh -c "if ! make check-translate; then make translate; fi"
|
||||
types: [c]
|
||||
pass_filenames: false
|
||||
language: system
|
||||
- id: formatting
|
||||
name: Formatting
|
||||
entry: python3 tools/codeformat.py
|
||||
types_or: [c, python]
|
||||
language: system
|
||||
|
|
|
|||
21
.readthedocs.yml
Normal file
21
.readthedocs.yml
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
# SPDX-FileCopyrightText: 2014 MicroPython & CircuitPython contributors (https://github.com/adafruit/circuitpython/graphs/contributors)
|
||||
#
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
# .readthedocs.yml
|
||||
# Read the Docs configuration file
|
||||
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
|
||||
|
||||
version: 2
|
||||
|
||||
submodules:
|
||||
include:
|
||||
- extmod/ulab
|
||||
|
||||
formats:
|
||||
- pdf
|
||||
|
||||
python:
|
||||
version: 3
|
||||
install:
|
||||
- requirements: docs/requirements.txt
|
||||
20
.rosie.yml
Normal file
20
.rosie.yml
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
# SPDX-FileCopyrightText: 2014 MicroPython & CircuitPython contributors (https://github.com/adafruit/circuitpython/graphs/contributors)
|
||||
#
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
# This configuration file tells Rosie where to find prebuilt .bin files (Travis
|
||||
# builds them) and where to find the tests.
|
||||
|
||||
binaries:
|
||||
prebuilt_s3:
|
||||
bucket: adafruit-circuit-python
|
||||
file_pattern: bin/{board}/adafruit-circuitpython-{board}-*-{short_sha}.{extension}
|
||||
rosie_upload:
|
||||
file_pattern: adafruit-circuitpython-{board}-*{short_sha}.{extension}
|
||||
|
||||
circuitpython_tests:
|
||||
test_directories:
|
||||
- tests/basics
|
||||
- tests/circuitpython
|
||||
test_helper:
|
||||
- tests/skip_if.py
|
||||
3
ACKNOWLEDGEMENTS.license
Normal file
3
ACKNOWLEDGEMENTS.license
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
SPDX-FileCopyrightText: 2014 MicroPython & CircuitPython contributors (https://github.com/adafruit/circuitpython/graphs/contributors)
|
||||
|
||||
SPDX-License-Identifier: MIT
|
||||
107
BUILDING.md
Normal file
107
BUILDING.md
Normal file
|
|
@ -0,0 +1,107 @@
|
|||
<!--
|
||||
SPDX-FileCopyrightText: 2014 MicroPython & CircuitPython contributors (https://github.com/adafruit/circuitpython/graphs/contributors)
|
||||
|
||||
SPDX-License-Identifier: MIT
|
||||
-->
|
||||
|
||||
# Building CircuitPython
|
||||
|
||||
Welcome to CircuitPython!
|
||||
|
||||
This document is a quick-start guide only.
|
||||
|
||||
Detailed guides on how to build CircuitPython can be found in the Adafruit Learn system at
|
||||
https://learn.adafruit.com/building-circuitpython/
|
||||
|
||||
## Setup
|
||||
|
||||
Please ensure you setup your build environment appropriately, as per the guide. You will need:
|
||||
|
||||
* Linux: https://learn.adafruit.com/building-circuitpython/linux
|
||||
* MacOS: https://learn.adafruit.com/building-circuitpython/macos
|
||||
* Windows Subsystem for Linux (WSL): https://learn.adafruit.com/building-circuitpython/windows-subsystem-for-linux
|
||||
|
||||
### Submodules
|
||||
|
||||
This project has a bunch of git submodules. You will need to update them regularly.
|
||||
|
||||
git submodule sync
|
||||
git submodule update --init
|
||||
|
||||
### mpy-cross
|
||||
|
||||
As part of the build process, mpy-cross is needed to compile .py files into .mpy files.
|
||||
To compile (or recompile) mpy-cross:
|
||||
|
||||
make -C mpy-cross
|
||||
|
||||
# Building
|
||||
|
||||
There a number of ports of CircuitPython! To build for your board, change to the appropriate ports directory and build.
|
||||
|
||||
Examples:
|
||||
|
||||
cd ports/atmel-samd
|
||||
make BOARD=circuitplayground_express
|
||||
|
||||
cd ports/nrf
|
||||
make BOARD=circuitplayground_bluefruit
|
||||
|
||||
If you aren't sure what boards exist, have a peek in the boards subdirectory of your port.
|
||||
If you have a fast computer with many cores, consider adding `-j` to your build flags, such as `-j17` on
|
||||
a 6-core 12-thread machine.
|
||||
|
||||
# Testing
|
||||
|
||||
If you are working on changes to the core language, you might find it useful to run the test suite.
|
||||
The test suite in the top level `tests` directory. It needs the unix port to run.
|
||||
|
||||
cd ports/unix
|
||||
make axtls
|
||||
make micropython
|
||||
|
||||
Then you can run the test suite:
|
||||
|
||||
cd ../../tests
|
||||
./run-tests
|
||||
|
||||
A successful run will say something like
|
||||
|
||||
676 tests performed (19129 individual testcases)
|
||||
676 tests passed
|
||||
30 tests skipped: buffered_writer builtin_help builtin_range_binop class_delattr_setattr cmd_parsetree extra_coverage framebuf1 framebuf16 framebuf2 framebuf4 framebuf8 framebuf_subclass mpy_invalid namedtuple_asdict non_compliant resource_stream schedule sys_getsizeof urandom_extra ure_groups ure_span ure_sub ure_sub_unmatched vfs_basic vfs_fat_fileio1 vfs_fat_fileio2 vfs_fat_more vfs_fat_oldproto vfs_fat_ramdisk vfs_userfs
|
||||
|
||||
# Debugging
|
||||
|
||||
The easiest way to debug CircuitPython on hardware is with a JLink device, JLinkGDBServer, and an appropriate GDB.
|
||||
Instructions can be found at https://learn.adafruit.com/debugging-the-samd21-with-gdb
|
||||
|
||||
If using JLink, you'll need both the `JLinkGDBServer` and `arm-none-eabi-gdb` running.
|
||||
|
||||
Example:
|
||||
|
||||
JLinkGDBServer -if SWD -device ATSAMD51J19
|
||||
arm-none-eabi-gdb build-metro_m4_express/firmware.elf -iex "target extended-remote :2331"
|
||||
|
||||
If your port/build includes `arm-none-eabi-gdb-py`, consider using it instead, as it can be used for better register
|
||||
debugging with https://github.com/bnahill/PyCortexMDebug
|
||||
|
||||
# Code Quality Checks
|
||||
|
||||
We apply code quality checks using pre-commit. Install pre-commit once per system with
|
||||
|
||||
python3 -mpip install pre-commit
|
||||
|
||||
Activate it once per git clone with
|
||||
|
||||
pre-commit --install
|
||||
|
||||
Pre-commit also requires some additional programs to be installed through your package manager:
|
||||
|
||||
* Standard Unix tools such as make, find, etc
|
||||
* The gettext package, any modern version
|
||||
* uncrustify version 0.71 (0.72 is also tested)
|
||||
|
||||
Each time you create a git commit, the pre-commit quality checks will be run. You can also run them e.g., with `pre-commit run foo.c` or `pre-commit run --all` to run on all files whether modified or not.
|
||||
|
||||
Some pre-commit quality checks require your active attention to resolve, others (such as the formatting checks of uncrustify) are made automatically and must simply be incorporated into your code changes by committing them.
|
||||
|
|
@ -1,384 +0,0 @@
|
|||
Git commit conventions
|
||||
======================
|
||||
|
||||
Each commit message should start with a directory or full file path
|
||||
prefix, so it was clear which part of codebase a commit affects. If
|
||||
a change affects one file, it's better to use path to a file. If it
|
||||
affects few files in a subdirectory, using subdirectory as a prefix
|
||||
is ok. For longish paths, it's acceptable to drop intermediate
|
||||
components, which still should provide good context of a change.
|
||||
It's also ok to drop file extensions.
|
||||
|
||||
Besides prefix, first line of a commit message should describe a
|
||||
change clearly and to the point, and be a grammatical sentence with
|
||||
final full stop. First line must fit within 72 characters. Examples
|
||||
of good first line of commit messages:
|
||||
|
||||
py/objstr: Add splitlines() method.
|
||||
py: Rename FOO to BAR.
|
||||
docs/machine: Fix typo in reset() description.
|
||||
ports: Switch to use lib/foo instead of duplicated code.
|
||||
|
||||
After the first line add an empty line and in the following lines describe
|
||||
the change in a detail, if needed, with lines fitting within 75 characters
|
||||
(with an exception for long items like URLs which cannot be broken). Any
|
||||
change beyond 5 lines would likely require such detailed description.
|
||||
|
||||
To get good practical examples of good commits and their messages, browse
|
||||
the `git log` of the project.
|
||||
|
||||
When committing you must sign-off your commit by adding "Signed-off-by:"
|
||||
line(s) at the end of the commit message, e.g. using `git commit -s`. You
|
||||
are then certifying and signing off against the following:
|
||||
|
||||
* That you wrote the change yourself, or took it from a project with
|
||||
a compatible license (in the latter case the commit message, and possibly
|
||||
source code should provide reference where the implementation was taken
|
||||
from and give credit to the original author, as required by the license).
|
||||
* That you are allowed to release these changes to an open-source project
|
||||
(for example, changes done during paid work for a third party may require
|
||||
explicit approval from that third party).
|
||||
* That you (or your employer) agree to release the changes under
|
||||
MicroPython's license, which is the MIT license. Note that you retain
|
||||
copyright for your changes (for smaller changes, the commit message
|
||||
conveys your copyright; if you make significant changes to a particular
|
||||
source module, you're welcome to add your name to the file header).
|
||||
* Your contribution including commit message will be publicly and
|
||||
indefinitely available for anyone to access, including redistribution
|
||||
under the terms of the project's license.
|
||||
* Your signature for all of the above, which is the "Signed-off-by" line,
|
||||
includes your full real name and a valid and active email address by
|
||||
which you can be contacted in the foreseeable future.
|
||||
|
||||
Code auto-formatting
|
||||
====================
|
||||
|
||||
Both C and Python code formatting are controlled for consistency across the
|
||||
MicroPython codebase. C code is formatted using the `tools/codeformat.py`
|
||||
script which uses [uncrustify](https://github.com/uncrustify/uncrustify).
|
||||
Python code is linted and formatted using
|
||||
[ruff & ruff format](https://github.com/astral-sh/ruff).
|
||||
After making changes, and before committing, run `tools/codeformat.py` to
|
||||
reformat your C code and `ruff format` for any Python code. Without
|
||||
arguments this tool will reformat all source code (and may take some time
|
||||
to run). Otherwise pass as arguments to the tool the files that changed,
|
||||
and it will only reformat those.
|
||||
|
||||
uncrustify
|
||||
==========
|
||||
|
||||
Only [uncrustify](https://github.com/uncrustify/uncrustify) v0.71 or v0.72 can
|
||||
be used for MicroPython. Different uncrustify versions produce slightly
|
||||
different formatting, and the configuration file formats are often
|
||||
incompatible. v0.73 or newer *will not work*.
|
||||
|
||||
Depending on your operating system version, it may be possible to install a pre-compiled
|
||||
uncrustify version:
|
||||
|
||||
Ubuntu, Debian
|
||||
--------------
|
||||
|
||||
Ubuntu versions 21.10 or 22.04LTS, and Debian versions bullseye or bookworm all
|
||||
include v0.72 so can be installed directly:
|
||||
|
||||
```
|
||||
$ apt install uncrustify
|
||||
```
|
||||
|
||||
Arch Linux
|
||||
----------
|
||||
|
||||
The current Arch uncrustify version is too new. There is an [old Arch package
|
||||
for v0.72](https://archive.archlinux.org/packages/u/uncrustify/) that can be
|
||||
installed from the Arch Linux archive ([more
|
||||
information](https://wiki.archlinux.org/title/Downgrading_packages#Arch_Linux_Archive)). Use
|
||||
the [IgnorePkg feature](https://wiki.archlinux.org/title/Pacman#Skip_package_from_being_upgraded)
|
||||
to prevent it re-updating.
|
||||
|
||||
Brew
|
||||
----
|
||||
|
||||
This command may work, please raise a new Issue if it doesn't:
|
||||
|
||||
```
|
||||
curl -L https://github.com/Homebrew/homebrew-core/raw/2b07d8192623365078a8b855a164ebcdf81494a6/Formula/uncrustify.rb > uncrustify.rb && brew install uncrustify.rb && rm uncrustify.rb
|
||||
```
|
||||
|
||||
Code spell checking
|
||||
===================
|
||||
|
||||
Code spell checking is done using [codespell](https://github.com/codespell-project/codespell#codespell)
|
||||
and runs in a GitHub action in CI. Codespell is configured via `pyproject.toml`
|
||||
to avoid false positives. It is recommended run codespell before submitting a
|
||||
PR. To simplify this, codespell is configured as a pre-commit hook and will be
|
||||
installed if you run `pre-commit install` (see below).
|
||||
|
||||
If you want to install and run codespell manually, you can do so by running:
|
||||
|
||||
```
|
||||
$ pip install codespell tomli
|
||||
$ codespell
|
||||
```
|
||||
|
||||
Automatic Pre-Commit Hooks
|
||||
==========================
|
||||
|
||||
To have code formatting and commit message conventions automatically checked,
|
||||
a configuration file is provided for the [pre-commit](https://pre-commit.com/)
|
||||
tool.
|
||||
|
||||
First install `pre-commit`, either from your system package manager or via
|
||||
`pip`. When installing `pre-commit` via pip, it is recommended to use a
|
||||
virtual environment. Other sources, such as Brew are also available, see
|
||||
[the docs](https://pre-commit.com/index.html#install) for details.
|
||||
|
||||
```
|
||||
$ apt install pre-commit # Ubuntu, Debian
|
||||
$ pacman -Sy python-precommit # Arch Linux
|
||||
$ brew install pre-commit # Brew
|
||||
$ pip install pre-commit # PyPI
|
||||
```
|
||||
|
||||
Next, install [uncrustify (see above)](#uncrustify). Other dependencies are managed by
|
||||
pre-commit automatically, but uncrustify needs to be installed and available on
|
||||
the PATH.
|
||||
|
||||
Then, inside the MicroPython repository, register the git hooks for pre-commit
|
||||
by running:
|
||||
|
||||
```
|
||||
$ pre-commit install --hook-type pre-commit --hook-type commit-msg
|
||||
```
|
||||
|
||||
pre-commit will now automatically run during `git commit` for both code and
|
||||
commit message formatting.
|
||||
|
||||
The same formatting checks will be run by CI for any Pull Request submitted to
|
||||
MicroPython. Pre-commit allows you to see any failure more quickly, and in many
|
||||
cases will automatically correct it in your local working copy.
|
||||
|
||||
To unregister `pre-commit` from your MicroPython repository, run:
|
||||
|
||||
```
|
||||
$ pre-commit uninstall --hook-type pre-commit --hook-type commit-msg
|
||||
```
|
||||
|
||||
Tips:
|
||||
|
||||
* To skip pre-commit checks on a single commit, use `git commit -n` (for
|
||||
`--no-verify`).
|
||||
* To ignore the pre-commit message format check temporarily, start the commit
|
||||
message subject line with "WIP" (for "Work In Progress").
|
||||
|
||||
Running pre-commit manually
|
||||
===========================
|
||||
|
||||
Once pre-commit is installed as per the previous section it can be manually
|
||||
run against the MicroPython python codebase to update file formatting on
|
||||
demand, with either:
|
||||
* `pre-commit run --all-files` to fix all files in the MicroPython codebase
|
||||
* `pre-commit run --file ./path/to/my/file` to fix just one file
|
||||
* `pre-commit run --file ./path/to/my/folder/*` to fix just one folder
|
||||
|
||||
Python code conventions
|
||||
=======================
|
||||
|
||||
Python code follows [PEP 8](https://legacy.python.org/dev/peps/pep-0008/) and
|
||||
is auto-formatted using [ruff format](https://docs.astral.sh/ruff/formatter)
|
||||
with a line-length of 99 characters.
|
||||
|
||||
Naming conventions:
|
||||
- Module names are short and all lowercase; eg pyb, stm.
|
||||
- Class names are CamelCase, with abbreviations all uppercase; eg I2C, not
|
||||
I2c.
|
||||
- Function and method names are all lowercase with words separated by
|
||||
a single underscore as necessary to improve readability; eg mem_read.
|
||||
- Constants are all uppercase with words separated by a single underscore;
|
||||
eg GPIO_IDR.
|
||||
|
||||
C code conventions
|
||||
==================
|
||||
|
||||
C code is auto-formatted using [uncrustify](https://github.com/uncrustify/uncrustify)
|
||||
and the corresponding configuration file `tools/uncrustify.cfg`, with a few
|
||||
minor fix-ups applied by `tools/codeformat.py`. When writing new C code please
|
||||
adhere to the existing style and use `tools/codeformat.py` to check any changes.
|
||||
The main conventions, and things not enforceable via the auto-formatter, are
|
||||
described below.
|
||||
|
||||
As the MicroPython code base is over ten years old, not every source file
|
||||
conforms fully to these conventions. If making small changes to existing code,
|
||||
then it's usually acceptable to follow the existing code's style. New code or
|
||||
major changes should follow the conventions described here.
|
||||
|
||||
## White space
|
||||
|
||||
- Expand tabs to 4 spaces.
|
||||
- Don't leave trailing whitespace at the end of a line.
|
||||
- For control blocks (if, for, while), put 1 space between the
|
||||
keyword and the opening parenthesis.
|
||||
- Put 1 space after a comma, and 1 space around operators.
|
||||
|
||||
## Braces
|
||||
|
||||
- Use braces for all blocks, even no-line and single-line pieces of
|
||||
code.
|
||||
- Put opening braces on the end of the line it belongs to, not on
|
||||
a new line.
|
||||
- For else-statements, put the else on the same line as the previous
|
||||
closing brace.
|
||||
|
||||
## Header files
|
||||
|
||||
- Header files should be protected from multiple inclusion with #if
|
||||
directives. See an existing header for naming convention.
|
||||
|
||||
## Names
|
||||
|
||||
- Use underscore_case, not camelCase for all names.
|
||||
- Use CAPS_WITH_UNDERSCORE for enums and macros.
|
||||
- When defining a type use underscore_case and put '_t' after it.
|
||||
|
||||
### Public names (declared in headers)
|
||||
|
||||
- MicroPython-specific names (especially any declared in `py/` and `extmod/`
|
||||
directories) should generally start with `mp_` or `MP_`.
|
||||
- Functions and variables declared in a header should generally share a longer
|
||||
common prefix. Usually the prefix matches the file name (i.e. items defined in
|
||||
`py/obj.c` are declared in `py/obj.h` and should be prefixed `mp_obj_`). There
|
||||
are exceptions, for example where one header file contains declarations
|
||||
implemented in multiple source files for expediency.
|
||||
|
||||
### Private names (specific to a single .c file)
|
||||
|
||||
- For static functions and variables exposed to Python (i.e. a static C function
|
||||
that is wrapped in `MP_DEFINE_CONST_FUN_...` and attached to a module), use
|
||||
the file-level shared common prefix, i.e. name them as if the function or
|
||||
variable was not static.
|
||||
- Other static definitions in source files (i.e. functions or variables defined
|
||||
in a .c file that are only used within that .c file) don't need any prefix
|
||||
(specifically: no `s_` or `_` prefix, and generally avoid adding the
|
||||
file-level common prefix).
|
||||
|
||||
## Integer types
|
||||
|
||||
MicroPython runs on 16, 32, and 64 bit machines, so it's important to use the
|
||||
correctly-sized (and signed) integer types. The general guidelines are:
|
||||
|
||||
- For most cases use mp_int_t for signed and mp_uint_t for unsigned
|
||||
integer values. These are guaranteed to be machine-word sized and
|
||||
therefore big enough to hold the value from a MicroPython small-int
|
||||
object.
|
||||
- Use size_t for things that count bytes / sizes of objects.
|
||||
- You can use int/uint, but remember that they may be 16-bits wide.
|
||||
- If in doubt, use mp_int_t/mp_uint_t.
|
||||
|
||||
## Comments
|
||||
|
||||
- Be concise and only write comments for things that are not obvious.
|
||||
- Use `// ` prefix, NOT `/* ... */`. No extra fluff.
|
||||
|
||||
## Memory allocation
|
||||
|
||||
- Use m_new, m_renew, m_del (and friends) to allocate and free heap memory.
|
||||
These macros are defined in py/misc.h.
|
||||
|
||||
Examples
|
||||
--------
|
||||
|
||||
Braces, spaces, names and comments:
|
||||
|
||||
#define TO_ADD (123)
|
||||
|
||||
// This function will always recurse indefinitely and is only used to show
|
||||
// coding style
|
||||
int foo_function(int x, int some_value) {
|
||||
if (x < some_value) {
|
||||
foo(some_value, x);
|
||||
} else {
|
||||
foo(x + TO_ADD, some_value - 1);
|
||||
}
|
||||
|
||||
for (int my_counter = 0; my_counter < x; ++my_counter) {
|
||||
}
|
||||
}
|
||||
|
||||
Type declarations:
|
||||
|
||||
typedef struct _my_struct_t {
|
||||
int member;
|
||||
void *data;
|
||||
} my_struct_t;
|
||||
|
||||
Documentation conventions
|
||||
=========================
|
||||
|
||||
MicroPython generally follows CPython in documentation process and
|
||||
conventions. reStructuredText syntax is used for the documentation.
|
||||
|
||||
Specific conventions/suggestions:
|
||||
|
||||
* Use `*` markup to refer to arguments of a function, e.g.:
|
||||
|
||||
```
|
||||
.. method:: poll.unregister(obj)
|
||||
|
||||
Unregister *obj* from polling.
|
||||
```
|
||||
|
||||
* Use following syntax for cross-references/cross-links:
|
||||
|
||||
```
|
||||
:func:`foo` - function foo in current module
|
||||
:func:`module1.foo` - function foo in module "module1"
|
||||
(similarly for other referent types)
|
||||
:class:`Foo` - class Foo
|
||||
:meth:`Class.method1` - method1 in Class
|
||||
:meth:`~Class.method1` - method1 in Class, but rendered just as "method1()",
|
||||
not "Class.method1()"
|
||||
:meth:`title <method1>` - reference method1, but render as "title" (use only
|
||||
if really needed)
|
||||
:mod:`module1` - module module1
|
||||
|
||||
`symbol` - generic xref syntax which can replace any of the above in case
|
||||
the xref is unambiguous. If there's ambiguity, there will be a warning
|
||||
during docs generation, which need to be fixed using one of the syntaxes
|
||||
above
|
||||
```
|
||||
|
||||
* Cross-referencing arbitrary locations
|
||||
~~~
|
||||
.. _xref_target:
|
||||
|
||||
Normal non-indented text.
|
||||
|
||||
This is :ref:`reference <xref_target>`.
|
||||
|
||||
(If xref target is followed by section title, can be just
|
||||
:ref:`xref_target`).
|
||||
~~~
|
||||
|
||||
* Linking to external URL:
|
||||
```
|
||||
`link text <http://foo.com/...>`_
|
||||
```
|
||||
|
||||
* Referencing builtin singleton objects:
|
||||
```
|
||||
``None``, ``True``, ``False``
|
||||
```
|
||||
|
||||
* Use following syntax to create common description for more than one element:
|
||||
~~~
|
||||
.. function:: foo(x)
|
||||
bar(y)
|
||||
|
||||
Description common to foo() and bar().
|
||||
~~~
|
||||
|
||||
|
||||
More detailed guides and quickrefs:
|
||||
|
||||
* http://www.sphinx-doc.org/en/stable/rest.html
|
||||
* http://www.sphinx-doc.org/en/stable/markup/inline.html
|
||||
* http://docutils.sourceforge.net/docs/user/rst/quickref.html
|
||||
|
|
@ -1,53 +0,0 @@
|
|||
MicroPython Code of Conduct
|
||||
===========================
|
||||
|
||||
The MicroPython community is made up of members from around the globe with a
|
||||
diverse set of skills, personalities, and experiences. It is through these
|
||||
differences that our community experiences great successes and continued growth.
|
||||
When you're working with members of the community, this Code of Conduct will
|
||||
help steer your interactions and keep MicroPython a positive, successful, and
|
||||
growing community.
|
||||
|
||||
Members of the MicroPython community are open, considerate, and respectful.
|
||||
Behaviours that reinforce these values contribute to a positive environment, and
|
||||
include: acknowledging time and effort, being respectful of differing viewpoints
|
||||
and experiences, gracefully accepting constructive criticism, and using
|
||||
welcoming and inclusive language.
|
||||
|
||||
Every member of our community has the right to have their identity respected.
|
||||
The MicroPython community is dedicated to providing a positive experience for
|
||||
everyone, regardless of age, gender identity and expression, sexual orientation,
|
||||
disability, physical appearance, body size, ethnicity, nationality, race, or
|
||||
religion (or lack thereof), education, or socio-economic status.
|
||||
|
||||
Unacceptable behaviour includes: harassment, trolling, deliberate intimidation,
|
||||
violent threats or language directed against another person; insults, put downs,
|
||||
or jokes that are based upon stereotypes, that are exclusionary, or that hold
|
||||
others up for ridicule; unwelcome sexual attention or advances; sustained
|
||||
disruption of community discussions; publishing others' private information
|
||||
without explicit permission; and other conduct that is inappropriate for a
|
||||
professional audience including people of many different backgrounds.
|
||||
|
||||
This code of conduct covers all online and offline presence related to the
|
||||
MicroPython project, including GitHub and the forum. If a participant engages
|
||||
in behaviour that violates this code of conduct, the MicroPython team may take
|
||||
action as they deem appropriate, including warning the offender or expulsion
|
||||
from the community. Community members asked to stop any inappropriate behaviour
|
||||
are expected to comply immediately.
|
||||
|
||||
Thank you for helping make this a welcoming, friendly community for everyone.
|
||||
|
||||
If you believe that someone is violating the code of conduct, or have any other
|
||||
concerns, please contact a member of the MicroPython team by emailing
|
||||
contact@micropython.org.
|
||||
|
||||
License
|
||||
-------
|
||||
|
||||
This Code of Conduct is licensed under the Creative Commons
|
||||
Attribution-ShareAlike 3.0 Unported License.
|
||||
|
||||
Attributions
|
||||
------------
|
||||
|
||||
Based on the Python code of conduct found at https://www.python.org/psf/conduct/
|
||||
135
CODE_OF_CONDUCT.md
Normal file
135
CODE_OF_CONDUCT.md
Normal file
|
|
@ -0,0 +1,135 @@
|
|||
<!--
|
||||
SPDX-FileCopyrightText: 2014 Coraline Ada Ehmke
|
||||
SPDX-FileCopyrightText: 2019 Kattni Rembor for Adafruit Industries
|
||||
|
||||
SPDX-License-Identifier: CC-BY-4.0
|
||||
-->
|
||||
# Adafruit Community Code of Conduct
|
||||
|
||||
## Our Pledge
|
||||
|
||||
In the interest of fostering an open and welcoming environment, we as
|
||||
contributors and leaders pledge to making participation in our project and
|
||||
our community a harassment-free experience for everyone, regardless of age, body
|
||||
size, disability, ethnicity, gender identity and expression, level or type of
|
||||
experience, education, socio-economic status, nationality, personal appearance,
|
||||
race, religion, or sexual identity and orientation.
|
||||
|
||||
## Our Standards
|
||||
|
||||
We are committed to providing a friendly, safe and welcoming environment for
|
||||
all.
|
||||
|
||||
Examples of behavior that contributes to creating a positive environment
|
||||
include:
|
||||
|
||||
* Be kind and courteous to others
|
||||
* Using welcoming and inclusive language
|
||||
* Being respectful of differing viewpoints and experiences
|
||||
* Collaborating with other community members
|
||||
* Gracefully accepting constructive criticism
|
||||
* Focusing on what is best for the community
|
||||
* Showing empathy towards other community members
|
||||
|
||||
Examples of unacceptable behavior by participants include:
|
||||
|
||||
* The use of sexualized language or imagery and sexual attention or advances
|
||||
* The use of inappropriate images, including in a community member's avatar
|
||||
* The use of inappropriate language, including in a community member's nickname
|
||||
* Any spamming, flaming, baiting or other attention-stealing behavior
|
||||
* Excessive or unwelcome helping; answering outside the scope of the question
|
||||
asked
|
||||
* Trolling, insulting/derogatory comments, and personal or political attacks
|
||||
* Promoting or spreading disinformation, lies, or conspiracy theories against
|
||||
a person, group, organisation, project, or community
|
||||
* Public or private harassment
|
||||
* Publishing others' private information, such as a physical or electronic
|
||||
address, without explicit permission
|
||||
* Other conduct which could reasonably be considered inappropriate
|
||||
|
||||
The goal of the standards and moderation guidelines outlined here is to build
|
||||
and maintain a respectful community. We ask that you don’t just aim to be
|
||||
"technically unimpeachable", but rather try to be your best self.
|
||||
|
||||
We value many things beyond technical expertise, including collaboration and
|
||||
supporting others within our community. Providing a positive experience for
|
||||
other community members can have a much more significant impact than simply
|
||||
providing the correct answer.
|
||||
|
||||
## Our Responsibilities
|
||||
|
||||
Project leaders are responsible for clarifying the standards of acceptable
|
||||
behavior and are expected to take appropriate and fair corrective action in
|
||||
response to any instances of unacceptable behavior.
|
||||
|
||||
Project leaders have the right and responsibility to remove, edit, or
|
||||
reject messages, comments, commits, code, issues, and other contributions
|
||||
that are not aligned to this Code of Conduct, or to ban temporarily or
|
||||
permanently any community member for other behaviors that they deem
|
||||
inappropriate, threatening, offensive, or harmful.
|
||||
|
||||
## Moderation
|
||||
|
||||
Instances of behaviors that violate the Adafruit Community Code of Conduct
|
||||
may be reported by any member of the community. Community members are
|
||||
encouraged to report these situations, including situations they witness
|
||||
involving other community members.
|
||||
|
||||
You may report in the following ways:
|
||||
|
||||
In any situation, you may send an email to <support@adafruit.com>.
|
||||
|
||||
On the Adafruit Discord, you may send an open message from any channel
|
||||
to all Community Moderators by tagging @community moderators. You may
|
||||
also send an open message from any channel, or a direct message to
|
||||
@kattni#1507, @tannewt#4653, @danh#1614, @cater#2442,
|
||||
@sommersoft#0222, @Mr. Certainly#0472 or @Andon#8175.
|
||||
|
||||
Email and direct message reports will be kept confidential.
|
||||
|
||||
In situations on Discord where the issue is particularly egregious, possibly
|
||||
illegal, requires immediate action, or violates the Discord terms of service,
|
||||
you should also report the message directly to Discord.
|
||||
|
||||
These are the steps for upholding our community’s standards of conduct.
|
||||
|
||||
1. Any member of the community may report any situation that violates the
|
||||
Adafruit Community Code of Conduct. All reports will be reviewed and
|
||||
investigated.
|
||||
2. If the behavior is an egregious violation, the community member who
|
||||
committed the violation may be banned immediately, without warning.
|
||||
3. Otherwise, moderators will first respond to such behavior with a warning.
|
||||
4. Moderators follow a soft "three strikes" policy - the community member may
|
||||
be given another chance, if they are receptive to the warning and change their
|
||||
behavior.
|
||||
5. If the community member is unreceptive or unreasonable when warned by a
|
||||
moderator, or the warning goes unheeded, they may be banned for a first or
|
||||
second offense. Repeated offenses will result in the community member being
|
||||
banned.
|
||||
|
||||
## Scope
|
||||
|
||||
This Code of Conduct and the enforcement policies listed above apply to all
|
||||
Adafruit Community venues. This includes but is not limited to any community
|
||||
spaces (both public and private), the entire Adafruit Discord server, and
|
||||
Adafruit GitHub repositories. Examples of Adafruit Community spaces include
|
||||
but are not limited to meet-ups, audio chats on the Adafruit Discord, or
|
||||
interaction at a conference.
|
||||
|
||||
This Code of Conduct applies both within project spaces and in public spaces
|
||||
when an individual is representing the project or its community. As a community
|
||||
member, you are representing our community, and are expected to behave
|
||||
accordingly.
|
||||
|
||||
## Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
||||
version 1.4, available at
|
||||
<https://www.contributor-covenant.org/version/1/4/code-of-conduct.html>,
|
||||
and the [Rust Code of Conduct](https://www.rust-lang.org/en-US/conduct.html).
|
||||
|
||||
For other projects adopting the Adafruit Community Code of
|
||||
Conduct, please contact the maintainers of those projects for enforcement.
|
||||
If you wish to use this code of conduct for your own project, consider
|
||||
explicitly mentioning your moderation policy or making a copy with your
|
||||
own moderation policy so as to avoid confusion.
|
||||
|
|
@ -1,8 +1,57 @@
|
|||
When reporting an issue and especially submitting a pull request, please
|
||||
make sure that you are acquainted with Contributor Guidelines:
|
||||
<!--
|
||||
SPDX-FileCopyrightText: 2014 MicroPython & CircuitPython contributors (https://github.com/adafruit/circuitpython/graphs/contributors)
|
||||
|
||||
https://github.com/micropython/micropython/wiki/ContributorGuidelines
|
||||
SPDX-License-Identifier: MIT
|
||||
-->
|
||||
|
||||
as well as the Code Conventions, which includes details of how to commit:
|
||||
# Contributing
|
||||
Please note that this project is released with a
|
||||
[Contributor Code of Conduct](CODE_OF_CONDUCT.md).
|
||||
By participating in this project you agree to abide by its terms. Participation
|
||||
covers any forum used to converse about CircuitPython including unofficial and official spaces. Failure to do
|
||||
so will result in corrective actions such as time out or ban from the project.
|
||||
|
||||
https://github.com/micropython/micropython/blob/master/CODECONVENTIONS.md
|
||||
## Licensing
|
||||
By contributing to this repository you are certifying that you have all necessary
|
||||
permissions to license the code under an MIT License. You still retain the
|
||||
copyright but are granting many permissions under the MIT License.
|
||||
|
||||
If you have an employment contract with your employer please make sure that they
|
||||
don't automatically own your work product. Make sure to get any necessary approvals
|
||||
before contributing. Another term for this contribution off-hours is moonlighting.
|
||||
|
||||
## Ways to contribute
|
||||
As CircuitPython grows, there are more and more ways to contribute. Here are some ideas:
|
||||
|
||||
* Build a project with CircuitPython and share how to do it online.
|
||||
* Test the latest libraries and CircuitPython versions with your projects and file issues for any bugs you find.
|
||||
* Contribute Python code to CircuitPython libraries that support new devices or features of an existing device.
|
||||
* Contribute C code to CircuitPython which fixes an open issue or adds a new feature.
|
||||
|
||||
## Getting started with C
|
||||
CircuitPython developer Dan Halbert (@dhalbert) has written up build instructions using native build
|
||||
tools [here](https://learn.adafruit.com/building-circuitpython).
|
||||
|
||||
For SAMD21 debugging workflow tips check out [this learn guide](https://learn.adafruit.com/debugging-the-samd21-with-gdb) from Scott (@tannewt).
|
||||
|
||||
## Developer contacts
|
||||
Scott Shawcroft ([@tannewt](https://github.com/tannewt)) is the lead developer of CircuitPython
|
||||
and is sponsored by [Adafruit Industries LLC](https://adafruit.com). Scott is usually available
|
||||
during US West Coast working hours. Dan Halbert ([@dhalbert](https://github.com/dhalbert)) and
|
||||
Kattni Rembor ([@kattni](https://github.com/kattni)) are also sponsored by [Adafruit Industries
|
||||
LLC](https://adafruit.com) and are usually available during US East Coast daytime hours including
|
||||
some weekends.
|
||||
|
||||
They are all reachable on [Discord](https://adafru.it/discord), GitHub issues and the [Adafruit
|
||||
support forum](https://forums.adafruit.com/viewforum.php?f=60).
|
||||
|
||||
## Code guidelines
|
||||
We aim to keep our code and commit style compatible with MicroPython upstream.
|
||||
Please review their
|
||||
[code conventions](https://github.com/micropython/micropython/blob/master/CODECONVENTIONS.md) to do so.
|
||||
Familiarity with their [design philosophy](https://github.com/micropython/micropython/wiki/ContributorGuidelines)
|
||||
is also useful though not always applicable to CircuitPython.
|
||||
|
||||
Furthermore, CircuitPython has a
|
||||
[design guide](https://circuitpython.readthedocs.io/en/latest/docs/design_guide.html)
|
||||
that covers a variety of different topics. Please read it as well.
|
||||
|
|
|
|||
69
LICENSE
69
LICENSE
|
|
@ -1,6 +1,6 @@
|
|||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013-2025 Damien P. George
|
||||
Copyright (c) 2013-2019 Damien P. George
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
|
@ -19,70 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
Unless specified otherwise (see below), the above license and copyright applies
|
||||
to all files in this repository.
|
||||
|
||||
Individual files may include additional copyright holders.
|
||||
|
||||
The various ports of MicroPython may include third-party software that is
|
||||
licensed under different terms. These licenses are summarised in the tree
|
||||
below, please refer to these files and directories for further license and
|
||||
copyright information. Note that (L)GPL-licensed code listed below is only
|
||||
used during the build process and is not part of the compiled source code.
|
||||
|
||||
/ (MIT)
|
||||
/drivers
|
||||
/cc3100 (BSD-3-clause)
|
||||
/lib
|
||||
/asf4 (Apache-2.0)
|
||||
/axtls (BSD-3-clause)
|
||||
/config
|
||||
/scripts
|
||||
/config (GPL-2.0-or-later)
|
||||
/Rules.mak (GPL-2.0)
|
||||
/berkeley-db-1xx (BSD-4-clause)
|
||||
/btstack (See btstack/LICENSE)
|
||||
/cmsis (BSD-3-clause)
|
||||
/crypto-algorithms (NONE)
|
||||
/libhydrogen (ISC)
|
||||
/libmetal (BSD-3-clause)
|
||||
/littlefs (BSD-3-clause)
|
||||
/lwip (BSD-3-clause)
|
||||
/mynewt-nimble (Apache-2.0)
|
||||
/nrfx (BSD-3-clause)
|
||||
/nxp_driver (BSD-3-Clause)
|
||||
/oofatfs (BSD-1-clause)
|
||||
/open-amp (BSD-3-clause)
|
||||
/pico-sdk (BSD-3-clause)
|
||||
/re15 (BSD-3-clause)
|
||||
/stm32lib (BSD-3-clause)
|
||||
/tinyusb (MIT)
|
||||
/uzlib (Zlib)
|
||||
/wiznet5k (MIT)
|
||||
/logo (uses OFL-1.1)
|
||||
/ports
|
||||
/cc3200
|
||||
/hal (BSD-3-clause)
|
||||
/simplelink (BSD-3-clause)
|
||||
/FreeRTOS (GPL-2.0 with FreeRTOS exception)
|
||||
/esp32
|
||||
/ppp_set_auth.* (Apache-2.0)
|
||||
/rp2
|
||||
/mutex_extra.c (BSD-3-clause)
|
||||
/clocks_extra.c (BSD-3-clause)
|
||||
/stm32
|
||||
/usbd*.c (MCD-ST Liberty SW License Agreement V2)
|
||||
/stm32_it.* (MIT + BSD-3-clause)
|
||||
/system_stm32*.c (MIT + BSD-3-clause)
|
||||
/boards
|
||||
/startup_stm32*.s (BSD-3-clause)
|
||||
/*/stm32*.h (BSD-3-clause)
|
||||
/usbdev (MCD-ST Liberty SW License Agreement V2)
|
||||
/usbhost (MCD-ST Liberty SW License Agreement V2)
|
||||
/zephyr
|
||||
/src (Apache-2.0)
|
||||
/tools
|
||||
/dfu.py (LGPL-3.0-only)
|
||||
|
|
|
|||
26
LICENSES/BSD-3-Clause.txt
Normal file
26
LICENSES/BSD-3-Clause.txt
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
Copyright (c) <year> <owner>. All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification,
|
||||
are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
3. Neither the name of the copyright holder nor the names of its contributors
|
||||
may be used to endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
||||
USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
324
LICENSES/CC-BY-4.0.txt
Normal file
324
LICENSES/CC-BY-4.0.txt
Normal file
|
|
@ -0,0 +1,324 @@
|
|||
Creative Commons Attribution 4.0 International Creative Commons Corporation
|
||||
("Creative Commons") is not a law firm and does not provide legal services
|
||||
or legal advice. Distribution of Creative Commons public licenses does not
|
||||
create a lawyer-client or other relationship. Creative Commons makes its licenses
|
||||
and related information available on an "as-is" basis. Creative Commons gives
|
||||
no warranties regarding its licenses, any material licensed under their terms
|
||||
and conditions, or any related information. Creative Commons disclaims all
|
||||
liability for damages resulting from their use to the fullest extent possible.
|
||||
|
||||
Using Creative Commons Public Licenses
|
||||
|
||||
Creative Commons public licenses provide a standard set of terms and conditions
|
||||
that creators and other rights holders may use to share original works of
|
||||
authorship and other material subject to copyright and certain other rights
|
||||
specified in the public license below. The following considerations are for
|
||||
informational purposes only, are not exhaustive, and do not form part of our
|
||||
licenses.
|
||||
|
||||
Considerations for licensors: Our public licenses are intended for use by
|
||||
those authorized to give the public permission to use material in ways otherwise
|
||||
restricted by copyright and certain other rights. Our licenses are irrevocable.
|
||||
Licensors should read and understand the terms and conditions of the license
|
||||
they choose before applying it. Licensors should also secure all rights necessary
|
||||
before applying our licenses so that the public can reuse the material as
|
||||
expected. Licensors should clearly mark any material not subject to the license.
|
||||
This includes other CC-licensed material, or material used under an exception
|
||||
or limitation to copyright. More considerations for licensors : wiki.creativecommons.org/Considerations_for_licensors
|
||||
|
||||
Considerations for the public: By using one of our public licenses, a licensor
|
||||
grants the public permission to use the licensed material under specified
|
||||
terms and conditions. If the licensor's permission is not necessary for any
|
||||
reason–for example, because of any applicable exception or limitation to copyright–then
|
||||
that use is not regulated by the license. Our licenses grant only permissions
|
||||
under copyright and certain other rights that a licensor has authority to
|
||||
grant. Use of the licensed material may still be restricted for other reasons,
|
||||
including because others have copyright or other rights in the material. A
|
||||
licensor may make special requests, such as asking that all changes be marked
|
||||
or described. Although not required by our licenses, you are encouraged to
|
||||
respect those requests where reasonable. More considerations for the public
|
||||
: wiki.creativecommons.org/Considerations_for_licensees Creative Commons Attribution
|
||||
4.0 International Public License
|
||||
|
||||
By exercising the Licensed Rights (defined below), You accept and agree to
|
||||
be bound by the terms and conditions of this Creative Commons Attribution
|
||||
4.0 International Public License ("Public License"). To the extent this Public
|
||||
License may be interpreted as a contract, You are granted the Licensed Rights
|
||||
in consideration of Your acceptance of these terms and conditions, and the
|
||||
Licensor grants You such rights in consideration of benefits the Licensor
|
||||
receives from making the Licensed Material available under these terms and
|
||||
conditions.
|
||||
|
||||
Section 1 – Definitions.
|
||||
|
||||
a. Adapted Material means material subject to Copyright and Similar Rights
|
||||
that is derived from or based upon the Licensed Material and in which the
|
||||
Licensed Material is translated, altered, arranged, transformed, or otherwise
|
||||
modified in a manner requiring permission under the Copyright and Similar
|
||||
Rights held by the Licensor. For purposes of this Public License, where the
|
||||
Licensed Material is a musical work, performance, or sound recording, Adapted
|
||||
Material is always produced where the Licensed Material is synched in timed
|
||||
relation with a moving image.
|
||||
|
||||
b. Adapter's License means the license You apply to Your Copyright and Similar
|
||||
Rights in Your contributions to Adapted Material in accordance with the terms
|
||||
and conditions of this Public License.
|
||||
|
||||
c. Copyright and Similar Rights means copyright and/or similar rights closely
|
||||
related to copyright including, without limitation, performance, broadcast,
|
||||
sound recording, and Sui Generis Database Rights, without regard to how the
|
||||
rights are labeled or categorized. For purposes of this Public License, the
|
||||
rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights.
|
||||
|
||||
d. Effective Technological Measures means those measures that, in the absence
|
||||
of proper authority, may not be circumvented under laws fulfilling obligations
|
||||
under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996,
|
||||
and/or similar international agreements.
|
||||
|
||||
e. Exceptions and Limitations means fair use, fair dealing, and/or any other
|
||||
exception or limitation to Copyright and Similar Rights that applies to Your
|
||||
use of the Licensed Material.
|
||||
|
||||
f. Licensed Material means the artistic or literary work, database, or other
|
||||
material to which the Licensor applied this Public License.
|
||||
|
||||
g. Licensed Rights means the rights granted to You subject to the terms and
|
||||
conditions of this Public License, which are limited to all Copyright and
|
||||
Similar Rights that apply to Your use of the Licensed Material and that the
|
||||
Licensor has authority to license.
|
||||
|
||||
h. Licensor means the individual(s) or entity(ies) granting rights under this
|
||||
Public License.
|
||||
|
||||
i. Share means to provide material to the public by any means or process that
|
||||
requires permission under the Licensed Rights, such as reproduction, public
|
||||
display, public performance, distribution, dissemination, communication, or
|
||||
importation, and to make material available to the public including in ways
|
||||
that members of the public may access the material from a place and at a time
|
||||
individually chosen by them.
|
||||
|
||||
j. Sui Generis Database Rights means rights other than copyright resulting
|
||||
from Directive 96/9/EC of the European Parliament and of the Council of 11
|
||||
March 1996 on the legal protection of databases, as amended and/or succeeded,
|
||||
as well as other essentially equivalent rights anywhere in the world.
|
||||
|
||||
k. You means the individual or entity exercising the Licensed Rights under
|
||||
this Public License. Your has a corresponding meaning.
|
||||
|
||||
Section 2 – Scope.
|
||||
|
||||
a. License grant.
|
||||
|
||||
1. Subject to the terms and conditions of this Public License, the Licensor
|
||||
hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive,
|
||||
irrevocable license to exercise the Licensed Rights in the Licensed Material
|
||||
to:
|
||||
|
||||
A. reproduce and Share the Licensed Material, in whole or in part; and
|
||||
|
||||
B. produce, reproduce, and Share Adapted Material.
|
||||
|
||||
2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions
|
||||
and Limitations apply to Your use, this Public License does not apply, and
|
||||
You do not need to comply with its terms and conditions.
|
||||
|
||||
3. Term. The term of this Public License is specified in Section 6(a).
|
||||
|
||||
4. Media and formats; technical modifications allowed. The Licensor authorizes
|
||||
You to exercise the Licensed Rights in all media and formats whether now known
|
||||
or hereafter created, and to make technical modifications necessary to do
|
||||
so. The Licensor waives and/or agrees not to assert any right or authority
|
||||
to forbid You from making technical modifications necessary to exercise the
|
||||
Licensed Rights, including technical modifications necessary to circumvent
|
||||
Effective Technological Measures. For purposes of this Public License, simply
|
||||
making modifications authorized by this Section 2(a)(4) never produces Adapted
|
||||
Material.
|
||||
|
||||
5. Downstream recipients.
|
||||
|
||||
A. Offer from the Licensor – Licensed Material. Every recipient of the Licensed
|
||||
Material automatically receives an offer from the Licensor to exercise the
|
||||
Licensed Rights under the terms and conditions of this Public License.
|
||||
|
||||
B. No downstream restrictions. You may not offer or impose any additional
|
||||
or different terms or conditions on, or apply any Effective Technological
|
||||
Measures to, the Licensed Material if doing so restricts exercise of the Licensed
|
||||
Rights by any recipient of the Licensed Material.
|
||||
|
||||
6. No endorsement. Nothing in this Public License constitutes or may be construed
|
||||
as permission to assert or imply that You are, or that Your use of the Licensed
|
||||
Material is, connected with, or sponsored, endorsed, or granted official status
|
||||
by, the Licensor or others designated to receive attribution as provided in
|
||||
Section 3(a)(1)(A)(i).
|
||||
|
||||
b. Other rights.
|
||||
|
||||
1. Moral rights, such as the right of integrity, are not licensed under this
|
||||
Public License, nor are publicity, privacy, and/or other similar personality
|
||||
rights; however, to the extent possible, the Licensor waives and/or agrees
|
||||
not to assert any such rights held by the Licensor to the limited extent necessary
|
||||
to allow You to exercise the Licensed Rights, but not otherwise.
|
||||
|
||||
2. Patent and trademark rights are not licensed under this Public License.
|
||||
|
||||
3. To the extent possible, the Licensor waives any right to collect royalties
|
||||
from You for the exercise of the Licensed Rights, whether directly or through
|
||||
a collecting society under any voluntary or waivable statutory or compulsory
|
||||
licensing scheme. In all other cases the Licensor expressly reserves any right
|
||||
to collect such royalties.
|
||||
|
||||
Section 3 – License Conditions.
|
||||
|
||||
Your exercise of the Licensed Rights is expressly made subject to the following
|
||||
conditions.
|
||||
|
||||
a. Attribution.
|
||||
|
||||
1. If You Share the Licensed Material (including in modified form), You must:
|
||||
|
||||
A. retain the following if it is supplied by the Licensor with the Licensed
|
||||
Material:
|
||||
|
||||
i. identification of the creator(s) of the Licensed Material and any others
|
||||
designated to receive attribution, in any reasonable manner requested by the
|
||||
Licensor (including by pseudonym if designated);
|
||||
|
||||
ii. a copyright notice;
|
||||
|
||||
iii. a notice that refers to this Public License;
|
||||
|
||||
iv. a notice that refers to the disclaimer of warranties;
|
||||
|
||||
v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable;
|
||||
|
||||
B. indicate if You modified the Licensed Material and retain an indication
|
||||
of any previous modifications; and
|
||||
|
||||
C. indicate the Licensed Material is licensed under this Public License, and
|
||||
include the text of, or the URI or hyperlink to, this Public License.
|
||||
|
||||
2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner
|
||||
based on the medium, means, and context in which You Share the Licensed Material.
|
||||
For example, it may be reasonable to satisfy the conditions by providing a
|
||||
URI or hyperlink to a resource that includes the required information.
|
||||
|
||||
3. If requested by the Licensor, You must remove any of the information required
|
||||
by Section 3(a)(1)(A) to the extent reasonably practicable.
|
||||
|
||||
4. If You Share Adapted Material You produce, the Adapter's License You apply
|
||||
must not prevent recipients of the Adapted Material from complying with this
|
||||
Public License.
|
||||
|
||||
Section 4 – Sui Generis Database Rights.
|
||||
|
||||
Where the Licensed Rights include Sui Generis Database Rights that apply to
|
||||
Your use of the Licensed Material:
|
||||
|
||||
a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract,
|
||||
reuse, reproduce, and Share all or a substantial portion of the contents of
|
||||
the database;
|
||||
|
||||
b. if You include all or a substantial portion of the database contents in
|
||||
a database in which You have Sui Generis Database Rights, then the database
|
||||
in which You have Sui Generis Database Rights (but not its individual contents)
|
||||
is Adapted Material; and
|
||||
|
||||
c. You must comply with the conditions in Section 3(a) if You Share all or
|
||||
a substantial portion of the contents of the database.
|
||||
|
||||
For the avoidance of doubt, this Section 4 supplements and does not replace
|
||||
Your obligations under this Public License where the Licensed Rights include
|
||||
other Copyright and Similar Rights.
|
||||
|
||||
Section 5 – Disclaimer of Warranties and Limitation of Liability.
|
||||
|
||||
a. Unless otherwise separately undertaken by the Licensor, to the extent possible,
|
||||
the Licensor offers the Licensed Material as-is and as-available, and makes
|
||||
no representations or warranties of any kind concerning the Licensed Material,
|
||||
whether express, implied, statutory, or other. This includes, without limitation,
|
||||
warranties of title, merchantability, fitness for a particular purpose, non-infringement,
|
||||
absence of latent or other defects, accuracy, or the presence or absence of
|
||||
errors, whether or not known or discoverable. Where disclaimers of warranties
|
||||
are not allowed in full or in part, this disclaimer may not apply to You.
|
||||
|
||||
b. To the extent possible, in no event will the Licensor be liable to You
|
||||
on any legal theory (including, without limitation, negligence) or otherwise
|
||||
for any direct, special, indirect, incidental, consequential, punitive, exemplary,
|
||||
or other losses, costs, expenses, or damages arising out of this Public License
|
||||
or use of the Licensed Material, even if the Licensor has been advised of
|
||||
the possibility of such losses, costs, expenses, or damages. Where a limitation
|
||||
of liability is not allowed in full or in part, this limitation may not apply
|
||||
to You.
|
||||
|
||||
c. The disclaimer of warranties and limitation of liability provided above
|
||||
shall be interpreted in a manner that, to the extent possible, most closely
|
||||
approximates an absolute disclaimer and waiver of all liability.
|
||||
|
||||
Section 6 – Term and Termination.
|
||||
|
||||
a. This Public License applies for the term of the Copyright and Similar Rights
|
||||
licensed here. However, if You fail to comply with this Public License, then
|
||||
Your rights under this Public License terminate automatically.
|
||||
|
||||
b. Where Your right to use the Licensed Material has terminated under Section
|
||||
6(a), it reinstates:
|
||||
|
||||
1. automatically as of the date the violation is cured, provided it is cured
|
||||
within 30 days of Your discovery of the violation; or
|
||||
|
||||
2. upon express reinstatement by the Licensor.
|
||||
|
||||
c. For the avoidance of doubt, this Section 6(b) does not affect any right
|
||||
the Licensor may have to seek remedies for Your violations of this Public
|
||||
License.
|
||||
|
||||
d. For the avoidance of doubt, the Licensor may also offer the Licensed Material
|
||||
under separate terms or conditions or stop distributing the Licensed Material
|
||||
at any time; however, doing so will not terminate this Public License.
|
||||
|
||||
e. Sections 1, 5, 6, 7, and 8 survive termination of this Public License.
|
||||
|
||||
Section 7 – Other Terms and Conditions.
|
||||
|
||||
a. The Licensor shall not be bound by any additional or different terms or
|
||||
conditions communicated by You unless expressly agreed.
|
||||
|
||||
b. Any arrangements, understandings, or agreements regarding the Licensed
|
||||
Material not stated herein are separate from and independent of the terms
|
||||
and conditions of this Public License.
|
||||
|
||||
Section 8 – Interpretation.
|
||||
|
||||
a. For the avoidance of doubt, this Public License does not, and shall not
|
||||
be interpreted to, reduce, limit, restrict, or impose conditions on any use
|
||||
of the Licensed Material that could lawfully be made without permission under
|
||||
this Public License.
|
||||
|
||||
b. To the extent possible, if any provision of this Public License is deemed
|
||||
unenforceable, it shall be automatically reformed to the minimum extent necessary
|
||||
to make it enforceable. If the provision cannot be reformed, it shall be severed
|
||||
from this Public License without affecting the enforceability of the remaining
|
||||
terms and conditions.
|
||||
|
||||
c. No term or condition of this Public License will be waived and no failure
|
||||
to comply consented to unless expressly agreed to by the Licensor.
|
||||
|
||||
d. Nothing in this Public License constitutes or may be interpreted as a limitation
|
||||
upon, or waiver of, any privileges and immunities that apply to the Licensor
|
||||
or You, including from the legal processes of any jurisdiction or authority.
|
||||
|
||||
Creative Commons is not a party to its public licenses. Notwithstanding, Creative
|
||||
Commons may elect to apply one of its public licenses to material it publishes
|
||||
and in those instances will be considered the "Licensor." The text of the
|
||||
Creative Commons public licenses is dedicated to the public domain under the
|
||||
CC0 Public Domain Dedication. Except for the limited purpose of indicating
|
||||
that material is shared under a Creative Commons public license or as otherwise
|
||||
permitted by the Creative Commons policies published at creativecommons.org/policies,
|
||||
Creative Commons does not authorize the use of the trademark "Creative Commons"
|
||||
or any other trademark or logo of Creative Commons without its prior written
|
||||
consent including, without limitation, in connection with any unauthorized
|
||||
modifications to any of its public licenses or any other arrangements, understandings,
|
||||
or agreements concerning use of licensed material. For the avoidance of doubt,
|
||||
this paragraph does not form part of the public licenses.
|
||||
|
||||
Creative Commons may be contacted at creativecommons.org.
|
||||
19
LICENSES/MIT.txt
Normal file
19
LICENSES/MIT.txt
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
MIT License Copyright (c) <year> <copyright holders>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is furnished
|
||||
to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice (including the next
|
||||
paragraph) shall be included in all copies or substantial portions of the
|
||||
Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
|
||||
OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
|
||||
OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
90
LICENSES/OFL-1.1.txt
Normal file
90
LICENSES/OFL-1.1.txt
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
Copyright (c) <dates>, <Copyright Holder> (<URL|email>),
|
||||
|
||||
with Reserved Font Name <Reserved Font Name>. This Font Software is licensed
|
||||
under the SIL Open Font License, Version 1.1.
|
||||
|
||||
This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL
|
||||
SIL OPEN FONT LICENSE
|
||||
|
||||
Version 1.1 - 26 February 2007
|
||||
|
||||
PREAMBLE
|
||||
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide development
|
||||
of collaborative font projects, to support the font creation efforts of academic
|
||||
and linguistic communities, and to provide a free and open framework in which
|
||||
fonts may be shared and improved in partnership with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and redistributed
|
||||
freely as long as they are not sold by themselves. The fonts, including any
|
||||
derivative works, can be bundled, embedded, redistributed and/or sold with
|
||||
any software provided that any reserved names are not used by derivative works.
|
||||
The fonts and derivatives, however, cannot be released under any other type
|
||||
of license. The requirement for fonts to remain under this license does not
|
||||
apply to any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
|
||||
"Font Software" refers to the set of files released by the Copyright Holder(s)
|
||||
under this license and clearly marked as such. This may include source files,
|
||||
build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the copyright
|
||||
statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software components as
|
||||
distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to, deleting, or
|
||||
substituting — in part or in whole — any of the components of the Original
|
||||
Version, by changing formats or by porting the Font Software to a new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical writer or
|
||||
other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of the Font Software, to use, study, copy, merge, embed, modify, redistribute,
|
||||
and sell modified and unmodified copies of the Font Software, subject to the
|
||||
following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components, in Original
|
||||
or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled, redistributed
|
||||
and/or sold with any software, provided that each copy contains the above
|
||||
copyright notice and this license. These can be included either as stand-alone
|
||||
text files, human-readable headers or in the appropriate machine-readable
|
||||
metadata fields within text or binary files as long as those fields can be
|
||||
easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font Name(s)
|
||||
unless explicit written permission is granted by the corresponding Copyright
|
||||
Holder. This restriction only applies to the primary font name as presented
|
||||
to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software
|
||||
shall not be used to promote, endorse or advertise any Modified Version, except
|
||||
to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s)
|
||||
or with their explicit written permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole, must be
|
||||
distributed entirely under this license, and must not be distributed under
|
||||
any other license. The requirement for fonts to remain under this license
|
||||
does not apply to any document created using the Font Software.
|
||||
|
||||
TERMINATION
|
||||
|
||||
This license becomes null and void if any of the above conditions are not met.
|
||||
|
||||
DISCLAIMER
|
||||
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
|
||||
TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE
|
||||
FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL,
|
||||
INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT
|
||||
SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
20
LICENSES/Unlicense.txt
Normal file
20
LICENSES/Unlicense.txt
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
This is free and unencumbered software released into the public domain.
|
||||
|
||||
Anyone is free to copy, modify, publish, use, compile, sell, or distribute
|
||||
this software, either in source code form or as a compiled binary, for any
|
||||
purpose, commercial or non-commercial, and by any means.
|
||||
|
||||
In jurisdictions that recognize copyright laws, the author or authors of this
|
||||
software dedicate any and all copyright interest in the software to the public
|
||||
domain. We make this dedication for the benefit of the public at large and
|
||||
to the detriment of our heirs and successors. We intend this dedication to
|
||||
be an overt act of relinquishment in perpetuity of all present and future
|
||||
rights to this software under copyright law.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
|
||||
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH
|
||||
THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. For more information,
|
||||
please refer to <https://unlicense.org/>
|
||||
314
Makefile
Normal file
314
Makefile
Normal file
|
|
@ -0,0 +1,314 @@
|
|||
# SPDX-FileCopyrightText: 2014 MicroPython & CircuitPython contributors (https://github.com/adafruit/circuitpython/graphs/contributors)
|
||||
#
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
# Top-level Makefile for documentation builds and miscellaneous tasks.
|
||||
#
|
||||
|
||||
# You can set these variables from the command line.
|
||||
PYTHON = python3
|
||||
SPHINXOPTS =
|
||||
SPHINXBUILD = sphinx-build
|
||||
PAPER =
|
||||
# path to build the generated docs
|
||||
BUILDDIR = _build
|
||||
# path to source files to process
|
||||
SOURCEDIR = .
|
||||
# path to conf.py
|
||||
CONFDIR = .
|
||||
# Run "make FORCE= ..." to avoid rebuilding from scratch (and risk
|
||||
# producing incorrect docs).
|
||||
FORCE = -E
|
||||
VERBOSE = -v
|
||||
|
||||
# path to generated type stubs
|
||||
STUBDIR = circuitpython-stubs
|
||||
# Run "make VALIDATE= stubs" to avoid validating generated stub files
|
||||
VALIDATE = -v
|
||||
# path to pypi source distributions
|
||||
DISTDIR = dist
|
||||
|
||||
# Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the
|
||||
# full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the
|
||||
# executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
|
||||
|
||||
# Internal variables.
|
||||
PAPEROPT_a4 = -D latex_paper_size=a4
|
||||
PAPEROPT_letter = -D latex_paper_size=letter
|
||||
BASEOPTS = -c $(CONFDIR) $(PAPEROPT_$(PAPER)) $(FORCE) $(VERBOSE) $(SPHINXOPTS) $(SOURCEDIR)
|
||||
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(BASEOPTS)
|
||||
# the i18n builder cannot share the environment and doctrees with the others
|
||||
I18NSPHINXOPTS = $(BASEOPTS)
|
||||
|
||||
TRANSLATE_SOURCES = extmod lib main.c ports/atmel-samd ports/cxd56 ports/esp32s2 ports/mimxrt10xx ports/nrf ports/raspberrypi ports/stm py shared-bindings shared-module supervisor
|
||||
# Paths to exclude from TRANSLATE_SOURCES
|
||||
# Each must be preceded by "-path"; if any wildcards, enclose in quotes.
|
||||
# Separate by "-o" (Find's "or" operand)
|
||||
TRANSLATE_SOURCES_EXC = -path "ports/*/build-*" \
|
||||
-o -path "ports/*/build" \
|
||||
-o -path ports/atmel-samd/asf4 \
|
||||
-o -path ports/cxd56/spresense-exported-sdk \
|
||||
-o -path ports/esp32s2/esp-idf \
|
||||
-o -path ports/mimxrt10xx/sdk \
|
||||
-o -path ports/raspberrypi/sdk \
|
||||
-o -path ports/stm/st_driver \
|
||||
-o -path lib/tinyusb \
|
||||
-o -path lib/lwip \
|
||||
|
||||
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext stubs
|
||||
|
||||
help:
|
||||
@echo "Please use \`make <target>' where <target> is one of"
|
||||
@echo " html to make standalone HTML files"
|
||||
@echo " dirhtml to make HTML files named index.html in directories"
|
||||
@echo " singlehtml to make a single large HTML file"
|
||||
@echo " pickle to make pickle files"
|
||||
@echo " json to make JSON files"
|
||||
@echo " htmlhelp to make HTML files and a HTML help project"
|
||||
@echo " qthelp to make HTML files and a qthelp project"
|
||||
@echo " devhelp to make HTML files and a Devhelp project"
|
||||
@echo " epub to make an epub"
|
||||
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
|
||||
@echo " latexpdf to make LaTeX files and run them through pdflatex"
|
||||
@echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
|
||||
@echo " text to make text files"
|
||||
@echo " man to make manual pages"
|
||||
@echo " texinfo to make Texinfo files"
|
||||
@echo " info to make Texinfo files and run them through makeinfo"
|
||||
@echo " gettext to make PO message catalogs"
|
||||
@echo " changes to make an overview of all changed/added/deprecated items"
|
||||
@echo " xml to make Docutils-native XML files"
|
||||
@echo " pseudoxml to make pseudoxml-XML files for display purposes"
|
||||
@echo " linkcheck to check all external links for integrity"
|
||||
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
|
||||
|
||||
clean:
|
||||
rm -rf $(BUILDDIR)/*
|
||||
rm -rf autoapi
|
||||
rm -rf $(STUBDIR) $(DISTDIR) *.egg-info
|
||||
|
||||
html: stubs
|
||||
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
|
||||
@echo
|
||||
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
|
||||
|
||||
dirhtml:
|
||||
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
|
||||
@echo
|
||||
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
|
||||
|
||||
singlehtml:
|
||||
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
|
||||
@echo
|
||||
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
|
||||
|
||||
pickle:
|
||||
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
|
||||
@echo
|
||||
@echo "Build finished; now you can process the pickle files."
|
||||
|
||||
json:
|
||||
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
|
||||
@echo
|
||||
@echo "Build finished; now you can process the JSON files."
|
||||
|
||||
htmlhelp:
|
||||
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
|
||||
@echo
|
||||
@echo "Build finished; now you can run HTML Help Workshop with the" \
|
||||
".hhp project file in $(BUILDDIR)/htmlhelp."
|
||||
|
||||
qthelp:
|
||||
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
|
||||
@echo
|
||||
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
|
||||
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
|
||||
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/MicroPython.qhcp"
|
||||
@echo "To view the help file:"
|
||||
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/MicroPython.qhc"
|
||||
|
||||
devhelp:
|
||||
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
|
||||
@echo
|
||||
@echo "Build finished."
|
||||
@echo "To view the help file:"
|
||||
@echo "# mkdir -p $$HOME/.local/share/devhelp/MicroPython"
|
||||
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/MicroPython"
|
||||
@echo "# devhelp"
|
||||
|
||||
epub:
|
||||
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
|
||||
@echo
|
||||
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
|
||||
|
||||
latex:
|
||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
||||
@echo
|
||||
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
|
||||
@echo "Run \`make' in that directory to run these through (pdf)latex" \
|
||||
"(use \`make latexpdf' here to do that automatically)."
|
||||
|
||||
# seems to be malfunctioning
|
||||
latexpdf:
|
||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
||||
@echo "Running LaTeX files through pdflatex..."
|
||||
$(MAKE) -C $(BUILDDIR)/latex all-pdf
|
||||
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
|
||||
|
||||
# seems to be malfunctioning
|
||||
latexpdfja:
|
||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
||||
@echo "Running LaTeX files through platex and dvipdfmx..."
|
||||
$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
|
||||
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
|
||||
|
||||
# seems to be malfunctioning
|
||||
text:
|
||||
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
|
||||
@echo
|
||||
@echo "Build finished. The text files are in $(BUILDDIR)/text."
|
||||
|
||||
# seems to be malfunctioning
|
||||
man:
|
||||
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
|
||||
@echo
|
||||
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
|
||||
|
||||
texinfo:
|
||||
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
|
||||
@echo
|
||||
@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
|
||||
@echo "Run \`make' in that directory to run these through makeinfo" \
|
||||
"(use \`make info' here to do that automatically)."
|
||||
|
||||
info:
|
||||
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
|
||||
@echo "Running Texinfo files through makeinfo..."
|
||||
make -C $(BUILDDIR)/texinfo info
|
||||
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
|
||||
|
||||
gettext:
|
||||
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
|
||||
@echo
|
||||
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
|
||||
|
||||
changes:
|
||||
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
|
||||
@echo
|
||||
@echo "The overview file is in $(BUILDDIR)/changes."
|
||||
|
||||
linkcheck:
|
||||
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
|
||||
@echo
|
||||
@echo "Link check complete; look for any errors in the above output " \
|
||||
"or in $(BUILDDIR)/linkcheck/output.txt."
|
||||
|
||||
doctest:
|
||||
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
|
||||
@echo "Testing of doctests in the sources finished, look at the " \
|
||||
"results in $(BUILDDIR)/doctest/output.txt."
|
||||
|
||||
xml:
|
||||
$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
|
||||
@echo
|
||||
@echo "Build finished. The XML files are in $(BUILDDIR)/xml."
|
||||
|
||||
pseudoxml:
|
||||
$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
|
||||
@echo
|
||||
@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
|
||||
|
||||
# phony target so we always run
|
||||
.PHONY: all-source
|
||||
all-source:
|
||||
|
||||
locale/circuitpython.pot: all-source
|
||||
find $(TRANSLATE_SOURCES) -type d \( $(TRANSLATE_SOURCES_EXC) \) -prune -o -type f \( -iname "*.c" -o -iname "*.h" \) -print | (LC_ALL=C sort) | xgettext -f- -L C -s --add-location=file --keyword=translate -o - | sed -e '/"POT-Creation-Date: /d' > $@
|
||||
|
||||
# Historically, `make translate` updated the .pot file and ran msgmerge.
|
||||
# However, this was a frequent source of merge conflicts. Weblate can perform
|
||||
# msgmerge, so make translate merely update the translation template file.
|
||||
.PHONY: translate
|
||||
translate: locale/circuitpython.pot
|
||||
|
||||
# Note that normally we rely on weblate to perform msgmerge. This reduces the
|
||||
# chance of a merge conflict between developer changes (that only add and
|
||||
# remove source strings) and weblate changes (that only add and remove
|
||||
# translated strings from po files). However, in case this is legitimately
|
||||
# needed we preserve a rule to do it.
|
||||
.PHONY: msgmerge
|
||||
msgmerge:
|
||||
for po in $(shell ls locale/*.po); do msgmerge -U $$po -s --no-fuzzy-matching --add-location=file locale/circuitpython.pot; done
|
||||
|
||||
merge-translate:
|
||||
git merge HEAD 1>&2 2> /dev/null; test $$? -eq 128
|
||||
rm locale/*~ || true
|
||||
git checkout --theirs -- locale/*
|
||||
make translate
|
||||
|
||||
.PHONY: check-translate
|
||||
check-translate:
|
||||
find $(TRANSLATE_SOURCES) -type d \( $(TRANSLATE_SOURCES_EXC) \) -prune -o -type f \( -iname "*.c" -o -iname "*.h" \) -print | (LC_ALL=C sort) | xgettext -f- -L C -s --add-location=file --keyword=translate -o circuitpython.pot.tmp -p locale
|
||||
$(PYTHON) tools/check_translations.py locale/circuitpython.pot.tmp locale/circuitpython.pot; status=$$?; rm -f locale/circuitpython.pot.tmp; exit $$status
|
||||
|
||||
stubs:
|
||||
@mkdir -p circuitpython-stubs
|
||||
@$(PYTHON) tools/extract_pyi.py shared-bindings/ $(STUBDIR)
|
||||
@$(PYTHON) tools/extract_pyi.py extmod/ulab/code/ $(STUBDIR)/ulab
|
||||
@$(PYTHON) tools/extract_pyi.py ports/atmel-samd/bindings $(STUBDIR)
|
||||
@$(PYTHON) tools/extract_pyi.py ports/raspberrypi/bindings $(STUBDIR)
|
||||
@$(PYTHON) setup.py -q sdist
|
||||
|
||||
.PHONY: check-stubs
|
||||
check-stubs: stubs
|
||||
MYPYPATH=$(STUBDIR) mypy --strict $(STUBDIR)
|
||||
|
||||
update-frozen-libraries:
|
||||
@echo "Updating all frozen libraries to latest tagged version."
|
||||
cd frozen; for library in *; do cd $$library; ../../tools/git-checkout-latest-tag.sh; cd ..; done
|
||||
|
||||
one-of-each: samd21 litex mimxrt10xx nrf stm
|
||||
|
||||
samd21:
|
||||
$(MAKE) -C ports/atmel-samd BOARD=trinket_m0
|
||||
|
||||
samd51:
|
||||
$(MAKE) -C ports/atmel-samd BOARD=feather_m4_express
|
||||
|
||||
esp32s2:
|
||||
$(MAKE) -C ports/esp32s2 BOARD=espressif_saola_1_wroom
|
||||
|
||||
litex:
|
||||
$(MAKE) -C ports/litex BOARD=fomu
|
||||
|
||||
mimxrt10xx:
|
||||
$(MAKE) -C ports/mimxrt10xx BOARD=feather_mimxrt1011
|
||||
|
||||
nrf:
|
||||
$(MAKE) -C ports/nrf BOARD=feather_nrf52840_express
|
||||
|
||||
stm:
|
||||
$(MAKE) -C ports/stm BOARD=feather_stm32f405_express
|
||||
|
||||
clean-one-of-each: clean-samd21 clean-samd51 clean-esp32s2 clean-litex clean-mimxrt10xx clean-nrf clean-stm
|
||||
|
||||
clean-samd21:
|
||||
$(MAKE) -C ports/atmel-samd BOARD=trinket_m0 clean
|
||||
|
||||
clean-samd51:
|
||||
$(MAKE) -C ports/atmel-samd BOARD=feather_m4_express clean
|
||||
|
||||
clean-esp32s2:
|
||||
$(MAKE) -C ports/esp32s2 BOARD=espressif_saola_1_wroom clean
|
||||
|
||||
clean-litex:
|
||||
$(MAKE) -C ports/litex BOARD=fomu clean
|
||||
|
||||
clean-mimxrt10xx:
|
||||
$(MAKE) -C ports/mimxrt10xx BOARD=feather_mimxrt1011 clean
|
||||
|
||||
clean-nrf:
|
||||
$(MAKE) -C ports/nrf BOARD=feather_nrf52840_express clean
|
||||
|
||||
clean-stm:
|
||||
$(MAKE) -C ports/stm BOARD=feather_stm32f405_express clean
|
||||
147
README.md
147
README.md
|
|
@ -1,147 +0,0 @@
|
|||
[](https://github.com/micropython/micropython/actions?query=branch%3Amaster+event%3Apush) [](https://github.com/micropython/micropython/actions?query=branch%3Amaster+event%3Apush) [](https://docs.micropython.org/) [](https://codecov.io/gh/micropython/micropython)
|
||||
|
||||
The MicroPython project
|
||||
=======================
|
||||
<p align="center">
|
||||
<img src="https://raw.githubusercontent.com/micropython/micropython/master/logo/upython-with-micro.jpg" alt="MicroPython Logo"/>
|
||||
</p>
|
||||
|
||||
This is the MicroPython project, which aims to put an implementation
|
||||
of Python 3.x on microcontrollers and small embedded systems.
|
||||
You can find the official website at [micropython.org](http://www.micropython.org).
|
||||
|
||||
WARNING: this project is in beta stage and is subject to changes of the
|
||||
code-base, including project-wide name changes and API changes.
|
||||
|
||||
MicroPython implements the entire Python 3.4 syntax (including exceptions,
|
||||
`with`, `yield from`, etc., and additionally `async`/`await` keywords from
|
||||
Python 3.5 and some select features from later versions). The following core
|
||||
datatypes are provided: `str`(including basic Unicode support), `bytes`,
|
||||
`bytearray`, `tuple`, `list`, `dict`, `set`, `frozenset`, `array.array`,
|
||||
`collections.namedtuple`, classes and instances. Builtin modules include
|
||||
`os`, `sys`, `time`, `re`, and `struct`, etc. Some ports have support for
|
||||
`_thread` module (multithreading), `socket` and `ssl` for networking, and
|
||||
`asyncio`. Note that only a subset of Python 3 functionality is implemented
|
||||
for the data types and modules.
|
||||
|
||||
MicroPython can execute scripts in textual source form (.py files) or from
|
||||
precompiled bytecode (.mpy files), in both cases either from an on-device
|
||||
filesystem or "frozen" into the MicroPython executable.
|
||||
|
||||
MicroPython also provides a set of MicroPython-specific modules to access
|
||||
hardware-specific functionality and peripherals such as GPIO, Timers, ADC,
|
||||
DAC, PWM, SPI, I2C, CAN, Bluetooth, and USB.
|
||||
|
||||
Getting started
|
||||
---------------
|
||||
|
||||
See the [online documentation](https://docs.micropython.org/) for the API
|
||||
reference and information about using MicroPython and information about how
|
||||
it is implemented.
|
||||
|
||||
We use [GitHub Discussions](https://github.com/micropython/micropython/discussions)
|
||||
as our forum, and [Discord](https://discord.gg/RB8HZSAExQ) for chat. These
|
||||
are great places to ask questions and advice from the community or to discuss your
|
||||
MicroPython-based projects.
|
||||
|
||||
For bugs and feature requests, please [raise an issue](https://github.com/micropython/micropython/issues/new/choose)
|
||||
and follow the templates there.
|
||||
|
||||
For information about the [MicroPython pyboard](https://store.micropython.org/pyb-features),
|
||||
the officially supported board from the
|
||||
[original Kickstarter campaign](https://www.kickstarter.com/projects/214379695/micro-python-python-for-microcontrollers),
|
||||
see the [schematics and pinouts](http://github.com/micropython/pyboard) and
|
||||
[documentation](https://docs.micropython.org/en/latest/pyboard/quickref.html).
|
||||
|
||||
Contributing
|
||||
------------
|
||||
|
||||
MicroPython is an open-source project and welcomes contributions. To be
|
||||
productive, please be sure to follow the
|
||||
[Contributors' Guidelines](https://github.com/micropython/micropython/wiki/ContributorGuidelines)
|
||||
and the [Code Conventions](https://github.com/micropython/micropython/blob/master/CODECONVENTIONS.md).
|
||||
Note that MicroPython is licenced under the MIT license, and all contributions
|
||||
should follow this license.
|
||||
|
||||
About this repository
|
||||
---------------------
|
||||
|
||||
This repository contains the following components:
|
||||
- [py/](py/) -- the core Python implementation, including compiler, runtime, and
|
||||
core library.
|
||||
- [mpy-cross/](mpy-cross/) -- the MicroPython cross-compiler which is used to turn scripts
|
||||
into precompiled bytecode.
|
||||
- [ports/](ports/) -- platform-specific code for the various ports and architectures that MicroPython runs on.
|
||||
- [lib/](lib/) -- submodules for external dependencies.
|
||||
- [tests/](tests/) -- test framework and test scripts.
|
||||
- [docs/](docs/) -- user documentation in Sphinx reStructuredText format. This is used to generate the [online documentation](http://docs.micropython.org).
|
||||
- [extmod/](extmod/) -- additional (non-core) modules implemented in C.
|
||||
- [tools/](tools/) -- various tools, including the pyboard.py module.
|
||||
- [examples/](examples/) -- a few example Python scripts.
|
||||
|
||||
"make" is used to build the components, or "gmake" on BSD-based systems.
|
||||
You will also need bash, gcc, and Python 3.3+ available as the command `python3`
|
||||
(if your system only has Python 2.7 then invoke make with the additional option
|
||||
`PYTHON=python2`). Some ports (rp2 and esp32) additionally use CMake.
|
||||
|
||||
Supported platforms & architectures
|
||||
-----------------------------------
|
||||
|
||||
MicroPython runs on a wide range of microcontrollers, as well as on Unix-like
|
||||
(including Linux, BSD, macOS, WSL) and Windows systems.
|
||||
|
||||
Microcontroller targets can be as small as 256kiB flash + 16kiB RAM, although
|
||||
devices with at least 512kiB flash + 128kiB RAM allow a much more
|
||||
full-featured experience.
|
||||
|
||||
The [Unix](ports/unix) and [Windows](ports/windows) ports allow both
|
||||
development and testing of MicroPython itself, as well as providing
|
||||
lightweight alternative to CPython on these platforms (in particular on
|
||||
embedded Linux systems).
|
||||
|
||||
The ["minimal"](ports/minimal) port provides an example of a very basic
|
||||
MicroPython port and can be compiled as both a standalone Linux binary as
|
||||
well as for ARM Cortex M4. Start with this if you want to port MicroPython to
|
||||
another microcontroller. Additionally the ["bare-arm"](ports/bare-arm) port
|
||||
is an example of the absolute minimum configuration, and is used to keep
|
||||
track of the code size of the core runtime and VM.
|
||||
|
||||
In addition, the following ports are provided in this repository:
|
||||
- [cc3200](ports/cc3200) -- Texas Instruments CC3200 (including PyCom WiPy).
|
||||
- [esp32](ports/esp32) -- Espressif ESP32 SoC (including ESP32S2, ESP32S3, ESP32C3, ESP32C6).
|
||||
- [esp8266](ports/esp8266) -- Espressif ESP8266 SoC.
|
||||
- [mimxrt](ports/mimxrt) -- NXP m.iMX RT (including Teensy 4.x).
|
||||
- [nrf](ports/nrf) -- Nordic Semiconductor nRF51 and nRF52.
|
||||
- [pic16bit](ports/pic16bit) -- Microchip PIC 16-bit.
|
||||
- [powerpc](ports/powerpc) -- IBM PowerPC (including Microwatt)
|
||||
- [qemu](ports/qemu) -- QEMU-based emulated target (for testing)
|
||||
- [renesas-ra](ports/renesas-ra) -- Renesas RA family.
|
||||
- [rp2](ports/rp2) -- Raspberry Pi RP2040 (including Pico and Pico W).
|
||||
- [samd](ports/samd) -- Microchip (formerly Atmel) SAMD21 and SAMD51.
|
||||
- [stm32](ports/stm32) -- STMicroelectronics STM32 family (including F0, F4, F7, G0, G4, H7, L0, L4, WB)
|
||||
- [webassembly](ports/webassembly) -- Emscripten port targeting browsers and NodeJS.
|
||||
- [zephyr](ports/zephyr) -- Zephyr RTOS.
|
||||
|
||||
The MicroPython cross-compiler, mpy-cross
|
||||
-----------------------------------------
|
||||
|
||||
Most ports require the [MicroPython cross-compiler](mpy-cross) to be built
|
||||
first. This program, called mpy-cross, is used to pre-compile Python scripts
|
||||
to .mpy files which can then be included (frozen) into the
|
||||
firmware/executable for a port. To build mpy-cross use:
|
||||
|
||||
$ cd mpy-cross
|
||||
$ make
|
||||
|
||||
External dependencies
|
||||
---------------------
|
||||
|
||||
The core MicroPython VM and runtime has no external dependencies, but a given
|
||||
port might depend on third-party drivers or vendor HALs. This repository
|
||||
includes [several submodules](lib/) linking to these external dependencies.
|
||||
Before compiling a given port, use
|
||||
|
||||
$ cd ports/name
|
||||
$ make submodules
|
||||
|
||||
to ensure that all required submodules are initialised.
|
||||
237
README.rst
Normal file
237
README.rst
Normal file
|
|
@ -0,0 +1,237 @@
|
|||
CircuitPython
|
||||
=============
|
||||
|
||||
.. image:: https://s3.amazonaws.com/adafruit-circuit-python/CircuitPython_Repo_header_logo.png
|
||||
|
||||
|Build Status| |Doc Status| |License| |Discord| |Weblate|
|
||||
|
||||
`circuitpython.org <https://circuitpython.org>`__ \| `Get CircuitPython <#get-circuitpython>`__ \|
|
||||
`Documentation <#documentation>`__ \| `Contributing <#contributing>`__ \|
|
||||
`Branding <#branding>`__ \| `Differences from Micropython <#differences-from-micropython>`__ \|
|
||||
`Project Structure <#project-structure>`__
|
||||
|
||||
**CircuitPython** is a *beginner friendly*, open source version of Python for tiny, inexpensive
|
||||
computers called microcontrollers. Microcontrollers are the brains of many electronics including a
|
||||
wide variety of development boards used to build hobby projects and prototypes. CircuitPython in
|
||||
electronics is one of the best ways to learn to code because it connects code to reality. Simply
|
||||
install CircuitPython on a supported board via drag and drop and then edit a ``code.py`` file on
|
||||
the CIRCUITPY drive. The code will automatically reload. No software installs are needed besides a
|
||||
text editor (we recommend `Mu <https://codewith.mu/>`_ for beginners.)
|
||||
|
||||
CircuitPython features unified Python core APIs and a growing list of 150+ device libraries and
|
||||
drivers that work with it. These libraries also work on single board computers with regular
|
||||
Python via the `Adafruit Blinka Library <https://github.com/adafruit/Adafruit_Blinka>`_.
|
||||
|
||||
CircuitPython is based on `MicroPython <https://micropython.org>`_. See
|
||||
`below <#differences-from-micropython>`_ for differences. CircuitPython development is sponsored by
|
||||
`Adafruit <https://adafruit.com>`_ and is available on their educational development boards. Please
|
||||
support both MicroPython and Adafruit.
|
||||
|
||||
Get CircuitPython
|
||||
------------------
|
||||
|
||||
Official binaries for all supported boards are available through
|
||||
`circuitpython.org/downloads <https://circuitpython.org/downloads>`_. The site includes stable, unstable and
|
||||
continuous builds. Full release notes and assets are available through
|
||||
`GitHub releases <https://github.com/adafruit/circuitpython/releases>`_ as well.
|
||||
|
||||
Documentation
|
||||
-------------
|
||||
|
||||
Guides and videos are available through the `Adafruit Learning
|
||||
System <https://learn.adafruit.com/>`__ under the `CircuitPython
|
||||
category <https://learn.adafruit.com/category/circuitpython>`__. An API
|
||||
reference is also available on `Read the Docs
|
||||
<http://circuitpython.readthedocs.io/en/latest/?>`__. A collection of awesome
|
||||
resources can be found at `Awesome CircuitPython <https://github.com/adafruit/awesome-circuitpython>`__.
|
||||
|
||||
Specifically useful documentation when starting out:
|
||||
|
||||
- `Welcome to CircuitPython <https://learn.adafruit.com/welcome-to-circuitpython>`__
|
||||
- `CircuitPython Essentials <https://learn.adafruit.com/circuitpython-essentials>`__
|
||||
- `Example Code <https://github.com/adafruit/Adafruit_Learning_System_Guides/tree/master/CircuitPython_Essentials>`__
|
||||
|
||||
Code Search
|
||||
------------
|
||||
GitHub doesn't currently support code search on forks. Therefore, CircuitPython doesn't have code search through GitHub because it is a fork of MicroPython. Luckily, `SourceGraph <https://sourcegraph.com/github.com/adafruit/circuitpython>`_ has free code search for public repos like CircuitPython. So, visit `sourcegraph.com/github.com/adafruit/circuitpython <https://sourcegraph.com/github.com/adafruit/circuitpython>`_ to search the CircuitPython codebase online.
|
||||
|
||||
Contributing
|
||||
------------
|
||||
|
||||
See
|
||||
`CONTRIBUTING.md <https://github.com/adafruit/circuitpython/blob/main/CONTRIBUTING.md>`__
|
||||
for full guidelines but please be aware that by contributing to this
|
||||
project you are agreeing to the `Code of
|
||||
Conduct <https://github.com/adafruit/circuitpython/blob/main/CODE_OF_CONDUCT.md>`__.
|
||||
Contributors who follow the `Code of
|
||||
Conduct <https://github.com/adafruit/circuitpython/blob/main/CODE_OF_CONDUCT.md>`__
|
||||
are welcome to submit pull requests and they will be promptly reviewed
|
||||
by project admins. Please join the
|
||||
`Discord <https://adafru.it/discord>`__ too.
|
||||
|
||||
Branding
|
||||
------------
|
||||
|
||||
While we are happy to see CircuitPython forked and modified, we'd appreciate it if forked releases
|
||||
not use the name "CircuitPython" or the Blinka logo. "CircuitPython" means something special to
|
||||
us and those who learn about it. As a result, we'd like to make sure products referring to it meet a
|
||||
common set of requirements.
|
||||
|
||||
If you'd like to use the term "CircuitPython" and Blinka for your product here is what we ask:
|
||||
|
||||
* Your product is supported by the primary
|
||||
`"adafruit/circuitpython" <https://github.com/adafruit/circuitpython>`_ repo. This way we can
|
||||
update any custom code as we update the CircuitPython internals.
|
||||
* Your product is listed on `circuitpython.org <https://circuitpython.org>`__ (source
|
||||
`here <https://github.com/adafruit/circuitpython-org/>`_). This is to ensure that a user of your
|
||||
product can always download the latest version of CircuitPython from the standard place.
|
||||
* Your product has a user accessible USB plug which appears as a CIRCUITPY drive when plugged in.
|
||||
|
||||
If you choose not to meet these requirements, then we ask you call your version of CircuitPython
|
||||
something else (for example, SuperDuperPython) and not use the Blinka logo. You can say it is
|
||||
"CircuitPython-compatible" if most CircuitPython drivers will work with it.
|
||||
|
||||
--------------
|
||||
|
||||
Differences from `MicroPython <https://github.com/micropython/micropython>`__
|
||||
-----------------------------------------------------------------------------
|
||||
|
||||
CircuitPython:
|
||||
|
||||
- Supports native USB on all boards, allowing file editing without special tools.
|
||||
- Floats (aka decimals) are enabled for all builds.
|
||||
- Error messages are translated into 10+ languages.
|
||||
- Does not support concurrency within Python (including interrupts and threading). Some concurrency
|
||||
is achieved with native modules for tasks that require it such as audio file playback.
|
||||
|
||||
Behavior
|
||||
~~~~~~~~
|
||||
|
||||
- The order that files are run and the state that is shared between
|
||||
them. CircuitPython's goal is to clarify the role of each file and
|
||||
make each file independent from each other.
|
||||
- ``boot.py`` (or ``settings.py``) runs only once on start up before
|
||||
USB is initialized. This lays the ground work for configuring USB at
|
||||
startup rather than it being fixed. Since serial is not available,
|
||||
output is written to ``boot_out.txt``.
|
||||
- ``code.py`` (or ``main.py``) is run after every reload until it
|
||||
finishes or is interrupted. After it is done running, the vm and
|
||||
hardware is reinitialized. **This means you cannot read state from**
|
||||
``code.py`` **in the REPL anymore, as the REPL is a fresh vm.** CircuitPython's goal for this
|
||||
change includes reducing confusion about pins and memory being used.
|
||||
- After the main code is finished the REPL can be entered by pressing any key.
|
||||
- Autoreload state will be maintained across reload.
|
||||
- Adds a safe mode that does not run user code after a hard crash or
|
||||
brown out. The hope is that this will make it easier to fix code that
|
||||
causes nasty crashes by making it available through mass storage
|
||||
after the crash. A reset (the button) is needed after it's fixed to
|
||||
get back into normal mode.
|
||||
- RGB status LED indicating CircuitPython state, and errors through a sequence of colored flashes.
|
||||
- Re-runs ``code.py`` or other main file after file system writes over USB mass storage. (Disable with
|
||||
``supervisor.disable_autoreload()``)
|
||||
- Autoreload is disabled while the REPL is active.
|
||||
- Main is one of these: ``code.txt``, ``code.py``, ``main.py``,
|
||||
``main.txt``
|
||||
- Boot is one of these: ``settings.txt``, ``settings.py``, ``boot.py``,
|
||||
``boot.txt``
|
||||
|
||||
API
|
||||
~~~
|
||||
|
||||
- Unified hardware APIs. Documented on
|
||||
`ReadTheDocs <https://circuitpython.readthedocs.io/en/latest/shared-bindings/index.html>`_.
|
||||
- API docs are rST within the C files in ``shared-bindings``.
|
||||
- No ``machine`` API.
|
||||
|
||||
Modules
|
||||
~~~~~~~
|
||||
|
||||
- No module aliasing. (``uos`` and ``utime`` are not available as
|
||||
``os`` and ``time`` respectively.) Instead ``os``, ``time``, and
|
||||
``random`` are CPython compatible.
|
||||
- New ``storage`` module which manages file system mounts.
|
||||
(Functionality from ``uos`` in MicroPython.)
|
||||
- Modules with a CPython counterpart, such as ``time``, ``os`` and
|
||||
``random``, are strict
|
||||
`subsets <https://circuitpython.readthedocs.io/en/latest/shared-bindings/time/__init__.html>`__
|
||||
of their `CPython
|
||||
version <https://docs.python.org/3.4/library/time.html?highlight=time#module-time>`__.
|
||||
Therefore, code from CircuitPython is runnable on CPython but not
|
||||
necessarily the reverse.
|
||||
- tick count is available as
|
||||
`time.monotonic() <https://circuitpython.readthedocs.io/en/latest/shared-bindings/time/__init__.html#time.monotonic>`__
|
||||
|
||||
--------------
|
||||
|
||||
Project Structure
|
||||
-----------------
|
||||
|
||||
Here is an overview of the top-level source code directories.
|
||||
|
||||
Core
|
||||
~~~~
|
||||
|
||||
The core code of
|
||||
`MicroPython <https://github.com/micropython/micropython>`__ is shared
|
||||
amongst ports including CircuitPython:
|
||||
|
||||
- ``docs`` High level user documentation in Sphinx reStructuredText
|
||||
format.
|
||||
- ``drivers`` External device drivers written in Python.
|
||||
- ``examples`` A few example Python scripts.
|
||||
- ``extmod`` Shared C code used in multiple ports' modules.
|
||||
- ``lib`` Shared core C code including externally developed libraries
|
||||
such as FATFS.
|
||||
- ``logo`` The CircuitPython logo.
|
||||
- ``mpy-cross`` A cross compiler that converts Python files to byte
|
||||
code prior to being run in MicroPython. Useful for reducing library
|
||||
size.
|
||||
- ``py`` Core Python implementation, including compiler, runtime, and
|
||||
core library.
|
||||
- ``shared-bindings`` Shared definition of Python modules, their docs
|
||||
and backing C APIs. Ports must implement the C API to support the
|
||||
corresponding module.
|
||||
- ``shared-module`` Shared implementation of Python modules that may be
|
||||
based on ``common-hal``.
|
||||
- ``tests`` Test framework and test scripts.
|
||||
- ``tools`` Various tools, including the pyboard.py module.
|
||||
|
||||
Ports
|
||||
~~~~~
|
||||
|
||||
Ports include the code unique to a microcontroller line and also
|
||||
variations based on the board.
|
||||
|
||||
================ ============================================================
|
||||
Supported Support status
|
||||
================ ============================================================
|
||||
atmel-samd ``SAMD21`` stable | ``SAMD51`` stable
|
||||
cxd56 stable
|
||||
esp32s2 beta
|
||||
litex alpha
|
||||
mimxrt10xx alpha
|
||||
nrf stable
|
||||
raspberrypi beta
|
||||
stm ``F4`` stable | ``others`` beta
|
||||
unix alpha
|
||||
================ ============================================================
|
||||
|
||||
- ``stable`` Highly unlikely to have bugs or missing functionality.
|
||||
- ``beta`` Being actively improved but may be missing functionality and have bugs.
|
||||
- ``alpha`` Will have bugs and missing functionality.
|
||||
|
||||
The remaining port directories not listed above are in the repo to maintain compatibility with the
|
||||
`MicroPython <https://github.com/micropython/micropython>`__ parent project.
|
||||
|
||||
`Back to Top <#circuitpython>`__
|
||||
|
||||
.. |Build Status| image:: https://github.com/adafruit/circuitpython/workflows/Build%20CI/badge.svg
|
||||
:target: https://github.com/adafruit/circuitpython/actions?query=branch%3Amain
|
||||
.. |Doc Status| image:: https://readthedocs.org/projects/circuitpython/badge/?version=latest
|
||||
:target: http://circuitpython.readthedocs.io/
|
||||
.. |Discord| image:: https://img.shields.io/discord/327254708534116352.svg
|
||||
:target: https://adafru.it/discord
|
||||
.. |License| image:: https://img.shields.io/badge/License-MIT-brightgreen.svg
|
||||
:target: https://choosealicense.com/licenses/mit/
|
||||
.. |Weblate| image:: https://hosted.weblate.org/widgets/circuitpython/-/svg-badge.svg
|
||||
:target: https://hosted.weblate.org/engage/circuitpython/?utm_source=widget
|
||||
94
WEBUSB_README.md
Normal file
94
WEBUSB_README.md
Normal file
|
|
@ -0,0 +1,94 @@
|
|||
<!--
|
||||
SPDX-FileCopyrightText: 2014 MicroPython & CircuitPython contributors (https://github.com/adafruit/circuitpython/graphs/contributors)
|
||||
|
||||
SPDX-License-Identifier: MIT
|
||||
-->
|
||||
|
||||
# WebUSB Serial Support
|
||||
|
||||
To date, this has only been tested on one port (esp32s2), on one board (espressif_kaluga_1).
|
||||
|
||||
## What it does
|
||||
|
||||
If you have ever used CircuitPython on a platform with a graphical LCD display, you have probably
|
||||
already seen multiple "consoles" in use (although the LCD console is "output only").
|
||||
|
||||
New compile-time option CIRCUITPY_USB_VENDOR enables an additional "console" that can be used in
|
||||
parallel with the original (CDC) serial console.
|
||||
|
||||
Web pages that support the WebUSB standard can connect to the "vendor" interface and activate
|
||||
this WebUSB serial console at any time.
|
||||
|
||||
You can type into either console, and CircuitPython output is sent to all active consoles.
|
||||
|
||||
One example of a web page you can use to test drive this feature can be found at:
|
||||
|
||||
https://adafruit.github.io/Adafruit_TinyUSB_Arduino/examples/webusb-serial/index.html
|
||||
|
||||
## How to enable
|
||||
|
||||
Update your platform's mpconfigboard.mk file to enable and disable specific types of USB interfaces.
|
||||
|
||||
CIRCUITPY_USB_HID = xxx
|
||||
CIRCUITPY_USB_MIDI = xxx
|
||||
CIRCUITPY_USB_VENDOR = xxx
|
||||
|
||||
On at least some of the hardware platforms, the maximum number of USB endpoints is fixed.
|
||||
For example, on the ESP32S2, you must pick only one of the above 3 interfaces to be enabled.
|
||||
|
||||
Original espressif_kaluga_1 mpconfigboard.mk settings:
|
||||
|
||||
CIRCUITPY_USB_HID = 1
|
||||
CIRCUITPY_USB_MIDI = 0
|
||||
CIRCUITPY_USB_VENDOR = 0
|
||||
|
||||
Settings to enable WebUSB instead:
|
||||
|
||||
CIRCUITPY_USB_HID = 0
|
||||
CIRCUITPY_USB_MIDI = 0
|
||||
CIRCUITPY_USB_VENDOR = 1
|
||||
|
||||
Notice that to enable VENDOR on ESP32-S2, we had to give up HID. There may be platforms that can have both, or even all three.
|
||||
|
||||
## Implementation Notes
|
||||
|
||||
CircuitPython uses the tinyusb library.
|
||||
|
||||
The tinyusb library already has support for WebUSB serial.
|
||||
The tinyusb examples already include a "WebUSB serial" example.
|
||||
|
||||
Sidenote - The use of the term "vendor" instead of "WebUSB" was done to match tinyusb.
|
||||
|
||||
Basically, this feature was ported into CircuitPython by pulling code snippets out of the
|
||||
tinyusb example, and putting them where they best belonged in the CircuitPython codebase.
|
||||
|
||||
There was one complication:
|
||||
|
||||
tinyusb uses C preprocessor macros to define things like USB descriptors.
|
||||
|
||||
CircuitPython uses a Python program (tools/gen_usb_descriptor.py) to create USB descriptors (etc.)
|
||||
using "helper objects" from another repo (adafruit_usb_descriptor). This means some of the example
|
||||
code had to be adapted to the new programing model, and gen_usb_descriptor gained new command-line
|
||||
options to control the generated code.
|
||||
|
||||
The generated files go into the "build" directory, look for autogen_usb_descriptor.c and
|
||||
genhdr/autogen_usb_descriptor.h.
|
||||
|
||||
|
||||
Also worth pointing out - the re-use of the CDC connect/disconnect mechanism is not actually part
|
||||
of the WebUSB standard, it's more of "common idiom". We make use of it here because we need to know
|
||||
when we should be paying attention to the WebUSB serial interface, and when we should ignore it..
|
||||
|
||||
## Possible future work areas
|
||||
|
||||
The current code uses the existing Python infrastructure to create the Interface descriptor, but
|
||||
simply outputs the code snippets from the original tinyusb demo code to create the WEBUSB_URL,
|
||||
BOS, and MS_OS_20 descriptors. I suppose additional work could be done to add these to the
|
||||
adafruit_usb_descriptor project, and then gen_usb_descriptor.py could be modified to make use
|
||||
of them.
|
||||
|
||||
Program gen_usb_descriptor.py creates objects for most interface types, regardless of whether or
|
||||
not they are actually enabled. This increases the size of a generated string table. I made the
|
||||
new vendor-interface-related code not do this (because some of the ARM platforms would no longer
|
||||
build), but I did not go back and do this for the other interface types (CDC, MIDI, HID, etc.)
|
||||
Some FLASH savings are probably possible if this is done.
|
||||
496
conf.py
Normal file
496
conf.py
Normal file
|
|
@ -0,0 +1,496 @@
|
|||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# MicroPython documentation build configuration file, created by
|
||||
# sphinx-quickstart on Sun Sep 21 11:42:03 2014.
|
||||
#
|
||||
# This file is execfile()d with the current directory set to its
|
||||
# containing dir.
|
||||
#
|
||||
# Note that not all possible configuration values are present in this
|
||||
# autogenerated file.
|
||||
#
|
||||
# All configuration values have a default; values that are commented out
|
||||
# serve to show the default.
|
||||
|
||||
# SPDX-FileCopyrightText: 2014 MicroPython & CircuitPython contributors (https://github.com/adafruit/circuitpython/graphs/contributors)
|
||||
#
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
import logging
|
||||
import os
|
||||
import re
|
||||
import subprocess
|
||||
import sys
|
||||
import urllib.parse
|
||||
import time
|
||||
|
||||
import recommonmark
|
||||
from sphinx.transforms import SphinxTransform
|
||||
from docutils import nodes
|
||||
from sphinx import addnodes
|
||||
|
||||
# If extensions (or modules to document with autodoc) are in another directory,
|
||||
# add these directories to sys.path here. If the directory is relative to the
|
||||
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
||||
sys.path.insert(0, os.path.abspath('docs'))
|
||||
sys.path.insert(0, os.path.abspath('.'))
|
||||
|
||||
import shared_bindings_matrix
|
||||
|
||||
master_doc = 'docs/index'
|
||||
|
||||
# Grab the JSON values to use while building the module support matrix
|
||||
# in 'shared-bindings/index.rst'
|
||||
|
||||
# The stubs must be built before we calculate the shared bindings matrix
|
||||
subprocess.check_output(["make", "stubs"])
|
||||
|
||||
#modules_support_matrix = shared_bindings_matrix.support_matrix_excluded_boards()
|
||||
modules_support_matrix = shared_bindings_matrix.support_matrix_by_board()
|
||||
|
||||
html_context = {
|
||||
'support_matrix': modules_support_matrix
|
||||
}
|
||||
|
||||
# -- General configuration ------------------------------------------------
|
||||
|
||||
# If your documentation needs a minimal Sphinx version, state it here.
|
||||
needs_sphinx = '1.3'
|
||||
|
||||
# Add any Sphinx extension module names here, as strings. They can be
|
||||
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
||||
# ones.
|
||||
extensions = [
|
||||
'sphinx.ext.autodoc',
|
||||
'sphinx.ext.doctest',
|
||||
'sphinxcontrib.rsvgconverter',
|
||||
'sphinx.ext.intersphinx',
|
||||
'sphinx.ext.todo',
|
||||
'sphinx.ext.coverage',
|
||||
'rstjinja',
|
||||
'recommonmark',
|
||||
]
|
||||
|
||||
# Add any paths that contain templates here, relative to this directory.
|
||||
templates_path = ['templates']
|
||||
|
||||
# The suffix of source filenames.
|
||||
source_suffix = {
|
||||
'.rst': 'restructuredtext',
|
||||
'.md': 'markdown',
|
||||
}
|
||||
|
||||
extensions.append('autoapi.extension')
|
||||
|
||||
autoapi_type = 'python'
|
||||
# Uncomment this if debugging autoapi
|
||||
autoapi_keep_files = True
|
||||
autoapi_dirs = [os.path.join('circuitpython-stubs', x) for x in os.listdir('circuitpython-stubs')]
|
||||
autoapi_add_toctree_entry = False
|
||||
autoapi_options = ['members', 'undoc-members', 'private-members', 'show-inheritance', 'special-members', 'show-module-summary']
|
||||
autoapi_template_dir = 'docs/autoapi/templates'
|
||||
autoapi_python_class_content = "both"
|
||||
autoapi_python_use_implicit_namespaces = True
|
||||
autoapi_root = "shared-bindings"
|
||||
|
||||
redirects_file = 'docs/redirects.txt'
|
||||
|
||||
# The encoding of source files.
|
||||
#source_encoding = 'utf-8-sig'
|
||||
|
||||
# The master toctree document.
|
||||
#master_doc = 'index'
|
||||
|
||||
# Get current date (execution) for copyright year
|
||||
current_date = time.localtime()
|
||||
|
||||
# General information about the project.
|
||||
project = 'Adafruit CircuitPython'
|
||||
copyright = f'2014-{current_date.tm_year}, MicroPython & CircuitPython contributors (https://github.com/adafruit/circuitpython/graphs/contributors)'
|
||||
|
||||
# These are overwritten on ReadTheDocs.
|
||||
# The version info for the project you're documenting, acts as replacement for
|
||||
# |version| and |release|, also used in various other places throughout the
|
||||
# built documents.
|
||||
#
|
||||
# We don't follow "The short X.Y version" vs "The full version, including alpha/beta/rc tags"
|
||||
# breakdown, so use the same version identifier for both to avoid confusion.
|
||||
|
||||
final_version = ""
|
||||
git_describe = subprocess.run(
|
||||
["git", "describe", "--dirty", "--tags"],
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.STDOUT,
|
||||
encoding="utf-8"
|
||||
)
|
||||
if git_describe.returncode == 0:
|
||||
git_version = re.search(
|
||||
r"^\d(?:\.\d){0,2}(?:\-(?:alpha|beta|rc)\.\d+){0,1}",
|
||||
str(git_describe.stdout)
|
||||
)
|
||||
if git_version:
|
||||
final_version = git_version[0]
|
||||
else:
|
||||
print("Failed to retrieve git version:", git_describe.stdout)
|
||||
|
||||
version = release = final_version
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
#language = None
|
||||
|
||||
# There are two options for replacing |today|: either, you set today to some
|
||||
# non-false value, then it is used:
|
||||
#today = ''
|
||||
# Else, today_fmt is used as the format for a strftime call.
|
||||
#today_fmt = '%B %d, %Y'
|
||||
|
||||
# List of patterns, relative to source directory, that match files and
|
||||
# directories to ignore when looking for source files.
|
||||
exclude_patterns = ["**/build*",
|
||||
".git",
|
||||
".github",
|
||||
".env",
|
||||
".venv",
|
||||
".direnv",
|
||||
"data",
|
||||
"docs/autoapi",
|
||||
"docs/README.md",
|
||||
"drivers",
|
||||
"examples",
|
||||
"extmod",
|
||||
"frozen",
|
||||
"lib",
|
||||
"main.c",
|
||||
"mpy-cross",
|
||||
"ports/*/*.c",
|
||||
"ports/*/*.h",
|
||||
"ports/*/boards",
|
||||
"ports/*/common-hal",
|
||||
"ports/*/supervisor",
|
||||
"ports/atmel-samd/asf4",
|
||||
"ports/atmel-samd/asf4_conf",
|
||||
"ports/atmel-samd/external_flash",
|
||||
"ports/atmel-samd/freetouch",
|
||||
"ports/atmel-samd/peripherals",
|
||||
"ports/atmel-samd/QTouch",
|
||||
"ports/atmel-samd/tools",
|
||||
"ports/cxd56/mkspk",
|
||||
"ports/cxd56/spresense-exported-sdk",
|
||||
"ports/esp32s2/certificates",
|
||||
"ports/esp32s2/esp-idf",
|
||||
"ports/esp32s2/.idf_tools",
|
||||
"ports/esp32s2/peripherals",
|
||||
"ports/litex/hw",
|
||||
"ports/minimal",
|
||||
"ports/mimxrt10xx/peripherals",
|
||||
"ports/mimxrt10xx/sdk",
|
||||
"ports/nrf/device",
|
||||
"ports/nrf/bluetooth",
|
||||
"ports/nrf/modules",
|
||||
"ports/nrf/nrfx",
|
||||
"ports/nrf/peripherals",
|
||||
"ports/nrf/usb",
|
||||
"ports/raspberrypi/sdk",
|
||||
"ports/stm/st_driver",
|
||||
"ports/stm/packages",
|
||||
"ports/stm/peripherals",
|
||||
"ports/stm/ref",
|
||||
"ports/unix",
|
||||
"py",
|
||||
"shared-bindings/util.*",
|
||||
"shared-module",
|
||||
"supervisor",
|
||||
"tests",
|
||||
"tools"]
|
||||
|
||||
# The reST default role (used for this markup: `text`) to use for all
|
||||
# documents.
|
||||
default_role = 'any'
|
||||
|
||||
# If true, '()' will be appended to :func: etc. cross-reference text.
|
||||
#add_function_parentheses = True
|
||||
|
||||
# If true, the current module name will be prepended to all description
|
||||
# unit titles (such as .. function::).
|
||||
#add_module_names = True
|
||||
|
||||
# If true, sectionauthor and moduleauthor directives will be shown in the
|
||||
# output. They are ignored by default.
|
||||
#show_authors = False
|
||||
|
||||
# The name of the Pygments (syntax highlighting) style to use.
|
||||
pygments_style = 'sphinx'
|
||||
|
||||
# A list of ignored prefixes for module index sorting.
|
||||
#modindex_common_prefix = []
|
||||
|
||||
# If true, keep warnings as "system message" paragraphs in the built documents.
|
||||
#keep_warnings = False
|
||||
|
||||
# Global include files. Sphinx docs suggest using rst_epilog in preference
|
||||
# of rst_prolog, so we follow. Absolute paths below mean "from the base
|
||||
# of the doctree".
|
||||
rst_epilog = """
|
||||
.. include:: /docs/templates/replace.inc
|
||||
"""
|
||||
|
||||
# -- Options for HTML output ----------------------------------------------
|
||||
|
||||
# on_rtd is whether we are on readthedocs.org
|
||||
on_rtd = os.environ.get('READTHEDOCS', None) == 'True'
|
||||
|
||||
if not on_rtd: # only import and set the theme if we're building docs locally
|
||||
try:
|
||||
import sphinx_rtd_theme
|
||||
html_theme = 'sphinx_rtd_theme'
|
||||
html_theme_path = [sphinx_rtd_theme.get_html_theme_path(), '.']
|
||||
except:
|
||||
html_theme = 'default'
|
||||
html_theme_path = ['.']
|
||||
else:
|
||||
html_theme_path = ['.']
|
||||
|
||||
# Theme options are theme-specific and customize the look and feel of a theme
|
||||
# further. For a list of options available for each theme, see the
|
||||
# documentation.
|
||||
#html_theme_options = {}
|
||||
|
||||
# Add any paths that contain custom themes here, relative to this directory.
|
||||
# html_theme_path = ['.']
|
||||
|
||||
# The name for this set of Sphinx documents. If None, it defaults to
|
||||
# "<project> v<release> documentation".
|
||||
#html_title = None
|
||||
|
||||
# A shorter title for the navigation bar. Default is the same as html_title.
|
||||
#html_short_title = None
|
||||
|
||||
# The name of an image file (relative to this directory) to place at the top
|
||||
# of the sidebar.
|
||||
#html_logo = '../../logo/trans-logo.png'
|
||||
|
||||
# The name of an image file (within the static path) to use as favicon of the
|
||||
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
|
||||
# pixels large.
|
||||
html_favicon = 'docs/static/favicon.ico'
|
||||
|
||||
# Add any paths that contain custom static files (such as style sheets) here,
|
||||
# relative to this directory. They are copied after the builtin static files,
|
||||
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||
html_static_path = ['docs/static']
|
||||
|
||||
# Add any extra paths that contain custom files (such as robots.txt or
|
||||
# .htaccess) here, relative to this directory. These files are copied
|
||||
# directly to the root of the documentation.
|
||||
#html_extra_path = []
|
||||
|
||||
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
|
||||
# using the given strftime format.
|
||||
html_last_updated_fmt = '%d %b %Y'
|
||||
|
||||
# If true, SmartyPants will be used to convert quotes and dashes to
|
||||
# typographically correct entities.
|
||||
#html_use_smartypants = True
|
||||
|
||||
# Custom sidebar templates, maps document names to template names.
|
||||
#html_sidebars = {}
|
||||
|
||||
# Additional templates that should be rendered to pages, maps page names to
|
||||
# template names.
|
||||
#html_additional_pages = {"index": "topindex.html"}
|
||||
|
||||
# If false, no module index is generated.
|
||||
#html_domain_indices = True
|
||||
|
||||
# If false, no index is generated.
|
||||
#html_use_index = True
|
||||
|
||||
# If true, the index is split into individual pages for each letter.
|
||||
#html_split_index = False
|
||||
|
||||
# If true, links to the reST sources are added to the pages.
|
||||
#html_show_sourcelink = True
|
||||
|
||||
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
|
||||
#html_show_sphinx = True
|
||||
|
||||
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
|
||||
#html_show_copyright = True
|
||||
|
||||
# If true, an OpenSearch description file will be output, and all pages will
|
||||
# contain a <link> tag referring to it. The value of this option must be the
|
||||
# base URL from which the finished HTML is served.
|
||||
#html_use_opensearch = ''
|
||||
|
||||
# This is the file name suffix for HTML files (e.g. ".xhtml").
|
||||
#html_file_suffix = None
|
||||
|
||||
# Output file base name for HTML help builder.
|
||||
htmlhelp_basename = 'CircuitPythondoc'
|
||||
|
||||
|
||||
# -- Options for LaTeX output ---------------------------------------------
|
||||
|
||||
latex_elements = {
|
||||
# The paper size ('letterpaper' or 'a4paper').
|
||||
#'papersize': 'letterpaper',
|
||||
|
||||
# The font size ('10pt', '11pt' or '12pt').
|
||||
#'pointsize': '10pt',
|
||||
|
||||
# Additional stuff for the LaTeX preamble.
|
||||
#'preamble': '',
|
||||
# Include 3 levels of headers in PDF ToC
|
||||
'preamble': '\setcounter{tocdepth}{2}',
|
||||
}
|
||||
|
||||
# Grouping the document tree into LaTeX files. List of tuples
|
||||
# (source start file, target name, title,
|
||||
# author, documentclass [howto, manual, or own class]).
|
||||
latex_documents = [
|
||||
(master_doc, 'CircuitPython.tex', 'CircuitPython Documentation',
|
||||
'CircuitPython Contributors', 'manual'),
|
||||
]
|
||||
|
||||
# The name of an image file (relative to this directory) to place at the top of
|
||||
# the title page.
|
||||
#latex_logo = None
|
||||
|
||||
# For "manual" documents, if this is true, then toplevel headings are parts,
|
||||
# not chapters.
|
||||
#latex_use_parts = False
|
||||
|
||||
# If true, show page references after internal links.
|
||||
#latex_show_pagerefs = False
|
||||
|
||||
# If true, show URL addresses after external links.
|
||||
#latex_show_urls = False
|
||||
|
||||
# Documents to append as an appendix to all manuals.
|
||||
#latex_appendices = []
|
||||
|
||||
# If false, no module index is generated.
|
||||
#latex_domain_indices = True
|
||||
|
||||
|
||||
# -- Options for manual page output ---------------------------------------
|
||||
|
||||
# One entry per manual page. List of tuples
|
||||
# (source start file, name, description, authors, manual section).
|
||||
man_pages = [
|
||||
('index', 'CircuitPython', 'CircuitPython Documentation',
|
||||
['CircuitPython contributors'], 1),
|
||||
]
|
||||
|
||||
# If true, show URL addresses after external links.
|
||||
#man_show_urls = False
|
||||
|
||||
|
||||
# -- Options for Texinfo output -------------------------------------------
|
||||
|
||||
# Grouping the document tree into Texinfo files. List of tuples
|
||||
# (source start file, target name, title, author,
|
||||
# dir menu entry, description, category)
|
||||
texinfo_documents = [
|
||||
(master_doc, 'CircuitPython', 'CircuitPython Documentation',
|
||||
'CircuitPython contributors', 'CircuitPython', 'Python for Microcontrollers.',
|
||||
'Miscellaneous'),
|
||||
]
|
||||
|
||||
# Documents to append as an appendix to all manuals.
|
||||
#texinfo_appendices = []
|
||||
|
||||
# If false, no module index is generated.
|
||||
#texinfo_domain_indices = True
|
||||
|
||||
# How to display URL addresses: 'footnote', 'no', or 'inline'.
|
||||
#texinfo_show_urls = 'footnote'
|
||||
|
||||
# If true, do not generate a @detailmenu in the "Top" node's menu.
|
||||
#texinfo_no_detailmenu = False
|
||||
|
||||
|
||||
# Example configuration for intersphinx: refer to the Python standard library.
|
||||
intersphinx_mapping = {"cpython": ('https://docs.python.org/3/', None),
|
||||
"bus_device": ('https://circuitpython.readthedocs.io/projects/busdevice/en/latest/', None),
|
||||
"register": ('https://circuitpython.readthedocs.io/projects/register/en/latest/', None)}
|
||||
|
||||
# Adapted from sphinxcontrib-redirects
|
||||
from sphinx.builders import html as builders
|
||||
|
||||
TEMPLATE = """<html>
|
||||
<head><meta http-equiv="refresh" content="0; url=%s"/></head>
|
||||
</html>
|
||||
"""
|
||||
|
||||
|
||||
def generate_redirects(app):
|
||||
path = os.path.join(app.srcdir, app.config.redirects_file)
|
||||
if not os.path.exists(path):
|
||||
logging.error("Could not find redirects file at '%s'" % path)
|
||||
return
|
||||
|
||||
if not isinstance(app.builder, builders.StandaloneHTMLBuilder):
|
||||
logging.warn("The 'sphinxcontib-redirects' plugin is only supported "
|
||||
"by the 'html' builder and subclasses. Skipping...")
|
||||
logging.warn(f"Builder is {app.builder.name} ({type(app.builder)})")
|
||||
return
|
||||
|
||||
with open(path) as redirects:
|
||||
for line in redirects.readlines():
|
||||
from_path, to_path = line.rstrip().split(' ')
|
||||
|
||||
logging.debug("Redirecting '%s' to '%s'" % (from_path, to_path))
|
||||
|
||||
from_path = os.path.splitext(from_path)[0] + ".html"
|
||||
to_path_prefix = '..%s' % os.path.sep * (
|
||||
len(from_path.split(os.path.sep)) - 1)
|
||||
to_path = to_path_prefix + to_path
|
||||
|
||||
redirected_filename = os.path.join(app.builder.outdir, from_path)
|
||||
redirected_directory = os.path.dirname(redirected_filename)
|
||||
if not os.path.exists(redirected_directory):
|
||||
os.makedirs(redirected_directory)
|
||||
|
||||
with open(redirected_filename, 'w') as f:
|
||||
f.write(TEMPLATE % urllib.parse.quote(to_path, '#/'))
|
||||
|
||||
|
||||
class CoreModuleTransform(SphinxTransform):
|
||||
default_priority = 870
|
||||
|
||||
def _convert_first_paragraph_into_title(self):
|
||||
title = self.document.next_node(nodes.title)
|
||||
paragraph = self.document.next_node(nodes.paragraph)
|
||||
if not title or not paragraph:
|
||||
return
|
||||
if isinstance(paragraph[0], nodes.paragraph):
|
||||
paragraph = paragraph[0]
|
||||
if all(isinstance(child, nodes.Text) for child in paragraph.children):
|
||||
for child in paragraph.children:
|
||||
title.append(nodes.Text(" \u2013 "))
|
||||
title.append(child)
|
||||
paragraph.parent.remove(paragraph)
|
||||
|
||||
def _enable_linking_to_nonclass_targets(self):
|
||||
for desc in self.document.traverse(addnodes.desc):
|
||||
for xref in desc.traverse(addnodes.pending_xref):
|
||||
if xref.attributes.get("reftype") == "class":
|
||||
xref.attributes.pop("refspecific", None)
|
||||
|
||||
def apply(self, **kwargs):
|
||||
docname = self.env.docname
|
||||
if docname.startswith(autoapi_root) and docname.endswith("/index"):
|
||||
self._convert_first_paragraph_into_title()
|
||||
self._enable_linking_to_nonclass_targets()
|
||||
|
||||
|
||||
def setup(app):
|
||||
app.add_css_file("customstyle.css")
|
||||
app.add_css_file("filter.css")
|
||||
app.add_js_file("filter.js")
|
||||
app.add_config_value('redirects_file', 'redirects', 'env')
|
||||
app.connect('builder-inited', generate_redirects)
|
||||
app.add_transform(CoreModuleTransform)
|
||||
1
data/nvm.toml
Submodule
1
data/nvm.toml
Submodule
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 9b4a5241d8c3310b31a7925a4f2160743890a2e4
|
||||
957
devices/ble_hci/common-hal/_bleio/Adapter.c
Normal file
957
devices/ble_hci/common-hal/_bleio/Adapter.c
Normal file
|
|
@ -0,0 +1,957 @@
|
|||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2020 Dan Halbert for Adafruit Industries
|
||||
* Copyright (c) 2016 Glenn Ruben Bakke
|
||||
* Copyright (c) 2018 Artur Pacholec
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <math.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "hci.h"
|
||||
|
||||
#include "py/gc.h"
|
||||
#include "py/mphal.h"
|
||||
#include "py/objstr.h"
|
||||
#include "py/runtime.h"
|
||||
#include "supervisor/shared/safe_mode.h"
|
||||
#include "supervisor/shared/tick.h"
|
||||
#include "supervisor/usb.h"
|
||||
#include "shared-bindings/_bleio/__init__.h"
|
||||
#include "shared-bindings/_bleio/Adapter.h"
|
||||
#include "shared-bindings/_bleio/Address.h"
|
||||
#include "shared-bindings/_bleio/Characteristic.h"
|
||||
#include "shared-bindings/_bleio/Service.h"
|
||||
#include "shared-bindings/_bleio/Connection.h"
|
||||
#include "shared-bindings/_bleio/ScanEntry.h"
|
||||
#include "shared-bindings/time/__init__.h"
|
||||
|
||||
#define MSEC_TO_UNITS(TIME, RESOLUTION) (((TIME) * 1000) / (RESOLUTION))
|
||||
#define SEC_TO_UNITS(TIME, RESOLUTION) (((TIME) * 1000000) / (RESOLUTION))
|
||||
#define UNITS_TO_SEC(TIME, RESOLUTION) (((TIME)*(RESOLUTION)) / 1000000)
|
||||
// 0.625 msecs (625 usecs)
|
||||
#define ADV_INTERVAL_UNIT_FLOAT_SECS (0.000625)
|
||||
// Microseconds is the base unit. The macros above know that.
|
||||
#define UNIT_0_625_MS (625)
|
||||
#define UNIT_1_25_MS (1250)
|
||||
#define UNIT_10_MS (10000)
|
||||
|
||||
#define MAX_ADVERTISEMENT_SIZE (31)
|
||||
|
||||
// TODO make this settable from Python.
|
||||
#define DEFAULT_TX_POWER 0 // 0 dBm
|
||||
#define MAX_ANONYMOUS_ADV_TIMEOUT_SECS (60 * 15)
|
||||
#define MAX_LIMITED_DISCOVERABLE_ADV_TIMEOUT_SECS (180)
|
||||
|
||||
#define BLE_MIN_CONN_INTERVAL MSEC_TO_UNITS(15, UNIT_0_625_MS)
|
||||
#define BLE_MAX_CONN_INTERVAL MSEC_TO_UNITS(15, UNIT_0_625_MS)
|
||||
#define BLE_SLAVE_LATENCY 0
|
||||
#define BLE_CONN_SUP_TIMEOUT MSEC_TO_UNITS(4000, UNIT_10_MS)
|
||||
|
||||
bleio_connection_internal_t bleio_connections[BLEIO_TOTAL_CONNECTION_COUNT];
|
||||
|
||||
STATIC void add_generic_services(bleio_adapter_obj_t *adapter) {
|
||||
// Create Generic Access UUID, Service, and Characteristics.
|
||||
|
||||
// Generic Access Service setup.
|
||||
|
||||
bleio_uuid_obj_t *generic_access_service_uuid = m_new_obj(bleio_uuid_obj_t);
|
||||
generic_access_service_uuid->base.type = &bleio_uuid_type;
|
||||
common_hal_bleio_uuid_construct(generic_access_service_uuid, 0x1800, NULL);
|
||||
|
||||
bleio_uuid_obj_t *device_name_characteristic_uuid = m_new_obj(bleio_uuid_obj_t);
|
||||
device_name_characteristic_uuid->base.type = &bleio_uuid_type;
|
||||
common_hal_bleio_uuid_construct(device_name_characteristic_uuid, 0x2A00, NULL);
|
||||
|
||||
bleio_uuid_obj_t *appearance_characteristic_uuid = m_new_obj(bleio_uuid_obj_t);
|
||||
appearance_characteristic_uuid->base.type = &bleio_uuid_type;
|
||||
common_hal_bleio_uuid_construct(appearance_characteristic_uuid, 0x2A01, NULL);
|
||||
|
||||
// Not implemented:
|
||||
// Peripheral Preferred Connection Parameters
|
||||
// Central Address Resolution
|
||||
|
||||
bleio_service_obj_t *generic_access_service = m_new_obj(bleio_service_obj_t);
|
||||
generic_access_service->base.type = &bleio_service_type;
|
||||
common_hal_bleio_service_construct(generic_access_service, generic_access_service_uuid, false);
|
||||
|
||||
adapter->device_name_characteristic = m_new_obj(bleio_characteristic_obj_t);
|
||||
adapter->device_name_characteristic->base.type = &bleio_characteristic_type;
|
||||
|
||||
char generic_name[] = { 'C', 'I', 'R', 'C', 'U', 'I', 'T', 'P', 'Y', 'n', 'n', 'n', 'n' };
|
||||
mp_buffer_info_t generic_name_bufinfo = {
|
||||
.buf = generic_name,
|
||||
.len = sizeof(generic_name),
|
||||
};
|
||||
|
||||
// Will be added to service by constructor.
|
||||
common_hal_bleio_characteristic_construct(
|
||||
adapter->device_name_characteristic,
|
||||
generic_access_service,
|
||||
BLE_GATT_HANDLE_INVALID,
|
||||
device_name_characteristic_uuid,
|
||||
CHAR_PROP_READ,
|
||||
SECURITY_MODE_OPEN,
|
||||
SECURITY_MODE_NO_ACCESS,
|
||||
248, // max length, from Bluetooth spec
|
||||
false, // not fixed length
|
||||
&generic_name_bufinfo
|
||||
);
|
||||
|
||||
uint16_t zero_16 = 0;
|
||||
mp_buffer_info_t zero_16_value = {
|
||||
.buf = &zero_16,
|
||||
.len = sizeof(zero_16),
|
||||
};
|
||||
|
||||
adapter->appearance_characteristic = m_new_obj(bleio_characteristic_obj_t);
|
||||
adapter->appearance_characteristic->base.type = &bleio_characteristic_type;
|
||||
|
||||
common_hal_bleio_characteristic_construct(
|
||||
adapter->appearance_characteristic,
|
||||
generic_access_service,
|
||||
BLE_GATT_HANDLE_INVALID,
|
||||
appearance_characteristic_uuid,
|
||||
CHAR_PROP_READ,
|
||||
SECURITY_MODE_OPEN,
|
||||
SECURITY_MODE_NO_ACCESS,
|
||||
2, // max length, from Bluetooth spec
|
||||
true, // fixed length
|
||||
&zero_16_value
|
||||
);
|
||||
|
||||
// Generic Attribute Service setup.
|
||||
|
||||
bleio_uuid_obj_t *generic_attribute_service_uuid = m_new_obj(bleio_uuid_obj_t);
|
||||
generic_attribute_service_uuid->base.type = &bleio_uuid_type;
|
||||
common_hal_bleio_uuid_construct(generic_attribute_service_uuid, 0x1801, NULL);
|
||||
|
||||
bleio_uuid_obj_t *service_changed_characteristic_uuid = m_new_obj(bleio_uuid_obj_t);
|
||||
service_changed_characteristic_uuid->base.type = &bleio_uuid_type;
|
||||
common_hal_bleio_uuid_construct(service_changed_characteristic_uuid, 0x2A05, NULL);
|
||||
|
||||
bleio_service_obj_t *generic_attribute_service = m_new_obj(bleio_service_obj_t);
|
||||
generic_attribute_service->base.type = &bleio_service_type;
|
||||
common_hal_bleio_service_construct(generic_attribute_service, generic_attribute_service_uuid, false);
|
||||
|
||||
adapter->service_changed_characteristic = m_new_obj(bleio_characteristic_obj_t);
|
||||
adapter->service_changed_characteristic->base.type = &bleio_characteristic_type;
|
||||
|
||||
uint32_t zero_32 = 0;
|
||||
mp_buffer_info_t zero_32_value = {
|
||||
.buf = &zero_32,
|
||||
.len = sizeof(zero_32),
|
||||
};
|
||||
|
||||
common_hal_bleio_characteristic_construct(
|
||||
adapter->service_changed_characteristic,
|
||||
generic_attribute_service,
|
||||
BLE_GATT_HANDLE_INVALID,
|
||||
service_changed_characteristic_uuid,
|
||||
CHAR_PROP_INDICATE,
|
||||
SECURITY_MODE_OPEN,
|
||||
SECURITY_MODE_NO_ACCESS,
|
||||
4, // max length, from Bluetooth spec
|
||||
true, // fixed length
|
||||
&zero_32_value
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
STATIC void check_enabled(bleio_adapter_obj_t *adapter) {
|
||||
if (!common_hal_bleio_adapter_get_enabled(adapter)) {
|
||||
mp_raise_bleio_BluetoothError(translate("Adapter not enabled"));
|
||||
}
|
||||
}
|
||||
|
||||
// STATIC bool adapter_on_ble_evt(ble_evt_t *ble_evt, void *self_in) {
|
||||
// bleio_adapter_obj_t *self = (bleio_adapter_obj_t*)self_in;
|
||||
|
||||
// // For debugging.
|
||||
// // mp_printf(&mp_plat_print, "Adapter event: 0x%04x\n", ble_evt->header.evt_id);
|
||||
|
||||
// switch (ble_evt->header.evt_id) {
|
||||
// case BLE_GAP_EVT_CONNECTED: {
|
||||
// // Find an empty connection. One must always be available because the SD has the same
|
||||
// // total connection limit.
|
||||
// bleio_connection_internal_t *connection;
|
||||
// for (size_t i = 0; i < BLEIO_TOTAL_CONNECTION_COUNT; i++) {
|
||||
// connection = &bleio_connections[i];
|
||||
// if (connection->conn_handle == BLE_CONN_HANDLE_INVALID) {
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
|
||||
// // Central has connected.
|
||||
// ble_gap_evt_connected_t* connected = &ble_evt->evt.gap_evt.params.connected;
|
||||
|
||||
// connection->conn_handle = ble_evt->evt.gap_evt.conn_handle;
|
||||
// connection->connection_obj = mp_const_none;
|
||||
// connection->pair_status = PAIR_NOT_PAIRED;
|
||||
// connection->mtu = 0;
|
||||
|
||||
// ble_drv_add_event_handler_entry(&connection->handler_entry, connection_on_ble_evt, connection);
|
||||
// self->connection_objs = NULL;
|
||||
|
||||
// // Save the current connection parameters.
|
||||
// memcpy(&connection->conn_params, &connected->conn_params, sizeof(ble_gap_conn_params_t));
|
||||
|
||||
// #if CIRCUITPY_VERBOSE_BLE
|
||||
// ble_gap_conn_params_t *cp = &connected->conn_params;
|
||||
// mp_printf(&mp_plat_print, "conn params: min_ci %d max_ci %d s_l %d sup_timeout %d\n", cp->min_conn_interval, cp->max_conn_interval, cp->slave_latency, cp->conn_sup_timeout);
|
||||
// #endif
|
||||
|
||||
// // See if connection interval set by Central is out of range.
|
||||
// // If so, negotiate our preferred range.
|
||||
// ble_gap_conn_params_t conn_params;
|
||||
// sd_ble_gap_ppcp_get(&conn_params);
|
||||
// if (conn_params.min_conn_interval < connected->conn_params.min_conn_interval ||
|
||||
// conn_params.min_conn_interval > connected->conn_params.max_conn_interval) {
|
||||
// sd_ble_gap_conn_param_update(ble_evt->evt.gap_evt.conn_handle, &conn_params);
|
||||
// }
|
||||
// self->current_advertising_data = NULL;
|
||||
// break;
|
||||
// }
|
||||
// case BLE_GAP_EVT_DISCONNECTED: {
|
||||
// // Find the connection that was disconnected.
|
||||
// bleio_connection_internal_t *connection;
|
||||
// for (size_t i = 0; i < BLEIO_TOTAL_CONNECTION_COUNT; i++) {
|
||||
// connection = &bleio_connections[i];
|
||||
// if (connection->conn_handle == ble_evt->evt.gap_evt.conn_handle) {
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
// ble_drv_remove_event_handler(connection_on_ble_evt, connection);
|
||||
// connection->conn_handle = BLE_CONN_HANDLE_INVALID;
|
||||
// connection->pair_status = PAIR_NOT_PAIRED;
|
||||
// if (connection->connection_obj != mp_const_none) {
|
||||
// bleio_connection_obj_t* obj = connection->connection_obj;
|
||||
// obj->connection = NULL;
|
||||
// obj->disconnect_reason = ble_evt->evt.gap_evt.params.disconnected.reason;
|
||||
// }
|
||||
// self->connection_objs = NULL;
|
||||
|
||||
// break;
|
||||
// }
|
||||
|
||||
// case BLE_GAP_EVT_ADV_SET_TERMINATED:
|
||||
// self->current_advertising_data = NULL;
|
||||
// break;
|
||||
|
||||
// default:
|
||||
// // For debugging.
|
||||
// // mp_printf(&mp_plat_print, "Unhandled adapter event: 0x%04x\n", ble_evt->header.evt_id);
|
||||
// return false;
|
||||
// break;
|
||||
// }
|
||||
// return true;
|
||||
// }
|
||||
|
||||
char default_ble_name[] = { 'C', 'I', 'R', 'C', 'U', 'I', 'T', 'P', 'Y', 0, 0, 0, 0};
|
||||
|
||||
// Get various values and limits set by the adapter.
|
||||
// Set event mask.
|
||||
STATIC void bleio_adapter_hci_init(bleio_adapter_obj_t *self) {
|
||||
|
||||
const size_t len = sizeof(default_ble_name);
|
||||
|
||||
bt_addr_t addr;
|
||||
hci_check_error(hci_read_bd_addr(&addr));
|
||||
|
||||
default_ble_name[len - 4] = nibble_to_hex_lower[addr.val[1] >> 4 & 0xf];
|
||||
default_ble_name[len - 3] = nibble_to_hex_lower[addr.val[1] & 0xf];
|
||||
default_ble_name[len - 2] = nibble_to_hex_lower[addr.val[0] >> 4 & 0xf];
|
||||
default_ble_name[len - 1] = nibble_to_hex_lower[addr.val[0] & 0xf];
|
||||
self->name = mp_obj_new_str(default_ble_name, len);
|
||||
|
||||
// Get version information.
|
||||
if (hci_read_local_version(&self->hci_version, &self->hci_revision, &self->lmp_version,
|
||||
&self->manufacturer, &self->lmp_subversion) != HCI_OK) {
|
||||
mp_raise_bleio_BluetoothError(translate("Could not read HCI version"));
|
||||
}
|
||||
// Get supported features.
|
||||
if (hci_le_read_local_supported_features(self->features) != HCI_OK) {
|
||||
mp_raise_bleio_BluetoothError(translate("Could not read BLE features"));
|
||||
}
|
||||
|
||||
// Enabled desired events.
|
||||
// Most importantly, includes:
|
||||
// BT_EVT_MASK_LE_META_EVENT BT_EVT_BIT(61)
|
||||
if (hci_set_event_mask(0x3FFFFFFFFFFFFFFF) != HCI_OK) {
|
||||
mp_raise_bleio_BluetoothError(translate("Could not set event mask"));
|
||||
}
|
||||
// The default events for LE are:
|
||||
// BT_EVT_MASK_LE_CONN_COMPLETE, BT_EVT_MASK_LE_ADVERTISING_REPORT,
|
||||
// BT_EVT_MASK_LE_CONN_UPDATE_COMPLETE, BT_EVT_MASK_LE_REMOTE_FEAT_COMPLETE
|
||||
// BT_EVT_MASK_LE_LTK_REQUEST.
|
||||
// That's all we need right now, so we don't bother to set the LE event mask.
|
||||
|
||||
// Get ACL buffer info.
|
||||
uint16_t le_max_len;
|
||||
uint8_t le_max_num;
|
||||
if (hci_le_read_buffer_size(&le_max_len, &le_max_num) == HCI_OK) {
|
||||
self->max_acl_buffer_len = le_max_len;
|
||||
self->max_acl_num_buffers = le_max_num;
|
||||
} else {
|
||||
// LE Read Buffer Size not available; use the general Read Buffer Size.
|
||||
uint16_t acl_max_len;
|
||||
uint8_t sco_max_len;
|
||||
uint16_t acl_max_num;
|
||||
uint16_t sco_max_num;
|
||||
if (hci_read_buffer_size(&acl_max_len, &sco_max_len, &acl_max_num, &sco_max_num) != HCI_OK) {
|
||||
mp_raise_bleio_BluetoothError(translate("Could not read BLE buffer info"));
|
||||
}
|
||||
self->max_acl_buffer_len = acl_max_len;
|
||||
self->max_acl_num_buffers = acl_max_num;
|
||||
}
|
||||
|
||||
// Get max advertising length if extended advertising is supported.
|
||||
if (BT_FEAT_LE_EXT_ADV(self->features)) {
|
||||
uint16_t max_adv_data_len;
|
||||
if (hci_le_read_maximum_advertising_data_length(&max_adv_data_len) != HCI_OK) {
|
||||
mp_raise_bleio_BluetoothError(translate("Could not get max advertising length"));
|
||||
}
|
||||
self->max_adv_data_len = max_adv_data_len;
|
||||
} else {
|
||||
self->max_adv_data_len = MAX_ADVERTISEMENT_SIZE;
|
||||
}
|
||||
}
|
||||
|
||||
void common_hal_bleio_adapter_construct_hci_uart(bleio_adapter_obj_t *self, busio_uart_obj_t *uart, digitalio_digitalinout_obj_t *rts, digitalio_digitalinout_obj_t *cts) {
|
||||
self->allocated = true;
|
||||
self->hci_uart = uart;
|
||||
self->rts_digitalinout = rts;
|
||||
self->cts_digitalinout = cts;
|
||||
|
||||
// Advertising-related fields are initialized by common_hal_bleio_adapter_set_enabled().
|
||||
self->enabled = false;
|
||||
|
||||
common_hal_bleio_adapter_set_enabled(self, true);
|
||||
bleio_adapter_hci_init(self);
|
||||
common_hal_bleio_adapter_set_name(self, default_ble_name);
|
||||
}
|
||||
|
||||
void common_hal_bleio_adapter_set_enabled(bleio_adapter_obj_t *self, bool enabled) {
|
||||
const bool is_enabled = common_hal_bleio_adapter_get_enabled(self);
|
||||
|
||||
// Don't enable or disable twice
|
||||
if (is_enabled == enabled) {
|
||||
return;
|
||||
}
|
||||
|
||||
self->enabled = enabled;
|
||||
|
||||
// We must poll for input from the HCI adapter.
|
||||
// TODO Can we instead trigger an interrupt on UART input traffic?
|
||||
if (enabled) {
|
||||
supervisor_enable_tick();
|
||||
} else {
|
||||
supervisor_disable_tick();
|
||||
}
|
||||
|
||||
// Enabling or disabling: stop any current activity; reset to known state.
|
||||
hci_reset();
|
||||
self->now_advertising = false;
|
||||
self->extended_advertising = false;
|
||||
self->circuitpython_advertising = false;
|
||||
self->advertising_timeout_msecs = 0;
|
||||
|
||||
if (enabled) {
|
||||
// Reset list of known attributes.
|
||||
// Indices into the list are handles. Handle 0x0000 designates an invalid handle,
|
||||
// so store None there to skip it.
|
||||
self->attributes = mp_obj_new_list(0, NULL);
|
||||
bleio_adapter_add_attribute(self, mp_const_none);
|
||||
add_generic_services(self);
|
||||
}
|
||||
}
|
||||
|
||||
bool common_hal_bleio_adapter_get_enabled(bleio_adapter_obj_t *self) {
|
||||
return self->enabled;
|
||||
}
|
||||
|
||||
bleio_address_obj_t *common_hal_bleio_adapter_get_address(bleio_adapter_obj_t *self) {
|
||||
check_enabled(self);
|
||||
|
||||
bt_addr_t addr;
|
||||
hci_check_error(hci_read_bd_addr(&addr));
|
||||
|
||||
bleio_address_obj_t *address = m_new_obj(bleio_address_obj_t);
|
||||
address->base.type = &bleio_address_type;
|
||||
|
||||
common_hal_bleio_address_construct(address, addr.val, BT_ADDR_LE_PUBLIC);
|
||||
return address;
|
||||
}
|
||||
|
||||
bool common_hal_bleio_adapter_set_address(bleio_adapter_obj_t *self, bleio_address_obj_t *address) {
|
||||
mp_buffer_info_t bufinfo;
|
||||
if (!mp_get_buffer(address->bytes, &bufinfo, MP_BUFFER_READ)) {
|
||||
return false;
|
||||
}
|
||||
return hci_le_set_random_address(bufinfo.buf) == HCI_OK;
|
||||
}
|
||||
|
||||
mp_obj_str_t *common_hal_bleio_adapter_get_name(bleio_adapter_obj_t *self) {
|
||||
return self->name;
|
||||
}
|
||||
|
||||
void common_hal_bleio_adapter_set_name(bleio_adapter_obj_t *self, const char *name) {
|
||||
self->name = mp_obj_new_str(name, strlen(name));
|
||||
mp_buffer_info_t bufinfo;
|
||||
mp_get_buffer_raise(self->name, &bufinfo, MP_BUFFER_READ);
|
||||
bleio_characteristic_set_local_value(self->device_name_characteristic, &bufinfo);
|
||||
}
|
||||
|
||||
|
||||
// STATIC bool scan_on_ble_evt(ble_evt_t *ble_evt, void *scan_results_in) {
|
||||
// bleio_scanresults_obj_t *scan_results = (bleio_scanresults_obj_t*)scan_results_in;
|
||||
|
||||
// if (ble_evt->header.evt_id == BLE_GAP_EVT_TIMEOUT &&
|
||||
// ble_evt->evt.gap_evt.params.timeout.src == BLE_GAP_TIMEOUT_SRC_SCAN) {
|
||||
// shared_module_bleio_scanresults_set_done(scan_results, true);
|
||||
// ble_drv_remove_event_handler(scan_on_ble_evt, scan_results);
|
||||
// return true;
|
||||
// }
|
||||
|
||||
// if (ble_evt->header.evt_id != BLE_GAP_EVT_ADV_REPORT) {
|
||||
// return false;
|
||||
// }
|
||||
// ble_gap_evt_adv_report_t *report = &ble_evt->evt.gap_evt.params.adv_report;
|
||||
|
||||
// shared_module_bleio_scanresults_append(scan_results,
|
||||
// supervisor_ticks_ms64(),
|
||||
// report->type.connectable,
|
||||
// report->type.scan_response,
|
||||
// report->rssi,
|
||||
// report->peer_addr.addr,
|
||||
// report->peer_addr.addr_type,
|
||||
// report->data.p_data,
|
||||
// report->data.len);
|
||||
|
||||
// const uint32_t err_code = sd_ble_gap_scan_start(NULL, scan_results->common_hal_data);
|
||||
// if (err_code != NRF_SUCCESS) {
|
||||
// // TODO: Pass the error into the scan results so it can throw an exception.
|
||||
// scan_results->done = true;
|
||||
// }
|
||||
// return true;
|
||||
// }
|
||||
|
||||
mp_obj_t common_hal_bleio_adapter_start_scan(bleio_adapter_obj_t *self, uint8_t *prefixes, size_t prefix_length, bool extended, mp_int_t buffer_size, mp_float_t timeout, mp_float_t interval, mp_float_t window, mp_int_t minimum_rssi, bool active) {
|
||||
// TODO
|
||||
mp_raise_NotImplementedError(NULL);
|
||||
check_enabled(self);
|
||||
|
||||
if (self->scan_results != NULL) {
|
||||
if (!shared_module_bleio_scanresults_get_done(self->scan_results)) {
|
||||
mp_raise_bleio_BluetoothError(translate("Scan already in progess. Stop with stop_scan."));
|
||||
}
|
||||
self->scan_results = NULL;
|
||||
}
|
||||
self->scan_results = shared_module_bleio_new_scanresults(buffer_size, prefixes, prefix_length, minimum_rssi);
|
||||
|
||||
// size_t max_packet_size = extended ? BLE_GAP_SCAN_BUFFER_EXTENDED_MAX_SUPPORTED : BLE_GAP_SCAN_BUFFER_MAX;
|
||||
// uint8_t *raw_data = m_malloc(sizeof(ble_data_t) + max_packet_size, false);
|
||||
// ble_data_t * sd_data = (ble_data_t *) raw_data;
|
||||
// self->scan_results->common_hal_data = sd_data;
|
||||
// sd_data->len = max_packet_size;
|
||||
// sd_data->p_data = raw_data + sizeof(ble_data_t);
|
||||
|
||||
// ble_drv_add_event_handler(scan_on_ble_evt, self->scan_results);
|
||||
|
||||
// uint32_t nrf_timeout = SEC_TO_UNITS(timeout, UNIT_10_MS);
|
||||
// if (timeout <= 0.0001) {
|
||||
// nrf_timeout = BLE_GAP_SCAN_TIMEOUT_UNLIMITED;
|
||||
// }
|
||||
|
||||
// ble_gap_scan_params_t scan_params = {
|
||||
// .extended = extended,
|
||||
// .interval = SEC_TO_UNITS(interval, UNIT_0_625_MS),
|
||||
// .timeout = nrf_timeout,
|
||||
// .window = SEC_TO_UNITS(window, UNIT_0_625_MS),
|
||||
// .scan_phys = BLE_GAP_PHY_1MBPS,
|
||||
// .active = active
|
||||
// };
|
||||
// uint32_t err_code;
|
||||
// vm_used_ble = true;
|
||||
// err_code = sd_ble_gap_scan_start(&scan_params, sd_data);
|
||||
|
||||
// if (err_code != NRF_SUCCESS) {
|
||||
// self->scan_results = NULL;
|
||||
// ble_drv_remove_event_handler(scan_on_ble_evt, self->scan_results);
|
||||
// check_nrf_error(err_code);
|
||||
// }
|
||||
|
||||
return MP_OBJ_FROM_PTR(self->scan_results);
|
||||
}
|
||||
|
||||
void common_hal_bleio_adapter_stop_scan(bleio_adapter_obj_t *self) {
|
||||
// TODO
|
||||
mp_raise_NotImplementedError(NULL);
|
||||
check_enabled(self);
|
||||
|
||||
// If not already scanning, no problem.
|
||||
if (hci_le_set_scan_enable(BT_HCI_LE_SCAN_DISABLE, BT_HCI_LE_SCAN_FILTER_DUP_DISABLE) == HCI_OK) {
|
||||
shared_module_bleio_scanresults_set_done(self->scan_results, true);
|
||||
self->scan_results = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
// typedef struct {
|
||||
// uint16_t conn_handle;
|
||||
// volatile bool done;
|
||||
// } connect_info_t;
|
||||
|
||||
// STATIC bool connect_on_ble_evt(ble_evt_t *ble_evt, void *info_in) {
|
||||
// connect_info_t *info = (connect_info_t*)info_in;
|
||||
|
||||
// switch (ble_evt->header.evt_id) {
|
||||
// case BLE_GAP_EVT_CONNECTED:
|
||||
// info->conn_handle = ble_evt->evt.gap_evt.conn_handle;
|
||||
// info->done = true;
|
||||
|
||||
// break;
|
||||
|
||||
// case BLE_GAP_EVT_TIMEOUT:
|
||||
// // Handle will be invalid.
|
||||
// info->done = true;
|
||||
// break;
|
||||
// default:
|
||||
// // For debugging.
|
||||
// // mp_printf(&mp_plat_print, "Unhandled central event: 0x%04x\n", ble_evt->header.evt_id);
|
||||
// return false;
|
||||
// break;
|
||||
// }
|
||||
// return true;
|
||||
// }
|
||||
|
||||
mp_obj_t common_hal_bleio_adapter_connect(bleio_adapter_obj_t *self, bleio_address_obj_t *address, mp_float_t timeout) {
|
||||
// TODO
|
||||
mp_raise_NotImplementedError(NULL);
|
||||
|
||||
check_enabled(self);
|
||||
|
||||
// ble_gap_addr_t addr;
|
||||
|
||||
// addr.addr_type = address->type;
|
||||
// mp_buffer_info_t address_buf_info;
|
||||
// mp_get_buffer_raise(address->bytes, &address_buf_info, MP_BUFFER_READ);
|
||||
// memcpy(addr.addr, (uint8_t *) address_buf_info.buf, NUM_BLEIO_ADDRESS_BYTES);
|
||||
|
||||
// ble_gap_scan_params_t scan_params = {
|
||||
// .interval = MSEC_TO_UNITS(100, UNIT_0_625_MS),
|
||||
// .window = MSEC_TO_UNITS(100, UNIT_0_625_MS),
|
||||
// .scan_phys = BLE_GAP_PHY_1MBPS,
|
||||
// // timeout of 0 means no timeout
|
||||
// .timeout = SEC_TO_UNITS(timeout, UNIT_10_MS),
|
||||
// };
|
||||
|
||||
// ble_gap_conn_params_t conn_params = {
|
||||
// .conn_sup_timeout = MSEC_TO_UNITS(4000, UNIT_10_MS),
|
||||
// .min_conn_interval = MSEC_TO_UNITS(15, UNIT_1_25_MS),
|
||||
// .max_conn_interval = MSEC_TO_UNITS(300, UNIT_1_25_MS),
|
||||
// .slave_latency = 0, // number of conn events
|
||||
// };
|
||||
|
||||
// connect_info_t event_info;
|
||||
// ble_drv_add_event_handler(connect_on_ble_evt, &event_info);
|
||||
// event_info.done = false;
|
||||
|
||||
vm_used_ble = true;
|
||||
// uint32_t err_code = sd_ble_gap_connect(&addr, &scan_params, &conn_params, BLE_CONN_CFG_TAG_CUSTOM);
|
||||
|
||||
// if (err_code != NRF_SUCCESS) {
|
||||
// ble_drv_remove_event_handler(connect_on_ble_evt, &event_info);
|
||||
// check_nrf_error(err_code);
|
||||
// }
|
||||
|
||||
// while (!event_info.done) {
|
||||
// RUN_BACKGROUND_TASKS;
|
||||
// }
|
||||
|
||||
// ble_drv_remove_event_handler(connect_on_ble_evt, &event_info);
|
||||
|
||||
// uint16_t conn_handle = event_info.conn_handle;
|
||||
// if (conn_handle == BLE_CONN_HANDLE_INVALID) {
|
||||
// mp_raise_bleio_BluetoothError(translate("Failed to connect: timeout"));
|
||||
// }
|
||||
|
||||
// // Negotiate for better PHY, larger MTU and data lengths since we are the central. These are
|
||||
// // nice-to-haves so ignore any errors.
|
||||
// ble_gap_phys_t const phys = {
|
||||
// .rx_phys = BLE_GAP_PHY_AUTO,
|
||||
// .tx_phys = BLE_GAP_PHY_AUTO,
|
||||
// };
|
||||
// sd_ble_gap_phy_update(conn_handle, &phys);
|
||||
// sd_ble_gattc_exchange_mtu_request(conn_handle, BLE_GATTS_VAR_ATTR_LEN_MAX);
|
||||
// sd_ble_gap_data_length_update(conn_handle, NULL, NULL);
|
||||
|
||||
// Make the connection object and return it.
|
||||
// for (size_t i = 0; i < BLEIO_TOTAL_CONNECTION_COUNT; i++) {
|
||||
// bleio_connection_internal_t *connection = &bleio_connections[i];
|
||||
// if (connection->conn_handle == conn_handle) {
|
||||
// return bleio_connection_new_from_internal(connection);
|
||||
// }
|
||||
// }
|
||||
|
||||
mp_raise_bleio_BluetoothError(translate("Failed to connect: internal error"));
|
||||
|
||||
return mp_const_none;
|
||||
}
|
||||
|
||||
STATIC void check_data_fit(size_t data_len, bool connectable) {
|
||||
if (data_len > MAX_ADVERTISEMENT_SIZE) {
|
||||
mp_raise_ValueError(translate("Data too large for advertisement packet"));
|
||||
}
|
||||
}
|
||||
|
||||
// STATIC bool advertising_on_ble_evt(ble_evt_t *ble_evt, void *self_in) {
|
||||
// bleio_adapter_obj_t *self = (bleio_adapter_obj_t*)self_in;
|
||||
|
||||
// switch (ble_evt->header.evt_id) {
|
||||
// case BLE_GAP_EVT_ADV_SET_TERMINATED:
|
||||
// common_hal_bleio_adapter_stop_advertising(self);
|
||||
// ble_drv_remove_event_handler(advertising_on_ble_evt, self_in);
|
||||
// break;
|
||||
|
||||
// default:
|
||||
// // For debugging.
|
||||
// // mp_printf(&mp_plat_print, "Unhandled advertising event: 0x%04x\n", ble_evt->header.evt_id);
|
||||
// return false;
|
||||
// break;
|
||||
// }
|
||||
// return true;
|
||||
// }
|
||||
|
||||
uint32_t _common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self, bool connectable, bool anonymous, uint32_t timeout, float interval, uint8_t *advertising_data, uint16_t advertising_data_len, uint8_t *scan_response_data, uint16_t scan_response_data_len) {
|
||||
check_enabled(self);
|
||||
|
||||
if (self->now_advertising) {
|
||||
if (self->circuitpython_advertising) {
|
||||
common_hal_bleio_adapter_stop_advertising(self);
|
||||
} else {
|
||||
// User-requested advertising.
|
||||
// TODO allow multiple advertisements.
|
||||
// Already advertising. Can't advertise twice.
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
// Peer address, which we don't use (no directed advertising).
|
||||
bt_addr_le_t empty_addr = { 0 };
|
||||
|
||||
bool extended =
|
||||
advertising_data_len > self->max_adv_data_len || scan_response_data_len > self->max_adv_data_len;
|
||||
|
||||
if (extended) {
|
||||
if (!BT_FEAT_LE_EXT_ADV(self->features)) {
|
||||
mp_raise_bleio_BluetoothError(translate("Data length needs extended advertising, but this adapter does not support it"));
|
||||
}
|
||||
|
||||
uint16_t props = 0;
|
||||
if (connectable) {
|
||||
props |= BT_HCI_LE_ADV_PROP_CONN;
|
||||
}
|
||||
if (scan_response_data_len > 0) {
|
||||
props |= BT_HCI_LE_ADV_PROP_SCAN;
|
||||
}
|
||||
|
||||
// Advertising interval.
|
||||
uint32_t interval_units = SEC_TO_UNITS(interval, UNIT_0_625_MS);
|
||||
|
||||
hci_check_error(
|
||||
hci_le_set_extended_advertising_parameters(
|
||||
0, // handle
|
||||
props, // adv properties
|
||||
interval_units, // min interval
|
||||
interval_units, // max interval
|
||||
0b111, // channel map: channels 37, 38, 39
|
||||
anonymous ? BT_ADDR_LE_RANDOM : BT_ADDR_LE_PUBLIC,
|
||||
&empty_addr, // peer_addr,
|
||||
0x00, // filter policy: no filter
|
||||
DEFAULT_TX_POWER,
|
||||
BT_HCI_LE_EXT_SCAN_PHY_1M, // Secondary PHY to use
|
||||
0x00, // AUX_ADV_IND shall be sent prior to next adv event
|
||||
BT_HCI_LE_EXT_SCAN_PHY_1M, // Secondary PHY to use
|
||||
0x00, // Advertising SID
|
||||
0x00 // Scan req notify disable
|
||||
));
|
||||
|
||||
// We can use the duration mechanism provided, instead of our own.
|
||||
self->advertising_timeout_msecs = 0;
|
||||
|
||||
uint8_t handle[1] = { 0 };
|
||||
uint16_t duration_10msec[1] = { timeout * 100 };
|
||||
uint8_t max_ext_adv_evts[1] = { 0 };
|
||||
hci_check_error(
|
||||
hci_le_set_extended_advertising_enable(
|
||||
BT_HCI_LE_ADV_ENABLE,
|
||||
1, // one advertising set.
|
||||
handle,
|
||||
duration_10msec,
|
||||
max_ext_adv_evts
|
||||
));
|
||||
|
||||
self->extended_advertising = true;
|
||||
} else {
|
||||
// Legacy advertising (not extended).
|
||||
|
||||
uint8_t adv_type;
|
||||
if (connectable) {
|
||||
// Connectable, scannable, undirected.
|
||||
adv_type = BT_HCI_ADV_IND;
|
||||
} else if (scan_response_data_len > 0) {
|
||||
// Unconnectable, scannable, undirected.
|
||||
adv_type = BT_HCI_ADV_SCAN_IND;
|
||||
} else {
|
||||
// Unconnectable, unscannable, undirected.
|
||||
adv_type = BT_HCI_ADV_NONCONN_IND;
|
||||
}
|
||||
|
||||
// Advertising interval.
|
||||
uint16_t interval_units = SEC_TO_UNITS(interval, UNIT_0_625_MS);
|
||||
|
||||
hci_check_error(
|
||||
hci_le_set_advertising_parameters(
|
||||
interval_units, // min interval
|
||||
interval_units, // max interval
|
||||
adv_type,
|
||||
anonymous ? BT_ADDR_LE_RANDOM : BT_ADDR_LE_PUBLIC,
|
||||
&empty_addr,
|
||||
0b111, // channel map: channels 37, 38, 39
|
||||
0x00 // filter policy: no filter
|
||||
));
|
||||
|
||||
// The HCI commands expect MAX_ADVERTISEMENT_SIZE (31)octets,
|
||||
// even though the actual data length may be shorter.
|
||||
uint8_t full_data[MAX_ADVERTISEMENT_SIZE] = { 0 };
|
||||
memcpy(full_data, advertising_data, MIN(sizeof(full_data), advertising_data_len));
|
||||
hci_check_error(hci_le_set_advertising_data(advertising_data_len, full_data));
|
||||
memset(full_data, 0, sizeof(full_data));
|
||||
if (scan_response_data_len > 0) {
|
||||
memcpy(full_data, scan_response_data, MIN(sizeof(full_data), scan_response_data_len));
|
||||
hci_check_error(hci_le_set_scan_response_data(scan_response_data_len, full_data));
|
||||
}
|
||||
|
||||
// No duration mechanism is provided for legacy advertising, so we need to do our own.
|
||||
self->advertising_timeout_msecs = timeout * 1000;
|
||||
self->advertising_start_ticks = supervisor_ticks_ms64();
|
||||
|
||||
// Start advertising.
|
||||
hci_check_error(hci_le_set_advertising_enable(BT_HCI_LE_ADV_ENABLE));
|
||||
self->extended_advertising = false;
|
||||
} // end legacy advertising setup
|
||||
|
||||
vm_used_ble = true;
|
||||
self->now_advertising = true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self, bool connectable, bool anonymous, uint32_t timeout, mp_float_t interval, mp_buffer_info_t *advertising_data_bufinfo, mp_buffer_info_t *scan_response_data_bufinfo) {
|
||||
check_enabled(self);
|
||||
|
||||
// interval value has already been validated.
|
||||
|
||||
check_data_fit(advertising_data_bufinfo->len, connectable);
|
||||
check_data_fit(scan_response_data_bufinfo->len, connectable);
|
||||
|
||||
if (advertising_data_bufinfo->len > MAX_ADVERTISEMENT_SIZE && scan_response_data_bufinfo->len > 0) {
|
||||
mp_raise_bleio_BluetoothError(translate("Extended advertisements with scan response not supported."));
|
||||
}
|
||||
|
||||
// Anonymous mode requires a timeout so that we don't continue to broadcast
|
||||
// the same data while cycling the MAC address -- otherwise, what's the
|
||||
// point of randomizing the MAC address?
|
||||
if (timeout == 0 && anonymous) {
|
||||
timeout = MAX_ANONYMOUS_ADV_TIMEOUT_SECS;
|
||||
} else {
|
||||
if (timeout > MAX_LIMITED_DISCOVERABLE_ADV_TIMEOUT_SECS) {
|
||||
mp_raise_bleio_BluetoothError(translate("Timeout is too long: Maximum timeout length is %d seconds"),
|
||||
MAX_LIMITED_DISCOVERABLE_ADV_TIMEOUT_SECS);
|
||||
}
|
||||
}
|
||||
|
||||
const uint32_t result = _common_hal_bleio_adapter_start_advertising(
|
||||
self, connectable, anonymous, timeout, interval,
|
||||
advertising_data_bufinfo->buf,
|
||||
advertising_data_bufinfo->len,
|
||||
scan_response_data_bufinfo->buf,
|
||||
scan_response_data_bufinfo->len);
|
||||
|
||||
if (result) {
|
||||
mp_raise_bleio_BluetoothError(translate("Already advertising"));
|
||||
}
|
||||
self->circuitpython_advertising = false;
|
||||
}
|
||||
|
||||
void common_hal_bleio_adapter_stop_advertising(bleio_adapter_obj_t *self) {
|
||||
check_enabled(self);
|
||||
|
||||
self->now_advertising = false;
|
||||
self->extended_advertising = false;
|
||||
self->circuitpython_advertising = false;
|
||||
|
||||
int result = hci_le_set_advertising_enable(BT_HCI_LE_ADV_DISABLE);
|
||||
// OK if we're already stopped. There seems to be an ESP32 HCI bug:
|
||||
// If advertising is already off, then LE_SET_ADV_ENABLE does not return a response.
|
||||
if (result != HCI_RESPONSE_TIMEOUT) {
|
||||
hci_check_error(result);
|
||||
}
|
||||
|
||||
// TODO startup CircuitPython advertising again.
|
||||
}
|
||||
|
||||
// Note that something stopped advertising, such as a connection happening.
|
||||
// Don't ask the adapter to stop.
|
||||
void bleio_adapter_advertising_was_stopped(bleio_adapter_obj_t *self) {
|
||||
self->now_advertising = false;
|
||||
self->extended_advertising = false;
|
||||
self->circuitpython_advertising = false;
|
||||
}
|
||||
|
||||
bool common_hal_bleio_adapter_get_advertising(bleio_adapter_obj_t *self) {
|
||||
check_enabled(self);
|
||||
|
||||
return self->now_advertising;
|
||||
}
|
||||
|
||||
bool common_hal_bleio_adapter_get_connected(bleio_adapter_obj_t *self) {
|
||||
check_enabled(self);
|
||||
|
||||
for (size_t i = 0; i < BLEIO_TOTAL_CONNECTION_COUNT; i++) {
|
||||
bleio_connection_internal_t *connection = &bleio_connections[i];
|
||||
if (connection->conn_handle != BLE_CONN_HANDLE_INVALID) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
mp_obj_t common_hal_bleio_adapter_get_connections(bleio_adapter_obj_t *self) {
|
||||
check_enabled(self);
|
||||
|
||||
if (self->connection_objs != NULL) {
|
||||
return self->connection_objs;
|
||||
}
|
||||
size_t total_connected = 0;
|
||||
mp_obj_t items[BLEIO_TOTAL_CONNECTION_COUNT];
|
||||
for (size_t i = 0; i < BLEIO_TOTAL_CONNECTION_COUNT; i++) {
|
||||
bleio_connection_internal_t *connection = &bleio_connections[i];
|
||||
if (connection->conn_handle != BLE_CONN_HANDLE_INVALID) {
|
||||
if (connection->connection_obj == mp_const_none) {
|
||||
connection->connection_obj = bleio_connection_new_from_internal(connection);
|
||||
}
|
||||
items[total_connected] = connection->connection_obj;
|
||||
total_connected++;
|
||||
}
|
||||
}
|
||||
self->connection_objs = mp_obj_new_tuple(total_connected, items);
|
||||
return self->connection_objs;
|
||||
}
|
||||
|
||||
void common_hal_bleio_adapter_erase_bonding(bleio_adapter_obj_t *self) {
|
||||
// TODO
|
||||
mp_raise_NotImplementedError(NULL);
|
||||
check_enabled(self);
|
||||
|
||||
// FIX bonding_erase_storage();
|
||||
}
|
||||
|
||||
uint16_t bleio_adapter_add_attribute(bleio_adapter_obj_t *adapter, mp_obj_t *attribute) {
|
||||
check_enabled(adapter);
|
||||
|
||||
// The handle is the index of this attribute in the attributes list.
|
||||
uint16_t handle = (uint16_t)adapter->attributes->len;
|
||||
mp_obj_list_append(adapter->attributes, attribute);
|
||||
|
||||
if (mp_obj_is_type(attribute, &bleio_service_type)) {
|
||||
adapter->last_added_service_handle = handle;
|
||||
}
|
||||
if (mp_obj_is_type(attribute, &bleio_characteristic_type)) {
|
||||
adapter->last_added_characteristic_handle = handle;
|
||||
}
|
||||
|
||||
return handle;
|
||||
}
|
||||
|
||||
mp_obj_t *bleio_adapter_get_attribute(bleio_adapter_obj_t *adapter, uint16_t handle) {
|
||||
check_enabled(adapter);
|
||||
|
||||
if (handle == 0 || handle >= adapter->attributes->len) {
|
||||
return mp_const_none;
|
||||
}
|
||||
return adapter->attributes->items[handle];
|
||||
}
|
||||
|
||||
uint16_t bleio_adapter_max_attribute_handle(bleio_adapter_obj_t *adapter) {
|
||||
check_enabled(adapter);
|
||||
|
||||
return adapter->attributes->len - 1;
|
||||
}
|
||||
|
||||
|
||||
void bleio_adapter_gc_collect(bleio_adapter_obj_t *adapter) {
|
||||
gc_collect_root((void **)adapter, sizeof(bleio_adapter_obj_t) / sizeof(size_t));
|
||||
gc_collect_root((void **)bleio_connections, sizeof(bleio_connections) / sizeof(size_t));
|
||||
}
|
||||
|
||||
void bleio_adapter_reset(bleio_adapter_obj_t *adapter) {
|
||||
|
||||
if (!common_hal_bleio_adapter_get_enabled(adapter)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Adapter will be reset.
|
||||
common_hal_bleio_adapter_set_enabled(adapter, false);
|
||||
|
||||
adapter->connection_objs = NULL;
|
||||
for (size_t i = 0; i < BLEIO_TOTAL_CONNECTION_COUNT; i++) {
|
||||
bleio_connection_internal_t *connection = &bleio_connections[i];
|
||||
// Disconnect all connections with Python state cleanly. Keep any supervisor-only connections.
|
||||
if (connection->connection_obj != mp_const_none &&
|
||||
connection->conn_handle != BLE_CONN_HANDLE_INVALID) {
|
||||
common_hal_bleio_connection_disconnect(connection);
|
||||
}
|
||||
connection->connection_obj = mp_const_none;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void bleio_adapter_background(bleio_adapter_obj_t *adapter) {
|
||||
if (!common_hal_bleio_adapter_get_enabled(adapter)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (adapter->advertising_timeout_msecs > 0 &&
|
||||
supervisor_ticks_ms64() - adapter->advertising_start_ticks > adapter->advertising_timeout_msecs) {
|
||||
adapter->advertising_timeout_msecs = 0;
|
||||
common_hal_bleio_adapter_stop_advertising(adapter);
|
||||
}
|
||||
|
||||
hci_result_t result = hci_poll_for_incoming_pkt();
|
||||
if (result != HCI_OK) {
|
||||
mp_printf(&mp_plat_print, "bad hci_poll_for_incoming_pkt() result in background: %d\n", result);
|
||||
}
|
||||
}
|
||||
99
devices/ble_hci/common-hal/_bleio/Adapter.h
Normal file
99
devices/ble_hci/common-hal/_bleio/Adapter.h
Normal file
|
|
@ -0,0 +1,99 @@
|
|||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2018 Dan Halbert for Adafruit Industries
|
||||
* Copyright (c) 2018 Artur Pacholec
|
||||
* Copyright (c) 2016 Glenn Ruben Bakke
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef MICROPY_INCLUDED_BLE_HCI_COMMON_HAL_ADAPTER_H
|
||||
#define MICROPY_INCLUDED_BLE_HCI_COMMON_HAL_ADAPTER_H
|
||||
|
||||
#include "py/obj.h"
|
||||
#include "py/objtuple.h"
|
||||
|
||||
#include "shared-bindings/_bleio/Characteristic.h"
|
||||
#include "shared-bindings/_bleio/Connection.h"
|
||||
#include "shared-bindings/_bleio/ScanResults.h"
|
||||
#include "shared-bindings/busio/UART.h"
|
||||
#include "shared-bindings/digitalio/DigitalInOut.h"
|
||||
|
||||
#ifndef BLEIO_TOTAL_CONNECTION_COUNT
|
||||
#define BLEIO_TOTAL_CONNECTION_COUNT 5
|
||||
#endif
|
||||
|
||||
extern bleio_connection_internal_t bleio_connections[BLEIO_TOTAL_CONNECTION_COUNT];
|
||||
|
||||
typedef struct _bleio_adapter_obj_t {
|
||||
mp_obj_base_t base;
|
||||
bleio_scanresults_obj_t *scan_results;
|
||||
mp_obj_t name;
|
||||
mp_obj_tuple_t *connection_objs;
|
||||
busio_uart_obj_t *hci_uart;
|
||||
digitalio_digitalinout_obj_t *rts_digitalinout;
|
||||
digitalio_digitalinout_obj_t *cts_digitalinout;
|
||||
bool allocated; // True when in use.
|
||||
bool now_advertising;
|
||||
bool extended_advertising;
|
||||
bool circuitpython_advertising;
|
||||
bool enabled;
|
||||
|
||||
// HCI adapter version info.
|
||||
uint8_t hci_version;
|
||||
uint8_t lmp_version;
|
||||
uint16_t hci_revision;
|
||||
uint16_t manufacturer;
|
||||
uint16_t lmp_subversion;
|
||||
|
||||
// Used to monitor advertising timeout for legacy avertising.
|
||||
uint64_t advertising_start_ticks;
|
||||
uint64_t advertising_timeout_msecs; // If zero, do not check.
|
||||
|
||||
// Generic services characteristics.
|
||||
bleio_characteristic_obj_t *device_name_characteristic;
|
||||
bleio_characteristic_obj_t *appearance_characteristic;
|
||||
bleio_characteristic_obj_t *service_changed_characteristic;
|
||||
|
||||
uint16_t max_acl_buffer_len;
|
||||
uint16_t max_acl_num_buffers;
|
||||
uint16_t max_adv_data_len;
|
||||
uint8_t features[8]; // Supported BLE features.
|
||||
|
||||
// All the local attributes for this device. The index into the list
|
||||
// corresponds to the handle.
|
||||
mp_obj_list_t *attributes;
|
||||
// Handle for last added service. Characteristics can only be added immediately after
|
||||
// the service they belong to. This vets that.
|
||||
uint16_t last_added_service_handle;
|
||||
uint16_t last_added_characteristic_handle;
|
||||
} bleio_adapter_obj_t;
|
||||
|
||||
uint16_t bleio_adapter_add_attribute(bleio_adapter_obj_t *adapter, mp_obj_t *attribute);
|
||||
void bleio_adapter_advertising_was_stopped(bleio_adapter_obj_t *self);
|
||||
mp_obj_t *bleio_adapter_get_attribute(bleio_adapter_obj_t *adapter, uint16_t handle);
|
||||
uint16_t bleio_adapter_max_attribute_handle(bleio_adapter_obj_t *adapter);
|
||||
void bleio_adapter_background(bleio_adapter_obj_t *adapter);
|
||||
void bleio_adapter_gc_collect(bleio_adapter_obj_t *adapter);
|
||||
void bleio_adapter_reset(bleio_adapter_obj_t *adapter);
|
||||
|
||||
#endif // MICROPY_INCLUDED_BLE_HCI_COMMON_HAL_ADAPTER_H
|
||||
49
devices/ble_hci/common-hal/_bleio/Attribute.c
Normal file
49
devices/ble_hci/common-hal/_bleio/Attribute.c
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2019 Dan Halbert for Adafruit Industries
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "py/runtime.h"
|
||||
|
||||
#include "shared-bindings/_bleio/Attribute.h"
|
||||
#include "shared-bindings/_bleio/Characteristic.h"
|
||||
#include "shared-bindings/_bleio/Descriptor.h"
|
||||
#include "shared-bindings/_bleio/Service.h"
|
||||
|
||||
|
||||
bleio_uuid_obj_t *bleio_attribute_get_uuid(mp_obj_t *attribute) {
|
||||
if (mp_obj_is_type(attribute, &bleio_characteristic_type)) {
|
||||
bleio_characteristic_obj_t *characteristic = MP_OBJ_TO_PTR(attribute);
|
||||
return characteristic->uuid;
|
||||
}
|
||||
if (mp_obj_is_type(attribute, &bleio_descriptor_type)) {
|
||||
bleio_descriptor_obj_t *descriptor = MP_OBJ_TO_PTR(attribute);
|
||||
return descriptor->uuid;
|
||||
}
|
||||
if (mp_obj_is_type(attribute, &bleio_service_type)) {
|
||||
bleio_service_obj_t *service = MP_OBJ_TO_PTR(attribute);
|
||||
return service->uuid;
|
||||
}
|
||||
mp_raise_RuntimeError(translate("Invalid BLE attribute"));
|
||||
}
|
||||
35
devices/ble_hci/common-hal/_bleio/Attribute.h
Normal file
35
devices/ble_hci/common-hal/_bleio/Attribute.h
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2020 Dan Halbert for Adafruit Industries
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef MICROPY_INCLUDED_BLE_HCI_COMMON_HAL_ATTRIBUTE_H
|
||||
#define MICROPY_INCLUDED_BLE_HCI_COMMON_HAL_ATTRIBUTE_H
|
||||
|
||||
#include "shared-module/_bleio/Attribute.h"
|
||||
#include "shared-bindings/_bleio/UUID.h"
|
||||
|
||||
bleio_uuid_obj_t *bleio_attribute_get_uuid(mp_obj_t *attribute);
|
||||
|
||||
#endif // MICROPY_INCLUDED_BLE_HCI_COMMON_HAL_ATTRIBUTE_H
|
||||
232
devices/ble_hci/common-hal/_bleio/Characteristic.c
Normal file
232
devices/ble_hci/common-hal/_bleio/Characteristic.c
Normal file
|
|
@ -0,0 +1,232 @@
|
|||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) Dan Halbert for Adafruit Industries
|
||||
* Copyright (c) 2018 Artur Pacholec
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "py/runtime.h"
|
||||
|
||||
#include "shared-bindings/_bleio/__init__.h"
|
||||
#include "shared-bindings/_bleio/Characteristic.h"
|
||||
#include "shared-bindings/_bleio/CharacteristicBuffer.h"
|
||||
#include "shared-bindings/_bleio/Descriptor.h"
|
||||
#include "shared-bindings/_bleio/PacketBuffer.h"
|
||||
#include "shared-bindings/_bleio/Service.h"
|
||||
|
||||
#include "common-hal/_bleio/Adapter.h"
|
||||
#include "common-hal/_bleio/att.h"
|
||||
|
||||
#define CCCD_NOTIFY 0x1
|
||||
#define CCCD_INDICATE 0x2
|
||||
|
||||
|
||||
void common_hal_bleio_characteristic_construct(bleio_characteristic_obj_t *self, bleio_service_obj_t *service, uint16_t handle, bleio_uuid_obj_t *uuid, bleio_characteristic_properties_t props, bleio_attribute_security_mode_t read_perm, bleio_attribute_security_mode_t write_perm, mp_int_t max_length, bool fixed_length, mp_buffer_info_t *initial_value_bufinfo) {
|
||||
self->service = service;
|
||||
self->uuid = uuid;
|
||||
self->decl_handle = BLE_GATT_HANDLE_INVALID;
|
||||
self->handle = BLE_GATT_HANDLE_INVALID;
|
||||
self->props = props;
|
||||
self->read_perm = read_perm;
|
||||
self->write_perm = write_perm;
|
||||
self->descriptor_list = mp_obj_new_list(0, NULL);
|
||||
self->observer = mp_const_none;
|
||||
self->user_desc = NULL;
|
||||
self->cccd = NULL;
|
||||
self->sccd = NULL;
|
||||
self->value = mp_obj_new_bytes(initial_value_bufinfo->buf, initial_value_bufinfo->len);
|
||||
|
||||
const mp_int_t max_length_max = 512;
|
||||
if (max_length < 0 || max_length > max_length_max) {
|
||||
mp_raise_ValueError(translate("max_length must be <= 512"));
|
||||
}
|
||||
self->max_length = max_length;
|
||||
self->fixed_length = fixed_length;
|
||||
|
||||
if (service->is_remote) {
|
||||
self->handle = handle;
|
||||
} else {
|
||||
common_hal_bleio_service_add_characteristic(self->service, self, initial_value_bufinfo);
|
||||
}
|
||||
}
|
||||
|
||||
mp_obj_tuple_t *common_hal_bleio_characteristic_get_descriptors(bleio_characteristic_obj_t *self) {
|
||||
return mp_obj_new_tuple(self->descriptor_list->len, self->descriptor_list->items);
|
||||
}
|
||||
|
||||
bleio_service_obj_t *common_hal_bleio_characteristic_get_service(bleio_characteristic_obj_t *self) {
|
||||
return self->service;
|
||||
}
|
||||
|
||||
size_t common_hal_bleio_characteristic_get_max_length(bleio_characteristic_obj_t *self) {
|
||||
return self->max_length;
|
||||
}
|
||||
|
||||
size_t common_hal_bleio_characteristic_get_value(bleio_characteristic_obj_t *self, uint8_t *buf, size_t len) {
|
||||
// Do GATT operations only if this characteristic has been added to a registered service.
|
||||
if (self->handle != BLE_GATT_HANDLE_INVALID) {
|
||||
// FIX uint16_t conn_handle = bleio_connection_get_conn_handle(self->service->connection);
|
||||
if (common_hal_bleio_service_get_is_remote(self->service)) {
|
||||
// FIX read remote chars
|
||||
// uint8_t rsp[MAX(len, 512)];
|
||||
// FIX improve att_read_req to write into our requested buffer.
|
||||
// return att_read_req(conn_handle, self->handle, rsp);
|
||||
return 0; // FIX
|
||||
} else {
|
||||
mp_buffer_info_t bufinfo;
|
||||
if (!mp_get_buffer(self->value, &bufinfo, MP_BUFFER_READ)) {
|
||||
return 0;
|
||||
}
|
||||
const size_t actual_length = MIN(len, bufinfo.len);
|
||||
memcpy(buf, bufinfo.buf, actual_length);
|
||||
return actual_length;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void common_hal_bleio_characteristic_set_value(bleio_characteristic_obj_t *self, mp_buffer_info_t *bufinfo) {
|
||||
if (self->fixed_length && bufinfo->len != self->max_length) {
|
||||
mp_raise_ValueError(translate("Value length != required fixed length"));
|
||||
}
|
||||
if (bufinfo->len > self->max_length) {
|
||||
mp_raise_ValueError(translate("Value length > max_length"));
|
||||
}
|
||||
|
||||
// Do GATT operations only if this characteristic has been added to a registered service.
|
||||
if (self->handle != BLE_GATT_HANDLE_INVALID) {
|
||||
if (common_hal_bleio_service_get_is_remote(self->service)) {
|
||||
// FIX uint16_t conn_handle = bleio_connection_get_conn_handle(self->service->connection);
|
||||
if (self->props & CHAR_PROP_WRITE) {
|
||||
// FIX writing remote chars
|
||||
// uint8_t rsp[sizeof(bt_att_error_rsp)];
|
||||
// att_write_req(conn_handle, self->handle, bufinfo->buf, bufinfo->len, rsp);
|
||||
} else if (self->props & CHAR_PROP_WRITE_NO_RESPONSE) {
|
||||
// att_write_cmd(conn_handle, self->handle, bufinfo->buff, bufinfo->len);
|
||||
} else {
|
||||
mp_raise_bleio_BluetoothError(translate("Characteristic not writable"));
|
||||
}
|
||||
} else {
|
||||
// Always write the value locally even if no connections are active.
|
||||
bleio_characteristic_set_local_value(self, bufinfo);
|
||||
// Notify or indicate all active connections.
|
||||
|
||||
uint16_t cccd_value = 0;
|
||||
mp_buffer_info_t cccd_bufinfo = {
|
||||
.buf = &cccd_value,
|
||||
.len = sizeof(cccd_value),
|
||||
};
|
||||
|
||||
const bool notify = self->props & CHAR_PROP_NOTIFY;
|
||||
const bool indicate = self->props & CHAR_PROP_INDICATE;
|
||||
// Read the CCCD value, if there is one.
|
||||
if ((notify | indicate) && self->cccd != NULL) {
|
||||
common_hal_bleio_descriptor_get_value(self->cccd, cccd_bufinfo.buf, cccd_bufinfo.len);
|
||||
}
|
||||
|
||||
// It's possible that both notify and indicate are set.
|
||||
if (notify && (cccd_value & CCCD_NOTIFY)) {
|
||||
att_notify(self->handle, bufinfo->buf, MIN(bufinfo->len, self->max_length));
|
||||
}
|
||||
if (indicate && (cccd_value & CCCD_INDICATE)) {
|
||||
att_indicate(self->handle, bufinfo->buf, MIN(bufinfo->len, self->max_length));
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bleio_uuid_obj_t *common_hal_bleio_characteristic_get_uuid(bleio_characteristic_obj_t *self) {
|
||||
return self->uuid;
|
||||
}
|
||||
|
||||
bleio_characteristic_properties_t common_hal_bleio_characteristic_get_properties(bleio_characteristic_obj_t *self) {
|
||||
return self->props;
|
||||
}
|
||||
|
||||
void common_hal_bleio_characteristic_add_descriptor(bleio_characteristic_obj_t *self, bleio_descriptor_obj_t *descriptor) {
|
||||
if (self->handle != common_hal_bleio_adapter_obj.last_added_characteristic_handle) {
|
||||
mp_raise_bleio_BluetoothError(
|
||||
translate("Descriptor can only be added to most recently added characteristic"));
|
||||
}
|
||||
|
||||
descriptor->handle = bleio_adapter_add_attribute(&common_hal_bleio_adapter_obj, MP_OBJ_TO_PTR(descriptor));
|
||||
// Include this descriptor in the service handle's range.
|
||||
self->service->end_handle = descriptor->handle;
|
||||
|
||||
mp_obj_list_append(MP_OBJ_FROM_PTR(self->descriptor_list),
|
||||
MP_OBJ_FROM_PTR(descriptor));
|
||||
}
|
||||
|
||||
void common_hal_bleio_characteristic_set_cccd(bleio_characteristic_obj_t *self, bool notify, bool indicate) {
|
||||
if (self->cccd == NULL) {
|
||||
mp_raise_bleio_BluetoothError(translate("No CCCD for this Characteristic"));
|
||||
}
|
||||
|
||||
if (!common_hal_bleio_service_get_is_remote(self->service)) {
|
||||
mp_raise_bleio_RoleError(translate("Can't set CCCD on local Characteristic"));
|
||||
}
|
||||
|
||||
const uint16_t conn_handle = bleio_connection_get_conn_handle(self->service->connection);
|
||||
common_hal_bleio_check_connected(conn_handle);
|
||||
|
||||
uint16_t cccd_value =
|
||||
(notify ? CCCD_NOTIFY : 0) |
|
||||
(indicate ? CCCD_INDICATE : 0);
|
||||
|
||||
// FIX do remote
|
||||
(void)cccd_value;
|
||||
// uint8_t rsp[sizeof(bt_att_error_rsp)];
|
||||
// if (att_write_req(conn_handle, self->cccd->handle, &cccd_value, sizeof(cccd_value)) == 0) {
|
||||
// mp_raise_bleio_BluetoothError(translate("Could not write CCCD"));
|
||||
// }
|
||||
}
|
||||
|
||||
bool bleio_characteristic_set_local_value(bleio_characteristic_obj_t *self, mp_buffer_info_t *bufinfo) {
|
||||
if (self->fixed_length && bufinfo->len != self->max_length) {
|
||||
return false;
|
||||
}
|
||||
if (bufinfo->len > self->max_length) {
|
||||
return false;
|
||||
}
|
||||
|
||||
self->value = mp_obj_new_bytes(bufinfo->buf, bufinfo->len);
|
||||
|
||||
if (mp_obj_is_type(self->observer, &bleio_characteristic_buffer_type)) {
|
||||
bleio_characteristic_buffer_update(MP_OBJ_FROM_PTR(self->observer), bufinfo);
|
||||
} else if (mp_obj_is_type(self->observer, &bleio_packet_buffer_type)) {
|
||||
bleio_packet_buffer_update(MP_OBJ_FROM_PTR(self->observer), bufinfo);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void bleio_characteristic_set_observer(bleio_characteristic_obj_t *self, mp_obj_t observer) {
|
||||
self->observer = observer;
|
||||
}
|
||||
|
||||
void bleio_characteristic_clear_observer(bleio_characteristic_obj_t *self) {
|
||||
self->observer = mp_const_none;
|
||||
}
|
||||
63
devices/ble_hci/common-hal/_bleio/Characteristic.h
Normal file
63
devices/ble_hci/common-hal/_bleio/Characteristic.h
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2019 Dan Halbert for Adafruit Industries
|
||||
* Copyright (c) 2018 Artur Pacholec
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef MICROPY_INCLUDED_BLE_HCI_COMMON_HAL_CHARACTERISTIC_H
|
||||
#define MICROPY_INCLUDED_BLE_HCI_COMMON_HAL_CHARACTERISTIC_H
|
||||
|
||||
#include "shared-bindings/_bleio/Attribute.h"
|
||||
#include "common-hal/_bleio/Descriptor.h"
|
||||
#include "shared-module/_bleio/Characteristic.h"
|
||||
#include "common-hal/_bleio/Service.h"
|
||||
#include "common-hal/_bleio/UUID.h"
|
||||
|
||||
typedef struct _bleio_characteristic_obj {
|
||||
mp_obj_base_t base;
|
||||
// Will be MP_OBJ_NULL before being assigned to a Service.
|
||||
bleio_service_obj_t *service;
|
||||
bleio_uuid_obj_t *uuid;
|
||||
mp_obj_t value;
|
||||
mp_obj_t observer;
|
||||
mp_obj_list_t *descriptor_list;
|
||||
uint16_t max_length;
|
||||
bool fixed_length;
|
||||
uint16_t decl_handle;
|
||||
uint16_t handle; // Should be decl_handle+1.
|
||||
bleio_characteristic_properties_t props;
|
||||
bleio_attribute_security_mode_t read_perm;
|
||||
bleio_attribute_security_mode_t write_perm;
|
||||
bleio_descriptor_obj_t *descriptor_linked_list;
|
||||
bleio_descriptor_obj_t *user_desc;
|
||||
bleio_descriptor_obj_t *cccd;
|
||||
bleio_descriptor_obj_t *sccd;
|
||||
} bleio_characteristic_obj_t;
|
||||
|
||||
bool bleio_characteristic_set_local_value(bleio_characteristic_obj_t *self, mp_buffer_info_t *bufinfo);
|
||||
|
||||
void bleio_characteristic_set_observer(bleio_characteristic_obj_t *self, mp_obj_t observer);
|
||||
void bleio_characteristic_clear_observer(bleio_characteristic_obj_t *self);
|
||||
|
||||
#endif // MICROPY_INCLUDED_BLE_HCI_COMMON_HAL_CHARACTERISTIC_H
|
||||
104
devices/ble_hci/common-hal/_bleio/CharacteristicBuffer.c
Normal file
104
devices/ble_hci/common-hal/_bleio/CharacteristicBuffer.c
Normal file
|
|
@ -0,0 +1,104 @@
|
|||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2019 Dan Halbert for Adafruit Industries
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "lib/utils/interrupt_char.h"
|
||||
#include "py/runtime.h"
|
||||
#include "py/stream.h"
|
||||
|
||||
#include "shared-bindings/_bleio/__init__.h"
|
||||
#include "shared-bindings/_bleio/Connection.h"
|
||||
#include "supervisor/shared/tick.h"
|
||||
#include "common-hal/_bleio/CharacteristicBuffer.h"
|
||||
|
||||
// Push all the data onto the ring buffer. When the buffer is full, new bytes will be dropped.
|
||||
STATIC void write_to_ringbuf(bleio_characteristic_buffer_obj_t *self, uint8_t *data, uint16_t len) {
|
||||
ringbuf_put_n(&self->ringbuf, data, len);
|
||||
}
|
||||
|
||||
void bleio_characteristic_buffer_update(bleio_characteristic_buffer_obj_t *self, mp_buffer_info_t *bufinfo) {
|
||||
write_to_ringbuf(self, bufinfo->buf, bufinfo->len);
|
||||
}
|
||||
|
||||
// Assumes that timeout and buffer_size have been validated before call.
|
||||
void common_hal_bleio_characteristic_buffer_construct(bleio_characteristic_buffer_obj_t *self,
|
||||
bleio_characteristic_obj_t *characteristic,
|
||||
mp_float_t timeout,
|
||||
size_t buffer_size) {
|
||||
|
||||
self->characteristic = characteristic;
|
||||
self->timeout_ms = timeout * 1000;
|
||||
// This is a macro.
|
||||
// true means long-lived, so it won't be moved.
|
||||
ringbuf_alloc(&self->ringbuf, buffer_size, true);
|
||||
|
||||
bleio_characteristic_set_observer(characteristic, self);
|
||||
}
|
||||
|
||||
uint32_t common_hal_bleio_characteristic_buffer_read(bleio_characteristic_buffer_obj_t *self, uint8_t *data, size_t len, int *errcode) {
|
||||
uint64_t start_ticks = supervisor_ticks_ms64();
|
||||
|
||||
// Wait for all bytes received or timeout
|
||||
while ((ringbuf_num_filled(&self->ringbuf) < len) && (supervisor_ticks_ms64() - start_ticks < self->timeout_ms)) {
|
||||
RUN_BACKGROUND_TASKS;
|
||||
// Allow user to break out of a timeout with a KeyboardInterrupt.
|
||||
if (mp_hal_is_interrupted()) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t num_bytes_read = ringbuf_get_n(&self->ringbuf, data, len);
|
||||
return num_bytes_read;
|
||||
}
|
||||
|
||||
uint32_t common_hal_bleio_characteristic_buffer_rx_characters_available(bleio_characteristic_buffer_obj_t *self) {
|
||||
uint16_t count = ringbuf_num_filled(&self->ringbuf);
|
||||
return count;
|
||||
}
|
||||
|
||||
void common_hal_bleio_characteristic_buffer_clear_rx_buffer(bleio_characteristic_buffer_obj_t *self) {
|
||||
ringbuf_clear(&self->ringbuf);
|
||||
}
|
||||
|
||||
bool common_hal_bleio_characteristic_buffer_deinited(bleio_characteristic_buffer_obj_t *self) {
|
||||
return self->characteristic == NULL;
|
||||
}
|
||||
|
||||
void common_hal_bleio_characteristic_buffer_deinit(bleio_characteristic_buffer_obj_t *self) {
|
||||
if (!common_hal_bleio_characteristic_buffer_deinited(self)) {
|
||||
bleio_characteristic_clear_observer(self->characteristic);
|
||||
}
|
||||
}
|
||||
|
||||
bool common_hal_bleio_characteristic_buffer_connected(bleio_characteristic_buffer_obj_t *self) {
|
||||
return self->characteristic != NULL &&
|
||||
self->characteristic->service != NULL &&
|
||||
(!self->characteristic->service->is_remote ||
|
||||
(self->characteristic->service->connection != MP_OBJ_NULL &&
|
||||
common_hal_bleio_connection_get_connected(self->characteristic->service->connection)));
|
||||
}
|
||||
43
devices/ble_hci/common-hal/_bleio/CharacteristicBuffer.h
Normal file
43
devices/ble_hci/common-hal/_bleio/CharacteristicBuffer.h
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2019 Dan Halbert for Adafruit Industries
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef MICROPY_INCLUDED_BLE_HCI_COMMON_HAL_CHARACTERISTICBUFFER_H
|
||||
#define MICROPY_INCLUDED_BLE_HCI_COMMON_HAL_CHARACTERISTICBUFFER_H
|
||||
|
||||
#include "py/ringbuf.h"
|
||||
#include "shared-bindings/_bleio/Characteristic.h"
|
||||
|
||||
typedef struct {
|
||||
mp_obj_base_t base;
|
||||
bleio_characteristic_obj_t *characteristic;
|
||||
uint32_t timeout_ms;
|
||||
// Ring buffer storing consecutive incoming values.
|
||||
ringbuf_t ringbuf;
|
||||
} bleio_characteristic_buffer_obj_t;
|
||||
|
||||
void bleio_characteristic_buffer_update(bleio_characteristic_buffer_obj_t *self, mp_buffer_info_t *bufinfo);
|
||||
|
||||
#endif // MICROPY_INCLUDED_BLE_HCI_COMMON_HAL_CHARACTERISTICBUFFER_H
|
||||
772
devices/ble_hci/common-hal/_bleio/Connection.c
Normal file
772
devices/ble_hci/common-hal/_bleio/Connection.c
Normal file
|
|
@ -0,0 +1,772 @@
|
|||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2018 Dan Halbert for Adafruit Industries
|
||||
* Copyright (c) 2018 Artur Pacholec
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "shared-bindings/_bleio/Connection.h"
|
||||
|
||||
#include "att.h"
|
||||
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "lib/utils/interrupt_char.h"
|
||||
#include "py/gc.h"
|
||||
#include "py/objlist.h"
|
||||
#include "py/objstr.h"
|
||||
#include "py/qstr.h"
|
||||
#include "py/runtime.h"
|
||||
#include "shared-bindings/_bleio/__init__.h"
|
||||
#include "shared-bindings/_bleio/Adapter.h"
|
||||
#include "shared-bindings/_bleio/Attribute.h"
|
||||
#include "shared-bindings/_bleio/Characteristic.h"
|
||||
#include "shared-bindings/_bleio/Service.h"
|
||||
#include "shared-bindings/_bleio/UUID.h"
|
||||
#include "supervisor/shared/tick.h"
|
||||
|
||||
#define BLE_ADV_LENGTH_FIELD_SIZE 1
|
||||
#define BLE_ADV_AD_TYPE_FIELD_SIZE 1
|
||||
#define BLE_AD_TYPE_FLAGS_DATA_SIZE 1
|
||||
|
||||
// static const ble_gap_sec_params_t pairing_sec_params = {
|
||||
// .bond = 1,
|
||||
// .mitm = 0,
|
||||
// .lesc = 0,
|
||||
// .keypress = 0,
|
||||
// .oob = 0,
|
||||
// .io_caps = BLE_GAP_IO_CAPS_NONE,
|
||||
// .min_key_size = 7,
|
||||
// .max_key_size = 16,
|
||||
// .kdist_own = { .enc = 1, .id = 1},
|
||||
// .kdist_peer = { .enc = 1, .id = 1},
|
||||
// };
|
||||
|
||||
#define CONNECTION_DEBUG (1)
|
||||
#if CONNECTION_DEBUG
|
||||
#define CONNECTION_DEBUG_PRINTF(...) printf(__VA_ARGS__)
|
||||
#else
|
||||
#define CONNECTION_DEBUG_PRINTF(...)
|
||||
#endif
|
||||
|
||||
static volatile bool m_discovery_in_process;
|
||||
static volatile bool m_discovery_successful;
|
||||
|
||||
// FIX static bleio_service_obj_t *m_char_discovery_service;
|
||||
// FIX static bleio_characteristic_obj_t *m_desc_discovery_characteristic;
|
||||
|
||||
// bool connection_on_ble_evt(ble_evt_t *ble_evt, void *self_in) {
|
||||
// bleio_connection_internal_t *self = (bleio_connection_internal_t*)self_in;
|
||||
|
||||
// if (BLE_GAP_EVT_BASE <= ble_evt->header.evt_id && ble_evt->header.evt_id <= BLE_GAP_EVT_LAST &&
|
||||
// ble_evt->evt.gap_evt.conn_handle != self->conn_handle) {
|
||||
// return false;
|
||||
// }
|
||||
// if (BLE_GATTS_EVT_BASE <= ble_evt->header.evt_id && ble_evt->header.evt_id <= BLE_GATTS_EVT_LAST &&
|
||||
// ble_evt->evt.gatts_evt.conn_handle != self->conn_handle) {
|
||||
// return false;
|
||||
// }
|
||||
|
||||
// switch (ble_evt->header.evt_id) {
|
||||
// case BLE_GAP_EVT_DISCONNECTED:
|
||||
// // Adapter.c does the work for this event.
|
||||
// break;
|
||||
|
||||
// case BLE_GAP_EVT_PHY_UPDATE_REQUEST: {
|
||||
// ble_gap_phys_t const phys = {
|
||||
// .rx_phys = BLE_GAP_PHY_AUTO,
|
||||
// .tx_phys = BLE_GAP_PHY_AUTO,
|
||||
// };
|
||||
// sd_ble_gap_phy_update(ble_evt->evt.gap_evt.conn_handle, &phys);
|
||||
// break;
|
||||
// }
|
||||
|
||||
// case BLE_GAP_EVT_PHY_UPDATE: { // 0x22
|
||||
// break;
|
||||
// }
|
||||
|
||||
// case BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST:
|
||||
// // SoftDevice will respond to a length update request.
|
||||
// sd_ble_gap_data_length_update(self->conn_handle, NULL, NULL);
|
||||
// break;
|
||||
|
||||
// case BLE_GAP_EVT_DATA_LENGTH_UPDATE: { // 0x24
|
||||
// break;
|
||||
// }
|
||||
|
||||
// case BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST: {
|
||||
// ble_gatts_evt_exchange_mtu_request_t *request =
|
||||
// &ble_evt->evt.gatts_evt.params.exchange_mtu_request;
|
||||
|
||||
// uint16_t new_mtu = BLE_GATTS_VAR_ATTR_LEN_MAX;
|
||||
// if (request->client_rx_mtu < new_mtu) {
|
||||
// new_mtu = request->client_rx_mtu;
|
||||
// }
|
||||
// if (new_mtu < BLE_GATT_ATT_MTU_DEFAULT) {
|
||||
// new_mtu = BLE_GATT_ATT_MTU_DEFAULT;
|
||||
// }
|
||||
// if (self->mtu > 0) {
|
||||
// new_mtu = self->mtu;
|
||||
// }
|
||||
|
||||
// self->mtu = new_mtu;
|
||||
// sd_ble_gatts_exchange_mtu_reply(self->conn_handle, new_mtu);
|
||||
// break;
|
||||
// }
|
||||
|
||||
|
||||
// case BLE_GATTC_EVT_EXCHANGE_MTU_RSP: {
|
||||
// ble_gattc_evt_exchange_mtu_rsp_t *response =
|
||||
// &ble_evt->evt.gattc_evt.params.exchange_mtu_rsp;
|
||||
|
||||
// self->mtu = response->server_rx_mtu;
|
||||
// break;
|
||||
// }
|
||||
|
||||
// case BLE_GATTS_EVT_WRITE:
|
||||
// // A client wrote a value.
|
||||
// // If we are bonded and it's a CCCD (UUID 0x2902), store the CCCD value.
|
||||
// if (self->conn_handle != BLE_CONN_HANDLE_INVALID &&
|
||||
// self->pair_status == PAIR_PAIRED &&
|
||||
// ble_evt->evt.gatts_evt.params.write.uuid.type == BLE_UUID_TYPE_BLE &&
|
||||
// ble_evt->evt.gatts_evt.params.write.uuid.uuid == 0x2902) {
|
||||
// //
|
||||
// // Save sys_attr data (CCCD state) in bonding area at
|
||||
// // next opportunity, but also remember time of this
|
||||
// // request, so we can consolidate closely-spaced requests.
|
||||
// self->do_bond_cccds = true;
|
||||
// self->do_bond_cccds_request_time = supervisor_ticks_ms64();
|
||||
// }
|
||||
// // Return false so other handlers get this event as well.
|
||||
// return false;
|
||||
|
||||
// case BLE_GATTS_EVT_SYS_ATTR_MISSING:
|
||||
// sd_ble_gatts_sys_attr_set(self->conn_handle, NULL, 0, 0);
|
||||
// break;
|
||||
|
||||
// #if CIRCUITPY_VERBOSE_BLE
|
||||
// // Use read authorization to snoop on all reads when doing verbose debugging.
|
||||
// case BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST: {
|
||||
|
||||
// ble_gatts_evt_rw_authorize_request_t *request =
|
||||
// &ble_evt->evt.gatts_evt.params.authorize_request;
|
||||
|
||||
// mp_printf(&mp_plat_print, "Read %x offset %d ", request->request.read.handle, request->request.read.offset);
|
||||
// uint8_t value_bytes[22];
|
||||
// ble_gatts_value_t value;
|
||||
// value.offset = request->request.read.offset;
|
||||
// value.len = 22;
|
||||
// value.p_value = value_bytes;
|
||||
|
||||
// sd_ble_gatts_value_get(self->conn_handle, request->request.read.handle, &value);
|
||||
// size_t len = value.len;
|
||||
// if (len > 22) {
|
||||
// len = 22;
|
||||
// }
|
||||
// for (uint8_t i = 0; i < len; i++) {
|
||||
// mp_printf(&mp_plat_print, " %02x", value_bytes[i]);
|
||||
// }
|
||||
// mp_printf(&mp_plat_print, "\n");
|
||||
// ble_gatts_rw_authorize_reply_params_t reply;
|
||||
// reply.type = request->type;
|
||||
// reply.params.read.gatt_status = BLE_GATT_STATUS_SUCCESS;
|
||||
// reply.params.read.update = false;
|
||||
// reply.params.read.offset = request->request.read.offset;
|
||||
// sd_ble_gatts_rw_authorize_reply(self->conn_handle, &reply);
|
||||
// break;
|
||||
// }
|
||||
// #endif
|
||||
|
||||
// case BLE_GATTS_EVT_HVN_TX_COMPLETE: // Capture this for now. 0x55
|
||||
// break;
|
||||
// case BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST: {
|
||||
// self->conn_params_updating = true;
|
||||
// ble_gap_evt_conn_param_update_request_t *request =
|
||||
// &ble_evt->evt.gap_evt.params.conn_param_update_request;
|
||||
// sd_ble_gap_conn_param_update(self->conn_handle, &request->conn_params);
|
||||
// break;
|
||||
// }
|
||||
// case BLE_GAP_EVT_CONN_PARAM_UPDATE: { // 0x12
|
||||
// ble_gap_evt_conn_param_update_t *result =
|
||||
// &ble_evt->evt.gap_evt.params.conn_param_update;
|
||||
|
||||
// #if CIRCUITPY_VERBOSE_BLE
|
||||
// ble_gap_conn_params_t *cp = &ble_evt->evt.gap_evt.params.conn_param_update.conn_params;
|
||||
// mp_printf(&mp_plat_print, "conn params updated: min_ci %d max_ci %d s_l %d sup_timeout %d\n", cp->min_conn_interval, cp->max_conn_interval, cp->slave_latency, cp->conn_sup_timeout);
|
||||
// #endif
|
||||
|
||||
// memcpy(&self->conn_params, &result->conn_params, sizeof(ble_gap_conn_params_t));
|
||||
// self->conn_params_updating = false;
|
||||
// break;
|
||||
// }
|
||||
// case BLE_GAP_EVT_SEC_PARAMS_REQUEST: {
|
||||
// // First time pairing.
|
||||
// // 1. Either we or peer initiate the process
|
||||
// // 2. Peer asks for security parameters using BLE_GAP_EVT_SEC_PARAMS_REQUEST.
|
||||
// // 3. Pair Key exchange ("just works" implemented now; TODO: out-of-band key pairing)
|
||||
// // 4. Connection is secured: BLE_GAP_EVT_CONN_SEC_UPDATE
|
||||
// // 5. Long-term Keys exchanged: BLE_GAP_EVT_AUTH_STATUS
|
||||
|
||||
// bonding_clear_keys(&self->bonding_keys);
|
||||
// self->ediv = EDIV_INVALID;
|
||||
// ble_gap_sec_keyset_t keyset = {
|
||||
// .keys_own = {
|
||||
// .p_enc_key = &self->bonding_keys.own_enc,
|
||||
// .p_id_key = NULL,
|
||||
// .p_sign_key = NULL,
|
||||
// .p_pk = NULL
|
||||
// },
|
||||
|
||||
// .keys_peer = {
|
||||
// .p_enc_key = &self->bonding_keys.peer_enc,
|
||||
// .p_id_key = &self->bonding_keys.peer_id,
|
||||
// .p_sign_key = NULL,
|
||||
// .p_pk = NULL
|
||||
// }
|
||||
// };
|
||||
|
||||
// sd_ble_gap_sec_params_reply(self->conn_handle, BLE_GAP_SEC_STATUS_SUCCESS,
|
||||
// self->is_central ? NULL : &pairing_sec_params,
|
||||
// &keyset);
|
||||
// break;
|
||||
// }
|
||||
|
||||
// case BLE_GAP_EVT_LESC_DHKEY_REQUEST:
|
||||
// // TODO for LESC pairing:
|
||||
// // sd_ble_gap_lesc_dhkey_reply(...);
|
||||
// break;
|
||||
|
||||
// case BLE_GAP_EVT_AUTH_STATUS: { // 0x19
|
||||
// // Key exchange completed.
|
||||
// ble_gap_evt_auth_status_t* status = &ble_evt->evt.gap_evt.params.auth_status;
|
||||
// self->sec_status = status->auth_status;
|
||||
// if (status->auth_status == BLE_GAP_SEC_STATUS_SUCCESS) {
|
||||
// self->ediv = self->bonding_keys.own_enc.master_id.ediv;
|
||||
// self->pair_status = PAIR_PAIRED;
|
||||
// // Save keys in bonding area at next opportunity.
|
||||
// self->do_bond_keys = true;
|
||||
// } else {
|
||||
// // Inform busy-waiter pairing has failed.
|
||||
// self->pair_status = PAIR_NOT_PAIRED;
|
||||
// }
|
||||
// break;
|
||||
// }
|
||||
|
||||
// case BLE_GAP_EVT_SEC_INFO_REQUEST: { // 0x14
|
||||
// // Peer asks for the stored keys.
|
||||
// // - load key and return if bonded previously.
|
||||
// // - Else return NULL --> Initiate key exchange
|
||||
// ble_gap_evt_sec_info_request_t* sec_info_request = &ble_evt->evt.gap_evt.params.sec_info_request;
|
||||
// (void) sec_info_request;
|
||||
// if ( bonding_load_keys(self->is_central, sec_info_request->master_id.ediv, &self->bonding_keys) ) {
|
||||
// sd_ble_gap_sec_info_reply(
|
||||
// self->conn_handle,
|
||||
// &self->bonding_keys.own_enc.enc_info,
|
||||
// &self->bonding_keys.peer_id.id_info,
|
||||
// NULL);
|
||||
// self->ediv = self->bonding_keys.own_enc.master_id.ediv;
|
||||
// } else {
|
||||
// // We don't have stored keys. Ask for keys.
|
||||
// sd_ble_gap_sec_info_reply(self->conn_handle, NULL, NULL, NULL);
|
||||
// }
|
||||
// break;
|
||||
// }
|
||||
|
||||
// case BLE_GAP_EVT_CONN_SEC_UPDATE: { // 0x1a
|
||||
// // We get this both on first-time pairing and on subsequent pairings using stored keys.
|
||||
// ble_gap_conn_sec_t* conn_sec = &ble_evt->evt.gap_evt.params.conn_sec_update.conn_sec;
|
||||
// if (conn_sec->sec_mode.sm <= 1 && conn_sec->sec_mode.lv <= 1) {
|
||||
// // Security setup did not succeed:
|
||||
// // mode 0, level 0 means no access
|
||||
// // mode 1, level 1 means open link
|
||||
// // mode >=1 and/or level >=1 means encryption is set up
|
||||
// self->pair_status = PAIR_NOT_PAIRED;
|
||||
// } else {
|
||||
// if (bonding_load_cccd_info(self->is_central, self->conn_handle, self->ediv)) {
|
||||
// // Did an sd_ble_gatts_sys_attr_set() with the stored sys_attr values.
|
||||
// } else {
|
||||
// // No matching bonding found, so use fresh system attributes.
|
||||
// sd_ble_gatts_sys_attr_set(self->conn_handle, NULL, 0, 0);
|
||||
// }
|
||||
// self->pair_status = PAIR_PAIRED;
|
||||
// }
|
||||
// break;
|
||||
// }
|
||||
|
||||
// default:
|
||||
// return false;
|
||||
// }
|
||||
// return true;
|
||||
// }
|
||||
|
||||
void bleio_connection_clear(bleio_connection_internal_t *self) {
|
||||
mp_obj_list_clear(MP_OBJ_FROM_PTR(self->remote_service_list));
|
||||
|
||||
self->conn_handle = BLE_CONN_HANDLE_INVALID;
|
||||
self->pair_status = PAIR_NOT_PAIRED;
|
||||
self->is_central = false;
|
||||
// FIX bonding_clear_keys(&self->bonding_keys);
|
||||
}
|
||||
|
||||
bool common_hal_bleio_connection_get_paired(bleio_connection_obj_t *self) {
|
||||
if (self->connection == NULL) {
|
||||
return false;
|
||||
}
|
||||
return self->connection->pair_status == PAIR_PAIRED;
|
||||
}
|
||||
|
||||
bool common_hal_bleio_connection_get_connected(bleio_connection_obj_t *self) {
|
||||
if (self->connection == NULL) {
|
||||
return false;
|
||||
}
|
||||
return self->connection->conn_handle != BLE_CONN_HANDLE_INVALID;
|
||||
}
|
||||
|
||||
void common_hal_bleio_connection_disconnect(bleio_connection_internal_t *self) {
|
||||
hci_disconnect(self->conn_handle);
|
||||
}
|
||||
|
||||
void common_hal_bleio_connection_pair(bleio_connection_internal_t *self, bool bond) {
|
||||
self->pair_status = PAIR_WAITING;
|
||||
|
||||
// FIX check_nrf_error(sd_ble_gap_authenticate(self->conn_handle, &pairing_sec_params));
|
||||
|
||||
while (self->pair_status == PAIR_WAITING && !mp_hal_is_interrupted()) {
|
||||
RUN_BACKGROUND_TASKS;
|
||||
}
|
||||
if (mp_hal_is_interrupted()) {
|
||||
return;
|
||||
}
|
||||
// FIX check_sec_status(self->sec_status);
|
||||
}
|
||||
|
||||
mp_float_t common_hal_bleio_connection_get_connection_interval(bleio_connection_internal_t *self) {
|
||||
while (self->conn_params_updating && !mp_hal_is_interrupted()) {
|
||||
RUN_BACKGROUND_TASKS;
|
||||
}
|
||||
// FIX return 1.25f * self->conn_params.min_conn_interval;
|
||||
return 0.0f;
|
||||
}
|
||||
|
||||
// Return the current negotiated MTU length, minus overhead.
|
||||
mp_int_t common_hal_bleio_connection_get_max_packet_length(bleio_connection_internal_t *self) {
|
||||
return (self->mtu == 0 ? BT_ATT_DEFAULT_LE_MTU : self->mtu) - 3;
|
||||
}
|
||||
|
||||
void common_hal_bleio_connection_set_connection_interval(bleio_connection_internal_t *self, mp_float_t new_interval) {
|
||||
// self->conn_params_updating = true;
|
||||
// uint16_t interval = new_interval / 1.25f;
|
||||
// self->conn_params.min_conn_interval = interval;
|
||||
// self->conn_params.max_conn_interval = interval;
|
||||
// uint32_t status = NRF_ERROR_BUSY;
|
||||
// while (status == NRF_ERROR_BUSY) {
|
||||
// status = sd_ble_gap_conn_param_update(self->conn_handle, &self->conn_params);
|
||||
// RUN_BACKGROUND_TASKS;
|
||||
// }
|
||||
// check_nrf_error(status);
|
||||
}
|
||||
|
||||
// service_uuid may be NULL, to discover all services.
|
||||
// STATIC bool discover_next_services(bleio_connection_internal_t* connection, uint16_t start_handle, ble_uuid_t *service_uuid) {
|
||||
// m_discovery_successful = false;
|
||||
// m_discovery_in_process = true;
|
||||
|
||||
// uint32_t nrf_err = NRF_ERROR_BUSY;
|
||||
// while (nrf_err == NRF_ERROR_BUSY) {
|
||||
// nrf_err = sd_ble_gattc_primary_services_discover(connection->conn_handle, start_handle, service_uuid);
|
||||
// }
|
||||
// check_nrf_error(nrf_err);
|
||||
|
||||
// // Wait for a discovery event.
|
||||
// while (m_discovery_in_process) {
|
||||
// MICROPY_VM_HOOK_LOOP;
|
||||
// }
|
||||
// return m_discovery_successful;
|
||||
// }
|
||||
|
||||
// STATIC bool discover_next_characteristics(bleio_connection_internal_t* connection, bleio_service_obj_t *service, uint16_t start_handle) {
|
||||
// m_char_discovery_service = service;
|
||||
|
||||
// ble_gattc_handle_range_t handle_range;
|
||||
// handle_range.start_handle = start_handle;
|
||||
// handle_range.end_handle = service->end_handle;
|
||||
|
||||
// m_discovery_successful = false;
|
||||
// m_discovery_in_process = true;
|
||||
|
||||
// uint32_t err_code = sd_ble_gattc_characteristics_discover(connection->conn_handle, &handle_range);
|
||||
// if (err_code != NRF_SUCCESS) {
|
||||
// return false;
|
||||
// }
|
||||
|
||||
// // Wait for a discovery event.
|
||||
// while (m_discovery_in_process) {
|
||||
// MICROPY_VM_HOOK_LOOP;
|
||||
// }
|
||||
// return m_discovery_successful;
|
||||
// }
|
||||
|
||||
// STATIC bool discover_next_descriptors(bleio_connection_internal_t* connection, bleio_characteristic_obj_t *characteristic, uint16_t start_handle, uint16_t end_handle) {
|
||||
// m_desc_discovery_characteristic = characteristic;
|
||||
|
||||
// ble_gattc_handle_range_t handle_range;
|
||||
// handle_range.start_handle = start_handle;
|
||||
// handle_range.end_handle = end_handle;
|
||||
|
||||
// m_discovery_successful = false;
|
||||
// m_discovery_in_process = true;
|
||||
|
||||
// uint32_t err_code = sd_ble_gattc_descriptors_discover(connection->conn_handle, &handle_range);
|
||||
// if (err_code != NRF_SUCCESS) {
|
||||
// return false;
|
||||
// }
|
||||
|
||||
// // Wait for a discovery event.
|
||||
// while (m_discovery_in_process) {
|
||||
// MICROPY_VM_HOOK_LOOP;
|
||||
// }
|
||||
// return m_discovery_successful;
|
||||
// }
|
||||
|
||||
// STATIC void on_primary_srv_discovery_rsp(ble_gattc_evt_prim_srvc_disc_rsp_t *response, bleio_connection_internal_t* connection) {
|
||||
// for (size_t i = 0; i < response->count; ++i) {
|
||||
// ble_gattc_service_t *gattc_service = &response->services[i];
|
||||
|
||||
// bleio_service_obj_t *service = m_new_obj(bleio_service_obj_t);
|
||||
// service->base.type = &bleio_service_type;
|
||||
|
||||
// // Initialize several fields at once.
|
||||
// bleio_service_from_connection(service, bleio_connection_new_from_internal(connection));
|
||||
|
||||
// service->is_remote = true;
|
||||
// service->start_handle = gattc_service->handle_range.start_handle;
|
||||
// service->end_handle = gattc_service->handle_range.end_handle;
|
||||
// service->handle = gattc_service->handle_range.start_handle;
|
||||
|
||||
// if (gattc_service->uuid.type != BLE_UUID_TYPE_UNKNOWN) {
|
||||
// // Known service UUID.
|
||||
// bleio_uuid_obj_t *uuid = m_new_obj(bleio_uuid_obj_t);
|
||||
// uuid->base.type = &bleio_uuid_type;
|
||||
// bleio_uuid_construct_from_nrf_ble_uuid(uuid, &gattc_service->uuid);
|
||||
// service->uuid = uuid;
|
||||
// } else {
|
||||
// // The discovery response contained a 128-bit UUID that has not yet been registered with the
|
||||
// // softdevice via sd_ble_uuid_vs_add(). We need to fetch the 128-bit value and register it.
|
||||
// // For now, just set the UUID to NULL.
|
||||
// service->uuid = NULL;
|
||||
// }
|
||||
//
|
||||
// mp_obj_list_append(MP_OBJ_FROM_PTR(connection->remote_service_list),
|
||||
// MP_OBJ_FROM_PTR(service));
|
||||
// }
|
||||
//
|
||||
// if (response->count > 0) {
|
||||
// m_discovery_successful = true;
|
||||
// }
|
||||
// m_discovery_in_process = false;
|
||||
// }
|
||||
|
||||
// STATIC void on_char_discovery_rsp(ble_gattc_evt_char_disc_rsp_t *response, bleio_connection_internal_t* connection) {
|
||||
// for (size_t i = 0; i < response->count; ++i) {
|
||||
// ble_gattc_char_t *gattc_char = &response->chars[i];
|
||||
|
||||
// bleio_characteristic_obj_t *characteristic = m_new_obj(bleio_characteristic_obj_t);
|
||||
// characteristic->base.type = &bleio_characteristic_type;
|
||||
|
||||
// bleio_uuid_obj_t *uuid = NULL;
|
||||
|
||||
// if (gattc_char->uuid.type != BLE_UUID_TYPE_UNKNOWN) {
|
||||
// // Known characteristic UUID.
|
||||
// uuid = m_new_obj(bleio_uuid_obj_t);
|
||||
// uuid->base.type = &bleio_uuid_type;
|
||||
// bleio_uuid_construct_from_nrf_ble_uuid(uuid, &gattc_char->uuid);
|
||||
// } else {
|
||||
// // The discovery response contained a 128-bit UUID that has not yet been registered with the
|
||||
// // softdevice via sd_ble_uuid_vs_add(). We need to fetch the 128-bit value and register it.
|
||||
// // For now, just leave the UUID as NULL.
|
||||
// }
|
||||
|
||||
// bleio_characteristic_properties_t props =
|
||||
// (gattc_char->char_props.broadcast ? CHAR_PROP_BROADCAST : 0) |
|
||||
// (gattc_char->char_props.indicate ? CHAR_PROP_INDICATE : 0) |
|
||||
// (gattc_char->char_props.notify ? CHAR_PROP_NOTIFY : 0) |
|
||||
// (gattc_char->char_props.read ? CHAR_PROP_READ : 0) |
|
||||
// (gattc_char->char_props.write ? CHAR_PROP_WRITE : 0) |
|
||||
// (gattc_char->char_props.write_wo_resp ? CHAR_PROP_WRITE_NO_RESPONSE : 0);
|
||||
|
||||
// // Call common_hal_bleio_characteristic_construct() to initalize some fields and set up evt handler.
|
||||
// common_hal_bleio_characteristic_construct(
|
||||
// characteristic, m_char_discovery_service, gattc_char->handle_value, uuid,
|
||||
// props, SECURITY_MODE_OPEN, SECURITY_MODE_OPEN,
|
||||
// GATT_MAX_DATA_LENGTH, false, // max_length, fixed_length: values may not matter for gattc
|
||||
// NULL);
|
||||
|
||||
// mp_obj_list_append(MP_OBJ_FROM_PTR(m_char_discovery_service->characteristic_list),
|
||||
// MP_OBJ_FROM_PTR(characteristic));
|
||||
// }
|
||||
|
||||
// if (response->count > 0) {
|
||||
// m_discovery_successful = true;
|
||||
// }
|
||||
// m_discovery_in_process = false;
|
||||
// }
|
||||
|
||||
// STATIC void on_desc_discovery_rsp(ble_gattc_evt_desc_disc_rsp_t *response, bleio_connection_internal_t* connection) {
|
||||
// for (size_t i = 0; i < response->count; ++i) {
|
||||
// ble_gattc_desc_t *gattc_desc = &response->descs[i];
|
||||
|
||||
// // Remember handles for certain well-known descriptors.
|
||||
// switch (gattc_desc->uuid.uuid) {
|
||||
// case BLE_UUID_DESCRIPTOR_CLIENT_CHAR_CONFIG:
|
||||
// m_desc_discovery_characteristic->cccd_handle = gattc_desc->handle;
|
||||
// break;
|
||||
|
||||
// case BLE_UUID_DESCRIPTOR_SERVER_CHAR_CONFIG:
|
||||
// m_desc_discovery_characteristic->sccd_handle = gattc_desc->handle;
|
||||
// break;
|
||||
|
||||
// case BLE_UUID_DESCRIPTOR_CHAR_USER_DESC:
|
||||
// m_desc_discovery_characteristic->user_desc_handle = gattc_desc->handle;
|
||||
// break;
|
||||
|
||||
// default:
|
||||
// // TODO: sd_ble_gattc_descriptors_discover() can return things that are not descriptors,
|
||||
// // so ignore those.
|
||||
// // https://devzone.nordicsemi.com/f/nordic-q-a/49500/sd_ble_gattc_descriptors_discover-is-returning-attributes-that-are-not-descriptors
|
||||
// break;
|
||||
// }
|
||||
|
||||
// bleio_descriptor_obj_t *descriptor = m_new_obj(bleio_descriptor_obj_t);
|
||||
// descriptor->base.type = &bleio_descriptor_type;
|
||||
|
||||
// bleio_uuid_obj_t *uuid = NULL;
|
||||
|
||||
// if (gattc_desc->uuid.type != BLE_UUID_TYPE_UNKNOWN) {
|
||||
// // Known descriptor UUID.
|
||||
// uuid = m_new_obj(bleio_uuid_obj_t);
|
||||
// uuid->base.type = &bleio_uuid_type;
|
||||
// bleio_uuid_construct_from_nrf_ble_uuid(uuid, &gattc_desc->uuid);
|
||||
// } else {
|
||||
// // The discovery response contained a 128-bit UUID that has not yet been registered with the
|
||||
// // softdevice via sd_ble_uuid_vs_add(). We need to fetch the 128-bit value and register it.
|
||||
// // For now, just leave the UUID as NULL.
|
||||
// }
|
||||
|
||||
// common_hal_bleio_descriptor_construct(
|
||||
// descriptor, m_desc_discovery_characteristic, uuid,
|
||||
// SECURITY_MODE_OPEN, SECURITY_MODE_OPEN,
|
||||
// GATT_MAX_DATA_LENGTH, false, mp_const_empty_bytes);
|
||||
// descriptor->handle = gattc_desc->handle;
|
||||
|
||||
// mp_obj_list_append(MP_OBJ_FROM_PTR(m_desc_discovery_characteristic->descriptor_list),
|
||||
// MP_OBJ_FROM_PTR(descriptor));
|
||||
// }
|
||||
|
||||
// if (response->count > 0) {
|
||||
// m_discovery_successful = true;
|
||||
// }
|
||||
// m_discovery_in_process = false;
|
||||
// }
|
||||
|
||||
// STATIC bool discovery_on_ble_evt(ble_evt_t *ble_evt, mp_obj_t payload) {
|
||||
// bleio_connection_internal_t* connection = MP_OBJ_TO_PTR(payload);
|
||||
// switch (ble_evt->header.evt_id) {
|
||||
// case BLE_GAP_EVT_DISCONNECTED:
|
||||
// m_discovery_successful = false;
|
||||
// m_discovery_in_process = false;
|
||||
// break;
|
||||
|
||||
// case BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP:
|
||||
// on_primary_srv_discovery_rsp(&ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp, connection);
|
||||
// break;
|
||||
|
||||
// case BLE_GATTC_EVT_CHAR_DISC_RSP:
|
||||
// on_char_discovery_rsp(&ble_evt->evt.gattc_evt.params.char_disc_rsp, connection);
|
||||
// break;
|
||||
|
||||
// case BLE_GATTC_EVT_DESC_DISC_RSP:
|
||||
// on_desc_discovery_rsp(&ble_evt->evt.gattc_evt.params.desc_disc_rsp, connection);
|
||||
// break;
|
||||
|
||||
// default:
|
||||
// // CONNECTION_DEBUG_PRINTF(&mp_plat_print, "Unhandled discovery event: 0x%04x\n", ble_evt->header.evt_id);
|
||||
// return false;
|
||||
// break;
|
||||
// }
|
||||
// return true;
|
||||
// }
|
||||
|
||||
// STATIC void discover_remote_services(bleio_connection_internal_t *self, mp_obj_t service_uuids_whitelist) {
|
||||
// ble_drv_add_event_handler(discovery_on_ble_evt, self);
|
||||
|
||||
// // Start over with an empty list.
|
||||
// self->remote_service_list = mp_obj_new_list(0, NULL);
|
||||
|
||||
|
||||
// if (service_uuids_whitelist == mp_const_none) {
|
||||
// // List of service UUID's not given, so discover all available services.
|
||||
|
||||
// uint16_t next_service_start_handle = BLE_GATT_HANDLE_START;
|
||||
|
||||
// while (discover_next_services(self, next_service_start_handle, MP_OBJ_NULL)) {
|
||||
// // discover_next_services() appends to remote_services_list.
|
||||
|
||||
// // Get the most recently discovered service, and then ask for services
|
||||
// // whose handles start after the last attribute handle inside that service.
|
||||
// // There must be at least one if discover_next_services() returned true.
|
||||
// const bleio_service_obj_t *service =
|
||||
// self->remote_service_list->items[self->remote_service_list->len - 1];
|
||||
// next_service_start_handle = service->end_handle + 1;
|
||||
// }
|
||||
// } else {
|
||||
// mp_obj_iter_buf_t iter_buf;
|
||||
// mp_obj_t iterable = mp_getiter(service_uuids_whitelist, &iter_buf);
|
||||
// mp_obj_t uuid_obj;
|
||||
// while ((uuid_obj = mp_iternext(iterable)) != MP_OBJ_STOP_ITERATION) {
|
||||
// if (!mp_obj_is_type(uuid_obj, &bleio_uuid_type)) {
|
||||
// mp_raise_TypeError(translate("non-UUID found in service_uuids_whitelist"));
|
||||
// }
|
||||
// bleio_uuid_obj_t *uuid = MP_OBJ_TO_PTR(uuid_obj);
|
||||
|
||||
// ble_uuid_t nrf_uuid;
|
||||
// bleio_uuid_convert_to_nrf_ble_uuid(uuid, &nrf_uuid);
|
||||
|
||||
// // Service might or might not be discovered; that's ok. Caller has to check
|
||||
// // Central.remote_services to find out.
|
||||
// // We only need to call this once for each service to discover.
|
||||
// discover_next_services(self, BLE_GATT_HANDLE_START, &nrf_uuid);
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
// for (size_t i = 0; i < self->remote_service_list->len; i++) {
|
||||
// bleio_service_obj_t *service = MP_OBJ_TO_PTR(self->remote_service_list->items[i]);
|
||||
// // Skip the service if it had an unknown (unregistered) UUID.
|
||||
// if (service->uuid == NULL) {
|
||||
// continue;
|
||||
// }
|
||||
|
||||
// uint16_t next_char_start_handle = service->start_handle;
|
||||
|
||||
// // Stop when we go past the end of the range of handles for this service or
|
||||
// // discovery call returns nothing.
|
||||
// // discover_next_characteristics() appends to the characteristic_list.
|
||||
// while (next_char_start_handle <= service->end_handle &&
|
||||
// discover_next_characteristics(self, service, next_char_start_handle)) {
|
||||
|
||||
|
||||
// // Get the most recently discovered characteristic, and then ask for characteristics
|
||||
// // whose handles start after the last attribute handle inside that characteristic.
|
||||
// const bleio_characteristic_obj_t *characteristic =
|
||||
// MP_OBJ_TO_PTR(service->characteristic_list->items[service->characteristic_list->len - 1]);
|
||||
|
||||
// next_char_start_handle = characteristic->handle + 1;
|
||||
// }
|
||||
|
||||
// // Got characteristics for this service. Now discover descriptors for each characteristic.
|
||||
// size_t char_list_len = service->characteristic_list->len;
|
||||
// for (size_t char_idx = 0; char_idx < char_list_len; ++char_idx) {
|
||||
// bleio_characteristic_obj_t *characteristic =
|
||||
// MP_OBJ_TO_PTR(service->characteristic_list->items[char_idx]);
|
||||
// const bool last_characteristic = char_idx == char_list_len - 1;
|
||||
// bleio_characteristic_obj_t *next_characteristic = last_characteristic
|
||||
// ? NULL
|
||||
// : MP_OBJ_TO_PTR(service->characteristic_list->items[char_idx + 1]);
|
||||
|
||||
// // Skip the characteristic if it had an unknown (unregistered) UUID.
|
||||
// if (characteristic->uuid == NULL) {
|
||||
// continue;
|
||||
// }
|
||||
|
||||
// uint16_t next_desc_start_handle = characteristic->handle + 1;
|
||||
|
||||
// // Don't run past the end of this service or the beginning of the next characteristic.
|
||||
// uint16_t next_desc_end_handle = next_characteristic == NULL
|
||||
// ? service->end_handle
|
||||
// : next_characteristic->handle - 1;
|
||||
|
||||
// // Stop when we go past the end of the range of handles for this service or
|
||||
// // discovery call returns nothing.
|
||||
// // discover_next_descriptors() appends to the descriptor_linked_list.
|
||||
// while (next_desc_start_handle <= service->end_handle &&
|
||||
// next_desc_start_handle <= next_desc_end_handle &&
|
||||
// discover_next_descriptors(self, characteristic,
|
||||
// next_desc_start_handle, next_desc_end_handle)) {
|
||||
// // Get the most recently discovered descriptor, and then ask for descriptors
|
||||
// // whose handles start after that descriptor's handle.
|
||||
// // There must be at least one if discover_next_descriptors() returned true.
|
||||
// const bleio_descriptor_obj_t *descriptor =
|
||||
// characteristic->descriptor_list->items[characteristic->descriptor_list->len - 1];
|
||||
// next_desc_start_handle = descriptor->handle + 1;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
// // This event handler is no longer needed.
|
||||
// ble_drv_remove_event_handler(discovery_on_ble_evt, self);
|
||||
|
||||
// }
|
||||
|
||||
mp_obj_tuple_t *common_hal_bleio_connection_discover_remote_services(bleio_connection_obj_t *self, mp_obj_t service_uuids_whitelist) {
|
||||
// FIX discover_remote_services(self->connection, service_uuids_whitelist);
|
||||
bleio_connection_ensure_connected(self);
|
||||
// Convert to a tuple and then clear the list so the callee will take ownership.
|
||||
mp_obj_tuple_t *services_tuple =
|
||||
mp_obj_new_tuple(self->connection->remote_service_list->len,
|
||||
self->connection->remote_service_list->items);
|
||||
mp_obj_list_clear(MP_OBJ_FROM_PTR(self->connection->remote_service_list));
|
||||
return services_tuple;
|
||||
}
|
||||
|
||||
uint16_t bleio_connection_get_conn_handle(bleio_connection_obj_t *self) {
|
||||
if (self == NULL || self->connection == NULL) {
|
||||
return BLE_CONN_HANDLE_INVALID;
|
||||
}
|
||||
return self->connection->conn_handle;
|
||||
}
|
||||
|
||||
mp_obj_t bleio_connection_new_from_internal(bleio_connection_internal_t *internal) {
|
||||
if (internal->connection_obj != mp_const_none) {
|
||||
return internal->connection_obj;
|
||||
}
|
||||
bleio_connection_obj_t *connection = m_new_obj(bleio_connection_obj_t);
|
||||
connection->base.type = &bleio_connection_type;
|
||||
connection->connection = internal;
|
||||
internal->connection_obj = connection;
|
||||
|
||||
return MP_OBJ_FROM_PTR(connection);
|
||||
}
|
||||
|
||||
// Find the connection that uses the given conn_handle. Return NULL if not found.
|
||||
bleio_connection_internal_t *bleio_conn_handle_to_connection(uint16_t conn_handle) {
|
||||
bleio_connection_internal_t *connection;
|
||||
for (size_t i = 0; i < BLEIO_TOTAL_CONNECTION_COUNT; i++) {
|
||||
connection = &bleio_connections[i];
|
||||
if (connection->conn_handle == conn_handle) {
|
||||
return connection;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
89
devices/ble_hci/common-hal/_bleio/Connection.h
Normal file
89
devices/ble_hci/common-hal/_bleio/Connection.h
Normal file
|
|
@ -0,0 +1,89 @@
|
|||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2019 Dan Halbert for Adafruit Industries
|
||||
* Copyright (c) 2018 Artur Pacholec
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef MICROPY_INCLUDED_BLE_HCI_COMMON_HAL_CONNECTION_H
|
||||
#define MICROPY_INCLUDED_BLE_HCI_COMMON_HAL_CONNECTION_H
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "py/obj.h"
|
||||
#include "py/objlist.h"
|
||||
|
||||
#include "common-hal/_bleio/__init__.h"
|
||||
#include "shared-module/_bleio/Address.h"
|
||||
#include "common-hal/_bleio/Service.h"
|
||||
|
||||
typedef enum {
|
||||
PAIR_NOT_PAIRED,
|
||||
PAIR_WAITING,
|
||||
PAIR_PAIRED,
|
||||
} pair_status_t;
|
||||
|
||||
// We split the Connection object into two so that the internal mechanics can live outside of the
|
||||
// VM. If it were one object, then we'd risk user code seeing a connection object of theirs be
|
||||
// reused.
|
||||
typedef struct {
|
||||
uint16_t conn_handle;
|
||||
bool is_central;
|
||||
// Remote services discovered when this peripheral is acting as a client.
|
||||
mp_obj_list_t *remote_service_list;
|
||||
// The advertising data and scan response buffers are held by us, not by the SD, so we must
|
||||
// maintain them and not change it. If we need to change the contents during advertising,
|
||||
// there are tricks to get the SD to notice (see DevZone - TBS).
|
||||
bonding_keys_t bonding_keys;
|
||||
// EDIV: Encrypted Diversifier: Identifies LTK during legacy pairing.
|
||||
uint16_t ediv;
|
||||
volatile pair_status_t pair_status;
|
||||
uint8_t sec_status; // Internal security status.
|
||||
mp_obj_t connection_obj;
|
||||
// REMOVE ble_gap_conn_params_t conn_params;
|
||||
volatile bool conn_params_updating;
|
||||
uint16_t mtu;
|
||||
// Request that CCCD values for this connection be saved, using sys_attr values.
|
||||
volatile bool do_bond_cccds;
|
||||
// Request that security key info for this connection be saved.
|
||||
volatile bool do_bond_keys;
|
||||
// Time of setting do_bond_ccds: we delay a bit to consolidate multiple CCCD changes
|
||||
// into one write. Time is currently in ticks_ms.
|
||||
uint64_t do_bond_cccds_request_time;
|
||||
// FIX from att.c
|
||||
uint8_t role;
|
||||
bt_addr_le_t addr;
|
||||
} bleio_connection_internal_t;
|
||||
|
||||
typedef struct {
|
||||
mp_obj_base_t base;
|
||||
bleio_connection_internal_t *connection;
|
||||
// The HCI disconnect reason.
|
||||
uint8_t disconnect_reason;
|
||||
} bleio_connection_obj_t;
|
||||
|
||||
uint16_t bleio_connection_get_conn_handle(bleio_connection_obj_t *self);
|
||||
mp_obj_t bleio_connection_new_from_internal(bleio_connection_internal_t *connection);
|
||||
bleio_connection_internal_t *bleio_conn_handle_to_connection(uint16_t conn_handle);
|
||||
|
||||
#endif // MICROPY_INCLUDED_BLE_HCI_COMMON_HAL_CONNECTION_H
|
||||
114
devices/ble_hci/common-hal/_bleio/Descriptor.c
Normal file
114
devices/ble_hci/common-hal/_bleio/Descriptor.c
Normal file
|
|
@ -0,0 +1,114 @@
|
|||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2019 Dan Halbert for Adafruit Industries
|
||||
* Copyright (c) 2018 Artur Pacholec
|
||||
* Copyright (c) 2016 Glenn Ruben Bakke
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "py/runtime.h"
|
||||
|
||||
#include "shared-bindings/_bleio/__init__.h"
|
||||
#include "shared-bindings/_bleio/Descriptor.h"
|
||||
#include "shared-bindings/_bleio/Service.h"
|
||||
#include "shared-bindings/_bleio/UUID.h"
|
||||
|
||||
void common_hal_bleio_descriptor_construct(bleio_descriptor_obj_t *self, bleio_characteristic_obj_t *characteristic, bleio_uuid_obj_t *uuid, bleio_attribute_security_mode_t read_perm, bleio_attribute_security_mode_t write_perm, mp_int_t max_length, bool fixed_length, mp_buffer_info_t *initial_value_bufinfo) {
|
||||
self->characteristic = characteristic;
|
||||
self->uuid = uuid;
|
||||
self->handle = BLE_GATT_HANDLE_INVALID;
|
||||
self->read_perm = read_perm;
|
||||
self->write_perm = write_perm;
|
||||
self->value = mp_obj_new_bytes(initial_value_bufinfo->buf, initial_value_bufinfo->len);
|
||||
|
||||
const mp_int_t max_length_max = fixed_length ? BLE_GATTS_FIX_ATTR_LEN_MAX : BLE_GATTS_VAR_ATTR_LEN_MAX;
|
||||
if (max_length < 0 || max_length > max_length_max) {
|
||||
mp_raise_ValueError_varg(translate("max_length must be 0-%d when fixed_length is %s"),
|
||||
max_length_max, fixed_length ? "True" : "False");
|
||||
}
|
||||
self->max_length = max_length;
|
||||
self->fixed_length = fixed_length;
|
||||
|
||||
common_hal_bleio_descriptor_set_value(self, initial_value_bufinfo);
|
||||
}
|
||||
|
||||
bleio_uuid_obj_t *common_hal_bleio_descriptor_get_uuid(bleio_descriptor_obj_t *self) {
|
||||
return self->uuid;
|
||||
}
|
||||
|
||||
bleio_characteristic_obj_t *common_hal_bleio_descriptor_get_characteristic(bleio_descriptor_obj_t *self) {
|
||||
return self->characteristic;
|
||||
}
|
||||
|
||||
size_t common_hal_bleio_descriptor_get_value(bleio_descriptor_obj_t *self, uint8_t *buf, size_t len) {
|
||||
// Do GATT operations only if this descriptor has been registered
|
||||
if (self->handle != BLE_GATT_HANDLE_INVALID) {
|
||||
if (common_hal_bleio_service_get_is_remote(self->characteristic->service)) {
|
||||
// uint16_t conn_handle = bleio_connection_get_conn_handle(self->characteristic->service->connection);
|
||||
// FIX have att_read_req fill in a buffer
|
||||
// uint8_t rsp[MAX(len, 512)];
|
||||
// return att_read_req(conn_handle, self->handle, rsp, len);
|
||||
return 0;
|
||||
} else {
|
||||
mp_buffer_info_t bufinfo;
|
||||
if (!mp_get_buffer(self->value, &bufinfo, MP_BUFFER_READ)) {
|
||||
return 0;
|
||||
}
|
||||
const size_t actual_length = MIN(len, bufinfo.len);
|
||||
memcpy(buf, bufinfo.buf, actual_length);
|
||||
return actual_length;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void common_hal_bleio_descriptor_set_value(bleio_descriptor_obj_t *self, mp_buffer_info_t *bufinfo) {
|
||||
if (self->fixed_length && bufinfo->len != self->max_length) {
|
||||
mp_raise_ValueError(translate("Value length != required fixed length"));
|
||||
}
|
||||
if (bufinfo->len > self->max_length) {
|
||||
mp_raise_ValueError(translate("Value length > max_length"));
|
||||
}
|
||||
|
||||
self->value = mp_obj_new_bytes(bufinfo->buf, bufinfo->len);
|
||||
|
||||
// Do GATT operations only if this descriptor has been registered.
|
||||
if (self->handle != BLE_GATT_HANDLE_INVALID) {
|
||||
if (common_hal_bleio_service_get_is_remote(self->characteristic->service)) {
|
||||
// FIX
|
||||
// uint16_t conn_handle = bleio_connection_get_conn_handle(self->service->connection);
|
||||
// att_write_req(conn_handle, self->handle, bufinfo->buf, bufinfo->len, rsp);
|
||||
} else {
|
||||
// Always write the value locally even if no connections are active.
|
||||
if (self->fixed_length && bufinfo->len != self->max_length) {
|
||||
return;
|
||||
}
|
||||
if (bufinfo->len > self->max_length) {
|
||||
return;
|
||||
}
|
||||
|
||||
self->value = mp_obj_new_bytes(bufinfo->buf, bufinfo->len);
|
||||
}
|
||||
}
|
||||
}
|
||||
53
devices/ble_hci/common-hal/_bleio/Descriptor.h
Normal file
53
devices/ble_hci/common-hal/_bleio/Descriptor.h
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2018 Dan Halbert for Adafruit Industries
|
||||
* Copyright (c) 2018 Artur Pacholec
|
||||
* Copyright (c) 2016 Glenn Ruben Bakke
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef MICROPY_INCLUDED_BLE_HCI_COMMON_HAL_DESCRIPTOR_H
|
||||
#define MICROPY_INCLUDED_BLE_HCI_COMMON_HAL_DESCRIPTOR_H
|
||||
|
||||
#include "py/obj.h"
|
||||
|
||||
#include "common-hal/_bleio/UUID.h"
|
||||
|
||||
// Forward declare characteristic because it includes a Descriptor.
|
||||
struct _bleio_characteristic_obj;
|
||||
|
||||
typedef struct _bleio_descriptor_obj {
|
||||
mp_obj_base_t base;
|
||||
// Will be MP_OBJ_NULL before being assigned to a Characteristic.
|
||||
struct _bleio_characteristic_obj *characteristic;
|
||||
bleio_uuid_obj_t *uuid;
|
||||
mp_obj_t value;
|
||||
uint16_t max_length;
|
||||
bool fixed_length;
|
||||
uint16_t handle;
|
||||
bleio_attribute_security_mode_t read_perm;
|
||||
bleio_attribute_security_mode_t write_perm;
|
||||
struct _bleio_descriptor_obj *next;
|
||||
} bleio_descriptor_obj_t;
|
||||
|
||||
#endif // MICROPY_INCLUDED_BLE_HCI_COMMON_HAL_DESCRIPTOR_H
|
||||
267
devices/ble_hci/common-hal/_bleio/PacketBuffer.c
Normal file
267
devices/ble_hci/common-hal/_bleio/PacketBuffer.c
Normal file
|
|
@ -0,0 +1,267 @@
|
|||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2019-2020 Scott Shawcroft for Adafruit Industries
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "lib/utils/interrupt_char.h"
|
||||
#include "py/runtime.h"
|
||||
#include "py/stream.h"
|
||||
|
||||
#include "shared-bindings/_bleio/__init__.h"
|
||||
#include "shared-bindings/_bleio/Connection.h"
|
||||
#include "shared-bindings/_bleio/PacketBuffer.h"
|
||||
#include "supervisor/shared/tick.h"
|
||||
|
||||
STATIC void write_to_ringbuf(bleio_packet_buffer_obj_t *self, uint8_t *data, uint16_t len) {
|
||||
if (len + sizeof(uint16_t) > ringbuf_capacity(&self->ringbuf)) {
|
||||
// This shouldn't happen.
|
||||
return;
|
||||
}
|
||||
// Push all the data onto the ring buffer.
|
||||
// Make room for the new value by dropping the oldest packets first.
|
||||
while (ringbuf_capacity(&self->ringbuf) - ringbuf_num_filled(&self->ringbuf) < len + sizeof(uint16_t)) {
|
||||
uint16_t packet_length;
|
||||
ringbuf_get_n(&self->ringbuf, (uint8_t *)&packet_length, sizeof(uint16_t));
|
||||
for (uint16_t i = 0; i < packet_length; i++) {
|
||||
ringbuf_get(&self->ringbuf);
|
||||
}
|
||||
// set an overflow flag?
|
||||
}
|
||||
ringbuf_put_n(&self->ringbuf, (uint8_t *)&len, sizeof(uint16_t));
|
||||
ringbuf_put_n(&self->ringbuf, data, len);
|
||||
}
|
||||
|
||||
STATIC uint32_t queue_next_write(bleio_packet_buffer_obj_t *self) {
|
||||
// Queue up the next outgoing buffer. We use two, one that has been passed to the SD for
|
||||
// transmission (when packet_queued is true) and the other is `pending` and can still be
|
||||
// modified. By primarily appending to the `pending` buffer we can reduce the protocol overhead
|
||||
// of the lower level link and ATT layers.
|
||||
self->packet_queued = false;
|
||||
if (self->pending_size > 0) {
|
||||
mp_buffer_info_t bufinfo = {
|
||||
.buf = self->outgoing[self->pending_index],
|
||||
.len = self->pending_size,
|
||||
};
|
||||
common_hal_bleio_characteristic_set_value(self->characteristic, &bufinfo);
|
||||
|
||||
self->pending_size = 0;
|
||||
self->pending_index = (self->pending_index + 1) % 2;
|
||||
self->packet_queued = true;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void bleio_packet_buffer_update(bleio_packet_buffer_obj_t *self, mp_buffer_info_t *bufinfo) {
|
||||
write_to_ringbuf(self, bufinfo->buf, bufinfo->len);
|
||||
}
|
||||
|
||||
void common_hal_bleio_packet_buffer_construct(
|
||||
bleio_packet_buffer_obj_t *self, bleio_characteristic_obj_t *characteristic,
|
||||
size_t buffer_size, size_t max_packet_size) {
|
||||
|
||||
self->characteristic = characteristic;
|
||||
self->client = self->characteristic->service->is_remote;
|
||||
bleio_characteristic_properties_t incoming =
|
||||
self->characteristic->props & (CHAR_PROP_WRITE_NO_RESPONSE | CHAR_PROP_WRITE);
|
||||
bleio_characteristic_properties_t outgoing =
|
||||
self->characteristic->props & (CHAR_PROP_NOTIFY | CHAR_PROP_INDICATE);
|
||||
|
||||
if (self->client) {
|
||||
// Swap if we're the client.
|
||||
bleio_characteristic_properties_t temp = incoming;
|
||||
incoming = outgoing;
|
||||
outgoing = temp;
|
||||
self->conn_handle = bleio_connection_get_conn_handle(MP_OBJ_TO_PTR(self->characteristic->service->connection));
|
||||
} else {
|
||||
self->conn_handle = BLE_CONN_HANDLE_INVALID;
|
||||
}
|
||||
|
||||
if (incoming) {
|
||||
if (!ringbuf_alloc(&self->ringbuf, buffer_size * (sizeof(uint16_t) + max_packet_size), false)) {
|
||||
mp_raise_ValueError(translate("Buffer too large and unable to allocate"));
|
||||
}
|
||||
}
|
||||
|
||||
if (outgoing) {
|
||||
self->packet_queued = false;
|
||||
self->pending_index = 0;
|
||||
self->pending_size = 0;
|
||||
self->outgoing[0] = m_malloc(max_packet_size, false);
|
||||
self->outgoing[1] = m_malloc(max_packet_size, false);
|
||||
} else {
|
||||
self->outgoing[0] = NULL;
|
||||
self->outgoing[1] = NULL;
|
||||
}
|
||||
self->max_packet_size = max_packet_size;
|
||||
|
||||
bleio_characteristic_set_observer(self->characteristic, self);
|
||||
}
|
||||
|
||||
mp_int_t common_hal_bleio_packet_buffer_readinto(bleio_packet_buffer_obj_t *self, uint8_t *data, size_t len) {
|
||||
if (ringbuf_num_filled(&self->ringbuf) < 2) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Copy received data.
|
||||
// Get packet length, which is in first two bytes of packet.
|
||||
uint16_t packet_length;
|
||||
ringbuf_get_n(&self->ringbuf, (uint8_t *)&packet_length, sizeof(uint16_t));
|
||||
|
||||
mp_int_t ret;
|
||||
if (packet_length > len) {
|
||||
// Packet is longer than requested. Return negative of overrun value.
|
||||
ret = len - packet_length;
|
||||
// Discard the packet if it's too large. Don't fill data.
|
||||
while (packet_length--) {
|
||||
(void)ringbuf_get(&self->ringbuf);
|
||||
}
|
||||
} else {
|
||||
// Read as much as possible, but might be shorter than len.
|
||||
ringbuf_get_n(&self->ringbuf, data, packet_length);
|
||||
ret = packet_length;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
mp_int_t common_hal_bleio_packet_buffer_write(bleio_packet_buffer_obj_t *self, uint8_t *data, size_t len, uint8_t *header, size_t header_len) {
|
||||
if (self->outgoing[0] == NULL) {
|
||||
mp_raise_bleio_BluetoothError(translate("Writes not supported on Characteristic"));
|
||||
}
|
||||
if (self->conn_handle == BLE_CONN_HANDLE_INVALID) {
|
||||
return -1;
|
||||
}
|
||||
uint16_t outgoing_packet_length = common_hal_bleio_packet_buffer_get_outgoing_packet_length(self);
|
||||
|
||||
if (len + header_len > outgoing_packet_length) {
|
||||
// Supplied data will not fit in a single BLE packet.
|
||||
mp_raise_ValueError(translate("Total data to write is larger than outgoing_packet_length"));
|
||||
}
|
||||
|
||||
if (len + self->pending_size > outgoing_packet_length) {
|
||||
// No room to append len bytes to packet. Wait until we get a free buffer,
|
||||
// and keep checking that we haven't been disconnected.
|
||||
while (self->pending_size != 0 && self->conn_handle != BLE_CONN_HANDLE_INVALID) {
|
||||
RUN_BACKGROUND_TASKS;
|
||||
}
|
||||
}
|
||||
if (self->conn_handle == BLE_CONN_HANDLE_INVALID) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
size_t num_bytes_written = 0;
|
||||
|
||||
uint8_t *pending = self->outgoing[self->pending_index];
|
||||
|
||||
if (self->pending_size == 0) {
|
||||
memcpy(pending, header, header_len);
|
||||
self->pending_size += header_len;
|
||||
num_bytes_written += header_len;
|
||||
}
|
||||
memcpy(pending + self->pending_size, data, len);
|
||||
self->pending_size += len;
|
||||
num_bytes_written += len;
|
||||
|
||||
// If no writes are queued then sneak in this data.
|
||||
if (!self->packet_queued) {
|
||||
queue_next_write(self);
|
||||
}
|
||||
return num_bytes_written;
|
||||
}
|
||||
|
||||
mp_int_t common_hal_bleio_packet_buffer_get_incoming_packet_length(bleio_packet_buffer_obj_t *self) {
|
||||
// If this PacketBuffer is coming from a remote service via NOTIFY or INDICATE
|
||||
// the maximum size is what can be sent in one
|
||||
// BLE packet. But we must be connected to know that value.
|
||||
//
|
||||
// Otherwise it can be as long as the characteristic
|
||||
// will permit, whether or not we're connected.
|
||||
|
||||
if (self->characteristic == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (self->characteristic->service != NULL &&
|
||||
self->characteristic->service->is_remote &&
|
||||
(common_hal_bleio_characteristic_get_properties(self->characteristic) &
|
||||
(CHAR_PROP_INDICATE | CHAR_PROP_NOTIFY))) {
|
||||
// We are talking to a remote service, and data is arriving via NOTIFY or INDICATE.
|
||||
if (self->conn_handle != BLE_CONN_HANDLE_INVALID) {
|
||||
bleio_connection_internal_t *connection = bleio_conn_handle_to_connection(self->conn_handle);
|
||||
if (connection) {
|
||||
return MIN(common_hal_bleio_connection_get_max_packet_length(connection),
|
||||
self->characteristic->max_length);
|
||||
}
|
||||
}
|
||||
// There's no current connection, so we don't know the MTU, and
|
||||
// we can't tell what the largest incoming packet length would be.
|
||||
return -1;
|
||||
}
|
||||
return self->characteristic->max_length;
|
||||
}
|
||||
|
||||
mp_int_t common_hal_bleio_packet_buffer_get_outgoing_packet_length(bleio_packet_buffer_obj_t *self) {
|
||||
// If we are sending data via NOTIFY or INDICATE, the maximum size
|
||||
// is what can be sent in one BLE packet. But we must be connected
|
||||
// to know that value.
|
||||
//
|
||||
// Otherwise it can be as long as the characteristic
|
||||
// will permit, whether or not we're connected.
|
||||
|
||||
if (self->characteristic == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (self->characteristic->service != NULL &&
|
||||
!self->characteristic->service->is_remote &&
|
||||
(common_hal_bleio_characteristic_get_properties(self->characteristic) &
|
||||
(CHAR_PROP_INDICATE | CHAR_PROP_NOTIFY))) {
|
||||
// We are sending to a client, via NOTIFY or INDICATE.
|
||||
if (self->conn_handle != BLE_CONN_HANDLE_INVALID) {
|
||||
bleio_connection_internal_t *connection = bleio_conn_handle_to_connection(self->conn_handle);
|
||||
if (connection) {
|
||||
return MIN(MIN(common_hal_bleio_connection_get_max_packet_length(connection),
|
||||
self->max_packet_size),
|
||||
self->characteristic->max_length);
|
||||
}
|
||||
}
|
||||
// There's no current connection, so we don't know the MTU, and
|
||||
// we can't tell what the largest outgoing packet length would be.
|
||||
return -1;
|
||||
}
|
||||
return MIN(self->characteristic->max_length, self->max_packet_size);
|
||||
}
|
||||
|
||||
bool common_hal_bleio_packet_buffer_deinited(bleio_packet_buffer_obj_t *self) {
|
||||
return self->characteristic == NULL;
|
||||
}
|
||||
|
||||
void common_hal_bleio_packet_buffer_deinit(bleio_packet_buffer_obj_t *self) {
|
||||
if (!common_hal_bleio_packet_buffer_deinited(self)) {
|
||||
bleio_characteristic_clear_observer(self->characteristic);
|
||||
}
|
||||
}
|
||||
54
devices/ble_hci/common-hal/_bleio/PacketBuffer.h
Normal file
54
devices/ble_hci/common-hal/_bleio/PacketBuffer.h
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2019-2020 Scott Shawcroft for Adafruit Industries
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef MICROPY_INCLUDED_BLE_HCI_COMMON_HAL_PACKETBUFFER_H
|
||||
#define MICROPY_INCLUDED_BLE_HCI_COMMON_HAL_PACKETBUFFER_H
|
||||
|
||||
#include "py/ringbuf.h"
|
||||
#include "shared-bindings/_bleio/Characteristic.h"
|
||||
|
||||
typedef struct {
|
||||
mp_obj_base_t base;
|
||||
bleio_characteristic_obj_t *characteristic;
|
||||
// Ring buffer storing consecutive incoming values.
|
||||
ringbuf_t ringbuf;
|
||||
// Two outgoing buffers to alternate between. One will be queued for transmission by the SD and
|
||||
// the other is waiting to be queued and can be extended.
|
||||
uint8_t *outgoing[2];
|
||||
volatile uint16_t pending_size;
|
||||
// We remember the conn_handle so we can do a NOTIFY/INDICATE to a client.
|
||||
// We can find out the conn_handle on a Characteristic write or a CCCD write (but not a read).
|
||||
volatile uint16_t conn_handle;
|
||||
uint16_t max_packet_size;
|
||||
uint8_t pending_index;
|
||||
uint8_t write_type;
|
||||
bool client;
|
||||
bool packet_queued;
|
||||
} bleio_packet_buffer_obj_t;
|
||||
|
||||
void bleio_packet_buffer_update(bleio_packet_buffer_obj_t *self, mp_buffer_info_t *bufinfo);
|
||||
|
||||
#endif // MICROPY_INCLUDED_BLE_HCI_COMMON_HAL_PACKETBUFFER_H
|
||||
129
devices/ble_hci/common-hal/_bleio/Service.c
Normal file
129
devices/ble_hci/common-hal/_bleio/Service.c
Normal file
|
|
@ -0,0 +1,129 @@
|
|||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2020 Dan Halbert for Adafruit Industries
|
||||
* Copyright (c) 2018 Artur Pacholec
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "py/runtime.h"
|
||||
#include "shared-bindings/_bleio/__init__.h"
|
||||
#include "shared-bindings/_bleio/Characteristic.h"
|
||||
#include "shared-bindings/_bleio/Descriptor.h"
|
||||
#include "shared-bindings/_bleio/Service.h"
|
||||
#include "shared-bindings/_bleio/Adapter.h"
|
||||
|
||||
uint32_t _common_hal_bleio_service_construct(bleio_service_obj_t *self, bleio_uuid_obj_t *uuid, bool is_secondary, mp_obj_list_t *characteristic_list) {
|
||||
self->uuid = uuid;
|
||||
self->characteristic_list = characteristic_list;
|
||||
self->is_remote = false;
|
||||
self->connection = NULL;
|
||||
self->is_secondary = is_secondary;
|
||||
|
||||
vm_used_ble = true;
|
||||
|
||||
self->handle = bleio_adapter_add_attribute(&common_hal_bleio_adapter_obj, MP_OBJ_TO_PTR(self));
|
||||
self->start_handle = self->handle;
|
||||
self->end_handle = self->handle;
|
||||
if (self->handle == BLE_GATT_HANDLE_INVALID) {
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void common_hal_bleio_service_construct(bleio_service_obj_t *self, bleio_uuid_obj_t *uuid, bool is_secondary) {
|
||||
if (_common_hal_bleio_service_construct(self, uuid, is_secondary,
|
||||
mp_obj_new_list(0, NULL)) != 0) {
|
||||
mp_raise_RuntimeError(translate("Failed to add service"));
|
||||
}
|
||||
}
|
||||
|
||||
void bleio_service_from_connection(bleio_service_obj_t *self, mp_obj_t connection) {
|
||||
self->handle = 0xFFFF;
|
||||
self->uuid = NULL;
|
||||
self->characteristic_list = mp_obj_new_list(0, NULL);
|
||||
self->is_remote = true;
|
||||
self->is_secondary = false;
|
||||
self->connection = connection;
|
||||
}
|
||||
|
||||
bleio_uuid_obj_t *common_hal_bleio_service_get_uuid(bleio_service_obj_t *self) {
|
||||
return self->uuid;
|
||||
}
|
||||
|
||||
mp_obj_tuple_t *common_hal_bleio_service_get_characteristics(bleio_service_obj_t *self) {
|
||||
return mp_obj_new_tuple(self->characteristic_list->len, self->characteristic_list->items);
|
||||
}
|
||||
|
||||
bool common_hal_bleio_service_get_is_remote(bleio_service_obj_t *self) {
|
||||
return self->is_remote;
|
||||
}
|
||||
|
||||
bool common_hal_bleio_service_get_is_secondary(bleio_service_obj_t *self) {
|
||||
return self->is_secondary;
|
||||
}
|
||||
|
||||
void common_hal_bleio_service_add_characteristic(bleio_service_obj_t *self,
|
||||
bleio_characteristic_obj_t *characteristic,
|
||||
mp_buffer_info_t *initial_value_bufinfo) {
|
||||
|
||||
if (self->handle != common_hal_bleio_adapter_obj.last_added_service_handle) {
|
||||
mp_raise_bleio_BluetoothError(
|
||||
translate("Characteristic can only be added to most recently added service"));
|
||||
}
|
||||
characteristic->decl_handle = bleio_adapter_add_attribute(
|
||||
&common_hal_bleio_adapter_obj, MP_OBJ_TO_PTR(characteristic));
|
||||
// This is the value handle.
|
||||
characteristic->handle = bleio_adapter_add_attribute(
|
||||
&common_hal_bleio_adapter_obj, MP_OBJ_TO_PTR(characteristic));
|
||||
|
||||
self->end_handle = characteristic->handle;
|
||||
|
||||
if (characteristic->props & (CHAR_PROP_NOTIFY | CHAR_PROP_INDICATE)) {
|
||||
// We need a CCCD if this characteristic is doing notify or indicate.
|
||||
bleio_descriptor_obj_t *cccd = m_new_obj(bleio_descriptor_obj_t);
|
||||
cccd->base.type = &bleio_descriptor_type;
|
||||
|
||||
uint16_t zero = 0;
|
||||
mp_buffer_info_t zero_cccd_value = {
|
||||
.buf = &zero,
|
||||
.len = sizeof(zero),
|
||||
};
|
||||
|
||||
common_hal_bleio_descriptor_construct(
|
||||
cccd,
|
||||
characteristic,
|
||||
&cccd_uuid, // 0x2902
|
||||
SECURITY_MODE_OPEN, // CCCD read perm
|
||||
characteristic->read_perm, // Make CCCD write perm match characteristic read perm.
|
||||
2, // 2 bytes
|
||||
true, // fixed length
|
||||
&zero_cccd_value // Initial value is 0.
|
||||
);
|
||||
|
||||
// Adds CCCD to attribute table, and also extends self->end_handle to include the CCCD.
|
||||
common_hal_bleio_characteristic_add_descriptor(characteristic, cccd);
|
||||
characteristic->cccd = cccd;
|
||||
}
|
||||
|
||||
mp_obj_list_append(self->characteristic_list, MP_OBJ_FROM_PTR(characteristic));
|
||||
}
|
||||
54
devices/ble_hci/common-hal/_bleio/Service.h
Normal file
54
devices/ble_hci/common-hal/_bleio/Service.h
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2018 Dan Halbert for Adafruit Industries
|
||||
* Copyright (c) 2018 Artur Pacholec
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef MICROPY_INCLUDED_BLE_HCI_COMMON_HAL_SERVICE_H
|
||||
#define MICROPY_INCLUDED_BLE_HCI_COMMON_HAL_SERVICE_H
|
||||
|
||||
#include "py/objlist.h"
|
||||
#include "common-hal/_bleio/UUID.h"
|
||||
|
||||
typedef struct bleio_service_obj {
|
||||
mp_obj_base_t base;
|
||||
// Handle for the local service.
|
||||
uint16_t handle;
|
||||
// True if created during discovery.
|
||||
bool is_remote;
|
||||
bool is_secondary;
|
||||
bleio_uuid_obj_t *uuid;
|
||||
// The connection object is set only when this is a remote service.
|
||||
// A local service doesn't know the connection.
|
||||
mp_obj_t connection;
|
||||
mp_obj_list_t *characteristic_list;
|
||||
// Range of attribute handles of this service.
|
||||
uint16_t start_handle;
|
||||
uint16_t end_handle;
|
||||
struct bleio_service_obj *next;
|
||||
} bleio_service_obj_t;
|
||||
|
||||
void bleio_service_from_connection(bleio_service_obj_t *self, mp_obj_t connection);
|
||||
|
||||
#endif // MICROPY_INCLUDED_BLE_HCI_COMMON_HAL_SERVICE_H
|
||||
75
devices/ble_hci/common-hal/_bleio/UUID.c
Normal file
75
devices/ble_hci/common-hal/_bleio/UUID.c
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2018 Dan Halbert for Adafruit Industries
|
||||
* Copyright (c) 2018 Artur Pacholec
|
||||
* Copyright (c) 2016 Glenn Ruben Bakke
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "py/runtime.h"
|
||||
#include "common-hal/_bleio/UUID.h"
|
||||
#include "shared-bindings/_bleio/__init__.h"
|
||||
#include "shared-bindings/_bleio/Adapter.h"
|
||||
|
||||
// If uuid128 is NULL, this is a Bluetooth SIG 16-bit UUID.
|
||||
// If uuid128 is not NULL, it's a 128-bit (16-byte) UUID, with bytes 12 and 13 zero'd out, where
|
||||
// the 16-bit part goes. Those 16 bits are passed in uuid16.
|
||||
void common_hal_bleio_uuid_construct(bleio_uuid_obj_t *self, mp_int_t uuid16, const uint8_t uuid128[16]) {
|
||||
self->size = uuid128 == NULL ? 16 : 128;
|
||||
self->uuid16 = uuid16;
|
||||
if (uuid128) {
|
||||
memcpy(self->uuid128, uuid128, 16);
|
||||
self->uuid128[12] = uuid16 & 0xff;
|
||||
self->uuid128[13] = uuid16 >> 8;
|
||||
} else {
|
||||
memset(self->uuid128, 0, 16);
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t common_hal_bleio_uuid_get_size(bleio_uuid_obj_t *self) {
|
||||
return self->size;
|
||||
}
|
||||
|
||||
uint32_t common_hal_bleio_uuid_get_uuid16(bleio_uuid_obj_t *self) {
|
||||
return self->uuid16;
|
||||
}
|
||||
|
||||
void common_hal_bleio_uuid_get_uuid128(bleio_uuid_obj_t *self, uint8_t uuid128[16]) {
|
||||
memcpy(uuid128, self->uuid128, 16);
|
||||
}
|
||||
|
||||
void common_hal_bleio_uuid_pack_into(bleio_uuid_obj_t *self, uint8_t *buf) {
|
||||
if (self->size == 16) {
|
||||
buf[0] = self->uuid16 & 0xff;
|
||||
buf[1] = self->uuid16 >> 8;
|
||||
} else {
|
||||
common_hal_bleio_uuid_get_uuid128(self, buf);
|
||||
}
|
||||
}
|
||||
|
||||
// Return a uui16 only if this is a standard uuid. Otherwise return BLE_UUID_UNKNOWN.
|
||||
uint16_t bleio_uuid_get_uuid16_or_unknown(bleio_uuid_obj_t *uuid) {
|
||||
return uuid->size == 16 ? uuid->uuid16 : BLE_UUID_UNKNOWN;
|
||||
}
|
||||
58
devices/ble_hci/common-hal/_bleio/UUID.h
Normal file
58
devices/ble_hci/common-hal/_bleio/UUID.h
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2019 Dan Halbert for Adafruit Industries
|
||||
* Copyright (c) 2018 Artur Pacholec
|
||||
* Copyright (c) 2016 Glenn Ruben Bakke
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef MICROPY_INCLUDED_BLE_HCI_COMMON_HAL_UUID_H
|
||||
#define MICROPY_INCLUDED_BLE_HCI_COMMON_HAL_UUID_H
|
||||
|
||||
#include "py/obj.h"
|
||||
|
||||
// Types returned by attribute table lookups. These are UUIDs.
|
||||
typedef enum {
|
||||
BLE_UUID_UNKNOWN = 0x0000,
|
||||
BLE_UUID_SERVICE_PRIMARY = 0x2800,
|
||||
BLE_UUID_SERVICE_SECONDARY = 0x2801,
|
||||
BLE_UUID_SERVICE_INCLUDE = 0x2802,// not yet implemented by us
|
||||
BLE_UUID_CHARACTERISTIC = 0x2803,
|
||||
BLE_UUID_CHAR_EXTENDED_PROPS = 0x2900,// not yet implemented by us
|
||||
BLE_UUID_CHAR_USER_DESC = 0x2901,// not yet implemented by us
|
||||
BLE_UUID_CCCD = 0x2902,
|
||||
BLE_UUID_SCCD = 0x2903,// not yet implemented by us
|
||||
BLE_UUID_CHAR_PRESENTATION_FMT = 0x2904, // not yet implemented by us
|
||||
BLE_UUID_CHAR_AGGREGATE_FMT = 0x2905,// not yet implemented by us
|
||||
} ble_standard_uuid;
|
||||
|
||||
typedef struct {
|
||||
mp_obj_base_t base;
|
||||
uint8_t size;
|
||||
uint16_t uuid16;
|
||||
uint8_t uuid128[16];
|
||||
} bleio_uuid_obj_t;
|
||||
|
||||
uint16_t bleio_uuid_get_uuid16_or_unknown(bleio_uuid_obj_t *uuid);
|
||||
|
||||
#endif // MICROPY_INCLUDED_BLE_HCI_COMMON_HAL_UUID_H
|
||||
112
devices/ble_hci/common-hal/_bleio/__init__.c
Normal file
112
devices/ble_hci/common-hal/_bleio/__init__.c
Normal file
|
|
@ -0,0 +1,112 @@
|
|||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2018 Dan Halbert for Adafruit Industries
|
||||
* Copyright (c) 2018 Artur Pacholec
|
||||
* Copyright (c) 2016 Glenn Ruben Bakke
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "py/runtime.h"
|
||||
#include "shared-bindings/_bleio/__init__.h"
|
||||
#include "shared-bindings/_bleio/Adapter.h"
|
||||
#include "shared-bindings/_bleio/Characteristic.h"
|
||||
#include "shared-bindings/_bleio/Connection.h"
|
||||
#include "shared-bindings/_bleio/Descriptor.h"
|
||||
#include "shared-bindings/_bleio/Service.h"
|
||||
#include "shared-bindings/_bleio/UUID.h"
|
||||
#include "supervisor/shared/bluetooth.h"
|
||||
|
||||
// UUID shared by all cccd's.
|
||||
bleio_uuid_obj_t cccd_uuid;
|
||||
|
||||
bool vm_used_ble;
|
||||
|
||||
// void check_sec_status(uint8_t sec_status) {
|
||||
// if (sec_status == BLE_GAP_SEC_STATUS_SUCCESS) {
|
||||
// return;
|
||||
// }
|
||||
|
||||
// switch (sec_status) {
|
||||
// case BLE_GAP_SEC_STATUS_UNSPECIFIED:
|
||||
// mp_raise_bleio_SecurityError(translate("Unspecified issue. Can be that the pairing prompt on the other device was declined or ignored."));
|
||||
// return;
|
||||
// default:
|
||||
// mp_raise_bleio_SecurityError(translate("Unknown security error: 0x%04x"), sec_status);
|
||||
// }
|
||||
// }
|
||||
|
||||
// Turn off BLE on a reset or reload.
|
||||
void bleio_reset() {
|
||||
// Create a UUID object for all CCCD's.
|
||||
cccd_uuid.base.type = &bleio_uuid_type;
|
||||
common_hal_bleio_uuid_construct(&cccd_uuid, BLE_UUID_CCCD, NULL);
|
||||
|
||||
bleio_hci_reset();
|
||||
|
||||
if (!common_hal_bleio_adapter_get_enabled(&common_hal_bleio_adapter_obj)) {
|
||||
return;
|
||||
}
|
||||
bleio_adapter_reset(&common_hal_bleio_adapter_obj);
|
||||
if (!vm_used_ble) {
|
||||
// No user-code BLE operations were done, so we can maintain the supervisor state.
|
||||
return;
|
||||
}
|
||||
common_hal_bleio_adapter_set_enabled(&common_hal_bleio_adapter_obj, false);
|
||||
common_hal_bleio_adapter_obj.allocated = false;
|
||||
|
||||
bleio_set_adapter(mp_const_none);
|
||||
|
||||
// FIX bonding_reset();
|
||||
supervisor_start_bluetooth();
|
||||
}
|
||||
|
||||
// The singleton _bleio.Adapter object, bound to _bleio.adapter
|
||||
bleio_adapter_obj_t common_hal_bleio_adapter_obj = {
|
||||
.base = {
|
||||
.type = &bleio_adapter_type,
|
||||
},
|
||||
};
|
||||
|
||||
bleio_adapter_obj_t *common_hal_bleio_allocate_adapter_or_raise(void) {
|
||||
if (common_hal_bleio_adapter_obj.allocated) {
|
||||
mp_raise_RuntimeError(translate("Too many Adapters"));
|
||||
}
|
||||
return &common_hal_bleio_adapter_obj;
|
||||
}
|
||||
|
||||
void common_hal_bleio_check_connected(uint16_t conn_handle) {
|
||||
if (conn_handle == BLE_CONN_HANDLE_INVALID) {
|
||||
mp_raise_ConnectionError(translate("Not connected"));
|
||||
}
|
||||
}
|
||||
|
||||
void common_hal_bleio_gc_collect(void) {
|
||||
bleio_adapter_gc_collect(&common_hal_bleio_adapter_obj);
|
||||
}
|
||||
|
||||
|
||||
void bleio_background(void) {
|
||||
bleio_adapter_background(&common_hal_bleio_adapter_obj);
|
||||
}
|
||||
62
devices/ble_hci/common-hal/_bleio/__init__.h
Normal file
62
devices/ble_hci/common-hal/_bleio/__init__.h
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2018 Dan Halbert for Adafruit Industries
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef MICROPY_INCLUDED_BLE_HCI_COMMON_HAL_INIT_H
|
||||
#define MICROPY_INCLUDED_BLE_HCI_COMMON_HAL_INIT_H
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "shared-bindings/_bleio/UUID.h"
|
||||
|
||||
#include "att.h"
|
||||
#include "hci.h"
|
||||
|
||||
void bleio_background(void);
|
||||
void bleio_reset(void);
|
||||
|
||||
typedef struct {
|
||||
// ble_gap_enc_key_t own_enc;
|
||||
// ble_gap_enc_key_t peer_enc;
|
||||
// ble_gap_id_key_t peer_id;
|
||||
} bonding_keys_t;
|
||||
|
||||
// We assume variable length data.
|
||||
// 20 bytes max (23 - 3).
|
||||
#define GATT_MAX_DATA_LENGTH (BT_ATT_DEFAULT_LE_MTU - 3)
|
||||
|
||||
// FIX
|
||||
#define BLE_GATT_HANDLE_INVALID 0x0000
|
||||
#define BLE_CONN_HANDLE_INVALID 0xFFFF
|
||||
#define BLE_GATTS_FIX_ATTR_LEN_MAX (510) /**< Maximum length for fixed length Attribute Values. */
|
||||
#define BLE_GATTS_VAR_ATTR_LEN_MAX (512) /**< Maximum length for variable length Attribute Values. */
|
||||
|
||||
// Track if the user code modified the BLE state to know if we need to undo it on reload.
|
||||
extern bool vm_used_ble;
|
||||
|
||||
// UUID shared by all CCCD's.
|
||||
extern bleio_uuid_obj_t cccd_uuid;
|
||||
|
||||
#endif // MICROPY_INCLUDED_BLE_HCI_COMMON_HAL_INIT_H
|
||||
1788
devices/ble_hci/common-hal/_bleio/att.c
Normal file
1788
devices/ble_hci/common-hal/_bleio/att.c
Normal file
File diff suppressed because it is too large
Load diff
57
devices/ble_hci/common-hal/_bleio/att.h
Normal file
57
devices/ble_hci/common-hal/_bleio/att.h
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
// Derived from ArduinoBLE.
|
||||
// Copyright 2020 Dan Halbert for Adafruit Industries
|
||||
|
||||
/*
|
||||
This file is part of the ArduinoBLE library.
|
||||
Copyright (c) 2018 Arduino SA. All rights reserved.
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef MICROPY_INCLUDED_DEVICES_BLE_HCI_COMMON_HAL_BLEIO_ATT_H
|
||||
#define MICROPY_INCLUDED_DEVICES_BLE_HCI_COMMON_HAL_BLEIO_ATT_H
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "hci_include/addr.h"
|
||||
#include "hci_include/att.h"
|
||||
#include "hci_include/att_internal.h"
|
||||
|
||||
void bleio_att_reset(void);
|
||||
|
||||
// FIX void att_set_event_handler(BLEDeviceEvent event, BLEDeviceEventHandler eventHandler);
|
||||
bool att_address_is_connected(bt_addr_le_t *addr);
|
||||
bool att_connect_to_address(bt_addr_le_t *addr);
|
||||
bool att_disconnect(uint16_t conn_handle);
|
||||
bool att_disconnect_all(void);
|
||||
bool att_discover_attributes(bt_addr_le_t *addr, const char *service_uuid_filter);
|
||||
bool att_exchange_mtu(uint16_t conn_handle);
|
||||
bool att_handle_is_connected(uint16_t handle);
|
||||
bool att_indicate(uint16_t handle, const uint8_t *value, int length);
|
||||
bool att_is_connected(void);
|
||||
bool att_notify(uint16_t handle, const uint8_t *value, int length);
|
||||
int att_read_req(uint16_t conn_handle, uint16_t handle, uint8_t response_buffer[]);
|
||||
int att_write_req(uint16_t conn_handle, uint16_t handle, const uint8_t *data, uint8_t data_len, uint8_t response_buffer[]);
|
||||
uint16_t att_conn_handle(bt_addr_le_t *addr);
|
||||
uint16_t att_mtu(uint16_t handle);
|
||||
void att_add_connection(uint16_t handle, uint8_t role, bt_addr_le_t *peer_addr, uint16_t interval, uint16_t latency, uint16_t supervision_timeout, uint8_t master_clock_accuracy);
|
||||
void att_process_data(uint16_t conn_handle, uint8_t dlen, uint8_t data[]);
|
||||
void att_remove_connection(uint16_t conn_handle, uint8_t reason);
|
||||
void att_set_max_mtu(uint16_t max_mtu);
|
||||
void att_set_timeout(unsigned long timeout);
|
||||
void att_write_cmd(uint16_t conn_handle, uint16_t handle, const uint8_t *data, uint8_t data_len);
|
||||
|
||||
#endif // MICROPY_INCLUDED_DEVICES_BLE_HCI_COMMON_HAL_BLEIO_ATT_H
|
||||
805
devices/ble_hci/common-hal/_bleio/hci.c
Normal file
805
devices/ble_hci/common-hal/_bleio/hci.c
Normal file
|
|
@ -0,0 +1,805 @@
|
|||
// This file is derived from the ArduinoBLE library. Its header is below.
|
||||
/*
|
||||
This file is part of the ArduinoBLE library.
|
||||
Copyright (c) 2018 Arduino SA. All rights reserved.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include "att.h"
|
||||
#include "hci.h"
|
||||
|
||||
#include "py/obj.h"
|
||||
#include "py/mperrno.h"
|
||||
#include "py/runtime.h"
|
||||
|
||||
// Zephyr include files to define HCI communication values and structs.
|
||||
#include "hci_include/hci.h"
|
||||
#include "hci_include/hci_err.h"
|
||||
#include "hci_include/l2cap_internal.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "py/mphal.h" // *****************************
|
||||
#include "supervisor/shared/tick.h"
|
||||
#include "shared-bindings/_bleio/__init__.h"
|
||||
#include "common-hal/_bleio/Adapter.h"
|
||||
#include "shared-bindings/microcontroller/__init__.h"
|
||||
|
||||
// Set to 1 for extensive HCI packet logging.
|
||||
#define HCI_DEBUG 0
|
||||
|
||||
// HCI H4 protocol packet types: first byte in the packet.
|
||||
#define H4_CMD 0x01
|
||||
#define H4_ACL 0x02
|
||||
#define H4_SCO 0x03
|
||||
#define H4_EVT 0x04
|
||||
|
||||
#define CTS_TIMEOUT_MSECS (1000)
|
||||
#define RESPONSE_TIMEOUT_MSECS (1000)
|
||||
|
||||
// These are the headers of the full packets that are sent over the serial interface.
|
||||
// They all have a one-byte type-field at the front, one of the H4_xxx packet types.
|
||||
|
||||
typedef struct __attribute__ ((packed)) {
|
||||
uint8_t pkt_type;
|
||||
uint16_t opcode;
|
||||
uint8_t param_len;
|
||||
uint8_t params[];
|
||||
} h4_hci_cmd_pkt_t;
|
||||
|
||||
#define ACL_DATA_PB_FIRST_NON_FLUSH 0
|
||||
#define ACL_DATA_PB_MIDDLE 1
|
||||
#define ACL_DATA_PB_FIRST_FLUSH 2
|
||||
#define ACL_DATA_PB_FULL 3
|
||||
|
||||
typedef struct __attribute__ ((packed)) {
|
||||
uint8_t pkt_type;
|
||||
uint16_t handle : 12;
|
||||
uint8_t pb : 2; // Packet boundary flag: ACL_DATA_PB values.
|
||||
uint8_t bc : 2; // Broadcast flag: always 0b00 for BLE.
|
||||
uint16_t data_len; // length of data[] in this packet.
|
||||
uint8_t data[];
|
||||
} h4_hci_acl_pkt_t;
|
||||
|
||||
// The ACL data in an h4_hci_acl_pkt_t may be fragmented across
|
||||
// multiple ACL_DATA packets, and need to be recombined. This is the
|
||||
// structure of the combined packet or the first fragment.
|
||||
typedef struct __attribute__ ((packed)) {
|
||||
uint16_t acl_data_len; // Length of acl_data. Does not include this header.
|
||||
uint16_t cid; // Channel ID.
|
||||
uint8_t acl_data[]; // Length is acl_data_len of full packet.
|
||||
} acl_data_t;
|
||||
|
||||
typedef struct __attribute__ ((packed)) {
|
||||
uint8_t pkt_type;
|
||||
uint8_t evt;
|
||||
uint8_t param_len;
|
||||
uint8_t params[];
|
||||
} h4_hci_evt_pkt_t;
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Static storage:
|
||||
|
||||
// FIX size
|
||||
#define RX_BUFFER_SIZE (3 + 255)
|
||||
#define ACL_DATA_BUFFER_SIZE (255)
|
||||
|
||||
STATIC uint8_t rx_buffer[RX_BUFFER_SIZE];
|
||||
STATIC size_t rx_idx;
|
||||
|
||||
STATIC uint8_t acl_data_buffer[ACL_DATA_BUFFER_SIZE];
|
||||
STATIC size_t acl_data_len;
|
||||
|
||||
STATIC size_t num_command_packets_allowed;
|
||||
STATIC volatile size_t pending_pkt;
|
||||
|
||||
// Results from parsing a command response packet.
|
||||
STATIC bool cmd_response_received;
|
||||
STATIC uint16_t cmd_response_opcode;
|
||||
STATIC uint8_t cmd_response_status;
|
||||
STATIC size_t cmd_response_len;
|
||||
STATIC uint8_t *cmd_response_data;
|
||||
|
||||
STATIC volatile bool hci_poll_in_progress = false;
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
#if HCI_DEBUG
|
||||
#include "hci_debug.c"
|
||||
#endif // HCI_DEBUG
|
||||
|
||||
STATIC void process_acl_data_pkt(uint8_t pkt_len, uint8_t pkt_data[]) {
|
||||
h4_hci_acl_pkt_t *pkt = (h4_hci_acl_pkt_t *)pkt_data;
|
||||
|
||||
if (pkt->pb != ACL_DATA_PB_MIDDLE) {
|
||||
// This is the start of a fragmented acl_data packet or is a full packet.
|
||||
memcpy(acl_data_buffer, pkt->data, pkt->data_len);
|
||||
acl_data_len = pkt->data_len;
|
||||
} else {
|
||||
// This is a middle or end fragment of acl data.
|
||||
// Append to the accumulated data so far.
|
||||
memcpy(&acl_data_buffer[acl_data_len], pkt->data, pkt->data_len);
|
||||
acl_data_len += pkt->data_len;
|
||||
}
|
||||
|
||||
acl_data_t *acl = (acl_data_t *)&acl_data_buffer;
|
||||
if (acl_data_len != sizeof(acl) + acl->acl_data_len) {
|
||||
// We don't have the full packet yet.
|
||||
return;
|
||||
}
|
||||
|
||||
if (acl->cid == BT_L2CAP_CID_ATT) {
|
||||
att_process_data(pkt->handle, acl->acl_data_len, acl->acl_data);
|
||||
}
|
||||
// } else if (aclHdr->cid == BT_L2CAP_CID_LE_SIG) {
|
||||
// L2CAPSignaling.handleData(aclHdr->handle & 0x0fff, aclHdr->len, &rx_buffer[1 + sizeof(HCIACLHdr)]);
|
||||
// } else {
|
||||
// struct __attribute__ ((packed)) {
|
||||
// uint8_t op;
|
||||
// uint8_t id;
|
||||
// uint16_t length;
|
||||
// uint16_t reason;
|
||||
// uint16_t localCid;
|
||||
// uint16_t remoteCid;
|
||||
// } l2capRejectCid= { 0x01, 0x00, 0x006, 0x0002, aclHdr->cid, 0x0000 };
|
||||
|
||||
// sendAclPkt(aclHdr->handle & 0x0fff, 0x0005, sizeof(l2capRejectCid), &l2capRejectCid);
|
||||
// }
|
||||
}
|
||||
|
||||
// Process number of completed packets. Reduce number of pending packets by reported
|
||||
// number of completed.
|
||||
STATIC void process_num_comp_pkts(uint16_t handle, uint16_t num_pkts) {
|
||||
if (num_pkts && pending_pkt > num_pkts) {
|
||||
pending_pkt -= num_pkts;
|
||||
} else {
|
||||
pending_pkt = 0;
|
||||
}
|
||||
}
|
||||
|
||||
STATIC void process_evt_pkt(size_t pkt_len, uint8_t pkt_data[]) {
|
||||
h4_hci_evt_pkt_t *pkt = (h4_hci_evt_pkt_t *)pkt_data;
|
||||
|
||||
switch (pkt->evt) {
|
||||
case BT_HCI_EVT_DISCONN_COMPLETE: {
|
||||
struct bt_hci_evt_disconn_complete *disconn_complete =
|
||||
(struct bt_hci_evt_disconn_complete *)pkt->params;
|
||||
(void)disconn_complete;
|
||||
|
||||
att_remove_connection(disconn_complete->handle, disconn_complete->reason);
|
||||
// FIX L2CAPSignaling.removeConnection(disconn_complete->handle, disconn_complete->reason);
|
||||
break;
|
||||
}
|
||||
|
||||
case BT_HCI_EVT_CMD_COMPLETE: {
|
||||
struct cmd_complete_with_status {
|
||||
struct bt_hci_evt_cmd_complete cmd_complete;
|
||||
struct bt_hci_evt_cc_status cc_status;
|
||||
} __packed;
|
||||
|
||||
struct cmd_complete_with_status *evt = (struct cmd_complete_with_status *)pkt->params;
|
||||
|
||||
num_command_packets_allowed = evt->cmd_complete.ncmd;
|
||||
|
||||
cmd_response_received = true;
|
||||
cmd_response_opcode = evt->cmd_complete.opcode;
|
||||
cmd_response_status = evt->cc_status.status;
|
||||
// All the bytes following cmd_complete, -including- the status byte, which is
|
||||
// included in all the _bt_hci_rp_* structs.
|
||||
cmd_response_data = (uint8_t *)&evt->cc_status;
|
||||
// Includes status byte.
|
||||
cmd_response_len = pkt->param_len - sizeof_field(struct cmd_complete_with_status, cmd_complete);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case BT_HCI_EVT_CMD_STATUS: {
|
||||
struct bt_hci_evt_cmd_status *evt = (struct bt_hci_evt_cmd_status *)pkt->params;
|
||||
|
||||
num_command_packets_allowed = evt->ncmd;
|
||||
|
||||
cmd_response_received = true;
|
||||
cmd_response_opcode = evt->opcode;
|
||||
cmd_response_status = evt->status;
|
||||
cmd_response_data = NULL;
|
||||
cmd_response_len = 0;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case BT_HCI_EVT_NUM_COMPLETED_PACKETS: {
|
||||
struct bt_hci_evt_num_completed_packets *evt =
|
||||
(struct bt_hci_evt_num_completed_packets *)pkt->params;
|
||||
|
||||
// Start at zero-th pair: (conn handle, num completed packets).
|
||||
struct bt_hci_handle_count *handle_and_count = &(evt->h[0]);
|
||||
for (uint8_t i = 0; i < evt->num_handles; i++) {
|
||||
process_num_comp_pkts(handle_and_count->handle, handle_and_count->count);
|
||||
handle_and_count++;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case BT_HCI_EVT_LE_META_EVENT: {
|
||||
struct bt_hci_evt_le_meta_event *meta_evt = (struct bt_hci_evt_le_meta_event *)pkt->params;
|
||||
uint8_t *le_evt = pkt->params + sizeof (struct bt_hci_evt_le_meta_event);
|
||||
|
||||
if (meta_evt->subevent == BT_HCI_EVT_LE_CONN_COMPLETE) {
|
||||
// Advertising stops when connection occurs.
|
||||
// We don't tell the adapter to stop, because stopping advertising
|
||||
// when it's already stopped seems to exercise a bug in the ESP32 HCI code:
|
||||
// It doesn't return a response.
|
||||
bleio_adapter_advertising_was_stopped(&common_hal_bleio_adapter_obj);
|
||||
|
||||
struct bt_hci_evt_le_conn_complete *le_conn_complete =
|
||||
(struct bt_hci_evt_le_conn_complete *)le_evt;
|
||||
|
||||
if (le_conn_complete->status == BT_HCI_ERR_SUCCESS) {
|
||||
att_add_connection(
|
||||
le_conn_complete->handle,
|
||||
le_conn_complete->role,
|
||||
&le_conn_complete->peer_addr,
|
||||
le_conn_complete->interval,
|
||||
le_conn_complete->latency,
|
||||
le_conn_complete->supv_timeout,
|
||||
le_conn_complete->clock_accuracy);
|
||||
|
||||
}
|
||||
} else if (meta_evt->subevent == BT_HCI_EVT_LE_ADVERTISING_REPORT) {
|
||||
struct bt_hci_evt_le_advertising_info *le_advertising_info =
|
||||
(struct bt_hci_evt_le_advertising_info *)le_evt;
|
||||
if (le_advertising_info->evt_type == BT_HCI_ADV_DIRECT_IND) {
|
||||
// FIX
|
||||
// last byte is RSSI
|
||||
// GAP.handleLeAdvertisingReport(leAdvertisingReport->type,
|
||||
// leAdvertisingReport->peerBdaddrType,
|
||||
// leAdvertisingReport->peerBdaddr,
|
||||
// leAdvertisingReport->eirLength,
|
||||
// leAdvertisingReport->eirData,
|
||||
// rssi); //FIX, don't separate
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
#if HCI_DEBUG
|
||||
mp_printf(&mp_plat_print, "process_evt_pkt: Unknown event: %02x\n");
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void bleio_hci_reset(void) {
|
||||
rx_idx = 0;
|
||||
pending_pkt = 0;
|
||||
hci_poll_in_progress = false;
|
||||
bleio_att_reset();
|
||||
}
|
||||
|
||||
hci_result_t hci_poll_for_incoming_pkt(void) {
|
||||
common_hal_mcu_disable_interrupts();
|
||||
if (hci_poll_in_progress) {
|
||||
common_hal_mcu_enable_interrupts();
|
||||
return HCI_OK;
|
||||
}
|
||||
hci_poll_in_progress = true;
|
||||
common_hal_mcu_enable_interrupts();
|
||||
|
||||
// Assert RTS low to say we're ready to read data.
|
||||
common_hal_digitalio_digitalinout_set_value(common_hal_bleio_adapter_obj.rts_digitalinout, false);
|
||||
|
||||
int errcode = 0;
|
||||
bool packet_is_complete = false;
|
||||
|
||||
// Read bytes until we run out. There may be more than one packet in the input buffer.
|
||||
while (!packet_is_complete &&
|
||||
common_hal_busio_uart_rx_characters_available(common_hal_bleio_adapter_obj.hci_uart) > 0) {
|
||||
|
||||
// Read just one character a a time, so we don't accidentally get part of a second
|
||||
// packet.
|
||||
size_t num_read =
|
||||
common_hal_busio_uart_read(common_hal_bleio_adapter_obj.hci_uart, rx_buffer + rx_idx, 1, &errcode);
|
||||
if (num_read == 0) {
|
||||
return HCI_OK;
|
||||
}
|
||||
if (errcode) {
|
||||
if (errcode == EAGAIN) {
|
||||
continue;
|
||||
}
|
||||
hci_poll_in_progress = false;
|
||||
mp_printf(&mp_plat_print, "HCI_READ_ERROR, errcode: %x\n", errcode);
|
||||
return HCI_READ_ERROR;
|
||||
}
|
||||
rx_idx++;
|
||||
if (rx_idx >= sizeof(rx_buffer)) {
|
||||
// Incoming packet is too large. Should not happen.
|
||||
return HCI_READ_ERROR;
|
||||
}
|
||||
|
||||
switch (rx_buffer[0]) {
|
||||
case H4_ACL:
|
||||
if (rx_idx >= sizeof(h4_hci_acl_pkt_t)) {
|
||||
const size_t total_len =
|
||||
sizeof(h4_hci_acl_pkt_t) + ((h4_hci_acl_pkt_t *)rx_buffer)->data_len;
|
||||
if (rx_idx == total_len) {
|
||||
packet_is_complete = true;
|
||||
}
|
||||
if (rx_idx > total_len) {
|
||||
return HCI_PACKET_SIZE_ERROR;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case H4_EVT:
|
||||
if (rx_idx >= sizeof(h4_hci_evt_pkt_t)) {
|
||||
const size_t total_len =
|
||||
sizeof(h4_hci_evt_pkt_t) + ((h4_hci_evt_pkt_t *)rx_buffer)->param_len;
|
||||
if (rx_idx == total_len) {
|
||||
packet_is_complete = true;
|
||||
}
|
||||
if (rx_idx > total_len) {
|
||||
return HCI_PACKET_SIZE_ERROR;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
// Unknown or bad packet type. Start over.
|
||||
rx_idx = 0;
|
||||
break;
|
||||
}
|
||||
} // end while
|
||||
|
||||
if (packet_is_complete) {
|
||||
// Stop incoming data while processing packet.
|
||||
common_hal_digitalio_digitalinout_set_value(common_hal_bleio_adapter_obj.rts_digitalinout, true);
|
||||
size_t pkt_len = rx_idx;
|
||||
|
||||
// Reset for next packet.
|
||||
rx_idx = 0;
|
||||
packet_is_complete = false;
|
||||
|
||||
switch (rx_buffer[0]) {
|
||||
case H4_ACL:
|
||||
#if HCI_DEBUG
|
||||
dump_acl_pkt(false, pkt_len, rx_buffer);
|
||||
#endif
|
||||
process_acl_data_pkt(pkt_len, rx_buffer);
|
||||
break;
|
||||
|
||||
case H4_EVT:
|
||||
#if HCI_DEBUG
|
||||
dump_evt_pkt(false, pkt_len, rx_buffer);
|
||||
#endif
|
||||
process_evt_pkt(pkt_len, rx_buffer);
|
||||
break;
|
||||
|
||||
default:
|
||||
#if HCI_DEBUG
|
||||
mp_printf(&mp_plat_print, "Unknown HCI packet type: %d\n", rx_buffer[0]);
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
|
||||
// Let incoming bytes flow again.
|
||||
common_hal_digitalio_digitalinout_set_value(common_hal_bleio_adapter_obj.rts_digitalinout, false);
|
||||
}
|
||||
|
||||
// All done with this batch. Hold off receiving bytes until we're ready again.
|
||||
///common_hal_digitalio_digitalinout_set_value(common_hal_bleio_adapter_obj.rts_digitalinout, true);
|
||||
hci_poll_in_progress = false;
|
||||
return HCI_OK;
|
||||
}
|
||||
|
||||
|
||||
STATIC hci_result_t write_pkt(uint8_t *buffer, size_t len) {
|
||||
// Wait for CTS to go low before writing to HCI adapter.
|
||||
uint64_t start = supervisor_ticks_ms64();
|
||||
|
||||
while (common_hal_digitalio_digitalinout_get_value(common_hal_bleio_adapter_obj.cts_digitalinout)) {
|
||||
RUN_BACKGROUND_TASKS;
|
||||
if (supervisor_ticks_ms64() - start > CTS_TIMEOUT_MSECS) {
|
||||
return HCI_WRITE_TIMEOUT;
|
||||
}
|
||||
}
|
||||
|
||||
int errcode = 0;
|
||||
common_hal_busio_uart_write(common_hal_bleio_adapter_obj.hci_uart, buffer, len, &errcode);
|
||||
if (errcode) {
|
||||
return HCI_WRITE_ERROR;
|
||||
}
|
||||
|
||||
return HCI_OK;
|
||||
}
|
||||
|
||||
STATIC hci_result_t send_command(uint16_t opcode, uint8_t params_len, void *params) {
|
||||
uint8_t cmd_pkt_len = sizeof(h4_hci_cmd_pkt_t) + params_len;
|
||||
uint8_t tx_buffer[cmd_pkt_len];
|
||||
|
||||
// cmd header is at the beginning of tx_buffer
|
||||
h4_hci_cmd_pkt_t *cmd_pkt = (h4_hci_cmd_pkt_t *)tx_buffer;
|
||||
cmd_pkt->pkt_type = H4_CMD;
|
||||
cmd_pkt->opcode = opcode;
|
||||
cmd_pkt->param_len = params_len;
|
||||
|
||||
memcpy(cmd_pkt->params, params, params_len);
|
||||
|
||||
#if HCI_DEBUG
|
||||
dump_cmd_pkt(true, sizeof(tx_buffer), tx_buffer);
|
||||
#endif
|
||||
|
||||
int result = write_pkt(tx_buffer, cmd_pkt_len);
|
||||
if (result != HCI_OK) {
|
||||
return result;
|
||||
}
|
||||
|
||||
cmd_response_received = false;
|
||||
|
||||
// Wait for a response. Note that other packets may be received that are not
|
||||
// command responses.
|
||||
uint64_t start = supervisor_ticks_ms64();
|
||||
while (supervisor_ticks_ms64() - start < RESPONSE_TIMEOUT_MSECS) {
|
||||
// RUN_BACKGROUND_TASKS includes hci_poll_for_incoming_pkt();
|
||||
RUN_BACKGROUND_TASKS;
|
||||
if (cmd_response_received && cmd_response_opcode == opcode) {
|
||||
// If this is definitely a response to the command that was sent,
|
||||
// return the status value, which will will be
|
||||
// BT_HCI_ERR_SUCCESS (0x00) if the command succeeded,
|
||||
// or a BT_HCI_ERR_x value (> 0x00) if there was a problem.
|
||||
return cmd_response_status;
|
||||
}
|
||||
}
|
||||
|
||||
// No I/O error, but no response sent back in time.
|
||||
return HCI_RESPONSE_TIMEOUT;
|
||||
}
|
||||
|
||||
hci_result_t hci_send_acl_pkt(uint16_t handle, uint8_t cid, uint16_t data_len, uint8_t *data) {
|
||||
// Wait for all backlogged packets to finish.
|
||||
while (pending_pkt >= common_hal_bleio_adapter_obj.max_acl_num_buffers) {
|
||||
// RUN_BACKGROUND_TASKS includes hci_poll_for_incoming_pkt();
|
||||
RUN_BACKGROUND_TASKS;
|
||||
}
|
||||
|
||||
// buf_len is size of entire packet including header.
|
||||
const size_t buf_len = sizeof(h4_hci_acl_pkt_t) + sizeof(acl_data_t) + data_len;
|
||||
uint8_t tx_buffer[buf_len];
|
||||
|
||||
h4_hci_acl_pkt_t *acl_pkt = (h4_hci_acl_pkt_t *)tx_buffer;
|
||||
acl_data_t *acl_data = (acl_data_t *)acl_pkt->data;
|
||||
acl_pkt->pkt_type = H4_ACL;
|
||||
acl_pkt->handle = handle;
|
||||
acl_pkt->pb = ACL_DATA_PB_FIRST_FLUSH;
|
||||
acl_pkt->bc = 0;
|
||||
acl_pkt->data_len = (uint16_t)(sizeof(acl_data_t) + data_len);
|
||||
acl_data->acl_data_len = data_len;
|
||||
acl_data->cid = cid;
|
||||
|
||||
memcpy(&acl_data->acl_data, data, data_len);
|
||||
|
||||
#if HCI_DEBUG
|
||||
dump_acl_pkt(true, buf_len, tx_buffer);
|
||||
#endif
|
||||
|
||||
pending_pkt++;
|
||||
|
||||
int errcode = 0;
|
||||
common_hal_busio_uart_write(common_hal_bleio_adapter_obj.hci_uart, tx_buffer, buf_len, &errcode);
|
||||
if (errcode) {
|
||||
return HCI_WRITE_ERROR;
|
||||
}
|
||||
return HCI_OK;
|
||||
}
|
||||
|
||||
hci_result_t hci_reset(void) {
|
||||
return send_command(BT_HCI_OP_RESET, 0, NULL);
|
||||
}
|
||||
|
||||
hci_result_t hci_read_local_version(uint8_t *hci_version, uint16_t *hci_revision, uint8_t *lmp_version, uint16_t *manufacturer, uint16_t *lmp_subversion) {
|
||||
hci_result_t result = send_command(BT_HCI_OP_READ_LOCAL_VERSION_INFO, 0, NULL);
|
||||
if (result == HCI_OK) {
|
||||
struct bt_hci_rp_read_local_version_info *response =
|
||||
(struct bt_hci_rp_read_local_version_info *)cmd_response_data;
|
||||
*hci_version = response->hci_version;
|
||||
*hci_revision = response->hci_revision;
|
||||
*lmp_version = response->lmp_version;
|
||||
*manufacturer = response->manufacturer;
|
||||
*lmp_subversion = response->lmp_subversion;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
hci_result_t hci_read_bd_addr(bt_addr_t *addr) {
|
||||
int result = send_command(BT_HCI_OP_READ_BD_ADDR, 0, NULL);
|
||||
if (result == HCI_OK) {
|
||||
struct bt_hci_rp_read_bd_addr *response = (struct bt_hci_rp_read_bd_addr *)cmd_response_data;
|
||||
memcpy(addr->val, response->bdaddr.val, sizeof_field(bt_addr_t, val));
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
hci_result_t hci_read_rssi(uint16_t handle, int *rssi) {
|
||||
int result = send_command(BT_HCI_OP_READ_RSSI, sizeof(handle), &handle);
|
||||
if (result == HCI_OK) {
|
||||
struct bt_hci_rp_read_rssi *response = (struct bt_hci_rp_read_rssi *)cmd_response_data;
|
||||
*rssi = response->rssi;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
hci_result_t hci_set_event_mask(uint64_t event_mask) {
|
||||
return send_command(BT_HCI_OP_SET_EVENT_MASK, sizeof(event_mask), &event_mask);
|
||||
}
|
||||
|
||||
hci_result_t hci_le_read_buffer_size(uint16_t *le_max_len, uint8_t *le_max_num) {
|
||||
int result = send_command(BT_HCI_OP_LE_READ_BUFFER_SIZE, 0, NULL);
|
||||
if (result == HCI_OK) {
|
||||
struct bt_hci_rp_le_read_buffer_size *response =
|
||||
(struct bt_hci_rp_le_read_buffer_size *)cmd_response_data;
|
||||
*le_max_len = response->le_max_len;
|
||||
*le_max_num = response->le_max_num;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
hci_result_t hci_read_buffer_size(uint16_t *acl_max_len, uint8_t *sco_max_len, uint16_t *acl_max_num, uint16_t *sco_max_num) {
|
||||
int result = send_command(BT_HCI_OP_READ_BUFFER_SIZE, 0, NULL);
|
||||
if (result == HCI_OK) {
|
||||
struct bt_hci_rp_read_buffer_size *response =
|
||||
(struct bt_hci_rp_read_buffer_size *)cmd_response_data;
|
||||
*acl_max_len = response->acl_max_len;
|
||||
*sco_max_len = response->sco_max_len;
|
||||
*acl_max_num = response->acl_max_num;
|
||||
*sco_max_num = response->sco_max_num;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
hci_result_t hci_le_set_random_address(uint8_t addr[6]) {
|
||||
return send_command(BT_HCI_OP_LE_SET_RANDOM_ADDRESS, 6, addr);
|
||||
}
|
||||
|
||||
hci_result_t hci_le_set_advertising_parameters(uint16_t min_interval, uint16_t max_interval, uint8_t type, uint8_t own_addr_type, bt_addr_le_t *direct_addr, uint8_t channel_map, uint8_t filter_policy) {
|
||||
struct bt_hci_cp_le_set_adv_param params = {
|
||||
.min_interval = min_interval,
|
||||
.max_interval = max_interval,
|
||||
.type = type,
|
||||
.own_addr_type = own_addr_type,
|
||||
// .direct_addr set below.
|
||||
.channel_map = channel_map,
|
||||
.filter_policy = filter_policy,
|
||||
};
|
||||
params.direct_addr.type = direct_addr->type;
|
||||
memcpy(params.direct_addr.a.val, direct_addr->a.val, sizeof(params.direct_addr.a.val));
|
||||
|
||||
return send_command(BT_HCI_OP_LE_SET_ADV_PARAM, sizeof(params), ¶ms);
|
||||
}
|
||||
|
||||
hci_result_t hci_le_set_extended_advertising_parameters(uint8_t handle, uint16_t props, uint32_t prim_min_interval, uint32_t prim_max_interval, uint8_t prim_channel_map, uint8_t own_addr_type, bt_addr_le_t *peer_addr, uint8_t filter_policy, int8_t tx_power, uint8_t prim_adv_phy, uint8_t sec_adv_max_skip, uint8_t sec_adv_phy, uint8_t sid, uint8_t scan_req_notify_enable) {
|
||||
struct bt_hci_cp_le_set_ext_adv_param params = {
|
||||
.handle = handle,
|
||||
.props = props,
|
||||
// .prim_min_interval and .prim_max_interval set below
|
||||
.prim_channel_map = prim_channel_map,
|
||||
.own_addr_type = own_addr_type,
|
||||
// .peer_addr set below.
|
||||
.tx_power = tx_power,
|
||||
.sec_adv_max_skip = sec_adv_max_skip,
|
||||
.sec_adv_phy = sec_adv_phy,
|
||||
.sid = sid,
|
||||
.scan_req_notify_enable = scan_req_notify_enable,
|
||||
};
|
||||
// Assumes little-endian.
|
||||
memcpy(params.prim_min_interval, (void *)&prim_min_interval,
|
||||
sizeof_field(struct bt_hci_cp_le_set_ext_adv_param, prim_min_interval));
|
||||
memcpy(params.prim_max_interval, (void *)&prim_max_interval,
|
||||
sizeof_field(struct bt_hci_cp_le_set_ext_adv_param, prim_max_interval));
|
||||
memcpy(params.peer_addr.a.val, peer_addr->a.val, sizeof_field(bt_addr_le_t, a.val));
|
||||
return send_command(BT_HCI_OP_LE_SET_EXT_ADV_PARAM, sizeof(params), ¶ms);
|
||||
}
|
||||
|
||||
hci_result_t hci_le_read_maximum_advertising_data_length(uint16_t *max_adv_data_len) {
|
||||
int result = send_command(BT_HCI_OP_LE_READ_MAX_ADV_DATA_LEN, 0, NULL);
|
||||
if (result == HCI_OK) {
|
||||
struct bt_hci_rp_le_read_max_adv_data_len *response =
|
||||
(struct bt_hci_rp_le_read_max_adv_data_len *)cmd_response_data;
|
||||
*max_adv_data_len = response->max_adv_data_len;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
hci_result_t hci_le_read_local_supported_features(uint8_t features[8]) {
|
||||
int result = send_command(BT_HCI_OP_LE_READ_LOCAL_FEATURES, 0, NULL);
|
||||
if (result == HCI_OK) {
|
||||
struct bt_hci_rp_le_read_local_features *response =
|
||||
(struct bt_hci_rp_le_read_local_features *)cmd_response_data;
|
||||
memcpy(features, response->features,
|
||||
sizeof_field(struct bt_hci_rp_le_read_local_features, features));
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
hci_result_t hci_le_set_advertising_data(uint8_t len, uint8_t data[]) {
|
||||
struct bt_hci_cp_le_set_adv_data params = {
|
||||
// Zero out unused data bytes.
|
||||
.data = { 0 },
|
||||
};
|
||||
|
||||
params.len = len;
|
||||
memcpy(params.data, data, len);
|
||||
|
||||
// All data bytes are sent even if some are unused.
|
||||
return send_command(BT_HCI_OP_LE_SET_ADV_DATA, sizeof(params), ¶ms);
|
||||
}
|
||||
|
||||
hci_result_t hci_le_set_extended_advertising_data(uint8_t handle, uint8_t op, uint8_t frag_pref, uint8_t len, uint8_t data[]) {
|
||||
const uint8_t max_len = sizeof_field(struct bt_hci_cp_le_set_ext_adv_data, data);
|
||||
uint8_t valid_len = MIN(len, max_len);
|
||||
struct bt_hci_cp_le_set_ext_adv_data params = {
|
||||
.handle = handle,
|
||||
.op = op,
|
||||
.frag_pref = frag_pref,
|
||||
.len = valid_len,
|
||||
};
|
||||
memcpy(params.data, data, valid_len);
|
||||
return send_command(BT_HCI_OP_LE_SET_EXT_ADV_DATA, sizeof(params) - (max_len - valid_len), ¶ms);
|
||||
}
|
||||
|
||||
|
||||
hci_result_t hci_le_set_scan_response_data(uint8_t len, uint8_t data[]) {
|
||||
struct bt_hci_cp_le_set_scan_rsp_data params = {
|
||||
// Zero out unused data bytes.
|
||||
.data = { 0 },
|
||||
};
|
||||
params.len = len;
|
||||
memcpy(params.data, data, len);
|
||||
|
||||
// All data bytes are sent even if some are unused.
|
||||
return send_command(BT_HCI_OP_LE_SET_SCAN_RSP_DATA, sizeof(params), ¶ms);
|
||||
}
|
||||
|
||||
hci_result_t hci_le_set_advertising_enable(uint8_t enable) {
|
||||
return send_command(BT_HCI_OP_LE_SET_ADV_ENABLE, sizeof(enable), &enable);
|
||||
}
|
||||
|
||||
hci_result_t hci_le_set_extended_advertising_enable(uint8_t enable, uint8_t set_num, uint8_t handle[], uint16_t duration[], uint8_t max_ext_adv_evts[]) {
|
||||
uint8_t params[sizeof(struct bt_hci_cp_le_set_ext_adv_enable) +
|
||||
set_num * (sizeof(struct bt_hci_ext_adv_set))];
|
||||
struct bt_hci_cp_le_set_ext_adv_enable *params_p = (struct bt_hci_cp_le_set_ext_adv_enable *)¶ms;
|
||||
params_p->enable = enable;
|
||||
params_p->set_num = set_num;
|
||||
for (size_t i = 0; i < set_num; i++) {
|
||||
params_p->s[i].handle = handle[i];
|
||||
params_p->s[i].duration = duration[i];
|
||||
params_p->s[i].max_ext_adv_evts = max_ext_adv_evts[i];
|
||||
}
|
||||
|
||||
return send_command(BT_HCI_OP_LE_SET_EXT_ADV_ENABLE, sizeof(params), ¶ms);
|
||||
}
|
||||
|
||||
hci_result_t hci_le_set_scan_parameters(uint8_t scan_type, uint16_t interval, uint16_t window, uint8_t addr_type, uint8_t filter_policy) {
|
||||
struct bt_hci_cp_le_set_scan_param params = {
|
||||
.scan_type = scan_type,
|
||||
.interval = interval,
|
||||
.window = window,
|
||||
.addr_type = addr_type,
|
||||
.filter_policy = filter_policy,
|
||||
};
|
||||
|
||||
return send_command(BT_HCI_OP_LE_SET_SCAN_PARAM, sizeof(params), ¶ms);
|
||||
}
|
||||
|
||||
hci_result_t hci_le_set_scan_enable(uint8_t enable, uint8_t filter_dup) {
|
||||
struct bt_hci_cp_le_set_scan_enable params = {
|
||||
.enable = enable,
|
||||
.filter_dup = filter_dup,
|
||||
};
|
||||
|
||||
return send_command(BT_HCI_OP_LE_SET_SCAN_ENABLE, sizeof(params), ¶ms);
|
||||
}
|
||||
|
||||
hci_result_t hci_le_create_conn(uint16_t scan_interval, uint16_t scan_window, uint8_t filter_policy, bt_addr_le_t *peer_addr, uint8_t own_addr_type, uint16_t conn_interval_min, uint16_t conn_interval_max, uint16_t conn_latency, uint16_t supervision_timeout, uint16_t min_ce_len, uint16_t max_ce_len) {
|
||||
struct bt_hci_cp_le_create_conn params = {
|
||||
.scan_interval = scan_interval,
|
||||
.scan_window = scan_window,
|
||||
.filter_policy = filter_policy,
|
||||
// .peer_addr is set below
|
||||
.own_addr_type = own_addr_type,
|
||||
.conn_interval_min = conn_interval_min,
|
||||
.conn_interval_max = conn_interval_max,
|
||||
.conn_latency = conn_latency,
|
||||
.supervision_timeout = supervision_timeout,
|
||||
.min_ce_len = min_ce_len,
|
||||
.max_ce_len = max_ce_len,
|
||||
};
|
||||
params.peer_addr.type = peer_addr->type;
|
||||
memcpy(params.peer_addr.a.val, peer_addr->a.val, sizeof(params.peer_addr.a.val));
|
||||
|
||||
return send_command(BT_HCI_OP_LE_CREATE_CONN, sizeof(params), ¶ms);
|
||||
}
|
||||
|
||||
hci_result_t hci_le_cancel_conn(void) {
|
||||
return send_command(BT_HCI_OP_CONNECT_CANCEL, 0, NULL);
|
||||
}
|
||||
|
||||
hci_result_t hci_le_conn_update(uint16_t handle, uint16_t conn_interval_min, uint16_t conn_interval_max, uint16_t conn_latency, uint16_t supervision_timeout) {
|
||||
struct hci_cp_le_conn_update params = {
|
||||
.handle = handle,
|
||||
.conn_interval_min = conn_interval_min,
|
||||
.conn_interval_max = conn_interval_max,
|
||||
.conn_latency = conn_latency,
|
||||
.supervision_timeout = supervision_timeout,
|
||||
.min_ce_len = 4,
|
||||
.max_ce_len = 6,
|
||||
};
|
||||
|
||||
return send_command(BT_HCI_OP_LE_CONN_UPDATE, sizeof(params), ¶ms);
|
||||
}
|
||||
|
||||
hci_result_t hci_disconnect(uint16_t handle) {
|
||||
struct bt_hci_cp_disconnect params = {
|
||||
.handle = handle,
|
||||
.reason = BT_HCI_ERR_REMOTE_USER_TERM_CONN,
|
||||
};
|
||||
|
||||
return send_command(BT_HCI_OP_DISCONNECT, sizeof(params), ¶ms);
|
||||
}
|
||||
|
||||
void hci_check_error(hci_result_t result) {
|
||||
switch (result) {
|
||||
case HCI_OK:
|
||||
return;
|
||||
|
||||
case HCI_RESPONSE_TIMEOUT:
|
||||
mp_raise_bleio_BluetoothError(translate("Timeout waiting for HCI response"));
|
||||
return;
|
||||
|
||||
case HCI_WRITE_TIMEOUT:
|
||||
mp_raise_bleio_BluetoothError(translate("Timeout waiting to write HCI request"));
|
||||
return;
|
||||
|
||||
case HCI_READ_ERROR:
|
||||
mp_raise_bleio_BluetoothError(translate("Error reading from HCI adapter"));
|
||||
return;
|
||||
|
||||
case HCI_WRITE_ERROR:
|
||||
mp_raise_bleio_BluetoothError(translate("Error writing to HCI adapter"));
|
||||
return;
|
||||
|
||||
case HCI_PACKET_SIZE_ERROR:
|
||||
mp_raise_RuntimeError(translate("HCI packet size mismatch"));
|
||||
return;
|
||||
|
||||
case HCI_ATT_ERROR:
|
||||
mp_raise_RuntimeError(translate("Error in ATT protocol code"));
|
||||
return;
|
||||
|
||||
default:
|
||||
// Should be an HCI status error, > 0.
|
||||
if (result > 0) {
|
||||
mp_raise_bleio_BluetoothError(translate("HCI status error: %02x"), result);
|
||||
} else {
|
||||
mp_raise_bleio_BluetoothError(translate("Unknown hci_result_t: %d"), result);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
81
devices/ble_hci/common-hal/_bleio/hci.h
Normal file
81
devices/ble_hci/common-hal/_bleio/hci.h
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
/*
|
||||
This file is part of the ArduinoBLE library.
|
||||
Copyright (c) 2018 Arduino SA. All rights reserved.
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef MICROPY_INCLUDED_DEVICES_BLE_HCI_COMMON_HAL_BLEIO_HCI_H
|
||||
#define MICROPY_INCLUDED_DEVICES_BLE_HCI_COMMON_HAL_BLEIO_HCI_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "common-hal/_bleio/hci_include/hci.h"
|
||||
#include "common-hal/_bleio/hci_include/hci_err.h"
|
||||
|
||||
// Incomplete forward declaration to get around mutually-dependent include files.
|
||||
typedef struct _bleio_adapter_obj_t bleio_adapter_obj_t;
|
||||
|
||||
// An hci_result_t is one of the HCI_x values below,
|
||||
// or it is > 0 and is an HCI command status value (see hci_include/hci_err.h)
|
||||
typedef int hci_result_t;
|
||||
#define HCI_OK (0)
|
||||
#define HCI_RESPONSE_TIMEOUT (-1)
|
||||
#define HCI_WRITE_TIMEOUT (-2)
|
||||
#define HCI_READ_ERROR (-3)
|
||||
#define HCI_WRITE_ERROR (-4)
|
||||
#define HCI_ATT_ERROR (-5)
|
||||
#define HCI_PACKET_SIZE_ERROR (-6)
|
||||
|
||||
extern void bleio_hci_reset(void);
|
||||
|
||||
void hci_check_error(hci_result_t result);
|
||||
|
||||
hci_result_t hci_disconnect(uint16_t handle);
|
||||
|
||||
hci_result_t hci_le_cancel_conn(void);
|
||||
hci_result_t hci_le_conn_update(uint16_t handle, uint16_t conn_interval_min, uint16_t conn_interval_max, uint16_t conn_latency, uint16_t supervision_timeout);
|
||||
hci_result_t hci_le_create_conn(uint16_t scan_interval, uint16_t scan_window, uint8_t filter_policy, bt_addr_le_t *peer_addr, uint8_t own_addr_type, uint16_t conn_interval_min, uint16_t conn_interval_max, uint16_t conn_latency, uint16_t supervision_timeout, uint16_t min_ce_len, uint16_t max_ce_len);
|
||||
|
||||
hci_result_t hci_le_read_buffer_size(uint16_t *le_max_len, uint8_t *le_max_num);
|
||||
hci_result_t hci_le_read_maximum_advertising_data_length(uint16_t *max_adv_data_len);
|
||||
hci_result_t hci_le_read_local_supported_features(uint8_t features[8]);
|
||||
|
||||
hci_result_t hci_le_set_advertising_data(uint8_t length, uint8_t data[]);
|
||||
hci_result_t hci_le_set_advertising_enable(uint8_t enable);
|
||||
hci_result_t hci_le_set_advertising_parameters(uint16_t min_interval, uint16_t max_interval, uint8_t type, uint8_t own_addr_type, bt_addr_le_t *direct_addr, uint8_t channel_map, uint8_t filter_policy);
|
||||
|
||||
hci_result_t hci_le_set_extended_advertising_data(uint8_t handle, uint8_t op, uint8_t frag_pref, uint8_t len, uint8_t data[]);
|
||||
hci_result_t hci_le_set_extended_advertising_enable(uint8_t enable, uint8_t set_num, uint8_t handle[], uint16_t duration[], uint8_t max_ext_adv_evts[]);
|
||||
hci_result_t hci_le_set_extended_advertising_parameters(uint8_t handle, uint16_t props, uint32_t prim_min_interval, uint32_t prim_max_interval, uint8_t prim_channel_map, uint8_t own_addr_type, bt_addr_le_t *peer_addr, uint8_t filter_policy, int8_t tx_power, uint8_t prim_adv_phy, uint8_t sec_adv_max_skip, uint8_t sec_adv_phy, uint8_t sid, uint8_t scan_req_notify_enable);
|
||||
|
||||
hci_result_t hci_le_set_random_address(uint8_t addr[6]);
|
||||
hci_result_t hci_le_set_scan_enable(uint8_t enable, uint8_t filter_dup);
|
||||
hci_result_t hci_le_set_scan_parameters(uint8_t scan_type, uint16_t interval, uint16_t window, uint8_t addr_type, uint8_t filter_policy);
|
||||
hci_result_t hci_le_set_scan_response_data(uint8_t length, uint8_t data[]);
|
||||
|
||||
hci_result_t hci_poll_for_incoming_pkt(void);
|
||||
|
||||
hci_result_t hci_read_bd_addr(bt_addr_t *addr);
|
||||
hci_result_t hci_read_buffer_size(uint16_t *acl_max_len, uint8_t *sco_max_len, uint16_t *acl_max_num, uint16_t *sco_max_num);
|
||||
hci_result_t hci_read_local_version(uint8_t *hci_version, uint16_t *hci_revision, uint8_t *lmp_version, uint16_t *manufacturer, uint16_t *lmp_subversion);
|
||||
hci_result_t hci_read_rssi(uint16_t handle, int *rssi);
|
||||
|
||||
hci_result_t hci_reset(void);
|
||||
|
||||
hci_result_t hci_send_acl_pkt(uint16_t handle, uint8_t cid, uint16_t data_len, uint8_t *data);
|
||||
hci_result_t hci_set_event_mask(uint64_t event_mask);
|
||||
|
||||
#endif // MICROPY_INCLUDED_DEVICES_BLE_HCI_COMMON_HAL_BLEIO_HCI_H
|
||||
549
devices/ble_hci/common-hal/_bleio/hci_debug.c
Normal file
549
devices/ble_hci/common-hal/_bleio/hci_debug.c
Normal file
|
|
@ -0,0 +1,549 @@
|
|||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2020 Dan Halbert for Adafruit Industries
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
// This file is #include'd in hci.c when HCI_DEBUG is non-zero.
|
||||
|
||||
STATIC const char *att_opcode_name(uint16_t opcode) {
|
||||
switch (opcode) {
|
||||
case BT_ATT_OP_ERROR_RSP:
|
||||
return "ERROR_RSP";
|
||||
case BT_ATT_OP_MTU_REQ:
|
||||
return "MTU_REQ";
|
||||
case BT_ATT_OP_MTU_RSP:
|
||||
return "MTU_RSP";
|
||||
case BT_ATT_OP_FIND_INFO_REQ:
|
||||
return "FIND_INFO_REQ";
|
||||
case BT_ATT_OP_FIND_INFO_RSP:
|
||||
return "FIND_INFO_RSP";
|
||||
case BT_ATT_OP_FIND_TYPE_REQ:
|
||||
return "FIND_TYPE_REQ";
|
||||
case BT_ATT_OP_FIND_TYPE_RSP:
|
||||
return "FIND_TYPE_RSP";
|
||||
case BT_ATT_OP_READ_TYPE_REQ:
|
||||
return "READ_TYPE_REQ";
|
||||
case BT_ATT_OP_READ_TYPE_RSP:
|
||||
return "READ_TYPE_RSP";
|
||||
case BT_ATT_OP_READ_REQ:
|
||||
return "READ_REQ";
|
||||
case BT_ATT_OP_READ_RSP:
|
||||
return "READ_RSP";
|
||||
case BT_ATT_OP_READ_BLOB_REQ:
|
||||
return "READ_BLOB_REQ";
|
||||
case BT_ATT_OP_READ_BLOB_RSP:
|
||||
return "READ_BLOB_RSP";
|
||||
case BT_ATT_OP_READ_MULT_REQ:
|
||||
return "READ_MULT_REQ";
|
||||
case BT_ATT_OP_READ_MULT_RSP:
|
||||
return "READ_MULT_RSP";
|
||||
case BT_ATT_OP_READ_GROUP_REQ:
|
||||
return "READ_GROUP_REQ";
|
||||
case BT_ATT_OP_READ_GROUP_RSP:
|
||||
return "READ_GROUP_RSP";
|
||||
case BT_ATT_OP_WRITE_REQ:
|
||||
return "WRITE_REQ";
|
||||
case BT_ATT_OP_WRITE_RSP:
|
||||
return "WRITE_RSP";
|
||||
case BT_ATT_OP_PREPARE_WRITE_REQ:
|
||||
return "PREPARE_WRITE_REQ";
|
||||
case BT_ATT_OP_PREPARE_WRITE_RSP:
|
||||
return "PREPARE_WRITE_RSP";
|
||||
case BT_ATT_OP_EXEC_WRITE_REQ:
|
||||
return "EXEC_WRITE_REQ";
|
||||
case BT_ATT_OP_EXEC_WRITE_RSP:
|
||||
return "EXEC_WRITE_RSP";
|
||||
case BT_ATT_OP_NOTIFY:
|
||||
return "NOTIFY";
|
||||
case BT_ATT_OP_INDICATE:
|
||||
return "INDICATE";
|
||||
case BT_ATT_OP_CONFIRM:
|
||||
return "CONFIRM";
|
||||
case BT_ATT_OP_READ_MULT_VL_REQ:
|
||||
return "READ_MULT_VL_REQ";
|
||||
case BT_ATT_OP_READ_MULT_VL_RSP:
|
||||
return "READ_MULT_VL_RSP";
|
||||
case BT_ATT_OP_NOTIFY_MULT:
|
||||
return "NOTIFY_MULT";
|
||||
case BT_ATT_OP_WRITE_CMD:
|
||||
return "WRITE_CMD";
|
||||
case BT_ATT_OP_SIGNED_WRITE_CMD:
|
||||
return "SIGNED_WRITE_CMD";
|
||||
default:
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
STATIC const char *hci_evt_name(uint8_t evt) {
|
||||
switch (evt) {
|
||||
case BT_HCI_EVT_UNKNOWN:
|
||||
return "UNKNOWN";
|
||||
case BT_HCI_EVT_VENDOR:
|
||||
return "VENDOR";
|
||||
case BT_HCI_EVT_INQUIRY_COMPLETE:
|
||||
return "INQUIRY_COMPLETE";
|
||||
case BT_HCI_EVT_CONN_COMPLETE:
|
||||
return "CONN_COMPLETE";
|
||||
case BT_HCI_EVT_CONN_REQUEST:
|
||||
return "CONN_REQUEST";
|
||||
case BT_HCI_EVT_DISCONN_COMPLETE:
|
||||
return "DISCONN_COMPLETE";
|
||||
case BT_HCI_EVT_AUTH_COMPLETE:
|
||||
return "AUTH_COMPLETE";
|
||||
case BT_HCI_EVT_REMOTE_NAME_REQ_COMPLETE:
|
||||
return "REMOTE_NAME_REQ_COMPLETE";
|
||||
case BT_HCI_EVT_ENCRYPT_CHANGE:
|
||||
return "ENCRYPT_CHANGE";
|
||||
case BT_HCI_EVT_REMOTE_FEATURES:
|
||||
return "REMOTE_FEATURES";
|
||||
case BT_HCI_EVT_REMOTE_VERSION_INFO:
|
||||
return "REMOTE_VERSION_INFO";
|
||||
case BT_HCI_EVT_CMD_COMPLETE:
|
||||
return "CMD_COMPLETE";
|
||||
case BT_HCI_EVT_CMD_STATUS:
|
||||
return "CMD_STATUS";
|
||||
case BT_HCI_EVT_ROLE_CHANGE:
|
||||
return "ROLE_CHANGE";
|
||||
case BT_HCI_EVT_NUM_COMPLETED_PACKETS:
|
||||
return "NUM_COMPLETED_PACKETS";
|
||||
case BT_HCI_EVT_PIN_CODE_REQ:
|
||||
return "PIN_CODE_REQ";
|
||||
case BT_HCI_EVT_LINK_KEY_REQ:
|
||||
return "LINK_KEY_REQ";
|
||||
case BT_HCI_EVT_LINK_KEY_NOTIFY:
|
||||
return "LINK_KEY_NOTIFY";
|
||||
case BT_HCI_EVT_DATA_BUF_OVERFLOW:
|
||||
return "DATA_BUF_OVERFLOW";
|
||||
case BT_HCI_EVT_INQUIRY_RESULT_WITH_RSSI:
|
||||
return "INQUIRY_RESULT_WITH_RSSI";
|
||||
case BT_HCI_EVT_REMOTE_EXT_FEATURES:
|
||||
return "REMOTE_EXT_FEATURES";
|
||||
case BT_HCI_EVT_SYNC_CONN_COMPLETE:
|
||||
return "SYNC_CONN_COMPLETE";
|
||||
case BT_HCI_EVT_EXTENDED_INQUIRY_RESULT:
|
||||
return "EXTENDED_INQUIRY_RESULT";
|
||||
case BT_HCI_EVT_ENCRYPT_KEY_REFRESH_COMPLETE:
|
||||
return "ENCRYPT_KEY_REFRESH_COMPLETE";
|
||||
case BT_HCI_EVT_IO_CAPA_REQ:
|
||||
return "IO_CAPA_REQ";
|
||||
case BT_HCI_EVT_IO_CAPA_RESP:
|
||||
return "IO_CAPA_RESP";
|
||||
case BT_HCI_EVT_USER_CONFIRM_REQ:
|
||||
return "USER_CONFIRM_REQ";
|
||||
case BT_HCI_EVT_USER_PASSKEY_REQ:
|
||||
return "USER_PASSKEY_REQ";
|
||||
case BT_HCI_EVT_SSP_COMPLETE:
|
||||
return "SSP_COMPLETE";
|
||||
case BT_HCI_EVT_USER_PASSKEY_NOTIFY:
|
||||
return "USER_PASSKEY_NOTIFY";
|
||||
case BT_HCI_EVT_LE_META_EVENT:
|
||||
return "LE_META_EVENT";
|
||||
case BT_HCI_EVT_AUTH_PAYLOAD_TIMEOUT_EXP:
|
||||
return "AUTH_PAYLOAD_TIMEOUT_EXP";
|
||||
default:
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
STATIC const char *hci_evt_le_name(uint8_t evt_le) {
|
||||
switch (evt_le) {
|
||||
case BT_HCI_EVT_LE_CONN_COMPLETE:
|
||||
return "LE_CONN_COMPLETE";
|
||||
case BT_HCI_EVT_LE_ADVERTISING_REPORT:
|
||||
return "LE_ADVERTISING_REPORT";
|
||||
case BT_HCI_EVT_LE_CONN_UPDATE_COMPLETE:
|
||||
return "LE_CONN_UPDATE_COMPLETE";
|
||||
case BT_HCI_EVT_LE_LTK_REQUEST:
|
||||
return "LE_LTK_REQUEST";
|
||||
case BT_HCI_EVT_LE_CONN_PARAM_REQ:
|
||||
return "LE_CONN_PARAM_REQ";
|
||||
case BT_HCI_EVT_LE_DATA_LEN_CHANGE:
|
||||
return "LE_DATA_LEN_CHANGE";
|
||||
case BT_HCI_EVT_LE_P256_PUBLIC_KEY_COMPLETE:
|
||||
return "LE_P256_PUBLIC_KEY_COMPLETE";
|
||||
case BT_HCI_EVT_LE_GENERATE_DHKEY_COMPLETE:
|
||||
return "LE_GENERATE_DHKEY_COMPLETE";
|
||||
case BT_HCI_EVT_LE_ENH_CONN_COMPLETE:
|
||||
return "LE_ENH_CONN_COMPLETE";
|
||||
case BT_HCI_EVT_LE_DIRECT_ADV_REPORT:
|
||||
return "LE_DIRECT_ADV_REPORT";
|
||||
case BT_HCI_EVT_LE_PHY_UPDATE_COMPLETE:
|
||||
return "LE_PHY_UPDATE_COMPLETE";
|
||||
case BT_HCI_EVT_LE_EXT_ADVERTISING_REPORT:
|
||||
return "LE_EXT_ADVERTISING_REPORT";
|
||||
case BT_HCI_EVT_LE_PER_ADV_SYNC_ESTABLISHED:
|
||||
return "LE_PER_ADV_SYNC_ESTABLISHED";
|
||||
case BT_HCI_EVT_LE_PER_ADVERTISING_REPORT:
|
||||
return "LE_PER_ADVERTISING_REPORT";
|
||||
case BT_HCI_EVT_LE_PER_ADV_SYNC_LOST:
|
||||
return "LE_PER_ADV_SYNC_LOST";
|
||||
case BT_HCI_EVT_LE_SCAN_TIMEOUT:
|
||||
return "LE_SCAN_TIMEOUT";
|
||||
case BT_HCI_EVT_LE_ADV_SET_TERMINATED:
|
||||
return "LE_ADV_SET_TERMINATED";
|
||||
case BT_HCI_EVT_LE_SCAN_REQ_RECEIVED:
|
||||
return "LE_SCAN_REQ_RECEIVED";
|
||||
case BT_HCI_EVT_LE_CHAN_SEL_ALGO:
|
||||
return "LE_CHAN_SEL_ALGO";
|
||||
default:
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
STATIC const char *hci_opcode_name(uint16_t opcode) {
|
||||
switch (opcode) {
|
||||
case BT_OP_NOP:
|
||||
return "NOP";
|
||||
case BT_HCI_OP_INQUIRY:
|
||||
return "INQUIRY";
|
||||
case BT_HCI_OP_INQUIRY_CANCEL:
|
||||
return "INQUIRY_CANCEL";
|
||||
case BT_HCI_OP_CONNECT:
|
||||
return "CONNECT";
|
||||
case BT_HCI_OP_DISCONNECT:
|
||||
return "DISCONNECT";
|
||||
case BT_HCI_OP_CONNECT_CANCEL:
|
||||
return "CONNECT_CANCEL";
|
||||
case BT_HCI_OP_ACCEPT_CONN_REQ:
|
||||
return "ACCEPT_CONN_REQ";
|
||||
case BT_HCI_OP_SETUP_SYNC_CONN:
|
||||
return "SETUP_SYNC_CONN";
|
||||
case BT_HCI_OP_ACCEPT_SYNC_CONN_REQ:
|
||||
return "ACCEPT_SYNC_CONN_REQ";
|
||||
case BT_HCI_OP_REJECT_CONN_REQ:
|
||||
return "REJECT_CONN_REQ";
|
||||
case BT_HCI_OP_LINK_KEY_REPLY:
|
||||
return "LINK_KEY_REPLY";
|
||||
case BT_HCI_OP_LINK_KEY_NEG_REPLY:
|
||||
return "LINK_KEY_NEG_REPLY";
|
||||
case BT_HCI_OP_PIN_CODE_REPLY:
|
||||
return "PIN_CODE_REPLY";
|
||||
case BT_HCI_OP_PIN_CODE_NEG_REPLY:
|
||||
return "PIN_CODE_NEG_REPLY";
|
||||
case BT_HCI_OP_AUTH_REQUESTED:
|
||||
return "AUTH_REQUESTED";
|
||||
case BT_HCI_OP_SET_CONN_ENCRYPT:
|
||||
return "SET_CONN_ENCRYPT";
|
||||
case BT_HCI_OP_REMOTE_NAME_REQUEST:
|
||||
return "REMOTE_NAME_REQUEST";
|
||||
case BT_HCI_OP_REMOTE_NAME_CANCEL:
|
||||
return "REMOTE_NAME_CANCEL";
|
||||
case BT_HCI_OP_READ_REMOTE_FEATURES:
|
||||
return "READ_REMOTE_FEATURES";
|
||||
case BT_HCI_OP_READ_REMOTE_EXT_FEATURES:
|
||||
return "READ_REMOTE_EXT_FEATURES";
|
||||
case BT_HCI_OP_READ_REMOTE_VERSION_INFO:
|
||||
return "READ_REMOTE_VERSION_INFO";
|
||||
case BT_HCI_OP_IO_CAPABILITY_REPLY:
|
||||
return "IO_CAPABILITY_REPLY";
|
||||
case BT_HCI_OP_USER_CONFIRM_REPLY:
|
||||
return "USER_CONFIRM_REPLY";
|
||||
case BT_HCI_OP_USER_CONFIRM_NEG_REPLY:
|
||||
return "USER_CONFIRM_NEG_REPLY";
|
||||
case BT_HCI_OP_USER_PASSKEY_REPLY:
|
||||
return "USER_PASSKEY_REPLY";
|
||||
case BT_HCI_OP_USER_PASSKEY_NEG_REPLY:
|
||||
return "USER_PASSKEY_NEG_REPLY";
|
||||
case BT_HCI_OP_IO_CAPABILITY_NEG_REPLY:
|
||||
return "IO_CAPABILITY_NEG_REPLY";
|
||||
case BT_HCI_OP_SET_EVENT_MASK:
|
||||
return "SET_EVENT_MASK";
|
||||
case BT_HCI_OP_RESET:
|
||||
return "RESET";
|
||||
case BT_HCI_OP_WRITE_LOCAL_NAME:
|
||||
return "WRITE_LOCAL_NAME";
|
||||
case BT_HCI_OP_WRITE_PAGE_TIMEOUT:
|
||||
return "WRITE_PAGE_TIMEOUT";
|
||||
case BT_HCI_OP_WRITE_SCAN_ENABLE:
|
||||
return "WRITE_SCAN_ENABLE";
|
||||
case BT_HCI_OP_READ_TX_POWER_LEVEL:
|
||||
return "READ_TX_POWER_LEVEL";
|
||||
case BT_HCI_OP_SET_CTL_TO_HOST_FLOW:
|
||||
return "SET_CTL_TO_HOST_FLOW";
|
||||
case BT_HCI_OP_HOST_BUFFER_SIZE:
|
||||
return "HOST_BUFFER_SIZE";
|
||||
case BT_HCI_OP_HOST_NUM_COMPLETED_PACKETS:
|
||||
return "HOST_NUM_COMPLETED_PACKETS";
|
||||
case BT_HCI_OP_WRITE_INQUIRY_MODE:
|
||||
return "WRITE_INQUIRY_MODE";
|
||||
case BT_HCI_OP_WRITE_SSP_MODE:
|
||||
return "WRITE_SSP_MODE";
|
||||
case BT_HCI_OP_SET_EVENT_MASK_PAGE_2:
|
||||
return "SET_EVENT_MASK_PAGE_2";
|
||||
case BT_HCI_OP_LE_WRITE_LE_HOST_SUPP:
|
||||
return "LE_WRITE_LE_HOST_SUPP";
|
||||
case BT_HCI_OP_WRITE_SC_HOST_SUPP:
|
||||
return "WRITE_SC_HOST_SUPP";
|
||||
case BT_HCI_OP_READ_AUTH_PAYLOAD_TIMEOUT:
|
||||
return "READ_AUTH_PAYLOAD_TIMEOUT";
|
||||
case BT_HCI_OP_WRITE_AUTH_PAYLOAD_TIMEOUT:
|
||||
return "WRITE_AUTH_PAYLOAD_TIMEOUT";
|
||||
case BT_HCI_OP_READ_LOCAL_VERSION_INFO:
|
||||
return "READ_LOCAL_VERSION_INFO";
|
||||
case BT_HCI_OP_READ_SUPPORTED_COMMANDS:
|
||||
return "READ_SUPPORTED_COMMANDS";
|
||||
case BT_HCI_OP_READ_LOCAL_EXT_FEATURES:
|
||||
return "READ_LOCAL_EXT_FEATURES";
|
||||
case BT_HCI_OP_READ_LOCAL_FEATURES:
|
||||
return "READ_LOCAL_FEATURES";
|
||||
case BT_HCI_OP_READ_BUFFER_SIZE:
|
||||
return "READ_BUFFER_SIZE";
|
||||
case BT_HCI_OP_READ_BD_ADDR:
|
||||
return "READ_BD_ADDR";
|
||||
case BT_HCI_OP_READ_RSSI:
|
||||
return "READ_RSSI";
|
||||
case BT_HCI_OP_READ_ENCRYPTION_KEY_SIZE:
|
||||
return "READ_ENCRYPTION_KEY_SIZE";
|
||||
case BT_HCI_OP_LE_SET_EVENT_MASK:
|
||||
return "LE_SET_EVENT_MASK";
|
||||
case BT_HCI_OP_LE_READ_BUFFER_SIZE:
|
||||
return "LE_READ_BUFFER_SIZE";
|
||||
case BT_HCI_OP_LE_READ_LOCAL_FEATURES:
|
||||
return "LE_READ_LOCAL_FEATURES";
|
||||
case BT_HCI_OP_LE_SET_RANDOM_ADDRESS:
|
||||
return "LE_SET_RANDOM_ADDRESS";
|
||||
case BT_HCI_OP_LE_SET_ADV_PARAM:
|
||||
return "LE_SET_ADV_PARAM";
|
||||
case BT_HCI_OP_LE_READ_ADV_CHAN_TX_POWER:
|
||||
return "LE_READ_ADV_CHAN_TX_POWER";
|
||||
case BT_HCI_OP_LE_SET_ADV_DATA:
|
||||
return "LE_SET_ADV_DATA";
|
||||
case BT_HCI_OP_LE_SET_SCAN_RSP_DATA:
|
||||
return "LE_SET_SCAN_RSP_DATA";
|
||||
case BT_HCI_OP_LE_SET_ADV_ENABLE:
|
||||
return "LE_SET_ADV_ENABLE";
|
||||
case BT_HCI_OP_LE_SET_SCAN_PARAM:
|
||||
return "LE_SET_SCAN_PARAM";
|
||||
case BT_HCI_OP_LE_SET_SCAN_ENABLE:
|
||||
return "LE_SET_SCAN_ENABLE";
|
||||
case BT_HCI_OP_LE_CREATE_CONN:
|
||||
return "LE_CREATE_CONN";
|
||||
case BT_HCI_OP_LE_CREATE_CONN_CANCEL:
|
||||
return "LE_CREATE_CONN_CANCEL";
|
||||
case BT_HCI_OP_LE_READ_WL_SIZE:
|
||||
return "LE_READ_WL_SIZE";
|
||||
case BT_HCI_OP_LE_CLEAR_WL:
|
||||
return "LE_CLEAR_WL";
|
||||
case BT_HCI_OP_LE_ADD_DEV_TO_WL:
|
||||
return "LE_ADD_DEV_TO_WL";
|
||||
case BT_HCI_OP_LE_REM_DEV_FROM_WL:
|
||||
return "LE_REM_DEV_FROM_WL";
|
||||
case BT_HCI_OP_LE_CONN_UPDATE:
|
||||
return "LE_CONN_UPDATE";
|
||||
case BT_HCI_OP_LE_SET_HOST_CHAN_CLASSIF:
|
||||
return "LE_SET_HOST_CHAN_CLASSIF";
|
||||
case BT_HCI_OP_LE_READ_CHAN_MAP:
|
||||
return "LE_READ_CHAN_MAP";
|
||||
case BT_HCI_OP_LE_READ_REMOTE_FEATURES:
|
||||
return "LE_READ_REMOTE_FEATURES";
|
||||
case BT_HCI_OP_LE_ENCRYPT:
|
||||
return "LE_ENCRYPT";
|
||||
case BT_HCI_OP_LE_RAND:
|
||||
return "LE_RAND";
|
||||
case BT_HCI_OP_LE_START_ENCRYPTION:
|
||||
return "LE_START_ENCRYPTION";
|
||||
case BT_HCI_OP_LE_LTK_REQ_REPLY:
|
||||
return "LE_LTK_REQ_REPLY";
|
||||
case BT_HCI_OP_LE_LTK_REQ_NEG_REPLY:
|
||||
return "LE_LTK_REQ_NEG_REPLY";
|
||||
case BT_HCI_OP_LE_READ_SUPP_STATES:
|
||||
return "LE_READ_SUPP_STATES";
|
||||
case BT_HCI_OP_LE_RX_TEST:
|
||||
return "LE_RX_TEST";
|
||||
case BT_HCI_OP_LE_TX_TEST:
|
||||
return "LE_TX_TEST";
|
||||
case BT_HCI_OP_LE_TEST_END:
|
||||
return "LE_TEST_END";
|
||||
case BT_HCI_OP_LE_CONN_PARAM_REQ_REPLY:
|
||||
return "LE_CONN_PARAM_REQ_REPLY";
|
||||
case BT_HCI_OP_LE_CONN_PARAM_REQ_NEG_REPLY:
|
||||
return "LE_CONN_PARAM_REQ_NEG_REPLY";
|
||||
case BT_HCI_OP_LE_SET_DATA_LEN:
|
||||
return "LE_SET_DATA_LEN";
|
||||
case BT_HCI_OP_LE_READ_DEFAULT_DATA_LEN:
|
||||
return "LE_READ_DEFAULT_DATA_LEN";
|
||||
case BT_HCI_OP_LE_WRITE_DEFAULT_DATA_LEN:
|
||||
return "LE_WRITE_DEFAULT_DATA_LEN";
|
||||
case BT_HCI_OP_LE_P256_PUBLIC_KEY:
|
||||
return "LE_P256_PUBLIC_KEY";
|
||||
case BT_HCI_OP_LE_GENERATE_DHKEY:
|
||||
return "LE_GENERATE_DHKEY";
|
||||
case BT_HCI_OP_LE_ADD_DEV_TO_RL:
|
||||
return "LE_ADD_DEV_TO_RL";
|
||||
case BT_HCI_OP_LE_REM_DEV_FROM_RL:
|
||||
return "LE_REM_DEV_FROM_RL";
|
||||
case BT_HCI_OP_LE_CLEAR_RL:
|
||||
return "LE_CLEAR_RL";
|
||||
case BT_HCI_OP_LE_READ_RL_SIZE:
|
||||
return "LE_READ_RL_SIZE";
|
||||
case BT_HCI_OP_LE_READ_PEER_RPA:
|
||||
return "LE_READ_PEER_RPA";
|
||||
case BT_HCI_OP_LE_READ_LOCAL_RPA:
|
||||
return "LE_READ_LOCAL_RPA";
|
||||
case BT_HCI_OP_LE_SET_ADDR_RES_ENABLE:
|
||||
return "LE_SET_ADDR_RES_ENABLE";
|
||||
case BT_HCI_OP_LE_SET_RPA_TIMEOUT:
|
||||
return "LE_SET_RPA_TIMEOUT";
|
||||
case BT_HCI_OP_LE_READ_MAX_DATA_LEN:
|
||||
return "LE_READ_MAX_DATA_LEN";
|
||||
case BT_HCI_OP_LE_READ_PHY:
|
||||
return "LE_READ_PHY";
|
||||
case BT_HCI_OP_LE_SET_DEFAULT_PHY:
|
||||
return "LE_SET_DEFAULT_PHY";
|
||||
case BT_HCI_OP_LE_SET_PHY:
|
||||
return "LE_SET_PHY";
|
||||
case BT_HCI_OP_LE_ENH_RX_TEST:
|
||||
return "LE_ENH_RX_TEST";
|
||||
case BT_HCI_OP_LE_ENH_TX_TEST:
|
||||
return "LE_ENH_TX_TEST";
|
||||
case BT_HCI_OP_LE_SET_ADV_SET_RANDOM_ADDR:
|
||||
return "LE_SET_ADV_SET_RANDOM_ADDR";
|
||||
case BT_HCI_OP_LE_SET_EXT_ADV_PARAM:
|
||||
return "LE_SET_EXT_ADV_PARAM";
|
||||
case BT_HCI_OP_LE_SET_EXT_ADV_DATA:
|
||||
return "LE_SET_EXT_ADV_DATA";
|
||||
case BT_HCI_OP_LE_SET_EXT_SCAN_RSP_DATA:
|
||||
return "LE_SET_EXT_SCAN_RSP_DATA";
|
||||
case BT_HCI_OP_LE_SET_EXT_ADV_ENABLE:
|
||||
return "LE_SET_EXT_ADV_ENABLE";
|
||||
case BT_HCI_OP_LE_READ_MAX_ADV_DATA_LEN:
|
||||
return "LE_READ_MAX_ADV_DATA_LEN";
|
||||
case BT_HCI_OP_LE_READ_NUM_ADV_SETS:
|
||||
return "LE_READ_NUM_ADV_SETS";
|
||||
case BT_HCI_OP_LE_REMOVE_ADV_SET:
|
||||
return "LE_REMOVE_ADV_SET";
|
||||
case BT_HCI_OP_CLEAR_ADV_SETS:
|
||||
return "CLEAR_ADV_SETS";
|
||||
case BT_HCI_OP_LE_SET_PER_ADV_PARAM:
|
||||
return "LE_SET_PER_ADV_PARAM";
|
||||
case BT_HCI_OP_LE_SET_PER_ADV_DATA:
|
||||
return "LE_SET_PER_ADV_DATA";
|
||||
case BT_HCI_OP_LE_SET_PER_ADV_ENABLE:
|
||||
return "LE_SET_PER_ADV_ENABLE";
|
||||
case BT_HCI_OP_LE_SET_EXT_SCAN_PARAM:
|
||||
return "LE_SET_EXT_SCAN_PARAM";
|
||||
case BT_HCI_OP_LE_SET_EXT_SCAN_ENABLE:
|
||||
return "LE_SET_EXT_SCAN_ENABLE";
|
||||
case BT_HCI_OP_LE_EXT_CREATE_CONN:
|
||||
return "LE_EXT_CREATE_CONN";
|
||||
case BT_HCI_OP_LE_PER_ADV_CREATE_SYNC:
|
||||
return "LE_PER_ADV_CREATE_SYNC";
|
||||
case BT_HCI_OP_LE_PER_ADV_CREATE_SYNC_CANCEL:
|
||||
return "LE_PER_ADV_CREATE_SYNC_CANCEL";
|
||||
case BT_HCI_OP_LE_PER_ADV_TERMINATE_SYNC:
|
||||
return "LE_PER_ADV_TERMINATE_SYNC";
|
||||
case BT_HCI_OP_LE_ADD_DEV_TO_PER_ADV_LIST:
|
||||
return "LE_ADD_DEV_TO_PER_ADV_LIST";
|
||||
case BT_HCI_OP_LE_REM_DEV_FROM_PER_ADV_LIST:
|
||||
return "LE_REM_DEV_FROM_PER_ADV_LIST";
|
||||
case BT_HCI_OP_LE_CLEAR_PER_ADV_LIST:
|
||||
return "LE_CLEAR_PER_ADV_LIST";
|
||||
case BT_HCI_OP_LE_READ_PER_ADV_LIST_SIZE:
|
||||
return "LE_READ_PER_ADV_LIST_SIZE";
|
||||
case BT_HCI_OP_LE_READ_TX_POWER:
|
||||
return "LE_READ_TX_POWER";
|
||||
case BT_HCI_OP_LE_READ_RF_PATH_COMP:
|
||||
return "LE_READ_RF_PATH_COMP";
|
||||
case BT_HCI_OP_LE_WRITE_RF_PATH_COMP:
|
||||
return "LE_WRITE_RF_PATH_COMP";
|
||||
case BT_HCI_OP_LE_SET_PRIVACY_MODE:
|
||||
return "LE_SET_PRIVACY_MODE";
|
||||
default:
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
STATIC void dump_cmd_pkt(bool tx, uint8_t pkt_len, uint8_t pkt_data[]) {
|
||||
h4_hci_cmd_pkt_t *pkt = (h4_hci_cmd_pkt_t *)pkt_data;
|
||||
mp_printf(&mp_plat_print,
|
||||
"%s HCI COMMAND (%x) op: %s (%04x), len: %d, data: ",
|
||||
tx ? "TX->" : "RX<-",
|
||||
pkt->pkt_type,
|
||||
hci_opcode_name(pkt->opcode), pkt->opcode, pkt->param_len);
|
||||
for (size_t i = 0; i < pkt->param_len; i++) {
|
||||
mp_printf(&mp_plat_print, "%02x ", pkt->params[i]);
|
||||
}
|
||||
if (pkt_len != sizeof(h4_hci_cmd_pkt_t) + pkt->param_len) {
|
||||
mp_printf(&mp_plat_print, " LENGTH MISMATCH, pkt_len: %d", pkt_len);
|
||||
}
|
||||
mp_printf(&mp_plat_print, "\n");
|
||||
}
|
||||
|
||||
STATIC void dump_acl_pkt(bool tx, uint8_t pkt_len, uint8_t pkt_data[]) {
|
||||
h4_hci_acl_pkt_t *pkt = (h4_hci_acl_pkt_t *)pkt_data;
|
||||
acl_data_t *acl = (acl_data_t *)pkt->data;
|
||||
|
||||
mp_printf(&mp_plat_print,
|
||||
"%s HCI ACLDATA (%x) ",
|
||||
tx ? "TX->" : "RX<-", pkt->pkt_type);
|
||||
|
||||
if (pkt->pb != ACL_DATA_PB_MIDDLE && acl->cid == BT_L2CAP_CID_ATT) {
|
||||
// This is the start of a fragmented acl_data packet or is a full packet,
|
||||
// and is an ATT protocol packet.
|
||||
mp_printf(&mp_plat_print, "att: %s (%02x), ", att_opcode_name(acl->acl_data[0]), acl->acl_data[0]);
|
||||
}
|
||||
|
||||
mp_printf(&mp_plat_print,
|
||||
"handle: %04x, pb: %d, bc: %d, data_len: %d, ",
|
||||
pkt->handle, pkt->pb, pkt->bc, pkt->data_len);
|
||||
|
||||
if (pkt->pb != ACL_DATA_PB_MIDDLE) {
|
||||
// This is the start of a fragmented acl_data packet or is a full packet.
|
||||
mp_printf(&mp_plat_print,
|
||||
"acl data_len: %d, cid: %04x, data: ",
|
||||
acl->acl_data_len, acl->cid);
|
||||
for (size_t i = 0; i < acl->acl_data_len; i++) {
|
||||
mp_printf(&mp_plat_print, "%02x ", acl->acl_data[i]);
|
||||
}
|
||||
} else {
|
||||
for (size_t i = 0; i < pkt->data_len; i++) {
|
||||
mp_printf(&mp_plat_print, "more data: %02x ", pkt->data[i]);
|
||||
}
|
||||
}
|
||||
|
||||
if (pkt_len != sizeof(h4_hci_acl_pkt_t) + pkt->data_len) {
|
||||
mp_printf(&mp_plat_print, " LENGTH MISMATCH, pkt_len: %d", pkt_len);
|
||||
}
|
||||
mp_printf(&mp_plat_print, "\n");
|
||||
}
|
||||
|
||||
STATIC void dump_evt_pkt(bool tx, uint8_t pkt_len, uint8_t pkt_data[]) {
|
||||
h4_hci_evt_pkt_t *pkt = (h4_hci_evt_pkt_t *)pkt_data;
|
||||
mp_printf(&mp_plat_print,
|
||||
"%s HCI EVENT (%x) evt: %s (%02x), param_len: %d, data: ",
|
||||
tx ? "TX->" : "RX<-",
|
||||
pkt->pkt_type,
|
||||
pkt->evt == BT_HCI_EVT_LE_META_EVENT
|
||||
? hci_evt_le_name(pkt->params[0])
|
||||
: hci_evt_name(pkt->evt),
|
||||
pkt->evt, pkt->param_len);
|
||||
for (size_t i = 0; i < pkt->param_len; i++) {
|
||||
mp_printf(&mp_plat_print, "%02x ", pkt->params[i]);
|
||||
}
|
||||
if (pkt_len != sizeof(h4_hci_evt_pkt_t) + pkt->param_len) {
|
||||
mp_printf(&mp_plat_print, " LENGTH MISMATCH, pkt_len: %d", pkt_len);
|
||||
}
|
||||
mp_printf(&mp_plat_print, "\n");
|
||||
}
|
||||
2
devices/ble_hci/common-hal/_bleio/hci_include/NOTE.txt
Normal file
2
devices/ble_hci/common-hal/_bleio/hci_include/NOTE.txt
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
The HCI-related include files here were copied from the Zephyr project, from this commit:
|
||||
https://github.com/zephyrproject-rtos/zephyr/tree/0a87f9359edf1ec1c169626df3e19c2b4a4e9646/include/bluetooth
|
||||
95
devices/ble_hci/common-hal/_bleio/hci_include/addr.h
Normal file
95
devices/ble_hci/common-hal/_bleio/hci_include/addr.h
Normal file
|
|
@ -0,0 +1,95 @@
|
|||
// CircuitPython: Adapted from Zephyer include files.
|
||||
/** @file
|
||||
* @brief Bluetooth device address definitions and utilities.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2019 Nordic Semiconductor ASA
|
||||
* Copyright 2020 Dan Halbert for Adafruit Industries
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
#ifndef ZEPHYR_INCLUDE_BLUETOOTH_ADDR_H_
|
||||
#define ZEPHYR_INCLUDE_BLUETOOTH_ADDR_H_
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
|
||||
/**
|
||||
* @brief Bluetooth device address definitions and utilities.
|
||||
* @defgroup bt_addr Device Address
|
||||
* @ingroup bluetooth
|
||||
* @{
|
||||
*/
|
||||
|
||||
#define BT_ADDR_LE_PUBLIC 0x00
|
||||
#define BT_ADDR_LE_RANDOM 0x01
|
||||
#define BT_ADDR_LE_PUBLIC_ID 0x02
|
||||
#define BT_ADDR_LE_RANDOM_ID 0x03
|
||||
|
||||
/** Bluetooth Device Address */
|
||||
typedef struct {
|
||||
uint8_t val[6];
|
||||
} bt_addr_t;
|
||||
|
||||
/** Bluetooth LE Device Address */
|
||||
typedef struct {
|
||||
uint8_t type;
|
||||
bt_addr_t a;
|
||||
} bt_addr_le_t;
|
||||
|
||||
#define BT_ADDR_ANY ((bt_addr_t[]) { { { 0, 0, 0, 0, 0, 0 } } })
|
||||
#define BT_ADDR_NONE ((bt_addr_t[]) { { \
|
||||
{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } } })
|
||||
#define BT_ADDR_LE_ANY ((bt_addr_le_t[]) { { 0, { { 0, 0, 0, 0, 0, 0 } } } })
|
||||
#define BT_ADDR_LE_NONE ((bt_addr_le_t[]) { { 0, \
|
||||
{ { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } } } })
|
||||
|
||||
static inline int bt_addr_cmp(const bt_addr_t *a, const bt_addr_t *b) {
|
||||
return memcmp(a, b, sizeof(*a));
|
||||
}
|
||||
|
||||
static inline int bt_addr_le_cmp(const bt_addr_le_t *a, const bt_addr_le_t *b) {
|
||||
return memcmp(a, b, sizeof(*a));
|
||||
}
|
||||
|
||||
static inline void bt_addr_copy(bt_addr_t *dst, const bt_addr_t *src) {
|
||||
memcpy(dst, src, sizeof(*dst));
|
||||
}
|
||||
|
||||
static inline void bt_addr_le_copy(bt_addr_le_t *dst, const bt_addr_le_t *src) {
|
||||
memcpy(dst, src, sizeof(*dst));
|
||||
}
|
||||
|
||||
#define BT_ADDR_IS_RPA(a) (((a)->val[5] & 0xc0) == 0x40)
|
||||
#define BT_ADDR_IS_NRPA(a) (((a)->val[5] & 0xc0) == 0x00)
|
||||
#define BT_ADDR_IS_STATIC(a) (((a)->val[5] & 0xc0) == 0xc0)
|
||||
|
||||
#define BT_ADDR_SET_RPA(a) ((a)->val[5] = (((a)->val[5] & 0x3f) | 0x40))
|
||||
#define BT_ADDR_SET_NRPA(a) ((a)->val[5] &= 0x3f)
|
||||
#define BT_ADDR_SET_STATIC(a) ((a)->val[5] |= 0xc0)
|
||||
|
||||
int bt_addr_le_create_nrpa(bt_addr_le_t *addr);
|
||||
int bt_addr_le_create_static(bt_addr_le_t *addr);
|
||||
|
||||
static inline bool bt_addr_le_is_rpa(const bt_addr_le_t *addr) {
|
||||
if (addr->type != BT_ADDR_LE_RANDOM) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return BT_ADDR_IS_RPA(&addr->a);
|
||||
}
|
||||
|
||||
static inline bool bt_addr_le_is_identity(const bt_addr_le_t *addr) {
|
||||
if (addr->type == BT_ADDR_LE_PUBLIC) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return BT_ADDR_IS_STATIC(&addr->a);
|
||||
}
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
#endif /* ZEPHYR_INCLUDE_BLUETOOTH_ADDR_H_ */
|
||||
41
devices/ble_hci/common-hal/_bleio/hci_include/att.h
Normal file
41
devices/ble_hci/common-hal/_bleio/hci_include/att.h
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
// CircuitPython: Adapted from Zephyr include file.
|
||||
/** @file
|
||||
* @brief Attribute Protocol handling.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2016 Intel Corporation
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
#ifndef ZEPHYR_INCLUDE_BLUETOOTH_ATT_H_
|
||||
#define ZEPHYR_INCLUDE_BLUETOOTH_ATT_H_
|
||||
|
||||
/* Error codes for Error response PDU */
|
||||
#define BT_ATT_ERR_INVALID_HANDLE 0x01
|
||||
#define BT_ATT_ERR_READ_NOT_PERMITTED 0x02
|
||||
#define BT_ATT_ERR_WRITE_NOT_PERMITTED 0x03
|
||||
#define BT_ATT_ERR_INVALID_PDU 0x04
|
||||
#define BT_ATT_ERR_AUTHENTICATION 0x05
|
||||
#define BT_ATT_ERR_NOT_SUPPORTED 0x06
|
||||
#define BT_ATT_ERR_INVALID_OFFSET 0x07
|
||||
#define BT_ATT_ERR_AUTHORIZATION 0x08
|
||||
#define BT_ATT_ERR_PREPARE_QUEUE_FULL 0x09
|
||||
#define BT_ATT_ERR_ATTRIBUTE_NOT_FOUND 0x0a
|
||||
#define BT_ATT_ERR_ATTRIBUTE_NOT_LONG 0x0b
|
||||
#define BT_ATT_ERR_ENCRYPTION_KEY_SIZE 0x0c
|
||||
#define BT_ATT_ERR_INVALID_ATTRIBUTE_LEN 0x0d
|
||||
#define BT_ATT_ERR_UNLIKELY 0x0e
|
||||
#define BT_ATT_ERR_INSUFFICIENT_ENCRYPTION 0x0f
|
||||
#define BT_ATT_ERR_UNSUPPORTED_GROUP_TYPE 0x10
|
||||
#define BT_ATT_ERR_INSUFFICIENT_RESOURCES 0x11
|
||||
#define BT_ATT_ERR_DB_OUT_OF_SYNC 0x12
|
||||
#define BT_ATT_ERR_VALUE_NOT_ALLOWED 0x13
|
||||
|
||||
/* Common Profile Error Codes (from CSS) */
|
||||
#define BT_ATT_ERR_WRITE_REQ_REJECTED 0xfc
|
||||
#define BT_ATT_ERR_CCC_IMPROPER_CONF 0xfd
|
||||
#define BT_ATT_ERR_PROCEDURE_IN_PROGRESS 0xfe
|
||||
#define BT_ATT_ERR_OUT_OF_RANGE 0xff
|
||||
|
||||
#endif /* ZEPHYR_INCLUDE_BLUETOOTH_ATT_H_ */
|
||||
272
devices/ble_hci/common-hal/_bleio/hci_include/att_internal.h
Normal file
272
devices/ble_hci/common-hal/_bleio/hci_include/att_internal.h
Normal file
|
|
@ -0,0 +1,272 @@
|
|||
// CircuitPython: Adapted from Zephyr include file.
|
||||
|
||||
/* att_internal.h - Attribute protocol handling */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2015-2016 Intel Corporation
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
|
||||
#include <stdbool.h>
|
||||
// for __packed
|
||||
#include <sys/cdefs.h>
|
||||
|
||||
#define BT_EATT_PSM 0x27
|
||||
#define BT_ATT_DEFAULT_LE_MTU 23
|
||||
#define BT_ATT_TIMEOUT K_SECONDS(30)
|
||||
|
||||
// FIX #if BT_L2CAP_RX_MTU < CONFIG_BT_L2CAP_TX_MTU
|
||||
// #define BT_ATT_MTU BT_L2CAP_RX_MTU
|
||||
// #else
|
||||
// #define BT_ATT_MTU CONFIG_BT_L2CAP_TX_MTU
|
||||
// #endif
|
||||
|
||||
struct bt_att_hdr {
|
||||
uint8_t code;
|
||||
} __packed;
|
||||
|
||||
#define BT_ATT_OP_ERROR_RSP 0x01
|
||||
struct bt_att_error_rsp {
|
||||
uint8_t request;
|
||||
uint16_t handle;
|
||||
uint8_t error;
|
||||
} __packed;
|
||||
|
||||
#define BT_ATT_OP_MTU_REQ 0x02
|
||||
struct bt_att_exchange_mtu_req {
|
||||
uint16_t mtu;
|
||||
} __packed;
|
||||
|
||||
#define BT_ATT_OP_MTU_RSP 0x03
|
||||
struct bt_att_exchange_mtu_rsp {
|
||||
uint16_t mtu;
|
||||
} __packed;
|
||||
|
||||
/* Find Information Request */
|
||||
#define BT_ATT_OP_FIND_INFO_REQ 0x04
|
||||
struct bt_att_find_info_req {
|
||||
uint16_t start_handle;
|
||||
uint16_t end_handle;
|
||||
} __packed;
|
||||
|
||||
/* Format field values for BT_ATT_OP_FIND_INFO_RSP */
|
||||
#define BT_ATT_INFO_16 0x01
|
||||
#define BT_ATT_INFO_128 0x02
|
||||
|
||||
struct bt_att_info_16 {
|
||||
uint16_t handle;
|
||||
uint16_t uuid;
|
||||
} __packed;
|
||||
|
||||
struct bt_att_info_128 {
|
||||
uint16_t handle;
|
||||
uint8_t uuid[16];
|
||||
} __packed;
|
||||
|
||||
/* Find Information Response */
|
||||
#define BT_ATT_OP_FIND_INFO_RSP 0x05
|
||||
struct bt_att_find_info_rsp {
|
||||
uint8_t format;
|
||||
uint8_t info[];
|
||||
} __packed;
|
||||
|
||||
/* Find By Type Value Request */
|
||||
#define BT_ATT_OP_FIND_TYPE_REQ 0x06
|
||||
struct bt_att_find_type_req {
|
||||
uint16_t start_handle;
|
||||
uint16_t end_handle;
|
||||
uint16_t type;
|
||||
uint8_t value[];
|
||||
} __packed;
|
||||
|
||||
struct bt_att_handle_group {
|
||||
uint16_t start_handle;
|
||||
uint16_t end_handle;
|
||||
} __packed;
|
||||
|
||||
/* Find By Type Value Response */
|
||||
#define BT_ATT_OP_FIND_TYPE_RSP 0x07
|
||||
struct bt_att_find_type_rsp {
|
||||
uint8_t _dummy[0];
|
||||
struct bt_att_handle_group list[];
|
||||
} __packed;
|
||||
|
||||
/* Read By Type Request */
|
||||
#define BT_ATT_OP_READ_TYPE_REQ 0x08
|
||||
struct bt_att_read_type_req {
|
||||
uint16_t start_handle;
|
||||
uint16_t end_handle;
|
||||
uint8_t uuid[];
|
||||
} __packed;
|
||||
|
||||
struct bt_att_data {
|
||||
uint16_t handle;
|
||||
uint8_t value[];
|
||||
} __packed;
|
||||
|
||||
/* Read By Type Response */
|
||||
#define BT_ATT_OP_READ_TYPE_RSP 0x09
|
||||
struct bt_att_read_type_rsp {
|
||||
uint8_t len;
|
||||
struct bt_att_data data[];
|
||||
} __packed;
|
||||
|
||||
/* Read Request */
|
||||
#define BT_ATT_OP_READ_REQ 0x0a
|
||||
struct bt_att_read_req {
|
||||
uint16_t handle;
|
||||
} __packed;
|
||||
|
||||
/* Read Response */
|
||||
#define BT_ATT_OP_READ_RSP 0x0b
|
||||
struct bt_att_read_rsp {
|
||||
uint8_t _dummy[0];
|
||||
uint8_t value[];
|
||||
} __packed;
|
||||
|
||||
/* Read Blob Request */
|
||||
#define BT_ATT_OP_READ_BLOB_REQ 0x0c
|
||||
struct bt_att_read_blob_req {
|
||||
uint16_t handle;
|
||||
uint16_t offset;
|
||||
} __packed;
|
||||
|
||||
/* Read Blob Response */
|
||||
#define BT_ATT_OP_READ_BLOB_RSP 0x0d
|
||||
struct bt_att_read_blob_rsp {
|
||||
uint8_t _dummy[0];
|
||||
uint8_t value[];
|
||||
} __packed;
|
||||
|
||||
/* Read Multiple Request */
|
||||
#define BT_ATT_READ_MULT_MIN_LEN_REQ 0x04
|
||||
|
||||
#define BT_ATT_OP_READ_MULT_REQ 0x0e
|
||||
struct bt_att_read_mult_req {
|
||||
uint8_t _dummy[0];
|
||||
uint16_t handles[];
|
||||
} __packed;
|
||||
|
||||
/* Read Multiple Respose */
|
||||
#define BT_ATT_OP_READ_MULT_RSP 0x0f
|
||||
struct bt_att_read_mult_rsp {
|
||||
uint8_t _dummy[0];
|
||||
uint8_t value[];
|
||||
} __packed;
|
||||
|
||||
/* Read by Group Type Request */
|
||||
#define BT_ATT_OP_READ_GROUP_REQ 0x10
|
||||
struct bt_att_read_group_req {
|
||||
uint16_t start_handle;
|
||||
uint16_t end_handle;
|
||||
uint8_t uuid[];
|
||||
} __packed;
|
||||
|
||||
struct bt_att_group_data {
|
||||
uint16_t start_handle;
|
||||
uint16_t end_handle;
|
||||
uint8_t value[];
|
||||
} __packed;
|
||||
|
||||
/* Read by Group Type Response */
|
||||
#define BT_ATT_OP_READ_GROUP_RSP 0x11
|
||||
struct bt_att_read_group_rsp {
|
||||
uint8_t len;
|
||||
struct bt_att_group_data data[];
|
||||
} __packed;
|
||||
|
||||
/* Write Request */
|
||||
#define BT_ATT_OP_WRITE_REQ 0x12
|
||||
struct bt_att_write_req {
|
||||
uint16_t handle;
|
||||
uint8_t value[];
|
||||
} __packed;
|
||||
|
||||
/* Write Response */
|
||||
#define BT_ATT_OP_WRITE_RSP 0x13
|
||||
|
||||
/* Prepare Write Request */
|
||||
#define BT_ATT_OP_PREPARE_WRITE_REQ 0x16
|
||||
struct bt_att_prepare_write_req {
|
||||
uint16_t handle;
|
||||
uint16_t offset;
|
||||
uint8_t value[];
|
||||
} __packed;
|
||||
|
||||
/* Prepare Write Respond */
|
||||
#define BT_ATT_OP_PREPARE_WRITE_RSP 0x17
|
||||
struct bt_att_prepare_write_rsp {
|
||||
uint16_t handle;
|
||||
uint16_t offset;
|
||||
uint8_t value[];
|
||||
} __packed;
|
||||
|
||||
/* Execute Write Request */
|
||||
#define BT_ATT_FLAG_CANCEL 0x00
|
||||
#define BT_ATT_FLAG_EXEC 0x01
|
||||
|
||||
#define BT_ATT_OP_EXEC_WRITE_REQ 0x18
|
||||
struct bt_att_exec_write_req {
|
||||
uint8_t flags;
|
||||
} __packed;
|
||||
|
||||
/* Execute Write Response */
|
||||
#define BT_ATT_OP_EXEC_WRITE_RSP 0x19
|
||||
|
||||
/* Handle Value Notification */
|
||||
#define BT_ATT_OP_NOTIFY 0x1b
|
||||
struct bt_att_notify {
|
||||
uint16_t handle;
|
||||
uint8_t value[];
|
||||
} __packed;
|
||||
|
||||
/* Handle Value Indication */
|
||||
#define BT_ATT_OP_INDICATE 0x1d
|
||||
struct bt_att_indicate {
|
||||
uint16_t handle;
|
||||
uint8_t value[];
|
||||
} __packed;
|
||||
|
||||
/* Handle Value Confirm */
|
||||
#define BT_ATT_OP_CONFIRM 0x1e
|
||||
|
||||
struct bt_att_signature {
|
||||
uint8_t value[12];
|
||||
} __packed;
|
||||
|
||||
#define BT_ATT_OP_READ_MULT_VL_REQ 0x20
|
||||
struct bt_att_read_mult_vl_req {
|
||||
uint8_t _dummy[0];
|
||||
uint16_t handles[];
|
||||
} __packed;
|
||||
|
||||
/* Read Multiple Respose */
|
||||
#define BT_ATT_OP_READ_MULT_VL_RSP 0x21
|
||||
struct bt_att_read_mult_vl_rsp {
|
||||
uint16_t len;
|
||||
uint8_t value[];
|
||||
} __packed;
|
||||
|
||||
/* Handle Multiple Value Notification */
|
||||
#define BT_ATT_OP_NOTIFY_MULT 0x23
|
||||
struct bt_att_notify_mult {
|
||||
uint16_t handle;
|
||||
uint16_t len;
|
||||
uint8_t value[];
|
||||
} __packed;
|
||||
|
||||
/* Write Command */
|
||||
#define BT_ATT_OP_WRITE_CMD 0x52
|
||||
struct bt_att_write_cmd {
|
||||
uint16_t handle;
|
||||
uint8_t value[];
|
||||
} __packed;
|
||||
|
||||
/* Signed Write Command */
|
||||
#define BT_ATT_OP_SIGNED_WRITE_CMD 0xd2
|
||||
struct bt_att_signed_write_cmd {
|
||||
uint16_t handle;
|
||||
uint8_t value[];
|
||||
} __packed;
|
||||
1772
devices/ble_hci/common-hal/_bleio/hci_include/hci.h
Normal file
1772
devices/ble_hci/common-hal/_bleio/hci_include/hci.h
Normal file
File diff suppressed because it is too large
Load diff
92
devices/ble_hci/common-hal/_bleio/hci_include/hci_err.h
Normal file
92
devices/ble_hci/common-hal/_bleio/hci_include/hci_err.h
Normal file
|
|
@ -0,0 +1,92 @@
|
|||
/** @file
|
||||
* @brief Bluetooth Host Control Interface status codes.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2019 Nordic Semiconductor ASA
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
#ifndef ZEPHYR_INCLUDE_BLUETOOTH_HCI_STATUS_H_
|
||||
#define ZEPHYR_INCLUDE_BLUETOOTH_HCI_STATUS_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/** HCI Error Codes, BT Core Spec v5.2 [Vol 1, Part F]. */
|
||||
#define BT_HCI_ERR_SUCCESS 0x00
|
||||
#define BT_HCI_ERR_UNKNOWN_CMD 0x01
|
||||
#define BT_HCI_ERR_UNKNOWN_CONN_ID 0x02
|
||||
#define BT_HCI_ERR_HW_FAILURE 0x03
|
||||
#define BT_HCI_ERR_PAGE_TIMEOUT 0x04
|
||||
#define BT_HCI_ERR_AUTH_FAIL 0x05
|
||||
#define BT_HCI_ERR_PIN_OR_KEY_MISSING 0x06
|
||||
#define BT_HCI_ERR_MEM_CAPACITY_EXCEEDED 0x07
|
||||
#define BT_HCI_ERR_CONN_TIMEOUT 0x08
|
||||
#define BT_HCI_ERR_CONN_LIMIT_EXCEEDED 0x09
|
||||
#define BT_HCI_ERR_SYNC_CONN_LIMIT_EXCEEDED 0x0a
|
||||
#define BT_HCI_ERR_CONN_ALREADY_EXISTS 0x0b
|
||||
#define BT_HCI_ERR_CMD_DISALLOWED 0x0c
|
||||
#define BT_HCI_ERR_INSUFFICIENT_RESOURCES 0x0d
|
||||
#define BT_HCI_ERR_INSUFFICIENT_SECURITY 0x0e
|
||||
#define BT_HCI_ERR_BD_ADDR_UNACCEPTABLE 0x0f
|
||||
#define BT_HCI_ERR_CONN_ACCEPT_TIMEOUT 0x10
|
||||
#define BT_HCI_ERR_UNSUPP_FEATURE_PARAM_VAL 0x11
|
||||
#define BT_HCI_ERR_INVALID_PARAM 0x12
|
||||
#define BT_HCI_ERR_REMOTE_USER_TERM_CONN 0x13
|
||||
#define BT_HCI_ERR_REMOTE_LOW_RESOURCES 0x14
|
||||
#define BT_HCI_ERR_REMOTE_POWER_OFF 0x15
|
||||
#define BT_HCI_ERR_LOCALHOST_TERM_CONN 0x16
|
||||
#define BT_HCI_ERR_REPEATED_ATTEMPTS 0x17
|
||||
#define BT_HCI_ERR_PAIRING_NOT_ALLOWED 0x18
|
||||
#define BT_HCI_ERR_UNKNOWN_LMP_PDU 0x19
|
||||
#define BT_HCI_ERR_UNSUPP_REMOTE_FEATURE 0x1a
|
||||
#define BT_HCI_ERR_SCO_OFFSET_REJECTED 0x1b
|
||||
#define BT_HCI_ERR_SCO_INTERVAL_REJECTED 0x1c
|
||||
#define BT_HCI_ERR_SCO_AIR_MODE_REJECTED 0x1d
|
||||
#define BT_HCI_ERR_INVALID_LL_PARAM 0x1e
|
||||
#define BT_HCI_ERR_UNSPECIFIED 0x1f
|
||||
#define BT_HCI_ERR_UNSUPP_LL_PARAM_VAL 0x20
|
||||
#define BT_HCI_ERR_ROLE_CHANGE_NOT_ALLOWED 0x21
|
||||
#define BT_HCI_ERR_LL_RESP_TIMEOUT 0x22
|
||||
#define BT_HCI_ERR_LL_PROC_COLLISION 0x23
|
||||
#define BT_HCI_ERR_LMP_PDU_NOT_ALLOWED 0x24
|
||||
#define BT_HCI_ERR_ENC_MODE_NOT_ACCEPTABLE 0x25
|
||||
#define BT_HCI_ERR_LINK_KEY_CANNOT_BE_CHANGED 0x26
|
||||
#define BT_HCI_ERR_REQUESTED_QOS_NOT_SUPPORTED 0x27
|
||||
#define BT_HCI_ERR_INSTANT_PASSED 0x28
|
||||
#define BT_HCI_ERR_PAIRING_NOT_SUPPORTED 0x29
|
||||
#define BT_HCI_ERR_DIFF_TRANS_COLLISION 0x2a
|
||||
#define BT_HCI_ERR_QOS_UNACCEPTABLE_PARAM 0x2c
|
||||
#define BT_HCI_ERR_QOS_REJECTED 0x2d
|
||||
#define BT_HCI_ERR_CHAN_ASSESS_NOT_SUPPORTED 0x2e
|
||||
#define BT_HCI_ERR_INSUFF_SECURITY 0x2f
|
||||
#define BT_HCI_ERR_PARAM_OUT_OF_MANDATORY_RANGE 0x30
|
||||
#define BT_HCI_ERR_ROLE_SWITCH_PENDING 0x32
|
||||
#define BT_HCI_ERR_RESERVED_SLOT_VIOLATION 0x34
|
||||
#define BT_HCI_ERR_ROLE_SWITCH_FAILED 0x35
|
||||
#define BT_HCI_ERR_EXT_INQ_RESP_TOO_LARGE 0x36
|
||||
#define BT_HCI_ERR_SIMPLE_PAIR_NOT_SUPP_BY_HOST 0x37
|
||||
#define BT_HCI_ERR_HOST_BUSY_PAIRING 0x38
|
||||
#define BT_HCI_ERR_CONN_REJECTED_DUE_TO_NO_CHAN 0x39
|
||||
#define BT_HCI_ERR_CONTROLLER_BUSY 0x3a
|
||||
#define BT_HCI_ERR_UNACCEPT_CONN_PARAM 0x3b
|
||||
#define BT_HCI_ERR_ADV_TIMEOUT 0x3c
|
||||
#define BT_HCI_ERR_TERM_DUE_TO_MIC_FAIL 0x3d
|
||||
#define BT_HCI_ERR_CONN_FAIL_TO_ESTAB 0x3e
|
||||
#define BT_HCI_ERR_MAC_CONN_FAILED 0x3f
|
||||
#define BT_HCI_ERR_CLOCK_ADJUST_REJECTED 0x40
|
||||
#define BT_HCI_ERR_SUBMAP_NOT_DEFINED 0x41
|
||||
#define BT_HCI_ERR_UNKNOWN_ADV_IDENTIFIER 0x42
|
||||
#define BT_HCI_ERR_LIMIT_REACHED 0x43
|
||||
#define BT_HCI_ERR_OP_CANCELLED_BY_HOST 0x44
|
||||
#define BT_HCI_ERR_PACKET_TOO_LONG 0x45
|
||||
|
||||
#define BT_HCI_ERR_AUTHENTICATION_FAIL __DEPRECATED_MACRO BT_HCI_ERR_AUTH_FAIL
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* ZEPHYR_INCLUDE_BLUETOOTH_HCI_STATUS_H_ */
|
||||
152
devices/ble_hci/common-hal/_bleio/hci_include/hci_raw.h
Normal file
152
devices/ble_hci/common-hal/_bleio/hci_include/hci_raw.h
Normal file
|
|
@ -0,0 +1,152 @@
|
|||
/** @file
|
||||
* @brief Bluetooth HCI RAW channel handling
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2016 Intel Corporation
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
#ifndef ZEPHYR_INCLUDE_BLUETOOTH_HCI_RAW_H_
|
||||
#define ZEPHYR_INCLUDE_BLUETOOTH_HCI_RAW_H_
|
||||
|
||||
/**
|
||||
* @brief HCI RAW channel
|
||||
* @defgroup hci_raw HCI RAW channel
|
||||
* @ingroup bluetooth
|
||||
* @{
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_BT_CTLR_TX_BUFFER_SIZE)
|
||||
#define BT_L2CAP_MTU (CONFIG_BT_CTLR_TX_BUFFER_SIZE - BT_L2CAP_HDR_SIZE)
|
||||
#else
|
||||
#define BT_L2CAP_MTU 65 /* 64-byte public key + opcode */
|
||||
#endif /* CONFIG_BT_CTLR */
|
||||
|
||||
/** Data size needed for ACL buffers */
|
||||
#define BT_BUF_ACL_SIZE BT_L2CAP_BUF_SIZE(BT_L2CAP_MTU)
|
||||
|
||||
#if defined(CONFIG_BT_CTLR_TX_BUFFERS)
|
||||
#define BT_HCI_ACL_COUNT CONFIG_BT_CTLR_TX_BUFFERS
|
||||
#else
|
||||
#define BT_HCI_ACL_COUNT 6
|
||||
#endif
|
||||
|
||||
#define BT_BUF_TX_SIZE MAX(BT_BUF_RX_SIZE, BT_BUF_ACL_SIZE)
|
||||
|
||||
/** @brief Send packet to the Bluetooth controller
|
||||
*
|
||||
* Send packet to the Bluetooth controller. Caller needs to
|
||||
* implement netbuf pool.
|
||||
*
|
||||
* @param buf netbuf packet to be send
|
||||
*
|
||||
* @return Zero on success or (negative) error code otherwise.
|
||||
*/
|
||||
int bt_send(struct net_buf *buf);
|
||||
|
||||
enum {
|
||||
/** Passthrough mode
|
||||
*
|
||||
* While in this mode the buffers are passed as is between the stack
|
||||
* and the driver.
|
||||
*/
|
||||
BT_HCI_RAW_MODE_PASSTHROUGH = 0x00,
|
||||
|
||||
/** H:4 mode
|
||||
*
|
||||
* While in this mode H:4 headers will added into the buffers
|
||||
* according to the buffer type when coming from the stack and will be
|
||||
* removed and used to set the buffer type.
|
||||
*/
|
||||
BT_HCI_RAW_MODE_H4 = 0x01,
|
||||
};
|
||||
|
||||
/** @brief Set Bluetooth RAW channel mode
|
||||
*
|
||||
* Set access mode of Bluetooth RAW channel.
|
||||
*
|
||||
* @param mode Access mode.
|
||||
*
|
||||
* @return Zero on success or (negative) error code otherwise.
|
||||
*/
|
||||
int bt_hci_raw_set_mode(uint8_t mode);
|
||||
|
||||
/** @brief Get Bluetooth RAW channel mode
|
||||
*
|
||||
* Get access mode of Bluetooth RAW channel.
|
||||
*
|
||||
* @return Access mode.
|
||||
*/
|
||||
uint8_t bt_hci_raw_get_mode(void);
|
||||
|
||||
#define BT_HCI_ERR_EXT_HANDLED 0xff
|
||||
|
||||
/** Helper macro to define a command extension
|
||||
*
|
||||
* @param _op Opcode of the command.
|
||||
* @param _min_len Minimal length of the command.
|
||||
* @param _func Handler function to be called.
|
||||
*/
|
||||
#define BT_HCI_RAW_CMD_EXT(_op, _min_len, _func) \
|
||||
{ \
|
||||
.op = _op, \
|
||||
.min_len = _min_len, \
|
||||
.func = _func, \
|
||||
}
|
||||
|
||||
struct bt_hci_raw_cmd_ext {
|
||||
/** Opcode of the command */
|
||||
uint16_t op;
|
||||
|
||||
/** Minimal length of the command */
|
||||
size_t min_len;
|
||||
|
||||
/** Handler function.
|
||||
*
|
||||
* Handler function to be called when a command is intercepted.
|
||||
*
|
||||
* @param buf Buffer containing the command.
|
||||
*
|
||||
* @return HCI Status code or BT_HCI_ERR_EXT_HANDLED if command has
|
||||
* been handled already and a response has been sent as oppose to
|
||||
* BT_HCI_ERR_SUCCESS which just indicates that the command can be
|
||||
* sent to the controller to be processed.
|
||||
*/
|
||||
uint8_t (*func)(struct net_buf *buf);
|
||||
};
|
||||
|
||||
/** @brief Register Bluetooth RAW command extension table
|
||||
*
|
||||
* Register Bluetooth RAW channel command extension table, opcodes in this
|
||||
* table are intercepted to sent to the handler function.
|
||||
*
|
||||
* @param cmds Pointer to the command extension table.
|
||||
* @param size Size of the command extension table.
|
||||
*/
|
||||
void bt_hci_raw_cmd_ext_register(struct bt_hci_raw_cmd_ext *cmds, size_t size);
|
||||
|
||||
/** @brief Enable Bluetooth RAW channel:
|
||||
*
|
||||
* Enable Bluetooth RAW HCI channel.
|
||||
*
|
||||
* @param rx_queue netbuf queue where HCI packets received from the Bluetooth
|
||||
* controller are to be queued. The queue is defined in the caller while
|
||||
* the available buffers pools are handled in the stack.
|
||||
*
|
||||
* @return Zero on success or (negative) error code otherwise.
|
||||
*/
|
||||
int bt_enable_raw(struct k_fifo *rx_queue);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
#endif /* ZEPHYR_INCLUDE_BLUETOOTH_HCI_RAW_H_ */
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue