mirror of
https://github.com/rust-lang/rustlings.git
synced 2025-12-26 00:11:49 +02:00
Compare commits
2772 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c8d1d9c51f | ||
|
|
ab2eb3442e | ||
|
|
dbbeb7d4ed | ||
|
|
bfa00ffbdc | ||
|
|
10eb1a3aee | ||
|
|
fd2bf9f6f6 | ||
|
|
fc1f9f0124 | ||
|
|
789492d1a9 | ||
|
|
afc320bed4 | ||
|
|
cba4a6f9c8 | ||
|
|
5556d42b46 | ||
|
|
7d2bc1c7a4 | ||
|
|
c209c874a9 | ||
|
|
dd52e9cd72 | ||
|
|
0f71a150ff | ||
|
|
74388d4bf4 | ||
|
|
e811dd15b5 | ||
|
|
f22700a4ec | ||
|
|
ee25a7d458 | ||
|
|
594e212b8a | ||
|
|
5c355468c1 | ||
|
|
d1571d18f9 | ||
|
|
cb86b44dea | ||
|
|
833e6e0c92 | ||
|
|
159273e532 | ||
|
|
631f2db1a3 | ||
|
|
a1f0eaab54 | ||
|
|
b1898f6d8b | ||
|
|
d29e9e7e07 | ||
|
|
360605e284 | ||
|
|
64772544fa | ||
|
|
5f4875e2ba | ||
|
|
fd2a8c01cb | ||
|
|
b6129ad081 | ||
|
|
28d0b0a21e | ||
|
|
b779c43126 | ||
|
|
4e12725616 | ||
|
|
570bc9f32d | ||
|
|
47976caa69 | ||
|
|
f1abd8577c | ||
|
|
423b50b068 | ||
|
|
bedf0789f2 | ||
|
|
a2d1cb3b22 | ||
|
|
e7ba88f905 | ||
|
|
50f6e5232e | ||
|
|
8854f0a5ed | ||
|
|
13cc3acdfd | ||
|
|
5b7368c46d | ||
|
|
27999f2d26 | ||
|
|
e74f2a4274 | ||
|
|
d141a73493 | ||
|
|
631f44331e | ||
|
|
b01fddef8b | ||
|
|
78a8553f1c | ||
|
|
b70c1abd7c | ||
|
|
71f31d74bc | ||
|
|
72e557b3a9 | ||
|
|
3eaccbb61a | ||
|
|
b678bd8ed2 | ||
|
|
2baa140615 | ||
|
|
e760f07767 | ||
|
|
ca5d5f0a49 | ||
|
|
69b4fd49fc | ||
|
|
36f315c344 | ||
|
|
8016f5ca2d | ||
|
|
8ef2ff1257 | ||
|
|
6ce31defb6 | ||
|
|
0b3ad9141b | ||
|
|
c903db5c53 | ||
|
|
8a038b946c | ||
|
|
ed9740b72c | ||
|
|
ce3dcc9856 | ||
|
|
4472d50eba | ||
|
|
a1d5702ba0 | ||
|
|
52a231ce2f | ||
|
|
16af981772 | ||
|
|
fc141b8dfc | ||
|
|
82ebd29ff6 | ||
|
|
f5737b5a49 | ||
|
|
55e68d2c63 | ||
|
|
479f45da9b | ||
|
|
140c4e4812 | ||
|
|
337460d299 | ||
|
|
e41c3a7c92 | ||
|
|
1b9faa4d61 | ||
|
|
9f9a754a64 | ||
|
|
f7b0cfe8d1 | ||
|
|
4ce8667b9d | ||
|
|
0785b24192 | ||
|
|
34f02cf83d | ||
|
|
8b43d79257 | ||
|
|
dc086c6bf1 | ||
|
|
dc0ffbe16e | ||
|
|
8df66f7991 | ||
|
|
39580381fa | ||
|
|
06a0f278e5 | ||
|
|
fd97470f35 | ||
|
|
11fc3f1e56 | ||
|
|
693bb708b2 | ||
|
|
97719fe8da | ||
|
|
4933ace50b | ||
|
|
81bf0a6430 | ||
|
|
24aed1b14e | ||
|
|
09c3ac02f8 | ||
|
|
45a39585b3 | ||
|
|
286a455fa9 | ||
|
|
bdf4960b6a | ||
|
|
13124aafe3 | ||
|
|
2128be8b28 | ||
|
|
175294fa5d | ||
|
|
5016c7cf7c | ||
|
|
1468206052 | ||
|
|
d1ff4b5cf0 | ||
|
|
700a065abd | ||
|
|
3fc462f90f | ||
|
|
65a8f6bb4b | ||
|
|
e0f0944bff | ||
|
|
c7590dd752 | ||
|
|
33a5680328 | ||
|
|
455d87cadd | ||
|
|
e65ae09789 | ||
|
|
dacdce1ea2 | ||
|
|
766f3c50ec | ||
|
|
802b97b2ed | ||
|
|
2ad408f2b8 | ||
|
|
c8fddd8f62 | ||
|
|
74fab994e2 | ||
|
|
3a99542f73 | ||
|
|
2ae9f3555b | ||
|
|
1937b4bf66 | ||
|
|
8beb290842 | ||
|
|
8fec5155c7 | ||
|
|
3f49decce9 | ||
|
|
e2492f65a0 | ||
|
|
5116a812fb | ||
|
|
82409c060f | ||
|
|
183ed3f88f | ||
|
|
447ac3c40b | ||
|
|
96f96927da | ||
|
|
2c79e29483 | ||
|
|
362473dde0 | ||
|
|
8339682112 | ||
|
|
3f06d767b5 | ||
|
|
2854dc9ab3 | ||
|
|
516fcf9168 | ||
|
|
12d1971b0d | ||
|
|
3e09e509d6 | ||
|
|
99fb11cc72 | ||
|
|
d176ddd27e | ||
|
|
0847b3a4bf | ||
|
|
6d2ea8dae3 | ||
|
|
47ba4502e0 | ||
|
|
6263cb6456 | ||
|
|
d7024d80ce | ||
|
|
59d6b852af | ||
|
|
e512928df5 | ||
|
|
a38029e3e7 | ||
|
|
b12b652a57 | ||
|
|
c793416495 | ||
|
|
01343f187b | ||
|
|
69021e1497 | ||
|
|
08c408aae0 | ||
|
|
bf698659b0 | ||
|
|
2d5d70693a | ||
|
|
a4091ade5c | ||
|
|
a7a881809f | ||
|
|
0f4cb94cfe | ||
|
|
6469e9734b | ||
|
|
5372caefb3 | ||
|
|
9d7b973a62 | ||
|
|
a5f221aa39 | ||
|
|
e764b75aef | ||
|
|
708cfef3f7 | ||
|
|
01b8432d58 | ||
|
|
9b5b652c71 | ||
|
|
981a4778a9 | ||
|
|
5d4363d58d | ||
|
|
48697b8225 | ||
|
|
1652bb67d9 | ||
|
|
1499f681a3 | ||
|
|
a21fa6ff40 | ||
|
|
186dc3c1ab | ||
|
|
6b7a27d080 | ||
|
|
c9017f9f7a | ||
|
|
fdada8b3d4 | ||
|
|
9e2ff7d037 | ||
|
|
65834fc420 | ||
|
|
f5a4965de7 | ||
|
|
db5911eb73 | ||
|
|
2f4e63b443 | ||
|
|
584164a6ff | ||
|
|
e6f6d26d13 | ||
|
|
67d8d5848c | ||
|
|
43d15f09f0 | ||
|
|
7123c7ae3a | ||
|
|
4d9c346a17 | ||
|
|
deed9d3943 | ||
|
|
652f0c7676 | ||
|
|
e479ec8fb6 | ||
|
|
a33501e6a7 | ||
|
|
47f8199a99 | ||
|
|
4bf0ddc0e1 | ||
|
|
4cd0ccce83 | ||
|
|
a3657188b6 | ||
|
|
b8fcd11286 | ||
|
|
4810555038 | ||
|
|
84b291852c | ||
|
|
74831dd88f | ||
|
|
0b220f9fff | ||
|
|
d3cdeed871 | ||
|
|
0524632199 | ||
|
|
30d5b7db92 | ||
|
|
2f60f4d9ea | ||
|
|
b017b87866 | ||
|
|
b87aa98634 | ||
|
|
a4c07ca948 | ||
|
|
b8826dd3b3 | ||
|
|
d54c050985 | ||
|
|
248dd4415e | ||
|
|
dec6772b05 | ||
|
|
b4f4c79ac4 | ||
|
|
c1d5252b87 | ||
|
|
0f71e12235 | ||
|
|
fa6b7d77b2 | ||
|
|
a72c26bdc3 | ||
|
|
fe3292c170 | ||
|
|
ad66fe0074 | ||
|
|
df64893f2b | ||
|
|
e5bc8588e0 | ||
|
|
23bc5d23fe | ||
|
|
28d2bb0432 | ||
|
|
1c010a129e | ||
|
|
f5ce4cf0a5 | ||
|
|
ff3e6c05a5 | ||
|
|
33dfe5331a | ||
|
|
888ad35d10 | ||
|
|
fa452b3a93 | ||
|
|
2f8fa469ac | ||
|
|
d3a0c26999 | ||
|
|
95f10c8068 | ||
|
|
9bb174e96e | ||
|
|
4c5573b09f | ||
|
|
43eb014026 | ||
|
|
2d792651ea | ||
|
|
6cf75d569b | ||
|
|
67ce9b9e56 | ||
|
|
bcebbb9df6 | ||
|
|
bdd76cdf77 | ||
|
|
825637f32c | ||
|
|
8ef5d10da2 | ||
|
|
5217cdc5e2 | ||
|
|
e3c8c457ba | ||
|
|
cddaf4881e | ||
|
|
428d64ffa0 | ||
|
|
09c94bef2d | ||
|
|
a0e810b471 | ||
|
|
78728d5238 | ||
|
|
cc2c0958c9 | ||
|
|
4cb15a4cda | ||
|
|
9845e046de | ||
|
|
cf90364fd7 | ||
|
|
a13e3cd07f | ||
|
|
dfa2b44f71 | ||
|
|
b000164eed | ||
|
|
663a03a17b | ||
|
|
a943f5ba32 | ||
|
|
f3842aa746 | ||
|
|
18a9a2e791 | ||
|
|
61c7eaed62 | ||
|
|
2dcf917fa1 | ||
|
|
f53d458920 | ||
|
|
2af437fd90 | ||
|
|
56a9197f55 | ||
|
|
eddbb97934 | ||
|
|
4f71f74b44 | ||
|
|
cf9041c0e4 | ||
|
|
746cf6863d | ||
|
|
803e32dad2 | ||
|
|
a4f8826301 | ||
|
|
6187216606 | ||
|
|
275a854d6e | ||
|
|
7efccc36b4 | ||
|
|
64c2de95ca | ||
|
|
c170740423 | ||
|
|
45cfe86fb0 | ||
|
|
db4d649e55 | ||
|
|
c0452d160b | ||
|
|
b4b7ae63ad | ||
|
|
c07209b635 | ||
|
|
091e1e7f7a | ||
|
|
92f249a52c | ||
|
|
e6228e92b4 | ||
|
|
3e9c4c8bb8 | ||
|
|
22b650c092 | ||
|
|
f0849447ad | ||
|
|
789223cc9e | ||
|
|
de3f846a53 | ||
|
|
46121b71cf | ||
|
|
b1daea1fe8 | ||
|
|
129884aff7 | ||
|
|
720b280bc1 | ||
|
|
9b7a5c041e | ||
|
|
c46d8bdf95 | ||
|
|
050a23ce67 | ||
|
|
2afe6b38d3 | ||
|
|
097f3c74ea | ||
|
|
25b5686dd2 | ||
|
|
a91888e79e | ||
|
|
c31e15c4cf | ||
|
|
1694682aa4 | ||
|
|
29bcb282da | ||
|
|
f1bd444792 | ||
|
|
fbc226a510 | ||
|
|
5baa503bfc | ||
|
|
0cd96afe63 | ||
|
|
3d540ed946 | ||
|
|
98cd00de63 | ||
|
|
ecbe9b7324 | ||
|
|
879f0cd5c6 | ||
|
|
613ec23f84 | ||
|
|
f574905b8e | ||
|
|
bd63ece47c | ||
|
|
2901d85662 | ||
|
|
020711fa97 | ||
|
|
a2dfbd86da | ||
|
|
d6fd251a73 | ||
|
|
1264510fc0 | ||
|
|
ef842d3a94 | ||
|
|
d768353806 | ||
|
|
e4dbbbf5f5 | ||
|
|
42b5c0a1f7 | ||
|
|
fd558065c7 | ||
|
|
68142aff7f | ||
|
|
946c29679e | ||
|
|
6a79ada7f2 | ||
|
|
835ec72622 | ||
|
|
a9f0c7bf1f | ||
|
|
1ede3a82e9 | ||
|
|
0abcdeed42 | ||
|
|
532c9ebb30 | ||
|
|
2a1bc53771 | ||
|
|
5bf8d1fa1b | ||
|
|
2ff1813746 | ||
|
|
42a3503906 | ||
|
|
98db579014 | ||
|
|
0338b1cbdf | ||
|
|
e1051724c3 | ||
|
|
0e4136d31e | ||
|
|
f8d38320cd | ||
|
|
42bd0b8b75 | ||
|
|
08ac11ff22 | ||
|
|
6ae4a979f4 | ||
|
|
a3ada0eee8 | ||
|
|
50530fa3cf | ||
|
|
611f9d8722 | ||
|
|
8e9c99ae5b | ||
|
|
c324ea10df | ||
|
|
1984a8d38e | ||
|
|
84a818dbda | ||
|
|
d140d49b61 | ||
|
|
beb7b24e8e | ||
|
|
5337620476 | ||
|
|
990c68efcb | ||
|
|
8d4145038d | ||
|
|
f2c3dcab3a | ||
|
|
73e84f8379 | ||
|
|
eafb157d60 | ||
|
|
7cdf6b7942 | ||
|
|
c8ad6c3960 | ||
|
|
3bb71c6b0c | ||
|
|
d0b843d6c4 | ||
|
|
0f4c42d54e | ||
|
|
bde2524c3b | ||
|
|
cf3f6fd6a1 | ||
|
|
c8481d35c1 | ||
|
|
96a44f3dcf | ||
|
|
0ae66d1860 | ||
|
|
700605ff35 | ||
|
|
a67e63cce0 | ||
|
|
d48e86b154 | ||
|
|
39a19f9450 | ||
|
|
2dfc7cdb1a | ||
|
|
0add5ac240 | ||
|
|
5a1d95028c | ||
|
|
e80e91faf2 | ||
|
|
4ae3fcc3ca | ||
|
|
17a2d42ffd | ||
|
|
a7bc6d53a5 | ||
|
|
56eb4a5d65 | ||
|
|
f6cf6c611c | ||
|
|
7a74a72dc8 | ||
|
|
a4da216a5c | ||
|
|
8b2d9ed503 | ||
|
|
d2b5906be2 | ||
|
|
f9e35a4344 | ||
|
|
0525739046 | ||
|
|
11fda5d70f | ||
|
|
c7a18b0781 | ||
|
|
01a78531ad | ||
|
|
c2414b8891 | ||
|
|
f03020a7e2 | ||
|
|
01509a2a84 | ||
|
|
66b3a9cdd7 | ||
|
|
baca8c9667 | ||
|
|
d9df809838 | ||
|
|
da9f97b0e0 | ||
|
|
2d0497bf3b | ||
|
|
5e7afce019 | ||
|
|
74180ba1cc | ||
|
|
d425dbe203 | ||
|
|
32415e1e6c | ||
|
|
8e178ac60d | ||
|
|
3ae6c208b2 | ||
|
|
563727f47f | ||
|
|
2b7ac91505 | ||
|
|
52c0f5b39e | ||
|
|
fef66b80ad | ||
|
|
b6f40f2ec8 | ||
|
|
8c3b8dcec4 | ||
|
|
7f73219041 | ||
|
|
196d3c1a98 | ||
|
|
8c60ac267e | ||
|
|
3c7e7368b2 | ||
|
|
593f0e0916 | ||
|
|
1508938fed | ||
|
|
881d3e9441 | ||
|
|
aedeff8b24 | ||
|
|
75e2804c83 | ||
|
|
c45d2c3255 | ||
|
|
ea40804371 | ||
|
|
ee2b772dd5 | ||
|
|
62a2c1a6d9 | ||
|
|
de0befef9c | ||
|
|
5658998c0c | ||
|
|
89e0f64279 | ||
|
|
edea76b5b9 | ||
|
|
016e6a014e | ||
|
|
cdeb8ce229 | ||
|
|
12504b01e9 | ||
|
|
c3a92b1248 | ||
|
|
181c81f016 | ||
|
|
cb7ce006b5 | ||
|
|
2150d629b1 | ||
|
|
c82c367324 | ||
|
|
dc5c72bc19 | ||
|
|
0ce5d9d4d7 | ||
|
|
37fcbeb596 | ||
|
|
2f071c97b0 | ||
|
|
9664f4357c | ||
|
|
74ae506603 | ||
|
|
2965867338 | ||
|
|
e63e668d86 | ||
|
|
b7289e59aa | ||
|
|
be4dfe8be0 | ||
|
|
e230ffcf03 | ||
|
|
0d7b036137 | ||
|
|
078142c43c | ||
|
|
5920a58e83 | ||
|
|
aaea5b490f | ||
|
|
8d45cdb09d | ||
|
|
a4e623ea94 | ||
|
|
5595e1c397 | ||
|
|
ca41f9e2df | ||
|
|
177e2870c5 | ||
|
|
3ce3235294 | ||
|
|
c51f1b3f31 | ||
|
|
8bf8b19a5d | ||
|
|
6d1d42d2dd | ||
|
|
212c82c6f6 | ||
|
|
fcefa3d614 | ||
|
|
b3b4b7d59c | ||
|
|
29abaee4ec | ||
|
|
c7c8d99680 | ||
|
|
c1d28b502e | ||
|
|
14fe248b4b | ||
|
|
88f27a5377 | ||
|
|
1f1a62d83e | ||
|
|
428998a4cf | ||
|
|
d26f47dddd | ||
|
|
2af0cd9cce | ||
|
|
f92d45fa68 | ||
|
|
67fa017742 | ||
|
|
d8c2ab8349 | ||
|
|
0df0be8352 | ||
|
|
8ebd2f9df2 | ||
|
|
4ef345e706 | ||
|
|
0a2d4dae5a | ||
|
|
71053101c3 | ||
|
|
53fdb9044d | ||
|
|
8a085a0a85 | ||
|
|
edf5762612 | ||
|
|
ef02c6c6ab | ||
|
|
e4ee2cd548 | ||
|
|
b77007887c | ||
|
|
2dac8e509b | ||
|
|
e5a19a4c33 | ||
|
|
5349f0e8d4 | ||
|
|
ad8e544483 | ||
|
|
86684b7fc9 | ||
|
|
4ce2714da1 | ||
|
|
e93a99e19e | ||
|
|
61a84a2c11 | ||
|
|
30040d7778 | ||
|
|
e3b9124b85 | ||
|
|
642c3bd37e | ||
|
|
49e4a1fab0 | ||
|
|
04d36996dd | ||
|
|
f1a60780b9 | ||
|
|
d83c91edc6 | ||
|
|
ea504e6bf1 | ||
|
|
a2be6754bf | ||
|
|
daa090981a | ||
|
|
aaf183142e | ||
|
|
7525ecd8c1 | ||
|
|
09d8bc83ff | ||
|
|
cc35a8431f | ||
|
|
819dea2500 | ||
|
|
01e6732e4d | ||
|
|
f04089b8bc | ||
|
|
2566f9aaf6 | ||
|
|
1eac00e89a | ||
|
|
2e9b9a9f13 | ||
|
|
9f5be60b40 | ||
|
|
d64836f317 | ||
|
|
634e17a5ab | ||
|
|
2f810a4da6 | ||
|
|
cb9f1ac9ce | ||
|
|
d83cc69afe | ||
|
|
d6bb27ec20 | ||
|
|
d42a6e7415 | ||
|
|
b9167e9299 | ||
|
|
28ec0f864a | ||
|
|
7005d8a400 | ||
|
|
7f433ae28f | ||
|
|
a2506f154b | ||
|
|
501b973c25 | ||
|
|
4eec81a113 | ||
|
|
9a13bccd63 | ||
|
|
30636e7cf3 | ||
|
|
67a15ef27f | ||
|
|
d322bcfcec | ||
|
|
0ac5aa7af2 | ||
|
|
f9be652b3b | ||
|
|
932f6b53a9 | ||
|
|
4d9eb35ad7 | ||
|
|
86d716cf8a | ||
|
|
87db9129bc | ||
|
|
6566c5904f | ||
|
|
aa813fbce1 | ||
|
|
d1ebbaa6f6 | ||
|
|
c07cf5bffe | ||
|
|
df448c069c | ||
|
|
25e7696565 | ||
|
|
92777c0a44 | ||
|
|
7ebc260924 | ||
|
|
f5eaa578b9 | ||
|
|
6f04570dd0 | ||
|
|
15ca847c37 | ||
|
|
c613b70363 | ||
|
|
dc02c38a94 | ||
|
|
7526c6b1f9 | ||
|
|
1cbabc3d28 | ||
|
|
bd10b154fe | ||
|
|
070a780d7f | ||
|
|
8aef915ee7 | ||
|
|
3da860927d | ||
|
|
1c90575b9f | ||
|
|
9dcc4b7df5 | ||
|
|
9831cbb139 | ||
|
|
bee62c89de | ||
|
|
5c0073a948 | ||
|
|
2a26dfcb00 | ||
|
|
24539666af | ||
|
|
757723a7e8 | ||
|
|
ff4c752984 | ||
|
|
06d1089714 | ||
|
|
6e827da570 | ||
|
|
279ebdc153 | ||
|
|
9b0eeb815a | ||
|
|
44824718b2 | ||
|
|
8bd03093eb | ||
|
|
d5a6dee1b3 | ||
|
|
a534de0312 | ||
|
|
98c5088a39 | ||
|
|
6807e63c5f | ||
|
|
2a95a3e966 | ||
|
|
1e3745ccdf | ||
|
|
d8160f9113 | ||
|
|
6494a8c50b | ||
|
|
864cfa725b | ||
|
|
e79bc727f0 | ||
|
|
2e1a87d7d3 | ||
|
|
f53a0e8700 | ||
|
|
470dc65956 | ||
|
|
686143100f | ||
|
|
c3933904f6 | ||
|
|
65849629f5 | ||
|
|
fa1f239a70 | ||
|
|
4bb6bda9f6 | ||
|
|
256c4013b7 | ||
|
|
27e9520665 | ||
|
|
b3642b0219 | ||
|
|
193e0a03b2 | ||
|
|
a59acf8835 | ||
|
|
62e92476e6 | ||
|
|
6255efe8b2 | ||
|
|
a46d66134b | ||
|
|
f034899c7f | ||
|
|
c9a5fa6097 | ||
|
|
d1a965f019 | ||
|
|
533a009257 | ||
|
|
4a80bf6441 | ||
|
|
c8d217ad50 | ||
|
|
a8ddc07a9a | ||
|
|
af85f2036c | ||
|
|
ff6c15f9c1 | ||
|
|
4110ae21af | ||
|
|
b15e0a279b | ||
|
|
787bec9875 | ||
|
|
f0ce2c1afa | ||
|
|
850c1d0234 | ||
|
|
ee7d976283 | ||
|
|
258ff6f462 | ||
|
|
95a3fe17fa | ||
|
|
501861e435 | ||
|
|
f3890cbae6 | ||
|
|
f714534393 | ||
|
|
d0fcd8ae8a | ||
|
|
7c46e7ac69 | ||
|
|
1db5de9653 | ||
|
|
b5fc06bd56 | ||
|
|
7c4d33654f | ||
|
|
05729b27a0 | ||
|
|
0bf3f7e01f | ||
|
|
bd5503a0d3 | ||
|
|
25e855a009 | ||
|
|
c2501ae733 | ||
|
|
3a4f2bebb4 | ||
|
|
394ca402a8 | ||
|
|
db25cc9157 | ||
|
|
93f8d1610d | ||
|
|
99c9ab467b | ||
|
|
db43efe3ec | ||
|
|
9a4ee47c52 | ||
|
|
0a674a158d | ||
|
|
3bd26c7a24 | ||
|
|
8c31d38fa1 | ||
|
|
d988054ad8 | ||
|
|
2db86833a9 | ||
|
|
b0a4750624 | ||
|
|
4f69285375 | ||
|
|
e640b4a1ff | ||
|
|
7f5a18fa34 | ||
|
|
c4897139ae | ||
|
|
372290a796 | ||
|
|
729385362c | ||
|
|
f6db88aca8 | ||
|
|
0819bbe21f | ||
|
|
18342b3aa3 | ||
|
|
c2daad8340 | ||
|
|
de9a0ed522 | ||
|
|
06e7216c83 | ||
|
|
60155294e9 | ||
|
|
3f2d41de9e | ||
|
|
b0f19fd862 | ||
|
|
0bf51c6a0d | ||
|
|
1d2c2cffd2 | ||
|
|
157fe016e5 | ||
|
|
5a233398eb | ||
|
|
919ba88413 | ||
|
|
445441ce25 | ||
|
|
34375b2ebf | ||
|
|
9ea744a710 | ||
|
|
2b6f9fb6a7 | ||
|
|
8c8f30d8ce | ||
|
|
b6c434c445 | ||
|
|
569a68eb73 | ||
|
|
1885ece2dc | ||
|
|
459c52137a | ||
|
|
190945352a | ||
|
|
def8d2c569 | ||
|
|
fdd7de00bd | ||
|
|
2f30eac27f | ||
|
|
14f3585816 | ||
|
|
8ad18de54c | ||
|
|
7560aec66b | ||
|
|
fb32d0b86f | ||
|
|
7090fffeae | ||
|
|
c1de4d46aa | ||
|
|
82b563f165 | ||
|
|
9cb25e16f9 | ||
|
|
ca07abf3dc | ||
|
|
b711dd692a | ||
|
|
1e1f031713 | ||
|
|
b5e17c965d | ||
|
|
23f0fae1c8 | ||
|
|
79ca821e26 | ||
|
|
fe7d775818 | ||
|
|
4e59857228 | ||
|
|
c2b7f45806 | ||
|
|
c6597d0010 | ||
|
|
1a4f55e0e6 | ||
|
|
30273a6ee5 | ||
|
|
8e3cc9d70c | ||
|
|
2b01811fe9 | ||
|
|
a561a0f7f0 | ||
|
|
36a8e3ac0e | ||
|
|
0f18d599e9 | ||
|
|
3959570221 | ||
|
|
3ff9b0cd2a | ||
|
|
5b4103bbac | ||
|
|
d5ed749e9f | ||
|
|
39bdd086a7 | ||
|
|
dd025391f2 | ||
|
|
e5efc68a91 | ||
|
|
62afbb034f | ||
|
|
9691c3cb55 | ||
|
|
24cb4a3bc9 | ||
|
|
0888952cb9 | ||
|
|
b8437bea73 | ||
|
|
842e341895 | ||
|
|
3df59379de | ||
|
|
58b03af587 | ||
|
|
5652862b23 | ||
|
|
9895c1f9bd | ||
|
|
4e7f9ca1b3 | ||
|
|
c7cf3720bd | ||
|
|
d2996b4cc6 | ||
|
|
19675008c8 | ||
|
|
4937cb5b7c | ||
|
|
7b20ca9d04 | ||
|
|
217c6d42fb | ||
|
|
fb8dd57d1f | ||
|
|
669adbeb60 | ||
|
|
dd72429af4 | ||
|
|
971e7f94dc | ||
|
|
92183a74c4 | ||
|
|
e7bb832bf3 | ||
|
|
34d04139cd | ||
|
|
c4d434a2b4 | ||
|
|
76764633b4 | ||
|
|
8e87c35c88 | ||
|
|
45a1a74559 | ||
|
|
b24f256f2a | ||
|
|
864d046058 | ||
|
|
a27741b131 | ||
|
|
b13bafa13e | ||
|
|
f995b4c041 | ||
|
|
b8a5886db4 | ||
|
|
b9d2756ce8 | ||
|
|
07dec76f7c | ||
|
|
deeefcf16c | ||
|
|
8e0f7e56f7 | ||
|
|
87ca05b4bb | ||
|
|
d69a8a7045 | ||
|
|
87001a68c0 | ||
|
|
a610fc1bc2 | ||
|
|
e89028581c | ||
|
|
980ffa2a2b | ||
|
|
1f2029ae55 | ||
|
|
ed0fcf8e3d | ||
|
|
f36efae25d | ||
|
|
853d0593d0 | ||
|
|
078f6ffc1c | ||
|
|
7a6f71f090 | ||
|
|
a158c77d81 | ||
|
|
8ddbf9635d | ||
|
|
8d3ec24c11 | ||
|
|
a5ba44bd6a | ||
|
|
f5135ae4df | ||
|
|
87e55ccffd | ||
|
|
d911586788 | ||
|
|
b932ed1f67 | ||
|
|
dca3ea355e | ||
|
|
d095a307dd | ||
|
|
51712cc19f | ||
|
|
efa9f57048 | ||
|
|
b3aef377be | ||
|
|
e4520602f5 | ||
|
|
83cd91ccca | ||
|
|
51b4c240ed | ||
|
|
bdf826a026 | ||
|
|
c0c112985b | ||
|
|
f205ee3d4c | ||
|
|
e1375ef431 | ||
|
|
0aeaccc3a5 | ||
|
|
01b7d6334c | ||
|
|
a325df55d1 | ||
|
|
27fa7c3e4a | ||
|
|
0d93266462 | ||
|
|
3dce7e5696 | ||
|
|
e276c12192 | ||
|
|
eb952a480d | ||
|
|
f2833c5279 | ||
|
|
9c6f56b836 | ||
|
|
f3fdb07507 | ||
|
|
1fe32a7ff2 | ||
|
|
71700c506c | ||
|
|
18d0f3411f | ||
|
|
e1fa6cf30b | ||
|
|
a07172a069 | ||
|
|
32d2c38aa2 | ||
|
|
80388c042b | ||
|
|
c723bcd594 | ||
|
|
d4233f8166 | ||
|
|
60f44cc509 | ||
|
|
14ca4e8197 | ||
|
|
ae69f423cd | ||
|
|
d8ecf4bc2d | ||
|
|
3eabf2aafc | ||
|
|
02acf83e99 | ||
|
|
d53ae18918 | ||
|
|
0d37f9011c | ||
|
|
244ec8fbf2 | ||
|
|
57984ae9f3 | ||
|
|
1e69e67997 | ||
|
|
1c3b129a53 | ||
|
|
a449d39bdc | ||
|
|
34df327d2a | ||
|
|
b7b74910d8 | ||
|
|
b7add6a1a8 | ||
|
|
ce5df2d84b | ||
|
|
76acf613c5 | ||
|
|
2966a29449 | ||
|
|
c01ddbc747 | ||
|
|
f8f627b6f7 | ||
|
|
c3f1183815 | ||
|
|
f08fd02f33 | ||
|
|
8d1258f26a | ||
|
|
4304b3981e | ||
|
|
31e7920cee | ||
|
|
6fb45305f8 | ||
|
|
9cf5a2f83f | ||
|
|
3d6b5e8102 | ||
|
|
8c5d091513 | ||
|
|
91df875847 | ||
|
|
1ac392a551 | ||
|
|
3f0dc81a9c | ||
|
|
44ef58be43 | ||
|
|
803e0a4fbb | ||
|
|
62b435a309 | ||
|
|
fe28feba1e | ||
|
|
cc27966980 | ||
|
|
6b0a2ff0d0 | ||
|
|
b0c50b3bc7 | ||
|
|
4c51cb0909 | ||
|
|
032e3c9f30 | ||
|
|
9bae712453 | ||
|
|
b057e09156 | ||
|
|
0d5c105c15 | ||
|
|
fe698d9096 | ||
|
|
c54ec23b9e | ||
|
|
6f1d309308 | ||
|
|
6f88dd437e | ||
|
|
557bbe2b85 | ||
|
|
32c19c2e47 | ||
|
|
27d1a31eb6 | ||
|
|
3c6c29e19e | ||
|
|
2b97faa1d3 | ||
|
|
17ee0e3c7a | ||
|
|
c46a711526 | ||
|
|
098ff228d7 | ||
|
|
f5e9db90cc | ||
|
|
36db08340d | ||
|
|
2fb135026c | ||
|
|
77903200a0 | ||
|
|
e424e9f6c7 | ||
|
|
11f0fd7fd9 | ||
|
|
547f3ac835 | ||
|
|
373676a576 | ||
|
|
9bda8598e1 | ||
|
|
19b5e24d5c | ||
|
|
1da82a0eab | ||
|
|
75ee0e4245 | ||
|
|
53c40024d8 | ||
|
|
bcb192c707 | ||
|
|
6072ec16a0 | ||
|
|
b70ed105db | ||
|
|
8d0aa11a35 | ||
|
|
e2674498c6 | ||
|
|
3200581d4d | ||
|
|
6afc4840b4 | ||
|
|
93aef73eb5 | ||
|
|
5453fad991 | ||
|
|
f35f63fa57 | ||
|
|
88b583f2bb | ||
|
|
8863855627 | ||
|
|
5bbdb3d5ba | ||
|
|
9f4b5566db | ||
|
|
f97f4bc4f1 | ||
|
|
3e7f1e3ff2 | ||
|
|
4b80097817 | ||
|
|
7f530ebf20 | ||
|
|
11e74147ae | ||
|
|
5d78a2f103 | ||
|
|
194e0b951d | ||
|
|
369a3d3678 | ||
|
|
21b1e6ecf8 | ||
|
|
12d1bf407a | ||
|
|
5c4821ac6f | ||
|
|
8bfe2ec71e | ||
|
|
adf7d1b975 | ||
|
|
14e423fe53 | ||
|
|
a49f231b5d | ||
|
|
70f472484f | ||
|
|
77b687d501 | ||
|
|
0f629a47a5 | ||
|
|
f01f2d13c7 | ||
|
|
3461c4f73d | ||
|
|
4d6cd0ebb4 | ||
|
|
3080141c5f | ||
|
|
bc3808cf29 | ||
|
|
761fced786 | ||
|
|
706e075908 | ||
|
|
a13c7b0ae3 | ||
|
|
dad2216984 | ||
|
|
7e12aaa24a | ||
|
|
6e7f1f5f07 | ||
|
|
e0904de6ea | ||
|
|
4ecc35131c | ||
|
|
22838ba227 | ||
|
|
3b34167924 | ||
|
|
cb47760978 | ||
|
|
fb327612f8 | ||
|
|
7e16e7721a | ||
|
|
3181d9f3f8 | ||
|
|
02b1b5f6ab | ||
|
|
9de432e6bf | ||
|
|
24f819d823 | ||
|
|
13837b25cf | ||
|
|
2ac6606c6c | ||
|
|
c306792449 | ||
|
|
1d16528542 | ||
|
|
e74a7001ef | ||
|
|
c5c33578d9 | ||
|
|
0d65d17f10 | ||
|
|
98096d9859 | ||
|
|
5b25de927e | ||
|
|
a4698d8e10 | ||
|
|
078de99c61 | ||
|
|
02a122c2e7 | ||
|
|
faa261e3e2 | ||
|
|
9394825018 | ||
|
|
efd6b8b9c7 | ||
|
|
be6630bec6 | ||
|
|
d757726aca | ||
|
|
3545c5a7a4 | ||
|
|
3c4fde4610 | ||
|
|
33220c5109 | ||
|
|
64d95837e9 | ||
|
|
c3941323e2 | ||
|
|
9a7d88f139 | ||
|
|
c7fccf74c9 | ||
|
|
54c0ac1f91 | ||
|
|
642aac6f43 | ||
|
|
5374811f96 | ||
|
|
b97c88f202 | ||
|
|
d15096f0df | ||
|
|
8e6c83b4cf | ||
|
|
3bfd857a27 | ||
|
|
c03bc1ec3e | ||
|
|
2fcafc6602 | ||
|
|
11227403ce | ||
|
|
177981d1cd | ||
|
|
579735b1c3 | ||
|
|
511e334365 | ||
|
|
cc658eb288 | ||
|
|
da3d55ba03 | ||
|
|
e1bd5ef858 | ||
|
|
5c405ea0f5 | ||
|
|
92f96c1d45 | ||
|
|
00e16b49e5 | ||
|
|
463e23e006 | ||
|
|
d7e1064b13 | ||
|
|
e58c8322e9 | ||
|
|
be78831ac0 | ||
|
|
fb2840ede5 | ||
|
|
b88c23897f | ||
|
|
6aa47be78e | ||
|
|
c63c44ac70 | ||
|
|
06f865307f | ||
|
|
f86a3c5ddc | ||
|
|
666857dc4e | ||
|
|
1552822404 | ||
|
|
83ac243c00 | ||
|
|
9a743f80c5 | ||
|
|
170aaabe9b | ||
|
|
ef122c9973 | ||
|
|
8e8c74c6c0 | ||
|
|
a38840ae92 | ||
|
|
2e48fe9cc7 | ||
|
|
3b451e4ab1 | ||
|
|
746180b153 | ||
|
|
62415f758b | ||
|
|
0807353bf0 | ||
|
|
a808cf71a3 | ||
|
|
8716558696 | ||
|
|
eb84eaf151 | ||
|
|
a0699bd917 | ||
|
|
0ee9c5b776 | ||
|
|
51c8da06b0 | ||
|
|
95640cba23 | ||
|
|
241889159a | ||
|
|
edb8813cc7 | ||
|
|
4a1290cb66 | ||
|
|
d52ce2d354 | ||
|
|
b33ef03ac6 | ||
|
|
dceba07e82 | ||
|
|
e12504a61d | ||
|
|
9de22c9afa | ||
|
|
e17d603201 | ||
|
|
47fbd6d160 | ||
|
|
9dc8f13925 | ||
|
|
33a4f4e454 | ||
|
|
a5e4133516 | ||
|
|
4d04aad890 | ||
|
|
847b57423f | ||
|
|
58cabf2ebd | ||
|
|
ae28d2fa2d | ||
|
|
de45998f69 | ||
|
|
0d36050b36 | ||
|
|
f31a18429b | ||
|
|
3ad30308ec | ||
|
|
6c0c397507 | ||
|
|
42da308140 | ||
|
|
680a32a85c | ||
|
|
951dde4e94 | ||
|
|
14fbdd20ac | ||
|
|
ad0fad4218 | ||
|
|
a5fe578e79 | ||
|
|
d5525794f8 | ||
|
|
3f7ef6fe33 | ||
|
|
992e5163d3 | ||
|
|
d03f624357 | ||
|
|
b547321868 | ||
|
|
9a0e5bd003 | ||
|
|
c57ad35e5b | ||
|
|
f7ef198e3a | ||
|
|
fcac2b553c | ||
|
|
e8c2d27b4a | ||
|
|
630cbf8f85 | ||
|
|
0aa9418736 | ||
|
|
abc3013096 | ||
|
|
51e237d5f9 | ||
|
|
6eb9bde786 | ||
|
|
dce89aefb9 | ||
|
|
47e14cff8d | ||
|
|
4d9b68b377 | ||
|
|
a8f4994935 | ||
|
|
8ca60f2cbb | ||
|
|
bb550497d5 | ||
|
|
849e4a3647 | ||
|
|
c177507db3 | ||
|
|
a09a0c47ae | ||
|
|
a26c396335 | ||
|
|
4aa5ca2818 | ||
|
|
27881a83d4 | ||
|
|
6378c2a81f | ||
|
|
45cadcf020 | ||
|
|
7d53abdb0a | ||
|
|
a059ded709 | ||
|
|
4de3b4a635 | ||
|
|
64162d3a24 | ||
|
|
626e2749a6 | ||
|
|
b39d896db7 | ||
|
|
4a9699226a | ||
|
|
11f4ec93ac | ||
|
|
e57797a8ff | ||
|
|
0b7975b195 | ||
|
|
362318a6e0 | ||
|
|
5a93f2a4f1 | ||
|
|
e7bdc83a8f | ||
|
|
60b8487600 | ||
|
|
013f22c89c | ||
|
|
2d1da2ab57 | ||
|
|
9c0581bc0f | ||
|
|
d79984dbda | ||
|
|
c2eaa8f019 | ||
|
|
6c517199bf | ||
|
|
d258c30406 | ||
|
|
7bb69f8641 | ||
|
|
c1051f3f52 | ||
|
|
193b600382 | ||
|
|
16936d95d1 | ||
|
|
64224d3918 | ||
|
|
c0b8af2c42 | ||
|
|
c655612d2d | ||
|
|
3cc9be0d11 | ||
|
|
571bab20c1 | ||
|
|
c663f06669 | ||
|
|
77f0e177e6 | ||
|
|
e7ad540618 | ||
|
|
38b4327f41 | ||
|
|
fa0463b3b2 | ||
|
|
af76794627 | ||
|
|
464cb5566d | ||
|
|
d670847308 | ||
|
|
33a45d0f89 | ||
|
|
da395fed20 | ||
|
|
ad1c29c512 | ||
|
|
720f33eee6 | ||
|
|
64035f766f | ||
|
|
1ace9795f7 | ||
|
|
24c838bc0b | ||
|
|
b64aa9993b | ||
|
|
2691a35102 | ||
|
|
828e724659 | ||
|
|
11d8aea96f | ||
|
|
62adbdf7f2 | ||
|
|
f39df76215 | ||
|
|
4d26307cfc | ||
|
|
be8d1df8b9 | ||
|
|
4592b4c409 | ||
|
|
bb5fa3f1e8 | ||
|
|
8283ae8c4c | ||
|
|
478e9d67df | ||
|
|
ef8f1f108b | ||
|
|
7f9f897945 | ||
|
|
662e5bddd7 | ||
|
|
b949422d46 | ||
|
|
2c7dec7327 | ||
|
|
f4d86f384c | ||
|
|
13bbe9c07d | ||
|
|
2934d062a3 | ||
|
|
37cdea9183 | ||
|
|
a7300da78d | ||
|
|
176fb7c447 | ||
|
|
0e0c5dfe99 | ||
|
|
6cc34fa1f7 | ||
|
|
287172698a | ||
|
|
0ab781c7a7 | ||
|
|
c5b0627180 | ||
|
|
b99c7b8c37 | ||
|
|
a6b562b8e4 | ||
|
|
a46d42f45e | ||
|
|
47b3a53132 | ||
|
|
a470500a43 | ||
|
|
405b32e77a | ||
|
|
2584ff0440 | ||
|
|
2e4022dd73 | ||
|
|
f03a915c75 | ||
|
|
9379d06275 | ||
|
|
eacf7db6f3 | ||
|
|
adc7ca5690 | ||
|
|
c5231f0ce3 | ||
|
|
c2264cabae | ||
|
|
f3d0ba2f51 | ||
|
|
0cb63cdd01 | ||
|
|
c236a80a37 | ||
|
|
4b9e77d2ef | ||
|
|
e1704a2f1b | ||
|
|
0282da6881 | ||
|
|
846e68e1aa | ||
|
|
33cf4f7eca | ||
|
|
132d5ca943 | ||
|
|
b44472b237 | ||
|
|
4cfcf2ccd7 | ||
|
|
a2f99ad00d | ||
|
|
eb3c9658b1 | ||
|
|
06ddcfb0bb | ||
|
|
d6bb8547b3 | ||
|
|
5219621595 | ||
|
|
a14f0c3f55 | ||
|
|
44f706a5e7 | ||
|
|
55636e6978 | ||
|
|
5921948de8 | ||
|
|
bd05bab4bf | ||
|
|
c6c7dd2fce | ||
|
|
171d20ce3e | ||
|
|
c2bb9ebd8e | ||
|
|
d35a352fe6 | ||
|
|
4fd52390ee | ||
|
|
974717ca11 | ||
|
|
d77e6c0d05 | ||
|
|
47fcab1e60 | ||
|
|
a1188ca0ee | ||
|
|
0d2a1bdef1 | ||
|
|
369ae2e63d | ||
|
|
1ce9d93e94 | ||
|
|
e0ea03dc56 | ||
|
|
3cced07c13 | ||
|
|
dca6e869df | ||
|
|
f30f0bf148 | ||
|
|
d0a1783083 | ||
|
|
a4fe3602b2 | ||
|
|
8974e33f69 | ||
|
|
bbfb4c7e63 | ||
|
|
479574e88e | ||
|
|
a96bbcd967 | ||
|
|
1e02f194fd | ||
|
|
7eef5d15ee | ||
|
|
30291a3c25 | ||
|
|
33224370eb | ||
|
|
b9cb931167 | ||
|
|
10d8357876 | ||
|
|
9604ab6621 | ||
|
|
e35a84fcb3 | ||
|
|
e910205c19 | ||
|
|
15ad02c984 | ||
|
|
8e62346f86 | ||
|
|
59344c679d | ||
|
|
a7257a1d1e | ||
|
|
f2de12aa34 | ||
|
|
2d544f18b5 | ||
|
|
0667ee7c4d | ||
|
|
19cee73209 | ||
|
|
4c638e365f | ||
|
|
f452fd7bb0 | ||
|
|
6d1f8c5111 | ||
|
|
ab61a0d5c7 | ||
|
|
af52fce275 | ||
|
|
656140d9e6 | ||
|
|
9508e97914 | ||
|
|
a6f99645c6 | ||
|
|
fd84c2d8f7 | ||
|
|
eeb439eaf9 | ||
|
|
58cbdd71b6 | ||
|
|
81cd97902a | ||
|
|
ccf4a78f5d | ||
|
|
6abff39549 | ||
|
|
94c6131c59 | ||
|
|
05fcc246ae | ||
|
|
9bfb7055e2 | ||
|
|
c5fe42089d | ||
|
|
70cf7698ac | ||
|
|
b07680108b | ||
|
|
d45ec21b3c | ||
|
|
0d252636be | ||
|
|
70da26f649 | ||
|
|
b882da1ad4 | ||
|
|
3ecb47ff2c | ||
|
|
c44e3025f9 | ||
|
|
9ffcab07bf | ||
|
|
583925c085 | ||
|
|
e631f3c78b | ||
|
|
9a6e57eec9 | ||
|
|
d3fea5f15a | ||
|
|
5d3696a9e6 | ||
|
|
b75d2aa3f4 | ||
|
|
eb4079c674 | ||
|
|
72d0c53b33 | ||
|
|
6ae0525f7a | ||
|
|
c4627e7112 | ||
|
|
6d4a980b04 | ||
|
|
545a726252 | ||
|
|
065cd0170e | ||
|
|
a7eeaa3a4b | ||
|
|
e2da663628 | ||
|
|
836134202e | ||
|
|
319a8253ba | ||
|
|
fc81bb15fe | ||
|
|
6209e7004e | ||
|
|
4944488287 | ||
|
|
0dc9c33b01 | ||
|
|
a4a5691a7b | ||
|
|
352267871c | ||
|
|
15ae83f868 | ||
|
|
e6b1ef2049 | ||
|
|
8ed2cf7ef5 | ||
|
|
8cb5cba775 | ||
|
|
c74e0bfd18 | ||
|
|
9fc336c7f7 | ||
|
|
5de7124eee | ||
|
|
2f33826063 | ||
|
|
087e076ec0 | ||
|
|
b39b819725 | ||
|
|
d544bfcd6d | ||
|
|
c7adaa7d14 | ||
|
|
f86fa1e909 | ||
|
|
2285b89aea | ||
|
|
16ca871544 | ||
|
|
722c7910e4 | ||
|
|
ab6aa23cec | ||
|
|
5fd3dfe01b | ||
|
|
8a7f437641 | ||
|
|
63a467af31 | ||
|
|
af365f444f | ||
|
|
9a9b487abd | ||
|
|
102d7f3d0e | ||
|
|
c4974ac782 | ||
|
|
27b7579566 | ||
|
|
01fa21f160 | ||
|
|
54d21dc7c1 | ||
|
|
2f2fd43771 | ||
|
|
2ca4ee2a54 | ||
|
|
b1fb38e73c | ||
|
|
09dc7058c9 | ||
|
|
75f0ab65d1 | ||
|
|
391e5d121a | ||
|
|
6f84887f60 | ||
|
|
3e44060b5b | ||
|
|
84dcd51d37 | ||
|
|
e185e27273 | ||
|
|
e2eb24761f | ||
|
|
d7111cb4a3 | ||
|
|
22bb662d3e | ||
|
|
8c4a7bea5f | ||
|
|
382e16eb7e | ||
|
|
362c1b0d11 | ||
|
|
1db646474e | ||
|
|
fbec311844 | ||
|
|
347462d87e | ||
|
|
99bd7181f9 | ||
|
|
92f09dbe81 | ||
|
|
4b1fe0a1cc | ||
|
|
78f4d66364 | ||
|
|
13356e16a3 | ||
|
|
e0e0b3f387 | ||
|
|
592694036f | ||
|
|
b21a4ac12b | ||
|
|
5e43c7aba5 | ||
|
|
db993899d3 | ||
|
|
e2de7b8ae3 | ||
|
|
95e51f384e | ||
|
|
4ff38c7bf3 | ||
|
|
faf4d9a888 | ||
|
|
18a9510048 | ||
|
|
2012641610 | ||
|
|
864e741dd8 | ||
|
|
22eb7e3847 | ||
|
|
766b83b513 | ||
|
|
c28b78fae5 | ||
|
|
6d4a87227d | ||
|
|
65b8770ce9 | ||
|
|
2ef6fb66ac | ||
|
|
82f72c3ec6 | ||
|
|
efd4d83731 | ||
|
|
8bab260587 | ||
|
|
d5449c992e | ||
|
|
4160b06c6c | ||
|
|
6e9ed48f42 | ||
|
|
5687676014 | ||
|
|
5d91c86cf2 | ||
|
|
9acefe8b3a | ||
|
|
06fac0e570 | ||
|
|
e8b44a39e0 | ||
|
|
a55c8dc1a8 | ||
|
|
7bab78c66d | ||
|
|
5c5cd4c658 | ||
|
|
53a8318f32 | ||
|
|
31b208248b | ||
|
|
9c515c7863 | ||
|
|
ec86b60e70 | ||
|
|
7f1754ecc5 | ||
|
|
e4971ec7b3 | ||
|
|
ec974f5dac | ||
|
|
7b2bfda37f | ||
|
|
2f34370f2f | ||
|
|
94799b1e98 | ||
|
|
d334e0c66c | ||
|
|
3da5816db2 | ||
|
|
c8273e06c6 | ||
|
|
ff50159a3d | ||
|
|
34aafa82f9 | ||
|
|
278a1f103b | ||
|
|
1acbbb6d43 | ||
|
|
e3a20b8bc8 | ||
|
|
f7678b4a9e | ||
|
|
52ed5dbcf9 | ||
|
|
6c5ba7cc01 | ||
|
|
36e66b545e | ||
|
|
0e9966d6a4 | ||
|
|
75fbf7a8f3 | ||
|
|
e700a3cc4d | ||
|
|
eb7f21df04 | ||
|
|
ac9c1adb75 | ||
|
|
d06f7bf1ff | ||
|
|
7f06bb5fa7 | ||
|
|
0ad8eec3eb | ||
|
|
3c841c4685 | ||
|
|
d5b647d5ab | ||
|
|
86f8fa8e6e | ||
|
|
351e4e2460 | ||
|
|
1afc7ed8c5 | ||
|
|
fcadbfc70d | ||
|
|
8c88f769b6 | ||
|
|
de24536187 | ||
|
|
1ac66f372b | ||
|
|
701b4bef51 | ||
|
|
045d86aa42 | ||
|
|
89069f78b1 | ||
|
|
fef8314d3d | ||
|
|
bec7be05f5 | ||
|
|
d42ac49de4 | ||
|
|
1272d0b990 | ||
|
|
cf86e734f2 | ||
|
|
238a496af5 | ||
|
|
a3670d267b | ||
|
|
65f05f0541 | ||
|
|
338c95f120 | ||
|
|
2b9dc4424e | ||
|
|
ef0b25c392 | ||
|
|
6f0e5d13ed | ||
|
|
046a18cd16 | ||
|
|
e1e67d0d41 | ||
|
|
216d08d013 | ||
|
|
bbdc5c6039 | ||
|
|
149e0c8ac2 | ||
|
|
48ce9d2fd8 | ||
|
|
fc9fb536ca | ||
|
|
4c7e561740 | ||
|
|
bf0fa8ee64 | ||
|
|
d3ed9ce2f6 | ||
|
|
f123cb2777 | ||
|
|
dc3bf2ea30 | ||
|
|
f3773660b0 | ||
|
|
18843cf62e | ||
|
|
7be4fd891d | ||
|
|
b66e2e9b95 | ||
|
|
2aad5360d4 | ||
|
|
e8683274ff | ||
|
|
b3de1b77bf | ||
|
|
957522a492 | ||
|
|
ac050fb7ce | ||
|
|
88a92b311c | ||
|
|
acd2164c85 | ||
|
|
890d6549de | ||
|
|
0b119339eb | ||
|
|
4bdd3c036b | ||
|
|
0ea42f60bd | ||
|
|
72fff8d51a | ||
|
|
ff44be9dcd | ||
|
|
23c3620001 | ||
|
|
1721ddc231 | ||
|
|
ce7ffcd8e9 | ||
|
|
c952604308 | ||
|
|
a1b2964869 | ||
|
|
5faa0badef | ||
|
|
4771a7b9e7 | ||
|
|
259b434f20 | ||
|
|
d58c97bd21 | ||
|
|
d05a817f3b | ||
|
|
2b30cec974 | ||
|
|
6ef284bb1a | ||
|
|
ac839c267b | ||
|
|
3ed1e16c78 | ||
|
|
c28c661deb | ||
|
|
6b04848d41 | ||
|
|
c5898ac6b7 | ||
|
|
7c4a3a2af6 | ||
|
|
0d30dce26d | ||
|
|
6c170c2c21 | ||
|
|
4179317f37 | ||
|
|
5bcd2cee1d | ||
|
|
29ecee8cc6 | ||
|
|
f67a2b2535 | ||
|
|
33e0c73df7 | ||
|
|
c28c0eb818 | ||
|
|
8722172049 | ||
|
|
8e36256eac | ||
|
|
951826e6b5 | ||
|
|
57834e9f8c | ||
|
|
915a59e514 | ||
|
|
b985b1d6ea | ||
|
|
ceb03cfb2c | ||
|
|
b8d4bb1f13 | ||
|
|
1b9d4bbf72 | ||
|
|
c6842938c9 | ||
|
|
2be582fb27 | ||
|
|
7ed0474364 | ||
|
|
142633533e | ||
|
|
e6bc13ff04 | ||
|
|
49bbeeefae | ||
|
|
cb5371f86f | ||
|
|
3001f1ae02 | ||
|
|
7e98f67df8 | ||
|
|
a5429d59f9 | ||
|
|
9860976af9 | ||
|
|
b2b6e6900f | ||
|
|
66eaaf7b6e | ||
|
|
3fad2a9c83 | ||
|
|
8405a61b07 | ||
|
|
e3e298cfa2 | ||
|
|
0f02a9b9af | ||
|
|
5b0d587c22 | ||
|
|
e9dc52c2d3 | ||
|
|
a0c5a892d3 | ||
|
|
a8fd315e09 | ||
|
|
e8c4aab643 | ||
|
|
c3bab88fda | ||
|
|
cf1ae884a1 | ||
|
|
05592acf40 | ||
|
|
cb79be921d | ||
|
|
6cee997266 | ||
|
|
6367697d92 | ||
|
|
25fc7814cc | ||
|
|
69e8a35fd1 | ||
|
|
2f821aa30d | ||
|
|
f9f07bee09 | ||
|
|
7e4ce38681 | ||
|
|
4303717951 | ||
|
|
32b234c9f0 | ||
|
|
9ad884aadb | ||
|
|
40b1b07915 | ||
|
|
31469560ec | ||
|
|
5e583770f7 | ||
|
|
130e57ec60 | ||
|
|
4ede64b729 | ||
|
|
4521aed23b | ||
|
|
4c3a00b5cd | ||
|
|
e0eef0e190 | ||
|
|
e519b5079e | ||
|
|
b2df015fe6 | ||
|
|
1ce671528e | ||
|
|
3d693634b5 | ||
|
|
71873e676f | ||
|
|
b653d4848a | ||
|
|
4972bede48 | ||
|
|
f94f365e14 | ||
|
|
db53dbc126 | ||
|
|
a315f2fefb | ||
|
|
be0b7e084e | ||
|
|
e3af483fa6 | ||
|
|
a8033e0193 | ||
|
|
e8ef4fe5d6 | ||
|
|
cea60a2eb9 | ||
|
|
2ceb59a11d | ||
|
|
97e3c419aa | ||
|
|
28d78e288b | ||
|
|
43c049df75 | ||
|
|
0c05318237 | ||
|
|
78e2685d5f | ||
|
|
ef3ef82057 | ||
|
|
d3f81b6e40 | ||
|
|
2e1630c712 | ||
|
|
4a60b7b2e3 | ||
|
|
70f9f08d2c | ||
|
|
6413f5b5d4 | ||
|
|
82b79aac2f | ||
|
|
152193b459 | ||
|
|
d01ce8304e | ||
|
|
8b0507cac8 | ||
|
|
a0b10af1a3 | ||
|
|
a2134d70c6 | ||
|
|
7380e43f28 | ||
|
|
24da5b358f | ||
|
|
8e0f5bf125 | ||
|
|
da995b24eb | ||
|
|
623161e50d | ||
|
|
b17295b36f | ||
|
|
ee84131171 | ||
|
|
a204524897 | ||
|
|
49a101b189 | ||
|
|
53b8715ae3 | ||
|
|
61c086b242 | ||
|
|
5e6207bb90 | ||
|
|
572dd2e9f3 | ||
|
|
ccd73c0a81 | ||
|
|
b3322e36ae | ||
|
|
3cb9825033 | ||
|
|
eea039b025 | ||
|
|
587e2d6dcd | ||
|
|
94831a0d54 | ||
|
|
8b251a202f | ||
|
|
c96fbc7180 | ||
|
|
22467b483b | ||
|
|
68388e5d4f | ||
|
|
2940ad059d | ||
|
|
56a4f1680d | ||
|
|
a50dcc9728 | ||
|
|
08df6224af | ||
|
|
6e42eede54 | ||
|
|
c157c53983 | ||
|
|
da6178bdc6 | ||
|
|
818eaa7307 | ||
|
|
d00f7783db | ||
|
|
bfdc1991a5 | ||
|
|
4600bc344c | ||
|
|
dc14626ae1 | ||
|
|
88a767f39a | ||
|
|
1e1b689775 | ||
|
|
896b9cea2a | ||
|
|
76392d81fa | ||
|
|
4749768734 | ||
|
|
b4c7507b4d | ||
|
|
cade600c91 | ||
|
|
069e55c5ee | ||
|
|
a59e305665 | ||
|
|
58cba835f2 | ||
|
|
6174b5caf0 | ||
|
|
2e33d422a5 | ||
|
|
1660f1647e | ||
|
|
efdebd48b6 | ||
|
|
c0b3194a55 | ||
|
|
2398f378b0 | ||
|
|
37a7344219 | ||
|
|
3375b67b2b | ||
|
|
56b52115d9 | ||
|
|
3028d1395c | ||
|
|
b85b8de232 | ||
|
|
072847943a | ||
|
|
d3c0c18946 | ||
|
|
4190b73f70 | ||
|
|
68fe97bbc2 | ||
|
|
34ed235885 | ||
|
|
c923e7af73 | ||
|
|
c838d446ad | ||
|
|
50323a3977 | ||
|
|
7b5ef323c5 | ||
|
|
199150fda2 | ||
|
|
c1b5a0511f | ||
|
|
742200d14b | ||
|
|
900d58d054 | ||
|
|
6af86bbf22 | ||
|
|
4c1070faab | ||
|
|
f437f8e9ea | ||
|
|
c9c743967f | ||
|
|
88c9a23884 | ||
|
|
1d5700e58a | ||
|
|
96552e07c2 | ||
|
|
c97e659d78 | ||
|
|
291da61fda | ||
|
|
94bdb708fe | ||
|
|
3309a01b5e | ||
|
|
5a03e46d69 | ||
|
|
bf95a34553 | ||
|
|
33e501981a | ||
|
|
4ee9a0f6b9 | ||
|
|
d6e26bb350 | ||
|
|
f6a37e28ba | ||
|
|
a2f66e6a67 | ||
|
|
b92e7b968f | ||
|
|
6c2630afcf | ||
|
|
86506fa5fd | ||
|
|
96098d228a | ||
|
|
d59dde320b | ||
|
|
fb7d3bf35d | ||
|
|
50272a58e2 | ||
|
|
93f60d3f8d | ||
|
|
97bf2469b6 | ||
|
|
2088dfbaf6 | ||
|
|
e889c5bb60 | ||
|
|
44d609816b | ||
|
|
99ea2cbba7 | ||
|
|
0aff5340b5 | ||
|
|
6f44cb1dd2 | ||
|
|
52a29aa84b | ||
|
|
d0c7b06eff | ||
|
|
5f9dd129ea | ||
|
|
34392662a6 | ||
|
|
3c1fe226f0 | ||
|
|
3ac002934d | ||
|
|
4455c22b9a | ||
|
|
714a8075cc | ||
|
|
0a9d34a25a | ||
|
|
bb6b9e1704 | ||
|
|
8a4ed70762 | ||
|
|
1c3b003c7c | ||
|
|
25ab52b8e7 | ||
|
|
cd0ee50dd7 | ||
|
|
2f2f141564 | ||
|
|
4400ce2892 | ||
|
|
cc1b22d45f | ||
|
|
e8122daa87 | ||
|
|
8dfffe8aa2 | ||
|
|
f107e2f31d | ||
|
|
cf813b707c | ||
|
|
2b0c73c7e4 | ||
|
|
3c84cc1702 | ||
|
|
57377e8bf7 | ||
|
|
a16e7b918a | ||
|
|
7e1a4c0363 | ||
|
|
cfbce9d225 | ||
|
|
c1c4f86317 | ||
|
|
dcf4efe628 | ||
|
|
26b347a8bd | ||
|
|
3c85fc4d39 | ||
|
|
a7ca40d8a3 | ||
|
|
8d9df94b6c | ||
|
|
bf84fe029f | ||
|
|
ca96e32ff7 | ||
|
|
ef70ad907f | ||
|
|
f25f77e915 | ||
|
|
a0a06232ce | ||
|
|
300cdc27dd | ||
|
|
7a7281764c | ||
|
|
d27c12e35d | ||
|
|
cbf9016187 | ||
|
|
6ac42c5141 | ||
|
|
6289238d1d | ||
|
|
e3b65186fd | ||
|
|
affc815447 | ||
|
|
af301a2efe | ||
|
|
977a167335 | ||
|
|
08f42761f9 | ||
|
|
a04d62372f | ||
|
|
5a8f2b62e3 | ||
|
|
c5ecc37a9a | ||
|
|
5ff23a2861 | ||
|
|
a56f648cce | ||
|
|
a3a5fbeddf | ||
|
|
3963559810 | ||
|
|
4bee3399f8 | ||
|
|
32687cc66e | ||
|
|
d21a8e63c1 | ||
|
|
72e21a2a6c | ||
|
|
301bc52857 | ||
|
|
f88c7d1e8c | ||
|
|
3a327096c6 | ||
|
|
7a6079b46a | ||
|
|
c1fc77e50f | ||
|
|
cbca27dffe | ||
|
|
5cb40b2c95 | ||
|
|
e0fb7e72bb | ||
|
|
e858fd94fb | ||
|
|
56c05f6232 | ||
|
|
2663cc8e80 | ||
|
|
2356b5c1b6 | ||
|
|
e9f5c9423c | ||
|
|
f34d390bba | ||
|
|
fb7dac75a7 | ||
|
|
f9413b8ae1 | ||
|
|
fef10b8a0f | ||
|
|
82c41a61b6 | ||
|
|
3b74f5dae8 | ||
|
|
316fc58b4c | ||
|
|
8a4dca5fa6 | ||
|
|
4910bae10f | ||
|
|
0e7de2e7a7 | ||
|
|
e1d6abb4c9 | ||
|
|
02d78c3e84 | ||
|
|
727fc3037c | ||
|
|
1aecf32748 | ||
|
|
2f113b9b06 | ||
|
|
d46a97ef97 | ||
|
|
7035d6787c | ||
|
|
ce86d252e5 | ||
|
|
8a0c6cfcfa | ||
|
|
b0e070c743 | ||
|
|
ab291a1fcd | ||
|
|
3bb008ebbb | ||
|
|
e8cf9b2628 | ||
|
|
179202a34a | ||
|
|
55900c65cb | ||
|
|
5435b80841 | ||
|
|
5138f22e00 | ||
|
|
cc3e1a8511 | ||
|
|
c791cf4232 | ||
|
|
f1c4caa37f | ||
|
|
e36c95bb3a | ||
|
|
bc25309763 | ||
|
|
c265b681b1 | ||
|
|
52b9f199a2 | ||
|
|
211528c31b | ||
|
|
2b349e3b28 | ||
|
|
1a7a3f5c8e | ||
|
|
63b0c7e399 | ||
|
|
599d634ee2 | ||
|
|
f43c6d7877 | ||
|
|
9b66b2a0e9 | ||
|
|
64757698f4 | ||
|
|
2427184017 | ||
|
|
75ba60bda6 | ||
|
|
1ef8dacaf6 | ||
|
|
7cabbab580 | ||
|
|
9329c51df0 | ||
|
|
bda4d548b4 | ||
|
|
1cc5df0e14 | ||
|
|
a0b3156347 | ||
|
|
c9332062ce | ||
|
|
b71429bef0 | ||
|
|
a3b5278b42 | ||
|
|
a3c4c1ccb4 | ||
|
|
a6e86fc995 | ||
|
|
0784f54141 | ||
|
|
b609f0431c | ||
|
|
4bebdb5f02 | ||
|
|
81d25aecff | ||
|
|
74f44f55e3 | ||
|
|
8cfedb1673 | ||
|
|
7fc393bed4 | ||
|
|
d3a335bc64 | ||
|
|
636c8ac03d | ||
|
|
b1f82890c9 | ||
|
|
7b371afc06 | ||
|
|
f99eafc56f | ||
|
|
b4f52cb937 | ||
|
|
aa472f702e | ||
|
|
09ccadeec6 | ||
|
|
3e7e65b9f0 | ||
|
|
20024d40c5 | ||
|
|
251d0dda34 | ||
|
|
3c63ef0668 | ||
|
|
cf9629cb0e | ||
|
|
016d718a28 | ||
|
|
98b8d3f17d | ||
|
|
5979d408a9 | ||
|
|
d61f79595a | ||
|
|
69b07b2571 | ||
|
|
537abe273a | ||
|
|
b2c82d9018 | ||
|
|
9f44550cdc | ||
|
|
34c8833d06 | ||
|
|
5d02f6e516 | ||
|
|
c34e2adcbb | ||
|
|
5e1ca4b995 | ||
|
|
582320aded | ||
|
|
b71feed824 | ||
|
|
06e4fd3765 | ||
|
|
b644558c19 | ||
|
|
472d7944f9 | ||
|
|
c64b340622 | ||
|
|
f443f4e7b3 | ||
|
|
ab8572e15b | ||
|
|
1e54bc61e8 | ||
|
|
fe54d0f85b | ||
|
|
c1ed6b10fe | ||
|
|
f5e4c16eed | ||
|
|
2f69f21f39 | ||
|
|
c92de1f8a6 | ||
|
|
0ddb997076 | ||
|
|
c6bc97adc1 | ||
|
|
d0e8efd19e | ||
|
|
ed6d541d66 | ||
|
|
62578269eb | ||
|
|
8fe02d33a9 | ||
|
|
886d599c96 | ||
|
|
4531c21bf1 | ||
|
|
4dffa0d10d | ||
|
|
19bec50399 | ||
|
|
2e62505143 | ||
|
|
16ff57bbff | ||
|
|
bb0cf92b8b | ||
|
|
7452d0d603 | ||
|
|
3c4c9c54c9 | ||
|
|
2f7fd51304 | ||
|
|
8e1f617d34 | ||
|
|
7af12ba9aa | ||
|
|
6020ec1fe2 | ||
|
|
5812f1f27b | ||
|
|
4868d18ea3 | ||
|
|
742fb08e01 | ||
|
|
093a525450 | ||
|
|
b3ec8fe022 | ||
|
|
9688609d08 | ||
|
|
60410cfd2e | ||
|
|
81edc4234f | ||
|
|
c3c21ad91f | ||
|
|
9ed4b0683e | ||
|
|
0ded8a90c0 | ||
|
|
0aee54a82b | ||
|
|
ed0f278a8f | ||
|
|
bf69145bb9 | ||
|
|
1caa388e92 | ||
|
|
11618b65c0 | ||
|
|
a475e09cfc | ||
|
|
fba79ea793 | ||
|
|
440138af84 | ||
|
|
8835034bd2 | ||
|
|
5fbf28dfec | ||
|
|
2a12df4591 | ||
|
|
995ba213e2 | ||
|
|
f73aec1a63 | ||
|
|
08e3cf494b | ||
|
|
36c43cb839 | ||
|
|
c9e0d53ed2 | ||
|
|
c38d75481e | ||
|
|
612ae8b8f7 | ||
|
|
df68d1a86e | ||
|
|
a500ed2c3c | ||
|
|
6588d9be22 | ||
|
|
be3944072c | ||
|
|
d27f5a7d41 | ||
|
|
e48f634f34 | ||
|
|
23403546d2 | ||
|
|
294ef8d92c | ||
|
|
be87cc9fa6 | ||
|
|
baca5d62ae | ||
|
|
b19f74e8cf | ||
|
|
5130a57f8f | ||
|
|
dc6376788b | ||
|
|
ffb6ecaf7e | ||
|
|
34a3c440d0 | ||
|
|
386257a06e | ||
|
|
0bdb5207b5 | ||
|
|
5615dd9e7d | ||
|
|
439a07445e | ||
|
|
fedabf5f7f | ||
|
|
fdc3eb3b4e | ||
|
|
b0e079e6bf | ||
|
|
06cc363a46 | ||
|
|
47afcdcc6b | ||
|
|
c17177bdef | ||
|
|
8972e8f598 | ||
|
|
5b94016585 | ||
|
|
75b09dd69a | ||
|
|
89efbdf02d | ||
|
|
b8ff299399 | ||
|
|
b4510fc03b | ||
|
|
769483640c | ||
|
|
aaccd6f7f3 | ||
|
|
7027320a8f | ||
|
|
b759ef6b58 | ||
|
|
a18f3b8158 | ||
|
|
144e1ef018 | ||
|
|
659a99032e | ||
|
|
c5de2d686d | ||
|
|
13832d7726 | ||
|
|
b7cce5c050 | ||
|
|
7a41bbca67 | ||
|
|
9e98b78260 | ||
|
|
604166f549 | ||
|
|
96b301c04e | ||
|
|
190bb27d78 | ||
|
|
7eb66550c9 | ||
|
|
8f99209ab2 | ||
|
|
701dd9c700 | ||
|
|
b821ffdd33 | ||
|
|
102a4b92a0 | ||
|
|
283a4691aa | ||
|
|
8dc696883e | ||
|
|
a6f50fd6f3 | ||
|
|
6fae5d6114 | ||
|
|
d2179d3e84 | ||
|
|
9ec35d899c | ||
|
|
c811643d1e | ||
|
|
a259704570 | ||
|
|
268822dbd8 | ||
|
|
1237aa574c | ||
|
|
b3734ba310 | ||
|
|
c9b73e412e | ||
|
|
107f1f97d9 | ||
|
|
420729da60 | ||
|
|
452ab26aa7 | ||
|
|
92a5d0037f | ||
|
|
0b7f3fe37a | ||
|
|
cf9f382873 | ||
|
|
8f33dba9ca | ||
|
|
6c87dc8210 | ||
|
|
6c071d4701 | ||
|
|
03ba8836f2 | ||
|
|
4bb94e050b | ||
|
|
51817820f2 | ||
|
|
76a36dd385 | ||
|
|
c39eb3fe55 | ||
|
|
7dcc1fca29 | ||
|
|
887b6e183b | ||
|
|
60bb7cc393 | ||
|
|
43d0623086 | ||
|
|
e6c0d00637 | ||
|
|
b1cdce6289 | ||
|
|
d3c5058d89 | ||
|
|
89650f808a | ||
|
|
0a92262fa0 | ||
|
|
4e2a354716 | ||
|
|
74895df5a7 | ||
|
|
d114847f25 | ||
|
|
4dfd85ff05 | ||
|
|
0bd7a0631a | ||
|
|
bdf6efeccd | ||
|
|
331cdef7e3 | ||
|
|
d4e3d98d0a | ||
|
|
2ca5250f78 | ||
|
|
3f0e1303e0 | ||
|
|
c80ad089fd | ||
|
|
01023f5b4f | ||
|
|
70e29d9717 | ||
|
|
c60bd97cb9 | ||
|
|
d00f0d8c57 | ||
|
|
bf93724511 | ||
|
|
057d912e78 | ||
|
|
e306e23963 | ||
|
|
0232f6058f | ||
|
|
4378d1db46 | ||
|
|
179a75a68d | ||
|
|
17f9d7429c | ||
|
|
9be012dda0 | ||
|
|
c1f35e46df | ||
|
|
cd2b5e8e3b | ||
|
|
dc36ca6d84 | ||
|
|
e96112ab99 | ||
|
|
bc56861744 | ||
|
|
4cde788d33 | ||
|
|
9838892cf3 | ||
|
|
9c5d8ad44c | ||
|
|
a2e74a2a4b | ||
|
|
52c7f8a859 | ||
|
|
4f7ff5d9c7 | ||
|
|
cbcde34540 | ||
|
|
71a06044e6 | ||
|
|
5002c54ffb | ||
|
|
17e3e75331 | ||
|
|
af84359bdb | ||
|
|
74739261d6 | ||
|
|
1622e8c198 | ||
|
|
e06ba1df58 | ||
|
|
7dce8c8b61 | ||
|
|
f61f9f3796 | ||
|
|
6516a89485 | ||
|
|
9b27e8d993 | ||
|
|
f7719a4a9c | ||
|
|
81fb396780 | ||
|
|
8d675198d8 | ||
|
|
969384c258 | ||
|
|
f2650de369 | ||
|
|
acaee79994 | ||
|
|
527a5b1182 | ||
|
|
72b2c9f54f | ||
|
|
8ef4869b26 | ||
|
|
dba759e1c6 | ||
|
|
cb661896a2 | ||
|
|
e08b6cf3ef | ||
|
|
e2fa512e86 | ||
|
|
d1ee2daf14 | ||
|
|
359f81dd0b | ||
|
|
5e5271247a | ||
|
|
71da9068e7 | ||
|
|
b24b295d88 | ||
|
|
1663a16ead | ||
|
|
af91eb508a | ||
|
|
1c0fe3cbcc | ||
|
|
ed7fe883b9 | ||
|
|
ae54c17b6a | ||
|
|
574bbffe0b | ||
|
|
46c28d5cef | ||
|
|
ad338ee789 | ||
|
|
e3cfaa246d | ||
|
|
fed4fe78bb | ||
|
|
bf33829da2 | ||
|
|
d57c183028 | ||
|
|
c2ed98deb3 | ||
|
|
abd6b70c72 | ||
|
|
882d535ba8 | ||
|
|
0de45ccdb7 | ||
|
|
ab5ecbee7a | ||
|
|
e106d7a4f4 | ||
|
|
d75759e829 | ||
|
|
db9d7a907d | ||
|
|
a1b9c50f36 | ||
|
|
c4b59aa593 | ||
|
|
4a18bdeefe | ||
|
|
1caef0b434 | ||
|
|
ae56cba9c8 | ||
|
|
3352b5a4d3 | ||
|
|
24762434ff | ||
|
|
e9c0ca6be2 | ||
|
|
9ef63c0b9b | ||
|
|
06d5c0973a | ||
|
|
8d82856233 | ||
|
|
9ddd4ca33a | ||
|
|
fe726f5bca | ||
|
|
0a11bad714 | ||
|
|
a7dc080b95 | ||
|
|
74af578beb | ||
|
|
6efa7d5d15 | ||
|
|
a6774100d4 | ||
|
|
de22b13273 | ||
|
|
6c41adef63 | ||
|
|
1c3beb0a59 | ||
|
|
e4e9e4c963 | ||
|
|
44d8047249 | ||
|
|
5423f1be29 | ||
|
|
dfd2fab4f3 | ||
|
|
96fc301764 | ||
|
|
5bdb5de855 | ||
|
|
a64dbdcc04 | ||
|
|
2f0ff258b1 | ||
|
|
1cd9328a58 | ||
|
|
ec527824b4 | ||
|
|
380587f120 | ||
|
|
ba8f97f418 | ||
|
|
03131a3d35 | ||
|
|
df25684cb7 | ||
|
|
8e313cffaa | ||
|
|
6948905716 | ||
|
|
ba087ce64a | ||
|
|
3b03865a62 | ||
|
|
33fa274bbf | ||
|
|
23f700dc23 | ||
|
|
d876649616 | ||
|
|
e4c14ac76e | ||
|
|
b438049c39 | ||
|
|
b017579577 | ||
|
|
c8e4b357a3 | ||
|
|
8774e47dc3 | ||
|
|
e422ab1507 | ||
|
|
cdd8e19716 | ||
|
|
91d86a1de9 | ||
|
|
6a10f900b4 | ||
|
|
9b9a89c79a | ||
|
|
123e6426d1 | ||
|
|
427ec6b2e4 | ||
|
|
03dcb582e6 | ||
|
|
1043a06124 | ||
|
|
d20e413a68 | ||
|
|
9bf4c5e8df | ||
|
|
633303d4b8 | ||
|
|
a4a1098766 | ||
|
|
0bd459dcac | ||
|
|
3b4514b686 | ||
|
|
2e05606edc | ||
|
|
c8c1b87a01 | ||
|
|
34ea029df8 | ||
|
|
3a4433d5a2 | ||
|
|
2dc93cadda | ||
|
|
de6c45ad24 | ||
|
|
fadade8592 | ||
|
|
d91044f3a2 | ||
|
|
a3ea37b76e | ||
|
|
ec63cadadb | ||
|
|
84d8305730 | ||
|
|
73777980f1 | ||
|
|
75788b1148 | ||
|
|
dd9b2ddc89 | ||
|
|
b7ddd09fab | ||
|
|
48ffcbd2c4 | ||
|
|
68d3ac567c | ||
|
|
50ab289da6 | ||
|
|
4e079fdd08 | ||
|
|
91fc9e3118 | ||
|
|
a2f0401c4c | ||
|
|
1b85828548 | ||
|
|
4c46e5e1a3 | ||
|
|
4da9e7ee29 | ||
|
|
72e615aa7a | ||
|
|
cd02abc481 | ||
|
|
399ab328d8 | ||
|
|
809ec2ce01 | ||
|
|
11d2cf0d60 | ||
|
|
dbb2624403 | ||
|
|
4d4fa77459 | ||
|
|
3145794084 | ||
|
|
d9b69bd1a0 | ||
|
|
7cd635fa84 | ||
|
|
ce40e201f0 | ||
|
|
404f3ef465 | ||
|
|
e1be594fdd | ||
|
|
9569c9a9e7 | ||
|
|
f78c480208 | ||
|
|
8794b40bc6 | ||
|
|
86cc85295a | ||
|
|
166a53946c | ||
|
|
91530f5716 | ||
|
|
9b8de65525 | ||
|
|
650b1dee54 | ||
|
|
21c9f44168 | ||
|
|
7f0d2c2bf0 | ||
|
|
6b6dc9dd48 | ||
|
|
3a9ec4192d | ||
|
|
4f7dbbd2c3 | ||
|
|
8c37db1a23 | ||
|
|
c6b7ad8878 | ||
|
|
4a384cae4a | ||
|
|
84461c20cb | ||
|
|
3cddda56fc | ||
|
|
37f3069a67 | ||
|
|
2b2fbe918e | ||
|
|
cf42ddc449 | ||
|
|
eefa656232 | ||
|
|
249ad44cc0 | ||
|
|
54804e344d | ||
|
|
1c334de6fd | ||
|
|
f253103a31 | ||
|
|
1120db57a6 | ||
|
|
afa661cff4 | ||
|
|
347f30bd86 | ||
|
|
127773f3f5 | ||
|
|
8d0490bd70 | ||
|
|
293dfb35d5 | ||
|
|
81be404487 | ||
|
|
6177b6e126 | ||
|
|
79cc657917 | ||
|
|
7928122fce | ||
|
|
9c88ea9126 | ||
|
|
2b766ef9f9 | ||
|
|
bd3d9ac9d5 | ||
|
|
aa0db8379c | ||
|
|
eadd41a9ec | ||
|
|
fab2eb9833 | ||
|
|
6bd791f2f4 | ||
|
|
ec5f80dce1 | ||
|
|
65cdc856ae | ||
|
|
472f61485e | ||
|
|
b4de659438 | ||
|
|
a37a8818c8 | ||
|
|
bdf01aa174 | ||
|
|
a941c69f09 | ||
|
|
72aaa15e6a | ||
|
|
3a06de71a8 | ||
|
|
5e2b39a5c1 | ||
|
|
63c942233e | ||
|
|
2612edc133 | ||
|
|
e2ce9f42b5 | ||
|
|
1c6f7e4b7b | ||
|
|
e2c41903ad | ||
|
|
bd48544e25 | ||
|
|
c0e3daacaf | ||
|
|
f2ad3a6a0b | ||
|
|
caf921a01f | ||
|
|
b790bafc02 | ||
|
|
ad3cd54cce | ||
|
|
1a6a725f88 | ||
|
|
1ad20d94ff | ||
|
|
995c6f0fb1 | ||
|
|
c3e7b83178 | ||
|
|
2e93a588e0 | ||
|
|
9aeca3f97e | ||
|
|
2193fff4bb | ||
|
|
aec2c65c63 | ||
|
|
a6509cc4d5 | ||
|
|
a02b279750 | ||
|
|
ece841f5ce | ||
|
|
2a6e4dc8a6 | ||
|
|
c163011cc0 | ||
|
|
b350945a16 | ||
|
|
1ef368a69d | ||
|
|
8dc587b01a | ||
|
|
550c4293ed | ||
|
|
3df094713f | ||
|
|
01e7f27aa6 | ||
|
|
8d62a99637 | ||
|
|
ab9995e76e | ||
|
|
bef39b1259 | ||
|
|
0d894e6ff7 | ||
|
|
be9510539e | ||
|
|
3bce2ef8d6 | ||
|
|
aa9a943ddf | ||
|
|
ebdb66c7bf | ||
|
|
9f3e8c2dde | ||
|
|
96c56ab08a | ||
|
|
04dbf03ace | ||
|
|
05a753fe63 | ||
|
|
815edb7003 | ||
|
|
5157f56875 | ||
|
|
3f5abca215 | ||
|
|
833df0b8b3 | ||
|
|
6742860ea5 | ||
|
|
797e6d45c0 | ||
|
|
320de0d921 | ||
|
|
5eed505d74 | ||
|
|
91ee27f22b | ||
|
|
5f7c89f85d | ||
|
|
c6712dfccd | ||
|
|
baf4ba175b | ||
|
|
b29ea17ea9 | ||
|
|
ab57c26cf9 | ||
|
|
98e5e8835e | ||
|
|
f5158ece1a | ||
|
|
d65b4a9a93 | ||
|
|
8404947bc0 | ||
|
|
2e84f34cf3 | ||
|
|
726805f064 | ||
|
|
b4a4138559 | ||
|
|
f1d2b3a39a | ||
|
|
1f9d006858 | ||
|
|
cc266d7d80 | ||
|
|
fff72afe2e | ||
|
|
c1abd13b5c | ||
|
|
75802c14b2 | ||
|
|
cddc1e86e7 | ||
|
|
24ea42ce61 | ||
|
|
6102e612fa | ||
|
|
52bde71166 | ||
|
|
15a79cfe9c | ||
|
|
15e71535f3 | ||
|
|
9f988bfe29 | ||
|
|
e8d1baa4b5 | ||
|
|
8bbe4ff138 | ||
|
|
0b9220c1fc | ||
|
|
0d65753fdb | ||
|
|
4f1374a6e7 | ||
|
|
5a0521e92c | ||
|
|
fea86c29d6 | ||
|
|
9c4614f7e6 | ||
|
|
c24a78ae94 | ||
|
|
621816fb56 | ||
|
|
cfae54d361 | ||
|
|
7857b0a689 | ||
|
|
10965920fb | ||
|
|
d2e7ecabd8 | ||
|
|
5772589dc3 | ||
|
|
6df08b411b | ||
|
|
c355ac6593 | ||
|
|
e9b42bbc2a | ||
|
|
1283aa3bd8 | ||
|
|
ff6cba7205 | ||
|
|
d0107f7921 | ||
|
|
644c49f1e0 | ||
|
|
a303d508cf | ||
|
|
44d39112ff | ||
|
|
28020d0c54 | ||
|
|
0ef95947cc | ||
|
|
4ac70a99ae | ||
|
|
bcf14cf677 | ||
|
|
1dae782cd4 | ||
|
|
90cfb6ff28 | ||
|
|
26110da7ca | ||
|
|
30644c9a06 | ||
|
|
033bf1198f | ||
|
|
cdc7d92e57 | ||
|
|
af0e3b8f17 | ||
|
|
04f1d079aa | ||
|
|
9b6c629397 | ||
|
|
5aa467bef2 | ||
|
|
af7ad27f89 | ||
|
|
d6d57bfbb8 | ||
|
|
4f4cfcf3c3 | ||
|
|
fa9f522b7f | ||
|
|
838f9f3008 | ||
|
|
96347df9df | ||
|
|
9334783da3 | ||
|
|
964b2a331d | ||
|
|
95ccd92616 | ||
|
|
197d3a3d89 | ||
|
|
a7ddd747ca | ||
|
|
d61b4e5a13 | ||
|
|
68e646f8aa | ||
|
|
21bfb2d477 | ||
|
|
a9dae71188 | ||
|
|
dd84cc5fd4 | ||
|
|
51631f4c2e | ||
|
|
535a8c8243 | ||
|
|
7abfbd23d0 | ||
|
|
633c00cf80 | ||
|
|
0c12fa31c5 | ||
|
|
5643ef05bc | ||
|
|
f38f42f17d | ||
|
|
472d8592d6 | ||
|
|
4fb230daf1 | ||
|
|
e6bde22f9c | ||
|
|
cc5b9b772a | ||
|
|
ded1474bbb | ||
|
|
2b1fb2b739 | ||
|
|
18e0bfef1d | ||
|
|
3be760dc38 | ||
|
|
29dd0b1e41 | ||
|
|
e1fdfbb062 | ||
|
|
89c07b5e43 | ||
|
|
9b5350eab1 | ||
|
|
5382cd696a | ||
|
|
69fc9ce10e | ||
|
|
13ac6f38dc | ||
|
|
2ec0bdfd99 | ||
|
|
c03e1e6c6c | ||
|
|
2a682abeef | ||
|
|
9f38b54a2d | ||
|
|
2933f51949 | ||
|
|
a75300b8c7 | ||
|
|
01f4bb86c3 | ||
|
|
79c3ada49b | ||
|
|
ac276d06fa | ||
|
|
c7eabe61bb | ||
|
|
8f28bcf704 | ||
|
|
be3b289a10 | ||
|
|
19a0c1f3cb | ||
|
|
dc94fcc6e8 | ||
|
|
183237c858 | ||
|
|
599a44f90f | ||
|
|
08e9c7aa2f | ||
|
|
a893d04e81 | ||
|
|
5996bd57ea | ||
|
|
909b297ae3 | ||
|
|
abdc3b2211 | ||
|
|
e66d2085b7 | ||
|
|
4a5e48e88f | ||
|
|
3a586a0c19 | ||
|
|
144dec3fd3 | ||
|
|
448d116a89 | ||
|
|
8493e5d09f | ||
|
|
83e7365fd8 | ||
|
|
b6040e6061 | ||
|
|
858b9a5119 | ||
|
|
00fbcd14f7 | ||
|
|
062f18d353 | ||
|
|
58760bce54 | ||
|
|
ca4f026074 | ||
|
|
f285ac2281 | ||
|
|
0f3db4dbb9 | ||
|
|
18b2d451cd | ||
|
|
b6dd1af7d2 | ||
|
|
303c8ee7cd | ||
|
|
98d6b15fc0 | ||
|
|
77f407dd5f | ||
|
|
a12a3ef08b | ||
|
|
6480fcaf7c | ||
|
|
f5cb439fe6 | ||
|
|
15c9e85690 | ||
|
|
8f8a85303b | ||
|
|
114cc2db21 | ||
|
|
bec97b6c76 | ||
|
|
114b54cbdb | ||
|
|
0f16463794 | ||
|
|
8ff5fde88e | ||
|
|
3286c5ec19 | ||
|
|
ee7cdc66b3 | ||
|
|
9699da4968 | ||
|
|
6bb0b48b10 | ||
|
|
70da09eae2 | ||
|
|
101072ab9f | ||
|
|
47f7672c03 | ||
|
|
dd54ccf677 | ||
|
|
66ec916b3d | ||
|
|
b4062ef699 | ||
|
|
2d3816341e | ||
|
|
d1054cd596 | ||
|
|
81f8c2f83c | ||
|
|
3144d3ae63 | ||
|
|
9642f5a3f6 | ||
|
|
c4853ee6bb | ||
|
|
1cc40bc9ce | ||
|
|
38a615f407 | ||
|
|
4f2468e14f | ||
|
|
8f7b5bd00e | ||
|
|
4821a8be94 | ||
|
|
523d18b873 | ||
|
|
c52be7dfcb | ||
|
|
c2bfcf1c54 | ||
|
|
bb5f404e35 | ||
|
|
106dbbc341 | ||
|
|
4b6540c71a | ||
|
|
816b1f5e85 | ||
|
|
9f61db5dbe | ||
|
|
e823bef970 | ||
|
|
f9ccc6a289 | ||
|
|
b32a666541 | ||
|
|
b636825de3 | ||
|
|
ddd98ad75d | ||
|
|
d355927024 | ||
|
|
75c0053bb1 | ||
|
|
55a9284665 | ||
|
|
113cdae2d4 | ||
|
|
c6295ade33 | ||
|
|
e1e453075f | ||
|
|
9ca08b8f2b | ||
|
|
f47d3f422d | ||
|
|
e6bd8021d9 | ||
|
|
307252e9ae | ||
|
|
bb2ca25110 | ||
|
|
9e4fb1009f | ||
|
|
8ad5f9bf53 | ||
|
|
02a2fe4871 | ||
|
|
40741c5b0b | ||
|
|
0dd1c6ca6b | ||
|
|
5563adbb89 | ||
|
|
524e17df10 | ||
|
|
73e848e96f | ||
|
|
5f0806967c | ||
|
|
173bb14140 | ||
|
|
918f310674 | ||
|
|
a75fdbd8ad | ||
|
|
9d3f189b0e | ||
|
|
7e79c51222 | ||
|
|
a180d831a1 | ||
|
|
e81adc2752 | ||
|
|
500422d594 | ||
|
|
0311c03735 | ||
|
|
df81141d6f | ||
|
|
cce6a44277 | ||
|
|
7479a4737b | ||
|
|
06ef4cc654 | ||
|
|
c7c3130507 | ||
|
|
010a045692 | ||
|
|
51666609f1 | ||
|
|
10967bce57 | ||
|
|
763aa6e378 | ||
|
|
d6c0a688e6 | ||
|
|
9f75554f2a | ||
|
|
2b20c8a0f5 | ||
|
|
1b4590b42b | ||
|
|
09e89bbcd3 | ||
|
|
7c4b1f910c | ||
|
|
3ceabe91f8 | ||
|
|
a39ffb2fb8 | ||
|
|
41f989135d | ||
|
|
f6cffc7e48 | ||
|
|
1da84b5f7c | ||
|
|
ebfe76cdb6 | ||
|
|
c301814d68 | ||
|
|
09478571df | ||
|
|
a901499ede | ||
|
|
de65026db0 | ||
|
|
071b51d588 | ||
|
|
80390d8a03 | ||
|
|
9590082848 | ||
|
|
9cfb617d5b | ||
|
|
b66e2e0962 | ||
|
|
32721bbc83 | ||
|
|
19fb1c240c | ||
|
|
630ff0e00b | ||
|
|
964c974a02 | ||
|
|
c9e4f2cfb4 | ||
|
|
a3a554aeed | ||
|
|
6c3cc2caf5 | ||
|
|
5999acd24a | ||
|
|
59f56b24d9 | ||
|
|
abd0ec379c | ||
|
|
cfb98a5617 | ||
|
|
fafcffed25 | ||
|
|
3f1209ce19 | ||
|
|
b217961254 | ||
|
|
cd06b39a42 | ||
|
|
84e1f85be2 | ||
|
|
f060f099d4 | ||
|
|
e093af4c05 | ||
|
|
eface5ef45 | ||
|
|
5b72f478a7 | ||
|
|
5f5a0465cb | ||
|
|
f509e479a1 | ||
|
|
ad00c2cf51 | ||
|
|
a20f80623e | ||
|
|
f26dca6d8e | ||
|
|
9ea089a5d9 | ||
|
|
f07d1c9488 | ||
|
|
0d0c79a5cb | ||
|
|
9bb5aa583f | ||
|
|
f26ed591f3 | ||
|
|
0b4576a028 | ||
|
|
d7bb220ba3 | ||
|
|
f907c710b2 | ||
|
|
c6bcb319f8 | ||
|
|
443600194c | ||
|
|
7b6f14c25a | ||
|
|
887d919323 | ||
|
|
74d32f0cca | ||
|
|
3f479be7e7 | ||
|
|
95d02a23d0 | ||
|
|
8b59b9852f | ||
|
|
53bda94f77 | ||
|
|
52580cfd0d | ||
|
|
cf3d5b44e6 | ||
|
|
491dc2e5ca | ||
|
|
b89cdef120 | ||
|
|
348fe339b9 | ||
|
|
e79d7ea981 | ||
|
|
e7841ba2ed | ||
|
|
37687e9323 | ||
|
|
b749314944 | ||
|
|
3eb0fb5aa6 | ||
|
|
44a4cf3b27 | ||
|
|
9a8762ba6e | ||
|
|
2e1bd5ef4e | ||
|
|
a9dc101701 | ||
|
|
e2835de137 | ||
|
|
535e7a6a28 | ||
|
|
fe96de2e2d | ||
|
|
9fd881443f | ||
|
|
2ff3f7ae13 | ||
|
|
2b80f6ed41 | ||
|
|
3ab084a421 | ||
|
|
495174ff7c | ||
|
|
b049fa2c84 | ||
|
|
052f0aa7d4 | ||
|
|
60393999b8 | ||
|
|
b3a3351e8e | ||
|
|
86b5c08b9b | ||
|
|
dab90f7b91 | ||
|
|
71d31256a6 | ||
|
|
3b6d5c3aaa | ||
|
|
7ce42941ea | ||
|
|
3f8171475c | ||
|
|
b135b589e0 | ||
|
|
05ca3d77f7 | ||
|
|
6deee7e3e9 | ||
|
|
9dc404077a | ||
|
|
30e6af6069 | ||
|
|
9788496a85 | ||
|
|
6d3a412d47 | ||
|
|
700b236f4d | ||
|
|
bc22ec382f | ||
|
|
135e5d47a7 | ||
|
|
0f8001ea44 | ||
|
|
5b6e23c323 | ||
|
|
29b30ec946 | ||
|
|
76be5e4e99 | ||
|
|
8b9479071c | ||
|
|
3d9b03c52b | ||
|
|
a03d9655a8 | ||
|
|
1e2fd9c92f | ||
|
|
7e8530b21f | ||
|
|
98358597a9 | ||
|
|
8064facbb8 | ||
|
|
f981dcfde4 | ||
|
|
6eb62fa2ce | ||
|
|
78295ce92f | ||
|
|
358fb473cd | ||
|
|
a45486f2d0 | ||
|
|
8b971ffab6 | ||
|
|
dc84aacc65 | ||
|
|
bbf8922ef7 | ||
|
|
b559cdd73f | ||
|
|
ec51cdb229 | ||
|
|
a3f70124dc | ||
|
|
bec8e3a644 | ||
|
|
c228a06e49 | ||
|
|
17d0951e66 | ||
|
|
43dc31193a | ||
|
|
83bbd9e82e | ||
|
|
39fa7ae8b7 | ||
|
|
3161a8fd9d | ||
|
|
ade52ffb73 | ||
|
|
89c73647f1 | ||
|
|
0c73609e6f | ||
|
|
19a93428b3 | ||
|
|
32a9cf7b8d | ||
|
|
c86b217e1d | ||
|
|
fd57f8f2c1 | ||
|
|
0d1f1a19b7 | ||
|
|
d25ee55a32 | ||
|
|
3afa96bed4 | ||
|
|
dfdf8093eb | ||
|
|
3906efcd52 | ||
|
|
2021a1ac7d | ||
|
|
426a7bb87f | ||
|
|
fc26b5e151 | ||
|
|
0c85dc1193 | ||
|
|
fe10e06c37 | ||
|
|
419f7797f2 | ||
|
|
54571a5fca | ||
|
|
4b79691d5e | ||
|
|
615ce32798 | ||
|
|
31c25ebb50 | ||
|
|
f4acb888a6 | ||
|
|
8143d57b4e | ||
|
|
a40ad092e9 | ||
|
|
b565c4d3e7 | ||
|
|
e9a835c1c0 | ||
|
|
cf38f03459 | ||
|
|
4c5189df2b | ||
|
|
a09f684f05 | ||
|
|
8cc5af121c | ||
|
|
c42c3b2101 | ||
|
|
fda5a47069 | ||
|
|
57a837bde6 | ||
|
|
ded2c034ba | ||
|
|
eac07df96c | ||
|
|
8c1376df07 | ||
|
|
45d68d9b39 | ||
|
|
c371b853af | ||
|
|
bc32a63c69 | ||
|
|
4b26546589 | ||
|
|
bc56788fe6 | ||
|
|
b4d41c1b7a | ||
|
|
36a033b87a | ||
|
|
9544ba1029 | ||
|
|
1a7bb5a400 | ||
|
|
48c35bcfbc | ||
|
|
ec2d4bd3ee | ||
|
|
ce9fa6ebbf | ||
|
|
9a9007abae | ||
|
|
88ec6f6b16 | ||
|
|
795b6e3480 | ||
|
|
9bdb0a12e4 | ||
|
|
2cdd61294f | ||
|
|
627cdc07d0 | ||
|
|
a47a62172a | ||
|
|
f72e5a8f05 | ||
|
|
fbe91a67a4 | ||
|
|
6dcecb38a4 | ||
|
|
dcfb427b09 | ||
|
|
ad03d180c9 | ||
|
|
3232a4d60d | ||
|
|
3aff590855 | ||
|
|
c8babbad27 | ||
|
|
c6dad28ddc | ||
|
|
fea81419cd | ||
|
|
83be517e77 | ||
|
|
79a569422c | ||
|
|
1e0b12e37e | ||
|
|
dc15032112 | ||
|
|
2821227acf | ||
|
|
2191ef7eee | ||
|
|
4c2cf6da75 | ||
|
|
0f3d6d871e | ||
|
|
bd007d4617 | ||
|
|
ead4f7af9e | ||
|
|
4808b5b3ba | ||
|
|
f3da6796b9 | ||
|
|
cece12e87e | ||
|
|
68d1727cac | ||
|
|
8a2e13b20a | ||
|
|
ee311b8e5c | ||
|
|
f0de6c4e92 | ||
|
|
1c4c8764ed | ||
|
|
e6161a6f58 | ||
|
|
8c0fe59c90 | ||
|
|
17690b3add | ||
|
|
f9987c8bed | ||
|
|
8109cbad97 | ||
|
|
c5bb32253b | ||
|
|
5b1e673cec | ||
|
|
2cd06826c0 | ||
|
|
4f0c5a8d49 | ||
|
|
3011251da7 | ||
|
|
76b4cb5c00 | ||
|
|
f83af3c25d | ||
|
|
e3931718fb | ||
|
|
4cde86643e | ||
|
|
9ee3207280 | ||
|
|
e696a07190 | ||
|
|
e0db987441 | ||
|
|
1890b0019d | ||
|
|
a750e4a1a3 | ||
|
|
1c789dda08 | ||
|
|
4086d463a9 | ||
|
|
b8368de6d5 | ||
|
|
7dc90094d2 | ||
|
|
ba85ca32c4 | ||
|
|
70946b85e5 | ||
|
|
1570c328c6 | ||
|
|
9288fccf07 | ||
|
|
5e1d7c3076 | ||
|
|
89d5186c0d | ||
|
|
aaad60d07e | ||
|
|
5f16469807 | ||
|
|
752bc27e2b | ||
|
|
cc6a14104d | ||
|
|
eb13c2b6af | ||
|
|
63c133e4a3 | ||
|
|
b8d59d699b | ||
|
|
5586613eec | ||
|
|
ad8e6dc63b | ||
|
|
f72e0ca979 | ||
|
|
03cfe67500 | ||
|
|
7a252c4755 | ||
|
|
2089901739 | ||
|
|
635e506c16 | ||
|
|
75d8c7e3cc | ||
|
|
080d6cdd11 | ||
|
|
433d2115bc | ||
|
|
34e31232df | ||
|
|
7fca1d28af | ||
|
|
9c3d765403 | ||
|
|
bb652ceb91 | ||
|
|
62696f5819 | ||
|
|
41170ce341 | ||
|
|
e2092a4ddd | ||
|
|
fd1441d122 | ||
|
|
e1422c6443 | ||
|
|
1f07fd4150 | ||
|
|
9b92aa08ae | ||
|
|
8bf8cbbd61 | ||
|
|
f507844102 | ||
|
|
fffbb60ed9 | ||
|
|
9aec4abc4d | ||
|
|
a53b3f199f | ||
|
|
d6d696b66a | ||
|
|
ca6bf966dd | ||
|
|
5a9f8860ca | ||
|
|
5423bc66a9 | ||
|
|
187d2ad226 | ||
|
|
7cf0d5d15e | ||
|
|
1f2ee8cb62 | ||
|
|
35c3d0b3fc | ||
|
|
0279294972 | ||
|
|
7eddee6f7a | ||
|
|
f2c48cfac5 | ||
|
|
6ae0a00211 | ||
|
|
bfcf38c8bc | ||
|
|
9e328da641 | ||
|
|
e336d04c79 | ||
|
|
a71bc62c29 | ||
|
|
4b0b7093e5 | ||
|
|
8387de64d3 | ||
|
|
77de6e5d6a | ||
|
|
8c867a001a | ||
|
|
d01a71f7de | ||
|
|
04d1d4c00e | ||
|
|
d7e58ee1af | ||
|
|
ffb165ce26 | ||
|
|
65cb09eb2e | ||
|
|
78552ebd7a | ||
|
|
0c7bd12372 | ||
|
|
3d11d7685b | ||
|
|
592ae6b4d2 | ||
|
|
4fa79ee02f | ||
|
|
fbd0ccbd5b | ||
|
|
8c008a0e7d | ||
|
|
11fe19d08a | ||
|
|
1b3469f236 | ||
|
|
022921168d | ||
|
|
c6765eb3eb | ||
|
|
c5a374fbf2 |
7
.editorconfig
Normal file
7
.editorconfig
Normal file
@@ -0,0 +1,7 @@
|
||||
root = true
|
||||
|
||||
[*.rs]
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
43
.github/workflows/rust.yml
vendored
Normal file
43
.github/workflows/rust.yml
vendored
Normal file
@@ -0,0 +1,43 @@
|
||||
name: Rustlings Tests
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
pull_request:
|
||||
branches: [main]
|
||||
|
||||
env:
|
||||
CARGO_TERM_COLOR: always
|
||||
|
||||
jobs:
|
||||
clippy:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- run: cargo clippy -- --deny warnings
|
||||
fmt:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: DavidAnson/markdownlint-cli2-action@v16
|
||||
with:
|
||||
globs: "exercises/**/*.md"
|
||||
- name: Run cargo fmt
|
||||
run: cargo fmt --all --check
|
||||
test:
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
matrix:
|
||||
os: [ubuntu-latest, windows-latest, macOS-latest]
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: swatinem/rust-cache@v2
|
||||
- name: Run cargo test
|
||||
run: cargo test --workspace
|
||||
dev-check:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: swatinem/rust-cache@v2
|
||||
- name: Run rustlings dev check
|
||||
run: cargo run -- dev check --require-solutions
|
||||
87
.github/workflows/web.yml
vendored
Normal file
87
.github/workflows/web.yml
vendored
Normal file
@@ -0,0 +1,87 @@
|
||||
# Workflow to build your docs with oranda (and mdbook)
|
||||
# and deploy them to Github Pages
|
||||
name: Web
|
||||
|
||||
# We're going to push to the gh-pages branch, so we need that permission
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
# What situations do we want to build docs in?
|
||||
# All of these work independently and can be removed / commented out
|
||||
# if you don't want oranda/mdbook running in that situation
|
||||
on:
|
||||
# Check that a PR didn't break docs!
|
||||
#
|
||||
# Note that the "Deploy to Github Pages" step won't run in this mode,
|
||||
# so this won't have any side-effects. But it will tell you if a PR
|
||||
# completely broke oranda/mdbook. Sadly we don't provide previews (yet)!
|
||||
pull_request:
|
||||
|
||||
# Whenever something gets pushed to main, update the docs!
|
||||
# This is great for getting docs changes live without cutting a full release.
|
||||
#
|
||||
# Note that if you're using cargo-dist, this will "race" the Release workflow
|
||||
# that actually builds the Github Release that oranda tries to read (and
|
||||
# this will almost certainly complete first). As a result you will publish
|
||||
# docs for the latest commit but the oranda landing page won't know about
|
||||
# the latest release. The workflow_run trigger below will properly wait for
|
||||
# cargo-dist, and so this half-published state will only last for ~10 minutes.
|
||||
#
|
||||
# If you only want docs to update with releases, disable this, or change it to
|
||||
# a "release" branch. You can, of course, also manually trigger a workflow run
|
||||
# when you want the docs to update.
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
|
||||
# Whenever a workflow called "Release" completes, update the docs!
|
||||
#
|
||||
# If you're using cargo-dist, this is recommended, as it will ensure that
|
||||
# oranda always sees the latest release right when it's available. Note
|
||||
# however that Github's UI is wonky when you use workflow_run, and won't
|
||||
# show this workflow as part of any commit. You have to go to the "actions"
|
||||
# tab for your repo to see this one running (the gh-pages deploy will also
|
||||
# only show up there).
|
||||
workflow_run:
|
||||
workflows: [ "Release" ]
|
||||
types:
|
||||
- completed
|
||||
|
||||
# Alright, let's do it!
|
||||
jobs:
|
||||
web:
|
||||
name: Build and deploy site and docs
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
# Setup
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- uses: swatinem/rust-cache@v2
|
||||
|
||||
# If you use any mdbook plugins, here's the place to install them!
|
||||
|
||||
# Install and run oranda (and mdbook)
|
||||
# This will write all output to ./public/ (including copying mdbook's output to there)
|
||||
- name: Install and run oranda
|
||||
run: |
|
||||
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/oranda/releases/download/v0.3.1/oranda-installer.sh | sh
|
||||
oranda build
|
||||
|
||||
# Deploy to our gh-pages branch (creating it if it doesn't exist)
|
||||
# the "public" dir that oranda made above will become the root dir
|
||||
# of this branch.
|
||||
#
|
||||
# Note that once the gh-pages branch exists, you must
|
||||
# go into repo's settings > pages and set "deploy from branch: gh-pages"
|
||||
# the other defaults work fine.
|
||||
- name: Deploy to Github Pages
|
||||
uses: JamesIves/github-pages-deploy-action@v4.4.1
|
||||
# ONLY if we're on main (so no PRs or feature branches allowed!)
|
||||
if: ${{ github.ref == 'refs/heads/main' }}
|
||||
with:
|
||||
branch: gh-pages
|
||||
# Gotta tell the action where to find oranda's output
|
||||
folder: public
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
single-commit: true
|
||||
22
.gitignore
vendored
22
.gitignore
vendored
@@ -1,5 +1,23 @@
|
||||
*.swp
|
||||
# Cargo
|
||||
target/
|
||||
**/*.rs.bk
|
||||
Cargo.lock
|
||||
!/Cargo.lock
|
||||
|
||||
# State file
|
||||
.rustlings-state.txt
|
||||
|
||||
# oranda
|
||||
public/
|
||||
.netlify
|
||||
|
||||
# OS
|
||||
.DS_Store
|
||||
.direnv/
|
||||
|
||||
# Editor
|
||||
*.swp
|
||||
.idea
|
||||
*.iml
|
||||
|
||||
# Ignore file for editors like Helix
|
||||
.ignore
|
||||
|
||||
2
.markdownlint.yml
Normal file
2
.markdownlint.yml
Normal file
@@ -0,0 +1,2 @@
|
||||
# MD013/line-length Line length, Expected: 80
|
||||
MD013: false
|
||||
11
.travis.yml
11
.travis.yml
@@ -1,11 +0,0 @@
|
||||
language: rust
|
||||
rust:
|
||||
- stable
|
||||
- beta
|
||||
- nightly
|
||||
script: cargo test --verbose -- --test-threads=1
|
||||
matrix:
|
||||
allow_failures:
|
||||
- rust: nightly
|
||||
fast_finish: true
|
||||
cache: cargo
|
||||
4
.typos.toml
Normal file
4
.typos.toml
Normal file
@@ -0,0 +1,4 @@
|
||||
[files]
|
||||
extend-exclude = [
|
||||
"CHANGELOG.md",
|
||||
]
|
||||
1028
CHANGELOG.md
Normal file
1028
CHANGELOG.md
Normal file
File diff suppressed because it is too large
Load Diff
61
CONTRIBUTING.md
Normal file
61
CONTRIBUTING.md
Normal file
@@ -0,0 +1,61 @@
|
||||
# Contributing to Rustlings
|
||||
|
||||
First off, thanks for taking the time to contribute! ❤️
|
||||
|
||||
## Quick Reference
|
||||
|
||||
I want to …
|
||||
|
||||
- _report a bug!_ ➡️ [open an issue](#issues)
|
||||
- _fix a bug!_ ➡️ [open a pull request](#pull-requests)
|
||||
- _implement a new feature!_ ➡️ [open an issue to discuss it first, then a pull request](#issues)
|
||||
- _add an exercise!_ ➡️ [read this](#adding-an-exercise)
|
||||
- _update an outdated exercise!_ ➡️ [open a pull request](#pull-requests)
|
||||
|
||||
## Issues
|
||||
|
||||
You can open an issue [here](https://github.com/rust-lang/rustlings/issues/new).
|
||||
If you're reporting a bug, please include the output of the following commands:
|
||||
|
||||
- `cargo --version`
|
||||
- `rustlings --version`
|
||||
- `ls -la`
|
||||
- Your OS name and version
|
||||
|
||||
## Pull Requests
|
||||
|
||||
You are welcome to open a pull request, but unless it is small and trivial, **please open an issue to discuss your idea first** 🙏🏼
|
||||
|
||||
Opening a pull request is as easy as forking the repository and committing your changes.
|
||||
If you need any help with it or face any Git related problems, don't hesitate to ask for help 🤗
|
||||
|
||||
It may take time to review your pull request.
|
||||
Please be patient 😇
|
||||
|
||||
When updating an exercise, check if its solution needs to be updated.
|
||||
|
||||
## Adding An Exercise
|
||||
|
||||
- Name the file `exercises/yourTopic/yourTopicN.rs`.
|
||||
- Make sure to put in some helpful links, and link to sections of The Book in `exercises/yourTopic/README.md`.
|
||||
- In the exercise, add a `// TODO: …` comment where user changes are required.
|
||||
- Add a solution at `solutions/yourTopic/yourTopicN.rs` with comments explaining it.
|
||||
- Add the [metadata for your exercise](#exercise-metadata) in the `rustlings-macros/info.toml` file.
|
||||
- Make sure your exercise runs with `rustlings run yourTopicN`.
|
||||
- [Open a pull request](#pull-requests).
|
||||
|
||||
### Exercise Metadata
|
||||
|
||||
The exercise metadata should contain the following:
|
||||
|
||||
```toml
|
||||
[[exercises]]
|
||||
name = "yourTopicN"
|
||||
dir = "yourTopic"
|
||||
hint = """
|
||||
A useful (multi-line) hint for your exercise.
|
||||
Include links to a section in The Book or a documentation page."""
|
||||
```
|
||||
|
||||
If your exercise doesn't contain any test, add `test = false` to the exercise metadata.
|
||||
But adding tests is recommended.
|
||||
899
Cargo.lock
generated
Normal file
899
Cargo.lock
generated
Normal file
@@ -0,0 +1,899 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "ahash"
|
||||
version = "0.8.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"once_cell",
|
||||
"version_check",
|
||||
"zerocopy",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "anstream"
|
||||
version = "0.6.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526"
|
||||
dependencies = [
|
||||
"anstyle",
|
||||
"anstyle-parse",
|
||||
"anstyle-query",
|
||||
"anstyle-wincon",
|
||||
"colorchoice",
|
||||
"is_terminal_polyfill",
|
||||
"utf8parse",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "anstyle"
|
||||
version = "1.0.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1"
|
||||
|
||||
[[package]]
|
||||
name = "anstyle-parse"
|
||||
version = "0.2.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb"
|
||||
dependencies = [
|
||||
"utf8parse",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "anstyle-query"
|
||||
version = "1.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a"
|
||||
dependencies = [
|
||||
"windows-sys 0.52.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "anstyle-wincon"
|
||||
version = "3.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8"
|
||||
dependencies = [
|
||||
"anstyle",
|
||||
"windows-sys 0.52.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "anyhow"
|
||||
version = "1.0.86"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da"
|
||||
|
||||
[[package]]
|
||||
name = "autocfg"
|
||||
version = "1.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
|
||||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "1.3.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
||||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "2.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
|
||||
|
||||
[[package]]
|
||||
name = "cfg-if"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
||||
|
||||
[[package]]
|
||||
name = "clap"
|
||||
version = "4.5.16"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ed6719fffa43d0d87e5fd8caeab59be1554fb028cd30edc88fc4369b17971019"
|
||||
dependencies = [
|
||||
"clap_builder",
|
||||
"clap_derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "clap_builder"
|
||||
version = "4.5.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "216aec2b177652e3846684cbfe25c9964d18ec45234f0f5da5157b207ed1aab6"
|
||||
dependencies = [
|
||||
"anstream",
|
||||
"anstyle",
|
||||
"clap_lex",
|
||||
"strsim",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "clap_derive"
|
||||
version = "4.5.13"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0"
|
||||
dependencies = [
|
||||
"heck",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "clap_lex"
|
||||
version = "0.7.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97"
|
||||
|
||||
[[package]]
|
||||
name = "colorchoice"
|
||||
version = "1.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0"
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-channel"
|
||||
version = "0.5.13"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2"
|
||||
dependencies = [
|
||||
"crossbeam-utils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-utils"
|
||||
version = "0.8.20"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80"
|
||||
|
||||
[[package]]
|
||||
name = "crossterm"
|
||||
version = "0.28.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6"
|
||||
dependencies = [
|
||||
"bitflags 2.6.0",
|
||||
"crossterm_winapi",
|
||||
"mio 1.0.2",
|
||||
"parking_lot",
|
||||
"rustix",
|
||||
"signal-hook",
|
||||
"signal-hook-mio",
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossterm_winapi"
|
||||
version = "0.9.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b"
|
||||
dependencies = [
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "equivalent"
|
||||
version = "1.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
|
||||
|
||||
[[package]]
|
||||
name = "errno"
|
||||
version = "0.3.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"windows-sys 0.52.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "fastrand"
|
||||
version = "2.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6"
|
||||
|
||||
[[package]]
|
||||
name = "filetime"
|
||||
version = "0.2.25"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"libc",
|
||||
"libredox",
|
||||
"windows-sys 0.59.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "fsevent-sys"
|
||||
version = "4.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2"
|
||||
dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hashbrown"
|
||||
version = "0.14.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
|
||||
|
||||
[[package]]
|
||||
name = "heck"
|
||||
version = "0.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
|
||||
|
||||
[[package]]
|
||||
name = "hermit-abi"
|
||||
version = "0.3.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
|
||||
|
||||
[[package]]
|
||||
name = "indexmap"
|
||||
version = "2.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "93ead53efc7ea8ed3cfb0c79fc8023fbb782a5432b52830b6518941cebe6505c"
|
||||
dependencies = [
|
||||
"equivalent",
|
||||
"hashbrown",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "inotify"
|
||||
version = "0.9.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff"
|
||||
dependencies = [
|
||||
"bitflags 1.3.2",
|
||||
"inotify-sys",
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "inotify-sys"
|
||||
version = "0.1.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb"
|
||||
dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "is_terminal_polyfill"
|
||||
version = "1.70.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"
|
||||
|
||||
[[package]]
|
||||
name = "itoa"
|
||||
version = "1.0.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
|
||||
|
||||
[[package]]
|
||||
name = "kqueue"
|
||||
version = "1.0.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7447f1ca1b7b563588a205fe93dea8df60fd981423a768bc1c0ded35ed147d0c"
|
||||
dependencies = [
|
||||
"kqueue-sys",
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "kqueue-sys"
|
||||
version = "1.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b"
|
||||
dependencies = [
|
||||
"bitflags 1.3.2",
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.158"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439"
|
||||
|
||||
[[package]]
|
||||
name = "libredox"
|
||||
version = "0.1.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d"
|
||||
dependencies = [
|
||||
"bitflags 2.6.0",
|
||||
"libc",
|
||||
"redox_syscall",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "linux-raw-sys"
|
||||
version = "0.4.14"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
|
||||
|
||||
[[package]]
|
||||
name = "lock_api"
|
||||
version = "0.4.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"scopeguard",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "log"
|
||||
version = "0.4.22"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
|
||||
|
||||
[[package]]
|
||||
name = "memchr"
|
||||
version = "2.7.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
|
||||
|
||||
[[package]]
|
||||
name = "mio"
|
||||
version = "0.8.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"log",
|
||||
"wasi",
|
||||
"windows-sys 0.48.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "mio"
|
||||
version = "1.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec"
|
||||
dependencies = [
|
||||
"hermit-abi",
|
||||
"libc",
|
||||
"log",
|
||||
"wasi",
|
||||
"windows-sys 0.52.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "notify"
|
||||
version = "6.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6205bd8bb1e454ad2e27422015fb5e4f2bcc7e08fa8f27058670d208324a4d2d"
|
||||
dependencies = [
|
||||
"bitflags 2.6.0",
|
||||
"crossbeam-channel",
|
||||
"filetime",
|
||||
"fsevent-sys",
|
||||
"inotify",
|
||||
"kqueue",
|
||||
"libc",
|
||||
"log",
|
||||
"mio 0.8.11",
|
||||
"walkdir",
|
||||
"windows-sys 0.48.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "notify-debouncer-mini"
|
||||
version = "0.4.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5d40b221972a1fc5ef4d858a2f671fb34c75983eb385463dff3780eeff6a9d43"
|
||||
dependencies = [
|
||||
"log",
|
||||
"notify",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "once_cell"
|
||||
version = "1.19.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
|
||||
|
||||
[[package]]
|
||||
name = "os_pipe"
|
||||
version = "1.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5ffd2b0a5634335b135d5728d84c5e0fd726954b87111f7506a61c502280d982"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"windows-sys 0.59.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "parking_lot"
|
||||
version = "0.12.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27"
|
||||
dependencies = [
|
||||
"lock_api",
|
||||
"parking_lot_core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "parking_lot_core"
|
||||
version = "0.9.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"libc",
|
||||
"redox_syscall",
|
||||
"smallvec",
|
||||
"windows-targets 0.52.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.86"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77"
|
||||
dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.37"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "redox_syscall"
|
||||
version = "0.5.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4"
|
||||
dependencies = [
|
||||
"bitflags 2.6.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustix"
|
||||
version = "0.38.35"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a85d50532239da68e9addb745ba38ff4612a242c1c7ceea689c4bc7c2f43c36f"
|
||||
dependencies = [
|
||||
"bitflags 2.6.0",
|
||||
"errno",
|
||||
"libc",
|
||||
"linux-raw-sys",
|
||||
"windows-sys 0.52.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustlings"
|
||||
version = "6.3.0"
|
||||
dependencies = [
|
||||
"ahash",
|
||||
"anyhow",
|
||||
"clap",
|
||||
"crossterm",
|
||||
"notify-debouncer-mini",
|
||||
"os_pipe",
|
||||
"rustlings-macros",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"tempfile",
|
||||
"toml_edit",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustlings-macros"
|
||||
version = "6.3.0"
|
||||
dependencies = [
|
||||
"quote",
|
||||
"serde",
|
||||
"toml_edit",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ryu"
|
||||
version = "1.0.18"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
|
||||
|
||||
[[package]]
|
||||
name = "same-file"
|
||||
version = "1.0.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
|
||||
dependencies = [
|
||||
"winapi-util",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "scopeguard"
|
||||
version = "1.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
|
||||
|
||||
[[package]]
|
||||
name = "serde"
|
||||
version = "1.0.209"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09"
|
||||
dependencies = [
|
||||
"serde_derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_derive"
|
||||
version = "1.0.209"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_json"
|
||||
version = "1.0.127"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad"
|
||||
dependencies = [
|
||||
"itoa",
|
||||
"memchr",
|
||||
"ryu",
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_spanned"
|
||||
version = "0.6.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d"
|
||||
dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "signal-hook"
|
||||
version = "0.3.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"signal-hook-registry",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "signal-hook-mio"
|
||||
version = "0.2.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"mio 1.0.2",
|
||||
"signal-hook",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "signal-hook-registry"
|
||||
version = "1.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1"
|
||||
dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "smallvec"
|
||||
version = "1.13.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
|
||||
|
||||
[[package]]
|
||||
name = "strsim"
|
||||
version = "0.11.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "2.0.76"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "578e081a14e0cefc3279b0472138c513f37b41a08d5a3cca9b6e4e8ceb6cd525"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tempfile"
|
||||
version = "3.12.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"fastrand",
|
||||
"once_cell",
|
||||
"rustix",
|
||||
"windows-sys 0.59.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "toml_datetime"
|
||||
version = "0.6.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41"
|
||||
dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "toml_edit"
|
||||
version = "0.22.20"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d"
|
||||
dependencies = [
|
||||
"indexmap",
|
||||
"serde",
|
||||
"serde_spanned",
|
||||
"toml_datetime",
|
||||
"winnow",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "unicode-ident"
|
||||
version = "1.0.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
|
||||
|
||||
[[package]]
|
||||
name = "utf8parse"
|
||||
version = "0.2.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
|
||||
|
||||
[[package]]
|
||||
name = "version_check"
|
||||
version = "0.9.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
|
||||
|
||||
[[package]]
|
||||
name = "walkdir"
|
||||
version = "2.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
|
||||
dependencies = [
|
||||
"same-file",
|
||||
"winapi-util",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasi"
|
||||
version = "0.11.0+wasi-snapshot-preview1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
|
||||
|
||||
[[package]]
|
||||
name = "winapi"
|
||||
version = "0.3.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
|
||||
dependencies = [
|
||||
"winapi-i686-pc-windows-gnu",
|
||||
"winapi-x86_64-pc-windows-gnu",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "winapi-i686-pc-windows-gnu"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
|
||||
|
||||
[[package]]
|
||||
name = "winapi-util"
|
||||
version = "0.1.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
|
||||
dependencies = [
|
||||
"windows-sys 0.59.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "winapi-x86_64-pc-windows-gnu"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
||||
|
||||
[[package]]
|
||||
name = "windows-sys"
|
||||
version = "0.48.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
|
||||
dependencies = [
|
||||
"windows-targets 0.48.5",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-sys"
|
||||
version = "0.52.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
|
||||
dependencies = [
|
||||
"windows-targets 0.52.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-sys"
|
||||
version = "0.59.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
|
||||
dependencies = [
|
||||
"windows-targets 0.52.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-targets"
|
||||
version = "0.48.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
|
||||
dependencies = [
|
||||
"windows_aarch64_gnullvm 0.48.5",
|
||||
"windows_aarch64_msvc 0.48.5",
|
||||
"windows_i686_gnu 0.48.5",
|
||||
"windows_i686_msvc 0.48.5",
|
||||
"windows_x86_64_gnu 0.48.5",
|
||||
"windows_x86_64_gnullvm 0.48.5",
|
||||
"windows_x86_64_msvc 0.48.5",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-targets"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
|
||||
dependencies = [
|
||||
"windows_aarch64_gnullvm 0.52.6",
|
||||
"windows_aarch64_msvc 0.52.6",
|
||||
"windows_i686_gnu 0.52.6",
|
||||
"windows_i686_gnullvm",
|
||||
"windows_i686_msvc 0.52.6",
|
||||
"windows_x86_64_gnu 0.52.6",
|
||||
"windows_x86_64_gnullvm 0.52.6",
|
||||
"windows_x86_64_msvc 0.52.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows_aarch64_gnullvm"
|
||||
version = "0.48.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
|
||||
|
||||
[[package]]
|
||||
name = "windows_aarch64_gnullvm"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
|
||||
|
||||
[[package]]
|
||||
name = "windows_aarch64_msvc"
|
||||
version = "0.48.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
|
||||
|
||||
[[package]]
|
||||
name = "windows_aarch64_msvc"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
|
||||
|
||||
[[package]]
|
||||
name = "windows_i686_gnu"
|
||||
version = "0.48.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
|
||||
|
||||
[[package]]
|
||||
name = "windows_i686_gnu"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
|
||||
|
||||
[[package]]
|
||||
name = "windows_i686_gnullvm"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
|
||||
|
||||
[[package]]
|
||||
name = "windows_i686_msvc"
|
||||
version = "0.48.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
|
||||
|
||||
[[package]]
|
||||
name = "windows_i686_msvc"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_gnu"
|
||||
version = "0.48.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_gnu"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_gnullvm"
|
||||
version = "0.48.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_gnullvm"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_msvc"
|
||||
version = "0.48.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_msvc"
|
||||
version = "0.52.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
|
||||
|
||||
[[package]]
|
||||
name = "winnow"
|
||||
version = "0.6.18"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy"
|
||||
version = "0.7.35"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
|
||||
dependencies = [
|
||||
"zerocopy-derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy-derive"
|
||||
version = "0.7.35"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
96
Cargo.toml
96
Cargo.toml
@@ -1,20 +1,88 @@
|
||||
[workspace]
|
||||
resolver = "2"
|
||||
exclude = [
|
||||
"tests/test_exercises",
|
||||
"dev",
|
||||
]
|
||||
|
||||
[workspace.package]
|
||||
version = "6.3.0"
|
||||
authors = [
|
||||
"Mo Bitar <mo8it@proton.me>", # https://github.com/mo8it
|
||||
"Liv <mokou@fastmail.com>", # https://github.com/shadows-withal
|
||||
# Alumni
|
||||
"Carol (Nichols || Goulding) <carol.nichols@gmail.com>", # https://github.com/carols10cents
|
||||
]
|
||||
repository = "https://github.com/rust-lang/rustlings"
|
||||
license = "MIT"
|
||||
edition = "2021" # On Update: Update the edition of the `rustfmt` command that checks the solutions.
|
||||
rust-version = "1.80"
|
||||
|
||||
[workspace.dependencies]
|
||||
serde = { version = "1.0.209", features = ["derive"] }
|
||||
toml_edit = { version = "0.22.20", default-features = false, features = ["parse", "serde"] }
|
||||
|
||||
[package]
|
||||
name = "rustlings"
|
||||
version = "1.1.0"
|
||||
authors = ["Olivia <819880950@qq.com>", "Carol (Nichols || Goulding) <carol.nichols@gmail.com"]
|
||||
edition = "2018"
|
||||
description = "Small exercises to get you used to reading and writing Rust code!"
|
||||
version.workspace = true
|
||||
authors.workspace = true
|
||||
repository.workspace = true
|
||||
license.workspace = true
|
||||
edition.workspace = true
|
||||
rust-version.workspace = true
|
||||
keywords = [
|
||||
"exercise",
|
||||
"learning",
|
||||
]
|
||||
include = [
|
||||
"/src/",
|
||||
"/exercises/",
|
||||
"/solutions/",
|
||||
# A symlink to be able to include `dev/Cargo.toml` although `dev` is excluded.
|
||||
"/dev-Cargo.toml",
|
||||
"/README.md",
|
||||
"/LICENSE",
|
||||
]
|
||||
|
||||
[dependencies]
|
||||
clap = "2.32.0"
|
||||
indicatif = "0.9.0"
|
||||
console = "0.6.2"
|
||||
syntect = "3.0.2"
|
||||
notify = "4.0.0"
|
||||
toml = "0.4.10"
|
||||
|
||||
[[bin]]
|
||||
name = "rustlings"
|
||||
path = "src/main.rs"
|
||||
ahash = { version = "0.8.11", default-features = false }
|
||||
anyhow = "1.0.86"
|
||||
clap = { version = "4.5.16", features = ["derive"] }
|
||||
crossterm = { version = "0.28.1", default-features = false, features = ["windows", "events"] }
|
||||
notify-debouncer-mini = { version = "0.4.1", default-features = false }
|
||||
os_pipe = "1.2.1"
|
||||
rustlings-macros = { path = "rustlings-macros", version = "=6.3.0" }
|
||||
serde_json = "1.0.127"
|
||||
serde.workspace = true
|
||||
toml_edit.workspace = true
|
||||
|
||||
[dev-dependencies]
|
||||
assert_cmd = "0.11.0"
|
||||
tempfile = "3.12.0"
|
||||
|
||||
[profile.release]
|
||||
panic = "abort"
|
||||
|
||||
[profile.dev]
|
||||
panic = "abort"
|
||||
|
||||
[package.metadata.release]
|
||||
pre-release-hook = ["./release-hook.sh"]
|
||||
|
||||
[workspace.lints.rust]
|
||||
unsafe_code = "forbid"
|
||||
unstable_features = "forbid"
|
||||
|
||||
[workspace.lints.clippy]
|
||||
empty_loop = "forbid"
|
||||
disallowed-types = "deny"
|
||||
disallowed-methods = "deny"
|
||||
infinite_loop = "deny"
|
||||
mem_forget = "deny"
|
||||
dbg_macro = "warn"
|
||||
todo = "warn"
|
||||
# TODO: Remove after the following fix is released: https://github.com/rust-lang/rust-clippy/pull/13102
|
||||
needless_option_as_deref = "allow"
|
||||
|
||||
[lints]
|
||||
workspace = true
|
||||
|
||||
214
README.md
214
README.md
@@ -1,126 +1,156 @@
|
||||

|
||||
<div class="oranda-hide">
|
||||
|
||||
# rustlings 🦀❤️
|
||||
# Rustlings 🦀❤️
|
||||
|
||||
Greetings and welcome to `rustlings`. This project contains small exercises to get you used to reading and writing Rust code. This includes reading and responding to compiler messages!
|
||||
</div>
|
||||
|
||||
_...looking for the old, web-based version of Rustlings? Try [here](https://github.com/rust-lang/rustlings/tree/rustlings-1)_
|
||||
Greetings and welcome to Rustlings.
|
||||
This project contains small exercises to get you used to reading and writing Rust code.
|
||||
This includes reading and responding to compiler messages!
|
||||
|
||||
Alternatively, for a first-time Rust learner, there's several other resources:
|
||||
It is recommended to do the Rustlings exercises in parallel to reading [the official Rust book](https://doc.rust-lang.org/book/), the most comprehensive resource for learning Rust 📚️
|
||||
|
||||
- [The Book](https://doc.rust-lang.org/book/index.html) - The most comprehensive resource for learning Rust, but a bit theoretical sometimes. You will be using this along with Rustlings!
|
||||
- [Rust By Example](https://doc.rust-lang.org/rust-by-example/index.html) - Learn Rust by solving little exercises! It's almost like `rustlings`, but online
|
||||
[Rust By Example](https://doc.rust-lang.org/rust-by-example/) is another recommended resource that you might find helpful.
|
||||
It contains code examples and exercises similar to Rustlings, but online.
|
||||
|
||||
## Getting Started
|
||||
|
||||
_Note: If you're on MacOS, make sure you've installed Xcode and its developer tools by typing `xcode-select --install`._
|
||||
### Installing Rust
|
||||
|
||||
_Note: If you have Xcode 10+ installed, you also need to install the package file found at `/Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg`._
|
||||
Before installing Rustlings, you need to have the **latest version of Rust** installed.
|
||||
Visit [www.rust-lang.org/tools/install](https://www.rust-lang.org/tools/install) for further instructions on installing Rust.
|
||||
This will also install _Cargo_, Rust's package/project manager.
|
||||
|
||||
You will need to have Rust installed. You can get it by visiting https://rustup.rs. This'll also install Cargo, Rust's package/project manager.
|
||||
> 🐧 If you're on Linux, make sure you've installed `gcc` (for a linker).
|
||||
>
|
||||
> Deb: `sudo apt install gcc`.
|
||||
> Dnf: `sudo dnf install gcc`.
|
||||
|
||||
## MacOS/Linux
|
||||
> 🍎 If you're on MacOS, make sure you've installed Xcode and its developer tools by running `xcode-select --install`.
|
||||
|
||||
Just run:
|
||||
### Installing Rustlings
|
||||
|
||||
The following command will download and compile Rustlings:
|
||||
|
||||
```bash
|
||||
curl -L https://git.io/rustlings | bash
|
||||
# Or if you want it to be installed to a different path:
|
||||
curl -L https://git.io/rustlings | bash -s mypath/
|
||||
cargo install rustlings
|
||||
```
|
||||
|
||||
This will install Rustlings and give you access to the `rustlings` command. Run it to get started!
|
||||
<details>
|
||||
<summary><strong>If the installation fails…</strong> (<em>click to expand</em>)</summary>
|
||||
|
||||
## Windows/Manually
|
||||
- Make sure you have the latest Rust version by running `rustup update`
|
||||
- Try adding the `--locked` flag: `cargo install rustlings --locked`
|
||||
- Otherwise, please [report the issue](https://github.com/rust-lang/rustlings/issues/new)
|
||||
|
||||
Basically: Clone the repository, checkout to the latest tag, run `cargo install`.
|
||||
</details>
|
||||
|
||||
### Initialization
|
||||
|
||||
After installing Rustlings, run the following command to initialize the `rustlings/` directory:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/rust-lang/rustlings
|
||||
cd rustlings
|
||||
git checkout tags/1.0.0 # or whatever the latest version is (find out at https://github.com/rust-lang/rustlings/releases/latest)
|
||||
cargo install --force --path .
|
||||
rustlings init
|
||||
```
|
||||
|
||||
Same as above, run `rustlings` to get started.
|
||||
<details>
|
||||
<summary><strong>If the command <code>rustlings</code> can't be found…</strong> (<em>click to expand</em>)</summary>
|
||||
|
||||
You are probably using Linux and installed Rust using your package manager.
|
||||
|
||||
Cargo installs binaries to the directory `~/.cargo/bin`.
|
||||
Sadly, package managers often don't add `~/.cargo/bin` to your `PATH` environment variable.
|
||||
|
||||
The solution is to …
|
||||
|
||||
- either add `~/.cargo/bin` manually to `PATH`
|
||||
- or to uninstall Rust from the package manager and install it using the official way with `rustup`: https://www.rust-lang.org/tools/install
|
||||
|
||||
</details>
|
||||
|
||||
Now, go into the newly initialized directory and launch Rustlings for further instructions on getting started with the exercises:
|
||||
|
||||
```bash
|
||||
cd rustlings/
|
||||
rustlings
|
||||
```
|
||||
|
||||
## Working environment
|
||||
|
||||
### Editor
|
||||
|
||||
Our general recommendation is [VS Code](https://code.visualstudio.com/) with the [rust-analyzer plugin](https://marketplace.visualstudio.com/items?itemName=rust-lang.rust-analyzer).
|
||||
But any editor that supports [rust-analyzer](https://rust-analyzer.github.io/) should be enough for working on the exercises.
|
||||
|
||||
### Terminal
|
||||
|
||||
While working with Rustlings, please use a modern terminal for the best user experience.
|
||||
The default terminal on Linux and Mac should be sufficient.
|
||||
On Windows, we recommend the [Windows Terminal](https://aka.ms/terminal).
|
||||
|
||||
## Doing exercises
|
||||
|
||||
The exercises are sorted by topic and can be found in the subdirectory `rustlings/exercises/<topic>`. For every topic there is an additional README file with some resources to get you started on the topic. We really recommend that you have a look at them before you start.
|
||||
The exercises are sorted by topic and can be found in the subdirectory `exercises/<topic>`.
|
||||
For every topic, there is an additional `README.md` file with some resources to get you started on the topic.
|
||||
We highly recommend that you have a look at them before you start 📚️
|
||||
|
||||
The task is simple. Most exercises contain an error that keep it from compiling, and it's up to you to fix it! Some exercises are also ran as tests, but rustlings handles them all the same. To run the exercises in the recommended order, execute:
|
||||
Most exercises contain an error that keeps them from compiling, and it's up to you to fix it!
|
||||
Some exercises contain tests that need to pass for the exercise to be done ✅
|
||||
|
||||
Search for `TODO` and `todo!()` to find out what you need to change.
|
||||
Ask for hints by entering `h` in the _watch mode_ 💡
|
||||
|
||||
### Watch Mode
|
||||
|
||||
After [initialization](#initialization), Rustlings can be launched by simply running the command `rustlings`.
|
||||
|
||||
This will start the _watch mode_ which walks you through the exercises in a predefined order (what we think is best for newcomers).
|
||||
It will rerun the current exercise automatically every time you change the exercise's file in the `exercises/` directory.
|
||||
|
||||
<details>
|
||||
<summary><strong>If detecting file changes in the <code>exercises/</code> directory fails…</strong> (<em>click to expand</em>)</summary>
|
||||
|
||||
> You can add the **`--manual-run`** flag (`rustlings --manual-run`) to manually rerun the current exercise by entering `r` in the watch mode.
|
||||
>
|
||||
> Please [report the issue](https://github.com/rust-lang/rustlings/issues/new) with some information about your operating system and whether you run Rustlings in a container or virtual machine (e.g. WSL).
|
||||
|
||||
</details>
|
||||
|
||||
### Exercise List
|
||||
|
||||
In the [watch mode](#watch-mode) (after launching `rustlings`), you can enter `l` to open the interactive exercise list.
|
||||
|
||||
The list allows you to…
|
||||
|
||||
- See the status of all exercises (done or pending)
|
||||
- `c`: Continue at another exercise (temporarily skip some exercises or go back to a previous one)
|
||||
- `r`: Reset status and file of an exercise (you need to _reload/reopen_ its file in your editor afterwards)
|
||||
|
||||
See the footer of the list for all possible keys.
|
||||
|
||||
## Continuing On
|
||||
|
||||
Once you've completed Rustlings, put your new knowledge to good use!
|
||||
Continue practicing your Rust skills by building your own projects, contributing to Rustlings, or finding other open-source projects to contribute to.
|
||||
|
||||
## Third-Party Exercises
|
||||
|
||||
Do you want to create your own set of Rustlings exercises to focus on some specific topic?
|
||||
Or do you want to translate the original Rustlings exercises?
|
||||
Then follow the link to the guide about [third-party exercises](https://github.com/rust-lang/rustlings/blob/main/THIRD_PARTY_EXERCISES.md)!
|
||||
|
||||
## Uninstalling Rustlings
|
||||
|
||||
If you want to remove Rustlings from your system, run the following command:
|
||||
|
||||
```bash
|
||||
rustlings verify
|
||||
cargo uninstall rustlings
|
||||
```
|
||||
|
||||
This will try to verify the completion of every exercise in a predetermined order (what we think is best for newcomers). If you don't want to rerun `verify` every time you change a file, you can run:
|
||||
|
||||
```bash
|
||||
rustlings watch
|
||||
```
|
||||
|
||||
This will do the same as verify, but won't quit after running and instead automatically rerun as soon as you change a file in the `exercises/` directory.
|
||||
|
||||
In case you want to go by your own order, or want to only verify a single exercise, you can run:
|
||||
|
||||
```bash
|
||||
rustlings run exercises/path/to/exercise.rs
|
||||
```
|
||||
|
||||
In case you get stuck, there is usually a hint at the bottom of each exercise.
|
||||
|
||||
## Testing yourself
|
||||
|
||||
After every couple of sections, there will be a test that'll test your knowledge on a bunch of sections at once. These tests are found in `exercises/testN.rs`.
|
||||
|
||||
## Completion
|
||||
|
||||
Rustlings isn't done; there are a couple of sections that are very experimental and don't have proper documentation. These include:
|
||||
|
||||
- Errors (`exercises/errors/`)
|
||||
- Option (`exercises/option/`)
|
||||
- Result (`exercises/result/`)
|
||||
- Move Semantics (could still be improved, `exercises/move_semantics/`)
|
||||
|
||||
Additionally, we could use exercises on a couple of topics:
|
||||
|
||||
- Structs
|
||||
- Better ownership stuff
|
||||
- `impl`
|
||||
- ??? probably more
|
||||
|
||||
If you are interested in improving or adding new ones, please feel free to contribute! Read on for more information :)
|
||||
|
||||
## Contributing
|
||||
|
||||
### Adding an exercise
|
||||
See [CONTRIBUTING.md](https://github.com/rust-lang/rustlings/blob/main/CONTRIBUTING.md) 🔗
|
||||
|
||||
First step is to add the exercise! Call it `exercises/yourTopic/yourTopicN.rs`, make sure to
|
||||
put in some helpful links, and link to sections of the book in `exercises/yourTopic/README.md`.
|
||||
|
||||
Next you want to make sure it runs when using `rustlings`. All exercises are stored in `info.toml`, under the `exercises` array. They're ordered by the order they're ran when using `rustlings verify`.
|
||||
|
||||
You want to make sure where in the file you add your exercise. If you're not sure, add it at the bottom and ask in your pull request. To add an exercise, edit the file like this:
|
||||
```diff
|
||||
...
|
||||
+ [[exercises]]
|
||||
+ path = "exercises/yourTopic/yourTopicN.rs"
|
||||
+ mode = "compile"
|
||||
...
|
||||
```
|
||||
|
||||
The `mode` attribute decides whether Rustlings will only compile your exercise, or compile and test it. If you have tests to verify in your exercise, choose `test`, otherwise `compile`.
|
||||
|
||||
That's all! Feel free to put up a pull request.
|
||||
|
||||
### Working on the source code
|
||||
|
||||
`rustlings` is basically a glorified `rustc` wrapper. Therefore the source code
|
||||
isn't really that complicated since the bulk of the work is done by `rustc`.
|
||||
`src/main.rs` contains a simple `clap` CLI that loads from `src/verify.rs` and `src/run.rs`.
|
||||
|
||||
## Credits
|
||||
|
||||
`rustlings` was originally written by [Carol](https://github.com/carols10cents)!
|
||||
## Contributors ✨
|
||||
|
||||
Thanks to [all the wonderful contributors](https://github.com/rust-lang/rustlings/graphs/contributors) 🎉
|
||||
|
||||
53
THIRD_PARTY_EXERCISES.md
Normal file
53
THIRD_PARTY_EXERCISES.md
Normal file
@@ -0,0 +1,53 @@
|
||||
# Third-Party Exercises
|
||||
|
||||
The support of Rustlings for third-party exercises allows you to create your own set of Rustlings exercises to focus on some specific topic.
|
||||
You could also offer a translation of the original Rustlings exercises as third-party exercises.
|
||||
|
||||
## Getting started
|
||||
|
||||
To create third-party exercises, install Rustlings and run `rustlings dev new PROJECT_NAME`.
|
||||
This command will, similar to `cargo new PROJECT_NAME`, create a template directory called `PROJECT_NAME` with all what you need to get started.
|
||||
|
||||
Read the comments in the generated `info.toml` file to understand its format.
|
||||
It allows you to set a custom welcome and final message and specify the metadata of every exercise.
|
||||
|
||||
## Create an exercise
|
||||
|
||||
Here is an example of the metadata of one file:
|
||||
|
||||
```toml
|
||||
[[exercises]]
|
||||
name = "intro1"
|
||||
hint = """
|
||||
To finish this exercise, you need to …
|
||||
This link might help you …"""
|
||||
```
|
||||
|
||||
After entering this in `info.toml`, create the file `intro1.rs` in the `exercises/` directory.
|
||||
The exercise needs to contain a `main` function, but it can be empty.
|
||||
Adding tests is recommended.
|
||||
Look at the official Rustlings exercises for inspiration.
|
||||
|
||||
You can optionally add a solution file `intro1.rs` to the `solutions/` directory.
|
||||
|
||||
Now, run `rustlings dev check`.
|
||||
It will tell you about any issues with your exercises.
|
||||
For example, it will tell you to run `rustlings dev update` to update the `Cargo.toml` file to include the new exercise `intro1`.
|
||||
|
||||
`rustlings dev check` will also run your solutions (if you have any) to make sure that they run successfully.
|
||||
|
||||
That's it!
|
||||
You finished your first exercise 🎉
|
||||
|
||||
## Publish
|
||||
|
||||
Now, add more exercises and publish them as a Git repository.
|
||||
|
||||
Users just have to clone that repository and run `rustlings` in it to start working on your set of exercises just like the official ones.
|
||||
|
||||
One difference to the official exercises is that the solution files will not be hidden until the user finishes an exercise.
|
||||
But you can trust the users to not look at the solution too early 😉
|
||||
|
||||
## Share
|
||||
|
||||
After publishing your set of exercises, open an issue or a pull request in the official Rustlings repository to link to your project in the README 😃
|
||||
13
clippy.toml
Normal file
13
clippy.toml
Normal file
@@ -0,0 +1,13 @@
|
||||
disallowed-types = [
|
||||
# Inefficient. Use `.queue(…)` instead.
|
||||
"crossterm::style::Stylize",
|
||||
"crossterm::style::styled_content::StyledContent",
|
||||
]
|
||||
|
||||
disallowed-methods = [
|
||||
# We use `ahash` instead of the default hasher.
|
||||
"std::collections::HashSet::new",
|
||||
"std::collections::HashSet::with_capacity",
|
||||
# Inefficient. Use `.queue(…)` instead.
|
||||
"crossterm::style::style",
|
||||
]
|
||||
@@ -1,20 +0,0 @@
|
||||
Thanks for installing `rustlings`!
|
||||
|
||||
## Is this your first time?
|
||||
|
||||
Let's make sure you're up to speed:
|
||||
- You have Rust installed, preferably via `rustup`
|
||||
- You have `~/.cargo/bin` added to your PATH variable
|
||||
- You have cloned this repository (https://github.com/rust-lang/rustlings)
|
||||
- You have installed Rust language support for your editor
|
||||
- You have locally installed the `rustlings` command by running:
|
||||
|
||||
```sh
|
||||
cargo install --path .
|
||||
```
|
||||
|
||||
If you've done all of this (or even most of it), congrats! You're ready
|
||||
to start working with Rust.
|
||||
|
||||
To get started, run `rustlings verify` in order to get the first exercise.
|
||||
Make sure to have your editor open!
|
||||
1
dev-Cargo.toml
Symbolic link
1
dev-Cargo.toml
Symbolic link
@@ -0,0 +1 @@
|
||||
dev/Cargo.toml
|
||||
219
dev/Cargo.toml
Normal file
219
dev/Cargo.toml
Normal file
@@ -0,0 +1,219 @@
|
||||
# Don't edit the `bin` list manually! It is updated by `cargo run -- dev update`. This comment line will be stripped in `rustlings init`.
|
||||
bin = [
|
||||
{ name = "intro1", path = "../exercises/00_intro/intro1.rs" },
|
||||
{ name = "intro1_sol", path = "../solutions/00_intro/intro1.rs" },
|
||||
{ name = "intro2", path = "../exercises/00_intro/intro2.rs" },
|
||||
{ name = "intro2_sol", path = "../solutions/00_intro/intro2.rs" },
|
||||
{ name = "variables1", path = "../exercises/01_variables/variables1.rs" },
|
||||
{ name = "variables1_sol", path = "../solutions/01_variables/variables1.rs" },
|
||||
{ name = "variables2", path = "../exercises/01_variables/variables2.rs" },
|
||||
{ name = "variables2_sol", path = "../solutions/01_variables/variables2.rs" },
|
||||
{ name = "variables3", path = "../exercises/01_variables/variables3.rs" },
|
||||
{ name = "variables3_sol", path = "../solutions/01_variables/variables3.rs" },
|
||||
{ name = "variables4", path = "../exercises/01_variables/variables4.rs" },
|
||||
{ name = "variables4_sol", path = "../solutions/01_variables/variables4.rs" },
|
||||
{ name = "variables5", path = "../exercises/01_variables/variables5.rs" },
|
||||
{ name = "variables5_sol", path = "../solutions/01_variables/variables5.rs" },
|
||||
{ name = "variables6", path = "../exercises/01_variables/variables6.rs" },
|
||||
{ name = "variables6_sol", path = "../solutions/01_variables/variables6.rs" },
|
||||
{ name = "functions1", path = "../exercises/02_functions/functions1.rs" },
|
||||
{ name = "functions1_sol", path = "../solutions/02_functions/functions1.rs" },
|
||||
{ name = "functions2", path = "../exercises/02_functions/functions2.rs" },
|
||||
{ name = "functions2_sol", path = "../solutions/02_functions/functions2.rs" },
|
||||
{ name = "functions3", path = "../exercises/02_functions/functions3.rs" },
|
||||
{ name = "functions3_sol", path = "../solutions/02_functions/functions3.rs" },
|
||||
{ name = "functions4", path = "../exercises/02_functions/functions4.rs" },
|
||||
{ name = "functions4_sol", path = "../solutions/02_functions/functions4.rs" },
|
||||
{ name = "functions5", path = "../exercises/02_functions/functions5.rs" },
|
||||
{ name = "functions5_sol", path = "../solutions/02_functions/functions5.rs" },
|
||||
{ name = "if1", path = "../exercises/03_if/if1.rs" },
|
||||
{ name = "if1_sol", path = "../solutions/03_if/if1.rs" },
|
||||
{ name = "if2", path = "../exercises/03_if/if2.rs" },
|
||||
{ name = "if2_sol", path = "../solutions/03_if/if2.rs" },
|
||||
{ name = "if3", path = "../exercises/03_if/if3.rs" },
|
||||
{ name = "if3_sol", path = "../solutions/03_if/if3.rs" },
|
||||
{ name = "quiz1", path = "../exercises/quizzes/quiz1.rs" },
|
||||
{ name = "quiz1_sol", path = "../solutions/quizzes/quiz1.rs" },
|
||||
{ name = "primitive_types1", path = "../exercises/04_primitive_types/primitive_types1.rs" },
|
||||
{ name = "primitive_types1_sol", path = "../solutions/04_primitive_types/primitive_types1.rs" },
|
||||
{ name = "primitive_types2", path = "../exercises/04_primitive_types/primitive_types2.rs" },
|
||||
{ name = "primitive_types2_sol", path = "../solutions/04_primitive_types/primitive_types2.rs" },
|
||||
{ name = "primitive_types3", path = "../exercises/04_primitive_types/primitive_types3.rs" },
|
||||
{ name = "primitive_types3_sol", path = "../solutions/04_primitive_types/primitive_types3.rs" },
|
||||
{ name = "primitive_types4", path = "../exercises/04_primitive_types/primitive_types4.rs" },
|
||||
{ name = "primitive_types4_sol", path = "../solutions/04_primitive_types/primitive_types4.rs" },
|
||||
{ name = "primitive_types5", path = "../exercises/04_primitive_types/primitive_types5.rs" },
|
||||
{ name = "primitive_types5_sol", path = "../solutions/04_primitive_types/primitive_types5.rs" },
|
||||
{ name = "primitive_types6", path = "../exercises/04_primitive_types/primitive_types6.rs" },
|
||||
{ name = "primitive_types6_sol", path = "../solutions/04_primitive_types/primitive_types6.rs" },
|
||||
{ name = "vecs1", path = "../exercises/05_vecs/vecs1.rs" },
|
||||
{ name = "vecs1_sol", path = "../solutions/05_vecs/vecs1.rs" },
|
||||
{ name = "vecs2", path = "../exercises/05_vecs/vecs2.rs" },
|
||||
{ name = "vecs2_sol", path = "../solutions/05_vecs/vecs2.rs" },
|
||||
{ name = "move_semantics1", path = "../exercises/06_move_semantics/move_semantics1.rs" },
|
||||
{ name = "move_semantics1_sol", path = "../solutions/06_move_semantics/move_semantics1.rs" },
|
||||
{ name = "move_semantics2", path = "../exercises/06_move_semantics/move_semantics2.rs" },
|
||||
{ name = "move_semantics2_sol", path = "../solutions/06_move_semantics/move_semantics2.rs" },
|
||||
{ name = "move_semantics3", path = "../exercises/06_move_semantics/move_semantics3.rs" },
|
||||
{ name = "move_semantics3_sol", path = "../solutions/06_move_semantics/move_semantics3.rs" },
|
||||
{ name = "move_semantics4", path = "../exercises/06_move_semantics/move_semantics4.rs" },
|
||||
{ name = "move_semantics4_sol", path = "../solutions/06_move_semantics/move_semantics4.rs" },
|
||||
{ name = "move_semantics5", path = "../exercises/06_move_semantics/move_semantics5.rs" },
|
||||
{ name = "move_semantics5_sol", path = "../solutions/06_move_semantics/move_semantics5.rs" },
|
||||
{ name = "structs1", path = "../exercises/07_structs/structs1.rs" },
|
||||
{ name = "structs1_sol", path = "../solutions/07_structs/structs1.rs" },
|
||||
{ name = "structs2", path = "../exercises/07_structs/structs2.rs" },
|
||||
{ name = "structs2_sol", path = "../solutions/07_structs/structs2.rs" },
|
||||
{ name = "structs3", path = "../exercises/07_structs/structs3.rs" },
|
||||
{ name = "structs3_sol", path = "../solutions/07_structs/structs3.rs" },
|
||||
{ name = "enums1", path = "../exercises/08_enums/enums1.rs" },
|
||||
{ name = "enums1_sol", path = "../solutions/08_enums/enums1.rs" },
|
||||
{ name = "enums2", path = "../exercises/08_enums/enums2.rs" },
|
||||
{ name = "enums2_sol", path = "../solutions/08_enums/enums2.rs" },
|
||||
{ name = "enums3", path = "../exercises/08_enums/enums3.rs" },
|
||||
{ name = "enums3_sol", path = "../solutions/08_enums/enums3.rs" },
|
||||
{ name = "strings1", path = "../exercises/09_strings/strings1.rs" },
|
||||
{ name = "strings1_sol", path = "../solutions/09_strings/strings1.rs" },
|
||||
{ name = "strings2", path = "../exercises/09_strings/strings2.rs" },
|
||||
{ name = "strings2_sol", path = "../solutions/09_strings/strings2.rs" },
|
||||
{ name = "strings3", path = "../exercises/09_strings/strings3.rs" },
|
||||
{ name = "strings3_sol", path = "../solutions/09_strings/strings3.rs" },
|
||||
{ name = "strings4", path = "../exercises/09_strings/strings4.rs" },
|
||||
{ name = "strings4_sol", path = "../solutions/09_strings/strings4.rs" },
|
||||
{ name = "modules1", path = "../exercises/10_modules/modules1.rs" },
|
||||
{ name = "modules1_sol", path = "../solutions/10_modules/modules1.rs" },
|
||||
{ name = "modules2", path = "../exercises/10_modules/modules2.rs" },
|
||||
{ name = "modules2_sol", path = "../solutions/10_modules/modules2.rs" },
|
||||
{ name = "modules3", path = "../exercises/10_modules/modules3.rs" },
|
||||
{ name = "modules3_sol", path = "../solutions/10_modules/modules3.rs" },
|
||||
{ name = "hashmaps1", path = "../exercises/11_hashmaps/hashmaps1.rs" },
|
||||
{ name = "hashmaps1_sol", path = "../solutions/11_hashmaps/hashmaps1.rs" },
|
||||
{ name = "hashmaps2", path = "../exercises/11_hashmaps/hashmaps2.rs" },
|
||||
{ name = "hashmaps2_sol", path = "../solutions/11_hashmaps/hashmaps2.rs" },
|
||||
{ name = "hashmaps3", path = "../exercises/11_hashmaps/hashmaps3.rs" },
|
||||
{ name = "hashmaps3_sol", path = "../solutions/11_hashmaps/hashmaps3.rs" },
|
||||
{ name = "quiz2", path = "../exercises/quizzes/quiz2.rs" },
|
||||
{ name = "quiz2_sol", path = "../solutions/quizzes/quiz2.rs" },
|
||||
{ name = "options1", path = "../exercises/12_options/options1.rs" },
|
||||
{ name = "options1_sol", path = "../solutions/12_options/options1.rs" },
|
||||
{ name = "options2", path = "../exercises/12_options/options2.rs" },
|
||||
{ name = "options2_sol", path = "../solutions/12_options/options2.rs" },
|
||||
{ name = "options3", path = "../exercises/12_options/options3.rs" },
|
||||
{ name = "options3_sol", path = "../solutions/12_options/options3.rs" },
|
||||
{ name = "errors1", path = "../exercises/13_error_handling/errors1.rs" },
|
||||
{ name = "errors1_sol", path = "../solutions/13_error_handling/errors1.rs" },
|
||||
{ name = "errors2", path = "../exercises/13_error_handling/errors2.rs" },
|
||||
{ name = "errors2_sol", path = "../solutions/13_error_handling/errors2.rs" },
|
||||
{ name = "errors3", path = "../exercises/13_error_handling/errors3.rs" },
|
||||
{ name = "errors3_sol", path = "../solutions/13_error_handling/errors3.rs" },
|
||||
{ name = "errors4", path = "../exercises/13_error_handling/errors4.rs" },
|
||||
{ name = "errors4_sol", path = "../solutions/13_error_handling/errors4.rs" },
|
||||
{ name = "errors5", path = "../exercises/13_error_handling/errors5.rs" },
|
||||
{ name = "errors5_sol", path = "../solutions/13_error_handling/errors5.rs" },
|
||||
{ name = "errors6", path = "../exercises/13_error_handling/errors6.rs" },
|
||||
{ name = "errors6_sol", path = "../solutions/13_error_handling/errors6.rs" },
|
||||
{ name = "generics1", path = "../exercises/14_generics/generics1.rs" },
|
||||
{ name = "generics1_sol", path = "../solutions/14_generics/generics1.rs" },
|
||||
{ name = "generics2", path = "../exercises/14_generics/generics2.rs" },
|
||||
{ name = "generics2_sol", path = "../solutions/14_generics/generics2.rs" },
|
||||
{ name = "traits1", path = "../exercises/15_traits/traits1.rs" },
|
||||
{ name = "traits1_sol", path = "../solutions/15_traits/traits1.rs" },
|
||||
{ name = "traits2", path = "../exercises/15_traits/traits2.rs" },
|
||||
{ name = "traits2_sol", path = "../solutions/15_traits/traits2.rs" },
|
||||
{ name = "traits3", path = "../exercises/15_traits/traits3.rs" },
|
||||
{ name = "traits3_sol", path = "../solutions/15_traits/traits3.rs" },
|
||||
{ name = "traits4", path = "../exercises/15_traits/traits4.rs" },
|
||||
{ name = "traits4_sol", path = "../solutions/15_traits/traits4.rs" },
|
||||
{ name = "traits5", path = "../exercises/15_traits/traits5.rs" },
|
||||
{ name = "traits5_sol", path = "../solutions/15_traits/traits5.rs" },
|
||||
{ name = "quiz3", path = "../exercises/quizzes/quiz3.rs" },
|
||||
{ name = "quiz3_sol", path = "../solutions/quizzes/quiz3.rs" },
|
||||
{ name = "lifetimes1", path = "../exercises/16_lifetimes/lifetimes1.rs" },
|
||||
{ name = "lifetimes1_sol", path = "../solutions/16_lifetimes/lifetimes1.rs" },
|
||||
{ name = "lifetimes2", path = "../exercises/16_lifetimes/lifetimes2.rs" },
|
||||
{ name = "lifetimes2_sol", path = "../solutions/16_lifetimes/lifetimes2.rs" },
|
||||
{ name = "lifetimes3", path = "../exercises/16_lifetimes/lifetimes3.rs" },
|
||||
{ name = "lifetimes3_sol", path = "../solutions/16_lifetimes/lifetimes3.rs" },
|
||||
{ name = "tests1", path = "../exercises/17_tests/tests1.rs" },
|
||||
{ name = "tests1_sol", path = "../solutions/17_tests/tests1.rs" },
|
||||
{ name = "tests2", path = "../exercises/17_tests/tests2.rs" },
|
||||
{ name = "tests2_sol", path = "../solutions/17_tests/tests2.rs" },
|
||||
{ name = "tests3", path = "../exercises/17_tests/tests3.rs" },
|
||||
{ name = "tests3_sol", path = "../solutions/17_tests/tests3.rs" },
|
||||
{ name = "iterators1", path = "../exercises/18_iterators/iterators1.rs" },
|
||||
{ name = "iterators1_sol", path = "../solutions/18_iterators/iterators1.rs" },
|
||||
{ name = "iterators2", path = "../exercises/18_iterators/iterators2.rs" },
|
||||
{ name = "iterators2_sol", path = "../solutions/18_iterators/iterators2.rs" },
|
||||
{ name = "iterators3", path = "../exercises/18_iterators/iterators3.rs" },
|
||||
{ name = "iterators3_sol", path = "../solutions/18_iterators/iterators3.rs" },
|
||||
{ name = "iterators4", path = "../exercises/18_iterators/iterators4.rs" },
|
||||
{ name = "iterators4_sol", path = "../solutions/18_iterators/iterators4.rs" },
|
||||
{ name = "iterators5", path = "../exercises/18_iterators/iterators5.rs" },
|
||||
{ name = "iterators5_sol", path = "../solutions/18_iterators/iterators5.rs" },
|
||||
{ name = "box1", path = "../exercises/19_smart_pointers/box1.rs" },
|
||||
{ name = "box1_sol", path = "../solutions/19_smart_pointers/box1.rs" },
|
||||
{ name = "rc1", path = "../exercises/19_smart_pointers/rc1.rs" },
|
||||
{ name = "rc1_sol", path = "../solutions/19_smart_pointers/rc1.rs" },
|
||||
{ name = "arc1", path = "../exercises/19_smart_pointers/arc1.rs" },
|
||||
{ name = "arc1_sol", path = "../solutions/19_smart_pointers/arc1.rs" },
|
||||
{ name = "cow1", path = "../exercises/19_smart_pointers/cow1.rs" },
|
||||
{ name = "cow1_sol", path = "../solutions/19_smart_pointers/cow1.rs" },
|
||||
{ name = "threads1", path = "../exercises/20_threads/threads1.rs" },
|
||||
{ name = "threads1_sol", path = "../solutions/20_threads/threads1.rs" },
|
||||
{ name = "threads2", path = "../exercises/20_threads/threads2.rs" },
|
||||
{ name = "threads2_sol", path = "../solutions/20_threads/threads2.rs" },
|
||||
{ name = "threads3", path = "../exercises/20_threads/threads3.rs" },
|
||||
{ name = "threads3_sol", path = "../solutions/20_threads/threads3.rs" },
|
||||
{ name = "macros1", path = "../exercises/21_macros/macros1.rs" },
|
||||
{ name = "macros1_sol", path = "../solutions/21_macros/macros1.rs" },
|
||||
{ name = "macros2", path = "../exercises/21_macros/macros2.rs" },
|
||||
{ name = "macros2_sol", path = "../solutions/21_macros/macros2.rs" },
|
||||
{ name = "macros3", path = "../exercises/21_macros/macros3.rs" },
|
||||
{ name = "macros3_sol", path = "../solutions/21_macros/macros3.rs" },
|
||||
{ name = "macros4", path = "../exercises/21_macros/macros4.rs" },
|
||||
{ name = "macros4_sol", path = "../solutions/21_macros/macros4.rs" },
|
||||
{ name = "clippy1", path = "../exercises/22_clippy/clippy1.rs" },
|
||||
{ name = "clippy1_sol", path = "../solutions/22_clippy/clippy1.rs" },
|
||||
{ name = "clippy2", path = "../exercises/22_clippy/clippy2.rs" },
|
||||
{ name = "clippy2_sol", path = "../solutions/22_clippy/clippy2.rs" },
|
||||
{ name = "clippy3", path = "../exercises/22_clippy/clippy3.rs" },
|
||||
{ name = "clippy3_sol", path = "../solutions/22_clippy/clippy3.rs" },
|
||||
{ name = "using_as", path = "../exercises/23_conversions/using_as.rs" },
|
||||
{ name = "using_as_sol", path = "../solutions/23_conversions/using_as.rs" },
|
||||
{ name = "from_into", path = "../exercises/23_conversions/from_into.rs" },
|
||||
{ name = "from_into_sol", path = "../solutions/23_conversions/from_into.rs" },
|
||||
{ name = "from_str", path = "../exercises/23_conversions/from_str.rs" },
|
||||
{ name = "from_str_sol", path = "../solutions/23_conversions/from_str.rs" },
|
||||
{ name = "try_from_into", path = "../exercises/23_conversions/try_from_into.rs" },
|
||||
{ name = "try_from_into_sol", path = "../solutions/23_conversions/try_from_into.rs" },
|
||||
{ name = "as_ref_mut", path = "../exercises/23_conversions/as_ref_mut.rs" },
|
||||
{ name = "as_ref_mut_sol", path = "../solutions/23_conversions/as_ref_mut.rs" },
|
||||
]
|
||||
|
||||
[package]
|
||||
name = "exercises"
|
||||
edition = "2021"
|
||||
# Don't publish the exercises on crates.io!
|
||||
publish = false
|
||||
|
||||
[profile.release]
|
||||
panic = "abort"
|
||||
|
||||
[profile.dev]
|
||||
panic = "abort"
|
||||
|
||||
[lints.rust]
|
||||
# You shouldn't write unsafe code in Rustlings
|
||||
unsafe_code = "forbid"
|
||||
# You don't need unstable features in Rustlings and shouldn't rely on them while learning Rust
|
||||
unstable_features = "forbid"
|
||||
|
||||
[lints.clippy]
|
||||
# You forgot a `todo!()`
|
||||
todo = "forbid"
|
||||
# This can only happen by mistake in Rustlings
|
||||
empty_loop = "forbid"
|
||||
# No infinite loops are needed in Rustlings
|
||||
infinite_loop = "deny"
|
||||
# You shouldn't leak memory while still learning Rust
|
||||
mem_forget = "deny"
|
||||
1
dev/rustlings-repo.txt
Normal file
1
dev/rustlings-repo.txt
Normal file
@@ -0,0 +1 @@
|
||||
This file is used to check if the user tries to run Rustlings in the repository (the method before version 6)
|
||||
8
exercises/00_intro/README.md
Normal file
8
exercises/00_intro/README.md
Normal file
@@ -0,0 +1,8 @@
|
||||
# Intro
|
||||
|
||||
Rust uses the `print!` and `println!` macros to print text to the console.
|
||||
|
||||
## Further information
|
||||
|
||||
- [Hello World](https://doc.rust-lang.org/rust-by-example/hello.html)
|
||||
- [Formatted print](https://doc.rust-lang.org/rust-by-example/hello/print.html)
|
||||
24
exercises/00_intro/intro1.rs
Normal file
24
exercises/00_intro/intro1.rs
Normal file
@@ -0,0 +1,24 @@
|
||||
// TODO: We sometimes encourage you to keep trying things on a given exercise
|
||||
// even after you already figured it out. If you got everything working and feel
|
||||
// ready for the next exercise, enter `n` in the terminal.
|
||||
//
|
||||
// The exercise file will be reloaded when you change one of the lines below!
|
||||
// Try adding a new `println!` and check the updated output in the terminal.
|
||||
|
||||
fn main() {
|
||||
println!(r#" Welcome to... "#);
|
||||
println!(r#" _ _ _ "#);
|
||||
println!(r#" _ __ _ _ ___| |_| (_)_ __ __ _ ___ "#);
|
||||
println!(r#" | '__| | | / __| __| | | '_ \ / _` / __| "#);
|
||||
println!(r#" | | | |_| \__ \ |_| | | | | | (_| \__ \ "#);
|
||||
println!(r#" |_| \__,_|___/\__|_|_|_| |_|\__, |___/ "#);
|
||||
println!(r#" |___/ "#);
|
||||
println!();
|
||||
println!("This exercise compiles successfully. The remaining exercises contain a compiler");
|
||||
println!("or logic error. The central concept behind Rustlings is to fix these errors and");
|
||||
println!("solve the exercises. Good luck!");
|
||||
println!();
|
||||
println!("The file of this exercise is `exercises/00_intro/intro1.rs`. Have a look!");
|
||||
println!("The current exercise path will be always shown under the progress bar.");
|
||||
println!("You can click on the path to open the exercise file in your editor.");
|
||||
}
|
||||
4
exercises/00_intro/intro2.rs
Normal file
4
exercises/00_intro/intro2.rs
Normal file
@@ -0,0 +1,4 @@
|
||||
fn main() {
|
||||
// TODO: Fix the code to print "Hello world!".
|
||||
printline!("Hello world!");
|
||||
}
|
||||
9
exercises/01_variables/README.md
Normal file
9
exercises/01_variables/README.md
Normal file
@@ -0,0 +1,9 @@
|
||||
# Variables
|
||||
|
||||
In Rust, variables are immutable by default.
|
||||
When a variable is immutable, once a value is bound to a name, you can’t change that value.
|
||||
You can make them mutable by adding `mut` in front of the variable name.
|
||||
|
||||
## Further information
|
||||
|
||||
- [Variables and Mutability](https://doc.rust-lang.org/book/ch03-01-variables-and-mutability.html)
|
||||
6
exercises/01_variables/variables1.rs
Normal file
6
exercises/01_variables/variables1.rs
Normal file
@@ -0,0 +1,6 @@
|
||||
fn main() {
|
||||
// TODO: Add the missing keyword.
|
||||
x = 5;
|
||||
|
||||
println!("x has the value {x}");
|
||||
}
|
||||
10
exercises/01_variables/variables2.rs
Normal file
10
exercises/01_variables/variables2.rs
Normal file
@@ -0,0 +1,10 @@
|
||||
fn main() {
|
||||
// TODO: Change the line below to fix the compiler error.
|
||||
let x;
|
||||
|
||||
if x == 10 {
|
||||
println!("x is ten!");
|
||||
} else {
|
||||
println!("x is not ten!");
|
||||
}
|
||||
}
|
||||
6
exercises/01_variables/variables3.rs
Normal file
6
exercises/01_variables/variables3.rs
Normal file
@@ -0,0 +1,6 @@
|
||||
fn main() {
|
||||
// TODO: Change the line below to fix the compiler error.
|
||||
let x: i32;
|
||||
|
||||
println!("Number {x}");
|
||||
}
|
||||
8
exercises/01_variables/variables4.rs
Normal file
8
exercises/01_variables/variables4.rs
Normal file
@@ -0,0 +1,8 @@
|
||||
// TODO: Fix the compiler error.
|
||||
fn main() {
|
||||
let x = 3;
|
||||
println!("Number {x}");
|
||||
|
||||
x = 5; // Don't change this line
|
||||
println!("Number {x}");
|
||||
}
|
||||
8
exercises/01_variables/variables5.rs
Normal file
8
exercises/01_variables/variables5.rs
Normal file
@@ -0,0 +1,8 @@
|
||||
fn main() {
|
||||
let number = "T-H-R-E-E"; // Don't change this line
|
||||
println!("Spell a number: {}", number);
|
||||
|
||||
// TODO: Fix the compiler error by changing the line below without renaming the variable.
|
||||
number = 3;
|
||||
println!("Number plus two is: {}", number + 2);
|
||||
}
|
||||
6
exercises/01_variables/variables6.rs
Normal file
6
exercises/01_variables/variables6.rs
Normal file
@@ -0,0 +1,6 @@
|
||||
// TODO: Change the line below to fix the compiler error.
|
||||
const NUMBER = 3;
|
||||
|
||||
fn main() {
|
||||
println!("Number: {NUMBER}");
|
||||
}
|
||||
8
exercises/02_functions/README.md
Normal file
8
exercises/02_functions/README.md
Normal file
@@ -0,0 +1,8 @@
|
||||
# Functions
|
||||
|
||||
Here, you'll learn how to write functions and how the Rust compiler can help you debug errors even
|
||||
in more complex code.
|
||||
|
||||
## Further information
|
||||
|
||||
- [How Functions Work](https://doc.rust-lang.org/book/ch03-03-how-functions-work.html)
|
||||
5
exercises/02_functions/functions1.rs
Normal file
5
exercises/02_functions/functions1.rs
Normal file
@@ -0,0 +1,5 @@
|
||||
// TODO: Add some function with the name `call_me` without arguments or a return value.
|
||||
|
||||
fn main() {
|
||||
call_me(); // Don't change this line
|
||||
}
|
||||
10
exercises/02_functions/functions2.rs
Normal file
10
exercises/02_functions/functions2.rs
Normal file
@@ -0,0 +1,10 @@
|
||||
// TODO: Add the missing type of the argument `num` after the colon `:`.
|
||||
fn call_me(num:) {
|
||||
for i in 0..num {
|
||||
println!("Ring! Call number {}", i + 1);
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
call_me(3);
|
||||
}
|
||||
10
exercises/02_functions/functions3.rs
Normal file
10
exercises/02_functions/functions3.rs
Normal file
@@ -0,0 +1,10 @@
|
||||
fn call_me(num: u8) {
|
||||
for i in 0..num {
|
||||
println!("Ring! Call number {}", i + 1);
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// TODO: Fix the function call.
|
||||
call_me();
|
||||
}
|
||||
22
exercises/02_functions/functions4.rs
Normal file
22
exercises/02_functions/functions4.rs
Normal file
@@ -0,0 +1,22 @@
|
||||
// This store is having a sale where if the price is an even number, you get 10
|
||||
// Rustbucks off, but if it's an odd number, it's 3 Rustbucks off.
|
||||
// Don't worry about the function bodies themselves, we are only interested in
|
||||
// the signatures for now.
|
||||
|
||||
fn is_even(num: i64) -> bool {
|
||||
num % 2 == 0
|
||||
}
|
||||
|
||||
// TODO: Fix the function signature.
|
||||
fn sale_price(price: i64) -> {
|
||||
if is_even(price) {
|
||||
price - 10
|
||||
} else {
|
||||
price - 3
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let original_price = 51;
|
||||
println!("Your sale price is {}", sale_price(original_price));
|
||||
}
|
||||
9
exercises/02_functions/functions5.rs
Normal file
9
exercises/02_functions/functions5.rs
Normal file
@@ -0,0 +1,9 @@
|
||||
// TODO: Fix the function body without changing the signature.
|
||||
fn square(num: i32) -> i32 {
|
||||
num * num;
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let answer = square(3);
|
||||
println!("The square of 3 is {answer}");
|
||||
}
|
||||
7
exercises/03_if/README.md
Normal file
7
exercises/03_if/README.md
Normal file
@@ -0,0 +1,7 @@
|
||||
# If
|
||||
|
||||
`if`, the most basic (but still surprisingly versatile!) type of control flow, is what you'll learn here.
|
||||
|
||||
## Further information
|
||||
|
||||
- [Control Flow - if expressions](https://doc.rust-lang.org/book/ch03-05-control-flow.html#if-expressions)
|
||||
32
exercises/03_if/if1.rs
Normal file
32
exercises/03_if/if1.rs
Normal file
@@ -0,0 +1,32 @@
|
||||
fn bigger(a: i32, b: i32) -> i32 {
|
||||
// TODO: Complete this function to return the bigger number!
|
||||
// If both numbers are equal, any of them can be returned.
|
||||
// Do not use:
|
||||
// - another function call
|
||||
// - additional variables
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// You can optionally experiment here.
|
||||
}
|
||||
|
||||
// Don't mind this for now :)
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn ten_is_bigger_than_eight() {
|
||||
assert_eq!(10, bigger(10, 8));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn fortytwo_is_bigger_than_thirtytwo() {
|
||||
assert_eq!(42, bigger(32, 42));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn equal_numbers() {
|
||||
assert_eq!(42, bigger(42, 42));
|
||||
}
|
||||
}
|
||||
35
exercises/03_if/if2.rs
Normal file
35
exercises/03_if/if2.rs
Normal file
@@ -0,0 +1,35 @@
|
||||
// TODO: Fix the compiler error on this function.
|
||||
fn foo_if_fizz(fizzish: &str) -> &str {
|
||||
if fizzish == "fizz" {
|
||||
"foo"
|
||||
} else {
|
||||
1
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// You can optionally experiment here.
|
||||
}
|
||||
|
||||
// TODO: Read the tests to understand the desired behavior.
|
||||
// Make all tests pass without changing them.
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn foo_for_fizz() {
|
||||
// This means that calling `foo_if_fizz` with the argument "fizz" should return "foo".
|
||||
assert_eq!(foo_if_fizz("fizz"), "foo");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn bar_for_fuzz() {
|
||||
assert_eq!(foo_if_fizz("fuzz"), "bar");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn default_to_baz() {
|
||||
assert_eq!(foo_if_fizz("literally anything"), "baz");
|
||||
}
|
||||
}
|
||||
53
exercises/03_if/if3.rs
Normal file
53
exercises/03_if/if3.rs
Normal file
@@ -0,0 +1,53 @@
|
||||
fn animal_habitat(animal: &str) -> &str {
|
||||
// TODO: Fix the compiler error in the statement below.
|
||||
let identifier = if animal == "crab" {
|
||||
1
|
||||
} else if animal == "gopher" {
|
||||
2.0
|
||||
} else if animal == "snake" {
|
||||
3
|
||||
} else {
|
||||
"Unknown"
|
||||
};
|
||||
|
||||
// Don't change the expression below!
|
||||
if identifier == 1 {
|
||||
"Beach"
|
||||
} else if identifier == 2 {
|
||||
"Burrow"
|
||||
} else if identifier == 3 {
|
||||
"Desert"
|
||||
} else {
|
||||
"Unknown"
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// You can optionally experiment here.
|
||||
}
|
||||
|
||||
// Don't change the tests!
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn gopher_lives_in_burrow() {
|
||||
assert_eq!(animal_habitat("gopher"), "Burrow")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn snake_lives_in_desert() {
|
||||
assert_eq!(animal_habitat("snake"), "Desert")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn crab_lives_on_beach() {
|
||||
assert_eq!(animal_habitat("crab"), "Beach")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn unknown_animal() {
|
||||
assert_eq!(animal_habitat("dinosaur"), "Unknown")
|
||||
}
|
||||
}
|
||||
9
exercises/04_primitive_types/README.md
Normal file
9
exercises/04_primitive_types/README.md
Normal file
@@ -0,0 +1,9 @@
|
||||
# Primitive Types
|
||||
|
||||
Rust has a couple of basic types that are directly implemented into the
|
||||
compiler. In this section, we'll go through the most important ones.
|
||||
|
||||
## Further information
|
||||
|
||||
- [Data Types](https://doc.rust-lang.org/book/ch03-02-data-types.html)
|
||||
- [The Slice Type](https://doc.rust-lang.org/book/ch04-03-slices.html)
|
||||
15
exercises/04_primitive_types/primitive_types1.rs
Normal file
15
exercises/04_primitive_types/primitive_types1.rs
Normal file
@@ -0,0 +1,15 @@
|
||||
// Booleans (`bool`)
|
||||
|
||||
fn main() {
|
||||
let is_morning = true;
|
||||
if is_morning {
|
||||
println!("Good morning!");
|
||||
}
|
||||
|
||||
// TODO: Define a boolean variable with the name `is_evening` before the `if` statement below.
|
||||
// The value of the variable should be the negation (opposite) of `is_morning`.
|
||||
// let …
|
||||
if is_evening {
|
||||
println!("Good evening!");
|
||||
}
|
||||
}
|
||||
28
exercises/04_primitive_types/primitive_types2.rs
Normal file
28
exercises/04_primitive_types/primitive_types2.rs
Normal file
@@ -0,0 +1,28 @@
|
||||
// Characters (`char`)
|
||||
|
||||
fn main() {
|
||||
// Note the _single_ quotes, these are different from the double quotes
|
||||
// you've been seeing around.
|
||||
let my_first_initial = 'C';
|
||||
if my_first_initial.is_alphabetic() {
|
||||
println!("Alphabetical!");
|
||||
} else if my_first_initial.is_numeric() {
|
||||
println!("Numerical!");
|
||||
} else {
|
||||
println!("Neither alphabetic nor numeric!");
|
||||
}
|
||||
|
||||
// TODO: Analogous to the example before, declare a variable called `your_character`
|
||||
// below with your favorite character.
|
||||
// Try a letter, try a digit (in single quotes), try a special character, try a character
|
||||
// from a different language than your own, try an emoji 😉
|
||||
// let your_character = '';
|
||||
|
||||
if your_character.is_alphabetic() {
|
||||
println!("Alphabetical!");
|
||||
} else if your_character.is_numeric() {
|
||||
println!("Numerical!");
|
||||
} else {
|
||||
println!("Neither alphabetic nor numeric!");
|
||||
}
|
||||
}
|
||||
11
exercises/04_primitive_types/primitive_types3.rs
Normal file
11
exercises/04_primitive_types/primitive_types3.rs
Normal file
@@ -0,0 +1,11 @@
|
||||
fn main() {
|
||||
// TODO: Create an array called `a` with at least 100 elements in it.
|
||||
// let a = ???
|
||||
|
||||
if a.len() >= 100 {
|
||||
println!("Wow, that's a big array!");
|
||||
} else {
|
||||
println!("Meh, I eat arrays like that for breakfast.");
|
||||
panic!("Array not big enough, more elements needed");
|
||||
}
|
||||
}
|
||||
16
exercises/04_primitive_types/primitive_types4.rs
Normal file
16
exercises/04_primitive_types/primitive_types4.rs
Normal file
@@ -0,0 +1,16 @@
|
||||
fn main() {
|
||||
// You can optionally experiment here.
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
#[test]
|
||||
fn slice_out_of_array() {
|
||||
let a = [1, 2, 3, 4, 5];
|
||||
|
||||
// TODO: Get a slice called `nice_slice` out of the array `a` so that the test passes.
|
||||
// let nice_slice = ???
|
||||
|
||||
assert_eq!([2, 3, 4], nice_slice);
|
||||
}
|
||||
}
|
||||
8
exercises/04_primitive_types/primitive_types5.rs
Normal file
8
exercises/04_primitive_types/primitive_types5.rs
Normal file
@@ -0,0 +1,8 @@
|
||||
fn main() {
|
||||
let cat = ("Furry McFurson", 3.5);
|
||||
|
||||
// TODO: Destructure the `cat` tuple in one statement so that the println works.
|
||||
// let /* your pattern here */ = cat;
|
||||
|
||||
println!("{name} is {age} years old");
|
||||
}
|
||||
17
exercises/04_primitive_types/primitive_types6.rs
Normal file
17
exercises/04_primitive_types/primitive_types6.rs
Normal file
@@ -0,0 +1,17 @@
|
||||
fn main() {
|
||||
// You can optionally experiment here.
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
#[test]
|
||||
fn indexing_tuple() {
|
||||
let numbers = (1, 2, 3);
|
||||
|
||||
// TODO: Use a tuple index to access the second element of `numbers`
|
||||
// and assign it to a variable called `second`.
|
||||
// let second = ???;
|
||||
|
||||
assert_eq!(second, 2, "This is not the 2nd number in the tuple!");
|
||||
}
|
||||
}
|
||||
17
exercises/05_vecs/README.md
Normal file
17
exercises/05_vecs/README.md
Normal file
@@ -0,0 +1,17 @@
|
||||
# Vectors
|
||||
|
||||
Vectors are one of the most-used Rust data structures. In other programming
|
||||
languages, they'd simply be called Arrays, but since Rust operates on a
|
||||
bit of a lower level, an array in Rust is stored on the stack (meaning it
|
||||
can't grow or shrink, and the size needs to be known at compile time),
|
||||
and a Vector is stored in the heap (where these restrictions do not apply).
|
||||
|
||||
Vectors are a bit of a later chapter in the book, but we think that they're
|
||||
useful enough to talk about them a bit earlier. We shall be talking about
|
||||
the other useful data structure, hash maps, later.
|
||||
|
||||
## Further information
|
||||
|
||||
- [Storing Lists of Values with Vectors](https://doc.rust-lang.org/book/ch08-01-vectors.html)
|
||||
- [`iter_mut`](https://doc.rust-lang.org/std/primitive.slice.html#method.iter_mut)
|
||||
- [`map`](https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.map)
|
||||
24
exercises/05_vecs/vecs1.rs
Normal file
24
exercises/05_vecs/vecs1.rs
Normal file
@@ -0,0 +1,24 @@
|
||||
fn array_and_vec() -> ([i32; 4], Vec<i32>) {
|
||||
let a = [10, 20, 30, 40]; // Array
|
||||
|
||||
// TODO: Create a vector called `v` which contains the exact same elements as in the array `a`.
|
||||
// Use the vector macro.
|
||||
// let v = ???;
|
||||
|
||||
(a, v)
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// You can optionally experiment here.
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_array_and_vec_similarity() {
|
||||
let (a, v) = array_and_vec();
|
||||
assert_eq!(a, *v);
|
||||
}
|
||||
}
|
||||
60
exercises/05_vecs/vecs2.rs
Normal file
60
exercises/05_vecs/vecs2.rs
Normal file
@@ -0,0 +1,60 @@
|
||||
fn vec_loop(input: &[i32]) -> Vec<i32> {
|
||||
let mut output = Vec::new();
|
||||
|
||||
for element in input {
|
||||
// TODO: Multiply each element in the `input` slice by 2 and push it to
|
||||
// the `output` vector.
|
||||
}
|
||||
|
||||
output
|
||||
}
|
||||
|
||||
fn vec_map_example(input: &[i32]) -> Vec<i32> {
|
||||
// An example of collecting a vector after mapping.
|
||||
// We map each element of the `input` slice to its value plus 1.
|
||||
// If the input is `[1, 2, 3]`, the output is `[2, 3, 4]`.
|
||||
input.iter().map(|element| element + 1).collect()
|
||||
}
|
||||
|
||||
fn vec_map(input: &[i32]) -> Vec<i32> {
|
||||
// TODO: Here, we also want to multiply each element in the `input` slice
|
||||
// by 2, but with iterator mapping instead of manually pushing into an empty
|
||||
// vector.
|
||||
// See the example in the function `vec_map_example` above.
|
||||
input
|
||||
.iter()
|
||||
.map(|element| {
|
||||
// ???
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// You can optionally experiment here.
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_vec_loop() {
|
||||
let input = [2, 4, 6, 8, 10];
|
||||
let ans = vec_loop(&input);
|
||||
assert_eq!(ans, [4, 8, 12, 16, 20]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_vec_map_example() {
|
||||
let input = [1, 2, 3];
|
||||
let ans = vec_map_example(&input);
|
||||
assert_eq!(ans, [2, 3, 4]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_vec_map() {
|
||||
let input = [2, 4, 6, 8, 10];
|
||||
let ans = vec_map(&input);
|
||||
assert_eq!(ans, [4, 8, 12, 16, 20]);
|
||||
}
|
||||
}
|
||||
@@ -1,10 +1,10 @@
|
||||
### Move Semantics
|
||||
# Move Semantics
|
||||
|
||||
These exercises are adapted from [pnkfelix](https://github.com/pnkfelix)'s [Rust Tutorial](https://pnkfelix.github.io/rust-examples-icfp2014/) -- Thank you Felix!!!
|
||||
|
||||
#### Book Sections
|
||||
## Further information
|
||||
|
||||
For this section, the book links are especially important.
|
||||
|
||||
- [Ownership](https://doc.rust-lang.org/stable/book/ch04-01-what-is-ownership.html)
|
||||
- [Reference and borrowing](https://doc.rust-lang.org/stable/book/ch04-02-references-and-borrowing.html)
|
||||
- [Ownership](https://doc.rust-lang.org/book/ch04-01-what-is-ownership.html)
|
||||
- [Reference and borrowing](https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html)
|
||||
24
exercises/06_move_semantics/move_semantics1.rs
Normal file
24
exercises/06_move_semantics/move_semantics1.rs
Normal file
@@ -0,0 +1,24 @@
|
||||
// TODO: Fix the compiler error in this function.
|
||||
fn fill_vec(vec: Vec<i32>) -> Vec<i32> {
|
||||
let vec = vec;
|
||||
|
||||
vec.push(88);
|
||||
|
||||
vec
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// You can optionally experiment here.
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn move_semantics1() {
|
||||
let vec0 = vec![22, 44, 66];
|
||||
let vec1 = fill_vec(vec0);
|
||||
assert_eq!(vec1, vec![22, 44, 66, 88]);
|
||||
}
|
||||
}
|
||||
28
exercises/06_move_semantics/move_semantics2.rs
Normal file
28
exercises/06_move_semantics/move_semantics2.rs
Normal file
@@ -0,0 +1,28 @@
|
||||
fn fill_vec(vec: Vec<i32>) -> Vec<i32> {
|
||||
let mut vec = vec;
|
||||
|
||||
vec.push(88);
|
||||
|
||||
vec
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// You can optionally experiment here.
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
// TODO: Make both vectors `vec0` and `vec1` accessible at the same time to
|
||||
// fix the compiler error in the test.
|
||||
#[test]
|
||||
fn move_semantics2() {
|
||||
let vec0 = vec![22, 44, 66];
|
||||
|
||||
let vec1 = fill_vec(vec0);
|
||||
|
||||
assert_eq!(vec0, [22, 44, 66]);
|
||||
assert_eq!(vec1, [22, 44, 66, 88]);
|
||||
}
|
||||
}
|
||||
22
exercises/06_move_semantics/move_semantics3.rs
Normal file
22
exercises/06_move_semantics/move_semantics3.rs
Normal file
@@ -0,0 +1,22 @@
|
||||
// TODO: Fix the compiler error in the function without adding any new line.
|
||||
fn fill_vec(vec: Vec<i32>) -> Vec<i32> {
|
||||
vec.push(88);
|
||||
|
||||
vec
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// You can optionally experiment here.
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn move_semantics3() {
|
||||
let vec0 = vec![22, 44, 66];
|
||||
let vec1 = fill_vec(vec0);
|
||||
assert_eq!(vec1, [22, 44, 66, 88]);
|
||||
}
|
||||
}
|
||||
18
exercises/06_move_semantics/move_semantics4.rs
Normal file
18
exercises/06_move_semantics/move_semantics4.rs
Normal file
@@ -0,0 +1,18 @@
|
||||
fn main() {
|
||||
// You can optionally experiment here.
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
// TODO: Fix the compiler errors only by reordering the lines in the test.
|
||||
// Don't add, change or remove any line.
|
||||
#[test]
|
||||
fn move_semantics4() {
|
||||
let mut x = Vec::new();
|
||||
let y = &mut x;
|
||||
let z = &mut x;
|
||||
y.push(42);
|
||||
z.push(13);
|
||||
assert_eq!(x, [42, 13]);
|
||||
}
|
||||
}
|
||||
24
exercises/06_move_semantics/move_semantics5.rs
Normal file
24
exercises/06_move_semantics/move_semantics5.rs
Normal file
@@ -0,0 +1,24 @@
|
||||
#![allow(clippy::ptr_arg)]
|
||||
|
||||
// TODO: Fix the compiler errors without changing anything except adding or
|
||||
// removing references (the character `&`).
|
||||
|
||||
// Shouldn't take ownership
|
||||
fn get_char(data: String) -> char {
|
||||
data.chars().last().unwrap()
|
||||
}
|
||||
|
||||
// Should take ownership
|
||||
fn string_uppercase(mut data: &String) {
|
||||
data = data.to_uppercase();
|
||||
|
||||
println!("{data}");
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let data = "Rust is great!".to_string();
|
||||
|
||||
get_char(data);
|
||||
|
||||
string_uppercase(&data);
|
||||
}
|
||||
8
exercises/07_structs/README.md
Normal file
8
exercises/07_structs/README.md
Normal file
@@ -0,0 +1,8 @@
|
||||
# Structs
|
||||
|
||||
Rust has three struct types: a classic C struct, a tuple struct, and a unit struct.
|
||||
|
||||
## Further information
|
||||
|
||||
- [Structures](https://doc.rust-lang.org/book/ch05-01-defining-structs.html)
|
||||
- [Method Syntax](https://doc.rust-lang.org/book/ch05-03-method-syntax.html)
|
||||
47
exercises/07_structs/structs1.rs
Normal file
47
exercises/07_structs/structs1.rs
Normal file
@@ -0,0 +1,47 @@
|
||||
struct ColorRegularStruct {
|
||||
// TODO: Add the fields that the test `regular_structs` expects.
|
||||
// What types should the fields have? What are the minimum and maximum values for RGB colors?
|
||||
}
|
||||
|
||||
struct ColorTupleStruct(/* TODO: Add the fields that the test `tuple_structs` expects */);
|
||||
|
||||
#[derive(Debug)]
|
||||
struct UnitStruct;
|
||||
|
||||
fn main() {
|
||||
// You can optionally experiment here.
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn regular_structs() {
|
||||
// TODO: Instantiate a regular struct.
|
||||
// let green =
|
||||
|
||||
assert_eq!(green.red, 0);
|
||||
assert_eq!(green.green, 255);
|
||||
assert_eq!(green.blue, 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn tuple_structs() {
|
||||
// TODO: Instantiate a tuple struct.
|
||||
// let green =
|
||||
|
||||
assert_eq!(green.0, 0);
|
||||
assert_eq!(green.1, 255);
|
||||
assert_eq!(green.2, 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn unit_structs() {
|
||||
// TODO: Instantiate a unit struct.
|
||||
// let unit_struct =
|
||||
let message = format!("{unit_struct:?}s are fun!");
|
||||
|
||||
assert_eq!(message, "UnitStructs are fun!");
|
||||
}
|
||||
}
|
||||
47
exercises/07_structs/structs2.rs
Normal file
47
exercises/07_structs/structs2.rs
Normal file
@@ -0,0 +1,47 @@
|
||||
#[derive(Debug)]
|
||||
struct Order {
|
||||
name: String,
|
||||
year: u32,
|
||||
made_by_phone: bool,
|
||||
made_by_mobile: bool,
|
||||
made_by_email: bool,
|
||||
item_number: u32,
|
||||
count: u32,
|
||||
}
|
||||
|
||||
fn create_order_template() -> Order {
|
||||
Order {
|
||||
name: String::from("Bob"),
|
||||
year: 2019,
|
||||
made_by_phone: false,
|
||||
made_by_mobile: false,
|
||||
made_by_email: true,
|
||||
item_number: 123,
|
||||
count: 0,
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// You can optionally experiment here.
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn your_order() {
|
||||
let order_template = create_order_template();
|
||||
|
||||
// TODO: Create your own order using the update syntax and template above!
|
||||
// let your_order =
|
||||
|
||||
assert_eq!(your_order.name, "Hacker in Rust");
|
||||
assert_eq!(your_order.year, order_template.year);
|
||||
assert_eq!(your_order.made_by_phone, order_template.made_by_phone);
|
||||
assert_eq!(your_order.made_by_mobile, order_template.made_by_mobile);
|
||||
assert_eq!(your_order.made_by_email, order_template.made_by_email);
|
||||
assert_eq!(your_order.item_number, order_template.item_number);
|
||||
assert_eq!(your_order.count, 1);
|
||||
}
|
||||
}
|
||||
87
exercises/07_structs/structs3.rs
Normal file
87
exercises/07_structs/structs3.rs
Normal file
@@ -0,0 +1,87 @@
|
||||
// Structs contain data, but can also have logic. In this exercise, we have
|
||||
// defined the `Package` struct, and we want to test some logic attached to it.
|
||||
|
||||
#[derive(Debug)]
|
||||
struct Package {
|
||||
sender_country: String,
|
||||
recipient_country: String,
|
||||
weight_in_grams: u32,
|
||||
}
|
||||
|
||||
impl Package {
|
||||
fn new(sender_country: String, recipient_country: String, weight_in_grams: u32) -> Self {
|
||||
if weight_in_grams < 10 {
|
||||
// This isn't how you should handle errors in Rust, but we will
|
||||
// learn about error handling later.
|
||||
panic!("Can't ship a package with weight below 10 grams");
|
||||
}
|
||||
|
||||
Self {
|
||||
sender_country,
|
||||
recipient_country,
|
||||
weight_in_grams,
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: Add the correct return type to the function signature.
|
||||
fn is_international(&self) {
|
||||
// TODO: Read the tests that use this method to find out when a package
|
||||
// is considered international.
|
||||
}
|
||||
|
||||
// TODO: Add the correct return type to the function signature.
|
||||
fn get_fees(&self, cents_per_gram: u32) {
|
||||
// TODO: Calculate the package's fees.
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// You can optionally experiment here.
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
#[should_panic]
|
||||
fn fail_creating_weightless_package() {
|
||||
let sender_country = String::from("Spain");
|
||||
let recipient_country = String::from("Austria");
|
||||
|
||||
Package::new(sender_country, recipient_country, 5);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn create_international_package() {
|
||||
let sender_country = String::from("Spain");
|
||||
let recipient_country = String::from("Russia");
|
||||
|
||||
let package = Package::new(sender_country, recipient_country, 1200);
|
||||
|
||||
assert!(package.is_international());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn create_local_package() {
|
||||
let sender_country = String::from("Canada");
|
||||
let recipient_country = sender_country.clone();
|
||||
|
||||
let package = Package::new(sender_country, recipient_country, 1200);
|
||||
|
||||
assert!(!package.is_international());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn calculate_transport_fees() {
|
||||
let sender_country = String::from("Spain");
|
||||
let recipient_country = String::from("Spain");
|
||||
|
||||
let cents_per_gram = 3;
|
||||
|
||||
let package = Package::new(sender_country, recipient_country, 1500);
|
||||
|
||||
assert_eq!(package.get_fees(cents_per_gram), 4500);
|
||||
assert_eq!(package.get_fees(cents_per_gram * 2), 9000);
|
||||
}
|
||||
}
|
||||
10
exercises/08_enums/README.md
Normal file
10
exercises/08_enums/README.md
Normal file
@@ -0,0 +1,10 @@
|
||||
# Enums
|
||||
|
||||
Rust allows you to define types called "enums" which enumerate possible values.
|
||||
Enums are a feature in many languages, but their capabilities differ in each language. Rust’s enums are most similar to algebraic data types in functional languages, such as F#, OCaml, and Haskell.
|
||||
Useful in combination with enums is Rust's "pattern matching" facility, which makes it easy to run different code for different values of an enumeration.
|
||||
|
||||
## Further information
|
||||
|
||||
- [Enums](https://doc.rust-lang.org/book/ch06-00-enums.html)
|
||||
- [Pattern syntax](https://doc.rust-lang.org/book/ch18-03-pattern-syntax.html)
|
||||
12
exercises/08_enums/enums1.rs
Normal file
12
exercises/08_enums/enums1.rs
Normal file
@@ -0,0 +1,12 @@
|
||||
#[derive(Debug)]
|
||||
enum Message {
|
||||
// TODO: Define a few types of messages as used below.
|
||||
}
|
||||
|
||||
fn main() {
|
||||
println!("{:?}", Message::Resize);
|
||||
println!("{:?}", Message::Move);
|
||||
println!("{:?}", Message::Echo);
|
||||
println!("{:?}", Message::ChangeColor);
|
||||
println!("{:?}", Message::Quit);
|
||||
}
|
||||
35
exercises/08_enums/enums2.rs
Normal file
35
exercises/08_enums/enums2.rs
Normal file
@@ -0,0 +1,35 @@
|
||||
#![allow(dead_code)]
|
||||
|
||||
#[derive(Debug)]
|
||||
struct Point {
|
||||
x: u64,
|
||||
y: u64,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
enum Message {
|
||||
// TODO: Define the different variants used below.
|
||||
}
|
||||
|
||||
impl Message {
|
||||
fn call(&self) {
|
||||
println!("{self:?}");
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let messages = [
|
||||
Message::Resize {
|
||||
width: 10,
|
||||
height: 30,
|
||||
},
|
||||
Message::Move(Point { x: 10, y: 15 }),
|
||||
Message::Echo(String::from("hello world")),
|
||||
Message::ChangeColor(200, 255, 255),
|
||||
Message::Quit,
|
||||
];
|
||||
|
||||
for message in &messages {
|
||||
message.call();
|
||||
}
|
||||
}
|
||||
84
exercises/08_enums/enums3.rs
Normal file
84
exercises/08_enums/enums3.rs
Normal file
@@ -0,0 +1,84 @@
|
||||
struct Point {
|
||||
x: u64,
|
||||
y: u64,
|
||||
}
|
||||
|
||||
enum Message {
|
||||
// TODO: Implement the message variant types based on their usage below.
|
||||
}
|
||||
|
||||
struct State {
|
||||
width: u64,
|
||||
height: u64,
|
||||
position: Point,
|
||||
message: String,
|
||||
// RGB color composed of red, green and blue.
|
||||
color: (u8, u8, u8),
|
||||
quit: bool,
|
||||
}
|
||||
|
||||
impl State {
|
||||
fn resize(&mut self, width: u64, height: u64) {
|
||||
self.width = width;
|
||||
self.height = height;
|
||||
}
|
||||
|
||||
fn move_position(&mut self, point: Point) {
|
||||
self.position = point;
|
||||
}
|
||||
|
||||
fn echo(&mut self, s: String) {
|
||||
self.message = s;
|
||||
}
|
||||
|
||||
fn change_color(&mut self, red: u8, green: u8, blue: u8) {
|
||||
self.color = (red, green, blue);
|
||||
}
|
||||
|
||||
fn quit(&mut self) {
|
||||
self.quit = true;
|
||||
}
|
||||
|
||||
fn process(&mut self, message: Message) {
|
||||
// TODO: Create a match expression to process the different message
|
||||
// variants using the methods defined above.
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// You can optionally experiment here.
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_match_message_call() {
|
||||
let mut state = State {
|
||||
width: 0,
|
||||
height: 0,
|
||||
position: Point { x: 0, y: 0 },
|
||||
message: String::from("hello world"),
|
||||
color: (0, 0, 0),
|
||||
quit: false,
|
||||
};
|
||||
|
||||
state.process(Message::Resize {
|
||||
width: 10,
|
||||
height: 30,
|
||||
});
|
||||
state.process(Message::Move(Point { x: 10, y: 15 }));
|
||||
state.process(Message::Echo(String::from("Hello world!")));
|
||||
state.process(Message::ChangeColor(255, 0, 255));
|
||||
state.process(Message::Quit);
|
||||
|
||||
assert_eq!(state.width, 10);
|
||||
assert_eq!(state.height, 30);
|
||||
assert_eq!(state.position.x, 10);
|
||||
assert_eq!(state.position.y, 15);
|
||||
assert_eq!(state.message, "Hello world!");
|
||||
assert_eq!(state.color, (255, 0, 255));
|
||||
assert!(state.quit);
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,9 @@
|
||||
### Strings
|
||||
# Strings
|
||||
|
||||
Rust has two string types, a string slice (`&str`) and an owned string (`String`).
|
||||
We're not going to dictate when you should use which one, but we'll show you how
|
||||
to identify and create them, as well as use them.
|
||||
|
||||
#### Book Sections
|
||||
## Further information
|
||||
|
||||
- [Strings](https://doc.rust-lang.org/stable/book/ch08-02-strings.html)
|
||||
- [Strings](https://doc.rust-lang.org/book/ch08-02-strings.html)
|
||||
9
exercises/09_strings/strings1.rs
Normal file
9
exercises/09_strings/strings1.rs
Normal file
@@ -0,0 +1,9 @@
|
||||
// TODO: Fix the compiler error without changing the function signature.
|
||||
fn current_favorite_color() -> String {
|
||||
"blue"
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let answer = current_favorite_color();
|
||||
println!("My current favorite color is {answer}");
|
||||
}
|
||||
14
exercises/09_strings/strings2.rs
Normal file
14
exercises/09_strings/strings2.rs
Normal file
@@ -0,0 +1,14 @@
|
||||
// TODO: Fix the compiler error in the `main` function without changing this function.
|
||||
fn is_a_color_word(attempt: &str) -> bool {
|
||||
attempt == "green" || attempt == "blue" || attempt == "red"
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let word = String::from("green"); // Don't change this line.
|
||||
|
||||
if is_a_color_word(word) {
|
||||
println!("That is a color word I know!");
|
||||
} else {
|
||||
println!("That is not a color word I know.");
|
||||
}
|
||||
}
|
||||
45
exercises/09_strings/strings3.rs
Normal file
45
exercises/09_strings/strings3.rs
Normal file
@@ -0,0 +1,45 @@
|
||||
fn trim_me(input: &str) -> &str {
|
||||
// TODO: Remove whitespace from both ends of a string.
|
||||
}
|
||||
|
||||
fn compose_me(input: &str) -> String {
|
||||
// TODO: Add " world!" to the string! There are multiple ways to do this.
|
||||
}
|
||||
|
||||
fn replace_me(input: &str) -> String {
|
||||
// TODO: Replace "cars" in the string with "balloons".
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// You can optionally experiment here.
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn trim_a_string() {
|
||||
assert_eq!(trim_me("Hello! "), "Hello!");
|
||||
assert_eq!(trim_me(" What's up!"), "What's up!");
|
||||
assert_eq!(trim_me(" Hola! "), "Hola!");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn compose_a_string() {
|
||||
assert_eq!(compose_me("Hello"), "Hello world!");
|
||||
assert_eq!(compose_me("Goodbye"), "Goodbye world!");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn replace_a_string() {
|
||||
assert_eq!(
|
||||
replace_me("I think cars are cool"),
|
||||
"I think balloons are cool",
|
||||
);
|
||||
assert_eq!(
|
||||
replace_me("I love to look at cars"),
|
||||
"I love to look at balloons",
|
||||
);
|
||||
}
|
||||
}
|
||||
37
exercises/09_strings/strings4.rs
Normal file
37
exercises/09_strings/strings4.rs
Normal file
@@ -0,0 +1,37 @@
|
||||
// Calls of this function should be replaced with calls of `string_slice` or `string`.
|
||||
fn placeholder() {}
|
||||
|
||||
fn string_slice(arg: &str) {
|
||||
println!("{arg}");
|
||||
}
|
||||
|
||||
fn string(arg: String) {
|
||||
println!("{arg}");
|
||||
}
|
||||
|
||||
// TODO: Here are a bunch of values - some are `String`, some are `&str`.
|
||||
// Your task is to replace `placeholder(…)` with either `string_slice(…)`
|
||||
// or `string(…)` depending on what you think each value is.
|
||||
fn main() {
|
||||
placeholder("blue");
|
||||
|
||||
placeholder("red".to_string());
|
||||
|
||||
placeholder(String::from("hi"));
|
||||
|
||||
placeholder("rust is fun!".to_owned());
|
||||
|
||||
placeholder("nice weather".into());
|
||||
|
||||
placeholder(format!("Interpolation {}", "Station"));
|
||||
|
||||
// WARNING: This is byte indexing, not character indexing.
|
||||
// Character indexing can be done using `s.chars().nth(INDEX)`.
|
||||
placeholder(&String::from("abc")[0..1]);
|
||||
|
||||
placeholder(" hello there ".trim());
|
||||
|
||||
placeholder("Happy Monday!".replace("Mon", "Tues"));
|
||||
|
||||
placeholder("mY sHiFt KeY iS sTiCkY".to_lowercase());
|
||||
}
|
||||
7
exercises/10_modules/README.md
Normal file
7
exercises/10_modules/README.md
Normal file
@@ -0,0 +1,7 @@
|
||||
# Modules
|
||||
|
||||
In this section we'll give you an introduction to Rust's module system.
|
||||
|
||||
## Further information
|
||||
|
||||
- [The Module System](https://doc.rust-lang.org/book/ch07-00-managing-growing-projects-with-packages-crates-and-modules.html)
|
||||
16
exercises/10_modules/modules1.rs
Normal file
16
exercises/10_modules/modules1.rs
Normal file
@@ -0,0 +1,16 @@
|
||||
// TODO: Fix the compiler error about calling a private function.
|
||||
mod sausage_factory {
|
||||
// Don't let anybody outside of this module see this!
|
||||
fn get_secret_recipe() -> String {
|
||||
String::from("Ginger")
|
||||
}
|
||||
|
||||
fn make_sausage() {
|
||||
get_secret_recipe();
|
||||
println!("sausage!");
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
sausage_factory::make_sausage();
|
||||
}
|
||||
27
exercises/10_modules/modules2.rs
Normal file
27
exercises/10_modules/modules2.rs
Normal file
@@ -0,0 +1,27 @@
|
||||
// You can bring module paths into scopes and provide new names for them with
|
||||
// the `use` and `as` keywords.
|
||||
|
||||
#[allow(dead_code)]
|
||||
mod delicious_snacks {
|
||||
// TODO: Add the following two `use` statements after fixing them.
|
||||
// use self::fruits::PEAR as ???;
|
||||
// use self::veggies::CUCUMBER as ???;
|
||||
|
||||
mod fruits {
|
||||
pub const PEAR: &str = "Pear";
|
||||
pub const APPLE: &str = "Apple";
|
||||
}
|
||||
|
||||
mod veggies {
|
||||
pub const CUCUMBER: &str = "Cucumber";
|
||||
pub const CARROT: &str = "Carrot";
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
println!(
|
||||
"favorite snacks: {} and {}",
|
||||
delicious_snacks::fruit,
|
||||
delicious_snacks::veggie,
|
||||
);
|
||||
}
|
||||
13
exercises/10_modules/modules3.rs
Normal file
13
exercises/10_modules/modules3.rs
Normal file
@@ -0,0 +1,13 @@
|
||||
// You can use the `use` keyword to bring module paths from modules from
|
||||
// anywhere and especially from the standard library into your scope.
|
||||
|
||||
// TODO: Bring `SystemTime` and `UNIX_EPOCH` from the `std::time` module into
|
||||
// your scope. Bonus style points if you can do it with one line!
|
||||
// use ???;
|
||||
|
||||
fn main() {
|
||||
match SystemTime::now().duration_since(UNIX_EPOCH) {
|
||||
Ok(n) => println!("1970-01-01 00:00:00 UTC was {} seconds ago!", n.as_secs()),
|
||||
Err(_) => panic!("SystemTime before UNIX EPOCH!"),
|
||||
}
|
||||
}
|
||||
12
exercises/11_hashmaps/README.md
Normal file
12
exercises/11_hashmaps/README.md
Normal file
@@ -0,0 +1,12 @@
|
||||
# Hashmaps
|
||||
|
||||
A *hash map* allows you to associate a value with a particular key.
|
||||
You may also know this by the names [*unordered map* in C++](https://en.cppreference.com/w/cpp/container/unordered_map),
|
||||
[*dictionary* in Python](https://docs.python.org/3/tutorial/datastructures.html#dictionaries) or an *associative array* in other languages.
|
||||
|
||||
This is the other data structure that we've been talking about before, when
|
||||
talking about Vecs.
|
||||
|
||||
## Further information
|
||||
|
||||
- [Storing Keys with Associated Values in Hash Maps](https://doc.rust-lang.org/book/ch08-03-hash-maps.html)
|
||||
40
exercises/11_hashmaps/hashmaps1.rs
Normal file
40
exercises/11_hashmaps/hashmaps1.rs
Normal file
@@ -0,0 +1,40 @@
|
||||
// A basket of fruits in the form of a hash map needs to be defined. The key
|
||||
// represents the name of the fruit and the value represents how many of that
|
||||
// particular fruit is in the basket. You have to put at least 3 different
|
||||
// types of fruits (e.g. apple, banana, mango) in the basket and the total count
|
||||
// of all the fruits should be at least 5.
|
||||
|
||||
use std::collections::HashMap;
|
||||
|
||||
fn fruit_basket() -> HashMap<String, u32> {
|
||||
// TODO: Declare the hash map.
|
||||
// let mut basket =
|
||||
|
||||
// Two bananas are already given for you :)
|
||||
basket.insert(String::from("banana"), 2);
|
||||
|
||||
// TODO: Put more fruits in your basket.
|
||||
|
||||
basket
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// You can optionally experiment here.
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn at_least_three_types_of_fruits() {
|
||||
let basket = fruit_basket();
|
||||
assert!(basket.len() >= 3);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn at_least_five_fruits() {
|
||||
let basket = fruit_basket();
|
||||
assert!(basket.values().sum::<u32>() >= 5);
|
||||
}
|
||||
}
|
||||
97
exercises/11_hashmaps/hashmaps2.rs
Normal file
97
exercises/11_hashmaps/hashmaps2.rs
Normal file
@@ -0,0 +1,97 @@
|
||||
// We're collecting different fruits to bake a delicious fruit cake. For this,
|
||||
// we have a basket, which we'll represent in the form of a hash map. The key
|
||||
// represents the name of each fruit we collect and the value represents how
|
||||
// many of that particular fruit we have collected. Three types of fruits -
|
||||
// Apple (4), Mango (2) and Lychee (5) are already in the basket hash map. You
|
||||
// must add fruit to the basket so that there is at least one of each kind and
|
||||
// more than 11 in total - we have a lot of mouths to feed. You are not allowed
|
||||
// to insert any more of the fruits that are already in the basket (Apple,
|
||||
// Mango, and Lychee).
|
||||
|
||||
use std::collections::HashMap;
|
||||
|
||||
#[derive(Hash, PartialEq, Eq, Debug)]
|
||||
enum Fruit {
|
||||
Apple,
|
||||
Banana,
|
||||
Mango,
|
||||
Lychee,
|
||||
Pineapple,
|
||||
}
|
||||
|
||||
fn fruit_basket(basket: &mut HashMap<Fruit, u32>) {
|
||||
let fruit_kinds = [
|
||||
Fruit::Apple,
|
||||
Fruit::Banana,
|
||||
Fruit::Mango,
|
||||
Fruit::Lychee,
|
||||
Fruit::Pineapple,
|
||||
];
|
||||
|
||||
for fruit in fruit_kinds {
|
||||
// TODO: Insert new fruits if they are not already present in the
|
||||
// basket. Note that you are not allowed to put any type of fruit that's
|
||||
// already present!
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// You can optionally experiment here.
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
// Don't modify this function!
|
||||
fn get_fruit_basket() -> HashMap<Fruit, u32> {
|
||||
let content = [(Fruit::Apple, 4), (Fruit::Mango, 2), (Fruit::Lychee, 5)];
|
||||
HashMap::from_iter(content)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_given_fruits_are_not_modified() {
|
||||
let mut basket = get_fruit_basket();
|
||||
fruit_basket(&mut basket);
|
||||
assert_eq!(*basket.get(&Fruit::Apple).unwrap(), 4);
|
||||
assert_eq!(*basket.get(&Fruit::Mango).unwrap(), 2);
|
||||
assert_eq!(*basket.get(&Fruit::Lychee).unwrap(), 5);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn at_least_five_types_of_fruits() {
|
||||
let mut basket = get_fruit_basket();
|
||||
fruit_basket(&mut basket);
|
||||
let count_fruit_kinds = basket.len();
|
||||
assert!(count_fruit_kinds >= 5);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn greater_than_eleven_fruits() {
|
||||
let mut basket = get_fruit_basket();
|
||||
fruit_basket(&mut basket);
|
||||
let count = basket.values().sum::<u32>();
|
||||
assert!(count > 11);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn all_fruit_types_in_basket() {
|
||||
let fruit_kinds = [
|
||||
Fruit::Apple,
|
||||
Fruit::Banana,
|
||||
Fruit::Mango,
|
||||
Fruit::Lychee,
|
||||
Fruit::Pineapple,
|
||||
];
|
||||
|
||||
let mut basket = get_fruit_basket();
|
||||
fruit_basket(&mut basket);
|
||||
|
||||
for fruit_kind in fruit_kinds {
|
||||
let Some(amount) = basket.get(&fruit_kind) else {
|
||||
panic!("Fruit kind {fruit_kind:?} was not found in basket");
|
||||
};
|
||||
assert!(*amount > 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
77
exercises/11_hashmaps/hashmaps3.rs
Normal file
77
exercises/11_hashmaps/hashmaps3.rs
Normal file
@@ -0,0 +1,77 @@
|
||||
// A list of scores (one per line) of a soccer match is given. Each line is of
|
||||
// the form "<team_1_name>,<team_2_name>,<team_1_goals>,<team_2_goals>"
|
||||
// Example: "England,France,4,2" (England scored 4 goals, France 2).
|
||||
//
|
||||
// You have to build a scores table containing the name of the team, the total
|
||||
// number of goals the team scored, and the total number of goals the team
|
||||
// conceded.
|
||||
|
||||
use std::collections::HashMap;
|
||||
|
||||
// A structure to store the goal details of a team.
|
||||
#[derive(Default)]
|
||||
struct TeamScores {
|
||||
goals_scored: u8,
|
||||
goals_conceded: u8,
|
||||
}
|
||||
|
||||
fn build_scores_table(results: &str) -> HashMap<&str, TeamScores> {
|
||||
// The name of the team is the key and its associated struct is the value.
|
||||
let mut scores = HashMap::new();
|
||||
|
||||
for line in results.lines() {
|
||||
let mut split_iterator = line.split(',');
|
||||
// NOTE: We use `unwrap` because we didn't deal with error handling yet.
|
||||
let team_1_name = split_iterator.next().unwrap();
|
||||
let team_2_name = split_iterator.next().unwrap();
|
||||
let team_1_score: u8 = split_iterator.next().unwrap().parse().unwrap();
|
||||
let team_2_score: u8 = split_iterator.next().unwrap().parse().unwrap();
|
||||
|
||||
// TODO: Populate the scores table with the extracted details.
|
||||
// Keep in mind that goals scored by team 1 will be the number of goals
|
||||
// conceded by team 2. Similarly, goals scored by team 2 will be the
|
||||
// number of goals conceded by team 1.
|
||||
}
|
||||
|
||||
scores
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// You can optionally experiment here.
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
const RESULTS: &str = "England,France,4,2
|
||||
France,Italy,3,1
|
||||
Poland,Spain,2,0
|
||||
Germany,England,2,1
|
||||
England,Spain,1,0";
|
||||
|
||||
#[test]
|
||||
fn build_scores() {
|
||||
let scores = build_scores_table(RESULTS);
|
||||
|
||||
assert!(["England", "France", "Germany", "Italy", "Poland", "Spain"]
|
||||
.into_iter()
|
||||
.all(|team_name| scores.contains_key(team_name)));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn validate_team_score_1() {
|
||||
let scores = build_scores_table(RESULTS);
|
||||
let team = scores.get("England").unwrap();
|
||||
assert_eq!(team.goals_scored, 6);
|
||||
assert_eq!(team.goals_conceded, 4);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn validate_team_score_2() {
|
||||
let scores = build_scores_table(RESULTS);
|
||||
let team = scores.get("Spain").unwrap();
|
||||
assert_eq!(team.goals_scored, 0);
|
||||
assert_eq!(team.goals_conceded, 3);
|
||||
}
|
||||
}
|
||||
21
exercises/12_options/README.md
Normal file
21
exercises/12_options/README.md
Normal file
@@ -0,0 +1,21 @@
|
||||
# Options
|
||||
|
||||
Type Option represents an optional value: every Option is either Some and contains a value, or None, and does not.
|
||||
Option types are very common in Rust code, as they have a number of uses:
|
||||
|
||||
- Initial values
|
||||
- Return values for functions that are not defined over their entire input range (partial functions)
|
||||
- Return value for otherwise reporting simple errors, where None is returned on error
|
||||
- Optional struct fields
|
||||
- Struct fields that can be loaned or "taken"
|
||||
- Optional function arguments
|
||||
- Nullable pointers
|
||||
- Swapping things out of difficult situations
|
||||
|
||||
## Further Information
|
||||
|
||||
- [Option Enum Format](https://doc.rust-lang.org/book/ch10-01-syntax.html#in-enum-definitions)
|
||||
- [Option Module Documentation](https://doc.rust-lang.org/std/option/)
|
||||
- [Option Enum Documentation](https://doc.rust-lang.org/std/option/enum.Option.html)
|
||||
- [if let](https://doc.rust-lang.org/rust-by-example/flow_control/if_let.html)
|
||||
- [while let](https://doc.rust-lang.org/rust-by-example/flow_control/while_let.html)
|
||||
36
exercises/12_options/options1.rs
Normal file
36
exercises/12_options/options1.rs
Normal file
@@ -0,0 +1,36 @@
|
||||
// This function returns how much icecream there is left in the fridge.
|
||||
// If it's before 22:00 (24-hour system), then 5 scoops are left. At 22:00,
|
||||
// someone eats it all, so no icecream is left (value 0). Return `None` if
|
||||
// `hour_of_day` is higher than 23.
|
||||
fn maybe_icecream(hour_of_day: u16) -> Option<u16> {
|
||||
// TODO: Complete the function body.
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// You can optionally experiment here.
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn raw_value() {
|
||||
// TODO: Fix this test. How do you get the value contained in the
|
||||
// Option?
|
||||
let icecreams = maybe_icecream(12);
|
||||
|
||||
assert_eq!(icecreams, 5); // Don't change this line.
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn check_icecream() {
|
||||
assert_eq!(maybe_icecream(0), Some(5));
|
||||
assert_eq!(maybe_icecream(9), Some(5));
|
||||
assert_eq!(maybe_icecream(18), Some(5));
|
||||
assert_eq!(maybe_icecream(22), Some(0));
|
||||
assert_eq!(maybe_icecream(23), Some(0));
|
||||
assert_eq!(maybe_icecream(24), None);
|
||||
assert_eq!(maybe_icecream(25), None);
|
||||
}
|
||||
}
|
||||
39
exercises/12_options/options2.rs
Normal file
39
exercises/12_options/options2.rs
Normal file
@@ -0,0 +1,39 @@
|
||||
fn main() {
|
||||
// You can optionally experiment here.
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
#[test]
|
||||
fn simple_option() {
|
||||
let target = "rustlings";
|
||||
let optional_target = Some(target);
|
||||
|
||||
// TODO: Make this an if-let statement whose value is `Some`.
|
||||
word = optional_target {
|
||||
assert_eq!(word, target);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn layered_option() {
|
||||
let range = 10;
|
||||
let mut optional_integers: Vec<Option<i8>> = vec![None];
|
||||
|
||||
for i in 1..=range {
|
||||
optional_integers.push(Some(i));
|
||||
}
|
||||
|
||||
let mut cursor = range;
|
||||
|
||||
// TODO: Make this a while-let statement. Remember that `Vec::pop()`
|
||||
// adds another layer of `Option`. You can do nested pattern matching
|
||||
// in if-let and while-let statements.
|
||||
integer = optional_integers.pop() {
|
||||
assert_eq!(integer, cursor);
|
||||
cursor -= 1;
|
||||
}
|
||||
|
||||
assert_eq!(cursor, 0);
|
||||
}
|
||||
}
|
||||
17
exercises/12_options/options3.rs
Normal file
17
exercises/12_options/options3.rs
Normal file
@@ -0,0 +1,17 @@
|
||||
#[derive(Debug)]
|
||||
struct Point {
|
||||
x: i32,
|
||||
y: i32,
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let optional_point = Some(Point { x: 100, y: 200 });
|
||||
|
||||
// TODO: Fix the compiler error by adding something to this match statement.
|
||||
match optional_point {
|
||||
Some(p) => println!("Co-ordinates are {},{}", p.x, p.y),
|
||||
_ => panic!("No match!"),
|
||||
}
|
||||
|
||||
println!("{optional_point:?}"); // Don't change this line.
|
||||
}
|
||||
12
exercises/13_error_handling/README.md
Normal file
12
exercises/13_error_handling/README.md
Normal file
@@ -0,0 +1,12 @@
|
||||
# Error handling
|
||||
|
||||
Most errors aren’t serious enough to require the program to stop entirely.
|
||||
Sometimes, when a function fails, it’s for a reason that you can easily interpret and respond to.
|
||||
For example, if you try to open a file and that operation fails because the file doesn’t exist, you might want to create the file instead of terminating the process.
|
||||
|
||||
## Further information
|
||||
|
||||
- [Error Handling](https://doc.rust-lang.org/book/ch09-02-recoverable-errors-with-result.html)
|
||||
- [Generics](https://doc.rust-lang.org/book/ch10-01-syntax.html)
|
||||
- [Result](https://doc.rust-lang.org/rust-by-example/error/result.html)
|
||||
- [Boxing errors](https://doc.rust-lang.org/rust-by-example/error/multiple_error_types/boxing_errors.html)
|
||||
41
exercises/13_error_handling/errors1.rs
Normal file
41
exercises/13_error_handling/errors1.rs
Normal file
@@ -0,0 +1,41 @@
|
||||
// TODO: This function refuses to generate text to be printed on a nametag if
|
||||
// you pass it an empty string. It'd be nicer if it explained what the problem
|
||||
// was instead of just returning `None`. Thankfully, Rust has a similar
|
||||
// construct to `Option` that can be used to express error conditions. Change
|
||||
// the function signature and body to return `Result<String, String>` instead
|
||||
// of `Option<String>`.
|
||||
fn generate_nametag_text(name: String) -> Option<String> {
|
||||
if name.is_empty() {
|
||||
// Empty names aren't allowed
|
||||
None
|
||||
} else {
|
||||
Some(format!("Hi! My name is {name}"))
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// You can optionally experiment here.
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn generates_nametag_text_for_a_nonempty_name() {
|
||||
assert_eq!(
|
||||
generate_nametag_text("Beyoncé".to_string()).as_deref(),
|
||||
Ok("Hi! My name is Beyoncé"),
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn explains_why_generating_nametag_text_fails() {
|
||||
assert_eq!(
|
||||
generate_nametag_text(String::new())
|
||||
.as_ref()
|
||||
.map_err(|e| e.as_str()),
|
||||
Err("Empty names aren't allowed"),
|
||||
);
|
||||
}
|
||||
}
|
||||
50
exercises/13_error_handling/errors2.rs
Normal file
50
exercises/13_error_handling/errors2.rs
Normal file
@@ -0,0 +1,50 @@
|
||||
// Say we're writing a game where you can buy items with tokens. All items cost
|
||||
// 5 tokens, and whenever you purchase items there is a processing fee of 1
|
||||
// token. A player of the game will type in how many items they want to buy, and
|
||||
// the `total_cost` function will calculate the total cost of the items. Since
|
||||
// the player typed in the quantity, we get it as a string. They might have
|
||||
// typed anything, not just numbers!
|
||||
//
|
||||
// Right now, this function isn't handling the error case at all. What we want
|
||||
// to do is: If we call the `total_cost` function on a string that is not a
|
||||
// number, that function will return a `ParseIntError`. In that case, we want to
|
||||
// immediately return that error from our function and not try to multiply and
|
||||
// add.
|
||||
//
|
||||
// There are at least two ways to implement this that are both correct. But one
|
||||
// is a lot shorter!
|
||||
|
||||
use std::num::ParseIntError;
|
||||
|
||||
fn total_cost(item_quantity: &str) -> Result<i32, ParseIntError> {
|
||||
let processing_fee = 1;
|
||||
let cost_per_item = 5;
|
||||
|
||||
// TODO: Handle the error case as described above.
|
||||
let qty = item_quantity.parse::<i32>();
|
||||
|
||||
Ok(qty * cost_per_item + processing_fee)
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// You can optionally experiment here.
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use std::num::IntErrorKind;
|
||||
|
||||
#[test]
|
||||
fn item_quantity_is_a_valid_number() {
|
||||
assert_eq!(total_cost("34"), Ok(171));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn item_quantity_is_an_invalid_number() {
|
||||
assert_eq!(
|
||||
total_cost("beep boop").unwrap_err().kind(),
|
||||
&IntErrorKind::InvalidDigit,
|
||||
);
|
||||
}
|
||||
}
|
||||
31
exercises/13_error_handling/errors3.rs
Normal file
31
exercises/13_error_handling/errors3.rs
Normal file
@@ -0,0 +1,31 @@
|
||||
// This is a program that is trying to use a completed version of the
|
||||
// `total_cost` function from the previous exercise. It's not working though!
|
||||
// Why not? What should we do to fix it?
|
||||
|
||||
use std::num::ParseIntError;
|
||||
|
||||
// Don't change this function.
|
||||
fn total_cost(item_quantity: &str) -> Result<i32, ParseIntError> {
|
||||
let processing_fee = 1;
|
||||
let cost_per_item = 5;
|
||||
let qty = item_quantity.parse::<i32>()?;
|
||||
|
||||
Ok(qty * cost_per_item + processing_fee)
|
||||
}
|
||||
|
||||
// TODO: Fix the compiler error by changing the signature and body of the
|
||||
// `main` function.
|
||||
fn main() {
|
||||
let mut tokens = 100;
|
||||
let pretend_user_input = "8";
|
||||
|
||||
// Don't change this line.
|
||||
let cost = total_cost(pretend_user_input)?;
|
||||
|
||||
if cost > tokens {
|
||||
println!("You can't afford that many!");
|
||||
} else {
|
||||
tokens -= cost;
|
||||
println!("You now have {tokens} tokens.");
|
||||
}
|
||||
}
|
||||
37
exercises/13_error_handling/errors4.rs
Normal file
37
exercises/13_error_handling/errors4.rs
Normal file
@@ -0,0 +1,37 @@
|
||||
#[derive(PartialEq, Debug)]
|
||||
enum CreationError {
|
||||
Negative,
|
||||
Zero,
|
||||
}
|
||||
|
||||
#[derive(PartialEq, Debug)]
|
||||
struct PositiveNonzeroInteger(u64);
|
||||
|
||||
impl PositiveNonzeroInteger {
|
||||
fn new(value: i64) -> Result<Self, CreationError> {
|
||||
// TODO: This function shouldn't always return an `Ok`.
|
||||
Ok(Self(value as u64))
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// You can optionally experiment here.
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_creation() {
|
||||
assert_eq!(
|
||||
PositiveNonzeroInteger::new(10),
|
||||
Ok(PositiveNonzeroInteger(10)),
|
||||
);
|
||||
assert_eq!(
|
||||
PositiveNonzeroInteger::new(-10),
|
||||
Err(CreationError::Negative),
|
||||
);
|
||||
assert_eq!(PositiveNonzeroInteger::new(0), Err(CreationError::Zero));
|
||||
}
|
||||
}
|
||||
56
exercises/13_error_handling/errors5.rs
Normal file
56
exercises/13_error_handling/errors5.rs
Normal file
@@ -0,0 +1,56 @@
|
||||
// This exercise is an altered version of the `errors4` exercise. It uses some
|
||||
// concepts that we won't get to until later in the course, like `Box` and the
|
||||
// `From` trait. It's not important to understand them in detail right now, but
|
||||
// you can read ahead if you like. For now, think of the `Box<dyn ???>` type as
|
||||
// an "I want anything that does ???" type.
|
||||
//
|
||||
// In short, this particular use case for boxes is for when you want to own a
|
||||
// value and you care only that it is a type which implements a particular
|
||||
// trait. To do so, The `Box` is declared as of type `Box<dyn Trait>` where
|
||||
// `Trait` is the trait the compiler looks for on any value used in that
|
||||
// context. For this exercise, that context is the potential errors which
|
||||
// can be returned in a `Result`.
|
||||
|
||||
use std::error::Error;
|
||||
use std::fmt;
|
||||
|
||||
#[derive(PartialEq, Debug)]
|
||||
enum CreationError {
|
||||
Negative,
|
||||
Zero,
|
||||
}
|
||||
|
||||
// This is required so that `CreationError` can implement `Error`.
|
||||
impl fmt::Display for CreationError {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
let description = match *self {
|
||||
CreationError::Negative => "number is negative",
|
||||
CreationError::Zero => "number is zero",
|
||||
};
|
||||
f.write_str(description)
|
||||
}
|
||||
}
|
||||
|
||||
impl Error for CreationError {}
|
||||
|
||||
#[derive(PartialEq, Debug)]
|
||||
struct PositiveNonzeroInteger(u64);
|
||||
|
||||
impl PositiveNonzeroInteger {
|
||||
fn new(value: i64) -> Result<PositiveNonzeroInteger, CreationError> {
|
||||
match value {
|
||||
x if x < 0 => Err(CreationError::Negative),
|
||||
0 => Err(CreationError::Zero),
|
||||
x => Ok(PositiveNonzeroInteger(x as u64)),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: Add the correct return type `Result<(), Box<dyn ???>>`. What can we
|
||||
// use to describe both errors? Is there a trait which both errors implement?
|
||||
fn main() {
|
||||
let pretend_user_input = "42";
|
||||
let x: i64 = pretend_user_input.parse()?;
|
||||
println!("output={:?}", PositiveNonzeroInteger::new(x)?);
|
||||
Ok(())
|
||||
}
|
||||
89
exercises/13_error_handling/errors6.rs
Normal file
89
exercises/13_error_handling/errors6.rs
Normal file
@@ -0,0 +1,89 @@
|
||||
// Using catch-all error types like `Box<dyn Error>` isn't recommended for
|
||||
// library code where callers might want to make decisions based on the error
|
||||
// content instead of printing it out or propagating it further. Here, we define
|
||||
// a custom error type to make it possible for callers to decide what to do next
|
||||
// when our function returns an error.
|
||||
|
||||
use std::num::ParseIntError;
|
||||
|
||||
#[derive(PartialEq, Debug)]
|
||||
enum CreationError {
|
||||
Negative,
|
||||
Zero,
|
||||
}
|
||||
|
||||
// A custom error type that we will be using in `PositiveNonzeroInteger::parse`.
|
||||
#[derive(PartialEq, Debug)]
|
||||
enum ParsePosNonzeroError {
|
||||
Creation(CreationError),
|
||||
ParseInt(ParseIntError),
|
||||
}
|
||||
|
||||
impl ParsePosNonzeroError {
|
||||
fn from_creation(err: CreationError) -> Self {
|
||||
Self::Creation(err)
|
||||
}
|
||||
|
||||
// TODO: Add another error conversion function here.
|
||||
// fn from_parse_int(???) -> Self { ??? }
|
||||
}
|
||||
|
||||
#[derive(PartialEq, Debug)]
|
||||
struct PositiveNonzeroInteger(u64);
|
||||
|
||||
impl PositiveNonzeroInteger {
|
||||
fn new(value: i64) -> Result<Self, CreationError> {
|
||||
match value {
|
||||
x if x < 0 => Err(CreationError::Negative),
|
||||
0 => Err(CreationError::Zero),
|
||||
x => Ok(Self(x as u64)),
|
||||
}
|
||||
}
|
||||
|
||||
fn parse(s: &str) -> Result<Self, ParsePosNonzeroError> {
|
||||
// TODO: change this to return an appropriate error instead of panicking
|
||||
// when `parse()` returns an error.
|
||||
let x: i64 = s.parse().unwrap();
|
||||
Self::new(x).map_err(ParsePosNonzeroError::from_creation)
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// You can optionally experiment here.
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_parse_error() {
|
||||
assert!(matches!(
|
||||
PositiveNonzeroInteger::parse("not a number"),
|
||||
Err(ParsePosNonzeroError::ParseInt(_)),
|
||||
));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_negative() {
|
||||
assert_eq!(
|
||||
PositiveNonzeroInteger::parse("-555"),
|
||||
Err(ParsePosNonzeroError::Creation(CreationError::Negative)),
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_zero() {
|
||||
assert_eq!(
|
||||
PositiveNonzeroInteger::parse("0"),
|
||||
Err(ParsePosNonzeroError::Creation(CreationError::Zero)),
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_positive() {
|
||||
let x = PositiveNonzeroInteger::new(42).unwrap();
|
||||
assert_eq!(x.0, 42);
|
||||
assert_eq!(PositiveNonzeroInteger::parse("42"), Ok(x));
|
||||
}
|
||||
}
|
||||
11
exercises/14_generics/README.md
Normal file
11
exercises/14_generics/README.md
Normal file
@@ -0,0 +1,11 @@
|
||||
# Generics
|
||||
|
||||
Generics is the topic of generalizing types and functionalities to broader cases.
|
||||
This is extremely useful for reducing code duplication in many ways, but can call for some rather involved syntax.
|
||||
Namely, being generic requires taking great care to specify over which types a generic type is actually considered valid.
|
||||
The simplest and most common use of generics is for type parameters.
|
||||
|
||||
## Further information
|
||||
|
||||
- [Generic Data Types](https://doc.rust-lang.org/book/ch10-01-syntax.html)
|
||||
- [Bounds](https://doc.rust-lang.org/rust-by-example/generics/bounds.html)
|
||||
18
exercises/14_generics/generics1.rs
Normal file
18
exercises/14_generics/generics1.rs
Normal file
@@ -0,0 +1,18 @@
|
||||
// `Vec<T>` is generic over the type `T`. In most cases, the compiler is able to
|
||||
// infer `T`, for example after pushing a value with a concrete type to the vector.
|
||||
// But in this exercise, the compiler needs some help through a type annotation.
|
||||
|
||||
fn main() {
|
||||
// TODO: Fix the compiler error by annotating the type of the vector
|
||||
// `Vec<T>`. Choose `T` as some integer type that can be created from
|
||||
// `u8` and `i8`.
|
||||
let mut numbers = Vec::new();
|
||||
|
||||
// Don't change the lines below.
|
||||
let n1: u8 = 42;
|
||||
numbers.push(n1.into());
|
||||
let n2: i8 = -1;
|
||||
numbers.push(n2.into());
|
||||
|
||||
println!("{numbers:?}");
|
||||
}
|
||||
31
exercises/14_generics/generics2.rs
Normal file
31
exercises/14_generics/generics2.rs
Normal file
@@ -0,0 +1,31 @@
|
||||
// This powerful wrapper provides the ability to store a positive integer value.
|
||||
// TODO: Rewrite it using a generic so that it supports wrapping ANY type.
|
||||
struct Wrapper {
|
||||
value: u32,
|
||||
}
|
||||
|
||||
// TODO: Adapt the struct's implementation to be generic over the wrapped value.
|
||||
impl Wrapper {
|
||||
fn new(value: u32) -> Self {
|
||||
Wrapper { value }
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// You can optionally experiment here.
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn store_u32_in_wrapper() {
|
||||
assert_eq!(Wrapper::new(42).value, 42);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn store_str_in_wrapper() {
|
||||
assert_eq!(Wrapper::new("Foo").value, "Foo");
|
||||
}
|
||||
}
|
||||
19
exercises/15_traits/README.md
Normal file
19
exercises/15_traits/README.md
Normal file
@@ -0,0 +1,19 @@
|
||||
# Traits
|
||||
|
||||
A trait is a collection of methods.
|
||||
|
||||
Data types can implement traits. To do so, the methods making up the trait are defined for the data type. For example, the `String` data type implements the `From<&str>` trait. This allows a user to write `String::from("hello")`.
|
||||
|
||||
In this way, traits are somewhat similar to Java interfaces and C++ abstract classes.
|
||||
|
||||
Some additional common Rust traits include:
|
||||
|
||||
- `Clone` (the `clone` method)
|
||||
- `Display` (which allows formatted display via `{}`)
|
||||
- `Debug` (which allows formatted display via `{:?}`)
|
||||
|
||||
Because traits indicate shared behavior between data types, they are useful when writing generics.
|
||||
|
||||
## Further information
|
||||
|
||||
- [Traits](https://doc.rust-lang.org/book/ch10-02-traits.html)
|
||||
30
exercises/15_traits/traits1.rs
Normal file
30
exercises/15_traits/traits1.rs
Normal file
@@ -0,0 +1,30 @@
|
||||
// The trait `AppendBar` has only one function which appends "Bar" to any object
|
||||
// implementing this trait.
|
||||
trait AppendBar {
|
||||
fn append_bar(self) -> Self;
|
||||
}
|
||||
|
||||
impl AppendBar for String {
|
||||
// TODO: Implement `AppendBar` for the type `String`.
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let s = String::from("Foo");
|
||||
let s = s.append_bar();
|
||||
println!("s: {s}");
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn is_foo_bar() {
|
||||
assert_eq!(String::from("Foo").append_bar(), "FooBar");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn is_bar_bar() {
|
||||
assert_eq!(String::from("").append_bar().append_bar(), "BarBar");
|
||||
}
|
||||
}
|
||||
22
exercises/15_traits/traits2.rs
Normal file
22
exercises/15_traits/traits2.rs
Normal file
@@ -0,0 +1,22 @@
|
||||
trait AppendBar {
|
||||
fn append_bar(self) -> Self;
|
||||
}
|
||||
|
||||
// TODO: Implement the trait `AppendBar` for a vector of strings.
|
||||
// `append_bar` should push the string "Bar" into the vector.
|
||||
|
||||
fn main() {
|
||||
// You can optionally experiment here.
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn is_vec_pop_eq_bar() {
|
||||
let mut foo = vec![String::from("Foo")].append_bar();
|
||||
assert_eq!(foo.pop().unwrap(), "Bar");
|
||||
assert_eq!(foo.pop().unwrap(), "Foo");
|
||||
}
|
||||
}
|
||||
40
exercises/15_traits/traits3.rs
Normal file
40
exercises/15_traits/traits3.rs
Normal file
@@ -0,0 +1,40 @@
|
||||
#![allow(dead_code)]
|
||||
|
||||
trait Licensed {
|
||||
// TODO: Add a default implementation for `licensing_info` so that
|
||||
// implementors like the two structs below can share that default behavior
|
||||
// without repeating the function.
|
||||
// The default license information should be the string "Default license".
|
||||
fn licensing_info(&self) -> String;
|
||||
}
|
||||
|
||||
struct SomeSoftware {
|
||||
version_number: i32,
|
||||
}
|
||||
|
||||
struct OtherSoftware {
|
||||
version_number: String,
|
||||
}
|
||||
|
||||
impl Licensed for SomeSoftware {} // Don't edit this line.
|
||||
impl Licensed for OtherSoftware {} // Don't edit this line.
|
||||
|
||||
fn main() {
|
||||
// You can optionally experiment here.
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn is_licensing_info_the_same() {
|
||||
let licensing_info = "Default license";
|
||||
let some_software = SomeSoftware { version_number: 1 };
|
||||
let other_software = OtherSoftware {
|
||||
version_number: "v2.0.0".to_string(),
|
||||
};
|
||||
assert_eq!(some_software.licensing_info(), licensing_info);
|
||||
assert_eq!(other_software.licensing_info(), licensing_info);
|
||||
}
|
||||
}
|
||||
35
exercises/15_traits/traits4.rs
Normal file
35
exercises/15_traits/traits4.rs
Normal file
@@ -0,0 +1,35 @@
|
||||
trait Licensed {
|
||||
fn licensing_info(&self) -> String {
|
||||
"Default license".to_string()
|
||||
}
|
||||
}
|
||||
|
||||
struct SomeSoftware;
|
||||
struct OtherSoftware;
|
||||
|
||||
impl Licensed for SomeSoftware {}
|
||||
impl Licensed for OtherSoftware {}
|
||||
|
||||
// TODO: Fix the compiler error by only changing the signature of this function.
|
||||
fn compare_license_types(software1: ???, software2: ???) -> bool {
|
||||
software1.licensing_info() == software2.licensing_info()
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// You can optionally experiment here.
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn compare_license_information() {
|
||||
assert!(compare_license_types(SomeSoftware, OtherSoftware));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn compare_license_information_backwards() {
|
||||
assert!(compare_license_types(OtherSoftware, SomeSoftware));
|
||||
}
|
||||
}
|
||||
39
exercises/15_traits/traits5.rs
Normal file
39
exercises/15_traits/traits5.rs
Normal file
@@ -0,0 +1,39 @@
|
||||
trait SomeTrait {
|
||||
fn some_function(&self) -> bool {
|
||||
true
|
||||
}
|
||||
}
|
||||
|
||||
trait OtherTrait {
|
||||
fn other_function(&self) -> bool {
|
||||
true
|
||||
}
|
||||
}
|
||||
|
||||
struct SomeStruct;
|
||||
impl SomeTrait for SomeStruct {}
|
||||
impl OtherTrait for SomeStruct {}
|
||||
|
||||
struct OtherStruct;
|
||||
impl SomeTrait for OtherStruct {}
|
||||
impl OtherTrait for OtherStruct {}
|
||||
|
||||
// TODO: Fix the compiler error by only changing the signature of this function.
|
||||
fn some_func(item: ???) -> bool {
|
||||
item.some_function() && item.other_function()
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// You can optionally experiment here.
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_some_func() {
|
||||
assert!(some_func(SomeStruct));
|
||||
assert!(some_func(OtherStruct));
|
||||
}
|
||||
}
|
||||
22
exercises/16_lifetimes/README.md
Normal file
22
exercises/16_lifetimes/README.md
Normal file
@@ -0,0 +1,22 @@
|
||||
# Lifetimes
|
||||
|
||||
Lifetimes tell the compiler how to check whether references live long
|
||||
enough to be valid in any given situation. For example lifetimes say
|
||||
"make sure parameter 'a' lives as long as parameter 'b' so that the return
|
||||
value is valid".
|
||||
|
||||
They are only necessary on borrows, i.e. references,
|
||||
since copied parameters or moves are owned in their scope and cannot
|
||||
be referenced outside. Lifetimes mean that calling code of e.g. functions
|
||||
can be checked to make sure their arguments are valid. Lifetimes are
|
||||
restrictive of their callers.
|
||||
|
||||
If you'd like to learn more about lifetime annotations, the
|
||||
[lifetimekata](https://tfpk.github.io/lifetimekata/) project
|
||||
has a similar style of exercises to Rustlings, but is all about
|
||||
learning to write lifetime annotations.
|
||||
|
||||
## Further information
|
||||
|
||||
- [Lifetimes (in Rust By Example)](https://doc.rust-lang.org/stable/rust-by-example/scope/lifetime.html)
|
||||
- [Validating References with Lifetimes](https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html)
|
||||
28
exercises/16_lifetimes/lifetimes1.rs
Normal file
28
exercises/16_lifetimes/lifetimes1.rs
Normal file
@@ -0,0 +1,28 @@
|
||||
// The Rust compiler needs to know how to check whether supplied references are
|
||||
// valid, so that it can let the programmer know if a reference is at risk of
|
||||
// going out of scope before it is used. Remember, references are borrows and do
|
||||
// not own their own data. What if their owner goes out of scope?
|
||||
|
||||
// TODO: Fix the compiler error by updating the function signature.
|
||||
fn longest(x: &str, y: &str) -> &str {
|
||||
if x.len() > y.len() {
|
||||
x
|
||||
} else {
|
||||
y
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// You can optionally experiment here.
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_longest() {
|
||||
assert_eq!(longest("abcd", "123"), "abcd");
|
||||
assert_eq!(longest("abc", "1234"), "1234");
|
||||
}
|
||||
}
|
||||
20
exercises/16_lifetimes/lifetimes2.rs
Normal file
20
exercises/16_lifetimes/lifetimes2.rs
Normal file
@@ -0,0 +1,20 @@
|
||||
// Don't change this function.
|
||||
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
|
||||
if x.len() > y.len() {
|
||||
x
|
||||
} else {
|
||||
y
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// TODO: Fix the compiler error by moving one line.
|
||||
|
||||
let string1 = String::from("long string is long");
|
||||
let result;
|
||||
{
|
||||
let string2 = String::from("xyz");
|
||||
result = longest(&string1, &string2);
|
||||
}
|
||||
println!("The longest string is '{result}'");
|
||||
}
|
||||
16
exercises/16_lifetimes/lifetimes3.rs
Normal file
16
exercises/16_lifetimes/lifetimes3.rs
Normal file
@@ -0,0 +1,16 @@
|
||||
// Lifetimes are also needed when structs hold references.
|
||||
|
||||
// TODO: Fix the compiler errors about the struct.
|
||||
struct Book {
|
||||
author: &str,
|
||||
title: &str,
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let book = Book {
|
||||
author: "George Orwell",
|
||||
title: "1984",
|
||||
};
|
||||
|
||||
println!("{} by {}", book.title, book.author);
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
### Tests
|
||||
# Tests
|
||||
|
||||
Going out of order from the book to cover tests -- many of the following exercises will ask you to make tests pass!
|
||||
|
||||
#### Book Sections
|
||||
## Further information
|
||||
|
||||
- [Writing Tests](https://doc.rust-lang.org/stable/book/ch11-01-writing-tests.html)
|
||||
- [Writing Tests](https://doc.rust-lang.org/book/ch11-01-writing-tests.html)
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user