Compare commits
4654 commits
release/1.
...
master
Author | SHA1 | Date | |
---|---|---|---|
![]() |
86b8ca020a | ||
![]() |
37ce57e12a | ||
![]() |
e2618f793e | ||
![]() |
63fe3710e5 | ||
![]() |
6cfd602259 | ||
![]() |
be9e12e0fe | ||
![]() |
01c180d588 | ||
![]() |
54eff3bee1 | ||
![]() |
1fb943b815 | ||
![]() |
35951f0805 | ||
![]() |
6ebda3a1d6 | ||
![]() |
b65e0fed53 | ||
![]() |
903382fd29 | ||
![]() |
1cdbe02e3d | ||
![]() |
347ce97ea7 | ||
![]() |
7c118ee1b0 | ||
![]() |
1c789aba1e | ||
![]() |
02ded513a7 | ||
![]() |
3f1b02fe0c | ||
![]() |
ebc489bcc7 | ||
![]() |
85a65da878 | ||
![]() |
85f3d449be | ||
![]() |
5ee0fe016f | ||
![]() |
631f56386c | ||
![]() |
07f954cc72 | ||
![]() |
af8a521aec | ||
![]() |
fbd3c79674 | ||
![]() |
cb08a35bf9 | ||
![]() |
ba49f81af6 | ||
![]() |
dac6783a0e | ||
![]() |
c2fd750ad5 | ||
![]() |
948e14fe5e | ||
![]() |
954f1e6b1b | ||
![]() |
07bb84318d | ||
![]() |
72603c5bef | ||
![]() |
741ea0612a | ||
![]() |
613625c5bf | ||
![]() |
37d49a990c | ||
![]() |
6ca60c074c | ||
![]() |
ecd84c6b87 | ||
![]() |
672442b8ab | ||
![]() |
23d7166012 | ||
![]() |
1a31bc2a5a | ||
![]() |
5f8c858658 | ||
![]() |
b0c2c48dd3 | ||
![]() |
c93ec2447c | ||
![]() |
38a7400536 | ||
![]() |
73b849da84 | ||
![]() |
e9c9cf3f82 | ||
![]() |
8e0b5e4b58 | ||
![]() |
c8e398bba2 | ||
![]() |
55c4e5e32e | ||
![]() |
c1b62da1c5 | ||
![]() |
959a235799 | ||
![]() |
a22152e1ab | ||
![]() |
9b3e95eff3 | ||
![]() |
3970c634a6 | ||
![]() |
13ed737818 | ||
![]() |
21c668491e | ||
![]() |
a30b223180 | ||
![]() |
f1df983b87 | ||
![]() |
8d8fb10397 | ||
![]() |
cf446c00f1 | ||
![]() |
7ae9219fc7 | ||
![]() |
2be2063a36 | ||
![]() |
c50b1bad25 | ||
![]() |
d9a709ffff | ||
![]() |
4619f9fbd8 | ||
![]() |
c0ed43ff9b | ||
![]() |
31d47a7926 | ||
![]() |
9dac3a27c2 | ||
![]() |
2207328611 | ||
![]() |
e6775a462a | ||
![]() |
e0c4e972d0 | ||
![]() |
cf313dce4d | ||
![]() |
feb4e3d850 | ||
![]() |
3b4fccd6a2 | ||
![]() |
a82644e263 | ||
![]() |
76f3326b58 | ||
![]() |
3e93fe428c | ||
![]() |
21e20afc05 | ||
![]() |
446b38ba30 | ||
![]() |
26c89feaea | ||
![]() |
eda316eb3c | ||
![]() |
b944e9d0af | ||
![]() |
a7c182f640 | ||
![]() |
d90e7c9cdd | ||
![]() |
d9a62bb066 | ||
![]() |
264135ab92 | ||
![]() |
c316a7839e | ||
![]() |
c8e4a2b63f | ||
![]() |
3653ab0f05 | ||
![]() |
60fa414d9b | ||
![]() |
ef0ed38639 | ||
![]() |
b09a69e51d | ||
![]() |
2ec258e664 | ||
![]() |
3176efc8c3 | ||
![]() |
e2ed80ba92 | ||
![]() |
3e3f351c71 | ||
![]() |
7f029b7a84 | ||
![]() |
e2e735afee | ||
![]() |
31b627032b | ||
![]() |
14b08809a4 | ||
![]() |
75cac6a570 | ||
![]() |
41208f88b6 | ||
![]() |
6379e31b3c | ||
![]() |
9c1e6d8f7a | ||
![]() |
14759b5fa9 | ||
![]() |
c42a820909 | ||
![]() |
31e5daf720 | ||
![]() |
da4f11d1f6 | ||
![]() |
ecf1d9df60 | ||
![]() |
507f9f8a4f | ||
![]() |
9463f3d7fe | ||
![]() |
ff4195681c | ||
![]() |
e9f324873c | ||
![]() |
95ab5a82a3 | ||
![]() |
5a4924e93b | ||
![]() |
75aee1c8ed | ||
![]() |
052181a4d0 | ||
![]() |
b5c3005a8b | ||
![]() |
32b46c27fd | ||
![]() |
5f6153e8b3 | ||
![]() |
1cf3d6a9f9 | ||
![]() |
4ccef836f4 | ||
![]() |
8191057748 | ||
![]() |
40bda9b126 | ||
![]() |
07c41546bf | ||
![]() |
a895f2a66c | ||
![]() |
38b377716f | ||
![]() |
72f00d38e9 | ||
![]() |
69b6aeaa1a | ||
![]() |
f34a33bcdf | ||
![]() |
e33a382707 | ||
![]() |
bd652ae4bc | ||
![]() |
9c7d0dcaa2 | ||
![]() |
ac06fa3967 | ||
![]() |
ae97418566 | ||
![]() |
84a149ad2a | ||
![]() |
b72608b3d1 | ||
![]() |
60e2f0b118 | ||
![]() |
03be4c471d | ||
![]() |
ce441a5a95 | ||
![]() |
f81d8cbded | ||
![]() |
584ba2ba51 | ||
![]() |
d4536dfd62 | ||
![]() |
0bcdaac563 | ||
![]() |
1b02a87463 | ||
![]() |
f4bfef1d08 | ||
![]() |
a264684885 | ||
![]() |
f17431a549 | ||
![]() |
ed9e89374f | ||
![]() |
7fb6b20994 | ||
![]() |
70b6b35fb2 | ||
![]() |
aa631cd482 | ||
![]() |
fc05a1c8c7 | ||
![]() |
4be5b21b16 | ||
![]() |
61c3962ac4 | ||
![]() |
a906be5d39 | ||
![]() |
07e9943f06 | ||
![]() |
2ecc9a8a6e | ||
![]() |
b39a5c94c5 | ||
![]() |
fc899399f1 | ||
![]() |
f36ff660b3 | ||
![]() |
bf7dba5e00 | ||
![]() |
a269729e23 | ||
![]() |
9f94ad12d3 | ||
![]() |
08845d165f | ||
![]() |
eb80b4e933 | ||
![]() |
df6cb3a77d | ||
![]() |
99e188db8f | ||
![]() |
bde443481f | ||
![]() |
e37032b533 | ||
![]() |
99b6761acf | ||
![]() |
214a383923 | ||
![]() |
23b5396130 | ||
![]() |
f48d43a75d | ||
![]() |
6f173be21b | ||
![]() |
0813af3494 | ||
![]() |
8ba4bfb5e7 | ||
![]() |
f6b413ca8e | ||
![]() |
545d274a8b | ||
![]() |
4e0dff6956 | ||
![]() |
f9c60cbd39 | ||
![]() |
307ed338c8 | ||
![]() |
e448362352 | ||
![]() |
453841d9da | ||
![]() |
69b0736fd5 | ||
![]() |
37c8921a89 | ||
![]() |
bc645e5768 | ||
![]() |
4753d62816 | ||
![]() |
036e5369f3 | ||
![]() |
0a847be8bb | ||
![]() |
e0a2e2a0b6 | ||
![]() |
33c506e8be | ||
![]() |
1369ac07b4 | ||
![]() |
62bcad5563 | ||
![]() |
f308216bbc | ||
![]() |
b341b84894 | ||
![]() |
5bf34b0db4 | ||
![]() |
dfa2cc4fff | ||
![]() |
30fce55d38 | ||
![]() |
05b5a3602d | ||
![]() |
45f91bbacd | ||
![]() |
dd0e3d36f7 | ||
![]() |
0783c794ac | ||
![]() |
02d64b1a15 | ||
![]() |
c18049309a | ||
![]() |
d1c9169c14 | ||
![]() |
fee2151054 | ||
![]() |
3212986ca7 | ||
![]() |
9b3064684a | ||
![]() |
2913e1142d | ||
![]() |
76719f5c36 | ||
![]() |
9c201803bc | ||
![]() |
f9db4bd7b3 | ||
![]() |
8dbc6af3ef | ||
![]() |
df48c86d98 | ||
![]() |
a905e9e155 | ||
![]() |
a32a8870ee | ||
![]() |
b244cfc7b2 | ||
![]() |
740bc9b262 | ||
![]() |
521e83e2a4 | ||
![]() |
dec2925343 | ||
![]() |
1da11c6d3c | ||
![]() |
4cd13d674f | ||
![]() |
21bca12e36 | ||
![]() |
dd97d564be | ||
![]() |
5fc2287150 | ||
![]() |
8eb4fdf28f | ||
![]() |
65edbd26a6 | ||
![]() |
c7cc2680aa | ||
![]() |
66d7920058 | ||
![]() |
89849b8014 | ||
![]() |
6c67b53241 | ||
![]() |
6554f9298b | ||
![]() |
0e1af867f3 | ||
![]() |
614b12fb83 | ||
![]() |
5adac2162a | ||
![]() |
183d9dab83 | ||
![]() |
dc44d99f82 | ||
![]() |
33a58eb09a | ||
![]() |
6b01821091 | ||
![]() |
ae7455c886 | ||
![]() |
6c8aaceb65 | ||
![]() |
646a7ef701 | ||
![]() |
ec5b70c9be | ||
![]() |
7108fae2cf | ||
![]() |
f3b8e74df4 | ||
![]() |
92dbc7e241 | ||
![]() |
2232d22259 | ||
![]() |
285de02411 | ||
![]() |
1852c6207c | ||
![]() |
1a920a6ac7 | ||
![]() |
e7f5d7fb7d | ||
![]() |
628c18e6d2 | ||
![]() |
73ac14df36 | ||
![]() |
fcb1275325 | ||
![]() |
1b20e8f31b | ||
![]() |
72f3b5b8f9 | ||
![]() |
0a144e3fde | ||
![]() |
2db852e202 | ||
![]() |
dad6b2dae0 | ||
![]() |
cddaa86dba | ||
![]() |
d5a7620683 | ||
![]() |
30c4d10967 | ||
![]() |
6bcc071f9e | ||
![]() |
2cdeae95c7 | ||
![]() |
19a7a63359 | ||
![]() |
adbb804164 | ||
![]() |
51f730416f | ||
![]() |
2521952812 | ||
![]() |
84b3fd1365 | ||
![]() |
6514d71190 | ||
![]() |
942441696b | ||
![]() |
0e348b3667 | ||
![]() |
f104de5138 | ||
![]() |
d004956894 | ||
![]() |
06a16ff44a | ||
![]() |
1e3e595044 | ||
![]() |
44727f31f6 | ||
![]() |
972a0a0add | ||
![]() |
140db317a7 | ||
![]() |
3e74b2cb6f | ||
![]() |
1e799c5ce7 | ||
![]() |
fc447cbdfd | ||
![]() |
dc1fe2d972 | ||
![]() |
32901de236 | ||
![]() |
7e519b793a | ||
![]() |
f46653ed9e | ||
![]() |
4426b8cd8f | ||
![]() |
a6d1663642 | ||
![]() |
e93b27d3e2 | ||
![]() |
e3ca5052f4 | ||
![]() |
a602ae7d49 | ||
![]() |
e35f7afbb8 | ||
![]() |
a3482c920e | ||
![]() |
ed1e63b603 | ||
![]() |
3625f752e7 | ||
![]() |
4a2e772112 | ||
![]() |
b3f33789f3 | ||
![]() |
aca6fc29e3 | ||
![]() |
ab6e95415e | ||
![]() |
bdd38b45b1 | ||
![]() |
f74680a217 | ||
![]() |
e37d2a612d | ||
![]() |
a9d80d89e7 | ||
![]() |
987f030f57 | ||
![]() |
5de0be3d51 | ||
![]() |
177ccc9294 | ||
![]() |
55048e1f7a | ||
![]() |
cf3b6a032e | ||
![]() |
c85074b573 | ||
![]() |
8c8a5a460e | ||
![]() |
f737a5bcc3 | ||
![]() |
c36ab4454b | ||
![]() |
7aaf245675 | ||
![]() |
b197cff876 | ||
![]() |
10bebccab6 | ||
![]() |
4970646f4b | ||
![]() |
cae1461209 | ||
![]() |
f6d65deff8 | ||
![]() |
94c82935ad | ||
![]() |
c83e8fba8f | ||
![]() |
5c6a8fe4e4 | ||
![]() |
8032eac51a | ||
![]() |
69f65376a7 | ||
![]() |
73856e4a0c | ||
![]() |
0cc28520dc | ||
![]() |
9243ce2df0 | ||
![]() |
e10a83b49b | ||
![]() |
4476f328b5 | ||
![]() |
3abb79611d | ||
![]() |
1673ddbabf | ||
![]() |
33dd21bd94 | ||
![]() |
8492bbd2eb | ||
![]() |
dc9c8c1be2 | ||
![]() |
fe4213beda | ||
![]() |
3b7ce0c8a4 | ||
![]() |
cb3223c267 | ||
![]() |
2d6e103928 | ||
![]() |
c32f77e58e | ||
![]() |
62c88baf7f | ||
![]() |
b68f9ec27c | ||
![]() |
36afea6993 | ||
![]() |
653183df6a | ||
![]() |
cc5e4216a7 | ||
![]() |
9f47ac91c4 | ||
![]() |
ef2adf3cc8 | ||
![]() |
7b05fa8092 | ||
![]() |
db48bcdabf | ||
![]() |
b467550004 | ||
![]() |
5307242b44 | ||
![]() |
a722811b07 | ||
![]() |
1e8c2ae5b9 | ||
![]() |
4d959f0bb2 | ||
![]() |
da410470c3 | ||
![]() |
a6a681c5bc | ||
![]() |
093164e392 | ||
![]() |
796ffc9def | ||
![]() |
1689ca8593 | ||
![]() |
d2299a8c7b | ||
![]() |
6fa368c309 | ||
![]() |
58e862a096 | ||
![]() |
3d4a2bea11 | ||
![]() |
bfb82bb207 | ||
![]() |
8129b01afe | ||
![]() |
639aa06ec2 | ||
![]() |
5b34d2ff29 | ||
![]() |
909be12c1e | ||
![]() |
dbe9ceea19 | ||
![]() |
c3da354abd | ||
![]() |
f798b534e5 | ||
![]() |
93b5125b69 | ||
![]() |
73f472e997 | ||
![]() |
77ed294bfd | ||
![]() |
88f363eca4 | ||
![]() |
9c14020d43 | ||
![]() |
c696b3c412 | ||
![]() |
b1c1ffa56c | ||
![]() |
2e2a839c3f | ||
![]() |
e7feede471 | ||
![]() |
e06d7ed223 | ||
![]() |
40456dda9a | ||
![]() |
d23eec12ab | ||
![]() |
b5289fdcb7 | ||
![]() |
1dc2a2fcf3 | ||
![]() |
b88c11a7f3 | ||
![]() |
d299c78bc8 | ||
![]() |
4d68ae00d5 | ||
![]() |
a6908b607e | ||
![]() |
1db08602e6 | ||
![]() |
5bb81033a1 | ||
![]() |
9f7c638b16 | ||
![]() |
22a7419c40 | ||
![]() |
690b82c4a8 | ||
![]() |
88c4986113 | ||
![]() |
a04a4df3ad | ||
![]() |
0a7fcb1834 | ||
![]() |
89a36a6383 | ||
![]() |
3a9496a90e | ||
![]() |
72dee067ff | ||
![]() |
4e50d51a12 | ||
![]() |
ee1a65cb68 | ||
![]() |
41b4fa390d | ||
![]() |
91a3a79693 | ||
![]() |
748c929844 | ||
![]() |
8fd165bd35 | ||
![]() |
a6e6b99d25 | ||
![]() |
b70b40a8ff | ||
![]() |
769eb45489 | ||
![]() |
d997a04f7a | ||
![]() |
3cc74f096d | ||
![]() |
ff8575dbb3 | ||
![]() |
9f0a1fa303 | ||
![]() |
b2b5295e6a | ||
![]() |
18a71f1554 | ||
![]() |
9d3ef12f06 | ||
![]() |
880ee55054 | ||
![]() |
b69ed15e95 | ||
![]() |
d339d77347 | ||
![]() |
4fa7a81dd4 | ||
![]() |
80241a4355 | ||
![]() |
392b29dbfb | ||
![]() |
471b999164 | ||
![]() |
ed06e9c2b7 | ||
![]() |
04523a74d9 | ||
![]() |
9d0afd6df1 | ||
![]() |
5cd31a397d | ||
![]() |
a22a4d4175 | ||
![]() |
2f2e4b79b9 | ||
![]() |
fa1fb80c87 | ||
![]() |
e4e1616159 | ||
![]() |
16038b3896 | ||
![]() |
dff13408f8 | ||
![]() |
ca12a07896 | ||
![]() |
3458ee2893 | ||
![]() |
d993fb322a | ||
![]() |
48d5e25d03 | ||
![]() |
1a8204254a | ||
![]() |
e37a8a4172 | ||
![]() |
8356cc3fc6 | ||
![]() |
f882af5fa0 | ||
![]() |
010ee1b65c | ||
![]() |
3c62268861 | ||
![]() |
5184e54e43 | ||
![]() |
739a300c5f | ||
![]() |
41b5cd2573 | ||
![]() |
bfaf99afeb | ||
![]() |
9979455652 | ||
![]() |
d04e250d95 | ||
![]() |
ba04717ea5 | ||
![]() |
6a4350cf18 | ||
![]() |
a5f3b1ff48 | ||
![]() |
ea15032c4e | ||
![]() |
cae00c41a2 | ||
![]() |
99f64edc1b | ||
![]() |
1d547bc639 | ||
![]() |
d87b484d0f | ||
![]() |
70704adade | ||
![]() |
ac7e4cc7aa | ||
![]() |
20e4ebb970 | ||
![]() |
d40c2c12a0 | ||
![]() |
a9cd7c825d | ||
![]() |
3cbf97dff5 | ||
![]() |
cbd77a197c | ||
![]() |
25ad0f7763 | ||
![]() |
eca455d0e3 | ||
![]() |
3813e250de | ||
![]() |
a6c57e51b7 | ||
![]() |
e3e99d20b9 | ||
![]() |
8ab758ccda | ||
![]() |
bc5698a6cc | ||
![]() |
83ffa724d1 | ||
![]() |
cde01d1166 | ||
![]() |
3647be1a9a | ||
![]() |
e2b41ece50 | ||
![]() |
a0d3edc8f8 | ||
![]() |
8b6c667f5c | ||
![]() |
3a98e968c3 | ||
![]() |
6716f1dcce | ||
![]() |
3ca4094224 | ||
![]() |
b9e6618f4c | ||
![]() |
fbc9fbcf68 | ||
![]() |
4db7aaea65 | ||
![]() |
b6fe147df6 | ||
![]() |
a7ff610aa7 | ||
![]() |
e5f109eddb | ||
![]() |
75062a12f3 | ||
![]() |
205fde5fc8 | ||
![]() |
9a0848b305 | ||
![]() |
1e37ba0992 | ||
![]() |
6376a5518a | ||
![]() |
b994f3e1a2 | ||
![]() |
7f5b5e5b5b | ||
![]() |
b45b4c8165 | ||
![]() |
648fe19749 | ||
![]() |
a461ef9c2a | ||
![]() |
67b98d4198 | ||
![]() |
ea9c4a53dd | ||
![]() |
723941c789 | ||
![]() |
aae61dbbf9 | ||
![]() |
b79c3ea3d0 | ||
![]() |
556220ffa0 | ||
![]() |
0ea3ca075b | ||
![]() |
bfdb72194c | ||
![]() |
6e16361c8f | ||
![]() |
fe01f96e17 | ||
![]() |
0fcc61afd8 | ||
![]() |
3cd753b0ed | ||
![]() |
4a296d638c | ||
![]() |
53fd0c42ff | ||
![]() |
976ef1438d | ||
![]() |
5e4cc8ca15 | ||
![]() |
821eca52ec | ||
![]() |
0355fec95b | ||
![]() |
9692cafbcc | ||
![]() |
d114afe764 | ||
![]() |
36afb88de5 | ||
![]() |
b9b0e0e996 | ||
![]() |
1da3c575bd | ||
![]() |
55b8618d14 | ||
![]() |
8d582b2bc3 | ||
![]() |
903778e71c | ||
![]() |
dc2a78ba64 | ||
![]() |
86aa6524f6 | ||
![]() |
a186f73e68 | ||
![]() |
b9efe59200 | ||
![]() |
06766a57f6 | ||
![]() |
6b3e78dbf5 | ||
![]() |
1d3dbdde98 | ||
![]() |
b1ad06728d | ||
![]() |
02209337b2 | ||
![]() |
4617b2fdc8 | ||
![]() |
dddf593ea8 | ||
![]() |
741d31a5ef | ||
![]() |
66f447c457 | ||
![]() |
454a839570 | ||
![]() |
f9a82ef70d | ||
![]() |
286d53a233 | ||
![]() |
013a8bff64 | ||
![]() |
b9e3c769d9 | ||
![]() |
27ae865a74 | ||
![]() |
1e9c5eb441 | ||
![]() |
1d2c40c5e7 | ||
![]() |
3371a2e259 | ||
![]() |
a77283d9c1 | ||
![]() |
5362b77c06 | ||
![]() |
c7a2e163b3 | ||
![]() |
c677df8c51 | ||
![]() |
4018bfc19c | ||
![]() |
1e79d8c89b | ||
![]() |
aa380bbf8e | ||
![]() |
fa5a5b5560 | ||
![]() |
98def409a5 | ||
![]() |
6f826ba205 | ||
![]() |
ea0e6c1654 | ||
![]() |
2523cb1f74 | ||
![]() |
f4efb65025 | ||
![]() |
2714fb58ba | ||
![]() |
08844e26d6 | ||
![]() |
996f2b2ce7 | ||
![]() |
1423c2d4ca | ||
![]() |
37769da70f | ||
![]() |
b312620048 | ||
![]() |
a2337e6c8d | ||
![]() |
ebb941cfd7 | ||
![]() |
65b2b4b3b6 | ||
![]() |
5ff930300f | ||
![]() |
324fa1f508 | ||
![]() |
9401e0247d | ||
![]() |
63db135510 | ||
![]() |
babf24e713 | ||
![]() |
0e2a31c2cd | ||
![]() |
513ecb378e | ||
![]() |
6900af0243 | ||
![]() |
49b21a17fe | ||
![]() |
5ec3a3e6f1 | ||
![]() |
1b22bcefaa | ||
![]() |
06d138866f | ||
![]() |
e27af86866 | ||
![]() |
d047a5f2d5 | ||
![]() |
2d371550f2 | ||
![]() |
37bc8e9b99 | ||
![]() |
1f0e5023cc | ||
![]() |
2acf368a25 | ||
![]() |
9a9fad3b45 | ||
![]() |
8b86a9975b | ||
![]() |
b1b582386b | ||
![]() |
0b54c9e288 | ||
![]() |
4db8c09d77 | ||
![]() |
0423b423f9 | ||
![]() |
73d483af93 | ||
![]() |
8a19cf1ed1 | ||
![]() |
6bff5cf0d8 | ||
![]() |
93785776a6 | ||
![]() |
e9aa3240e7 | ||
![]() |
b10c432641 | ||
![]() |
c0bda40378 | ||
![]() |
8e7b05f3dd | ||
![]() |
e580b3c5fd | ||
![]() |
b76b47f64e | ||
![]() |
47d821ad2a | ||
![]() |
d435a7fd05 | ||
![]() |
8f47f60f01 | ||
![]() |
776c3a4c02 | ||
![]() |
cf8d82462f | ||
![]() |
81be04f15e | ||
![]() |
9fdb07af1a | ||
![]() |
1ee979413f | ||
![]() |
844a8e38bb | ||
![]() |
c840050c78 | ||
![]() |
ce5adbe4ba | ||
![]() |
48acd5ce41 | ||
![]() |
45b7c3230c | ||
![]() |
0800654747 | ||
![]() |
7369405dd9 | ||
![]() |
0c0d440a34 | ||
![]() |
1cb01cd7f1 | ||
![]() |
cf92e27ada | ||
![]() |
6077da39d0 | ||
![]() |
8990d35507 | ||
![]() |
cada8020bc | ||
![]() |
013a9b45fd | ||
![]() |
66485af890 | ||
![]() |
eb75e974c7 | ||
![]() |
45135da784 | ||
![]() |
95f74cf844 | ||
![]() |
70b98b7acd | ||
![]() |
497c7db6a2 | ||
![]() |
72f2793421 | ||
![]() |
769ef1f03f | ||
![]() |
5a649869f4 | ||
![]() |
a5017b45e1 | ||
![]() |
ca93af9b66 | ||
![]() |
0fb6a43feb | ||
![]() |
259befa376 | ||
![]() |
f3a07a36d8 | ||
![]() |
93e19a702e | ||
![]() |
c57c0c44b4 | ||
![]() |
d95fbf74fc | ||
![]() |
05edb0dbf4 | ||
![]() |
c25b87e4eb | ||
![]() |
e7c7f9649c | ||
![]() |
ab6769df72 | ||
![]() |
f0bcbbb8f1 | ||
![]() |
16ea7b06d0 | ||
![]() |
ed07fc6254 | ||
![]() |
d105a1d105 | ||
![]() |
f56e223555 | ||
![]() |
e5399eb119 | ||
![]() |
e25dcc2520 | ||
![]() |
4c7788e011 | ||
![]() |
1a2c5872d2 | ||
![]() |
5b8f2e7af2 | ||
![]() |
9dcad22f69 | ||
![]() |
a21ee9e82f | ||
![]() |
e35cb755cf | ||
![]() |
f5be1a37cc | ||
![]() |
291d53f4d7 | ||
![]() |
5f543b227e | ||
![]() |
502d5b4a75 | ||
![]() |
36db11b14a | ||
![]() |
14a1362ba8 | ||
![]() |
27e9f4d091 | ||
![]() |
d45b9cadc7 | ||
![]() |
03fc9382e5 | ||
![]() |
623125b157 | ||
![]() |
eb066d52c3 | ||
![]() |
dcfe85bed7 | ||
![]() |
662d253303 | ||
![]() |
d5972c5edb | ||
![]() |
58c0dd2ff3 | ||
![]() |
1f9bfe300c | ||
![]() |
6da51724a3 | ||
![]() |
fbd8738ade | ||
![]() |
20d25f2235 | ||
![]() |
78eef8db5b | ||
![]() |
ffd67fbce8 | ||
![]() |
6d5f23cb19 | ||
![]() |
2679235bb7 | ||
![]() |
d34ed08052 | ||
![]() |
bafeef2fd4 | ||
![]() |
b686046687 | ||
![]() |
7a9cc237e6 | ||
![]() |
c4495442ca | ||
![]() |
3776dedd8c | ||
![]() |
4757b86ddb | ||
![]() |
024c93d822 | ||
![]() |
55f0b5790f | ||
![]() |
971f7123b5 | ||
![]() |
1559e0e5fb | ||
![]() |
124c882f9b | ||
![]() |
92c2966a52 | ||
![]() |
f7501e95b2 | ||
![]() |
31de21585d | ||
![]() |
b9520cc019 | ||
![]() |
83f49214e1 | ||
![]() |
5bece5c274 | ||
![]() |
ba0b7c776b | ||
![]() |
068800ccdc | ||
![]() |
65c69a1510 | ||
![]() |
4b9037d08b | ||
![]() |
6e855c8fe3 | ||
![]() |
34cd608d16 | ||
![]() |
223339fe92 | ||
![]() |
82f23b100c | ||
![]() |
c060c13f30 | ||
![]() |
f98e234b4d | ||
![]() |
fe89b373fe | ||
![]() |
6539e8b5f9 | ||
![]() |
bba9cf2001 | ||
![]() |
5c6c991f74 | ||
![]() |
d0e31f2326 | ||
![]() |
3a95aa11f1 | ||
![]() |
baececd569 | ||
![]() |
106fbef51b | ||
![]() |
9432644e45 | ||
![]() |
e5e10975d6 | ||
![]() |
2c77200e03 | ||
![]() |
013fa89ce4 | ||
![]() |
1cce51d66d | ||
![]() |
4fbd037eff | ||
![]() |
fe286afc12 | ||
![]() |
6367be7d9b | ||
![]() |
175ab1fcbc | ||
![]() |
5cd196dad0 | ||
![]() |
6d0f63d515 | ||
![]() |
cc29451c93 | ||
![]() |
5fbf5faedf | ||
![]() |
2e7f76d6fc | ||
![]() |
4789bf91c2 | ||
![]() |
eb298ce0de | ||
![]() |
1f476dcaed | ||
![]() |
f82cc987ca | ||
![]() |
d23ce07254 | ||
![]() |
795f50e9ef | ||
![]() |
75cfac4667 | ||
![]() |
51a9e19250 | ||
![]() |
ae9cd8376d | ||
![]() |
da6bd03491 | ||
![]() |
19a10f3d52 | ||
![]() |
fad6a6dd77 | ||
![]() |
320c74c9f4 | ||
![]() |
95dfeee9b0 | ||
![]() |
bfa3dd2bec | ||
![]() |
0ee6622895 | ||
![]() |
51b658dc33 | ||
![]() |
2600f8a43f | ||
![]() |
9a4373c834 | ||
![]() |
4d18bac275 | ||
![]() |
9c4626189e | ||
![]() |
8da4978741 | ||
![]() |
049f4b3444 | ||
![]() |
ea4e2d7840 | ||
![]() |
110d1b9390 | ||
![]() |
b0df5bc628 | ||
![]() |
e1342b7a4f | ||
![]() |
2797ece573 | ||
![]() |
d4d6ec48bc | ||
![]() |
ee5f6e862e | ||
![]() |
840ef0b961 | ||
![]() |
0d5188c160 | ||
![]() |
edb6b9f0ff | ||
![]() |
31a216450c | ||
![]() |
778490580f | ||
![]() |
c26dc8318f | ||
![]() |
f4d6e73918 | ||
![]() |
300cac3af8 | ||
![]() |
a5244616c7 | ||
![]() |
f303a1ea8f | ||
![]() |
7a32df93ec | ||
![]() |
a3ebfb8e55 | ||
![]() |
e04d2957f8 | ||
![]() |
b6ea49f059 | ||
![]() |
372e393c3c | ||
![]() |
790c30f4f8 | ||
![]() |
5fa2da063a | ||
![]() |
1d3b044a07 | ||
![]() |
b37cb71a3e | ||
![]() |
338d18df55 | ||
![]() |
0cb7647795 | ||
![]() |
0d0dddd033 | ||
![]() |
3783330774 | ||
![]() |
2b2fc8d491 | ||
![]() |
8fd4114724 | ||
![]() |
b97643c161 | ||
![]() |
a11a5a928a | ||
![]() |
b0e7ad12c3 | ||
![]() |
a7baf01e63 | ||
![]() |
a2e249956d | ||
![]() |
fc78bfd470 | ||
![]() |
0ed20064d2 | ||
![]() |
023cf7b158 | ||
![]() |
c606f2e227 | ||
![]() |
39d016ec4b | ||
![]() |
69bf77d799 | ||
![]() |
2b789e1e4c | ||
![]() |
2c255ad7a6 | ||
![]() |
3fd5e7cd0d | ||
![]() |
6d05c5e026 | ||
![]() |
e6109545fb | ||
![]() |
3c54482248 | ||
![]() |
7eae9590d6 | ||
![]() |
0f2e3f1e66 | ||
![]() |
6b8e52f789 | ||
![]() |
51aa2bf89c | ||
![]() |
ad3a2919e1 | ||
![]() |
57ac150615 | ||
![]() |
3b9c0acd0a | ||
![]() |
cdb71e30af | ||
![]() |
a2287d2cb5 | ||
![]() |
f08bde9b51 | ||
![]() |
d1a3ce6e77 | ||
![]() |
363533d930 | ||
![]() |
685a8c53b3 | ||
![]() |
8aee80d876 | ||
![]() |
7dbd7c9a86 | ||
![]() |
71786e9a33 | ||
![]() |
315252b29d | ||
![]() |
cc3d802900 | ||
![]() |
5f94cdc539 | ||
![]() |
a9316f546c | ||
![]() |
44a15b37a4 | ||
![]() |
8ca9cadf3c | ||
![]() |
dd2eabacf9 | ||
![]() |
da0c70e8ea | ||
![]() |
51a7ea8fae | ||
![]() |
f5b3680c38 | ||
![]() |
5c0e9d7e67 | ||
![]() |
bb19473b88 | ||
![]() |
26cd7357da | ||
![]() |
8f21fd5650 | ||
![]() |
c0486093fe | ||
![]() |
ac5f3c7acd | ||
![]() |
89032792dc | ||
![]() |
765fe05f81 | ||
![]() |
f63b805c7e | ||
![]() |
dd8c8a8fdf | ||
![]() |
d654f9dc82 | ||
![]() |
b08a721866 | ||
![]() |
d5423d1888 | ||
![]() |
f122c09b08 | ||
![]() |
032b8db8c2 | ||
![]() |
f08e794ab1 | ||
![]() |
53e3522961 | ||
![]() |
d904f0f542 | ||
![]() |
0ae1c77472 | ||
![]() |
99ddc31652 | ||
![]() |
e3b6e6109e | ||
![]() |
4bc66a8a5e | ||
![]() |
f384c87009 | ||
![]() |
aa9e0af120 | ||
![]() |
ea5601f71e | ||
![]() |
9a9ebd46d1 | ||
![]() |
040285dcca | ||
![]() |
f6f4472733 | ||
![]() |
f9f89cfa29 | ||
![]() |
f83cfd73cc | ||
![]() |
12d98a30f8 | ||
![]() |
71ba00a0e7 | ||
![]() |
a47b8cf924 | ||
![]() |
adb15abf6f | ||
![]() |
f393d28243 | ||
![]() |
ca5b21cea3 | ||
![]() |
2468c764ff | ||
![]() |
71ae767292 | ||
![]() |
4897c698ad | ||
![]() |
b773cdd328 | ||
![]() |
67d0bcf1aa | ||
![]() |
f31c3e5020 | ||
![]() |
4d47904439 | ||
![]() |
3a3db92dc0 | ||
![]() |
ec03fed186 | ||
![]() |
edee2eec69 | ||
![]() |
4a9d340a9a | ||
![]() |
81939b4bb9 | ||
![]() |
dbf1367b22 | ||
![]() |
ae2c11fc71 | ||
![]() |
0a8647900a | ||
![]() |
7562e95099 | ||
![]() |
161d18e3c3 | ||
![]() |
c57cf08f74 | ||
![]() |
b1441ba453 | ||
![]() |
34e4afa806 | ||
![]() |
64aba28c69 | ||
![]() |
f874c1c70b | ||
![]() |
b1d8cccd1c | ||
![]() |
b8df54527a | ||
![]() |
bba722c918 | ||
![]() |
110a53f3bb | ||
![]() |
5e461466bc | ||
![]() |
b97d0057c4 | ||
![]() |
8f2f356ea4 | ||
![]() |
8087c37863 | ||
![]() |
6f5941705e | ||
![]() |
33b00f6a2c | ||
![]() |
66504ef043 | ||
![]() |
94b7877f6d | ||
![]() |
ee9efa0917 | ||
![]() |
fffa7161c6 | ||
![]() |
85126322cf | ||
![]() |
ec351aed1c | ||
![]() |
15345ea898 | ||
![]() |
d150a12812 | ||
![]() |
79bc65c429 | ||
![]() |
49b3b35a1c | ||
![]() |
897b4b4f02 | ||
![]() |
eaaf452e1f | ||
![]() |
cf89e2b55b | ||
![]() |
8bb5bf055a | ||
![]() |
44c5d24f35 | ||
![]() |
d7ed89e517 | ||
![]() |
cfb7a519e6 | ||
![]() |
c263703300 | ||
![]() |
485e12b8ae | ||
![]() |
d4a39b5a89 | ||
![]() |
15179608cc | ||
![]() |
f3decdc503 | ||
![]() |
ff727ed834 | ||
![]() |
67774aa0f7 | ||
![]() |
f441a26399 | ||
![]() |
2c9308f489 | ||
![]() |
266d827a43 | ||
![]() |
a66063f970 | ||
![]() |
6c4638cf7b | ||
![]() |
6fae6d892d | ||
![]() |
9d0bc1b7f1 | ||
![]() |
f80e699194 | ||
![]() |
aa8b1fcaf9 | ||
![]() |
e9b88bb8a7 | ||
![]() |
c026eefdda | ||
![]() |
d239cf56a4 | ||
![]() |
3c2efa090d | ||
![]() |
e0be27c1e2 | ||
![]() |
29d7d7a24e | ||
![]() |
7fd7c6ee46 | ||
![]() |
02b3041893 | ||
![]() |
1c6f86c085 | ||
![]() |
099cb94bc7 | ||
![]() |
0e48708ffd | ||
![]() |
ff7b62f84f | ||
![]() |
b71ac02dd9 | ||
![]() |
73c84eaac2 | ||
![]() |
d4c8efccbb | ||
![]() |
fe87441ae6 | ||
![]() |
ba08da2803 | ||
![]() |
0544c312c4 | ||
![]() |
3209c4d01c | ||
![]() |
69c9178276 | ||
![]() |
7253aa3204 | ||
![]() |
30bd28fa43 | ||
![]() |
361d94c2e7 | ||
![]() |
0413f0684e | ||
![]() |
d5a87c8d1d | ||
![]() |
b6b1a00211 | ||
![]() |
d5846e20dd | ||
![]() |
45e00887b5 | ||
![]() |
ca7e8b7786 | ||
![]() |
d5815a90b5 | ||
![]() |
853bb3412e | ||
![]() |
6e84d6f5b3 | ||
![]() |
452dc783e4 | ||
![]() |
0f36b3c412 | ||
![]() |
5073ddd4b7 | ||
![]() |
fe1b8e88cb | ||
![]() |
c9f8e3549f | ||
![]() |
e1bfd7c8e2 | ||
![]() |
f6be4a8e81 | ||
![]() |
38e4f26ed6 | ||
![]() |
abaeae1465 | ||
![]() |
7955f10826 | ||
![]() |
d7e1270330 | ||
![]() |
850395862b | ||
![]() |
af2f7c58f7 | ||
![]() |
a0677e753b | ||
![]() |
84954bab2e | ||
![]() |
921b062c2e | ||
![]() |
b580863798 | ||
![]() |
5d16bea631 | ||
![]() |
77e48b3587 | ||
![]() |
ebfcd0ffd4 | ||
![]() |
b2b309afeb | ||
![]() |
9226241439 | ||
![]() |
f5ca51dcff | ||
![]() |
9ae4a816bf | ||
![]() |
3675d2a449 | ||
![]() |
b4fabcf944 | ||
![]() |
8cf594039f | ||
![]() |
7a54657ee7 | ||
![]() |
007f26227c | ||
![]() |
45ee5cc8f3 | ||
![]() |
544316f587 | ||
![]() |
f858572ee1 | ||
![]() |
e1b24b7ee2 | ||
![]() |
6741229b9e | ||
![]() |
3e5f97d7c6 | ||
![]() |
8b87d48f6e | ||
![]() |
ac656d90e6 | ||
![]() |
0bb6e13d12 | ||
![]() |
fd163a0c93 | ||
![]() |
ea34e96806 | ||
![]() |
711811f13d | ||
![]() |
064fe7f00d | ||
![]() |
b8703f587d | ||
![]() |
ef7489e67d | ||
![]() |
ff06b617a4 | ||
![]() |
a636561bfc | ||
![]() |
b74273f8c0 | ||
![]() |
3e8b5ed802 | ||
![]() |
69b3913565 | ||
![]() |
11f80df99f | ||
![]() |
714ac3ea83 | ||
![]() |
69c6b04ecf | ||
![]() |
d21f0a2caf | ||
![]() |
6f88560c97 | ||
![]() |
59d5a55635 | ||
![]() |
fdc397e3c6 | ||
![]() |
d674ccbcb7 | ||
![]() |
c398e3d533 | ||
![]() |
72a304436a | ||
![]() |
077dc08bb5 | ||
![]() |
65aa964e76 | ||
![]() |
a95cd59f53 | ||
![]() |
4086b951f2 | ||
![]() |
02e6567fdc | ||
![]() |
10900d1d5b | ||
![]() |
ecf7066040 | ||
![]() |
98a90170d8 | ||
![]() |
92b96c2318 | ||
![]() |
8703b82fbe | ||
![]() |
3fc8251a9b | ||
![]() |
b1c357cbd6 | ||
![]() |
90a7107152 | ||
![]() |
f82a7b9bfc | ||
![]() |
384ea84f62 | ||
![]() |
d03b129476 | ||
![]() |
226bfeab5d | ||
![]() |
19bc986f79 | ||
![]() |
4b61010e5e | ||
![]() |
a196cce3f3 | ||
![]() |
34838047a0 | ||
![]() |
f6be604ed3 | ||
![]() |
56e8857678 | ||
![]() |
7a3acd04a1 | ||
![]() |
bb1fc802c1 | ||
![]() |
9c69091f77 | ||
![]() |
584b540116 | ||
![]() |
b26d1b1d55 | ||
![]() |
e93e868a45 | ||
![]() |
88784dd080 | ||
![]() |
c6bb64cf96 | ||
![]() |
982cb7d898 | ||
![]() |
e16dea81dc | ||
![]() |
4b1e07cb19 | ||
![]() |
cac827e5f0 | ||
![]() |
ed2ca01677 | ||
![]() |
0fba958e49 | ||
![]() |
ac879068e5 | ||
![]() |
0f7fae628e | ||
![]() |
fee24420c7 | ||
![]() |
e7dd253db9 | ||
![]() |
7bfa8537bd | ||
![]() |
03ee53490f | ||
![]() |
e8e48906b3 | ||
![]() |
75e8a17d8a | ||
![]() |
f8087d7b90 | ||
![]() |
f24abb797d | ||
![]() |
f302f34c9b | ||
![]() |
a6a4148cc2 | ||
![]() |
3554aa423d | ||
![]() |
1038e80f77 | ||
![]() |
e71021f2c4 | ||
![]() |
96c47887e5 | ||
![]() |
98ac71f90e | ||
![]() |
7a1422bec7 | ||
![]() |
e3b89a2aef | ||
![]() |
989c1a7848 | ||
![]() |
90d4c4cb99 | ||
![]() |
1c812ebf99 | ||
![]() |
28cd21aebf | ||
![]() |
6548e34032 | ||
![]() |
6233ced161 | ||
![]() |
6e63b18497 | ||
![]() |
188672a81b | ||
![]() |
cfbb23b452 | ||
![]() |
89120dc377 | ||
![]() |
85cea028ef | ||
![]() |
bf1e87fde0 | ||
![]() |
0116fef1be | ||
![]() |
46a6caff92 | ||
![]() |
1c02a4f7e8 | ||
![]() |
3f0093759c | ||
![]() |
9991cab4af | ||
![]() |
2fc62e783c | ||
![]() |
5a4386069d | ||
![]() |
a2dff5785e | ||
![]() |
857d34d939 | ||
![]() |
c671b5f4ae | ||
![]() |
3fccef5a6d | ||
![]() |
1c8ffe407f | ||
![]() |
ee4df60f25 | ||
![]() |
2aef57c577 | ||
![]() |
5efc5d07d3 | ||
![]() |
295b01a75a | ||
![]() |
424aecffad | ||
![]() |
b5bf4a21b5 | ||
![]() |
1875041f76 | ||
![]() |
aed8c86a38 | ||
![]() |
8947c02c64 | ||
![]() |
a1e704282d | ||
![]() |
5aea02faf1 | ||
![]() |
7d7e3269b9 | ||
![]() |
caf73bd48e | ||
![]() |
e3cc690eb3 | ||
![]() |
7d7cddc680 | ||
![]() |
afd7b76866 | ||
![]() |
e96af63817 | ||
![]() |
482696506b | ||
![]() |
8fd5974cad | ||
![]() |
b2400bb5bc | ||
![]() |
c1d6289507 | ||
![]() |
72beb68a4c | ||
![]() |
4be9ebe895 | ||
![]() |
34b0334418 | ||
![]() |
d277f89ffb | ||
![]() |
66730f9f7f | ||
![]() |
3381e5a517 | ||
![]() |
4ee5187c84 | ||
![]() |
c1bdc05b91 | ||
![]() |
6d2852622f | ||
![]() |
345b399b24 | ||
![]() |
06840064b5 | ||
![]() |
8eed12ff30 | ||
![]() |
75021f7444 | ||
![]() |
e01143389e | ||
![]() |
1c87b9a495 | ||
![]() |
829ce766f7 | ||
![]() |
1d08c8176b | ||
![]() |
c7089c884e | ||
![]() |
8f4ee1ec91 | ||
![]() |
268507d4d0 | ||
![]() |
d71a91efcd | ||
![]() |
9bb9185443 | ||
![]() |
0b5e778050 | ||
![]() |
93125e9e23 | ||
![]() |
6daf9fd31c | ||
![]() |
2cb48ba745 | ||
![]() |
95ed386e05 | ||
![]() |
27da1ba870 | ||
![]() |
7cf1e375e9 | ||
![]() |
cfc0011386 | ||
![]() |
f609b16083 | ||
![]() |
4248ab1961 | ||
![]() |
bc1c5d21b2 | ||
![]() |
34fb5f3d88 | ||
![]() |
0b1d8c8278 | ||
![]() |
887f854458 | ||
![]() |
6e5c9521e3 | ||
![]() |
6f26c26d22 | ||
![]() |
e444a6af8e | ||
![]() |
70a6cf9062 | ||
![]() |
3bb2cc03f7 | ||
![]() |
c0305d9bb0 | ||
![]() |
96788763d9 | ||
![]() |
0672f42625 | ||
![]() |
6a32a78ed9 | ||
![]() |
cfb40c22a7 | ||
![]() |
3eced333e9 | ||
![]() |
4b9b35c7d1 | ||
![]() |
d30dd732f8 | ||
![]() |
cbb9553009 | ||
![]() |
bd0f4656de | ||
![]() |
39bd51bc48 | ||
![]() |
42419eb0c3 | ||
![]() |
9c21474c49 | ||
![]() |
7c8a9e69a0 | ||
![]() |
683c0b7c63 | ||
![]() |
990d1c3231 | ||
![]() |
bec9be1cf7 | ||
![]() |
b3480b066f | ||
![]() |
3450354f12 | ||
![]() |
495ec98663 | ||
![]() |
abc6f96f48 | ||
![]() |
e0fd85b5dd | ||
![]() |
01994132a7 | ||
![]() |
79871507b0 | ||
![]() |
e1633aba8e | ||
![]() |
1f7235177f | ||
![]() |
c3c4e44438 | ||
![]() |
c62309a58e | ||
![]() |
bb6f8a3c40 | ||
![]() |
2976ae6a5a | ||
![]() |
f573666edb | ||
![]() |
895d17d057 | ||
![]() |
e22eb9417d | ||
![]() |
b92d3f89e9 | ||
![]() |
c748db8be0 | ||
![]() |
986c72eb94 | ||
![]() |
28fe89e4c5 | ||
![]() |
c538efe885 | ||
![]() |
0757083cdf | ||
![]() |
9c7e6f687c | ||
![]() |
0664671e6c | ||
![]() |
8244faba48 | ||
![]() |
c7e8e910ee | ||
![]() |
b7808ecbe4 | ||
![]() |
7a7f591cd6 | ||
![]() |
aea3176846 | ||
![]() |
d06de980c8 | ||
![]() |
c45d883728 | ||
![]() |
8cdaebc142 | ||
![]() |
2b1fa6a57c | ||
![]() |
38b4fd8e81 | ||
![]() |
676a3c2c45 | ||
![]() |
22c3fc059d | ||
![]() |
5f6c00f773 | ||
![]() |
3be9fb80ba | ||
![]() |
548a876e1d | ||
![]() |
f5463f98ba | ||
![]() |
63fde5a7d9 | ||
![]() |
cf5587c76b | ||
![]() |
380da72de6 | ||
![]() |
bd26aa7c6a | ||
![]() |
1e314ed715 | ||
![]() |
bbb2e49a87 | ||
![]() |
710159e2a2 | ||
![]() |
06c4e9ba12 | ||
![]() |
6296a78b26 | ||
![]() |
0c3905e58a | ||
![]() |
3b51e0b315 | ||
![]() |
a5ea281c04 | ||
![]() |
ea3f73cde6 | ||
![]() |
6dbad640d6 | ||
![]() |
804b390eba | ||
![]() |
f3e17e66f7 | ||
![]() |
cd6f69ef43 | ||
![]() |
a5218c8e1f | ||
![]() |
29d92c2e8e | ||
![]() |
8948837a59 | ||
![]() |
d403e80e04 | ||
![]() |
c865e71d12 | ||
![]() |
aae2433741 | ||
![]() |
cdf28e8d20 | ||
![]() |
9df6eef30f | ||
![]() |
743084bb0b | ||
![]() |
278a1df06d | ||
![]() |
8e1c79226e | ||
![]() |
2e73338337 | ||
![]() |
a5652d925e | ||
![]() |
c96ca66033 | ||
![]() |
3ca4fb58f0 | ||
![]() |
6015950fc5 | ||
![]() |
7c71c3d67f | ||
![]() |
0b985f4307 | ||
![]() |
8b7d24a60b | ||
![]() |
184603422b | ||
![]() |
96bf81920e | ||
![]() |
7165cc7cae | ||
![]() |
94c1354a70 | ||
![]() |
a804a7139a | ||
![]() |
b278211f23 | ||
![]() |
c60153b90c | ||
![]() |
76df36f734 | ||
![]() |
95c7cc18b3 | ||
![]() |
9e89a92ba7 | ||
![]() |
b73f422a99 | ||
![]() |
3a13cad422 | ||
![]() |
add50ff1af | ||
![]() |
ee12e3adbd | ||
![]() |
790345f6df | ||
![]() |
0bcd1dde6f | ||
![]() |
ae90c616b2 | ||
![]() |
3a62378086 | ||
![]() |
30336f760d | ||
![]() |
621712a436 | ||
![]() |
6e35c81422 | ||
![]() |
126aba422f | ||
![]() |
e404d4cf88 | ||
![]() |
c87cfc79ab | ||
![]() |
66b37c2270 | ||
![]() |
c647a9202d | ||
![]() |
4e868c6eca | ||
![]() |
79229081eb | ||
![]() |
c83f205167 | ||
![]() |
34156077d9 | ||
![]() |
d91c446095 | ||
![]() |
9a916ff267 | ||
![]() |
db2634051f | ||
![]() |
8c1fc90908 | ||
![]() |
9c177c4e9a | ||
![]() |
a37e127923 | ||
![]() |
85f3e780ac | ||
![]() |
1fb1ef2656 | ||
![]() |
168ba90113 | ||
![]() |
9c6f2da072 | ||
![]() |
c88a0a5a4b | ||
![]() |
d79f093996 | ||
![]() |
3001e1c2c1 | ||
![]() |
e32f45214c | ||
![]() |
53a42fa3cf | ||
![]() |
62f38a7101 | ||
![]() |
7fe528334f | ||
![]() |
9be7d022dd | ||
![]() |
1e62772dae | ||
![]() |
bbaaab2146 | ||
![]() |
e4d8e88deb | ||
![]() |
7be18be494 | ||
![]() |
94668c5a99 | ||
![]() |
df25a6c2a3 | ||
![]() |
c7eefd9d4e | ||
![]() |
1530c9a9af | ||
![]() |
1291780cc8 | ||
![]() |
236dfb12f9 | ||
![]() |
9601506d31 | ||
![]() |
315f5fc185 | ||
![]() |
82aaf0763c | ||
![]() |
e7a348624c | ||
![]() |
c0996c6569 | ||
![]() |
c274e87019 | ||
![]() |
94143df2e6 | ||
![]() |
7e1cb40038 | ||
![]() |
14a5d0cdde | ||
![]() |
e1d8f073dd | ||
![]() |
b91477ef2e | ||
![]() |
74e2af60f7 | ||
![]() |
324fb96669 | ||
![]() |
205947502c | ||
![]() |
a679e29d4c | ||
![]() |
d80abc3070 | ||
![]() |
e07d61c5ee | ||
![]() |
00cfe9aa8f | ||
![]() |
a6d88d451b | ||
![]() |
a348ff2d35 | ||
![]() |
a7187d8dfe | ||
![]() |
2ea299380b | ||
![]() |
3a8d7bec4f | ||
![]() |
34a9ece939 | ||
![]() |
0bacff9c58 | ||
![]() |
75fe370077 | ||
![]() |
69cc66e572 | ||
![]() |
8c7108e83f | ||
![]() |
2c94a9938d | ||
![]() |
423717bd1d | ||
![]() |
efc7d0d237 | ||
![]() |
687f325520 | ||
![]() |
1da8082d14 | ||
![]() |
f9d867aa58 | ||
![]() |
a20d377192 | ||
![]() |
6f22466eac | ||
![]() |
ef44b2ccfb | ||
![]() |
da0f3d53a5 | ||
![]() |
d601521618 | ||
![]() |
7487c42c18 | ||
![]() |
d402c7d4e8 | ||
![]() |
dc62a916d0 | ||
![]() |
b484747d92 | ||
![]() |
f5f3e3f7bb | ||
![]() |
a5cb70964c | ||
![]() |
71b5b0f69e | ||
![]() |
05b75f75cd | ||
![]() |
599e8dfdbc | ||
![]() |
f204fd6d3e | ||
![]() |
5f50302081 | ||
![]() |
3fb3ad2b31 | ||
![]() |
4ec7bc8111 | ||
![]() |
f0640f1982 | ||
![]() |
43659919eb | ||
![]() |
1b18d58eef | ||
![]() |
cf22aba966 | ||
![]() |
18f8711223 | ||
![]() |
2d04277a77 | ||
![]() |
a406a0964d | ||
![]() |
786deb4f05 | ||
![]() |
565e9f2fcc | ||
![]() |
b77bbf6267 | ||
![]() |
30369319d7 | ||
![]() |
f9614f8af2 | ||
![]() |
eaf40108c5 | ||
![]() |
af740b90a0 | ||
![]() |
475b82f43a | ||
![]() |
8084d07774 | ||
![]() |
2696fe6904 | ||
![]() |
4ddb888039 | ||
![]() |
63e5d14258 | ||
![]() |
0d17215153 | ||
![]() |
ff52021b4e | ||
![]() |
eec3d04936 | ||
![]() |
e18f36fc21 | ||
![]() |
5d8db49862 | ||
![]() |
97e07f8799 | ||
![]() |
2c3bfff432 | ||
![]() |
1933927c76 | ||
![]() |
2dd04087fb | ||
![]() |
bcf4e32f06 | ||
![]() |
927d49780e | ||
![]() |
32de2c828e | ||
![]() |
1f964f5267 | ||
![]() |
4336c8ef40 | ||
![]() |
006029f9ac | ||
![]() |
d07e8bc991 | ||
![]() |
bf5f999718 | ||
![]() |
dd1ab23c8c | ||
![]() |
505c2c18f1 | ||
![]() |
ab344dc92c | ||
![]() |
8b228fbd3b | ||
![]() |
911517f4fa | ||
![]() |
c3b5cbab7c | ||
![]() |
9a7b5b8827 | ||
![]() |
1c156b5e5d | ||
![]() |
0286060d9a | ||
![]() |
321efb4384 | ||
![]() |
c440b70fa2 | ||
![]() |
d971fef6f6 | ||
![]() |
83f08666f2 | ||
![]() |
cf5bdf8ac8 | ||
![]() |
8b24b88d60 | ||
![]() |
d543c1db4b | ||
![]() |
607e3133ec | ||
![]() |
8eae4f11b4 | ||
![]() |
94806080d2 | ||
![]() |
6fd13c290c | ||
![]() |
cb5617c300 | ||
![]() |
06f7a12c72 | ||
![]() |
284234514f | ||
![]() |
93dfffe17a | ||
![]() |
b85d9185ad | ||
![]() |
d53ae07edc | ||
![]() |
80a5b63595 | ||
![]() |
ee5d7436d0 | ||
![]() |
3013ef1ee6 | ||
![]() |
fef748e5f1 | ||
![]() |
cb61b20c25 | ||
![]() |
dce2167ac1 | ||
![]() |
2f50b4e2e0 | ||
![]() |
203e6cdf61 | ||
![]() |
7c99773dac | ||
![]() |
bc22af1817 | ||
![]() |
55a680aa01 | ||
![]() |
34ab7d9450 | ||
![]() |
16446ff566 | ||
![]() |
ffe227003f | ||
![]() |
efae41176a | ||
![]() |
88379f8b87 | ||
![]() |
f29c6b3ff8 | ||
![]() |
8cc50bb2a6 | ||
![]() |
6cbba96963 | ||
![]() |
4c9baddc2c | ||
![]() |
616a8e9671 | ||
![]() |
63ab6918ec | ||
![]() |
625c953660 | ||
![]() |
467586a0a8 | ||
![]() |
37f7aa8c18 | ||
![]() |
2c12befb10 | ||
![]() |
1ecbc3ba95 | ||
![]() |
b8921975f8 | ||
![]() |
58a11b903c | ||
![]() |
5c2692f1b3 | ||
![]() |
8c19fbc384 | ||
![]() |
3bcd1ed05b | ||
![]() |
7caac5010f | ||
![]() |
4fdb65b2f3 | ||
![]() |
f6dc8fb3bb | ||
![]() |
ec36a89fd2 | ||
![]() |
65f02bba90 | ||
![]() |
0bc7f6f504 | ||
![]() |
00b0806d6b | ||
![]() |
05c7f36c62 | ||
![]() |
db59c8b2fe | ||
![]() |
df7e93338a | ||
![]() |
8dfc1ea1bf | ||
![]() |
b67eca371e | ||
![]() |
a270fa1976 | ||
![]() |
cd831b5fe9 | ||
![]() |
214cf69e0a | ||
![]() |
a8d0013ba5 | ||
![]() |
2a24e293d7 | ||
![]() |
632e9b7e12 | ||
![]() |
3d78fa462f | ||
![]() |
470fc8b61d | ||
![]() |
98fd9c0d05 | ||
![]() |
9f122d02fb | ||
![]() |
fe7dff774f | ||
![]() |
8220c5597b | ||
![]() |
f2121a31b6 | ||
![]() |
07c857c372 | ||
![]() |
c0cb63781e | ||
![]() |
5a7da4f526 | ||
![]() |
c9db4e4e44 | ||
![]() |
f670c084a4 | ||
![]() |
de67786f71 | ||
![]() |
7d438a78fa | ||
![]() |
00971c8ddd | ||
![]() |
d443b1c6a0 | ||
![]() |
e61196c36c | ||
![]() |
18a98dc69b | ||
![]() |
49b0dd94f7 | ||
![]() |
a3b5cf2f4d | ||
![]() |
a8327440fe | ||
![]() |
ffefd683ce | ||
![]() |
846d5f0241 | ||
![]() |
4cac379a2f | ||
![]() |
ed5074aae0 | ||
![]() |
a5215163ba | ||
![]() |
ae3495d388 | ||
![]() |
199a35269a | ||
![]() |
5ba0092947 | ||
![]() |
5cd3a17779 | ||
![]() |
16ab051df4 | ||
![]() |
6596c2a65f | ||
![]() |
448599e661 | ||
![]() |
242ac7819d | ||
![]() |
0502139d96 | ||
![]() |
c7b5d65bb7 | ||
![]() |
e18c72c099 | ||
![]() |
f9e57dba0a | ||
![]() |
4a4aade9bf | ||
![]() |
6fbfbee84c | ||
![]() |
6dfc3420ed | ||
![]() |
b1ef8f72d0 | ||
![]() |
fed3a4824f | ||
![]() |
66e7a67d14 | ||
![]() |
4b9e1f5c34 | ||
![]() |
22ef272860 | ||
![]() |
1411eb7bba | ||
![]() |
b27ed0d53a | ||
![]() |
4ae619ec23 | ||
![]() |
3bd1095615 | ||
![]() |
2949e5d734 | ||
![]() |
5c65c6b809 | ||
![]() |
57d2c4db9f | ||
![]() |
1e548aa964 | ||
![]() |
4075967199 | ||
![]() |
161bfea8b4 | ||
![]() |
2667218550 | ||
![]() |
cf4d6a7811 | ||
![]() |
8ae6277f4b | ||
![]() |
1c350575a3 | ||
![]() |
a323575d5c | ||
![]() |
e2c1bc1a0f | ||
![]() |
d2214e525b | ||
![]() |
1efff92862 | ||
![]() |
5e9d260409 | ||
![]() |
5290414866 | ||
![]() |
0e4252d2b3 | ||
![]() |
2b4843ad24 | ||
![]() |
7254769a4b | ||
![]() |
744dcc4483 | ||
![]() |
942752f2e9 | ||
![]() |
8aa56d79a2 | ||
![]() |
351ad0df92 | ||
![]() |
687cbd4b60 | ||
![]() |
afd894ac50 | ||
![]() |
63eaf5daa5 | ||
![]() |
0b500c3ef4 | ||
![]() |
ce844af1ee | ||
![]() |
7d9e963c73 | ||
![]() |
9870ea4475 | ||
![]() |
471be2cd9f | ||
![]() |
126d696d5a | ||
![]() |
32848f8772 | ||
![]() |
91c10c6cf6 | ||
![]() |
6d6975cb6b | ||
![]() |
dfb1911c2d | ||
![]() |
02c99e6402 | ||
![]() |
437cfbe1e1 | ||
![]() |
a00e5d406c | ||
![]() |
0887aff38d | ||
![]() |
7e2badc3b4 | ||
![]() |
f3784ddc98 | ||
![]() |
376a1d85d6 | ||
![]() |
78e96474b2 | ||
![]() |
72ad9f5dc0 | ||
![]() |
e0949ae082 | ||
![]() |
2ca2c12475 | ||
![]() |
8ca3bd3b6b | ||
![]() |
286cb5dcb6 | ||
![]() |
accf447456 | ||
![]() |
a62d0cf62c | ||
![]() |
cf120f9f13 | ||
![]() |
2bbbb6e5f2 | ||
![]() |
7fb8cc587f | ||
![]() |
211394649f | ||
![]() |
b4caffd61a | ||
![]() |
e84878bdff | ||
![]() |
a585f0830f | ||
![]() |
dd983dedb2 | ||
![]() |
df76fb9d66 | ||
![]() |
7531a01b9a | ||
![]() |
bab9f57aa0 | ||
![]() |
5b59734047 | ||
![]() |
dde10d33da | ||
![]() |
112ba2aa6e | ||
![]() |
da15d03621 | ||
![]() |
e61e33b47f | ||
![]() |
87e6397ee2 | ||
![]() |
cefdd462ed | ||
![]() |
f67df255d4 | ||
![]() |
f5b0af6e54 | ||
![]() |
0a24fdcaf5 | ||
![]() |
12d8b274b6 | ||
![]() |
4a4a87c800 | ||
![]() |
0514d3963f | ||
![]() |
74f89b1780 | ||
![]() |
eaead8c87d | ||
![]() |
2114a7dd3d | ||
![]() |
90f1c12f3d | ||
![]() |
64bb74f06e | ||
![]() |
ed190db27b | ||
![]() |
29eaffc6d4 | ||
![]() |
165181c009 | ||
![]() |
63eb793abc | ||
![]() |
33ddc1fed5 | ||
![]() |
045499d627 | ||
![]() |
91b846343b | ||
![]() |
ff6b97bd02 | ||
![]() |
6bd596e846 | ||
![]() |
8184ad244c | ||
![]() |
ca22672842 | ||
![]() |
e20dcd55ea | ||
![]() |
f209602f3a | ||
![]() |
a7d926b6fa | ||
![]() |
afe0a0c5fd | ||
![]() |
015ad00a25 | ||
![]() |
ec2f5f36a2 | ||
![]() |
c769f6c7a8 | ||
![]() |
b87b642742 | ||
![]() |
1ca4c9eecd | ||
![]() |
f6acb16cd3 | ||
![]() |
404ee662ac | ||
![]() |
ffaa23a733 | ||
![]() |
ea1e0ce4e7 | ||
![]() |
bf5ae0f689 | ||
![]() |
22fcca2fac | ||
![]() |
e1b1075f2d | ||
![]() |
a10851339d | ||
![]() |
c03bbc2fa1 | ||
![]() |
9692ca655e | ||
![]() |
aeafa39c0d | ||
![]() |
f28dfd0318 | ||
![]() |
a7b0e775e0 | ||
![]() |
b3040b5276 | ||
![]() |
288317a8bb | ||
![]() |
0b7fa8a193 | ||
![]() |
4f5267b6fb | ||
![]() |
b5f9378a65 | ||
![]() |
aa9af2c094 | ||
![]() |
ef196d00b8 | ||
![]() |
0be8c17a05 | ||
![]() |
02487a466b | ||
![]() |
ad765949de | ||
![]() |
9cf2c67b2c | ||
![]() |
ccd967775d | ||
![]() |
c5503a52ae | ||
![]() |
b85ef3fed7 | ||
![]() |
4acb33ae0d | ||
![]() |
90ce809d6f | ||
![]() |
6d6b2c240c | ||
![]() |
2a58657d6e | ||
![]() |
9f3dff6270 | ||
![]() |
11e15daf67 | ||
![]() |
96254f01e2 | ||
![]() |
103fa78d8a | ||
![]() |
f89403046a | ||
![]() |
0b01a84796 | ||
![]() |
719d3d2d96 | ||
![]() |
f945cf85cb | ||
![]() |
32d149dad1 | ||
![]() |
eebb412914 | ||
![]() |
bacd781d94 | ||
![]() |
01071047ea | ||
![]() |
91fdb44445 | ||
![]() |
865525dee2 | ||
![]() |
9dc0b6af5b | ||
![]() |
efccc2c1c3 | ||
![]() |
8470b06a01 | ||
![]() |
a4718cf100 | ||
![]() |
b3f2fa0c26 | ||
![]() |
56d2ce7d95 | ||
![]() |
799314ceee | ||
![]() |
a0b3c101d9 | ||
![]() |
4bef356142 | ||
![]() |
1b04fda8f7 | ||
![]() |
5ee72e37f5 | ||
![]() |
744d4f2ffa | ||
![]() |
ee4be6c7f9 | ||
![]() |
22698aa00b | ||
![]() |
1af3361e12 | ||
![]() |
349410927a | ||
![]() |
b63474e253 | ||
![]() |
0d9f4c2123 | ||
![]() |
6d1b810ca0 | ||
![]() |
aea9c56f3a | ||
![]() |
c9435e2838 | ||
![]() |
9493de5b9e | ||
![]() |
3ce450ec8f | ||
![]() |
4c9a4180f2 | ||
![]() |
2f847093c4 | ||
![]() |
56c278ebdc | ||
![]() |
d9feeacc0f | ||
![]() |
4870da2bce | ||
![]() |
49fb72ec71 | ||
![]() |
330e80c22b | ||
![]() |
6579fdb5e1 | ||
![]() |
4bee67b3d5 | ||
![]() |
df74a69633 | ||
![]() |
22453c23a0 | ||
![]() |
60b9817afe | ||
![]() |
1f8fdc575c | ||
![]() |
aaf4af8dcf | ||
![]() |
455c5c6b8b | ||
![]() |
d6ef44cbdb | ||
![]() |
4c945e5611 | ||
![]() |
4c8de16045 | ||
![]() |
fb3978b2fb | ||
![]() |
470372ff84 | ||
![]() |
eab8666265 | ||
![]() |
8ead5fd7e9 | ||
![]() |
b320f26877 | ||
![]() |
ab0cf5b9ca | ||
![]() |
fc443bffb7 | ||
![]() |
2ddd1b7f90 | ||
![]() |
6eeec41ab6 | ||
![]() |
c65e323b50 | ||
![]() |
ac06ead5bf | ||
![]() |
fc957c9ae8 | ||
![]() |
27d00c7a86 | ||
![]() |
fadacd75ba | ||
![]() |
a5ddd20343 | ||
![]() |
e6fcabe5fb | ||
![]() |
bcc9e294d5 | ||
![]() |
911fe0b6f6 | ||
![]() |
7e3a43f3c3 | ||
![]() |
782d704eb8 | ||
![]() |
61abb8dcd5 | ||
![]() |
e72b3828d1 | ||
![]() |
5f937ca063 | ||
![]() |
090a34a3c7 | ||
![]() |
142e0b46a1 | ||
![]() |
d66b8d6090 | ||
![]() |
fb62c570a4 | ||
![]() |
d09ee4b1f5 | ||
![]() |
42e19ff809 | ||
![]() |
ace1fb2c40 | ||
![]() |
6d796f35bf | ||
![]() |
e5f381be25 | ||
![]() |
06a9b0406c | ||
![]() |
1496d358f8 | ||
![]() |
6100d7f054 | ||
![]() |
37b94b23bf | ||
![]() |
0c7ceb25df | ||
![]() |
7ceb17907d | ||
![]() |
07c4d271e3 | ||
![]() |
febd993f29 | ||
![]() |
19b7250b61 | ||
![]() |
fccb790a2d | ||
![]() |
c99e57ea74 | ||
![]() |
fe3f28d7c4 | ||
![]() |
f436a8b4f4 | ||
![]() |
588e7abcbb | ||
![]() |
a7e24dc3aa | ||
![]() |
9d237ac273 | ||
![]() |
c99f9140f9 | ||
![]() |
911ad06a9c | ||
![]() |
fdba169ba4 | ||
![]() |
cdfa8c54c1 | ||
![]() |
9f82653208 | ||
![]() |
18fae13330 | ||
![]() |
9b2089982c | ||
![]() |
d8ba6e2701 | ||
![]() |
b44060fafb | ||
![]() |
48bb11fc71 | ||
![]() |
8fe197f4d8 | ||
![]() |
c3ec983215 | ||
![]() |
be1fbdc928 | ||
![]() |
d5bf51ba9d | ||
![]() |
66207e2da4 | ||
![]() |
52e3e78d2f | ||
![]() |
43703b94f8 | ||
![]() |
32735aa730 | ||
![]() |
e1c16f0f5f | ||
![]() |
e502e6a36d | ||
![]() |
39e24c1b0e | ||
![]() |
2b9d6934dd | ||
![]() |
791bea386e | ||
![]() |
f206f44ba3 | ||
![]() |
b0f94c2f2b | ||
![]() |
730d0d11c1 | ||
![]() |
9a7e1eaee1 | ||
![]() |
6a0ee9ed63 | ||
![]() |
ea432c32e8 | ||
![]() |
e2fc131e0e | ||
![]() |
23a31230a4 | ||
![]() |
1a97616e38 | ||
![]() |
0037013ca3 | ||
![]() |
2c7104ab22 | ||
![]() |
d253dac325 | ||
![]() |
a3fbb6f47e | ||
![]() |
347cd47e7a | ||
![]() |
a283287a04 | ||
![]() |
d149d9dce8 | ||
![]() |
07eda17fa6 | ||
![]() |
ae1ea484ef | ||
![]() |
a7cec08850 | ||
![]() |
9800bcf421 | ||
![]() |
bcfdb0bab4 | ||
![]() |
ed45c52dc3 | ||
![]() |
2c46638651 | ||
![]() |
06246c0ebf | ||
![]() |
3ce7630321 | ||
![]() |
f3d1b3c787 | ||
![]() |
7693a97177 | ||
![]() |
cff36290ba | ||
![]() |
921d66baa6 | ||
![]() |
3cf35bea34 | ||
![]() |
b2ce29f5f2 | ||
![]() |
8ee99fa5a0 | ||
![]() |
3024a73c4c | ||
![]() |
9f73d866b2 | ||
![]() |
fedbf58402 | ||
![]() |
8d05fa5936 | ||
![]() |
96ca5739d2 | ||
![]() |
8738f0eb42 | ||
![]() |
a382d76153 | ||
![]() |
069cd86b25 | ||
![]() |
b230d14d4a | ||
![]() |
4816895399 | ||
![]() |
16e2a08efa | ||
![]() |
b087fde663 | ||
![]() |
7c502e9b20 | ||
![]() |
6f5c851e2b | ||
![]() |
da0c7f572e | ||
![]() |
d977a18e16 | ||
![]() |
9af2a9e0dc | ||
![]() |
0b4891a983 | ||
![]() |
5aef1f0fcb | ||
![]() |
98ff821c6c | ||
![]() |
ff9befda85 | ||
![]() |
5dd8bd399e | ||
![]() |
d2616beba3 | ||
![]() |
4089059f6d | ||
![]() |
ecae7335d9 | ||
![]() |
e2a76f8377 | ||
![]() |
0dcc85b806 | ||
![]() |
a34f59bb3d | ||
![]() |
a7884fc1f1 | ||
![]() |
2768426235 | ||
![]() |
7b5366b24e | ||
![]() |
406897e9dd | ||
![]() |
5549ccfdbd | ||
![]() |
1dd617648a | ||
![]() |
145e8fe01d | ||
![]() |
5829bf4622 | ||
![]() |
d542f3e75a | ||
![]() |
f67b0c8141 | ||
![]() |
396362494e | ||
![]() |
2ed387700f | ||
![]() |
87b8cf2c77 | ||
![]() |
8afd1cc674 | ||
![]() |
aad34c2575 | ||
![]() |
37f8e050c6 | ||
![]() |
f65401a237 | ||
![]() |
508092e0f1 | ||
![]() |
effec778fa | ||
![]() |
5f137ff0e3 | ||
![]() |
69eb95e0e9 | ||
![]() |
192779a1b7 | ||
![]() |
06b821a3a3 | ||
![]() |
f2b516d7ed | ||
![]() |
154e8768ea | ||
![]() |
28734203c6 | ||
![]() |
12fde5007b | ||
![]() |
7a6d80b9dc | ||
![]() |
2ff80a1074 | ||
![]() |
d79408dc79 | ||
![]() |
dcaef56e86 | ||
![]() |
1940a3a1a5 | ||
![]() |
a4e8aa2d7b | ||
![]() |
fbebc52220 | ||
![]() |
5fe7284385 | ||
![]() |
bf45b91ddc | ||
![]() |
6ae0ca58b2 | ||
![]() |
19aed69038 | ||
![]() |
9ccc9e6a08 | ||
![]() |
373859f3e7 | ||
![]() |
87f85a38ce | ||
![]() |
b85014303e | ||
![]() |
d8ecdc5e81 | ||
![]() |
12a4aa5e1b | ||
![]() |
8fc30c7d0f | ||
![]() |
6f552f48a8 | ||
![]() |
c4edba70d0 | ||
![]() |
44c8dca9df | ||
![]() |
af39c701bc | ||
![]() |
2fc2615136 | ||
![]() |
17b8793ef4 | ||
![]() |
024de41c1b | ||
![]() |
53db79c4db | ||
![]() |
b0ab077348 | ||
![]() |
b642996f50 | ||
![]() |
088dd482f5 | ||
![]() |
ca9c6f8e15 | ||
![]() |
8b1bcdc8ca | ||
![]() |
3999c0617a | ||
![]() |
59782298db | ||
![]() |
4596089820 | ||
![]() |
c3d5d3204e | ||
![]() |
87638e6d7f | ||
![]() |
3590e75d65 | ||
![]() |
bbd9aaeb60 | ||
![]() |
a618cd5130 | ||
![]() |
9d7a8bafed | ||
![]() |
d2d08203ee | ||
![]() |
e1a1ab7396 | ||
![]() |
a3fb24db02 | ||
![]() |
993d3b1302 | ||
![]() |
c9d2cdc4f4 | ||
![]() |
050b5b973c | ||
![]() |
57ed0eeae2 | ||
![]() |
e8903492e7 | ||
![]() |
6fdf040975 | ||
![]() |
53bc2ceb66 | ||
![]() |
17c4eb1523 | ||
![]() |
5c7491aa32 | ||
![]() |
6469a61e2e | ||
![]() |
a905828920 | ||
![]() |
f9b860d177 | ||
![]() |
fade529d49 | ||
![]() |
8e77afa351 | ||
![]() |
a353027893 | ||
![]() |
7f3e434c81 | ||
![]() |
8dee6367d6 | ||
![]() |
fba2cdef06 | ||
![]() |
a1130634ec | ||
![]() |
9efc729e4d | ||
![]() |
6d6638575f | ||
![]() |
23cfc97c80 | ||
![]() |
a92330a19d | ||
![]() |
7ac257c71a | ||
![]() |
0add8f1f04 | ||
![]() |
2227d82c33 | ||
![]() |
e239f3e6e0 | ||
![]() |
4d3c5f6f53 | ||
![]() |
fd8fd378b9 | ||
![]() |
4dde2a0201 | ||
![]() |
1976baead1 | ||
![]() |
bbcb5db1db | ||
![]() |
608b4110b6 | ||
![]() |
da93d186f1 | ||
![]() |
c87c7aa2c8 | ||
![]() |
6ab3e5b86d | ||
![]() |
45ff073e9f | ||
![]() |
6a58f96fc9 | ||
![]() |
1ea243c76f | ||
![]() |
00919e8b0c | ||
![]() |
06371c19ee | ||
![]() |
63a01375b9 | ||
![]() |
85d89086f8 | ||
![]() |
fde7757bdc | ||
![]() |
4dd68b3d2c | ||
![]() |
00c36756aa | ||
![]() |
582a6b5c1f | ||
![]() |
4e4814e17a | ||
![]() |
d8726356db | ||
![]() |
9b08749f22 | ||
![]() |
b795869914 | ||
![]() |
750165e7d9 | ||
![]() |
b724c53165 | ||
![]() |
c9a4175c90 | ||
![]() |
74c8016e4a | ||
![]() |
e91de7f442 | ||
![]() |
7fa5bcf505 | ||
![]() |
9de116e86f | ||
![]() |
70710a9018 | ||
![]() |
e848c5a129 | ||
![]() |
12b27f3eb2 | ||
![]() |
869fd1e238 | ||
![]() |
5ca7cc147a | ||
![]() |
301e671747 | ||
![]() |
cca6adf473 | ||
![]() |
881eb94d48 | ||
![]() |
daf4818cc2 | ||
![]() |
98b6904d89 | ||
![]() |
b34ca17bf1 | ||
![]() |
85bec2210a | ||
![]() |
8bff4c7b8b | ||
![]() |
838bfa8d67 | ||
![]() |
a1d5054af4 | ||
![]() |
82a88cb504 | ||
![]() |
e5f206b0e9 | ||
![]() |
8381cb4a55 | ||
![]() |
fb497c234b | ||
![]() |
4a4b7698c6 | ||
![]() |
21dbcf3a12 | ||
![]() |
9817b48708 | ||
![]() |
065ad4074d | ||
![]() |
5f420b4128 | ||
![]() |
26a33f6388 | ||
![]() |
76ee5407f2 | ||
![]() |
e74d542010 | ||
![]() |
cff72ed185 | ||
![]() |
dd5d95aa1b | ||
![]() |
512ef7ee8e | ||
![]() |
3d69d41e41 | ||
![]() |
95a1b3ec59 | ||
![]() |
3d78dc667c | ||
![]() |
ff63f75557 | ||
![]() |
5c683189f4 | ||
![]() |
f12118f51b | ||
![]() |
4d8a4f67ef | ||
![]() |
e4715ad9ed | ||
![]() |
4fed581829 | ||
![]() |
03639bbb01 | ||
![]() |
1568067c04 | ||
![]() |
e718b21baa | ||
![]() |
b4a0b9fe24 | ||
![]() |
ef383afd15 | ||
![]() |
f98cf08c19 | ||
![]() |
4b6bbd24a6 | ||
![]() |
db830315c6 | ||
![]() |
a578979147 | ||
![]() |
98e01c2ebb | ||
![]() |
5e0adc808e | ||
![]() |
aaafa53f5e | ||
![]() |
70b0c56037 | ||
![]() |
00270ca4b7 | ||
![]() |
506017f63e | ||
![]() |
f7ff49182d | ||
![]() |
f60c3060d4 | ||
![]() |
ba985efe82 | ||
![]() |
5b0ccc607c | ||
![]() |
6aa2d26d97 | ||
![]() |
b22068d669 | ||
![]() |
be285fe061 | ||
![]() |
93eccbf5d8 | ||
![]() |
e6edff1d21 | ||
![]() |
181496912f | ||
![]() |
03442b972b | ||
![]() |
15ffb214b8 | ||
![]() |
17affe8b63 | ||
![]() |
b11f6af166 | ||
![]() |
98695afbf4 | ||
![]() |
0a19ab2da7 | ||
![]() |
55005cfebd | ||
![]() |
5685f86d47 | ||
![]() |
78034682ac | ||
![]() |
d55007bfc1 | ||
![]() |
eeb52d3979 | ||
![]() |
d2cb17a4b3 | ||
![]() |
b4a1b49a8b | ||
![]() |
6fcf98ed83 | ||
![]() |
ffb9bee2eb | ||
![]() |
5a8a0d8802 | ||
![]() |
e6ce0a1d0f | ||
![]() |
f143049ae3 | ||
![]() |
f691771bdd | ||
![]() |
77c1a5ebeb | ||
![]() |
f1abda5f05 | ||
![]() |
abe8df00a5 | ||
![]() |
cfde4a8c8e | ||
![]() |
466a2146f3 | ||
![]() |
1e6cba4baa | ||
![]() |
72704cc740 | ||
![]() |
038f673c0f | ||
![]() |
532821394b | ||
![]() |
5276d381e2 | ||
![]() |
ef8dc8df98 | ||
![]() |
0d323c9249 | ||
![]() |
ac7c9c2ff6 | ||
![]() |
7a42e9b175 | ||
![]() |
eee82d1336 | ||
![]() |
d4b7df32ad | ||
![]() |
be60cb9aae | ||
![]() |
bdb317a845 | ||
![]() |
2e61c7e7bf | ||
![]() |
5bd86cd790 | ||
![]() |
6ddcc7e16c | ||
![]() |
e801d17a83 | ||
![]() |
cf96f863a2 | ||
![]() |
51d9f3fd16 | ||
![]() |
57c0c54366 | ||
![]() |
5393a5ac93 | ||
![]() |
6de6f965c4 | ||
![]() |
9a32211ecc | ||
![]() |
355c8084f6 | ||
![]() |
1ca7da2707 | ||
![]() |
436b016375 | ||
![]() |
d5f1c94641 | ||
![]() |
4f48167d73 | ||
![]() |
4cee4c3804 | ||
![]() |
95fbd18448 | ||
![]() |
ac66fa5693 | ||
![]() |
ea8537b3ae | ||
![]() |
3d59dbbdf1 | ||
![]() |
ab9358fcdf | ||
![]() |
68d36ef00b | ||
![]() |
49959e12c7 | ||
![]() |
a889a2085e | ||
![]() |
b19751f61a | ||
![]() |
f2d6daeda2 | ||
![]() |
84413d2c53 | ||
![]() |
bc749a31f5 | ||
![]() |
c8204870d5 | ||
![]() |
d772a795b5 | ||
![]() |
4aed67a534 | ||
![]() |
e1053ada73 | ||
![]() |
977c225e9f | ||
![]() |
72649641f8 | ||
![]() |
5313ffc47d | ||
![]() |
023a0d4166 | ||
![]() |
fda4cc3f26 | ||
![]() |
c71e233dce | ||
![]() |
92cdec0552 | ||
![]() |
d8d057bd50 | ||
![]() |
6835489eff | ||
![]() |
554a6e1354 | ||
![]() |
7d81ead49a | ||
![]() |
75a3650bc8 | ||
![]() |
8f324eb140 | ||
![]() |
cde62dcded | ||
![]() |
cd22944c74 | ||
![]() |
ac739e5c74 | ||
![]() |
d0a4f05a4b | ||
![]() |
6bec5e4554 | ||
![]() |
bb65d5c4e1 | ||
![]() |
978c921d96 | ||
![]() |
183929956b | ||
![]() |
e118dc349a | ||
![]() |
0f114484e3 | ||
![]() |
9f2fb59b2f | ||
![]() |
0b3e4f6f7e | ||
![]() |
e9503fa9ea | ||
![]() |
9cb6216109 | ||
![]() |
02b77f894b | ||
![]() |
a1c05e9ec5 | ||
![]() |
87ef4ed013 | ||
![]() |
aa11d81922 | ||
![]() |
e47a90a87b | ||
![]() |
fb7299297c | ||
![]() |
4c1794e792 | ||
![]() |
b9c1424f7c | ||
![]() |
ca531faefb | ||
![]() |
6237ab3e66 | ||
![]() |
05e1c53107 | ||
![]() |
daa264e7cf | ||
![]() |
e78f66c923 | ||
![]() |
23fc46bc09 | ||
![]() |
1d9f40bca3 | ||
![]() |
29ff2335f8 | ||
![]() |
86ab06486a | ||
![]() |
5d7c9a79ac | ||
![]() |
71f938b9da | ||
![]() |
7c332e0f63 | ||
![]() |
e90796cbae | ||
![]() |
51b5e738ee | ||
![]() |
001abbe5ce | ||
![]() |
06f80f294d | ||
![]() |
f046234692 | ||
![]() |
4c39395dbc | ||
![]() |
758bfe62a9 | ||
![]() |
4a677c6099 | ||
![]() |
ec532c612e | ||
![]() |
243ece241d | ||
![]() |
221cf3131c | ||
![]() |
5aae363fd5 | ||
![]() |
357ed939aa | ||
![]() |
5b0feca548 | ||
![]() |
135e2fe73f | ||
![]() |
51758c5385 | ||
![]() |
ff55094651 | ||
![]() |
e68a832aec | ||
![]() |
c21d84c717 | ||
![]() |
641a5680a6 | ||
![]() |
a381013801 | ||
![]() |
331c51b144 | ||
![]() |
1b2fb55aa4 | ||
![]() |
a2e3f2e842 | ||
![]() |
19797fdc5f | ||
![]() |
710d5db7dc | ||
![]() |
bdce13998e | ||
![]() |
480af047e4 | ||
![]() |
0f05c81fb8 | ||
![]() |
f5fa48f46c | ||
![]() |
11ddb6ee11 | ||
![]() |
35a7c13422 | ||
![]() |
aa610c818e | ||
![]() |
1980a81204 | ||
![]() |
8bed56d707 | ||
![]() |
5de4491892 | ||
![]() |
0633e53a73 | ||
![]() |
13f1cc07a0 | ||
![]() |
17cc623027 | ||
![]() |
b854161542 | ||
![]() |
7e0e972221 | ||
![]() |
4d3f1a6e85 | ||
![]() |
3120758bfd | ||
![]() |
9dee454773 | ||
![]() |
41ea97c927 | ||
![]() |
a28ea22647 | ||
![]() |
99e76b1655 | ||
![]() |
82ec6c8b79 | ||
![]() |
77add3df11 | ||
![]() |
f9462f095f | ||
![]() |
87d3e42ce9 | ||
![]() |
8ed2523812 | ||
![]() |
e2e706dc6a | ||
![]() |
1e8e6b8363 | ||
![]() |
6bcafd3aa1 | ||
![]() |
549fae56bf | ||
![]() |
3991e25fcc | ||
![]() |
9ddcb28ef9 | ||
![]() |
cc0098b6aa | ||
![]() |
e5f10bbc3c | ||
![]() |
fc5a0427ec | ||
![]() |
12b11df2c6 | ||
![]() |
e7abaeac42 | ||
![]() |
f38950d91c | ||
![]() |
2c98cf1acd | ||
![]() |
f2a89c29df | ||
![]() |
f2b9e7bce7 | ||
![]() |
3370a283ea | ||
![]() |
7ad2dbf99a | ||
![]() |
4eecf93bc8 | ||
![]() |
db4a8decfe | ||
![]() |
5023107e40 | ||
![]() |
249798f2b3 | ||
![]() |
9eaa38e180 | ||
![]() |
fde0def7c8 | ||
![]() |
d664966d0b | ||
![]() |
3c526ac731 | ||
![]() |
6844d320fd | ||
![]() |
9f55680a6a | ||
![]() |
bed669fd77 | ||
![]() |
e9373b87d5 | ||
![]() |
7a0527b7a7 | ||
![]() |
e706079ed1 | ||
![]() |
0e3813c7ba | ||
![]() |
e50ad79f92 | ||
![]() |
121bb3e320 | ||
![]() |
f02e5e9e97 | ||
![]() |
fc09a1e6da | ||
![]() |
8684a2a431 | ||
![]() |
c43abafdab | ||
![]() |
aa82b3441f | ||
![]() |
873f2deee8 | ||
![]() |
d437b1a5a1 | ||
![]() |
19ba407129 | ||
![]() |
ba7049c818 | ||
![]() |
d096c39e5d | ||
![]() |
d8bc1c5163 | ||
![]() |
bef133a484 | ||
![]() |
2097daee79 | ||
![]() |
68934067a9 | ||
![]() |
17fc8fa920 | ||
![]() |
31545c5f12 | ||
![]() |
c50f5c62a9 | ||
![]() |
343fdba74b | ||
![]() |
93f0bf3ee6 | ||
![]() |
5c32eb370f | ||
![]() |
284d712ac7 | ||
![]() |
0e7f5b45f1 | ||
![]() |
186c98f8bd | ||
![]() |
61d1695fcb | ||
![]() |
b804645d6a | ||
![]() |
217d827f02 | ||
![]() |
083b93d310 | ||
![]() |
8cc50596e9 | ||
![]() |
ef5a5c04b3 | ||
![]() |
c9c40b0482 | ||
![]() |
b99b4ac1a3 | ||
![]() |
5fad84ed8e | ||
![]() |
66c5e46673 | ||
![]() |
716f5b1f27 | ||
![]() |
00208f2830 | ||
![]() |
b62d32ba1e | ||
![]() |
aa589f7dcb | ||
![]() |
8f9ac10a0c | ||
![]() |
82989fbd2a | ||
![]() |
a66a373c5b | ||
![]() |
deb8d6fb55 | ||
![]() |
f513fc637d | ||
![]() |
20a308e914 | ||
![]() |
17b2b59670 | ||
![]() |
760fdb38c2 | ||
![]() |
8695c6c0b7 | ||
![]() |
6bf061b089 | ||
![]() |
879a8de3c5 | ||
![]() |
76360b1819 | ||
![]() |
a37a041018 | ||
![]() |
5ef5107b62 | ||
![]() |
0567919fdc | ||
![]() |
f725511207 | ||
![]() |
bbd245ac3c | ||
![]() |
9fc61e30b5 | ||
![]() |
272fc3b1b8 | ||
![]() |
4e869deac5 | ||
![]() |
fb5675e9a8 | ||
![]() |
fbd49206d0 | ||
![]() |
2c4439245f | ||
![]() |
b0242d94d1 | ||
![]() |
dd621bb8dc | ||
![]() |
a06e58b582 | ||
![]() |
b0911ffb6b | ||
![]() |
03596ed073 | ||
![]() |
01a465d724 | ||
![]() |
18beb7ccf1 | ||
![]() |
231594186f | ||
![]() |
9cc076e5e2 | ||
![]() |
c183bce27d | ||
![]() |
0b0d62e841 | ||
![]() |
ac7495f9b8 | ||
![]() |
f428120a22 | ||
![]() |
00a2eca4fa | ||
![]() |
668bd64c4c | ||
![]() |
785db0d954 | ||
![]() |
41c12d5339 | ||
![]() |
f39e9e2ae3 | ||
![]() |
69829cb547 | ||
![]() |
7fbb6aa466 | ||
![]() |
8eedf5b148 | ||
![]() |
618dea6d45 | ||
![]() |
1bf440872e | ||
![]() |
3fa8917607 | ||
![]() |
b734569abe | ||
![]() |
fb82977b97 | ||
![]() |
5b5cc3d69b | ||
![]() |
c0d5e4f6ea | ||
![]() |
994ccbb07b | ||
![]() |
230ec0bb6a | ||
![]() |
5267138693 | ||
![]() |
357bfaeaf6 | ||
![]() |
6136730fab | ||
![]() |
38e8db9e70 | ||
![]() |
be9f264492 | ||
![]() |
7440445104 | ||
![]() |
03db2a2f09 | ||
![]() |
c8891e7dea | ||
![]() |
32831a8a77 | ||
![]() |
90cb3849b5 | ||
![]() |
fe6dd75704 | ||
![]() |
5c23ec3ec7 | ||
![]() |
81a7c81750 | ||
![]() |
256d5936e6 | ||
![]() |
a7ac3b0097 | ||
![]() |
dc0167a300 | ||
![]() |
649fab3826 | ||
![]() |
dcc3a0d349 | ||
![]() |
5e532757cb | ||
![]() |
329d26149b | ||
![]() |
793a74268c | ||
![]() |
6aa4829f1a | ||
![]() |
ab2ee404b5 | ||
![]() |
916cd0fa3d | ||
![]() |
93ef996afb | ||
![]() |
d36ef5ee48 | ||
![]() |
b0457580b5 | ||
![]() |
98746b26c7 | ||
![]() |
63497bbed3 | ||
![]() |
f43b71a375 | ||
![]() |
65215426c9 | ||
![]() |
78a0b5ce34 | ||
![]() |
4ccec42125 | ||
![]() |
0dd7605834 | ||
![]() |
f4c4a94000 | ||
![]() |
10fd77a9b8 | ||
![]() |
7155c3e816 | ||
![]() |
60f5b02e78 | ||
![]() |
5665ea831e | ||
![]() |
a6a67ce520 | ||
![]() |
394cd39b57 | ||
![]() |
a8e7c05589 | ||
![]() |
f30e534bfb | ||
![]() |
317c7842a7 | ||
![]() |
d6cbff51c2 | ||
![]() |
b8667b7b8b | ||
![]() |
867098d483 | ||
![]() |
f37259c09f | ||
![]() |
aeae84b017 | ||
![]() |
dd5c63da90 | ||
![]() |
5f12850321 | ||
![]() |
a5c703a60a | ||
![]() |
3189ae6657 | ||
![]() |
e1d1a52d9e | ||
![]() |
8f40304c6d | ||
![]() |
45655d4395 | ||
![]() |
b84b6ba499 | ||
![]() |
b391fd0a44 | ||
![]() |
11745752a5 | ||
![]() |
a9a9318004 | ||
![]() |
ddbbdb265b | ||
![]() |
8fb5c53373 | ||
![]() |
ac72a8f29a | ||
![]() |
721e08f2f0 | ||
![]() |
d992c62d6f | ||
![]() |
f745733f4b | ||
![]() |
fc51ec31ce | ||
![]() |
7eba561470 | ||
![]() |
88700a83d6 | ||
![]() |
523747c983 | ||
![]() |
f1605a566f | ||
![]() |
335ed6ddd6 | ||
![]() |
ebf1c36d05 | ||
![]() |
d654c5f40d | ||
![]() |
94c5138388 | ||
![]() |
e9048d5180 | ||
![]() |
c235248078 | ||
![]() |
99c148883e | ||
![]() |
15c44e8925 | ||
![]() |
85e69ed678 | ||
![]() |
6cda13852c | ||
![]() |
af3d85b54c | ||
![]() |
7d5336c6fe | ||
![]() |
6966c62e8f | ||
![]() |
a4d1e5d120 | ||
![]() |
3f70f08084 | ||
![]() |
20c6ac32d0 | ||
![]() |
bb1d277cb0 | ||
![]() |
613fa43f0d | ||
![]() |
eab3e8fc42 | ||
![]() |
e78f9c699a | ||
![]() |
4b2b273783 | ||
![]() |
0c75dee12c | ||
![]() |
b707844fc1 | ||
![]() |
db7e99ea96 | ||
![]() |
1cdc2193e8 | ||
![]() |
2f2c42e626 | ||
![]() |
8d4bc41bcc | ||
![]() |
3b8e1d34fd | ||
![]() |
864e58c1a9 | ||
![]() |
4b7f967229 | ||
![]() |
260e257f59 | ||
![]() |
df4fb65733 | ||
![]() |
f2285541bb | ||
![]() |
9a3e34381c | ||
![]() |
6540b19ae2 | ||
![]() |
43d55a9260 | ||
![]() |
8a80a4dc51 | ||
![]() |
e53690d3c3 | ||
![]() |
f78c6807db | ||
![]() |
2184419290 | ||
![]() |
d17a891dd5 | ||
![]() |
5d032aa24c | ||
![]() |
682c086335 | ||
![]() |
179b9d612c | ||
![]() |
23fed0359f | ||
![]() |
6ad39da458 | ||
![]() |
1b5b07c195 | ||
![]() |
608e0e1c97 | ||
![]() |
0d38e7ef5e | ||
![]() |
8a0817b8be | ||
![]() |
208851ae17 | ||
![]() |
989812ce38 | ||
![]() |
77a1ed0fb2 | ||
![]() |
cd1c9e4bca | ||
![]() |
35f3147c2c | ||
![]() |
32162294f6 | ||
![]() |
8a39af7924 | ||
![]() |
db38ea01e6 | ||
![]() |
93bb3b24f7 | ||
![]() |
5030933abf | ||
![]() |
e13c31c63d | ||
![]() |
07a9ffb621 | ||
![]() |
d6cdc28f75 | ||
![]() |
90b0b7232c | ||
![]() |
a7fa005645 | ||
![]() |
a29180d437 | ||
![]() |
dab558c3c0 | ||
![]() |
f5a9514c43 | ||
![]() |
b1ebb9b6c4 | ||
![]() |
c4646b237a | ||
![]() |
81f2ba28af | ||
![]() |
150c510371 | ||
![]() |
5c55404100 | ||
![]() |
bdb6057e2e | ||
![]() |
0e0e740179 | ||
![]() |
9b45ce37d5 | ||
![]() |
0c5b1ebae2 | ||
![]() |
bc25f25bbb | ||
![]() |
c8d83326a9 | ||
![]() |
c1a3d1ff2c | ||
![]() |
444082f396 | ||
![]() |
a16a829056 | ||
![]() |
989472802e | ||
![]() |
3536b626d4 | ||
![]() |
693a762199 | ||
![]() |
10c969f9b1 | ||
![]() |
977c1694c3 | ||
![]() |
2f6c90420e | ||
![]() |
24e542c242 | ||
![]() |
1a512e01e1 | ||
![]() |
d5cde27a0d | ||
![]() |
2fa6c72fd8 | ||
![]() |
d387e2195b | ||
![]() |
a1ec17d17a | ||
![]() |
c570761e0c | ||
![]() |
0fb6c68fb9 | ||
![]() |
22626c7ae9 | ||
![]() |
11dcc99665 | ||
![]() |
8328c0a475 | ||
![]() |
8d315b7fa9 | ||
![]() |
4869dd1e3a | ||
![]() |
5429d38cdf | ||
![]() |
862de9828c | ||
![]() |
7e18e6d3cb | ||
![]() |
e3cb529816 | ||
![]() |
cce8195075 | ||
![]() |
235be36e8c | ||
![]() |
dc3258a5f9 | ||
![]() |
f2d8159d36 | ||
![]() |
be14c48ae9 | ||
![]() |
07b727bb72 | ||
![]() |
1100fa205b | ||
![]() |
478ff8b33d | ||
![]() |
17c8433f9a | ||
![]() |
ed3110c07b | ||
![]() |
7e5b736d3a | ||
![]() |
677c1faa98 | ||
![]() |
5d70373f42 | ||
![]() |
7aa5c95467 | ||
![]() |
6fb1470d1b | ||
![]() |
0bd792833d | ||
![]() |
b03a393c9c | ||
![]() |
37ec3e4df9 | ||
![]() |
76a24f9af3 | ||
![]() |
11609bccf2 | ||
![]() |
a26d1fb48a | ||
![]() |
7a7d7f3323 | ||
![]() |
4ad947ca67 | ||
![]() |
1c3f67265c | ||
![]() |
baee0e24e0 | ||
![]() |
a5c43b8d59 | ||
![]() |
9e1ed22c80 | ||
![]() |
1e97dc887c | ||
![]() |
677d41ea92 | ||
![]() |
05dd261789 | ||
![]() |
b29c60bf14 | ||
![]() |
a9de3007d4 | ||
![]() |
448e39924d | ||
![]() |
5ab8da0794 | ||
![]() |
9855c1b154 | ||
![]() |
667e63d1a4 | ||
![]() |
3d4a8b5f9d | ||
![]() |
ac53979104 | ||
![]() |
d4f01aa590 | ||
![]() |
9607a3801d | ||
![]() |
9ead45dc1c | ||
![]() |
7d226076a3 | ||
![]() |
73d5619615 | ||
![]() |
74fc03f354 | ||
![]() |
25877948ad | ||
![]() |
26df391130 | ||
![]() |
04d13ef26b | ||
![]() |
d0a4d126fc | ||
![]() |
439d26f803 | ||
![]() |
1696712c21 | ||
![]() |
451b511f1f | ||
![]() |
639a777bfe | ||
![]() |
c56f8ff20f | ||
![]() |
dcb63fad1b | ||
![]() |
b8646a8423 | ||
![]() |
46d8eecb51 | ||
![]() |
2f7227e799 | ||
![]() |
a0e2c14f1c | ||
![]() |
41ca908c34 | ||
![]() |
b1c1e9210d | ||
![]() |
d9ccea5c8b | ||
![]() |
57549f66c5 | ||
![]() |
4a966df119 | ||
![]() |
9c6622709a | ||
![]() |
ea835fc2fa | ||
![]() |
3a7660d349 | ||
![]() |
e83277014f | ||
![]() |
e186aea21e | ||
![]() |
ce2f8b99f5 | ||
![]() |
3658bbb3aa | ||
![]() |
92fe955910 | ||
![]() |
337194538d | ||
![]() |
14be68fef8 | ||
![]() |
0dba4745d3 | ||
![]() |
61bd9af894 | ||
![]() |
a10dc3b3fb | ||
![]() |
b1d460cd40 | ||
![]() |
0e6bf3bb08 | ||
![]() |
a6deb99720 | ||
![]() |
1b0e504a0e | ||
![]() |
d73a89c553 | ||
![]() |
6017e86665 | ||
![]() |
6c8c8bf2bd | ||
![]() |
9204fef03d | ||
![]() |
3cf38597a6 | ||
![]() |
15a827acd6 | ||
![]() |
0ff7560e16 | ||
![]() |
d97e8a8826 | ||
![]() |
80cf3cf26a | ||
![]() |
a018a6181b | ||
![]() |
2fba6f4bb7 | ||
![]() |
b2f02ae8fe | ||
![]() |
c1fd0782a9 | ||
![]() |
bed2b24fff | ||
![]() |
dae62c94e3 | ||
![]() |
6d1d58ff9a | ||
![]() |
877aff9548 | ||
![]() |
c44b6a1539 | ||
![]() |
55423aaf30 | ||
![]() |
e25105c58b | ||
![]() |
362823dc1a | ||
![]() |
40afd47fc5 | ||
![]() |
fff5c8c2b2 | ||
![]() |
65c272aea5 | ||
![]() |
8f8d8c8bc4 | ||
![]() |
82a687dcb7 | ||
![]() |
6a73c43f96 | ||
![]() |
3c3ddd0f31 | ||
![]() |
97a8b1295e | ||
![]() |
a7d5e2ffc2 | ||
![]() |
4bd4591d6a | ||
![]() |
f75ce66443 | ||
![]() |
54b3f4398a | ||
![]() |
84707b8d1c | ||
![]() |
c04a50fafc | ||
![]() |
584607cd9b | ||
![]() |
53532e6f1b | ||
![]() |
06c1f65f97 | ||
![]() |
ef28cb4a14 | ||
![]() |
0453083424 | ||
![]() |
cf657259ae | ||
![]() |
363209cd15 | ||
![]() |
59d4a7367f | ||
![]() |
39ec42d167 | ||
![]() |
537218b46e | ||
![]() |
a3426e5ca5 | ||
![]() |
f860e8e564 | ||
![]() |
75eb8c7f32 | ||
![]() |
806585a26b | ||
![]() |
8c5806abda | ||
![]() |
ca8cd89c8b | ||
![]() |
9a1a7f4626 | ||
![]() |
7f4234a18d | ||
![]() |
940c5ae159 | ||
![]() |
221bc5bd76 | ||
![]() |
8d46eb4dda | ||
![]() |
010dedb069 | ||
![]() |
984ccebb3f | ||
![]() |
6f5f666a5f | ||
![]() |
a647223c78 | ||
![]() |
5c3f23277c | ||
![]() |
f08b47a53f | ||
![]() |
f715217ff0 | ||
![]() |
b2289fb65b | ||
![]() |
4021ef40c5 | ||
![]() |
dcd717a07b | ||
![]() |
f6941873ce | ||
![]() |
d2d8be033c | ||
![]() |
7414c0e37b | ||
![]() |
5bb3361eac | ||
![]() |
68ddd4bc59 | ||
![]() |
f7c0c90478 | ||
![]() |
9f8224c0a0 | ||
![]() |
8ee2245f24 | ||
![]() |
7dcfa332b5 | ||
![]() |
ca8770374f | ||
![]() |
8577a52e98 | ||
![]() |
73d11e0f9d | ||
![]() |
3da25900f3 | ||
![]() |
dbc0fddf10 | ||
![]() |
86c84e4120 | ||
![]() |
c3a8dc4e0a | ||
![]() |
2dc0026e4d | ||
![]() |
cad52d7072 | ||
![]() |
9f729e5e3e | ||
![]() |
e0f7ea5d08 | ||
![]() |
528293e39d | ||
![]() |
3f26071a29 | ||
![]() |
5a9b7d4ba6 | ||
![]() |
1a91c6d9c2 | ||
![]() |
18ace1afc1 | ||
![]() |
951fbf6579 | ||
![]() |
55e7bd8daf | ||
![]() |
b76b0fa0e5 | ||
![]() |
e7c83ca06b | ||
![]() |
3666f8fc00 | ||
![]() |
2081c677a1 | ||
![]() |
2a0ef501a2 | ||
![]() |
d661c184e2 | ||
![]() |
f276f842b8 | ||
![]() |
bb31ce01b6 | ||
![]() |
bf032f18ca | ||
![]() |
81dad03bbf | ||
![]() |
427495fc74 | ||
![]() |
1b7a47d61e | ||
![]() |
c69e71989e | ||
![]() |
62b0bc2524 | ||
![]() |
138c55ba91 | ||
![]() |
b1d84eff53 | ||
![]() |
ee80e5dfef | ||
![]() |
fb4b14a6b3 | ||
![]() |
0bdaa01099 | ||
![]() |
87e6fc56a0 | ||
![]() |
aba2595913 | ||
![]() |
3d9364209b | ||
![]() |
909a7dad6a | ||
![]() |
c869a07bd6 | ||
![]() |
8ba23a6d11 | ||
![]() |
e5948745ee | ||
![]() |
24840717bf | ||
![]() |
876c331d84 | ||
![]() |
e5a4863f30 | ||
![]() |
920a58fbb3 | ||
![]() |
40e5fd44c4 | ||
![]() |
7be94511a4 | ||
![]() |
de52b741a1 | ||
![]() |
3248a66ddd | ||
![]() |
806954d4bd | ||
![]() |
0a05d958bf | ||
![]() |
ae4135b526 | ||
![]() |
1479662538 | ||
![]() |
9ee12f31ad | ||
![]() |
cc17d00d00 | ||
![]() |
bcc12f4a1c | ||
![]() |
d0244e0da6 | ||
![]() |
ac3abe5b8c | ||
![]() |
9e22d67df0 | ||
![]() |
de2e09cc0a | ||
![]() |
9144a6f52b | ||
![]() |
f5fde15498 | ||
![]() |
6bc84a34cc | ||
![]() |
e675f27f7a | ||
![]() |
497a323a0f | ||
![]() |
6c40e565f9 | ||
![]() |
c9d158a26c | ||
![]() |
d29aea417d | ||
![]() |
7d5185a49b | ||
![]() |
d129b215c0 | ||
![]() |
f084a5f7f6 | ||
![]() |
9739debd02 | ||
![]() |
ffbb5bce7b | ||
![]() |
839c3ed835 | ||
![]() |
c74ed37c4e | ||
![]() |
b1f3ae32fa | ||
![]() |
189acebbef | ||
![]() |
48e3beb9c2 | ||
![]() |
c1481d51a0 | ||
![]() |
0298e8c795 | ||
![]() |
73f58892e8 | ||
![]() |
85abd6bbb7 | ||
![]() |
c767dbc302 | ||
![]() |
04b3b43f88 | ||
![]() |
af965500ed | ||
![]() |
3d9d7bb246 | ||
![]() |
6f27b23719 | ||
![]() |
b6d17da8ef | ||
![]() |
0a9aaff4b8 | ||
![]() |
77caf67a8d | ||
![]() |
51cb04d363 | ||
![]() |
6e141f0f44 | ||
![]() |
ab2823dd00 | ||
![]() |
fe1f7693b7 | ||
![]() |
42983c34e7 | ||
![]() |
6497156f08 | ||
![]() |
95866defea | ||
![]() |
8d062a059f | ||
![]() |
f3b53db8ab | ||
![]() |
f3cb3e6e0f | ||
![]() |
824fd3392b | ||
![]() |
36d7269974 | ||
![]() |
4d42639fcb | ||
![]() |
3a571c7baf | ||
![]() |
79f3473467 | ||
![]() |
fd8b1697de | ||
![]() |
57a6d8dbf0 | ||
![]() |
1ed93ed1a1 | ||
![]() |
a75e5a23e3 | ||
![]() |
eba97a35ab | ||
![]() |
3ce3c60911 | ||
![]() |
3fdc9c1328 | ||
![]() |
e0d900c8fe | ||
![]() |
a7fa766d2e | ||
![]() |
0e58174817 | ||
![]() |
f16814466c | ||
![]() |
29510d5f4e | ||
![]() |
f914a1a7ca | ||
![]() |
004461b447 | ||
![]() |
3307b0f1f9 | ||
![]() |
903eed8c23 | ||
![]() |
b55309da0c | ||
![]() |
deafe9c5c4 | ||
![]() |
2a1368c5f6 | ||
![]() |
9ebf8c8f98 | ||
![]() |
9ef53d34de | ||
![]() |
239d41f121 | ||
![]() |
580ec563b9 | ||
![]() |
a99e5b0288 | ||
![]() |
408c285243 | ||
![]() |
11fc3bfa29 | ||
![]() |
8eaa91532d | ||
![]() |
72a16c036e | ||
![]() |
33826c0735 | ||
![]() |
bf015d32f0 | ||
![]() |
6fde5de6d9 | ||
![]() |
a9ceb63280 | ||
![]() |
c34990a564 | ||
![]() |
322e7dd9b7 | ||
![]() |
b7a8736cec | ||
![]() |
d2ee814031 | ||
![]() |
50d07e5132 | ||
![]() |
21fe1abd90 | ||
![]() |
b326c85638 | ||
![]() |
f7c14f8120 | ||
![]() |
45f2fbf7c2 | ||
![]() |
dbce0e14e9 | ||
![]() |
7fcd9c96f7 | ||
![]() |
3002efa8da | ||
![]() |
e03377dc91 | ||
![]() |
870bc4d8bf | ||
![]() |
5afd3dc59f | ||
![]() |
69e13ae328 | ||
![]() |
253111e901 | ||
![]() |
1eece7806e | ||
![]() |
06ede455b7 | ||
![]() |
bdf226ead2 | ||
![]() |
2d7b78df72 | ||
![]() |
d92879d830 | ||
![]() |
1804ff98ef | ||
![]() |
1c283c2d9c | ||
![]() |
1ed107e6e9 | ||
![]() |
d42dfe728f | ||
![]() |
ea20f12a56 | ||
![]() |
5a4038df87 | ||
![]() |
89bb89afe8 | ||
![]() |
6e4ace9643 | ||
![]() |
943dfcc767 | ||
![]() |
933f1c5574 | ||
![]() |
9a4d34b4e9 | ||
![]() |
3d707244b7 | ||
![]() |
5117c95b84 | ||
![]() |
d08bddc6f1 | ||
![]() |
8a16f940ef | ||
![]() |
1cd9a2cf06 | ||
![]() |
14da54b8b6 | ||
![]() |
c079332926 | ||
![]() |
5c8039e906 | ||
![]() |
b870adcfc4 | ||
![]() |
59f979a71f | ||
![]() |
9d306e2293 | ||
![]() |
67056369af | ||
![]() |
45b6f0e668 | ||
![]() |
a81940f9e5 | ||
![]() |
55b75f84a8 | ||
![]() |
614629ec0d | ||
![]() |
e11ba04bfb | ||
![]() |
164dea6c78 | ||
![]() |
9f05e30eaf | ||
![]() |
da421db465 | ||
![]() |
2b5e29cded | ||
![]() |
420aa456b3 | ||
![]() |
f9753c981e | ||
![]() |
9e48917e03 | ||
![]() |
6cf8eca2b7 | ||
![]() |
f496a3b854 | ||
![]() |
4ec894bc67 | ||
![]() |
8009530c69 | ||
![]() |
47e31c2d93 | ||
![]() |
e2be732b71 | ||
![]() |
0275dc8d31 | ||
![]() |
9ff8e7cf95 | ||
![]() |
e586638514 | ||
![]() |
ff083d366b | ||
![]() |
2efba6bac7 | ||
![]() |
992c1a9b3c | ||
![]() |
43a90151d0 | ||
![]() |
57b81fa363 | ||
![]() |
e2d4555cc6 | ||
![]() |
6e7c2db4ba | ||
![]() |
c2a9692247 | ||
![]() |
27629c067e | ||
![]() |
44a4ed2913 | ||
![]() |
bf2d6693ee | ||
![]() |
8a80241116 | ||
![]() |
7ad252cdf4 | ||
![]() |
f922d1811b | ||
![]() |
e40120043b | ||
![]() |
35a323e314 | ||
![]() |
9d261cc740 | ||
![]() |
c909eff767 | ||
![]() |
5db31e9f8e | ||
![]() |
c7b2951d99 | ||
![]() |
bf2078b396 | ||
![]() |
763dcd1200 | ||
![]() |
4b74b09f75 | ||
![]() |
9f09d2b8c7 | ||
![]() |
6f494ba384 | ||
![]() |
c3db3a3b4e | ||
![]() |
1d8867ce44 | ||
![]() |
8980daa265 | ||
![]() |
66b7f0c58d | ||
![]() |
51e001ec15 | ||
![]() |
02456424f6 | ||
![]() |
7e41d44753 | ||
![]() |
e4996a2ae6 | ||
![]() |
1e13ca711f | ||
![]() |
f53f08a068 | ||
![]() |
126a987801 | ||
![]() |
5aa6b5f0ae | ||
![]() |
55a26f65fa | ||
![]() |
118591e262 | ||
![]() |
b57a59cc60 | ||
![]() |
c8df2ce85a | ||
![]() |
9180a4c668 | ||
![]() |
b4c796577e | ||
![]() |
a7f153ce4b | ||
![]() |
b102609899 | ||
![]() |
f28b6e8512 | ||
![]() |
56c64d4cd7 | ||
![]() |
70adad83b4 | ||
![]() |
a248d54cec | ||
![]() |
3fc7ff54cd | ||
![]() |
21101c1be8 | ||
![]() |
af7e8541d8 | ||
![]() |
8ab8c847fc | ||
![]() |
aede98cba8 | ||
![]() |
0079c209d0 | ||
![]() |
beafcebd5a | ||
![]() |
cf1a7a5e2b | ||
![]() |
db2b2f2d33 | ||
![]() |
b76ea3a82b | ||
![]() |
84bf6e5fa9 | ||
![]() |
c1caedcd9e | ||
![]() |
37cb02b8e4 | ||
![]() |
2848ef61c7 | ||
![]() |
046199428b | ||
![]() |
877eb11435 | ||
![]() |
b9645cc4ae | ||
![]() |
cc2b154dba | ||
![]() |
dc3d65562a | ||
![]() |
72a13772d6 | ||
![]() |
27504373ef | ||
![]() |
7b2273618c | ||
![]() |
f61212b930 | ||
![]() |
4797999952 | ||
![]() |
524496efc9 | ||
![]() |
b94e7c846a | ||
![]() |
2769e38866 | ||
![]() |
5fea05f84d | ||
![]() |
c385fe21ea | ||
![]() |
0a221cce70 | ||
![]() |
ae15a1c5b1 | ||
![]() |
338b2ce84a | ||
![]() |
cfbdf98150 | ||
![]() |
de564d89ff | ||
![]() |
91003a2cf2 | ||
![]() |
509f969e9c | ||
![]() |
a06b16af23 | ||
![]() |
d7d022078e | ||
![]() |
24491508cd | ||
![]() |
236a086e2c | ||
![]() |
b8b6b86ce5 | ||
![]() |
138e8e744f | ||
![]() |
d3e20e22d7 | ||
![]() |
ca762a9220 | ||
![]() |
2e31e0094d | ||
![]() |
b27725ab72 | ||
![]() |
7a7da66a50 | ||
![]() |
c411c85589 | ||
![]() |
1fe4730af5 | ||
![]() |
2aba945f8d | ||
![]() |
4bea4e51db | ||
![]() |
fcd3e68039 | ||
![]() |
9e018a0a1b | ||
![]() |
5aabb48b10 | ||
![]() |
8ab2eecbd1 | ||
![]() |
9916417a0a | ||
![]() |
33f18e1287 | ||
![]() |
879abee53f | ||
![]() |
3b0c507715 | ||
![]() |
40ce10410a | ||
![]() |
d489087c6e | ||
![]() |
f2fc9f8397 | ||
![]() |
0c63053efd | ||
![]() |
4018f82728 | ||
![]() |
3b1195e56c | ||
![]() |
15d2eccbae | ||
![]() |
c9b56efb3a | ||
![]() |
d194415430 | ||
![]() |
2d5cb868a9 | ||
![]() |
ecaba666a4 | ||
![]() |
a9c52ea738 | ||
![]() |
cd0b76bba8 | ||
![]() |
b31783c3eb | ||
![]() |
7b87b1f6b9 | ||
![]() |
7ea3665e30 | ||
![]() |
6fd4c172fa | ||
![]() |
ee51f685ef | ||
![]() |
b9eab774dc | ||
![]() |
52e44b2053 | ||
![]() |
6bc6b45a8f | ||
![]() |
ff9ef83910 | ||
![]() |
e086cfc94f | ||
![]() |
4d2ab5ce2c | ||
![]() |
ef292b34cc | ||
![]() |
a9455c0608 | ||
![]() |
d541f2179f | ||
![]() |
0fb2bc840e | ||
![]() |
8a8cba9c0f | ||
![]() |
a97b7d9647 | ||
![]() |
6889b42963 | ||
![]() |
c5a092c8a4 | ||
![]() |
7fc565629d | ||
![]() |
0d1f8c9ce5 | ||
![]() |
bb2987c328 | ||
![]() |
031c82dd59 | ||
![]() |
16e0775c35 | ||
![]() |
25e08545d2 | ||
![]() |
b7c9fe4431 | ||
![]() |
de98e29f70 | ||
![]() |
a801f68340 | ||
![]() |
1d5dd2a8b0 | ||
![]() |
f1ff61950c | ||
![]() |
5c6d6c00b6 | ||
![]() |
de2a4bafaa | ||
![]() |
a83f1101cd | ||
![]() |
e0aae807fd | ||
![]() |
43354e585f | ||
![]() |
b8154415c9 | ||
![]() |
f7dbd043dd | ||
![]() |
b5468553b0 | ||
![]() |
848b1ccde1 | ||
![]() |
ac6e8f56df | ||
![]() |
a5bdb41736 | ||
![]() |
8d979d4e7b | ||
![]() |
7a8602d4ef | ||
![]() |
cd9c5ff78d | ||
![]() |
5fe1841992 | ||
![]() |
75afaff2cd | ||
![]() |
3e02724bb6 | ||
![]() |
9c0982f06d | ||
![]() |
c3e890c9fa | ||
![]() |
a4acca4e4f | ||
![]() |
42d8039de6 | ||
![]() |
b1347297b5 | ||
![]() |
b610b1b445 | ||
![]() |
6d3064552d | ||
![]() |
3c69329b73 | ||
![]() |
54285a7b9a | ||
![]() |
dd337e9d8e | ||
![]() |
03c6bf1a8e | ||
![]() |
6bf1364cd4 | ||
![]() |
38035d598a | ||
![]() |
28d38176c9 | ||
![]() |
98d85687a2 | ||
![]() |
14eb4bd396 | ||
![]() |
7d63b66381 | ||
![]() |
559b31d33e | ||
![]() |
56699e6525 | ||
![]() |
98166487ec | ||
![]() |
2f17c4aa18 | ||
![]() |
a0226f1024 | ||
![]() |
4574ae6056 | ||
![]() |
2c1fe3d272 | ||
![]() |
a2befe567c | ||
![]() |
7634ef7da5 | ||
![]() |
3a39873670 | ||
![]() |
6dea2b5458 | ||
![]() |
06683678b2 | ||
![]() |
a1abd96152 | ||
![]() |
7839e96c7a | ||
![]() |
296d830917 | ||
![]() |
098b42d917 | ||
![]() |
2d07900d03 | ||
![]() |
1d2a077b91 | ||
![]() |
1f0d0c9da9 | ||
![]() |
593d327660 | ||
![]() |
a033a95bab | ||
![]() |
ab8f1b4ae8 | ||
![]() |
63c69eea90 | ||
![]() |
9c2a4012da | ||
![]() |
93bb772db0 | ||
![]() |
7a71fb3682 | ||
![]() |
f312a1fbb1 | ||
![]() |
9502ebda5c | ||
![]() |
d139a53a3f | ||
![]() |
a5cf9d3bed | ||
![]() |
67f8885cc1 | ||
![]() |
8b8eefe93c | ||
![]() |
aa9a5a0b43 | ||
![]() |
fc77252171 | ||
![]() |
266f128733 | ||
![]() |
1135516798 | ||
![]() |
f549f6e13f | ||
![]() |
0a863371ef | ||
![]() |
effa7a9b02 | ||
![]() |
8ffb32716a | ||
![]() |
4ab5aa335e | ||
![]() |
9234fc0cc8 | ||
![]() |
2dc8c80598 | ||
![]() |
a1c4dd205a | ||
![]() |
b39fe62edc | ||
![]() |
cb22f9f56e | ||
![]() |
a0c4dbf53e | ||
![]() |
773f940e69 | ||
![]() |
097199bd95 | ||
![]() |
a7eef99be2 | ||
![]() |
3f6a28f3e6 | ||
![]() |
35c9c043dd | ||
![]() |
c5df48ed52 | ||
![]() |
6ae4b481f6 | ||
![]() |
d3bdd357e8 | ||
![]() |
532085c3ab | ||
![]() |
b60a21731a | ||
![]() |
5501a448b5 | ||
![]() |
19a3b797f0 | ||
![]() |
ff3e9f7630 | ||
![]() |
a728cbdcaf | ||
![]() |
61d7dc7944 | ||
![]() |
f46a7969b0 | ||
![]() |
72f4052526 | ||
![]() |
4fdee4bf07 | ||
![]() |
f3aca9da0a | ||
![]() |
3920d42e28 | ||
![]() |
944a9c4a46 | ||
![]() |
30dd767260 | ||
![]() |
d657edf783 | ||
![]() |
06a7e26454 | ||
![]() |
c16b2cb420 | ||
![]() |
a07e0a6b8d | ||
![]() |
911a1f941a | ||
![]() |
18ec890574 | ||
![]() |
5b9455b73e | ||
![]() |
267987763c | ||
![]() |
e937aa168f | ||
![]() |
cc8a1d6860 | ||
![]() |
5be306ce93 | ||
![]() |
169b5dfd7a | ||
![]() |
1319a566f9 | ||
![]() |
4c9b18697e | ||
![]() |
e08ca676e8 | ||
![]() |
4f291f5d8a | ||
![]() |
912de2fca2 | ||
![]() |
3c7b1b0e34 | ||
![]() |
6d1e9b1f9d | ||
![]() |
2a2916c1df | ||
![]() |
6a0a77d6de | ||
![]() |
1704d86b2f | ||
![]() |
f658ea2b86 | ||
![]() |
60ffd9ef7a | ||
![]() |
ae8d03ebdc | ||
![]() |
b54ac8b259 | ||
![]() |
5e243359ad | ||
![]() |
692086014c | ||
![]() |
bafdb2ca47 | ||
![]() |
4244c81ca8 | ||
![]() |
9ad7abd06e | ||
![]() |
50dd9b1a95 | ||
![]() |
0a76b3225c | ||
![]() |
1c98367ad1 | ||
![]() |
903691f990 | ||
![]() |
54db46c9b7 | ||
![]() |
5d0ed0a32b | ||
![]() |
1a389059d3 | ||
![]() |
33338c2c0c | ||
![]() |
9df0fd6440 | ||
![]() |
3cde6d5b2b | ||
![]() |
80e5343908 | ||
![]() |
91bd2bff63 | ||
![]() |
b3fb85c305 | ||
![]() |
6a89bfe961 | ||
![]() |
b977b22410 | ||
![]() |
aa9c5a17ff | ||
![]() |
efb2d2c878 | ||
![]() |
6b94709bfe | ||
![]() |
f1d914bfb0 | ||
![]() |
f6dac691ca | ||
![]() |
37732bbb7b | ||
![]() |
0458cf826d | ||
![]() |
07d3e45de4 | ||
![]() |
2b0f53e1f3 | ||
![]() |
4d972c66d1 | ||
![]() |
2d980d0c53 | ||
![]() |
85be7121ab | ||
![]() |
e0b622b8ef | ||
![]() |
dbdcf5d469 | ||
![]() |
a12373ea58 | ||
![]() |
04d63c0a27 | ||
![]() |
503b02e85f | ||
![]() |
d320b160dc | ||
![]() |
1e91f40569 | ||
![]() |
6dfab204e7 | ||
![]() |
00eadede74 | ||
![]() |
71b43d530a | ||
![]() |
ae580ff731 | ||
![]() |
9abd9689dd | ||
![]() |
929b02a738 | ||
![]() |
bda1bc3bc4 | ||
![]() |
a941bd3b80 | ||
![]() |
39394de3bc | ||
![]() |
4e84774cb1 | ||
![]() |
09fc1bc4cf | ||
![]() |
e2d75a57fb | ||
![]() |
adb6e4ba3c | ||
![]() |
6298c86a36 | ||
![]() |
6926638822 | ||
![]() |
a7547f5076 | ||
![]() |
2526311a6c | ||
![]() |
9ad2335c99 | ||
![]() |
dc162d45f8 | ||
![]() |
4f75a78a7d | ||
![]() |
4245c26b6d | ||
![]() |
81a17653e0 | ||
![]() |
ec6c69452a | ||
![]() |
9549ae3816 | ||
![]() |
c2cff43f46 | ||
![]() |
1e8d7f04a6 | ||
![]() |
d7e21127d7 | ||
![]() |
f5eba8cb3f | ||
![]() |
37a144c4dc | ||
![]() |
b33b321207 | ||
![]() |
0b937a0dda | ||
![]() |
262cf11e93 | ||
![]() |
110ac9734c | ||
![]() |
f250748e30 | ||
![]() |
53ee256b71 | ||
![]() |
4e9ba48f7a | ||
![]() |
4998adb058 | ||
![]() |
be888c09ab | ||
![]() |
10ac5cbe5c | ||
![]() |
15073bb5b3 | ||
![]() |
109f75aee9 | ||
![]() |
d9cf40153f | ||
![]() |
8f735b499a | ||
![]() |
a719230a70 | ||
![]() |
898c685cb6 | ||
![]() |
2e075959c4 | ||
![]() |
f4fe759994 | ||
![]() |
b552b8226c | ||
![]() |
942aecc710 | ||
![]() |
cb27d3f551 | ||
![]() |
04c3aeca3b | ||
![]() |
aa01351e2a | ||
![]() |
4e6fc33e3f | ||
![]() |
d5ec6472fd | ||
![]() |
91925b8827 | ||
![]() |
38c8ae3a3a | ||
![]() |
ae87d1e68b | ||
![]() |
c2d844268d | ||
![]() |
1f3ab4f529 | ||
![]() |
1781584c75 | ||
![]() |
b52af47d5a | ||
![]() |
6e6e2bbf9a | ||
![]() |
f2320abc11 | ||
![]() |
44572da5c7 | ||
![]() |
607b347dd5 | ||
![]() |
7634b7f655 | ||
![]() |
80c676de6c | ||
![]() |
1288494ae5 | ||
![]() |
6779d3bdea | ||
![]() |
3d286a4b60 | ||
![]() |
5a0c45bc6a | ||
![]() |
1bbf352028 | ||
![]() |
999c9f3ca2 | ||
![]() |
f0604837a0 | ||
![]() |
e881206ab9 | ||
![]() |
bd60da2627 | ||
![]() |
7897e5b2bc | ||
![]() |
4d6ea9d707 | ||
![]() |
748a54652f | ||
![]() |
0167aef16a | ||
![]() |
4eb8abad8d | ||
![]() |
00327a1eb0 | ||
![]() |
2e6d8ac33e | ||
![]() |
b4329eb928 | ||
![]() |
b1950be6ff | ||
![]() |
b18db88b61 | ||
![]() |
37cd521d44 | ||
![]() |
442dc62980 | ||
![]() |
0a91597291 | ||
![]() |
0a1fa73196 | ||
![]() |
c9a472ee80 | ||
![]() |
98c03392c3 | ||
![]() |
7be63b07c9 | ||
![]() |
16bfce692a | ||
![]() |
3e65a4fc94 | ||
![]() |
fbfd8885ed | ||
![]() |
359ec616f9 | ||
![]() |
3c1c0ed4f3 | ||
![]() |
2168fa2ab9 | ||
![]() |
19aca9d238 | ||
![]() |
50473764c8 | ||
![]() |
73f2b2c2dd | ||
![]() |
bd5fd01533 | ||
![]() |
cf54ba0ddd | ||
![]() |
bc3e5dcec6 | ||
![]() |
9a4c950823 | ||
![]() |
e13b4d8501 | ||
![]() |
4920d4a61d | ||
![]() |
f45eeefbd4 | ||
![]() |
685fa91e47 | ||
![]() |
04cc6debfd | ||
![]() |
80289b499a | ||
![]() |
d589a79a66 | ||
![]() |
b6e4f47319 | ||
![]() |
d1155b6ae9 | ||
![]() |
d544400234 | ||
![]() |
f887b28e45 | ||
![]() |
1eac6ea67b | ||
![]() |
be219a85dc | ||
![]() |
1d389f40b3 | ||
![]() |
7e301ea1d1 | ||
![]() |
427a0aa1bf | ||
![]() |
59f3bd6e8b | ||
![]() |
67671e2fcb | ||
![]() |
d1a545d65f | ||
![]() |
2888d269e8 | ||
![]() |
13f78f4a7e | ||
![]() |
032f9dbc55 | ||
![]() |
a858d8e537 | ||
![]() |
0951760f1d | ||
![]() |
ef27c2f1b5 | ||
![]() |
bba6621218 | ||
![]() |
68fc6499c5 | ||
![]() |
d22475de81 | ||
![]() |
e6108f3aec | ||
![]() |
05868c9803 | ||
![]() |
773e833ddd | ||
![]() |
e895c1cd5a | ||
![]() |
001f63203c | ||
![]() |
2a837276ea | ||
![]() |
230a8e0e61 | ||
![]() |
a58cc25d09 | ||
![]() |
7235d9fa30 | ||
![]() |
5f36f8a9e0 | ||
![]() |
c76e4f2434 | ||
![]() |
16bc6acff4 | ||
![]() |
17b614121c | ||
![]() |
aed1c9fa2d | ||
![]() |
632c57da13 | ||
![]() |
4727510088 | ||
![]() |
a38442caf6 | ||
![]() |
9901ca56ba | ||
![]() |
c16b883ab2 | ||
![]() |
f7a7276fcc | ||
![]() |
6c354b2473 | ||
![]() |
c3b6764da8 | ||
![]() |
ab15da68d5 | ||
![]() |
d7c0b53230 | ||
![]() |
0ee025e69f | ||
![]() |
4c7b01003b | ||
![]() |
5ef01566b0 | ||
![]() |
7b63ef389c | ||
![]() |
e5fe9de192 | ||
![]() |
dfa4ab4675 | ||
![]() |
de5f86b3a4 | ||
![]() |
24e58b1e25 | ||
![]() |
4288cc3a19 | ||
![]() |
dc61820baf | ||
![]() |
5f1fa163df | ||
![]() |
23d7550ce8 | ||
![]() |
872fafe707 | ||
![]() |
481b6ff6fe | ||
![]() |
580eee5a38 | ||
![]() |
79e2cda777 | ||
![]() |
9d97548d3a | ||
![]() |
19a1eba8dd | ||
![]() |
a29f7b32bc | ||
![]() |
3322e46fc9 | ||
![]() |
5cf545ab0c | ||
![]() |
7f2b555e95 | ||
![]() |
3795e1e1fa | ||
![]() |
26dfba06e3 | ||
![]() |
26a99679a7 | ||
![]() |
825ea5b200 | ||
![]() |
feb4debdd5 | ||
![]() |
00512e3b66 | ||
![]() |
2400fa6d6f | ||
![]() |
eff71a65ae | ||
![]() |
76681e900f | ||
![]() |
bd274e50e1 | ||
![]() |
3ee9bbcf3b | ||
![]() |
daad99c38b | ||
![]() |
2e638b9b02 | ||
![]() |
f07dd48d0d | ||
![]() |
92a1b1b627 | ||
![]() |
ea986d6d46 | ||
![]() |
1a8e7925c4 | ||
![]() |
e067cc30eb | ||
![]() |
cdad40aed1 | ||
![]() |
a752135c34 | ||
![]() |
a5628c5473 | ||
![]() |
c50bc9fc89 | ||
![]() |
0dd838a72f | ||
![]() |
03a5ab960d | ||
![]() |
f1bafe1834 | ||
![]() |
1bb20d581e | ||
![]() |
f9b2fbe724 | ||
![]() |
afffb01cac | ||
![]() |
9dded23acf | ||
![]() |
034ed58bb4 | ||
![]() |
7a1f32af71 | ||
![]() |
5d5cf4fb0a | ||
![]() |
b505cde0e8 | ||
![]() |
f4862b32f3 | ||
![]() |
d91a922782 | ||
![]() |
de0f02ae83 | ||
![]() |
0fa8985516 | ||
![]() |
d584367340 | ||
![]() |
f01a3b41e4 | ||
![]() |
8fc3ad11ca | ||
![]() |
0eb5d6343e | ||
![]() |
28aa6d2305 | ||
![]() |
a8ab0a2db4 | ||
![]() |
43621431d9 | ||
![]() |
6213b95ef1 | ||
![]() |
ff779d6932 | ||
![]() |
92a5db7dac | ||
![]() |
1e88eab334 | ||
![]() |
31916e354d | ||
![]() |
31289e984e | ||
![]() |
780ed8e751 | ||
![]() |
739f06b37b | ||
![]() |
f3a3218848 | ||
![]() |
22bf0a821a | ||
![]() |
8ac8fee912 | ||
![]() |
1d3d5fe82a | ||
![]() |
f5f80e9a8d | ||
![]() |
f81f8da115 | ||
![]() |
12c4ff0796 | ||
![]() |
9fdd8be84c | ||
![]() |
b833655e53 | ||
![]() |
99cbfb43a5 | ||
![]() |
86b1f3fcac | ||
![]() |
2f4922d5b7 | ||
![]() |
dc003cba89 | ||
![]() |
9f0b0571a9 | ||
![]() |
866e3c16a1 | ||
![]() |
4eaa233bb6 | ||
![]() |
062d705920 | ||
![]() |
4ad1afc650 | ||
![]() |
462fd68708 | ||
![]() |
695dbaddbe | ||
![]() |
f2022223de | ||
![]() |
438405ecae | ||
![]() |
f9fcfac9de | ||
![]() |
e4720628cc | ||
![]() |
85626a6da2 | ||
![]() |
2adedd88f9 | ||
![]() |
52d98d4175 | ||
![]() |
0749c1a5ce | ||
![]() |
6310ba1f76 | ||
![]() |
82f49665c5 | ||
![]() |
c714ad4af3 | ||
![]() |
0080bdcf03 | ||
![]() |
7c3d98c485 | ||
![]() |
c1c63a9c7d | ||
![]() |
30f6460df9 | ||
![]() |
b2253a06ff | ||
![]() |
6bf6de5cc2 | ||
![]() |
d03ac21bba | ||
![]() |
bf4d426fcb | ||
![]() |
1f97df3fef | ||
![]() |
2783bb69d4 | ||
![]() |
7f50a22d3d | ||
![]() |
e1fb9f8640 | ||
![]() |
3f1ecad65d | ||
![]() |
520d6b8f3f | ||
![]() |
a2472b483f | ||
![]() |
5a96bab825 | ||
![]() |
3b175fc366 | ||
![]() |
d51b984617 | ||
![]() |
296ce8dbcf | ||
![]() |
5e6fadebe9 | ||
![]() |
502b21fb5d | ||
![]() |
2fb89966d0 | ||
![]() |
f60b64dce2 | ||
![]() |
83811f9503 | ||
![]() |
b066b937f1 | ||
![]() |
e2e51624c9 | ||
![]() |
8119b76e6b | ||
![]() |
638392a038 | ||
![]() |
c533f21f65 | ||
![]() |
b5d8859a0b | ||
![]() |
9ee9c94ad7 | ||
![]() |
c2594f0528 | ||
![]() |
3b89a789dc | ||
![]() |
700377e57a | ||
![]() |
7dc64c49c7 | ||
![]() |
aa58da1fe2 | ||
![]() |
1f2a62f48a | ||
![]() |
994946b17e | ||
![]() |
f63bb23742 | ||
![]() |
fe6e98ae51 | ||
![]() |
5ff3920715 | ||
![]() |
b0bd5ff50f | ||
![]() |
cfe930c979 | ||
![]() |
3d34906578 | ||
![]() |
564a16ed92 | ||
![]() |
887a487b86 | ||
![]() |
11700b0850 | ||
![]() |
dbf5d1158a | ||
![]() |
35bca303ba | ||
![]() |
2c79a4b24d | ||
![]() |
0275d7e17d | ||
![]() |
ec4785eec6 | ||
![]() |
0940bfa9a4 | ||
![]() |
11045ef40b | ||
![]() |
a1fb2ae4c3 | ||
![]() |
135e0d799d | ||
![]() |
d67d48180e | ||
![]() |
567d1a9176 | ||
![]() |
19ab74a8e5 | ||
![]() |
b8d77e191c | ||
![]() |
cc695ff99d | ||
![]() |
45c48b2575 | ||
![]() |
77627d7bec | ||
![]() |
8ab088b623 | ||
![]() |
d1268bb343 | ||
![]() |
60b0ab3741 | ||
![]() |
dc775487f0 | ||
![]() |
52a7d746fd | ||
![]() |
31aa7e91bc | ||
![]() |
5449ab1a01 | ||
![]() |
f2832690e0 | ||
![]() |
f602f8d10b | ||
![]() |
01ad594313 | ||
![]() |
e1173bad08 | ||
![]() |
71aac835ba | ||
![]() |
b947908a46 | ||
![]() |
3bf278ffe2 | ||
![]() |
3404ff774e | ||
![]() |
34254d9ca5 | ||
![]() |
61eb27fd08 | ||
![]() |
393e0e6b06 | ||
![]() |
05fe993b89 | ||
![]() |
be79dfdb06 | ||
![]() |
5da5926407 | ||
![]() |
714a55b32a | ||
![]() |
73bf910896 | ||
![]() |
2ab0871697 | ||
![]() |
8071a1331d | ||
![]() |
116a29839c | ||
![]() |
0178329e58 | ||
![]() |
1f6304d205 | ||
![]() |
5d8717d354 | ||
![]() |
a13d6a996c | ||
![]() |
143d361ec7 | ||
![]() |
f5e839ef95 | ||
![]() |
be9948aad4 | ||
![]() |
e8ae1488b5 | ||
![]() |
2d599887af | ||
![]() |
167a27783f | ||
![]() |
883cd90770 | ||
![]() |
a13de1ef85 | ||
![]() |
0db3667711 | ||
![]() |
ec61f4fc61 | ||
![]() |
29e797a9ba | ||
![]() |
fd90f69da2 | ||
![]() |
43e4b3ec9f | ||
![]() |
8a2694feaa | ||
![]() |
09df631e5b | ||
![]() |
83572cf649 | ||
![]() |
beeb3d336c | ||
![]() |
203334a6a2 | ||
![]() |
d523f13eac | ||
![]() |
6153d40f89 | ||
![]() |
0005a76388 | ||
![]() |
0911117e31 | ||
![]() |
767b933cd5 | ||
![]() |
6643c80d03 | ||
![]() |
69e8c39d12 | ||
![]() |
2f8d0199e6 | ||
![]() |
70d15e31fb | ||
![]() |
ac36a5cabc | ||
![]() |
3061844ee7 | ||
![]() |
46c91560c4 | ||
![]() |
515d637182 | ||
![]() |
1f52f24910 | ||
![]() |
b84bab78d5 | ||
![]() |
83178e5fa0 | ||
![]() |
ab37a53f18 | ||
![]() |
a1ba6f1b36 | ||
![]() |
bb5229d4d3 | ||
![]() |
60ffb7450d | ||
![]() |
e333a759ae | ||
![]() |
28d06b4eeb | ||
![]() |
34717cdd9b | ||
![]() |
d8fb3493b9 | ||
![]() |
d70d1a95df | ||
![]() |
48dc245703 | ||
![]() |
060811c428 | ||
![]() |
b2ef131d92 | ||
![]() |
444fceeb7e | ||
![]() |
590ca49dbe | ||
![]() |
b24a6b1850 | ||
![]() |
04b530228e | ||
![]() |
919ec8eea9 | ||
![]() |
05d4a664e3 | ||
![]() |
cd130483fc | ||
![]() |
60b77c5fa1 | ||
![]() |
43290d387e | ||
![]() |
7be6da70c4 | ||
![]() |
e51a7e16dd | ||
![]() |
dc6dea2d8d | ||
![]() |
62bdadf43b | ||
![]() |
8c0c5f90e5 | ||
![]() |
04527a6827 | ||
![]() |
5aa4d4df37 | ||
![]() |
73cff66c93 | ||
![]() |
95a2bc0ff2 | ||
![]() |
8795c9a5b0 | ||
![]() |
9094ee945e | ||
![]() |
5a3958f73e | ||
![]() |
1a327ea0ad | ||
![]() |
865ed04ccf | ||
![]() |
7822203884 | ||
![]() |
c0916e5dd4 | ||
![]() |
b51681c662 | ||
![]() |
7ed60cc0a7 | ||
![]() |
aafdf1ce74 | ||
![]() |
14577c9b57 | ||
![]() |
c343f849db | ||
![]() |
d9c9c38d53 | ||
![]() |
32296666a1 | ||
![]() |
c58297dca1 | ||
![]() |
535ac732c9 | ||
![]() |
0c3d7e8a37 | ||
![]() |
758d9e68fd | ||
![]() |
64d765bce6 | ||
![]() |
7ef59081b6 | ||
![]() |
e6b1101e91 | ||
![]() |
60e9a31527 | ||
![]() |
87d8c1ebce | ||
![]() |
20bdb93b2e | ||
![]() |
d70544131a | ||
![]() |
db91cd73c1 | ||
![]() |
e6e0e3608f | ||
![]() |
1ea70f7707 | ||
![]() |
8a19376f0c | ||
![]() |
da057026c7 | ||
![]() |
95a9540c76 | ||
![]() |
c33a2ad609 | ||
![]() |
a91c390af5 | ||
![]() |
f2c1a38cc3 | ||
![]() |
35535517e5 | ||
![]() |
1e4abe578b | ||
![]() |
7eec27277a | ||
![]() |
8b4a548e2f | ||
![]() |
fac422b24a | ||
![]() |
df2148c939 | ||
![]() |
3d2cb17634 | ||
![]() |
6529cf0320 | ||
![]() |
fed323530f | ||
![]() |
e0646404da | ||
![]() |
aceb42ad68 | ||
![]() |
97dc22ff72 | ||
![]() |
dbc53c296a | ||
![]() |
201c5442db | ||
![]() |
1565a6a840 | ||
![]() |
7aec937b41 | ||
![]() |
b9cf5bb41d | ||
![]() |
161dd92ddf | ||
![]() |
21f196e884 | ||
![]() |
f3d8e3b8e3 | ||
![]() |
ea9b6b9b3a | ||
![]() |
f61456b4c9 | ||
![]() |
27f95449ee | ||
![]() |
541443b52a | ||
![]() |
0b9b7cc6f5 | ||
![]() |
1c2206a6d3 | ||
![]() |
06222add45 | ||
![]() |
1960970359 | ||
![]() |
e61a38e0d8 | ||
![]() |
daa5a3e42e | ||
![]() |
3212b83b3d | ||
![]() |
bd7df75212 | ||
![]() |
a52eb340d6 | ||
![]() |
f2d5d0910e | ||
![]() |
ce5839533a | ||
![]() |
44353a2644 | ||
![]() |
8d8265acd9 | ||
![]() |
ae04044877 | ||
![]() |
763562fdfc | ||
![]() |
944988226a | ||
![]() |
f1c2bc3312 | ||
![]() |
79d1135da3 | ||
![]() |
9d7f2320f2 | ||
![]() |
2727f3122f | ||
![]() |
5cc821445b | ||
![]() |
a90cb01efe | ||
![]() |
96606711fe | ||
![]() |
004af0a978 | ||
![]() |
b595adf2f9 | ||
![]() |
f34521025d | ||
![]() |
5b99bb16d4 | ||
![]() |
9dfea01ad1 | ||
![]() |
0ce6a16f44 | ||
![]() |
0d9fd9d832 | ||
![]() |
18a09ff860 | ||
![]() |
b3aeb5337b | ||
![]() |
8689fe5ec6 | ||
![]() |
7dda1a7c6f | ||
![]() |
4c09da5b27 | ||
![]() |
acee055bd5 | ||
![]() |
34b70f0c71 | ||
![]() |
dc68029047 | ||
![]() |
aebd7a1b4f | ||
![]() |
450d29c3d1 | ||
![]() |
bceaabd449 | ||
![]() |
6cc46cdf2c | ||
![]() |
165faeb342 | ||
![]() |
7155506b19 | ||
![]() |
77ed64a491 | ||
![]() |
2fa2e312c0 | ||
![]() |
afca57bc4c | ||
![]() |
17b24b9224 | ||
![]() |
6aa4a44d81 | ||
![]() |
b7467aaea8 | ||
![]() |
c723f7c4c1 | ||
![]() |
f3792d8591 | ||
![]() |
2413106a44 | ||
![]() |
2cbc8bcbd6 | ||
![]() |
b4c1bd0535 | ||
![]() |
cacb70bbbe | ||
![]() |
ce407fb447 | ||
![]() |
584312f88b | ||
![]() |
4c72883e28 | ||
![]() |
e28aed5223 | ||
![]() |
6b5e5c78d0 | ||
![]() |
1da15e6ecf | ||
![]() |
d4e20c654e | ||
![]() |
4f883f4d87 | ||
![]() |
c16b62263d | ||
![]() |
adb8a5cbf4 | ||
![]() |
be286b7672 | ||
![]() |
2dea155085 | ||
![]() |
3c966c980e | ||
![]() |
d514eeac1e | ||
![]() |
7e1a504d81 | ||
![]() |
0296a02162 | ||
![]() |
272a533bee | ||
![]() |
cb1784cecd | ||
![]() |
2df06aeec4 | ||
![]() |
c647b818cd | ||
![]() |
924390faff | ||
![]() |
e3b324e3c8 | ||
![]() |
a67971ef0f | ||
![]() |
a2eece8cd4 | ||
![]() |
695f0c568b | ||
![]() |
c75ac74764 | ||
![]() |
81b28a1e56 | ||
![]() |
3881497067 | ||
![]() |
5ae4ba3638 | ||
![]() |
cd60a85825 | ||
![]() |
6a8ca90271 | ||
![]() |
5a7c1f1129 | ||
![]() |
ccaa219a68 | ||
![]() |
46a46a1e05 | ||
![]() |
7a60042c48 | ||
![]() |
0e2472cd79 | ||
![]() |
dea016d2e5 | ||
![]() |
00fe9600d4 | ||
![]() |
b6b481d738 | ||
![]() |
ed370b87fe | ||
![]() |
365bcf5bb8 | ||
![]() |
cc95142753 | ||
![]() |
71017990a9 | ||
![]() |
62a9afbb70 | ||
![]() |
7a497997b5 | ||
![]() |
2e6ece3667 | ||
![]() |
abd338b5c4 | ||
![]() |
b0f3ae4dc2 | ||
![]() |
06001d5893 | ||
![]() |
a01c010207 | ||
![]() |
2f2e662405 | ||
![]() |
8c5ecf1d89 | ||
![]() |
891bbc5d9b | ||
![]() |
93cc71e900 | ||
![]() |
40f002fe97 | ||
![]() |
6bc3ec84f8 | ||
![]() |
0d91555443 | ||
![]() |
f15bba90e4 | ||
![]() |
f50abba573 | ||
![]() |
260f93ecc1 | ||
![]() |
351cf041fc | ||
![]() |
dd9c1db9f6 | ||
![]() |
d9d50195d9 | ||
![]() |
56488eac06 | ||
![]() |
567694c675 | ||
![]() |
f9f4445719 | ||
![]() |
9e6aed2d17 | ||
![]() |
28fa893e0f | ||
![]() |
930671beff | ||
![]() |
842c8683a8 | ||
![]() |
6bbd21851f | ||
![]() |
79d4131825 | ||
![]() |
c5263e771b | ||
![]() |
3a2c82ff27 | ||
![]() |
1cc492f23f | ||
![]() |
1344fb66d2 | ||
![]() |
e7b90cd91a | ||
![]() |
b3c4ab11f7 | ||
![]() |
9441908871 | ||
![]() |
57dc09aee9 | ||
![]() |
fd6d489ce5 | ||
![]() |
390c1f3bdb | ||
![]() |
ea4a77390f | ||
![]() |
efb83d646c | ||
![]() |
0b51bab957 | ||
![]() |
8f6a6f0710 | ||
![]() |
438d8e55d0 | ||
![]() |
47d3c19389 | ||
![]() |
e086b08f47 | ||
![]() |
c47f999669 | ||
![]() |
d4e2d7e37e | ||
![]() |
f9fe4c7630 | ||
![]() |
0b9f9126df | ||
![]() |
cb7ba55cf5 | ||
![]() |
3efd39d0fc | ||
![]() |
1fde521ae5 | ||
![]() |
c9e5f233c4 | ||
![]() |
ce0b6c843d | ||
![]() |
2c8d19be8b | ||
![]() |
ab3cdb7dca | ||
![]() |
ff11a81856 | ||
![]() |
1d3bf639ea | ||
![]() |
81830fc928 | ||
![]() |
7b315a42b9 | ||
![]() |
ccc3818f84 | ||
![]() |
903fc285a4 | ||
![]() |
b503159c6e | ||
![]() |
2389106214 | ||
![]() |
e4d389a771 | ||
![]() |
549941fd2a | ||
![]() |
e70ebd8de3 | ||
![]() |
e015c4c5e6 | ||
![]() |
3314393e69 | ||
![]() |
9db108de87 | ||
![]() |
5679f292dc | ||
![]() |
56b2d6dc63 | ||
![]() |
e43763decd | ||
![]() |
ecf35d6f36 | ||
![]() |
8cd6ee3741 | ||
![]() |
74c558a0f9 | ||
![]() |
be418592b8 | ||
![]() |
3a0bcedc09 | ||
![]() |
e14c7f8166 | ||
![]() |
046016667c | ||
![]() |
e77daa0c15 | ||
![]() |
1d292a8891 | ||
![]() |
46f35e3707 | ||
![]() |
76d80d9aad | ||
![]() |
d7662b289f | ||
![]() |
8faebdbca0 | ||
![]() |
64013dc659 | ||
![]() |
8bf57aa96e | ||
![]() |
b5ef0baf39 | ||
![]() |
9320b0f1ad | ||
![]() |
c111680d02 | ||
![]() |
7cc7f98424 | ||
![]() |
344143c341 | ||
![]() |
1509bedd6a | ||
![]() |
3e98e762d6 | ||
![]() |
20b72f7fe7 | ||
![]() |
f898742c66 | ||
![]() |
5430184ff0 | ||
![]() |
146708e6f4 | ||
![]() |
6f58758bd0 | ||
![]() |
a3fe405712 | ||
![]() |
677b4e6ed5 | ||
![]() |
1625d2df31 | ||
![]() |
10cbbb81bb | ||
![]() |
27f687ff23 | ||
![]() |
e2ad57d3ea | ||
![]() |
35320a4297 | ||
![]() |
5ca7b86d74 | ||
![]() |
a1c8c8b321 | ||
![]() |
8b5132e81d | ||
![]() |
ad3b78b911 | ||
![]() |
bda9d834de | ||
![]() |
8a58dd4ec9 | ||
![]() |
c053eec073 | ||
![]() |
1dd0423ed1 | ||
![]() |
e189bc3a8e | ||
![]() |
b67996eb47 | ||
![]() |
2e8d8e8efe | ||
![]() |
de6eb72d26 | ||
![]() |
7dd0028465 | ||
![]() |
b6e6012a5e | ||
![]() |
7e71a4eb92 | ||
![]() |
a62ede47e9 | ||
![]() |
0754932768 | ||
![]() |
a972bae08d | ||
![]() |
214b9576ea | ||
![]() |
1dfb59124a | ||
![]() |
c188e220aa | ||
![]() |
5cd5cbb921 | ||
![]() |
cc121d4300 | ||
![]() |
163bec34d8 | ||
![]() |
b1bda3f841 | ||
![]() |
0d8740a757 | ||
![]() |
e99b2481f1 | ||
![]() |
80345e47b1 | ||
![]() |
5f0e5f7e49 | ||
![]() |
9516f53b70 | ||
![]() |
db6393fa55 | ||
![]() |
8e55ceaa88 | ||
![]() |
b151362f65 | ||
![]() |
6886ab2b07 | ||
![]() |
4cc3244e56 | ||
![]() |
c4784d8714 | ||
![]() |
6d0c03d788 | ||
![]() |
6b6f8ddde7 | ||
![]() |
784370c31f | ||
![]() |
96b71fa955 | ||
![]() |
40bf21d66c | ||
![]() |
2237c93bd8 | ||
![]() |
55012889e7 | ||
![]() |
ae22ea641d | ||
![]() |
e94a8e710f | ||
![]() |
2032915220 | ||
![]() |
319c313b49 | ||
![]() |
40de679081 | ||
![]() |
0d54e5edfc | ||
![]() |
e5c27037a5 | ||
![]() |
bda3e45958 | ||
![]() |
a0a9754285 | ||
![]() |
f113f5ddaf | ||
![]() |
9843f30c54 | ||
![]() |
49c555a6ca | ||
![]() |
9867dcbac6 | ||
![]() |
a24d2dc0b7 | ||
![]() |
d8aaded856 | ||
![]() |
a75c886b95 | ||
![]() |
0402a1d719 | ||
![]() |
2edeb35610 | ||
![]() |
72dc0e162d | ||
![]() |
4fedea3f60 | ||
![]() |
7c6284b5cf | ||
![]() |
afac55f9a0 | ||
![]() |
b2e9a2edf4 | ||
![]() |
45d2086037 | ||
![]() |
96074e15c2 | ||
![]() |
7050aa1139 | ||
![]() |
bdc831bc0e | ||
![]() |
3b7cad7d79 | ||
![]() |
1116f3636c | ||
![]() |
f56d6f9bfa | ||
![]() |
86b155159b | ||
![]() |
cdf92ba60a | ||
![]() |
7405332034 | ||
![]() |
d3e9a4dc3a | ||
![]() |
b10738c3fd | ||
![]() |
09cebba5a9 | ||
![]() |
b53ed9daed | ||
![]() |
14d75abb59 | ||
![]() |
37a4144bae | ||
![]() |
fedb3b020f | ||
![]() |
d2cadb209a | ||
![]() |
9a8b1233c4 | ||
![]() |
9e47011c6b | ||
![]() |
31eeb92391 | ||
![]() |
4731f67312 | ||
![]() |
ccaac7e0cb | ||
![]() |
6c734aa64c | ||
![]() |
0a2957dda1 | ||
![]() |
91b5bb462d | ||
![]() |
75531c36b3 | ||
![]() |
9b00de8647 | ||
![]() |
ff00613c30 | ||
![]() |
a7411b6bf3 | ||
![]() |
144f69890d | ||
![]() |
d05f7e4758 | ||
![]() |
d42c715cc9 | ||
![]() |
b99b51cbb9 | ||
![]() |
8b49394384 | ||
![]() |
1609b309e6 | ||
![]() |
592adadd5d | ||
![]() |
0ee0fd605b | ||
![]() |
301815b695 | ||
![]() |
0bb7af112c | ||
![]() |
8ac0b8c71d | ||
![]() |
176b20a9e1 | ||
![]() |
84b069419f | ||
![]() |
81d1b9c699 | ||
![]() |
0da399295a | ||
![]() |
5b677c9eba | ||
![]() |
86a3006981 | ||
![]() |
46dc199a0d | ||
![]() |
4851f59c0d | ||
![]() |
d01fce1a64 | ||
![]() |
d4735cb749 | ||
![]() |
c57430ed5c | ||
![]() |
9d0b7f4451 | ||
![]() |
7ee9d8ac2a | ||
![]() |
0888aec8b1 | ||
![]() |
162b0acdaa | ||
![]() |
a20b083a6d | ||
![]() |
0e680bd59b | ||
![]() |
871c8d1324 | ||
![]() |
7e2612e562 | ||
![]() |
8f0cd28fe9 | ||
![]() |
26b3fee248 | ||
![]() |
4b871e4985 | ||
![]() |
570cb8fbd7 | ||
![]() |
b662452b5f | ||
![]() |
5d3ab224a1 | ||
![]() |
999b9d9d8e | ||
![]() |
4c47ebc886 | ||
![]() |
8a52659221 | ||
![]() |
d8ce10e5d6 | ||
![]() |
8a265071a3 | ||
![]() |
ba1ab73877 | ||
![]() |
ed0c090aed | ||
![]() |
67a97bc386 | ||
![]() |
6fe0f3cf2d | ||
![]() |
1b59cc3179 | ||
![]() |
d0338b4aae | ||
![]() |
1a5c39d083 | ||
![]() |
1d30e639c3 | ||
![]() |
768aca1229 | ||
![]() |
710ba83798 | ||
![]() |
23aa444189 | ||
![]() |
2648f69b26 | ||
![]() |
9f485ebe76 | ||
![]() |
e4e043cba2 | ||
![]() |
dcd77acddc | ||
![]() |
2c881c1cf5 | ||
![]() |
7fafb87a0b | ||
![]() |
9fc8985fbf | ||
![]() |
bc7279d5d5 | ||
![]() |
5bba93e791 | ||
![]() |
7b9ed5e9c4 | ||
![]() |
a9c101296b | ||
![]() |
86d889d6a3 | ||
![]() |
1c4cb84650 | ||
![]() |
a4336da9d2 | ||
![]() |
c9892fa3d2 | ||
![]() |
143f991aa3 | ||
![]() |
ab60200071 | ||
![]() |
fc804f2595 | ||
![]() |
480a551b83 | ||
![]() |
b7ab1f458a | ||
![]() |
678c26fe3c | ||
![]() |
17bd92ffe2 | ||
![]() |
d2e52737de | ||
![]() |
774b18fdce | ||
![]() |
d9e407bfcb | ||
![]() |
d23402dab3 | ||
![]() |
572142736a | ||
![]() |
66eedfb666 | ||
![]() |
5ff59133e3 | ||
![]() |
dc4d06faa3 | ||
![]() |
3da17b6508 | ||
![]() |
0a4e09ea07 | ||
![]() |
9da3eae7c1 | ||
![]() |
ea39093c5f | ||
![]() |
72cef40934 | ||
![]() |
1ad6506dd4 | ||
![]() |
1c44080552 | ||
![]() |
a56f5d4d14 | ||
![]() |
d3f4c7a000 | ||
![]() |
15457e18ce | ||
![]() |
65de283014 | ||
![]() |
18c5040ce4 | ||
![]() |
20bd2f50cb | ||
![]() |
228539c263 | ||
![]() |
3788626f3c | ||
![]() |
43d36720fd | ||
![]() |
781ff3625d | ||
![]() |
b53cfa728b | ||
![]() |
719e6ce252 | ||
![]() |
66601800f6 | ||
![]() |
4009799996 | ||
![]() |
7c07ecf095 | ||
![]() |
27b948fba9 | ||
![]() |
94091c5e04 | ||
![]() |
d6d71438b4 | ||
![]() |
9c6c6aacae | ||
![]() |
9a846bfc44 | ||
![]() |
2acd8fa1f0 | ||
![]() |
4475c27000 | ||
![]() |
9c0539d935 | ||
![]() |
f25c0c1e8e | ||
![]() |
06d41a13a7 | ||
![]() |
38eb444e88 | ||
![]() |
1cd1ac4224 | ||
![]() |
2facf35f3b | ||
![]() |
6e51d4524d | ||
![]() |
80e03c86e1 | ||
![]() |
9d409d6762 | ||
![]() |
e52d65e4d8 | ||
![]() |
125440071c | ||
![]() |
eea38eb0f0 | ||
![]() |
c0adc554da | ||
![]() |
bcafa7c94f | ||
![]() |
fcbcf50aeb | ||
![]() |
adb0312965 | ||
![]() |
93bcc84065 | ||
![]() |
f5289c0160 | ||
![]() |
9f59d5aeb2 | ||
![]() |
d2a5b6ad3d | ||
![]() |
54022c265f | ||
![]() |
bf31b9c5b5 | ||
![]() |
76a26b84b3 | ||
![]() |
9c31c7f8e7 | ||
![]() |
7dbab85b6a | ||
![]() |
6b518fdbaa | ||
![]() |
8c25272bda | ||
![]() |
6357c95bcb | ||
![]() |
9513b727e8 | ||
![]() |
eeb7999f91 | ||
![]() |
c8b2dc52c2 | ||
![]() |
e1f909b61c | ||
![]() |
2c143ca8fc | ||
![]() |
9d75ef3103 | ||
![]() |
ab79e99952 | ||
![]() |
f03f006dc7 | ||
![]() |
7d3948db8a | ||
![]() |
21ee7c28fb | ||
![]() |
816ad4755d | ||
![]() |
404024b08a | ||
![]() |
008f6270b1 | ||
![]() |
225f0f1f98 | ||
![]() |
be112645f6 | ||
![]() |
829de5c17a | ||
![]() |
a4b2fe2a8d | ||
![]() |
42f2f281ad | ||
![]() |
44cc73845a | ||
![]() |
181aa996cc | ||
![]() |
7e767c9280 | ||
![]() |
64fe87b1a1 | ||
![]() |
242f7aac7f | ||
![]() |
eedd25aa7f | ||
![]() |
1fcd6b6c6f | ||
![]() |
e2a467de04 | ||
![]() |
f4ccaa7a5a | ||
![]() |
8edfa3d949 | ||
![]() |
3e74ff0f7a | ||
![]() |
e10c251ecf | ||
![]() |
254572ff05 | ||
![]() |
ca6070b386 | ||
![]() |
e52f1b0af9 | ||
![]() |
c9c5c6118d | ||
![]() |
19d30b3f42 | ||
![]() |
27d5944692 | ||
![]() |
89f5d77cd1 | ||
![]() |
5224d1abc5 | ||
![]() |
6abd0c4561 | ||
![]() |
fafbf78e65 | ||
![]() |
dea7426364 | ||
![]() |
4d02b28f95 | ||
![]() |
3264b6b880 | ||
![]() |
ce1674dcfd | ||
![]() |
52cbcc0100 | ||
![]() |
570414c495 | ||
![]() |
5452b57dc9 | ||
![]() |
be22c18d9c | ||
![]() |
9adb803d7c | ||
![]() |
0400aee111 | ||
![]() |
25bda54c4f | ||
![]() |
48e919920f | ||
![]() |
3ffe8dcd55 | ||
![]() |
eac51b1a12 | ||
![]() |
3dcc661d77 | ||
![]() |
44c092886d | ||
![]() |
069ffca1fc | ||
![]() |
c7d37e5da2 | ||
![]() |
5a444c5bc1 | ||
![]() |
7f5a5a4b31 | ||
![]() |
567f4503cd | ||
![]() |
27ff5e25e1 | ||
![]() |
50693d9960 | ||
![]() |
5a48d9a839 | ||
![]() |
fc1219600e | ||
![]() |
5ed7bc1ee4 | ||
![]() |
7a8325acc1 | ||
![]() |
03a79d72a0 | ||
![]() |
57627b909c | ||
![]() |
34798d285b | ||
![]() |
45ca164fc9 | ||
![]() |
0f1a77eed8 | ||
![]() |
88585ea60a | ||
![]() |
c200e89713 | ||
![]() |
f8f322da30 | ||
![]() |
061b5f8f66 | ||
![]() |
9ba41a2da6 | ||
![]() |
84bde52b93 | ||
![]() |
c542cbd949 | ||
![]() |
867d38680b | ||
![]() |
b261e245df | ||
![]() |
52f2d25dc2 | ||
![]() |
f0095cc32f | ||
![]() |
5036708adf | ||
![]() |
cd80871acd | ||
![]() |
56efcb0519 | ||
![]() |
3759dd92d0 | ||
![]() |
d1d4af297f | ||
![]() |
496480af0c | ||
![]() |
5da2d2d511 | ||
![]() |
080d50aa39 | ||
![]() |
b2f51e3221 | ||
![]() |
2a90b75732 | ||
![]() |
a7c4c5551f | ||
![]() |
d8300cdb5c | ||
![]() |
4ec541c1c2 | ||
![]() |
9d701e6a59 | ||
![]() |
0b20eca93f | ||
![]() |
2d2aa11a75 | ||
![]() |
6881fbe793 | ||
![]() |
5e854fa7dc | ||
![]() |
cff1277f4a | ||
![]() |
4df8b6b3d7 | ||
![]() |
bc41178fa2 | ||
![]() |
f835af36de | ||
![]() |
d349b96334 | ||
![]() |
9481449358 | ||
![]() |
29070a62d0 | ||
![]() |
3191ea70e0 | ||
![]() |
4dcd9fc99b | ||
![]() |
02d66ceaaf | ||
![]() |
f8e07122aa | ||
![]() |
2d247bd23b | ||
![]() |
ff84616422 | ||
![]() |
f15601ef1e | ||
![]() |
97d0208495 | ||
![]() |
84eaa9a26b | ||
![]() |
59d997d59c | ||
![]() |
9d0d25b94e | ||
![]() |
a8b4bf7874 | ||
![]() |
1cce9ea552 | ||
![]() |
95649fedf8 | ||
![]() |
b22d192a0a | ||
![]() |
65d0a399c6 | ||
![]() |
ae933cc7d0 | ||
![]() |
ffb1610bf2 | ||
![]() |
5110e23263 | ||
![]() |
6e76fadd36 | ||
![]() |
0a629c2a65 | ||
![]() |
d1523a7fd3 | ||
![]() |
2f663aa677 | ||
![]() |
a881c31c66 | ||
![]() |
085304d0bc | ||
![]() |
517afbfb77 | ||
![]() |
0ede7daac5 | ||
![]() |
2d2d017556 | ||
![]() |
635211fd3c | ||
![]() |
a39f7df447 | ||
![]() |
c193628bf9 | ||
![]() |
4194536b4d | ||
![]() |
cf5b5cc1e2 | ||
![]() |
1268a8fd63 | ||
![]() |
73e57c6b1e | ||
![]() |
5a323f9c7f | ||
![]() |
f73aff54bb | ||
![]() |
247e830aaf | ||
![]() |
3efbcc0f9e | ||
![]() |
70be1ceb6d | ||
![]() |
d63dc7ee01 | ||
![]() |
ee94f28fc7 | ||
![]() |
65e8d60c57 | ||
![]() |
bc18180af4 | ||
![]() |
7be5e88add | ||
![]() |
8c52e89171 | ||
![]() |
49bf94295b | ||
![]() |
17b95ee0cf | ||
![]() |
1ad1296bac | ||
![]() |
20697c29f7 | ||
![]() |
0b3183db15 | ||
![]() |
bcbef40dc6 | ||
![]() |
233ec83b18 | ||
![]() |
d850e5a8df | ||
![]() |
c68e830abd | ||
![]() |
2c194e4380 | ||
![]() |
d61f6bc705 | ||
![]() |
014527bf52 | ||
![]() |
3d72776180 | ||
![]() |
62619f7380 | ||
![]() |
b0ee00882b | ||
![]() |
37623b1089 | ||
![]() |
01585da1b3 | ||
![]() |
0d5c9e45f1 | ||
![]() |
7cf6c8341d | ||
![]() |
3015138da0 | ||
![]() |
50a6d8c2fc | ||
![]() |
49081e5476 | ||
![]() |
b2325f5e94 | ||
![]() |
d941b7945c | ||
![]() |
ff7833b61e | ||
![]() |
c27f5b76d0 | ||
![]() |
1d7d192a9a | ||
![]() |
e3a0e4aa3a | ||
![]() |
7bfd772d97 | ||
![]() |
8c50f6bfcd | ||
![]() |
c8e2c105f5 | ||
![]() |
5b53811091 | ||
![]() |
aff71afcf9 | ||
![]() |
d1141a6296 | ||
![]() |
3de52cd4ee | ||
![]() |
43dc8b5f6e | ||
![]() |
e011494569 | ||
![]() |
ccf7f7aa1c | ||
![]() |
7308fd0612 | ||
![]() |
bfaa142e10 | ||
![]() |
41ad596347 | ||
![]() |
b303c597bf | ||
![]() |
2c9dd311a1 | ||
![]() |
d15b6ac706 | ||
![]() |
975ea18375 | ||
![]() |
563ef30693 | ||
![]() |
d76ebcf4dd | ||
![]() |
c2a8bdfbb8 | ||
![]() |
a156bd72cc | ||
![]() |
d40275b21f | ||
![]() |
44a7de3ccb | ||
![]() |
40ab02644d | ||
![]() |
463b54e69f | ||
![]() |
c7a4a6fc93 | ||
![]() |
59ea99468b | ||
![]() |
453cfbf2e4 | ||
![]() |
b3a559fd5f | ||
![]() |
17b0f351fd | ||
![]() |
71dc2eda29 | ||
![]() |
947edeb7a4 | ||
![]() |
1bbbdb7c81 | ||
![]() |
232d378a09 | ||
![]() |
b39f498d42 | ||
![]() |
2a8030d979 | ||
![]() |
ab614a8e67 | ||
![]() |
500a55b8b9 | ||
![]() |
fbc42ec2a6 | ||
![]() |
c392348015 | ||
![]() |
f93b0f05f8 | ||
![]() |
4f8f64e5fa | ||
![]() |
e91c4e73ea | ||
![]() |
66ae6fada1 | ||
![]() |
7072206bb6 | ||
![]() |
066c7cc77c | ||
![]() |
e111165135 | ||
![]() |
2cfee85a02 | ||
![]() |
0f3ea0a6b1 | ||
![]() |
f665fcef84 | ||
![]() |
ebf1130d0d | ||
![]() |
6f28f071ad | ||
![]() |
d1dddc096b | ||
![]() |
be842fccb3 | ||
![]() |
ffcce3a2c3 | ||
![]() |
387b8dccbe | ||
![]() |
8e28d8abff | ||
![]() |
a3de8eb84d | ||
![]() |
7ffb4ce3e7 | ||
![]() |
8c052911f1 | ||
![]() |
616e7cbcf1 | ||
![]() |
187d4dc68f | ||
![]() |
7bb87ef354 | ||
![]() |
7dd7007c83 | ||
![]() |
1d0511d145 | ||
![]() |
085c3ae5fe | ||
![]() |
20256e2761 | ||
![]() |
8d361c821f | ||
![]() |
b5e5550006 | ||
![]() |
7a80d7ed8d | ||
![]() |
bf78e39f74 | ||
![]() |
943e25a252 | ||
![]() |
98db7aca7d | ||
![]() |
a4a18eaca5 | ||
![]() |
bdf1f2aac6 | ||
![]() |
9e346ddaf5 | ||
![]() |
59f7ab27a5 | ||
![]() |
10ad0ee767 | ||
![]() |
31b2ac5a61 | ||
![]() |
f84142c9f5 | ||
![]() |
b11ba58166 | ||
![]() |
1aa6e7a987 | ||
![]() |
935bbd6686 | ||
![]() |
e2860176b3 | ||
![]() |
81aab35f18 | ||
![]() |
be9763a59f | ||
![]() |
85691e1431 | ||
![]() |
228b21faf8 | ||
![]() |
c975a883fb | ||
![]() |
3bb133ffa1 | ||
![]() |
441b3fe985 | ||
![]() |
2579e39a9b | ||
![]() |
4d5987aacb | ||
![]() |
4988de96be | ||
![]() |
047f3799cd | ||
![]() |
516f2eba85 | ||
![]() |
211d58e761 | ||
![]() |
57a11bbcf6 | ||
![]() |
b5b4d6d09b | ||
![]() |
9c7a75633f | ||
![]() |
00e95fe8a7 | ||
![]() |
c5c076442a | ||
![]() |
5573a60df4 | ||
![]() |
282672dfd4 | ||
![]() |
2589debcd4 | ||
![]() |
1537889373 | ||
![]() |
102c6cbb9d | ||
![]() |
86b04cfacb | ||
![]() |
c29c9fdafa | ||
![]() |
f44e0514fe | ||
![]() |
c607637079 | ||
![]() |
0da6378941 | ||
![]() |
b6f18bccc6 | ||
![]() |
0332d500c1 | ||
![]() |
f5eefb3da5 | ||
![]() |
1fe7792c9d | ||
![]() |
cb88d6a91f | ||
![]() |
4a100f6388 | ||
![]() |
fc342f131b | ||
![]() |
c2159547a1 | ||
![]() |
e7f78515ca | ||
![]() |
42ecd79095 | ||
![]() |
2975c2b160 | ||
![]() |
f536a4838a | ||
![]() |
c3a55dc83f | ||
![]() |
214a4a7e24 | ||
![]() |
e061e53d21 | ||
![]() |
52602b20f4 | ||
![]() |
6c481bbbf2 | ||
![]() |
38d3d083ac | ||
![]() |
1755c3636b | ||
![]() |
fea6f1f2af | ||
![]() |
97d632b69e | ||
![]() |
5559341be4 | ||
![]() |
c29b2a935d | ||
![]() |
17e95b06fd | ||
![]() |
9d2509ec49 | ||
![]() |
e60ae0a240 | ||
![]() |
f377e03790 | ||
![]() |
01647a6e4e | ||
![]() |
e42bdea288 | ||
![]() |
edce75a81f | ||
![]() |
805a725fe2 | ||
![]() |
539562a5a1 | ||
![]() |
69a145d983 | ||
![]() |
3f3d26cb8f | ||
![]() |
3d009eba98 | ||
![]() |
973d0346e1 | ||
![]() |
c377ee725d | ||
![]() |
57f02b92d2 | ||
![]() |
75d770eb02 | ||
![]() |
172cbe1286 | ||
![]() |
ae2a617945 | ||
![]() |
764145c0f5 | ||
![]() |
1b405e4abf | ||
![]() |
1182681071 | ||
![]() |
dcce8925b4 | ||
![]() |
8f490ce88f | ||
![]() |
5fa2f4ae75 | ||
![]() |
18051a52e6 | ||
![]() |
8aa3612072 | ||
![]() |
70438bf8d6 | ||
![]() |
37972c42bf | ||
![]() |
49876ee61f | ||
![]() |
a859641089 | ||
![]() |
e98a97a505 | ||
![]() |
adb738d434 | ||
![]() |
44bc52b03b | ||
![]() |
845148d8c2 | ||
![]() |
232d5c0bb1 | ||
![]() |
b92f304f4c | ||
![]() |
6bafbd30e3 | ||
![]() |
84ce9bc793 | ||
![]() |
219a3a8325 | ||
![]() |
5fbed0cb9d | ||
![]() |
26d24334b6 | ||
![]() |
4877221124 | ||
![]() |
b29d5a942f | ||
![]() |
6946b9c27a | ||
![]() |
0298fc88ad | ||
![]() |
52e975db52 | ||
![]() |
91b5ef7feb | ||
![]() |
ea1e82978b | ||
![]() |
cb87d142d9 | ||
![]() |
a88eedf1bc | ||
![]() |
3bd3403c2c | ||
![]() |
697f135778 | ||
![]() |
8bec07f2be | ||
![]() |
aa0921a5fc | ||
![]() |
99ca5a4427 | ||
![]() |
3021cead00 | ||
![]() |
1ff2f21f67 | ||
![]() |
83f2c671c2 | ||
![]() |
7a6b37a02d | ||
![]() |
581c4509fc | ||
![]() |
9e094516bc | ||
![]() |
f4e152fe30 | ||
![]() |
aff887d0b3 | ||
![]() |
0c4e62470c | ||
![]() |
9707e69089 | ||
![]() |
555c9c2257 | ||
![]() |
32b52e0017 | ||
![]() |
29dc643578 | ||
![]() |
68cac3b452 | ||
![]() |
5460161b6f | ||
![]() |
2333fa48ab | ||
![]() |
85f9c86856 | ||
![]() |
f873d668e1 | ||
![]() |
cae67bf348 | ||
![]() |
8c41cdcb13 | ||
![]() |
d0092847ab | ||
![]() |
256afe3a5e | ||
![]() |
88ada517e4 | ||
![]() |
85ca04bd9a | ||
![]() |
515a209340 | ||
![]() |
262c1e7552 | ||
![]() |
6acced712e | ||
![]() |
80bbffa205 | ||
![]() |
f4bbe80f79 | ||
![]() |
29033543f0 | ||
![]() |
7e60c1687e | ||
![]() |
c787940c3c | ||
![]() |
aa3523c1aa | ||
![]() |
e32903efe0 | ||
![]() |
17b8f53293 | ||
![]() |
0dd6e4b537 | ||
![]() |
7f1800fd9b | ||
![]() |
afdcb58c83 | ||
![]() |
7367aa8c73 | ||
![]() |
32dd91e4fa | ||
![]() |
7a051e3d87 | ||
![]() |
43939f6242 | ||
![]() |
203e30f664 | ||
![]() |
91790e2164 | ||
![]() |
c4dbaec151 | ||
![]() |
b29e3b3b49 | ||
![]() |
2aa7576a84 | ||
![]() |
5dddb36345 | ||
![]() |
01d7e28375 | ||
![]() |
ced42e99c7 | ||
![]() |
b09424b30b | ||
![]() |
9c12af4b19 | ||
![]() |
33331fe998 | ||
![]() |
c0450a5112 | ||
![]() |
920029e627 | ||
![]() |
8a8a537af6 | ||
![]() |
16830168a4 | ||
![]() |
106ba6b7ab | ||
![]() |
6729ef1a60 | ||
![]() |
68ada3a206 | ||
![]() |
c90251764d | ||
![]() |
26df85cf34 | ||
![]() |
33c5abdc5a | ||
![]() |
ea3c0dcbb1 | ||
![]() |
de18760314 | ||
![]() |
38891fc8ed | ||
![]() |
414c5c3f4a | ||
![]() |
15de00ae64 | ||
![]() |
6afbd0dfc1 | ||
![]() |
6825077915 | ||
![]() |
24b0ecec28 | ||
![]() |
df2532f91e | ||
![]() |
7210d3c602 | ||
![]() |
b01513e9e4 | ||
![]() |
94fc95366a | ||
![]() |
865450cfc9 | ||
![]() |
34abd57cd4 | ||
![]() |
beffdebe98 | ||
![]() |
68e0f6d578 | ||
![]() |
7bfcdd8728 | ||
![]() |
a15108da1d | ||
![]() |
7964006823 | ||
![]() |
45fdd36d9a | ||
![]() |
6846fad75f | ||
![]() |
ed9e1a2299 | ||
![]() |
a55232f29d | ||
![]() |
1e04bade71 | ||
![]() |
44ad4a9b45 | ||
![]() |
da83906812 | ||
![]() |
dd22b9a477 | ||
![]() |
988b200a20 | ||
![]() |
f257b67d7c | ||
![]() |
7b7b88b315 | ||
![]() |
22c3dde660 | ||
![]() |
8ac9c439ef | ||
![]() |
ac82f94a5d | ||
![]() |
35609d0947 | ||
![]() |
f43d0623a5 | ||
![]() |
9048474c02 | ||
![]() |
78dfda62e0 | ||
![]() |
7b9c1a024d | ||
![]() |
81dd568442 | ||
![]() |
87c78f7e05 | ||
![]() |
92407b2e83 | ||
![]() |
0ca4bd07e3 | ||
![]() |
1c59f5ea4d | ||
![]() |
45f9610ba3 | ||
![]() |
ebeeb2cbcf | ||
![]() |
df024b409b | ||
![]() |
4456abe84e | ||
![]() |
61a46f8626 | ||
![]() |
fcc30c24a6 | ||
![]() |
8aec24471c | ||
![]() |
0e5583f7f1 | ||
![]() |
881905d55f | ||
![]() |
78a303801c | ||
![]() |
ff0bd85aa7 | ||
![]() |
67584d4b14 | ||
![]() |
a476c5eea2 | ||
![]() |
d5e5e8d8eb | ||
![]() |
41150946a8 | ||
![]() |
347a127c2e | ||
![]() |
f2815da626 | ||
![]() |
4b37ff93ed | ||
![]() |
ea79a02e94 | ||
![]() |
f17af8c3f1 | ||
![]() |
4d9b8503c9 | ||
![]() |
29f91c9547 | ||
![]() |
b655d45c70 | ||
![]() |
091b356249 | ||
![]() |
7101c9b074 | ||
![]() |
371caea8f5 | ||
![]() |
f08ce00f7d | ||
![]() |
1fdb48415c | ||
![]() |
f25b2e1866 | ||
![]() |
2ad238c1ff | ||
![]() |
b3c68e4ac8 | ||
![]() |
04a9879bc3 | ||
![]() |
161fcd1ec3 | ||
![]() |
17570f4d23 | ||
![]() |
d1a0d2be4d | ||
![]() |
5667a7cf52 | ||
![]() |
d107fd692d | ||
![]() |
34924a7200 | ||
![]() |
8b206b9d32 | ||
![]() |
fc4ca70d9d | ||
![]() |
19771e874a | ||
![]() |
18d0958815 | ||
![]() |
e8c13c4aff | ||
![]() |
ae08032bf1 | ||
![]() |
0900dc2b67 | ||
![]() |
adc742d9e4 | ||
![]() |
a0667aa9b0 | ||
![]() |
e1bf63a9b0 | ||
![]() |
5559f7950f | ||
![]() |
dd2a1d4621 | ||
![]() |
b93ffb0d51 | ||
![]() |
83800af5d8 | ||
![]() |
8e59a35160 | ||
![]() |
c7d1a09ce7 | ||
![]() |
b465224fc2 | ||
![]() |
df138c5f78 | ||
![]() |
128238b55f | ||
![]() |
562d780e8c | ||
![]() |
d1d3304fde | ||
![]() |
f48872da1d | ||
![]() |
fe2d0a5548 | ||
![]() |
4722c0c319 | ||
![]() |
92d70cde0c | ||
![]() |
d8873f2f8d | ||
![]() |
ed58bab7a2 | ||
![]() |
d4e6628516 | ||
![]() |
4924843daa | ||
![]() |
1f7e104920 | ||
![]() |
c626cdfcce | ||
![]() |
699f791faf | ||
![]() |
74d7844b64 |
5
legal/Authors.txt → .github/AUTHORS.md
vendored
|
@ -12,7 +12,7 @@ Code:
|
|||
Chris Magee <chris.magee@gametheworld.com>
|
||||
Gabriel Burt <gabriel.burt@gmail.com>
|
||||
Garrett LeSage <garrett@novell.com>
|
||||
Hylke Bons <hylkebons@gmail.com>
|
||||
Hylke Bons <hi@planetpeanut.uk>
|
||||
Jonathan Haines <jonno.haines@gmail.com>
|
||||
Kristi Tsukida <kristi.tsukida@gmail.com>
|
||||
Konstantinos Vaggelakos <kozze89@gmail.com>
|
||||
|
@ -20,6 +20,7 @@ Code:
|
|||
Luis Cordova <cordoval@gmail.com>
|
||||
Łukasz Jernaś <deejay1@srem.org>
|
||||
Markus Stoll <post@mstoll.de>
|
||||
Malte Kiefer <malte.kiefer@mailgermania.de>
|
||||
Michael Monreal <michael.monreal@gmail.com>
|
||||
Nick Richards <nick@nickr.org>
|
||||
Oleg Khlystov <pktfag@gmail.com>
|
||||
|
@ -39,7 +40,7 @@ Design:
|
|||
|
||||
Andreas Nilsson <andreasn@gnome.org>
|
||||
Jakub Steiner <jimmac@redhat.com>
|
||||
Hylke Bons <hylkebons@gmail.com>
|
||||
Hylke Bons <hi@planetpeanut.uk>
|
||||
Lapo Calamandrei <calamandrei@gmail.com>
|
||||
Sam Hewitt <hewittsamuel@gmail.com>
|
||||
|
46
.github/CODE_OF_CONDUCT.md
vendored
Normal file
|
@ -0,0 +1,46 @@
|
|||
# Contributor Covenant Code of Conduct
|
||||
|
||||
## Our Pledge
|
||||
|
||||
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
|
||||
|
||||
## Our Standards
|
||||
|
||||
Examples of behavior that contributes to creating a positive environment include:
|
||||
|
||||
* Using welcoming and inclusive language
|
||||
* Being respectful of differing viewpoints and experiences
|
||||
* Gracefully accepting constructive criticism
|
||||
* Focusing on what is best for the community
|
||||
* Showing empathy towards other community members
|
||||
|
||||
Examples of unacceptable behavior by participants include:
|
||||
|
||||
* The use of sexualized language or imagery and unwelcome sexual attention or advances
|
||||
* Trolling, insulting/derogatory comments, and personal or political attacks
|
||||
* Public or private harassment
|
||||
* Publishing others' private information, such as a physical or electronic address, without explicit permission
|
||||
* Other conduct which could reasonably be considered inappropriate in a professional setting
|
||||
|
||||
## Our Responsibilities
|
||||
|
||||
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
|
||||
|
||||
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
|
||||
|
||||
## Scope
|
||||
|
||||
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
|
||||
|
||||
## Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at hi@planetpeanut.uk. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
|
||||
|
||||
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
|
||||
|
||||
## Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
|
||||
|
||||
[homepage]: http://contributor-covenant.org
|
||||
[version]: http://contributor-covenant.org/version/1/4/
|
14
.github/CONTRIBUTING.md
vendored
Normal file
|
@ -0,0 +1,14 @@
|
|||
Hey there!
|
||||
|
||||
I'm Hylke, the creator of this project. It's about time I wrote something up about how to contribute to SparkleShare, so here goes...
|
||||
|
||||
Contributions to SparkleShare are always welcome! I'm not a great coder. I like to design icons and interfaces, so there are always bugs or things that can be done better. Take a look at the [list of open issues](https://github.com/hbons/SparkleShare/issues). Smaller issues or places where refactoring is needed are marked with `FIXME` or `TODO` in the source code. If you have a fix for SparkleShare, simply open a pull request against the master branch (keeping in mind the [[coding style]]) and if you think your change is significant enough to be copyrighted, feel free to add your name and email to the `AUTHORS` file. Releases are done at least once a month, so there won't be long waits for bug fixes.
|
||||
|
||||
SparkleShare tries to keep things simple and to stay out of people's way. Features are only added if they are essential and helpful to a majority of users. If you have a feature that you'd like to be added, please open an issue first, so there can be a discussion whether the feature is actually needed (or it may be it can be done in some other way); do not waste work on a feature that isn't actually desired. By limiting the amount of features, we can spend more time on making the core features solid in order to help people get things done.
|
||||
|
||||
Often requests come in to add preferences. I'm very pleased that we've been able to solve most problems reported and features requested without adding a "preference". Currently SparkleShare has only one preference: enabling/disabling notifications. Hopefully it will stay this way and we can withhold from adding a preference panel of some kind (but I can't rule it out). Figuring out how things can be done without burdening people with a preference is much more challenging and rewarding in my opinion. [Free Software UI](http://ometer.com/free-software-ui.html) is a great article about this topic and I recommend reading it.
|
||||
|
||||
Looking forward to your contributions! :)
|
||||
|
||||
Hylke
|
||||
|
1
.github/FUNDING.yml
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
github: hbons
|
20
.github/ISSUE_TEMPLATE.md
vendored
Normal file
|
@ -0,0 +1,20 @@
|
|||
You can find session logs by date and version information in:
|
||||
~/.config/org.sparkleshare.SparkleShare/logs/ on Linux and macOS
|
||||
C:\Users\YOUR_USERNAME\AppData\Roaming\org.sparkleshare.SparkleShare\logs\ on Windows
|
||||
|
||||
To help us help you, please include the logs from around the time the issue occurred, as well as the SparkleShare version and info about your OS (displayed at the top of the log files). Then, tell us roughly in these steps what went wrong:
|
||||
|
||||
|
||||
### What happened:
|
||||
…
|
||||
|
||||
### What I expected to happen:
|
||||
…
|
||||
|
||||
### This happens when:
|
||||
1. …
|
||||
2. …
|
||||
3. …
|
||||
|
||||
|
||||
Thanks for reporting your issue or feature request, it helps lots!
|
34
.gitignore
vendored
|
@ -12,31 +12,14 @@
|
|||
*.sln.cache
|
||||
*.user
|
||||
*.resources
|
||||
Makefile.in
|
||||
Makefile
|
||||
intltool-*
|
||||
configure
|
||||
config.guess
|
||||
config.h
|
||||
config.h.in
|
||||
config.log
|
||||
config.status
|
||||
config.sub
|
||||
aclocal.m4
|
||||
autom4te.cache/
|
||||
bin/
|
||||
build/
|
||||
obj/
|
||||
install-sh
|
||||
libtool
|
||||
ltmain.sh
|
||||
missing
|
||||
build/m4/shave/shave
|
||||
build/m4/*.m4
|
||||
build/m4/shave/shave-libtool
|
||||
SparkleLib/Defines.cs
|
||||
git-*
|
||||
Sparkles/InstallationInfo.Directory.cs
|
||||
SparkleShare/Linux/sparkleshare
|
||||
SparkleShare/Mac/git*
|
||||
gnome-doc-utils.make
|
||||
SparkleShare/Mac/*.tar.gz
|
||||
/sparkleshare-*
|
||||
desktop.ini
|
||||
_ReSharper.*
|
||||
|
@ -45,4 +28,13 @@ _ReSharper.*
|
|||
*.wixpdb
|
||||
*.wxs
|
||||
*.dotCover
|
||||
SparkleShare/Windows/build/
|
||||
.vs/
|
||||
|
||||
# NuGet Packages
|
||||
*.nupkg
|
||||
# The packages folder can be ignored because of Package Restore
|
||||
**/packages/*
|
||||
# except build/, which is used as an MSBuild target.
|
||||
!**/packages/build/
|
||||
|
||||
|
|
34
.travis.yml
Normal file
|
@ -0,0 +1,34 @@
|
|||
language: csharp
|
||||
|
||||
matrix:
|
||||
include:
|
||||
- os: linux
|
||||
services:
|
||||
- docker
|
||||
- os: osx
|
||||
sudo: required
|
||||
|
||||
before_install:
|
||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then docker pull ubuntu:xenial ; fi
|
||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then wget https://dl.xamarin.com/XamarinforMac/Mac/xamarin.mac-3.0.0.393.pkg ; fi
|
||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then sudo installer -pkg xamarin.mac*.pkg -target / ; fi
|
||||
|
||||
script:
|
||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then docker build --file scripts/ci/Dockerfile --tag sparkleshare:nightly . ; fi
|
||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then msbuild /p:Configuration=ReleaseMac SparkleShare.sln ; fi
|
||||
|
||||
before_deploy:
|
||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then export DEPLOY_FILE=`docker run --name container sparkleshare:nightly find / -name sparkleshare*.tar.gz` ; fi
|
||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then docker cp container:${DEPLOY_FILE} ./ ; fi
|
||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then mv sparkleshare*.tar.gz sparkleshare-linux-nightly-${TRAVIS_COMMIT}.tar.gz ; fi
|
||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then mv SparkleShare/Mac/bin/ReleaseMac/SparkleShare.app . ; fi
|
||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then zip --recurse-paths sparkleshare-mac-nightly-${TRAVIS_COMMIT}.zip SparkleShare.app ; fi
|
||||
|
||||
notifications:
|
||||
webhooks:
|
||||
urls:
|
||||
- https://webhooks.gitter.im/e/f1a1178baa78d1162385
|
||||
on_success: change
|
||||
on_failure: always
|
||||
on_start: never
|
||||
|
23
Makefile.am
|
@ -1,23 +0,0 @@
|
|||
basedirs = build SparkleLib SparkleLib/Git
|
||||
|
||||
SUBDIRS = $(basedirs) $(GUISUBDIRS)
|
||||
DIST_SUBDIRS = $(basedirs) SparkleShare
|
||||
|
||||
EXTRA_DIST = \
|
||||
News.txt \
|
||||
README.md \
|
||||
legal/License_for_SparkleShare.txt \
|
||||
legal/License_for_SparkleLib.txt \
|
||||
legal/Trademark.txt \
|
||||
legal/Authors.txt \
|
||||
SparkleShare/Linux/README.md \
|
||||
SparkleShare/Linux/sparkleshare.appdata.xml
|
||||
|
||||
DISTCLEANFILES = \
|
||||
intltool-extract \
|
||||
intltool-merge \
|
||||
intltool-update \
|
||||
gnome-doc-utils.make
|
||||
|
||||
clean-local:
|
||||
rm -rf $(top_builddir)/bin
|
44
README.md
|
@ -1,34 +1,54 @@
|
|||
# SparkleShare
|
||||
# [SparkleShare](https://www.sparkleshare.org/)
|
||||
|
||||
SparkleShare is an Open Source collaboration and sharing tool that is designed to keep things simple and to stay out of your way. It's available for Linux distributions, Mac, and Windows.
|
||||
[SparkleShare](https://www.sparkleshare.org/) is a file sharing and collaboration app. It works just like Dropbox, and you can run it on your own server. It's available for Linux distributions, macOS, and Windows.
|
||||
|
||||

|
||||

|
||||
|
||||
You can support this project through [💕 GitHub Sponsors](https://github.com/sponsors/hbons).
|
||||
|
||||
## How does it work?
|
||||
|
||||
SparkleShare creates a special folder on your computer. You can add remotely hosted folders (or "projects") to this folder. These projects will be automatically kept in sync with both the host and all of your peers when someone adds, removes or edits a file.
|
||||
|
||||
## Install on Ubuntu or Fedora
|
||||
|
||||
## Setting up a host
|
||||
You can install the package from your distribution (likely old and not updated often), but we recommend to get our Flatpak with automatic updates to always enjoy the latest and greatest:
|
||||
|
||||
SparkleShare uses the version control system [Git](https://git-scm.com/) under the hood, so setting up a host yourself is relatively easy. Using your own host gives you more privacy and control, as well as lots of cheap storage space and higher transfer speeds. We've made a simple [script](https://github.com/hbons/Dazzle) that does the hard work for you. If you need to manage a lot of projects and/or users it may be worth setting up a [GitLab](https://www.gitlabhq.com) instance.
|
||||
```bash
|
||||
flatpak remote-add flathub https://flathub.org/repo/flathub.flatpakrepo
|
||||
flatpak install flathub org.sparkleshare.SparkleShare
|
||||
```
|
||||
|
||||
Now you can run SparkleShare from the apps menu.
|
||||
|
||||
**Note:** by default SparkleShare uses an AppIndicator status icon on Linux. If you use GNOME on a distribution other than Ubuntu, please install the [AppIndicator extension](https://extensions.gnome.org/extension/615/appindicator-support/). If you don't use GNOME, you can start SparkleShare with `--status-icon=gtk`.
|
||||
|
||||
|
||||
## Free and Open Source
|
||||
`SparkleShare` is Free and Open Source software and licensed under the [GNU General Public License version 3 or later](legal/License_for_SparkleShare.txt). You are welcome to change and redistribute it under certain conditions. Its library `SparkleLib` is licensed under the [GNU Lesser General Public License version 3 or later](legal/License_for_SparkleLib.txt).
|
||||
## Install on macOS
|
||||
|
||||
Download the app from the [releases page](https://github.com/hbons/SparkleShare/releases).
|
||||
|
||||
|
||||
## Compiling from source
|
||||
## Set up a host
|
||||
|
||||
Here are instructions to build SparkleShare on [Linux distributions](SparkleShare/Linux/README.md), [Mac](SparkleShare/Mac/README.md), and [Windows](SparkleShare/Windows/README.md). Make sure to have the `git` package installed when you're building on Linux.
|
||||
Under the hood SparkleShare uses the version control system [Git](https://git-scm.com/) and the large files extension [Git LFS](https://git-lfs.github.com), so setting up a host yourself is relatively easy. Using your own host gives you more privacy and control, as well as lots of cheap storage space and higher transfer speeds. We've made a simple [script](https://github.com/hbons/Dazzle) that does the hard work for you. If you need to manage a lot of projects and/or users we recommend hosting a [GitLab Community Edition](https://about.gitlab.com/installation/) instance.
|
||||
|
||||
|
||||
## Build from source
|
||||
`SparkleShare` is Free and Open Source software and licensed under the [GNU GPLv3 or later](LICENSE.md). You are welcome to change and redistribute it under certain conditions. Its library `Sparkles` is licensed under the [GNU LGPLv3 or later](LICENSE_Sparkles.md).
|
||||
|
||||
Here are instructions to build SparkleShare on [Linux distributions](SparkleShare/Linux/README.md), [macOS](SparkleShare/Mac/README.md), and [Windows](SparkleShare/Windows/README.md).
|
||||
|
||||
|
||||
[](https://travis-ci.org/hbons/SparkleShare)
|
||||
[](https://gitter.im/hbons/SparkleShare?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||
|
||||
## Useful links
|
||||
[Website](http://www.sparkleshare.org/), [Twitter](https://www.twitter.com/SparkleShare), [Wiki](https://www.github.com/hbons/SparkleShare/wiki), and [Source Code](https://www.github.com/hbons/SparkleShare). Join the chat: #sparkleshare on irc.gnome.org.
|
||||
- [sparkleshare.org](https://www.sparkleshare.org/)
|
||||
- [@SparkleShare](https://www.twitter.com/SparkleShare), [@hbons](https://www.twitter.com/hbons)
|
||||
- Community chatroom on [Gitter](https://www.gitter.im/hbons/SparkleShare)
|
||||
- [Wiki](https://www.github.com/hbons/SparkleShare/wiki)
|
||||
|
||||
|
||||
## Finally
|
||||
|
||||
Have fun, make awesome. :)
|
||||
|
||||
|
|
|
@ -1,3 +1,66 @@
|
|||
3.38.0 (Sun 29 Nov, 2020):
|
||||
|
||||
- Added support for LibRAavatar
|
||||
- Updated Gravatar cert fingerprint
|
||||
- Removed planio from supported presets
|
||||
- Support default branches that are not named 'master'
|
||||
- Added support for nightly Flatpak builds
|
||||
|
||||
|
||||
3.28.0 (Sat 14 Jul, 2018):
|
||||
|
||||
Fixed a bunch of crashes and lots of under-the-hood improvements.
|
||||
SparkleShare will now follow the GNOME release schedule and version
|
||||
number scheme as much as possible.
|
||||
|
||||
Please make sure to install the AppIndicator Support GNOME Shell extension
|
||||
(https://extensions.gnome.org/extension/615/appindicator-support/) to display
|
||||
status icons in GNOME 3.26 or later. Or start with --status-icon=gtk.
|
||||
|
||||
Linux:
|
||||
- Use the Meson build system
|
||||
- Use appindicator as the default status icon
|
||||
- Fix event log parsing for newer versions of Git
|
||||
- Flatpak improvements
|
||||
|
||||
macOS:
|
||||
- Fix the system font in eventlog and related crash
|
||||
- Fix hang when quitting the app
|
||||
|
||||
Special thanks to Thiago Santos and Renpytom for supporting the project on Patreon.
|
||||
|
||||
|
||||
2.0.1 (Tue 19 Dec, 2017):
|
||||
|
||||
- Fix files created by conflict resolution being moved to the root folder
|
||||
- On conflicts, both diverging versions plus the original version are kept
|
||||
- New app icon on Mac
|
||||
|
||||
|
||||
2.0.0 for Linux, Mac and Windows (Sun Sep 10, 2017):
|
||||
|
||||
SparkleShare 2.0 is a clean break and will be incompatible with
|
||||
the 1.x series. Repositories added using 1.0 will likely not work
|
||||
and will have to be re-synced to take advantage of 2.0 features.
|
||||
|
||||
Hylke:
|
||||
- Flatpak version now available
|
||||
- Support for Git LFS managed repositories
|
||||
- Updated Linux app icon by Sam Hewitt
|
||||
- Projects are now grouped by host/organisation
|
||||
- Prefer to use the "SparkleShare" branch if it exists remotely
|
||||
- Added a GitLab preset
|
||||
- Add an entry to GNOME's System Settings to manage notifications
|
||||
- Encrypt names and emails in history of encrypted projects
|
||||
- When conflicts are resolved "SparkleShare" is now the author and
|
||||
merge commits will be hidden from the log
|
||||
- Fix conflict resolution on encrypted files
|
||||
- Use a standalone SSH configuration instead of ssh-agent
|
||||
- Use SHA256 instead of MD5 for SSH fingerprinting
|
||||
- Dropped limited HTTPS support
|
||||
- Dropped insecure DSA key support
|
||||
|
||||
|
||||
1.5.0 for Linux, Mac and Windows (Tue Dec 22, 2015):
|
||||
|
||||
Hylke:
|
|
@ -1,22 +0,0 @@
|
|||
ASSEMBLY = SparkleLib.Git
|
||||
TARGET = library
|
||||
|
||||
LINK = -r:$(DIR_BIN)/SparkleLib.dll
|
||||
|
||||
SOURCES = \
|
||||
SparkleGit.cs \
|
||||
SparkleFetcherGit.cs \
|
||||
SparkleRepoGit.cs
|
||||
|
||||
|
||||
install-data-hook:
|
||||
for ASM in $(EXTRA_BUNDLE); do \
|
||||
$(INSTALL) -m 0755 $$ASM $(DESTDIR)$(moduledir); \
|
||||
done;
|
||||
|
||||
uninstall-hook:
|
||||
for ASM in $(EXTRA_BUNDLE); do \
|
||||
rm -f $(DESTDIR)$(moduledir)/`basename $$ASM`; \
|
||||
done;
|
||||
|
||||
include $(top_srcdir)/build/build.mk
|
|
@ -1,450 +0,0 @@
|
|||
// SparkleShare, a collaboration and sharing tool.
|
||||
// Copyright (C) 2010 Hylke Bons <hylkebons@gmail.com>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Lesser General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading;
|
||||
using SparkleLib;
|
||||
|
||||
namespace SparkleLib.Git {
|
||||
|
||||
public class SparkleFetcher : SparkleFetcherSSH {
|
||||
|
||||
private SparkleGit git;
|
||||
private bool use_git_bin;
|
||||
private string cached_salt;
|
||||
|
||||
private Regex progress_regex = new Regex (@"([0-9]+)%", RegexOptions.Compiled);
|
||||
private Regex speed_regex = new Regex (@"([0-9\.]+) ([KM])iB/s", RegexOptions.Compiled);
|
||||
|
||||
private bool crypto_password_is_hashed = true;
|
||||
|
||||
private string crypto_salt {
|
||||
get {
|
||||
if (!string.IsNullOrEmpty (this.cached_salt))
|
||||
return this.cached_salt;
|
||||
|
||||
// Check if the repo's salt is stored in a branch...
|
||||
SparkleGit git = new SparkleGit (TargetFolder, "ls-remote --heads");
|
||||
string branches = git.StartAndReadStandardOutput ();
|
||||
Regex salt_regex = new Regex ("refs/heads/salt-([0-9a-f]+)");
|
||||
Match salt_match = salt_regex.Match (branches);
|
||||
|
||||
if (salt_match.Success)
|
||||
this.cached_salt = salt_match.Groups [1].Value;
|
||||
|
||||
// ...if not, create a new salt for the repo
|
||||
if (string.IsNullOrEmpty (this.cached_salt)) {
|
||||
this.cached_salt = GenerateCryptoSalt ();
|
||||
string salt_file_path = new string [] { TargetFolder, ".git", "salt" }.Combine ();
|
||||
|
||||
// Temporarily store the salt in a file, so the Repo object can
|
||||
// push it to a branch on the host later
|
||||
File.WriteAllText (salt_file_path, this.cached_salt);
|
||||
}
|
||||
|
||||
return this.cached_salt;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public SparkleFetcher (SparkleFetcherInfo info) : base (info)
|
||||
{
|
||||
if (RemoteUrl.ToString ().StartsWith ("ssh+"))
|
||||
RemoteUrl = new Uri ("ssh" + RemoteUrl.ToString ().Substring (RemoteUrl.ToString ().IndexOf ("://")));
|
||||
|
||||
Uri uri = RemoteUrl;
|
||||
|
||||
if (!uri.Scheme.Equals ("ssh") && !uri.Scheme.Equals ("https") &&
|
||||
!uri.Scheme.Equals ("http") && !uri.Scheme.Equals ("git")) {
|
||||
|
||||
uri = new Uri ("ssh://" + uri);
|
||||
}
|
||||
|
||||
if (uri.Host.Equals ("gitorious.org") && !uri.Scheme.StartsWith ("http")) {
|
||||
if (!uri.AbsolutePath.Equals ("/") &&
|
||||
!uri.AbsolutePath.EndsWith (".git")) {
|
||||
|
||||
uri = new Uri ("ssh://git@gitorious.org" + uri.AbsolutePath + ".git");
|
||||
|
||||
} else {
|
||||
uri = new Uri ("ssh://git@gitorious.org" + uri.AbsolutePath);
|
||||
}
|
||||
|
||||
} else if (uri.Host.Equals ("github.com") && !uri.Scheme.StartsWith ("http")) {
|
||||
uri = new Uri ("ssh://git@github.com" + uri.AbsolutePath);
|
||||
|
||||
} else if (uri.Host.Equals ("bitbucket.org") && !uri.Scheme.StartsWith ("http")) {
|
||||
// Nothing really
|
||||
|
||||
} else {
|
||||
if (string.IsNullOrEmpty (uri.UserInfo) && !uri.Scheme.StartsWith ("http")) {
|
||||
if (uri.Port == -1)
|
||||
uri = new Uri (uri.Scheme + "://storage@" + uri.Host + uri.AbsolutePath);
|
||||
else
|
||||
uri = new Uri (uri.Scheme + "://storage@" + uri.Host + ":" + uri.Port + uri.AbsolutePath);
|
||||
}
|
||||
|
||||
this.use_git_bin = false; // TODO
|
||||
}
|
||||
|
||||
RemoteUrl = uri;
|
||||
}
|
||||
|
||||
|
||||
public override bool Fetch ()
|
||||
{
|
||||
if (!base.Fetch ())
|
||||
return false;
|
||||
|
||||
if (FetchPriorHistory) {
|
||||
this.git = new SparkleGit (SparkleConfig.DefaultConfig.TmpPath,
|
||||
"clone --progress --no-checkout \"" + RemoteUrl + "\" \"" + TargetFolder + "\"");
|
||||
|
||||
} else {
|
||||
this.git = new SparkleGit (SparkleConfig.DefaultConfig.TmpPath,
|
||||
"clone --progress --no-checkout --depth=1 \"" + RemoteUrl + "\" \"" + TargetFolder + "\"");
|
||||
}
|
||||
|
||||
this.git.StartInfo.RedirectStandardError = true;
|
||||
this.git.Start ();
|
||||
|
||||
double percentage = 1.0;
|
||||
|
||||
DateTime last_change = DateTime.Now;
|
||||
TimeSpan change_interval = new TimeSpan (0, 0, 0, 1);
|
||||
|
||||
try {
|
||||
while (!this.git.StandardError.EndOfStream) {
|
||||
string line = this.git.StandardError.ReadLine ();
|
||||
Match match = this.progress_regex.Match (line);
|
||||
|
||||
double number = 0.0;
|
||||
double speed = 0.0;
|
||||
if (match.Success) {
|
||||
try {
|
||||
number = double.Parse (match.Groups [1].Value, new CultureInfo ("en-US"));
|
||||
|
||||
} catch (FormatException) {
|
||||
SparkleLogger.LogInfo ("Git", "Error parsing progress: \"" + match.Groups [1] + "\"");
|
||||
}
|
||||
|
||||
// The pushing progress consists of two stages: the "Compressing
|
||||
// objects" stage which we count as 20% of the total progress, and
|
||||
// the "Writing objects" stage which we count as the last 80%
|
||||
if (line.Contains ("Compressing")) {
|
||||
// "Compressing objects" stage
|
||||
number = (number / 100 * 20);
|
||||
|
||||
} else {
|
||||
// "Writing objects" stage
|
||||
number = (number / 100 * 80 + 20);
|
||||
Match speed_match = this.speed_regex.Match (line);
|
||||
|
||||
if (speed_match.Success) {
|
||||
try {
|
||||
speed = double.Parse (speed_match.Groups [1].Value, new CultureInfo ("en-US")) * 1024;
|
||||
|
||||
} catch (FormatException) {
|
||||
SparkleLogger.LogInfo ("Git", "Error parsing speed: \"" + speed_match.Groups [1] + "\"");
|
||||
}
|
||||
|
||||
if (speed_match.Groups [2].Value.Equals ("M"))
|
||||
speed = speed * 1024;
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
SparkleLogger.LogInfo ("Fetcher", line);
|
||||
line = line.Trim (new char [] {' ', '@'});
|
||||
|
||||
if (line.StartsWith ("fatal:", StringComparison.InvariantCultureIgnoreCase) ||
|
||||
line.StartsWith ("error:", StringComparison.InvariantCultureIgnoreCase)) {
|
||||
|
||||
base.errors.Add (line);
|
||||
|
||||
} else if (line.StartsWith ("WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!")) {
|
||||
base.errors.Add ("warning: Remote host identification has changed!");
|
||||
|
||||
} else if (line.StartsWith ("WARNING: POSSIBLE DNS SPOOFING DETECTED!")) {
|
||||
base.errors.Add ("warning: Possible DNS spoofing detected!");
|
||||
}
|
||||
}
|
||||
|
||||
if (number >= percentage) {
|
||||
percentage = number;
|
||||
|
||||
if (DateTime.Compare (last_change, DateTime.Now.Subtract (change_interval)) < 0) {
|
||||
base.OnProgressChanged (percentage, speed);
|
||||
last_change = DateTime.Now;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} catch (Exception) {
|
||||
IsActive = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
this.git.WaitForExit ();
|
||||
|
||||
if (this.git.ExitCode == 0) {
|
||||
while (percentage < 100) {
|
||||
percentage += 25;
|
||||
|
||||
if (percentage >= 100)
|
||||
break;
|
||||
|
||||
Thread.Sleep (500);
|
||||
base.OnProgressChanged (percentage, 0);
|
||||
}
|
||||
|
||||
base.OnProgressChanged (100, 0);
|
||||
|
||||
InstallConfiguration ();
|
||||
InstallExcludeRules ();
|
||||
InstallAttributeRules ();
|
||||
|
||||
return true;
|
||||
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public override bool IsFetchedRepoEmpty {
|
||||
get {
|
||||
SparkleGit git = new SparkleGit (TargetFolder, "rev-parse HEAD");
|
||||
git.StartAndWaitForExit ();
|
||||
|
||||
return (git.ExitCode != 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public override void EnableFetchedRepoCrypto (string password)
|
||||
{
|
||||
// Set up the encryption filter
|
||||
SparkleGit git_config_smudge = new SparkleGit (TargetFolder,
|
||||
"config filter.encryption.smudge \"openssl enc -d -aes-256-cbc -base64 -S " + this.crypto_salt +
|
||||
" -pass file:.git/info/encryption_password\"");
|
||||
|
||||
SparkleGit git_config_clean = new SparkleGit (TargetFolder,
|
||||
"config filter.encryption.clean \"openssl enc -e -aes-256-cbc -base64 -S " + this.crypto_salt +
|
||||
" -pass file:.git/info/encryption_password\"");
|
||||
|
||||
git_config_smudge.StartAndWaitForExit ();
|
||||
git_config_clean.StartAndWaitForExit ();
|
||||
|
||||
// Pass all files through the encryption filter
|
||||
string git_attributes_file_path = new string [] { TargetFolder, ".git", "info", "attributes" }.Combine ();
|
||||
File.WriteAllText (git_attributes_file_path, "\n* filter=encryption");
|
||||
|
||||
// Store the password
|
||||
string password_file_path = new string [] { TargetFolder, ".git", "info", "encryption_password" }.Combine ();
|
||||
|
||||
if (this.crypto_password_is_hashed)
|
||||
File.WriteAllText (password_file_path, password.SHA256 (this.crypto_salt));
|
||||
else
|
||||
File.WriteAllText (password_file_path, password);
|
||||
}
|
||||
|
||||
|
||||
public override bool IsFetchedRepoPasswordCorrect (string password)
|
||||
{
|
||||
string password_check_file_path = Path.Combine (TargetFolder, ".sparkleshare");
|
||||
|
||||
if (!File.Exists (password_check_file_path)) {
|
||||
SparkleGit git = new SparkleGit (TargetFolder, "show HEAD:.sparkleshare");
|
||||
string output = git.StartAndReadStandardOutput ();
|
||||
|
||||
if (git.ExitCode == 0)
|
||||
File.WriteAllText (password_check_file_path, output);
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
Process process = new Process ();
|
||||
process.EnableRaisingEvents = true;
|
||||
process.StartInfo.FileName = "openssl";
|
||||
process.StartInfo.WorkingDirectory = TargetFolder;
|
||||
process.StartInfo.UseShellExecute = false;
|
||||
process.StartInfo.RedirectStandardOutput = true;
|
||||
process.StartInfo.CreateNoWindow = true;
|
||||
|
||||
string [] possible_passwords = new string [] {
|
||||
password.SHA256 (this.crypto_salt),
|
||||
password
|
||||
};
|
||||
|
||||
int i = 0;
|
||||
foreach (string possible_password in possible_passwords) {
|
||||
process.StartInfo.Arguments = "enc -d -aes-256-cbc -base64 -pass pass:\"" + possible_password + "\"" +
|
||||
" -in \"" + password_check_file_path + "\"";
|
||||
|
||||
SparkleLogger.LogInfo ("Cmd | " + System.IO.Path.GetFileName (process.StartInfo.WorkingDirectory),
|
||||
System.IO.Path.GetFileName (process.StartInfo.FileName) + " " + process.StartInfo.Arguments);
|
||||
|
||||
process.Start ();
|
||||
process.WaitForExit ();
|
||||
|
||||
if (process.ExitCode == 0) {
|
||||
if (i > 0)
|
||||
this.crypto_password_is_hashed = false;
|
||||
|
||||
File.Delete (password_check_file_path);
|
||||
return true;
|
||||
}
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
public override void Stop ()
|
||||
{
|
||||
try {
|
||||
if (this.git != null && !this.git.HasExited) {
|
||||
this.git.Kill ();
|
||||
this.git.Dispose ();
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
SparkleLogger.LogInfo ("Fetcher", "Failed to dispose properly", e);
|
||||
}
|
||||
|
||||
if (Directory.Exists (TargetFolder)) {
|
||||
try {
|
||||
Directory.Delete (TargetFolder, true /* Recursive */ );
|
||||
SparkleLogger.LogInfo ("Fetcher", "Deleted '" + TargetFolder + "'");
|
||||
|
||||
} catch (Exception e) {
|
||||
SparkleLogger.LogInfo ("Fetcher", "Failed to delete '" + TargetFolder + "'", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public override void Complete ()
|
||||
{
|
||||
if (!IsFetchedRepoEmpty) {
|
||||
SparkleGit git = new SparkleGit (TargetFolder, "checkout --quiet HEAD");
|
||||
git.StartAndWaitForExit ();
|
||||
}
|
||||
|
||||
base.Complete ();
|
||||
}
|
||||
|
||||
|
||||
private void InstallConfiguration ()
|
||||
{
|
||||
string [] settings = new string [] {
|
||||
"core.autocrlf input",
|
||||
"core.quotepath false", // Don't quote "unusual" characters in path names
|
||||
"core.ignorecase false", // Be case sensitive explicitly to work on Mac
|
||||
"core.filemode false", // Ignore permission changes
|
||||
"core.precomposeunicode true", // Use the same Unicode form on all filesystems
|
||||
"core.safecrlf false",
|
||||
"core.excludesfile \"\"",
|
||||
"core.packedGitLimit 128m", // Some memory limiting options
|
||||
"core.packedGitWindowSize 128m",
|
||||
"pack.deltaCacheSize 128m",
|
||||
"pack.packSizeLimit 128m",
|
||||
"pack.windowMemory 128m",
|
||||
"push.default matching"
|
||||
};
|
||||
|
||||
if (SparkleBackend.Platform == PlatformID.Win32NT)
|
||||
settings [0] = "core.autocrlf true";
|
||||
|
||||
foreach (string setting in settings) {
|
||||
SparkleGit git_config = new SparkleGit (TargetFolder, "config " + setting);
|
||||
git_config.StartAndWaitForExit ();
|
||||
}
|
||||
|
||||
if (this.use_git_bin)
|
||||
InstallGitBinConfiguration ();
|
||||
}
|
||||
|
||||
|
||||
public void InstallGitBinConfiguration ()
|
||||
{
|
||||
string [] settings = new string [] {
|
||||
"core.bigFileThreshold 1024g",
|
||||
"filter.bin.clean \"git bin clean %f\"",
|
||||
"filter.bin.smudge \"git bin smudge\""
|
||||
};
|
||||
|
||||
foreach (string setting in settings) {
|
||||
SparkleGit git_config = new SparkleGit (TargetFolder, "config " + setting);
|
||||
git_config.StartAndWaitForExit ();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Add a .gitignore file to the repo
|
||||
private void InstallExcludeRules ()
|
||||
{
|
||||
string git_info_path = new string [] { TargetFolder, ".git", "info" }.Combine ();
|
||||
|
||||
if (!Directory.Exists (git_info_path))
|
||||
Directory.CreateDirectory (git_info_path);
|
||||
|
||||
string exclude_rules = string.Join (Environment.NewLine, ExcludeRules);
|
||||
string exclude_rules_file_path = new string [] { git_info_path, "exclude" }.Combine ();
|
||||
|
||||
File.WriteAllText (exclude_rules_file_path, exclude_rules);
|
||||
}
|
||||
|
||||
|
||||
private void InstallAttributeRules ()
|
||||
{
|
||||
string attribute_rules_file_path = new string [] { TargetFolder, ".git", "info", "attributes" }.Combine ();
|
||||
TextWriter writer = new StreamWriter (attribute_rules_file_path);
|
||||
|
||||
if (this.use_git_bin) {
|
||||
writer.WriteLine ("* filter=bin binary");
|
||||
|
||||
} else {
|
||||
// Compile a list of files we don't want Git to compress.
|
||||
// Not compressing already compressed files decreases memory usage and increases speed
|
||||
string [] extensions = new string [] {
|
||||
"jpg", "jpeg", "png", "tiff", "gif", // Images
|
||||
"flac", "mp3", "ogg", "oga", // Audio
|
||||
"avi", "mov", "mpg", "mpeg", "mkv", "ogv", "ogx", "webm", // Video
|
||||
"zip", "gz", "bz", "bz2", "rpm", "deb", "tgz", "rar", "ace", "7z", "pak", "tc", "iso", ".dmg" // Archives
|
||||
};
|
||||
|
||||
foreach (string extension in extensions) {
|
||||
writer.WriteLine ("*." + extension + " -delta");
|
||||
writer.WriteLine ("*." + extension.ToUpper () + " -delta");
|
||||
}
|
||||
|
||||
writer.WriteLine ("*.txt text");
|
||||
writer.WriteLine ("*.TXT text");
|
||||
}
|
||||
|
||||
writer.Close ();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,166 +0,0 @@
|
|||
// SparkleShare, a collaboration and sharing tool.
|
||||
// Copyright (C) 2010 Hylke Bons <hylkebons@gmail.com>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Lesser General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Diagnostics;
|
||||
using SparkleLib;
|
||||
|
||||
namespace SparkleLib.Git {
|
||||
|
||||
public abstract class SparkleProcess : Process {
|
||||
|
||||
public SparkleProcess (string path, string args) : base ()
|
||||
{
|
||||
StartInfo.FileName = path;
|
||||
StartInfo.Arguments = args;
|
||||
}
|
||||
|
||||
|
||||
new public void Start ()
|
||||
{
|
||||
SparkleLogger.LogInfo ("Cmd | " + System.IO.Path.GetFileName (StartInfo.WorkingDirectory),
|
||||
System.IO.Path.GetFileName (StartInfo.FileName) + " " + StartInfo.Arguments);
|
||||
|
||||
try {
|
||||
base.Start ();
|
||||
|
||||
} catch (Exception e) {
|
||||
SparkleLogger.LogInfo ("Cmd", "Couldn't execute command: " + e.Message);
|
||||
Environment.Exit (-1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void StartAndWaitForExit ()
|
||||
{
|
||||
Start ();
|
||||
WaitForExit ();
|
||||
}
|
||||
|
||||
|
||||
public string StartAndReadStandardOutput ()
|
||||
{
|
||||
Start ();
|
||||
|
||||
// Reading the standard output HAS to go before
|
||||
// WaitForExit, or it will hang forever on output > 4096 bytes
|
||||
string output = StandardOutput.ReadToEnd ();
|
||||
WaitForExit ();
|
||||
|
||||
return output.TrimEnd ();
|
||||
}
|
||||
|
||||
|
||||
public string StartAndReadStandardError ()
|
||||
{
|
||||
StartInfo.RedirectStandardError = true;
|
||||
Start ();
|
||||
|
||||
// Reading the standard output HAS to go before
|
||||
// WaitForExit, or it will hang forever on output > 4096 bytes
|
||||
string output = StandardError.ReadToEnd ();
|
||||
WaitForExit ();
|
||||
|
||||
return output.TrimEnd ();
|
||||
}
|
||||
|
||||
|
||||
protected string LocateCommand (string name)
|
||||
{
|
||||
string [] possible_command_paths = new string [] {
|
||||
Environment.GetFolderPath (Environment.SpecialFolder.Personal) + "/bin/" + name,
|
||||
Defines.INSTALL_DIR + "/bin/" + name,
|
||||
"/usr/local/bin/" + name,
|
||||
"/usr/bin/" + name,
|
||||
"/opt/local/bin/" + name
|
||||
};
|
||||
|
||||
foreach (string path in possible_command_paths) {
|
||||
if (File.Exists (path))
|
||||
return path;
|
||||
}
|
||||
|
||||
return name;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public class SparkleGit : SparkleProcess {
|
||||
|
||||
public static string ExecPath;
|
||||
public static string GitPath;
|
||||
public static string SSHPath;
|
||||
|
||||
|
||||
public SparkleGit (string path, string args) : base (path, args)
|
||||
{
|
||||
if (string.IsNullOrEmpty (GitPath))
|
||||
GitPath = LocateCommand ("git");
|
||||
|
||||
EnableRaisingEvents = true;
|
||||
StartInfo.FileName = GitPath;
|
||||
StartInfo.RedirectStandardOutput = true;
|
||||
StartInfo.UseShellExecute = false;
|
||||
StartInfo.WorkingDirectory = path;
|
||||
StartInfo.CreateNoWindow = true;
|
||||
|
||||
if (StartInfo.EnvironmentVariables.ContainsKey ("LANG"))
|
||||
StartInfo.EnvironmentVariables ["LANG"] = "en_US";
|
||||
else
|
||||
StartInfo.EnvironmentVariables.Add ("LANG", "en_US");
|
||||
|
||||
if (StartInfo.EnvironmentVariables.ContainsKey ("GIT_TERMINAL_PROMPT"))
|
||||
StartInfo.EnvironmentVariables ["GIT_TERMINAL_PROMPT"] = "0";
|
||||
else
|
||||
StartInfo.EnvironmentVariables.Add ("GIT_TERMINAL_PROMPT", "0");
|
||||
|
||||
if (!string.IsNullOrEmpty (SSHPath)) {
|
||||
if (StartInfo.EnvironmentVariables.ContainsKey ("GIT_SSH"))
|
||||
StartInfo.EnvironmentVariables ["GIT_SSH"] = SSHPath;
|
||||
else
|
||||
StartInfo.EnvironmentVariables.Add ("GIT_SSH", SSHPath);
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty (ExecPath))
|
||||
StartInfo.Arguments = args;
|
||||
else
|
||||
StartInfo.Arguments = "--exec-path=\"" + ExecPath + "\" " + args;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public class SparkleGitBin : SparkleProcess {
|
||||
|
||||
public static string GitBinPath;
|
||||
|
||||
|
||||
public SparkleGitBin (string path, string args) : base (path, args)
|
||||
{
|
||||
if (string.IsNullOrEmpty (GitBinPath))
|
||||
GitBinPath = LocateCommand ("git-bin");
|
||||
|
||||
EnableRaisingEvents = true;
|
||||
StartInfo.FileName = GitBinPath;
|
||||
StartInfo.RedirectStandardOutput = true;
|
||||
StartInfo.UseShellExecute = false;
|
||||
StartInfo.WorkingDirectory = path;
|
||||
StartInfo.CreateNoWindow = true;
|
||||
StartInfo.Arguments = args;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,32 +0,0 @@
|
|||
ASSEMBLY = SparkleLib
|
||||
TARGET = library
|
||||
|
||||
ASSEMBLY_INFO_SOURCE = Defines.cs
|
||||
|
||||
SOURCES = \
|
||||
SparkleBackend.cs \
|
||||
SparkleConfig.cs \
|
||||
SparkleExtensions.cs \
|
||||
SparkleFetcherBase.cs \
|
||||
SparkleFetcherSSH.cs \
|
||||
SparkleListenerBase.cs \
|
||||
SparkleListenerFactory.cs \
|
||||
SparkleListenerTcp.cs \
|
||||
SparkleLogger.cs \
|
||||
SparkleRepoBase.cs \
|
||||
SparkleUser.cs \
|
||||
SparkleWatcher.cs \
|
||||
SparkleWrappers.cs
|
||||
|
||||
|
||||
install-data-hook:
|
||||
for ASM in $(EXTRA_BUNDLE); do \
|
||||
$(INSTALL) -m 0755 $$ASM $(DESTDIR)$(moduledir); \
|
||||
done;
|
||||
|
||||
uninstall-hook:
|
||||
for ASM in $(EXTRA_BUNDLE); do \
|
||||
rm -f $(DESTDIR)$(moduledir)/`basename $$ASM`; \
|
||||
done;
|
||||
|
||||
include $(top_srcdir)/build/build.mk
|
|
@ -1,60 +0,0 @@
|
|||
// SparkleShare, a collaboration and sharing tool.
|
||||
// Copyright (C) 2010 Hylke Bons <hylkebons@gmail.com>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Lesser General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
using System;
|
||||
using System.Reflection;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace SparkleLib {
|
||||
|
||||
public static class SparkleBackend {
|
||||
|
||||
public static string Version {
|
||||
get {
|
||||
string version = "" + Assembly.GetExecutingAssembly ().GetName ().Version;
|
||||
return version.Substring (0, version.Length - 2);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// This fixes the PlatformID enumeration for MacOSX in Environment.OSVersion.Platform,
|
||||
// which is intentionally broken in Mono for historical reasons
|
||||
public static PlatformID Platform {
|
||||
get {
|
||||
IntPtr buf = IntPtr.Zero;
|
||||
|
||||
try {
|
||||
buf = Marshal.AllocHGlobal (8192);
|
||||
|
||||
if (uname (buf) == 0 && Marshal.PtrToStringAnsi (buf) == "Darwin")
|
||||
return PlatformID.MacOSX;
|
||||
|
||||
} catch {
|
||||
} finally {
|
||||
if (buf != IntPtr.Zero)
|
||||
Marshal.FreeHGlobal (buf);
|
||||
}
|
||||
|
||||
return Environment.OSVersion.Platform;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
[DllImport ("libc")]
|
||||
private static extern int uname (IntPtr buf);
|
||||
}
|
||||
}
|
|
@ -1,173 +0,0 @@
|
|||
// SparkleShare, a collaboration and sharing tool.
|
||||
// Copyright (C) 2010 Hylke Bons <hylkebons@gmail.com>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Lesser General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Security.Cryptography;
|
||||
using System.Threading;
|
||||
|
||||
namespace SparkleLib {
|
||||
|
||||
public abstract class SparkleFetcherSSH : SparkleFetcherBase {
|
||||
|
||||
public SparkleFetcherSSH (SparkleFetcherInfo info) : base (info)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
public override bool Fetch ()
|
||||
{
|
||||
if (RemoteUrl.Host.EndsWith (".onion")) {
|
||||
// Tor has special domain names called ".onion addresses". They can only be
|
||||
// resolved by using a proxy via tor. While the rest of the openssh suite
|
||||
// fully supports proxying, ssh-keyscan does not, so we can't use it for .onion
|
||||
SparkleLogger.LogInfo ("Auth", "using tor .onion address skipping ssh-keyscan");
|
||||
|
||||
} else if (!RemoteUrl.Scheme.StartsWith ("http")) {
|
||||
string host_key = FetchHostKey ();
|
||||
|
||||
if (string.IsNullOrEmpty (RemoteUrl.Host) || host_key == null) {
|
||||
SparkleLogger.LogInfo ("Auth", "Could not fetch host key");
|
||||
this.errors.Add ("error: Could not fetch host key");
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool warn = true;
|
||||
if (RequiredFingerprint != null) {
|
||||
string host_fingerprint;
|
||||
|
||||
try {
|
||||
host_fingerprint = DeriveFingerprint (host_key);
|
||||
|
||||
} catch (InvalidOperationException e) {
|
||||
// "Unapproved cryptographic algorithms" won't work when FIPS is enabled on Windows.
|
||||
// Software like Cisco AnyConnect can demand this feature is on, so we show an error
|
||||
SparkleLogger.LogInfo ("Auth", "Unable to derive fingerprint: ", e);
|
||||
this.errors.Add ("error: Can't check fingerprint due to FIPS being enabled");
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
if (host_fingerprint == null || !RequiredFingerprint.Equals (host_fingerprint)) {
|
||||
SparkleLogger.LogInfo ("Auth", "Fingerprint doesn't match");
|
||||
this.errors.Add ("error: Host fingerprint doesn't match");
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
warn = false;
|
||||
SparkleLogger.LogInfo ("Auth", "Fingerprint matches");
|
||||
|
||||
} else {
|
||||
SparkleLogger.LogInfo ("Auth", "Skipping fingerprint check");
|
||||
}
|
||||
|
||||
AcceptHostKey (host_key, warn);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
private string FetchHostKey ()
|
||||
{
|
||||
SparkleLogger.LogInfo ("Auth", "Fetching host key for " + RemoteUrl.Host);
|
||||
|
||||
Process process = new Process ();
|
||||
process.StartInfo.FileName = "ssh-keyscan";
|
||||
process.StartInfo.WorkingDirectory = SparkleConfig.DefaultConfig.TmpPath;
|
||||
process.StartInfo.UseShellExecute = false;
|
||||
process.StartInfo.RedirectStandardOutput = true;
|
||||
process.StartInfo.CreateNoWindow = true;
|
||||
process.EnableRaisingEvents = true;
|
||||
|
||||
string [] key_types = {"rsa", "dsa", "ecdsa"};
|
||||
|
||||
foreach (string key_type in key_types) {
|
||||
if (RemoteUrl.Port < 1)
|
||||
process.StartInfo.Arguments = "-t " + key_type + " -p 22 " + RemoteUrl.Host;
|
||||
else
|
||||
process.StartInfo.Arguments = "-t " + key_type + " -p " + RemoteUrl.Port + " " + RemoteUrl.Host;
|
||||
|
||||
SparkleLogger.LogInfo ("Cmd", process.StartInfo.FileName + " " + process.StartInfo.Arguments);
|
||||
|
||||
process.Start ();
|
||||
string host_key = process.StandardOutput.ReadToEnd ().Trim ();
|
||||
process.WaitForExit ();
|
||||
|
||||
if (process.ExitCode == 0 && !string.IsNullOrWhiteSpace (host_key))
|
||||
return host_key;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
private string DeriveFingerprint (string public_key)
|
||||
{
|
||||
try {
|
||||
MD5 md5 = new MD5CryptoServiceProvider ();
|
||||
string key = public_key.Split (" ".ToCharArray ()) [2];
|
||||
byte [] b64_bytes = Convert.FromBase64String (key);
|
||||
byte [] md5_bytes = md5.ComputeHash (b64_bytes);
|
||||
string fingerprint = BitConverter.ToString (md5_bytes);
|
||||
|
||||
return fingerprint.ToLower ().Replace ("-", ":");
|
||||
|
||||
} catch (Exception e) {
|
||||
SparkleLogger.LogInfo ("Fetcher", "Failed creating fingerprint: " + e.Message + " " + e.StackTrace);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void AcceptHostKey (string host_key, bool warn)
|
||||
{
|
||||
string ssh_config_path = Path.Combine (SparkleConfig.DefaultConfig.HomePath, ".ssh");
|
||||
string known_hosts_file_path = Path.Combine (ssh_config_path, "known_hosts");
|
||||
|
||||
if (!File.Exists (known_hosts_file_path)) {
|
||||
if (!Directory.Exists (ssh_config_path))
|
||||
Directory.CreateDirectory (ssh_config_path);
|
||||
|
||||
File.Create (known_hosts_file_path).Close ();
|
||||
}
|
||||
|
||||
string host = RemoteUrl.Host;
|
||||
string known_hosts = File.ReadAllText (known_hosts_file_path);
|
||||
string [] known_hosts_lines = File.ReadAllLines (known_hosts_file_path);
|
||||
|
||||
foreach (string line in known_hosts_lines) {
|
||||
if (line.StartsWith (host + " "))
|
||||
return;
|
||||
}
|
||||
|
||||
if (known_hosts.EndsWith ("\n"))
|
||||
File.AppendAllText (known_hosts_file_path, host_key + "\n");
|
||||
else
|
||||
File.AppendAllText (known_hosts_file_path, "\n" + host_key + "\n");
|
||||
|
||||
SparkleLogger.LogInfo ("Auth", "Accepted host key for " + host);
|
||||
|
||||
if (warn)
|
||||
this.warnings.Add ("The following host key has been accepted:\n" + DeriveFingerprint (host_key));
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,51 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>8.0.30703</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{2C914413-B31C-4362-93C7-1AE34F09112A}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<RootNamespace>SparkleLib</RootNamespace>
|
||||
<AssemblyName>SparkleLib</AssemblyName>
|
||||
<ReleaseVersion>
|
||||
</ReleaseVersion>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>none</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>..\bin</OutputPath>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<ConsolePause>False</ConsolePause>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<Optimize>False</Optimize>
|
||||
<OutputPath>..\bin</OutputPath>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DefineConstants>DEBUG</DefineConstants>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="SparkleRepoBase.cs" />
|
||||
<Compile Include="SparkleFetcherBase.cs" />
|
||||
<Compile Include="SparkleWrappers.cs" />
|
||||
<Compile Include="SparkleListenerBase.cs" />
|
||||
<Compile Include="SparkleListenerFactory.cs" />
|
||||
<Compile Include="SparkleListenerTcp.cs" />
|
||||
<Compile Include="SparkleBackend.cs" />
|
||||
<Compile Include="SparkleConfig.cs" />
|
||||
<Compile Include="SparkleWatcher.cs" />
|
||||
<Compile Include="SparkleExtensions.cs" />
|
||||
<Compile Include="SparkleUser.cs" />
|
||||
<Compile Include="SparkleLogger.cs" />
|
||||
<Compile Include="Defines.cs" />
|
||||
<Compile Include="SparkleFetcherSSH.cs" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||
</Project>
|
|
@ -1,20 +0,0 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 9.00
|
||||
# Visual Studio 2005
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SparkleLib", "SparkleLib.csproj", "{2C914413-B31C-4362-93C7-1AE34F09112A}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{2C914413-B31C-4362-93C7-1AE34F09112A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{2C914413-B31C-4362-93C7-1AE34F09112A}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{2C914413-B31C-4362-93C7-1AE34F09112A}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{2C914413-B31C-4362-93C7-1AE34F09112A}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(MonoDevelopProperties) = preSolution
|
||||
StartupItem = SparkleLib.csproj
|
||||
EndGlobalSection
|
||||
EndGlobal
|
89
SparkleShare.sln
Normal file
|
@ -0,0 +1,89 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 11.00
|
||||
# Visual Studio 2010
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sparkles", "Sparkles\Sparkles.csproj", "{2C914413-B31C-4362-93C7-1AE34F09112A}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sparkles.Git", "Sparkles\Git\Sparkles.Git.csproj", "{009FDCD7-1D57-4202-BB6D-8477D8C6B8EE}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SparkleShare.Windows", "SparkleShare\Windows\SparkleShare.Windows.csproj", "{728483AA-E34B-4441-BF2C-C8BC2901E4E0}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SparkleShare.Linux", "SparkleShare\Linux\SparkleShare.Linux.csproj", "{5714D3CA-88A6-4330-A29D-4CA90D1D193C}"
|
||||
EndProject
|
||||
Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "SparkleShare", "SparkleShare\Common\SparkleShare.shproj", "{F16E3683-B622-4654-B799-99C8D68AA963}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SparkleShare.Mac", "SparkleShare\Mac\SparkleShare.Mac.csproj", "{8FCDF699-E2C3-4CB3-AF98-44198972AFC0}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Release|Any CPU = Release|Any CPU
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
ReleaseDist|Any CPU = ReleaseDist|Any CPU
|
||||
ReleaseMac|Any CPU = ReleaseMac|Any CPU
|
||||
DebugMac|Any CPU = DebugMac|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{009FDCD7-1D57-4202-BB6D-8477D8C6B8EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{009FDCD7-1D57-4202-BB6D-8477D8C6B8EE}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{009FDCD7-1D57-4202-BB6D-8477D8C6B8EE}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{009FDCD7-1D57-4202-BB6D-8477D8C6B8EE}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{009FDCD7-1D57-4202-BB6D-8477D8C6B8EE}.ReleaseDist|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{009FDCD7-1D57-4202-BB6D-8477D8C6B8EE}.ReleaseDist|Any CPU.Build.0 = Release|Any CPU
|
||||
{009FDCD7-1D57-4202-BB6D-8477D8C6B8EE}.ReleaseMac|Any CPU.ActiveCfg = ReleaseMac|Any CPU
|
||||
{009FDCD7-1D57-4202-BB6D-8477D8C6B8EE}.ReleaseMac|Any CPU.Build.0 = ReleaseMac|Any CPU
|
||||
{009FDCD7-1D57-4202-BB6D-8477D8C6B8EE}.DebugMac|Any CPU.ActiveCfg = DebugMac|Any CPU
|
||||
{009FDCD7-1D57-4202-BB6D-8477D8C6B8EE}.DebugMac|Any CPU.Build.0 = DebugMac|Any CPU
|
||||
{2C914413-B31C-4362-93C7-1AE34F09112A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{2C914413-B31C-4362-93C7-1AE34F09112A}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{2C914413-B31C-4362-93C7-1AE34F09112A}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{2C914413-B31C-4362-93C7-1AE34F09112A}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{2C914413-B31C-4362-93C7-1AE34F09112A}.ReleaseDist|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{2C914413-B31C-4362-93C7-1AE34F09112A}.ReleaseDist|Any CPU.Build.0 = Release|Any CPU
|
||||
{2C914413-B31C-4362-93C7-1AE34F09112A}.ReleaseMac|Any CPU.ActiveCfg = ReleaseMac|Any CPU
|
||||
{2C914413-B31C-4362-93C7-1AE34F09112A}.ReleaseMac|Any CPU.Build.0 = ReleaseMac|Any CPU
|
||||
{2C914413-B31C-4362-93C7-1AE34F09112A}.DebugMac|Any CPU.ActiveCfg = DebugMac|Any CPU
|
||||
{2C914413-B31C-4362-93C7-1AE34F09112A}.DebugMac|Any CPU.Build.0 = DebugMac|Any CPU
|
||||
{5714D3CA-88A6-4330-A29D-4CA90D1D193C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{5714D3CA-88A6-4330-A29D-4CA90D1D193C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{5714D3CA-88A6-4330-A29D-4CA90D1D193C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{5714D3CA-88A6-4330-A29D-4CA90D1D193C}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{5714D3CA-88A6-4330-A29D-4CA90D1D193C}.ReleaseDist|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{5714D3CA-88A6-4330-A29D-4CA90D1D193C}.ReleaseDist|Any CPU.Build.0 = Release|Any CPU
|
||||
{5714D3CA-88A6-4330-A29D-4CA90D1D193C}.ReleaseMac|Any CPU.ActiveCfg = ReleaseMac|Any CPU
|
||||
{5714D3CA-88A6-4330-A29D-4CA90D1D193C}.DebugMac|Any CPU.ActiveCfg = DebugMac|Any CPU
|
||||
{728483AA-E34B-4441-BF2C-C8BC2901E4E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{728483AA-E34B-4441-BF2C-C8BC2901E4E0}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{728483AA-E34B-4441-BF2C-C8BC2901E4E0}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{728483AA-E34B-4441-BF2C-C8BC2901E4E0}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{728483AA-E34B-4441-BF2C-C8BC2901E4E0}.ReleaseDist|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{728483AA-E34B-4441-BF2C-C8BC2901E4E0}.ReleaseDist|Any CPU.Build.0 = Release|Any CPU
|
||||
{728483AA-E34B-4441-BF2C-C8BC2901E4E0}.ReleaseMac|Any CPU.ActiveCfg = ReleaseMac|Any CPU
|
||||
{728483AA-E34B-4441-BF2C-C8BC2901E4E0}.DebugMac|Any CPU.ActiveCfg = DebugMac|Any CPU
|
||||
{8FCDF699-E2C3-4CB3-AF98-44198972AFC0}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{8FCDF699-E2C3-4CB3-AF98-44198972AFC0}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{8FCDF699-E2C3-4CB3-AF98-44198972AFC0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{8FCDF699-E2C3-4CB3-AF98-44198972AFC0}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{8FCDF699-E2C3-4CB3-AF98-44198972AFC0}.ReleaseDist|Any CPU.ActiveCfg = ReleaseDist|Any CPU
|
||||
{8FCDF699-E2C3-4CB3-AF98-44198972AFC0}.ReleaseDist|Any CPU.Build.0 = ReleaseDist|Any CPU
|
||||
{8FCDF699-E2C3-4CB3-AF98-44198972AFC0}.ReleaseMac|Any CPU.ActiveCfg = ReleaseMac|Any CPU
|
||||
{8FCDF699-E2C3-4CB3-AF98-44198972AFC0}.ReleaseMac|Any CPU.Build.0 = ReleaseMac|Any CPU
|
||||
{8FCDF699-E2C3-4CB3-AF98-44198972AFC0}.DebugMac|Any CPU.ActiveCfg = DebugMac|Any CPU
|
||||
{8FCDF699-E2C3-4CB3-AF98-44198972AFC0}.DebugMac|Any CPU.Build.0 = DebugMac|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(MonoDevelopProperties) = preSolution
|
||||
Policies = $0
|
||||
$0.DotNetNamingPolicy = $1
|
||||
$1.DirectoryNamespaceAssociation = None
|
||||
$1.ResourceNamePolicy = FileFormatDefault
|
||||
$0.TextStylePolicy = $2
|
||||
$2.FileWidth = 120
|
||||
$2.inheritsSet = VisualStudio
|
||||
$2.inheritsScope = text/plain
|
||||
$2.scope = text/plain
|
||||
$0.CSharpFormattingPolicy = $3
|
||||
$3.inheritsSet = Mono
|
||||
$3.inheritsScope = text/x-csharp
|
||||
$3.scope = text/x-csharp
|
||||
version =
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
|
44
SparkleShare/SparkleAboutController.cs → SparkleShare/Common/AboutController.cs
Executable file → Normal file
|
@ -1,5 +1,5 @@
|
|||
// SparkleShare, a collaboration and sharing tool.
|
||||
// Copyright (C) 2010 Hylke Bons <hylkebons@gmail.com>
|
||||
// Copyright (C) 2010 Hylke Bons <hi@planetpeanut.uk>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
|
@ -19,9 +19,11 @@ using System;
|
|||
using System.Net;
|
||||
using System.Threading;
|
||||
|
||||
using Sparkles;
|
||||
|
||||
namespace SparkleShare {
|
||||
|
||||
public class SparkleAboutController {
|
||||
public class AboutController {
|
||||
|
||||
public event Action ShowWindowEvent = delegate { };
|
||||
public event Action HideWindowEvent = delegate { };
|
||||
|
@ -29,21 +31,21 @@ namespace SparkleShare {
|
|||
public event UpdateLabelEventDelegate UpdateLabelEvent = delegate { };
|
||||
public delegate void UpdateLabelEventDelegate (string text);
|
||||
|
||||
public readonly string WebsiteLinkAddress = "http://www.sparkleshare.org/";
|
||||
public readonly string CreditsLinkAddress = "http://github.com/hbons/SparkleShare/blob/master/legal/Authors.txt";
|
||||
public readonly string ReportProblemLinkAddress = "http://www.github.com/hbons/SparkleShare/issues";
|
||||
public readonly string DebugLogLinkAddress = "file://" + Program.Controller.Config.LogFilePath;
|
||||
public readonly string WebsiteLinkAddress = "https://www.sparkleshare.org/";
|
||||
public readonly string CreditsLinkAddress = "https://github.com/hbons/SparkleShare/blob/master/.github/AUTHORS.md";
|
||||
public readonly string ReportProblemLinkAddress = "https://www.github.com/hbons/SparkleShare/issues";
|
||||
public readonly string DebugLogLinkAddress = "file://" + SparkleShare.Controller.Config.LogFilePath;
|
||||
|
||||
public string RunningVersion;
|
||||
|
||||
|
||||
public SparkleAboutController ()
|
||||
public AboutController ()
|
||||
{
|
||||
RunningVersion = SparkleLib.SparkleBackend.Version;
|
||||
RunningVersion = InstallationInfo.Version;
|
||||
|
||||
Program.Controller.ShowAboutWindowEvent += delegate {
|
||||
SparkleShare.Controller.ShowAboutWindowEvent += delegate {
|
||||
ShowWindowEvent ();
|
||||
new Thread (() => CheckForNewVersion ()).Start ();
|
||||
new Thread (CheckForNewVersion).Start ();
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -54,24 +56,28 @@ namespace SparkleShare {
|
|||
}
|
||||
|
||||
|
||||
private void CheckForNewVersion ()
|
||||
void CheckForNewVersion ()
|
||||
{
|
||||
UpdateLabelEvent ("Checking for updates...");
|
||||
UpdateLabelEvent ("Checking for updates…");
|
||||
Thread.Sleep (500);
|
||||
|
||||
WebClient web_client = new WebClient ();
|
||||
Uri uri = new Uri ("http://www.sparkleshare.org/version");
|
||||
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
|
||||
|
||||
var web_client = new WebClient ();
|
||||
var uri = new Uri ("https://www.sparkleshare.org/version");
|
||||
|
||||
try {
|
||||
string latest_version = web_client.DownloadString (uri).Trim ();
|
||||
string latest_version = web_client.DownloadString (uri);
|
||||
latest_version = latest_version.Trim ();
|
||||
|
||||
if (new Version (latest_version) > new Version (RunningVersion))
|
||||
UpdateLabelEvent ("A newer version (" + latest_version + ") is available!");
|
||||
UpdateLabelEvent ("An update (version " + latest_version + ") is available!");
|
||||
else
|
||||
UpdateLabelEvent ("You are running the latest version.");
|
||||
UpdateLabelEvent ("✓ You are running the latest version");
|
||||
|
||||
} catch {
|
||||
UpdateLabelEvent ("Version check failed.");
|
||||
} catch (Exception e) {
|
||||
Logger.LogInfo ("UI", "Failed to download " + uri , e);
|
||||
UpdateLabelEvent ("Couldn’t check for updates\t");
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
// SparkleShare, a collaboration and sharing tool.
|
||||
// Copyright (C) 2010 Hylke Bons <hylkebons@gmail.com>
|
||||
// Copyright (C) 2010 Hylke Bons <hi@planetpeanut.uk>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
|
@ -23,28 +23,28 @@ using System.Net.Mime;
|
|||
using System.Net.Security;
|
||||
using System.Security.Cryptography.X509Certificates;
|
||||
|
||||
using SparkleLib;
|
||||
using Sparkles;
|
||||
|
||||
namespace SparkleShare
|
||||
{
|
||||
public static class SparkleAvatars
|
||||
public static class Avatars
|
||||
{
|
||||
private static List<string> skipped_avatars = new List<string> ();
|
||||
static List<string> skipped_avatars = new List<string> ();
|
||||
|
||||
|
||||
public static string GetAvatar (string email, int size, string target_path)
|
||||
public static string GetAvatar (string email, int size, string target_path, string provider)
|
||||
{
|
||||
#if __MonoCS__
|
||||
ServicePointManager.ServerCertificateValidationCallback = GetAvatarValidationCallBack;
|
||||
if (provider == "gravatar")
|
||||
ServicePointManager.ServerCertificateValidationCallback = GetGravatarValidationCallBack;
|
||||
#endif
|
||||
|
||||
email = email.ToLower ();
|
||||
|
||||
|
||||
if (skipped_avatars.Contains (email))
|
||||
return null;
|
||||
|
||||
string avatars_path = new string [] { Path.GetDirectoryName (target_path),
|
||||
"avatars", size + "x" + size }.Combine ();
|
||||
|
||||
string avatars_path = Path.Combine (Path.GetDirectoryName (target_path), "avatars", size + "x" + size);
|
||||
|
||||
// Search avatars by file name, ignore extension
|
||||
// Delete files over a day old
|
||||
|
@ -64,13 +64,18 @@ namespace SparkleShare
|
|||
avatar_file_path = Path.Combine (avatars_path, email.MD5 ());
|
||||
|
||||
} catch (InvalidOperationException e) {
|
||||
SparkleLogger.LogInfo ("Avatars", "Error fetching avatar for " + email, e);
|
||||
Logger.LogInfo ("Avatars", "Error fetching avatar for " + email, e);
|
||||
return null;
|
||||
}
|
||||
|
||||
WebClient client = new WebClient ();
|
||||
string url = "https://gravatar.com/avatar/" + email.MD5 () + ".png?s=" + size + "&d=404";
|
||||
|
||||
|
||||
var client = new WebClient ();
|
||||
string url = "";
|
||||
|
||||
if (provider == "libravatar")
|
||||
url = "https://seccdn.libravatar.org/avatar/" + email.MD5 () + ".png?s=" + size + "&d=404";
|
||||
else
|
||||
url = "https://secure.gravatar.com/avatar/" + email.MD5 () + ".png?s=" + size + "&d=404";
|
||||
|
||||
try {
|
||||
byte [] buffer = client.DownloadData (url);
|
||||
|
||||
|
@ -79,52 +84,53 @@ namespace SparkleShare
|
|||
|
||||
} else if (client.ResponseHeaders ["content-type"].Equals (MediaTypeNames.Image.Gif, StringComparison.InvariantCultureIgnoreCase)) {
|
||||
avatar_file_path += ".gif";
|
||||
|
||||
|
||||
} else {
|
||||
avatar_file_path += ".png";
|
||||
}
|
||||
|
||||
|
||||
if (buffer.Length > 255) {
|
||||
if (!Directory.Exists (avatars_path)) {
|
||||
Directory.CreateDirectory (avatars_path);
|
||||
SparkleLogger.LogInfo ("Avatars", "Created '" + avatars_path + "'");
|
||||
Logger.LogInfo ("Avatars", "Created '" + avatars_path + "'");
|
||||
}
|
||||
|
||||
|
||||
File.WriteAllBytes (avatar_file_path, buffer);
|
||||
SparkleLogger.LogInfo ("Avatars", "Fetched " + size + "x" + size + " avatar for " + email);
|
||||
|
||||
Logger.LogInfo ("Avatars", "Fetched " + size + "x" + size + " avatar for " + email);
|
||||
|
||||
return avatar_file_path;
|
||||
|
||||
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
} catch (Exception e) {
|
||||
SparkleLogger.LogInfo ("Avatars", "Error fetching avatar for " + email, e);
|
||||
Logger.LogInfo ("Avatars", "Error fetching avatar for " + email, e);
|
||||
skipped_avatars.Add (email);
|
||||
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private static bool GetAvatarValidationCallBack (Object sender,
|
||||
private static bool GetGravatarValidationCallBack (Object sender,
|
||||
X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
|
||||
{
|
||||
X509Certificate2 certificate2 = new X509Certificate2 (certificate.GetRawCertData ());
|
||||
|
||||
|
||||
// On some systems (mostly Linux) we can't assume the needed certificates are
|
||||
// available, so we have to check the certificate's SHA-1 fingerprint manually.
|
||||
//
|
||||
// SHA1 fingerprinter obtained from https://www.gravatar.com/ on Oct 16 2015
|
||||
// Set to expire on Oct 14 2018
|
||||
string gravatar_cert_fingerprint = "1264B3F00814C6077D3853238771EE67FB6321C9";
|
||||
// SHA1 fingerprinter obtained from https://www.gravatar.com/ on Oct 23 2020
|
||||
// Set to expire on Nov 16 2022
|
||||
|
||||
string gravatar_cert_fingerprint = "846963703FD297724E91BDF47FFE4BC19E93EA15";
|
||||
|
||||
if (!certificate2.Thumbprint.Equals (gravatar_cert_fingerprint)) {
|
||||
SparkleLogger.LogInfo ("Avatars", "Invalid certificate for https://www.gravatar.com/");
|
||||
Logger.LogInfo ("Avatars", "Invalid certificate for https://www.gravatar.com/");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
763
SparkleShare/Common/BaseController.cs
Normal file
|
@ -0,0 +1,763 @@
|
|||
// SparkleShare, a collaboration and sharing tool.
|
||||
// Copyright (C) 2010 Hylke Bons <hi@planetpeanut.uk>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
|
||||
using Sparkles;
|
||||
|
||||
namespace SparkleShare {
|
||||
|
||||
public abstract class BaseController {
|
||||
|
||||
public BaseRepository [] Repositories {
|
||||
get {
|
||||
lock (this.repo_lock)
|
||||
return this.repositories.GetRange (0, this.repositories.Count).ToArray ();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void AddRepository (BaseRepository repo)
|
||||
{
|
||||
lock (this.repo_lock) {
|
||||
this.repositories.Add (repo);
|
||||
this.repositories.Sort ((x, y) => string.Compare (x.Name, y.Name));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void RemoveRepository (BaseRepository repo)
|
||||
{
|
||||
lock (this.repo_lock)
|
||||
this.repositories.Remove (repo);
|
||||
}
|
||||
|
||||
|
||||
public BaseRepository GetRepoByName (string name)
|
||||
{
|
||||
lock (this.repo_lock) {
|
||||
foreach (BaseRepository repo in this.repositories)
|
||||
if (repo.Name.Equals (name))
|
||||
return repo;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
public Configuration Config { get; private set; }
|
||||
public bool RepositoriesLoaded { get; private set; }
|
||||
public string FoldersPath { get; private set; }
|
||||
|
||||
public double ProgressPercentage = 0.0;
|
||||
public double ProgressSpeedUp = 0.0;
|
||||
public double ProgressSpeedDown = 0.0;
|
||||
public string ProgressInformation = "";
|
||||
|
||||
|
||||
public event ShowSetupWindowEventHandler ShowSetupWindowEvent = delegate { };
|
||||
public delegate void ShowSetupWindowEventHandler (PageType page_type);
|
||||
|
||||
public event ShowNoteWindowEventHandler ShowNoteWindowEvent = delegate { };
|
||||
public delegate void ShowNoteWindowEventHandler (string project);
|
||||
|
||||
public event Action ShowAboutWindowEvent = delegate { };
|
||||
public event Action ShowEventLogWindowEvent = delegate { };
|
||||
|
||||
public event FolderFetchedEventHandler FolderFetched = delegate { };
|
||||
public delegate void FolderFetchedEventHandler (string remote_url, string [] warnings);
|
||||
|
||||
public event FolderFetchErrorHandler FolderFetchError = delegate { };
|
||||
public delegate void FolderFetchErrorHandler (string remote_url, string [] errors);
|
||||
|
||||
public event FolderFetchingHandler FolderFetching = delegate { };
|
||||
public delegate void FolderFetchingHandler (double percentage, double speed, string information);
|
||||
|
||||
|
||||
public event Action FolderListChanged = delegate { };
|
||||
public event Action OnIdle = delegate { };
|
||||
public event Action OnSyncing = delegate { };
|
||||
public event Action OnError = delegate { };
|
||||
|
||||
|
||||
public event InviteReceivedHandler InviteReceived = delegate { };
|
||||
public delegate void InviteReceivedHandler (SparkleInvite invite);
|
||||
|
||||
public event NotificationRaisedEventHandler NotificationRaised = delegate { };
|
||||
public delegate void NotificationRaisedEventHandler (ChangeSet change_set);
|
||||
|
||||
public event AlertNotificationRaisedEventHandler AlertNotificationRaised = delegate { };
|
||||
public delegate void AlertNotificationRaisedEventHandler (string title, string message);
|
||||
|
||||
|
||||
public bool FirstRun {
|
||||
get { return Config.User.Email.Equals ("Unknown"); }
|
||||
}
|
||||
|
||||
public List<string> Folders {
|
||||
get {
|
||||
List<string> folders = Config.Folders;
|
||||
return folders;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public User CurrentUser {
|
||||
get { return Config.User; }
|
||||
set { Config.User = value; }
|
||||
}
|
||||
|
||||
public SSHAuthenticationInfo UserAuthenticationInfo;
|
||||
|
||||
|
||||
public bool NotificationsEnabled {
|
||||
get {
|
||||
string notifications_enabled = Config.GetConfigOption ("notifications");
|
||||
|
||||
if (string.IsNullOrEmpty (notifications_enabled)) {
|
||||
Config.SetConfigOption ("notifications", bool.TrueString);
|
||||
return true;
|
||||
|
||||
} else {
|
||||
return notifications_enabled.Equals (bool.TrueString);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public bool AvatarsEnabled {
|
||||
get {
|
||||
string fetch_avatars_option = Config.GetConfigOption ("fetch_avatars");
|
||||
|
||||
if (fetch_avatars_option == null || fetch_avatars_option.Equals (bool.FalseString))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public string AvatarsProvider {
|
||||
get {
|
||||
string avatars_provider_string = Config.GetConfigOption ("avatars_provider");
|
||||
|
||||
if (avatars_provider_string == null)
|
||||
return "gravatar";
|
||||
|
||||
return avatars_provider_string;
|
||||
}
|
||||
}
|
||||
|
||||
// Path where the plugins are kept
|
||||
public abstract string PresetsPath { get; }
|
||||
|
||||
// Enables SparkleShare to start automatically at login
|
||||
public abstract void CreateStartupItem ();
|
||||
|
||||
// Installs the sparkleshare:// protocol handler
|
||||
public abstract void InstallProtocolHandler ();
|
||||
|
||||
// Installs the sparkleshare:// protocol handler
|
||||
public abstract void SetFolderIcon ();
|
||||
|
||||
// Creates the SparkleShare folder in the user's home folder
|
||||
public abstract void CreateSparkleShareFolder ();
|
||||
|
||||
// Opens the SparkleShare folder or an (optional) subfolder
|
||||
public abstract void OpenFolder (string path);
|
||||
|
||||
// Opens a file with the appropriate application
|
||||
public abstract void OpenFile (string path);
|
||||
|
||||
// Opens a file with the appropriate application
|
||||
public virtual void OpenWebsite (string url) { }
|
||||
|
||||
// Copies text to the clipboard
|
||||
public abstract void CopyToClipboard (string text);
|
||||
|
||||
// Allows for platform-specific quit and cleanup methods to be called on exit
|
||||
public abstract void PlatformQuit ();
|
||||
|
||||
public abstract string EventLogHTML { get; }
|
||||
public abstract string DayEntryHTML { get; }
|
||||
public abstract string EventEntryHTML { get; }
|
||||
|
||||
|
||||
BaseFetcher fetcher;
|
||||
FileSystemWatcher watcher;
|
||||
object repo_lock = new object ();
|
||||
object check_repos_lock = new object ();
|
||||
List<BaseRepository> repositories = new List<BaseRepository> ();
|
||||
bool lost_folders_path = false;
|
||||
|
||||
|
||||
public BaseController (Configuration config)
|
||||
{
|
||||
Config = config;
|
||||
FoldersPath = Config.FoldersPath;
|
||||
}
|
||||
|
||||
|
||||
public virtual void Initialize ()
|
||||
{
|
||||
string version = InstallationInfo.Version;
|
||||
|
||||
if (InstallationInfo.IsFlatpak)
|
||||
version += " (Flatpak)";
|
||||
|
||||
Logger.LogInfo ("Environment", "SparkleShare " + version);
|
||||
Logger.LogInfo ("Environment", "Git LFS " + Sparkles.Git.GitCommand.GitLFSVersion);
|
||||
Logger.LogInfo ("Environment", "Git " + Sparkles.Git.GitCommand.GitVersion);
|
||||
Logger.LogInfo ("Environment", InstallationInfo.OperatingSystem + " " + InstallationInfo.OperatingSystemVersion);
|
||||
|
||||
UserAuthenticationInfo = new SSHAuthenticationInfo ();
|
||||
SSHAuthenticationInfo.DefaultAuthenticationInfo = UserAuthenticationInfo;
|
||||
|
||||
Preset.PresetsPath = PresetsPath;
|
||||
InstallProtocolHandler ();
|
||||
|
||||
try {
|
||||
CreateSparkleShareFolder ();
|
||||
|
||||
} catch (DirectoryNotFoundException) {
|
||||
this.lost_folders_path = true;
|
||||
}
|
||||
|
||||
SetFolderIcon ();
|
||||
|
||||
// Watch the SparkleShare folder
|
||||
this.watcher = new FileSystemWatcher () {
|
||||
Filter = "*",
|
||||
IncludeSubdirectories = false,
|
||||
Path = FoldersPath
|
||||
};
|
||||
|
||||
watcher.Created += OnFolderActivity;
|
||||
watcher.EnableRaisingEvents = true;
|
||||
}
|
||||
|
||||
|
||||
int reopen_attempt_counts = 0;
|
||||
|
||||
public void HandleReopen ()
|
||||
{
|
||||
if (Repositories.Length > 0) {
|
||||
ShowEventLogWindow ();
|
||||
|
||||
} else if (reopen_attempt_counts > 1) {
|
||||
AlertNotificationRaised ("Hello!", "SparkleShare sits right here, as a status icon.");
|
||||
reopen_attempt_counts = 0;
|
||||
|
||||
} else {
|
||||
reopen_attempt_counts++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void UIHasLoaded ()
|
||||
{
|
||||
if (this.lost_folders_path) {
|
||||
SparkleShare.UI.Bubbles.Controller.ShowBubble ("Where's your SparkleShare folder?",
|
||||
"Did you put it on a detached drive?", null);
|
||||
|
||||
Environment.Exit (-1);
|
||||
}
|
||||
|
||||
if (FirstRun) {
|
||||
ShowSetupWindow (PageType.Setup);
|
||||
|
||||
} else {
|
||||
new Thread (() => {
|
||||
StartupInviteScan ();
|
||||
CheckRepositories ();
|
||||
RepositoriesLoaded = true;
|
||||
UpdateState ();
|
||||
|
||||
}).Start ();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void ShowSetupWindow (PageType page_type)
|
||||
{
|
||||
ShowSetupWindowEvent (page_type);
|
||||
}
|
||||
|
||||
|
||||
public void ShowAboutWindow ()
|
||||
{
|
||||
ShowAboutWindowEvent ();
|
||||
}
|
||||
|
||||
|
||||
public void ShowNoteWindow (string project)
|
||||
{
|
||||
ShowNoteWindowEvent (project);
|
||||
}
|
||||
|
||||
|
||||
public void ShowEventLogWindow ()
|
||||
{
|
||||
ShowEventLogWindowEvent ();
|
||||
}
|
||||
|
||||
|
||||
public void OpenSparkleShareFolder ()
|
||||
{
|
||||
OpenFolder (Config.FoldersPath);
|
||||
}
|
||||
|
||||
|
||||
public void OpenSparkleShareFolder (string name)
|
||||
{
|
||||
OpenFolder (new SparkleFolder (name).FullPath);
|
||||
}
|
||||
|
||||
|
||||
public void ToggleNotifications ()
|
||||
{
|
||||
bool notifications_enabled = Config.GetConfigOption ("notifications").Equals (bool.TrueString);
|
||||
Config.SetConfigOption ("notifications", (!notifications_enabled).ToString ());
|
||||
}
|
||||
|
||||
|
||||
void CheckRepositories ()
|
||||
{
|
||||
lock (this.check_repos_lock) {
|
||||
DetectRepositoryRenames ();
|
||||
RemoveDeletedRepositories ();
|
||||
}
|
||||
|
||||
FolderListChanged ();
|
||||
}
|
||||
|
||||
|
||||
void DetectRepositoryRenames ()
|
||||
{
|
||||
foreach (string group_path in Directory.GetDirectories (Config.FoldersPath)) {
|
||||
foreach (string folder_path in Directory.GetDirectories (group_path)) {
|
||||
string folder_name = Path.GetFileName (folder_path);
|
||||
|
||||
if (Config.IdentifierByName (folder_name) != null)
|
||||
continue;
|
||||
|
||||
string identifier_file_path = Path.Combine (folder_path, ".sparkleshare");
|
||||
|
||||
if (!File.Exists (identifier_file_path))
|
||||
continue;
|
||||
|
||||
string identifier = File.ReadAllText (identifier_file_path).Trim ();
|
||||
|
||||
if (!Config.IdentifierExists (identifier))
|
||||
continue;
|
||||
|
||||
RemoveRepository (GetRepoByName (folder_name));
|
||||
Config.RenameFolder (identifier, folder_name);
|
||||
|
||||
string new_folder_path = Path.Combine (group_path, folder_name);
|
||||
AddRepository (new_folder_path);
|
||||
|
||||
Logger.LogInfo ("Controller",
|
||||
"Renamed folder with identifier " + identifier + " to '" + folder_name + "'");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void RemoveDeletedRepositories ()
|
||||
{
|
||||
foreach (string folder_name in Config.Folders) {
|
||||
string folder_path = new SparkleFolder (folder_name).FullPath;
|
||||
|
||||
if (!Directory.Exists (folder_path)) {
|
||||
Config.RemoveFolder (folder_name);
|
||||
RemoveRepository (GetRepoByName (folder_name));
|
||||
|
||||
Logger.LogInfo ("Controller", "Removed folder '" + folder_name + "' from config");
|
||||
|
||||
} else {
|
||||
AddRepository (folder_path);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void AddRepository (string folder_path)
|
||||
{
|
||||
BaseRepository repo = null;
|
||||
string folder_name = Path.GetFileName (folder_path);
|
||||
string backend = Config.BackendByName (folder_name);
|
||||
|
||||
try {
|
||||
repo = (BaseRepository) Activator.CreateInstance (
|
||||
Type.GetType ("Sparkles." + backend + "." + backend + "Repository, Sparkles." + backend),
|
||||
new object [] { folder_path, Config, SSHAuthenticationInfo.DefaultAuthenticationInfo });
|
||||
|
||||
} catch (Exception e) {
|
||||
Logger.LogInfo ("Controller", "Failed to load backend '" + backend + "' for '" + folder_name + "': ", e);
|
||||
return;
|
||||
}
|
||||
|
||||
repo.ChangesDetected += delegate {
|
||||
UpdateState ();
|
||||
};
|
||||
|
||||
repo.SyncStatusChanged += delegate (SyncStatus status) {
|
||||
if (status == SyncStatus.Idle) {
|
||||
ProgressPercentage = 0.0;
|
||||
ProgressSpeedUp = 0.0;
|
||||
ProgressSpeedDown = 0.0;
|
||||
ProgressInformation = "";
|
||||
}
|
||||
|
||||
UpdateState ();
|
||||
};
|
||||
|
||||
repo.ProgressChanged += delegate {
|
||||
ProgressPercentage = 0.0;
|
||||
ProgressSpeedUp = 0.0;
|
||||
ProgressSpeedDown = 0.0;
|
||||
ProgressInformation = "";
|
||||
|
||||
double percentage = 0.0;
|
||||
int repo_count = 0;
|
||||
|
||||
foreach (BaseRepository rep in Repositories) {
|
||||
if (rep.ProgressPercentage > 0) {
|
||||
percentage += rep.ProgressPercentage;
|
||||
repo_count++;
|
||||
}
|
||||
|
||||
if (rep.Status == SyncStatus.SyncUp)
|
||||
ProgressSpeedUp += rep.ProgressSpeed;
|
||||
|
||||
if (rep.Status == SyncStatus.SyncDown)
|
||||
ProgressSpeedDown += rep.ProgressSpeed;
|
||||
}
|
||||
|
||||
if (repo_count == 1)
|
||||
ProgressInformation = repo.ProgressInformation;
|
||||
|
||||
if (repo_count > 0)
|
||||
ProgressPercentage = percentage / repo_count;
|
||||
|
||||
UpdateState ();
|
||||
};
|
||||
|
||||
repo.NewChangeSet += delegate (ChangeSet change_set) {
|
||||
if (AvatarsEnabled) {
|
||||
string provider = "gravatar";
|
||||
|
||||
if (AvatarsProvider == "libravatar")
|
||||
provider = AvatarsProvider;
|
||||
|
||||
|
||||
change_set.User.AvatarFilePath = Avatars.GetAvatar (change_set.User.Email, 48, Config.DirectoryPath, provider);
|
||||
|
||||
}
|
||||
|
||||
NotificationRaised (change_set);
|
||||
};
|
||||
|
||||
repo.ConflictResolved += delegate {
|
||||
AlertNotificationRaised ("Resolved a file collision", "Local and server versions were kept.");
|
||||
};
|
||||
|
||||
AddRepository (repo);
|
||||
repo.Initialize ();
|
||||
}
|
||||
|
||||
|
||||
void OnFolderActivity (object o, FileSystemEventArgs args)
|
||||
{
|
||||
if (args != null && args.FullPath.EndsWith (".xml") &&
|
||||
args.ChangeType == WatcherChangeTypes.Created) {
|
||||
|
||||
HandleInvite (args);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void StartupInviteScan ()
|
||||
{
|
||||
foreach (string invite in Directory.GetFiles (FoldersPath, "*.xml"))
|
||||
HandleInvite (invite);
|
||||
}
|
||||
|
||||
|
||||
void HandleInvite (FileSystemEventArgs args)
|
||||
{
|
||||
HandleInvite (args.FullPath);
|
||||
}
|
||||
|
||||
|
||||
void HandleInvite (string path)
|
||||
{
|
||||
if (this.fetcher != null &&
|
||||
this.fetcher.IsActive) {
|
||||
|
||||
AlertNotificationRaised ("SparkleShare Setup seems busy", "Please wait for it to finish");
|
||||
|
||||
} else {
|
||||
SparkleInvite invite = new SparkleInvite (path);
|
||||
|
||||
// It may be that the invite we received a path to isn't
|
||||
// fully downloaded yet, so we try to read it several times
|
||||
int tries = 0;
|
||||
while (!invite.IsValid) {
|
||||
Thread.Sleep (100);
|
||||
invite = new SparkleInvite (path);
|
||||
tries++;
|
||||
|
||||
if (tries > 10) {
|
||||
AlertNotificationRaised ("Oh noes!", "This invite seems screwed up...");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (invite.IsValid)
|
||||
InviteReceived (invite);
|
||||
|
||||
File.Delete (path);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Fires events for the current syncing state
|
||||
void UpdateState ()
|
||||
{
|
||||
bool has_unsynced_repos = false;
|
||||
bool has_syncing_repos = false;
|
||||
|
||||
foreach (BaseRepository repo in Repositories) {
|
||||
if (repo.Status == SyncStatus.SyncDown || repo.Status == SyncStatus.SyncUp || repo.IsBuffering) {
|
||||
has_syncing_repos = true;
|
||||
break;
|
||||
|
||||
} else if (repo.Status == SyncStatus.Idle && repo.HasUnsyncedChanges) {
|
||||
has_unsynced_repos = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (has_syncing_repos)
|
||||
OnSyncing ();
|
||||
else if (has_unsynced_repos)
|
||||
OnError ();
|
||||
else
|
||||
OnIdle ();
|
||||
}
|
||||
|
||||
|
||||
public List<StorageTypeInfo> FetcherAvailableStorageTypes {
|
||||
get {
|
||||
return this.fetcher.AvailableStorageTypes;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void StartFetcher (SparkleFetcherInfo info)
|
||||
{
|
||||
string canonical_name = Path.GetFileName (info.RemotePath);
|
||||
string backend = info.Backend;
|
||||
|
||||
if (string.IsNullOrEmpty (backend))
|
||||
backend = BaseFetcher.GetBackend (info.Address);
|
||||
|
||||
info.TargetDirectory = Path.Combine (Config.TmpPath, canonical_name);
|
||||
|
||||
if (Directory.Exists (info.TargetDirectory))
|
||||
Directory.Delete (info.TargetDirectory, recursive: true);
|
||||
|
||||
try {
|
||||
this.fetcher = (BaseFetcher) Activator.CreateInstance (
|
||||
Type.GetType ("Sparkles." + backend + "." + backend + "Fetcher, Sparkles." + backend),
|
||||
new object [] { info, UserAuthenticationInfo});
|
||||
|
||||
} catch (Exception e) {
|
||||
Logger.LogInfo ("Controller",
|
||||
"Failed to load '" + backend + "' backend for '" + canonical_name + "' " + e.Message);
|
||||
|
||||
FolderFetchError (Path.Combine (info.Address, info.RemotePath).Replace (@"\", "/"),
|
||||
new string [] {"Failed to load \"" + backend + "\" backend for \"" + canonical_name + "\""});
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
this.fetcher.Finished += FetcherFinishedDelegate;
|
||||
this.fetcher.Failed += FetcherFailedDelegate;
|
||||
this.fetcher.ProgressChanged += FetcherProgressChangedDelgate;
|
||||
|
||||
this.fetcher.Start ();
|
||||
}
|
||||
|
||||
|
||||
void FetcherFinishedDelegate (StorageType storage_type, string [] warnings)
|
||||
{
|
||||
if (storage_type == StorageType.Unknown) {
|
||||
ShowSetupWindow (PageType.StorageSetup);
|
||||
return;
|
||||
}
|
||||
|
||||
if (storage_type == StorageType.Encrypted) {
|
||||
ShowSetupWindowEvent (PageType.CryptoPassword);
|
||||
return;
|
||||
}
|
||||
|
||||
FinishFetcher (storage_type);
|
||||
}
|
||||
|
||||
|
||||
void FetcherFailedDelegate ()
|
||||
{
|
||||
FolderFetchError (this.fetcher.RemoteUrl.ToString (), this.fetcher.Errors);
|
||||
StopFetcher ();
|
||||
}
|
||||
|
||||
|
||||
void FetcherProgressChangedDelgate (double percentage, double speed, string information)
|
||||
{
|
||||
FolderFetching (percentage, speed, information);
|
||||
}
|
||||
|
||||
|
||||
public void StopFetcher ()
|
||||
{
|
||||
this.fetcher.Stop ();
|
||||
this.fetcher.Dispose ();
|
||||
|
||||
this.fetcher = null;
|
||||
this.watcher.EnableRaisingEvents = true;
|
||||
}
|
||||
|
||||
|
||||
public bool CheckPassword (string password)
|
||||
{
|
||||
return this.fetcher.IsFetchedRepoPasswordCorrect (password);
|
||||
}
|
||||
|
||||
|
||||
public void FinishFetcher (StorageType selected_storage_type, string password)
|
||||
{
|
||||
this.fetcher.EnableFetchedRepoCrypto (password);
|
||||
FinishFetcher (StorageType.Encrypted);
|
||||
}
|
||||
|
||||
|
||||
public void FinishFetcher (StorageType selected_storage_type)
|
||||
{
|
||||
this.watcher.EnableRaisingEvents = false;
|
||||
string identifier = this.fetcher.Complete (selected_storage_type);
|
||||
|
||||
string target_folder_path = DetermineFolderPath ();
|
||||
string target_folder_name = Path.GetFileName (target_folder_path);
|
||||
|
||||
try {
|
||||
Directory.Move (this.fetcher.TargetFolder, target_folder_path);
|
||||
|
||||
} catch (Exception e) {
|
||||
Logger.LogInfo ("Controller", "Error moving directory, trying again...", e);
|
||||
|
||||
try {
|
||||
ClearDirectoryAttributes (this.fetcher.TargetFolder);
|
||||
Directory.Move (this.fetcher.TargetFolder, target_folder_path);
|
||||
|
||||
} catch (Exception x) {
|
||||
Logger.LogInfo ("Controller", "Error moving directory", x);
|
||||
|
||||
this.fetcher.Dispose ();
|
||||
this.fetcher = null;
|
||||
this.watcher.EnableRaisingEvents = true;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
string backend = BaseFetcher.GetBackend (this.fetcher.RemoteUrl.ToString ());
|
||||
|
||||
Config.AddFolder (target_folder_name, identifier, this.fetcher.RemoteUrl.ToString (), backend);
|
||||
|
||||
if (this.fetcher.FetchedRepoStorageType != StorageType.Plain) {
|
||||
Config.SetFolderOptionalAttribute (target_folder_name,
|
||||
"storage_type", this.fetcher.FetchedRepoStorageType.ToString ());
|
||||
}
|
||||
|
||||
if (this.fetcher.OriginalFetcherInfo.AnnouncementsUrl != null) {
|
||||
Config.SetFolderOptionalAttribute (target_folder_name, "announcements_url",
|
||||
this.fetcher.OriginalFetcherInfo.AnnouncementsUrl);
|
||||
}
|
||||
|
||||
AddRepository (target_folder_path);
|
||||
RepositoriesLoaded = true;
|
||||
|
||||
FolderListChanged ();
|
||||
FolderFetched (this.fetcher.RemoteUrl.ToString (), this.fetcher.Warnings.ToArray ());
|
||||
|
||||
this.fetcher.Dispose ();
|
||||
this.fetcher = null;
|
||||
|
||||
this.watcher.EnableRaisingEvents = true;
|
||||
}
|
||||
|
||||
|
||||
string DetermineFolderPath ()
|
||||
{
|
||||
string folder_name = this.fetcher.FormatName ();
|
||||
string folder_group_path = Path.Combine (Config.FoldersPath, this.fetcher.RemoteUrl.Host);
|
||||
string folder_path = Path.Combine (Config.FoldersPath, folder_group_path, folder_name);
|
||||
|
||||
if (!Directory.Exists (folder_path)) {
|
||||
if (!Directory.Exists (folder_group_path))
|
||||
Directory.CreateDirectory (folder_group_path);
|
||||
|
||||
return folder_path;
|
||||
}
|
||||
|
||||
// Add a number suffix when needed, e.g. "Folder (3)"
|
||||
int suffix = 2 + Directory.GetDirectories (folder_group_path, folder_name + " (*").Length;
|
||||
return string.Format ("{0} ({1})", folder_path, suffix);
|
||||
}
|
||||
|
||||
|
||||
public void Quit ()
|
||||
{
|
||||
foreach (BaseRepository repo in Repositories)
|
||||
repo.Dispose ();
|
||||
|
||||
PlatformQuit ();
|
||||
}
|
||||
|
||||
|
||||
void ClearDirectoryAttributes (string path)
|
||||
{
|
||||
if (!Directory.Exists (path))
|
||||
return;
|
||||
|
||||
string [] folders = Directory.GetDirectories (path);
|
||||
|
||||
foreach (string folder in folders)
|
||||
ClearDirectoryAttributes (folder);
|
||||
|
||||
string [] files = Directory.GetFiles (path);
|
||||
|
||||
foreach (string file in files)
|
||||
if (file.IsSymlink ())
|
||||
File.SetAttributes (file, FileAttributes.Normal);
|
||||
}
|
||||
}
|
||||
}
|
34
SparkleShare/SparkleBubblesController.cs → SparkleShare/Common/BubblesController.cs
Executable file → Normal file
|
@ -1,5 +1,5 @@
|
|||
// SparkleShare, a collaboration and sharing tool.
|
||||
// Copyright (C) 2010 Hylke Bons <hylkebons@gmail.com>
|
||||
// Copyright (C) 2010 Hylke Bons <hi@planetpeanut.uk>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
|
@ -15,26 +15,31 @@
|
|||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
using System;
|
||||
using System.Text;
|
||||
|
||||
using SparkleLib;
|
||||
using Sparkles;
|
||||
|
||||
namespace SparkleShare {
|
||||
|
||||
public class SparkleBubblesController {
|
||||
public class BubblesController {
|
||||
private bool fix_utf_encoding;
|
||||
|
||||
public event ShowBubbleEventHandler ShowBubbleEvent = delegate { };
|
||||
public delegate void ShowBubbleEventHandler (string title, string subtext, string image_path);
|
||||
|
||||
|
||||
public SparkleBubblesController ()
|
||||
public BubblesController () : this(true)
|
||||
{
|
||||
Program.Controller.AlertNotificationRaised += delegate (string title, string message) {
|
||||
}
|
||||
|
||||
public BubblesController (bool fix_utf_encoding)
|
||||
{
|
||||
this.fix_utf_encoding = fix_utf_encoding;
|
||||
|
||||
SparkleShare.Controller.AlertNotificationRaised += delegate (string title, string message) {
|
||||
ShowBubble (title, message, null);
|
||||
};
|
||||
|
||||
Program.Controller.NotificationRaised += delegate (SparkleChangeSet change_set) {
|
||||
SparkleShare.Controller.NotificationRaised += delegate (ChangeSet change_set) {
|
||||
ShowBubble (change_set.User.Name, change_set.ToMessage (), change_set.User.AvatarFilePath);
|
||||
};
|
||||
}
|
||||
|
@ -42,10 +47,13 @@ namespace SparkleShare {
|
|||
|
||||
public void ShowBubble (string title, string subtext, string image_path)
|
||||
{
|
||||
byte [] title_bytes = Encoding.Default.GetBytes (title);
|
||||
byte [] subtext_bytes = Encoding.Default.GetBytes (subtext);
|
||||
title = Encoding.UTF8.GetString (title_bytes);
|
||||
subtext = Encoding.UTF8.GetString (subtext_bytes);
|
||||
if(fix_utf_encoding)
|
||||
{
|
||||
byte [] title_bytes = Encoding.Default.GetBytes (title);
|
||||
byte [] subtext_bytes = Encoding.Default.GetBytes (subtext);
|
||||
title = Encoding.UTF8.GetString (title_bytes);
|
||||
subtext = Encoding.UTF8.GetString (subtext_bytes);
|
||||
}
|
||||
|
||||
ShowBubbleEvent (title, subtext, image_path);
|
||||
}
|
||||
|
@ -53,7 +61,7 @@ namespace SparkleShare {
|
|||
|
||||
public void BubbleClicked ()
|
||||
{
|
||||
Program.Controller.ShowEventLogWindow ();
|
||||
SparkleShare.Controller.ShowEventLogWindow ();
|
||||
}
|
||||
}
|
||||
}
|
179
SparkleShare/SparkleEventLogController.cs → SparkleShare/Common/EventLogController.cs
Executable file → Normal file
|
@ -1,5 +1,5 @@
|
|||
// SparkleShare, a collaboration and sharing tool.
|
||||
// Copyright (C) 2010 Hylke Bons <hylkebons@gmail.com>
|
||||
// Copyright (C) 2010 Hylke Bons <hi@planetpeanut.uk>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
|
@ -24,11 +24,11 @@ using System.Text;
|
|||
using System.Text.RegularExpressions;
|
||||
using System.Threading;
|
||||
|
||||
using SparkleLib;
|
||||
using Sparkles;
|
||||
|
||||
namespace SparkleShare {
|
||||
|
||||
public class SparkleEventLogController {
|
||||
public class EventLogController {
|
||||
|
||||
public event Action ShowWindowEvent = delegate { };
|
||||
public event Action HideWindowEvent = delegate { };
|
||||
|
@ -36,16 +36,16 @@ namespace SparkleShare {
|
|||
|
||||
public event UpdateContentEventEventHandler UpdateContentEvent = delegate { };
|
||||
public delegate void UpdateContentEventEventHandler (string html);
|
||||
|
||||
|
||||
public event UpdateChooserEventHandler UpdateChooserEvent = delegate { };
|
||||
public delegate void UpdateChooserEventHandler (string [] folders);
|
||||
|
||||
|
||||
public event UpdateChooserEnablementEventHandler UpdateChooserEnablementEvent = delegate { };
|
||||
public delegate void UpdateChooserEnablementEventHandler (bool enabled);
|
||||
|
||||
|
||||
public event UpdateSizeInfoEventHandler UpdateSizeInfoEvent = delegate { };
|
||||
public delegate void UpdateSizeInfoEventHandler (string size, string history_size);
|
||||
|
||||
|
||||
public event ShowSaveDialogEventHandler ShowSaveDialogEvent = delegate { };
|
||||
public delegate void ShowSaveDialogEventHandler (string file_name, string target_folder_path);
|
||||
|
||||
|
@ -53,7 +53,7 @@ namespace SparkleShare {
|
|||
private string selected_folder;
|
||||
private RevisionInfo restore_revision_info;
|
||||
private bool history_view_active;
|
||||
|
||||
private bool fix_utf_encoding;
|
||||
|
||||
public bool WindowIsOpen { get; private set; }
|
||||
|
||||
|
@ -84,7 +84,7 @@ namespace SparkleShare {
|
|||
|
||||
public string HTML {
|
||||
get {
|
||||
List<SparkleChangeSet> change_sets = GetLog (this.selected_folder);
|
||||
List<ChangeSet> change_sets = GetLog (this.selected_folder);
|
||||
string html = GetHTMLLog (change_sets);
|
||||
|
||||
return html;
|
||||
|
@ -93,7 +93,7 @@ namespace SparkleShare {
|
|||
|
||||
public string [] Folders {
|
||||
get {
|
||||
return Program.Controller.Folders.ToArray ();
|
||||
return SparkleShare.Controller.Folders.ToArray ();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -101,7 +101,7 @@ namespace SparkleShare {
|
|||
get {
|
||||
double size = 0;
|
||||
|
||||
foreach (SparkleRepoBase repo in Program.Controller.Repositories) {
|
||||
foreach (BaseRepository repo in SparkleShare.Controller.Repositories) {
|
||||
if (this.selected_folder == null) {
|
||||
size += repo.Size;
|
||||
|
||||
|
@ -124,7 +124,7 @@ namespace SparkleShare {
|
|||
get {
|
||||
double size = 0;
|
||||
|
||||
foreach (SparkleRepoBase repo in Program.Controller.Repositories) {
|
||||
foreach (BaseRepository repo in SparkleShare.Controller.Repositories) {
|
||||
if (this.selected_folder == null) {
|
||||
size += repo.HistorySize;
|
||||
|
||||
|
@ -144,9 +144,15 @@ namespace SparkleShare {
|
|||
}
|
||||
|
||||
|
||||
public SparkleEventLogController ()
|
||||
public EventLogController () : this (true)
|
||||
{
|
||||
Program.Controller.ShowEventLogWindowEvent += delegate {
|
||||
}
|
||||
|
||||
public EventLogController (bool fix_utf_encoding)
|
||||
{
|
||||
this.fix_utf_encoding = fix_utf_encoding;
|
||||
|
||||
SparkleShare.Controller.ShowEventLogWindowEvent += delegate {
|
||||
if (!WindowIsOpen) {
|
||||
ContentLoadingEvent ();
|
||||
UpdateSizeInfoEvent ("…", "…");
|
||||
|
@ -162,7 +168,7 @@ namespace SparkleShare {
|
|||
|
||||
if (!string.IsNullOrEmpty (html))
|
||||
UpdateContentEvent (html);
|
||||
|
||||
|
||||
UpdateSizeInfoEvent (Size, HistorySize);
|
||||
|
||||
}).Start ();
|
||||
|
@ -172,8 +178,8 @@ namespace SparkleShare {
|
|||
WindowIsOpen = true;
|
||||
ShowWindowEvent ();
|
||||
};
|
||||
|
||||
Program.Controller.OnIdle += delegate {
|
||||
|
||||
SparkleShare.Controller.OnIdle += delegate {
|
||||
if (this.history_view_active)
|
||||
return;
|
||||
|
||||
|
@ -189,9 +195,9 @@ namespace SparkleShare {
|
|||
|
||||
UpdateSizeInfoEvent (Size, HistorySize);
|
||||
};
|
||||
|
||||
Program.Controller.FolderListChanged += delegate {
|
||||
if (this.selected_folder != null && !Program.Controller.Folders.Contains (this.selected_folder))
|
||||
|
||||
SparkleShare.Controller.FolderListChanged += delegate {
|
||||
if (this.selected_folder != null && !SparkleShare.Controller.Folders.Contains (this.selected_folder))
|
||||
this.selected_folder = null;
|
||||
|
||||
UpdateChooserEvent (Folders);
|
||||
|
@ -208,20 +214,20 @@ namespace SparkleShare {
|
|||
}
|
||||
|
||||
|
||||
public void LinkClicked (string url)
|
||||
public void LinkClicked (string href)
|
||||
{
|
||||
if (url.StartsWith ("about:") || string.IsNullOrEmpty (url))
|
||||
if (string.IsNullOrEmpty (href) || href.StartsWith ("about:"))
|
||||
return;
|
||||
|
||||
url = url.Replace ("%20", " ");
|
||||
|
||||
if (url.StartsWith ("http")) {
|
||||
Program.Controller.OpenWebsite (url);
|
||||
|
||||
} else if (url.StartsWith ("restore://") && this.restore_revision_info == null) {
|
||||
|
||||
href = href.Replace ("%20", " ");
|
||||
|
||||
if (href.StartsWith ("http")) {
|
||||
SparkleShare.Controller.OpenWebsite (href);
|
||||
|
||||
} else if (href.StartsWith ("restore://") && this.restore_revision_info == null) {
|
||||
Regex regex = new Regex ("restore://(.+)/([a-f0-9]+)/(.+)/(.{3} [0-9]+ [0-9]+h[0-9]+)/(.+)");
|
||||
Match match = regex.Match (url);
|
||||
|
||||
Match match = regex.Match (href);
|
||||
|
||||
if (match.Success) {
|
||||
string author_name = match.Groups [3].Value;
|
||||
string timestamp = match.Groups [4].Value;
|
||||
|
@ -240,35 +246,38 @@ namespace SparkleShare {
|
|||
|
||||
ShowSaveDialogEvent (file_name, target_folder_path);
|
||||
}
|
||||
|
||||
} else if (url.StartsWith ("back://")) {
|
||||
|
||||
} else if (href.StartsWith ("back://")) {
|
||||
this.history_view_active = false;
|
||||
SelectedFolder = this.selected_folder; // TODO: Return to the same position on the page
|
||||
|
||||
UpdateChooserEnablementEvent (true);
|
||||
|
||||
} else if (url.StartsWith ("history://")) {
|
||||
} else if (href.StartsWith ("history://")) {
|
||||
this.history_view_active = true;
|
||||
|
||||
ContentLoadingEvent ();
|
||||
UpdateSizeInfoEvent ("…", "…");
|
||||
UpdateChooserEnablementEvent (false);
|
||||
|
||||
string folder = url.Replace ("history://", "").Split ("/".ToCharArray ()) [0];
|
||||
string file_path = url.Replace ("history://" + folder + "/", "");
|
||||
string folder = href.Replace ("history://", "").Split ("/".ToCharArray ()) [0];
|
||||
string file_path = href.Replace ("history://" + folder + "/", "");
|
||||
|
||||
byte [] file_path_bytes = Encoding.Default.GetBytes (file_path);
|
||||
file_path = Encoding.UTF8.GetString (file_path_bytes);
|
||||
if(fix_utf_encoding)
|
||||
{
|
||||
byte [] file_path_bytes = Encoding.Default.GetBytes (file_path);
|
||||
file_path = Encoding.UTF8.GetString (file_path_bytes);
|
||||
}
|
||||
|
||||
file_path = Uri.UnescapeDataString (file_path);
|
||||
|
||||
foreach (SparkleRepoBase repo in Program.Controller.Repositories) {
|
||||
foreach (BaseRepository repo in SparkleShare.Controller.Repositories) {
|
||||
if (!repo.Name.Equals (folder))
|
||||
continue;
|
||||
|
||||
new Thread (() => {
|
||||
SparkleDelay delay = new SparkleDelay ();
|
||||
List<SparkleChangeSet> change_sets = repo.GetChangeSets (file_path);
|
||||
List<ChangeSet> change_sets = repo.GetChangeSets (file_path);
|
||||
string html = GetHistoryHTMLLog (change_sets, file_path);
|
||||
delay.Stop ();
|
||||
|
||||
|
@ -281,14 +290,17 @@ namespace SparkleShare {
|
|||
}
|
||||
|
||||
} else {
|
||||
Program.Controller.OpenFile (url);
|
||||
}
|
||||
if (href.StartsWith ("file:///"))
|
||||
href = href.Substring (7);
|
||||
|
||||
SparkleShare.Controller.OpenFile (href);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void SaveDialogCompleted (string target_file_path)
|
||||
{
|
||||
foreach (SparkleRepoBase repo in Program.Controller.Repositories) {
|
||||
foreach (BaseRepository repo in SparkleShare.Controller.Repositories) {
|
||||
if (repo.Name.Equals (this.restore_revision_info.Folder.Name)) {
|
||||
repo.RestoreFile (this.restore_revision_info.FilePath,
|
||||
this.restore_revision_info.Revision, target_file_path);
|
||||
|
@ -298,7 +310,7 @@ namespace SparkleShare {
|
|||
}
|
||||
|
||||
this.restore_revision_info = null;
|
||||
Program.Controller.OpenFolder (Path.GetDirectoryName (target_file_path));
|
||||
SparkleShare.Controller.OpenFolder (Path.GetDirectoryName (target_file_path));
|
||||
}
|
||||
|
||||
|
||||
|
@ -308,17 +320,17 @@ namespace SparkleShare {
|
|||
}
|
||||
|
||||
|
||||
private List<SparkleChangeSet> GetLog ()
|
||||
private List<ChangeSet> GetLog ()
|
||||
{
|
||||
List<SparkleChangeSet> list = new List<SparkleChangeSet> ();
|
||||
List<ChangeSet> list = new List<ChangeSet> ();
|
||||
|
||||
foreach (SparkleRepoBase repo in Program.Controller.Repositories) {
|
||||
List<SparkleChangeSet> change_sets = repo.ChangeSets;
|
||||
foreach (BaseRepository repo in SparkleShare.Controller.Repositories) {
|
||||
List<ChangeSet> change_sets = repo.ChangeSets;
|
||||
|
||||
if (change_sets != null)
|
||||
list.AddRange (change_sets);
|
||||
else
|
||||
SparkleLogger.LogInfo ("Log", "Could not create log for " + repo.Name);
|
||||
Logger.LogInfo ("Log", "Could not create log for " + repo.Name);
|
||||
}
|
||||
|
||||
list.Sort ((x, y) => (x.Timestamp.CompareTo (y.Timestamp)));
|
||||
|
@ -331,14 +343,14 @@ namespace SparkleShare {
|
|||
}
|
||||
|
||||
|
||||
private List<SparkleChangeSet> GetLog (string name)
|
||||
private List<ChangeSet> GetLog (string name)
|
||||
{
|
||||
if (name == null)
|
||||
return GetLog ();
|
||||
|
||||
foreach (SparkleRepoBase repo in Program.Controller.Repositories) {
|
||||
foreach (BaseRepository repo in SparkleShare.Controller.Repositories) {
|
||||
if (repo.Name.Equals (name)) {
|
||||
List<SparkleChangeSet> change_sets = repo.ChangeSets;
|
||||
List<ChangeSet> change_sets = repo.ChangeSets;
|
||||
|
||||
if (change_sets != null)
|
||||
return change_sets;
|
||||
|
@ -347,11 +359,11 @@ namespace SparkleShare {
|
|||
}
|
||||
}
|
||||
|
||||
return new List<SparkleChangeSet> ();
|
||||
return new List<ChangeSet> ();
|
||||
}
|
||||
|
||||
|
||||
public string GetHistoryHTMLLog (List<SparkleChangeSet> change_sets, string file_path)
|
||||
public string GetHistoryHTMLLog (List<ChangeSet> change_sets, string file_path)
|
||||
{
|
||||
string html = "<div class='history-header'>" +
|
||||
"<a class='windows' href='back://'>« Back</a> | ";
|
||||
|
@ -367,17 +379,17 @@ namespace SparkleShare {
|
|||
if (change_sets.Count > 0)
|
||||
change_sets.RemoveAt (0);
|
||||
|
||||
foreach (SparkleChangeSet change_set in change_sets) {
|
||||
foreach (ChangeSet change_set in change_sets) {
|
||||
html += "<tr>" +
|
||||
"<td class='avatar'><img src='" + GetAvatarFilePath (change_set.User) + "'></td>" +
|
||||
"<td class='name'>" + change_set.User.Name + "</td>" +
|
||||
"<td class='date'>" +
|
||||
change_set.Timestamp.ToString ("d MMM yyyy", CultureInfo.InvariantCulture) +
|
||||
"<td class='date'>" +
|
||||
change_set.Timestamp.ToString ("d MMM yyyy", CultureInfo.InvariantCulture) +
|
||||
"</td>" +
|
||||
"<td class='time'>" + change_set.Timestamp.ToString ("HH:mm") + "</td>" +
|
||||
"<td class='restore'>" +
|
||||
"<a href='restore://" + change_set.Folder.Name + "/" +
|
||||
change_set.Revision + "/" + change_set.User.Name + "/" +
|
||||
"<a href='restore://" + change_set.Folder.Name + "/" +
|
||||
change_set.Revision + "/" + change_set.User.Name + "/" +
|
||||
change_set.Timestamp.ToString ("MMM d H\\hmm", CultureInfo.InvariantCulture) + "/" +
|
||||
file_path + "'>Restore…</a>" +
|
||||
"</td>" +
|
||||
|
@ -385,16 +397,16 @@ namespace SparkleShare {
|
|||
}
|
||||
|
||||
html += "</table></div>";
|
||||
html = Program.Controller.EventLogHTML.Replace ("<!-- $event-log-content -->", html);
|
||||
html = SparkleShare.Controller.EventLogHTML.Replace ("<!-- $event-log-content -->", html);
|
||||
|
||||
return html.Replace ("<!-- $midnight -->", "100000000");
|
||||
}
|
||||
|
||||
|
||||
public string GetHTMLLog (List<SparkleChangeSet> change_sets)
|
||||
public string GetHTMLLog (List<ChangeSet> change_sets)
|
||||
{
|
||||
if (change_sets == null || change_sets.Count == 0)
|
||||
return Program.Controller.EventLogHTML.Replace ("<!-- $event-log-content -->",
|
||||
return SparkleShare.Controller.EventLogHTML.Replace ("<!-- $event-log-content -->",
|
||||
"<div class='day-entry'><div class='day-entry-header'>This project does not keep a history.</div></div>");
|
||||
|
||||
List <ActivityDay> activity_days = new List <ActivityDay> ();
|
||||
|
@ -402,9 +414,9 @@ namespace SparkleShare {
|
|||
change_sets.Sort ((x, y) => (x.Timestamp.CompareTo (y.Timestamp)));
|
||||
change_sets.Reverse ();
|
||||
|
||||
foreach (SparkleChangeSet change_set in change_sets) {
|
||||
foreach (ChangeSet change_set in change_sets) {
|
||||
bool change_set_inserted = false;
|
||||
|
||||
|
||||
foreach (ActivityDay stored_activity_day in activity_days) {
|
||||
if (stored_activity_day.Date.Year == change_set.Timestamp.Year &&
|
||||
stored_activity_day.Date.Month == change_set.Timestamp.Month &&
|
||||
|
@ -424,23 +436,23 @@ namespace SparkleShare {
|
|||
}
|
||||
}
|
||||
|
||||
string event_log_html = Program.Controller.EventLogHTML;
|
||||
string day_entry_html = Program.Controller.DayEntryHTML;
|
||||
string event_entry_html = Program.Controller.EventEntryHTML;
|
||||
string event_log_html = SparkleShare.Controller.EventLogHTML;
|
||||
string day_entry_html = SparkleShare.Controller.DayEntryHTML;
|
||||
string event_entry_html = SparkleShare.Controller.EventEntryHTML;
|
||||
string event_log = "";
|
||||
|
||||
foreach (ActivityDay activity_day in activity_days) {
|
||||
string event_entries = "";
|
||||
|
||||
foreach (SparkleChangeSet change_set in activity_day) {
|
||||
foreach (ChangeSet change_set in activity_day) {
|
||||
string event_entry = "<dl>";
|
||||
|
||||
foreach (SparkleChange change in change_set.Changes) {
|
||||
if (change.Type != SparkleChangeType.Moved) {
|
||||
foreach (Change change in change_set.Changes) {
|
||||
if (change.Type != ChangeType.Moved) {
|
||||
event_entry += "<dd class='" + change.Type.ToString ().ToLower () + "'>";
|
||||
|
||||
if (!change.IsFolder) {
|
||||
event_entry += "<small><a href=\"history://" + change_set.Folder.Name + "/" +
|
||||
event_entry += "<small><a href=\"history://" + change_set.Folder.Name + "/" +
|
||||
change.Path + "\" title=\"View revisions\">" + change.Timestamp.ToString ("HH:mm") +
|
||||
" ▾</a></small> ";
|
||||
|
||||
|
@ -533,10 +545,13 @@ namespace SparkleShare {
|
|||
|
||||
private string FormatBreadCrumbs (string path_root, string path)
|
||||
{
|
||||
byte [] path_root_bytes = Encoding.Default.GetBytes (path_root);
|
||||
byte [] path_bytes = Encoding.Default.GetBytes (path);
|
||||
path_root = Encoding.UTF8.GetString (path_root_bytes);
|
||||
path = Encoding.UTF8.GetString (path_bytes);
|
||||
if(fix_utf_encoding)
|
||||
{
|
||||
byte [] path_root_bytes = Encoding.Default.GetBytes (path_root);
|
||||
byte [] path_bytes = Encoding.Default.GetBytes (path);
|
||||
path_root = Encoding.UTF8.GetString (path_root_bytes);
|
||||
path = Encoding.UTF8.GetString (path_bytes);
|
||||
}
|
||||
|
||||
path_root = path_root.Replace ("/", Path.DirectorySeparatorChar.ToString ());
|
||||
path = path.Replace ("/", Path.DirectorySeparatorChar.ToString ());
|
||||
|
@ -579,7 +594,7 @@ namespace SparkleShare {
|
|||
private string SafeCombine (string path1, string path2)
|
||||
{
|
||||
string result = path1;
|
||||
|
||||
|
||||
if (!result.EndsWith (Path.DirectorySeparatorChar.ToString ()))
|
||||
result += Path.DirectorySeparatorChar;
|
||||
|
||||
|
@ -590,13 +605,13 @@ namespace SparkleShare {
|
|||
}
|
||||
|
||||
|
||||
private string GetAvatarFilePath (SparkleUser user)
|
||||
private string GetAvatarFilePath (User user)
|
||||
{
|
||||
if (!Program.Controller.AvatarsEnabled)
|
||||
if (!SparkleShare.Controller.AvatarsEnabled)
|
||||
return "<!-- $pixmaps-path -->/user-icon-default.png";
|
||||
|
||||
string fetched_avatar = SparkleAvatars.GetAvatar (user.Email, 48, Program.Controller.Config.FullPath);
|
||||
|
||||
|
||||
string fetched_avatar = Avatars.GetAvatar (user.Email, 48, SparkleShare.Controller.Config.DirectoryPath, SparkleShare.Controller.AvatarsProvider);
|
||||
|
||||
if (!string.IsNullOrEmpty (fetched_avatar))
|
||||
return "file://" + fetched_avatar.Replace ("\\", "/");
|
||||
else
|
||||
|
@ -605,7 +620,7 @@ namespace SparkleShare {
|
|||
|
||||
|
||||
// All change sets that happened on a day
|
||||
private class ActivityDay : List<SparkleChangeSet>
|
||||
private class ActivityDay : List<ChangeSet>
|
||||
{
|
||||
public DateTime Date;
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
dist_html_DATA = \
|
||||
day-entry.html \
|
||||
event-entry.html \
|
||||
event-log.html \
|
||||
jquery.js
|
||||
|
||||
htmldir = $(pkgdatadir)/html/
|
||||
|
||||
MAINTAINERCLEANFILES = \
|
||||
Makefile.in
|
|
@ -55,7 +55,7 @@
|
|||
background-color: #fefefe;
|
||||
color: <!-- $body-color -->;
|
||||
font-size: <!-- $body-font-size -->;
|
||||
font-family: "<!-- $body-font-family -->";
|
||||
font-family: -apple-system, "<!-- $body-font-family -->";
|
||||
margin: 0;
|
||||
-webkit-user-select: none;
|
||||
overflow-x: hidden;
|
||||
|
|
10
SparkleShare/Common/HTML/meson.build
Normal file
|
@ -0,0 +1,10 @@
|
|||
html_files = ['event-log.html',
|
||||
'day-entry.html',
|
||||
'event-entry.html',
|
||||
'jquery.js'
|
||||
]
|
||||
|
||||
install_data(
|
||||
sources: html_files,
|
||||
install_dir: join_paths(install_dir, 'html'))
|
||||
|
|
@ -2114,7 +2114,7 @@
|
|||
id="g101011"
|
||||
transform="translate(-65.909,-78.641)"
|
||||
clip-path="url(#clipPath4254)"
|
||||
inkscape:export-filename="/Users/hbons/Projects/SparkleShare/SparkleShare/Common/Pixmaps/about@2x.png"
|
||||
inkscape:export-filename="/Users/hbons/Projects/SparkleShare/SparkleShare/Common/Images/about@2x.png"
|
||||
inkscape:export-xdpi="180"
|
||||
inkscape:export-ydpi="180">
|
||||
<rect
|
Before Width: | Height: | Size: 955 KiB After Width: | Height: | Size: 955 KiB |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
2353
SparkleShare/Common/Images/Sources/app-icons.svg
Normal file
After Width: | Height: | Size: 122 KiB |
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 4.7 KiB |
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 76 KiB |
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 58 KiB |
Before Width: | Height: | Size: 9.6 KiB After Width: | Height: | Size: 9.6 KiB |
195
SparkleShare/Common/Images/Sources/gitlab.svg
Normal file
|
@ -0,0 +1,195 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
id="svg9662"
|
||||
height="24"
|
||||
width="24"
|
||||
version="1.1"
|
||||
inkscape:version="0.91+devel r14094"
|
||||
sodipodi:docname="gitlab.svg"
|
||||
viewBox="0 0 24 24"
|
||||
inkscape:export-filename="/Users/hbons/Personal/Projects/SparkleShare/SparkleShare/Common/Presets/gitlab@2x.png"
|
||||
inkscape:export-xdpi="192"
|
||||
inkscape:export-ydpi="192">
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1280"
|
||||
inkscape:window-height="755"
|
||||
id="namedview4365"
|
||||
inkscape:document-units="px"
|
||||
showgrid="false"
|
||||
inkscape:zoom="11.313708"
|
||||
inkscape:cx="8.5858812"
|
||||
inkscape:cy="8.8928334"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="g4326"
|
||||
inkscape:snap-global="false">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid4341" />
|
||||
</sodipodi:namedview>
|
||||
<defs
|
||||
id="defs3">
|
||||
<linearGradient
|
||||
id="linearGradient4343"
|
||||
inkscape:collect="always">
|
||||
<stop
|
||||
id="stop4345"
|
||||
offset="0"
|
||||
style="stop-color:#df2000;stop-opacity:1" />
|
||||
<stop
|
||||
id="stop4347"
|
||||
offset="1"
|
||||
style="stop-color:#881805;stop-opacity:1" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient4318">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop4320" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop4322" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient4304">
|
||||
<stop
|
||||
style="stop-color:#ce2509;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop4306" />
|
||||
<stop
|
||||
style="stop-color:#a9210a;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop4308" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4304"
|
||||
id="linearGradient4310"
|
||||
x1="28.415369"
|
||||
y1="9.2727699"
|
||||
x2="31.521933"
|
||||
y2="19.203804"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4343"
|
||||
id="linearGradient4339"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="26.80905"
|
||||
y1="3.7043378"
|
||||
x2="31.521933"
|
||||
y2="19.203804"
|
||||
gradientTransform="translate(0,0.98994346)" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4318"
|
||||
id="radialGradient4349"
|
||||
cx="27.992599"
|
||||
cy="13.000279"
|
||||
fx="27.992599"
|
||||
fy="13.000279"
|
||||
r="10.832553"
|
||||
gradientTransform="matrix(2.7510713,0,0,2.3899162,-49.67941,-17.015106)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
</defs>
|
||||
<metadata
|
||||
id="metadata4">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
id="g4326"
|
||||
transform="matrix(1.01163,0,0,1.0101587,-20.452835,-1.7447338)"
|
||||
style="stroke-width:0.9892233">
|
||||
<path
|
||||
style="fill:#e24329;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9892233;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 28.012539,10.206244 8.200627,0 L 38.959248,2.1937049 43.510972,14.607498 32.075235,22.996213 20.639498,14.56988 24.965517,2.0432347 Z"
|
||||
id="path4268"
|
||||
inkscape:connector-curvature="0" />
|
||||
<g
|
||||
transform="matrix(-1,0,0,1,64.092707,0.98994346)"
|
||||
id="g4278"
|
||||
style="stroke-width:0.9892233">
|
||||
<g
|
||||
id="g4284"
|
||||
style="stroke-width:0.9892233">
|
||||
<path
|
||||
style="fill:#fc6d26;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9892233px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 28.012539,9.2163007 -5.818181,0 -1.55486,4.3636363 11.435737,8.426333 z"
|
||||
id="path4280"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<path
|
||||
style="fill:#fca326;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9892233px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 22.694403,9.207369 32.028121,21.951963 20.639498,13.579937 Z"
|
||||
id="path4282"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccc" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g4288"
|
||||
transform="translate(0.01747244,0.98994346)"
|
||||
style="stroke-width:0.9892233">
|
||||
<g
|
||||
id="g4290"
|
||||
style="stroke-width:0.9892233">
|
||||
<path
|
||||
sodipodi:nodetypes="ccccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4292"
|
||||
d="m 28.012539,9.2163007 -5.818181,0 -1.55486,4.3636363 11.435737,8.426333 z"
|
||||
style="fill:#fc6d26;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9892233px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4294"
|
||||
d="M 22.694403,9.207369 32.028121,21.951963 20.639498,13.579937 Z"
|
||||
style="fill:#fca326;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9892233px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
</g>
|
||||
</g>
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4266"
|
||||
d="m 28.012539,10.206244 8.200627,0 L 38.959248,2.1937049 43.510972,14.607498 32.075235,22.996213 20.639498,14.56988 24.965517,2.0432347 Z"
|
||||
style="fill:none;fill-rule:evenodd;stroke:url(#linearGradient4339);stroke-width:0.9892233;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
d="M 25.001953,4.0175781 21.826172,13.210938 32.078125,20.761719 42.3125,13.253906 38.990234,4.1992188 37.160156,9.5410156 A 1.0021178,1.0021178 0 0 1 36.212891,10.21875 l -8.201172,0 A 1.0021178,1.0021178 0 0 1 27.072266,9.5664062 L 25.001953,4.0175781 Z"
|
||||
id="path4312"
|
||||
style="opacity:0.4;fill:none;fill-rule:evenodd;stroke:url(#radialGradient4349);stroke-width:0.9892233;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
inkscape:original="M 24.964844 1.0527344 L 20.638672 13.580078 L 32.076172 22.005859 L 43.511719 13.617188 L 38.958984 1.203125 L 36.212891 9.2167969 L 28.011719 9.2167969 L 24.964844 1.0527344 z "
|
||||
inkscape:radius="-1.0020176"
|
||||
sodipodi:type="inkscape:offset"
|
||||
transform="translate(0,0.98994346)" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 7.3 KiB |
|
@ -16,7 +16,7 @@
|
|||
version="1.1"
|
||||
inkscape:version="0.48.2 r9819"
|
||||
sodipodi:docname="side-splash.svg"
|
||||
inkscape:export-filename="/Users/hbons/Projects/SparkleShare/SparkleShare/Common/Pixmaps/side-splash.png"
|
||||
inkscape:export-filename="/Users/hbons/Projects/SparkleShare/SparkleShare/Common/Images/side-splash.png"
|
||||
inkscape:export-xdpi="90"
|
||||
inkscape:export-ydpi="90">
|
||||
<sodipodi:namedview
|
Before Width: | Height: | Size: 967 KiB After Width: | Height: | Size: 967 KiB |
Before Width: | Height: | Size: 143 KiB After Width: | Height: | Size: 186 KiB |
|
@ -3064,7 +3064,7 @@
|
|||
style="fill:url(#radialGradient211652);fill-opacity:1;stroke:#261f1f;stroke-width:2;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||
inkscape:export-xdpi="180"
|
||||
inkscape:export-ydpi="180"
|
||||
inkscape:export-filename="/Users/hbons/Projects/SparkleShare/SparkleShare/Common/Pixmaps/tutorial-slide-1@2x.png" />
|
||||
inkscape:export-filename="/Users/hbons/Projects/SparkleShare/SparkleShare/Common/Images/tutorial-slide-1@2x.png" />
|
||||
<g
|
||||
transform="matrix(0.85916724,0,0,0.85916724,-926.30984,-650.2188)"
|
||||
id="g52133-7"
|
Before Width: | Height: | Size: 1.8 MiB After Width: | Height: | Size: 1.8 MiB |
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 65 KiB |
Before Width: | Height: | Size: 192 KiB After Width: | Height: | Size: 192 KiB |
11
SparkleShare/Common/Images/meson.build
Normal file
|
@ -0,0 +1,11 @@
|
|||
image_files = ['tutorial-slide-1.png',
|
||||
'tutorial-slide-2.png',
|
||||
'side-splash.png',
|
||||
'about.png',
|
||||
'text-balloon.png',
|
||||
'user-icon-default.png']
|
||||
|
||||
install_data(
|
||||
sources: image_files,
|
||||
install_dir: join_paths(install_dir, 'pixmaps'))
|
||||
|
BIN
SparkleShare/Common/Images/readme-banner.png
Normal file
After Width: | Height: | Size: 134 KiB |
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 63 KiB |
Before Width: | Height: | Size: 185 KiB After Width: | Height: | Size: 185 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 27 KiB |
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 70 KiB |
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 62 KiB |
Before Width: | Height: | Size: 558 B After Width: | Height: | Size: 558 B |
|
@ -1,3 +0,0 @@
|
|||
SUBDIRS = HTML \
|
||||
Plugins \
|
||||
Pixmaps
|
39
SparkleShare/SparkleNoteController.cs → SparkleShare/Common/NoteController.cs
Executable file → Normal file
|
@ -1,5 +1,5 @@
|
|||
// SparkleShare, a collaboration and sharing tool.
|
||||
// Copyright (C) 2010 Hylke Bons <hylkebons@gmail.com>
|
||||
// Copyright (C) 2010 Hylke Bons <hi@planetpeanut.uk>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
|
@ -16,12 +16,13 @@
|
|||
|
||||
|
||||
using System;
|
||||
using System.Net;
|
||||
using System.Threading;
|
||||
|
||||
using Sparkles;
|
||||
|
||||
namespace SparkleShare {
|
||||
|
||||
public class SparkleNoteController {
|
||||
public class NoteController {
|
||||
|
||||
public event Action ShowWindowEvent = delegate { };
|
||||
public event Action HideWindowEvent = delegate { };
|
||||
|
@ -29,20 +30,16 @@ namespace SparkleShare {
|
|||
public event UpdateTitleEventDelegate UpdateTitleEvent = delegate { };
|
||||
public delegate void UpdateTitleEventDelegate (string title);
|
||||
|
||||
public string AvatarFilePath = "";
|
||||
public readonly string AvatarFilePath = "";
|
||||
public string CurrentProject { get; private set; }
|
||||
|
||||
|
||||
public SparkleNoteController ()
|
||||
public NoteController ()
|
||||
{
|
||||
Program.Controller.ShowNoteWindowEvent += delegate (string project) {
|
||||
CurrentProject = project;
|
||||
ShowWindowEvent ();
|
||||
UpdateTitleEvent (CurrentProject);
|
||||
};
|
||||
SparkleShare.Controller.ShowNoteWindowEvent += OnNoteWindowEvent;
|
||||
|
||||
AvatarFilePath = SparkleAvatars.GetAvatar (Program.Controller.CurrentUser.Email,
|
||||
48, Program.Controller.Config.FullPath);
|
||||
if (SparkleShare.Controller.AvatarsEnabled && !SparkleShare.Controller.FirstRun)
|
||||
AvatarFilePath = Avatars.GetAvatar (SparkleShare.Controller.CurrentUser.Email, 48, SparkleShare.Controller.Config.DirectoryPath, SparkleShare.Controller.AvatarsProvider);
|
||||
}
|
||||
|
||||
|
||||
|
@ -55,7 +52,7 @@ namespace SparkleShare {
|
|||
public void SyncClicked (string note)
|
||||
{
|
||||
HideWindowEvent ();
|
||||
new Thread (() => Program.Controller.GetRepoByName (CurrentProject).Resume (note)).Start ();
|
||||
new Thread (() => ResumeWithNote (note)).Start ();
|
||||
}
|
||||
|
||||
|
||||
|
@ -63,5 +60,21 @@ namespace SparkleShare {
|
|||
{
|
||||
HideWindowEvent ();
|
||||
}
|
||||
|
||||
|
||||
void OnNoteWindowEvent (string project)
|
||||
{
|
||||
CurrentProject = project;
|
||||
|
||||
ShowWindowEvent ();
|
||||
UpdateTitleEvent (CurrentProject);
|
||||
}
|
||||
|
||||
|
||||
void ResumeWithNote (string note)
|
||||
{
|
||||
BaseRepository repo = SparkleShare.Controller.GetRepoByName (CurrentProject);
|
||||
repo.Resume (note);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
dist_pixmaps_DATA = \
|
||||
side-splash.png \
|
||||
user-icon-default.png \
|
||||
text-balloon.png \
|
||||
tutorial-slide-1.png\
|
||||
tutorial-slide-2.png \
|
||||
about.png
|
||||
|
||||
pixmapsdir = $(pkgdatadir)/pixmaps/
|
||||
|
||||
MAINTAINERCLEANFILES = \
|
||||
Makefile.in
|
Before Width: | Height: | Size: 763 KiB |
|
@ -1,63 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg id="svg9662" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="24" width="24" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<defs id="defs3">
|
||||
<filter id="filter10824" height="1.2825" width="1.209" color-interpolation-filters="sRGB" y="-.14123" x="-.10449">
|
||||
<feGaussianBlur id="feGaussianBlur10826" stdDeviation="0.95917508"/>
|
||||
</filter>
|
||||
<linearGradient id="linearGradient4333" y2="34.607" gradientUnits="userSpaceOnUse" x2="-545.52" gradientTransform="translate(569,1013)" y1="28.408" x1="-557.06">
|
||||
<stop id="stop10743" stop-color="#f46e6e" offset="0"/>
|
||||
<stop id="stop10749" stop-color="#f7d478" offset=".5"/>
|
||||
<stop id="stop10745" stop-color="#f46e6e" offset="1"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient4335" y2="36.362" gradientUnits="userSpaceOnUse" x2="-551" gradientTransform="translate(569,1013)" y1="27.362" x1="-551">
|
||||
<stop id="stop10755" stop-color="#e50000" offset="0"/>
|
||||
<stop id="stop10757" stop-color="#ab0000" offset="1"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient4337" y2="28.079" gradientUnits="userSpaceOnUse" x2="-557.01" gradientTransform="translate(569,1013)" y1="34.767" x1="-568.52">
|
||||
<stop id="stop10729" stop-color="#73d216" offset="0"/>
|
||||
<stop id="stop10735" stop-color="#efff20" offset=".5"/>
|
||||
<stop id="stop10731" stop-color="#89d216" offset="1"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient4339" y2="35.858" gradientUnits="userSpaceOnUse" x2="-563.29" gradientTransform="translate(569,1013)" y1="25.486" x1="-563.29">
|
||||
<stop id="stop10719" stop-color="#4e9a06" offset="0"/>
|
||||
<stop id="stop10721" stop-color="#346704" offset="1"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient4341" y2="40.663" gradientUnits="userSpaceOnUse" x2="-549.62" gradientTransform="translate(569,1013)" y1="15.384" x1="-562.87">
|
||||
<stop id="stop10836" stop-color="#fff" offset="0"/>
|
||||
<stop id="stop10838" stop-color="#fff" stop-opacity="0" offset="1"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<metadata id="metadata4">
|
||||
<rdf:RDF>
|
||||
<cc:Work rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
|
||||
<dc:title/>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g id="layer1" transform="translate(0 -1028.4)">
|
||||
<rect id="rect10657" fill-opacity="0" height="24" width="24" y="1029.4" x=".088379"/>
|
||||
<path id="path10769" d="m-555.82 22.937-11.801 3.1974v9.6581l11.801 3.4441 10.23-3.1316v-9.9706z" transform="matrix(1.0124 0 0 1 575.75 1011.2)" filter="url(#filter10824)" fill="#2e3436"/>
|
||||
<path id="path10705" stroke-linejoin="round" d="m23.514 1034.8-10.55-3.9367-1.4805 0.054 0.007 19.914 1.509 0.017 10.514-3.1427z" stroke="url(#linearGradient4335)" fill="url(#linearGradient4333)"/>
|
||||
<path id="path10691" stroke-linejoin="round" d="m0.55806 1034.8 10.471-3.9459h1.4422l0.0365 19.989-1.4631-0.031-10.487-3.1115z" stroke="url(#linearGradient4339)" fill="url(#linearGradient4337)"/>
|
||||
<path id="path10693" d="m2 1036.4 9.0165-3.0054-0.0442 15.034l-8.972-2z" fill="#fff"/>
|
||||
<path id="rect10668" d="m5 1037 2-0.3728v8.6465l-1.9844-0.3518z" fill="#539710"/>
|
||||
<path id="rect10672" d="m3 1040.1 6.5938-0.9381v3.3314l-6.5938-0.9z" fill="#539710"/>
|
||||
<path id="path10737" d="m22.016 1036.4-9.016-3l0.0442 15.034 8.9723-2.0281z" fill="#fff"/>
|
||||
<rect id="rect10798" rx="0" ry="0" height="2" width="2" y="1030.4" x="11" fill="#85680e"/>
|
||||
<rect id="rect10800" rx="0" ry="0" height="2" width="2" y="1049.4" x="11" fill="#85680e"/>
|
||||
<rect id="rect10767" rx="0" ry="0" height="19" width="2" y="1031.4" x="11" fill="#eabe35"/>
|
||||
<rect id="rect10842" rx="0" ry="0" height="1" width="2" y="1031.4" x="11" fill="#a78312"/>
|
||||
<path id="path10810" opacity=".75" d="m12.816 1031.9-1.6843 0.01-9.6106 3.6209-0.0183 11.457 9.5022 2.8463 1.9639 0.031 9.5057-2.8861 0.0335-11.455z" stroke="url(#linearGradient4341)" stroke-width="1px" fill="none"/>
|
||||
<path id="path10830" d="m21.062 1040.1-6.5938-0.9381v3.3314l6.5938-0.8463z" fill="#dc0000"/>
|
||||
<g id="layer9" stroke-linejoin="round" transform="translate(-1687.8 -118.06)" stroke="#000" stroke-linecap="round" display="none" fill="#fff">
|
||||
<path id="path11071" opacity=".5" style="enable-background:new" d="m729.88 60.625a14.688 5.9375 0 1 1 -29.375 0 14.688 5.9375 0 1 1 29.375 0z" transform="matrix(1.2596 0 0 1.0947 -22.831 -6.3684)" display="inline" stroke-width=".85160"/>
|
||||
<path id="path11073" opacity=".5" style="enable-background:new" d="m729.88 60.625a14.688 5.9375 0 1 1 -29.375 0 14.688 5.9375 0 1 1 29.375 0z" transform="matrix(1.2596 0 0 1.0947 -22.831 -3.3684)" display="inline" stroke-width=".85160"/>
|
||||
<path id="path11075" opacity=".5" style="enable-background:new" d="m729.88 60.625a14.688 5.9375 0 1 1 -29.375 0 14.688 5.9375 0 1 1 29.375 0z" transform="matrix(1.0553 0 0 .90859 173.25 35.022)" display="inline" stroke-width="1.0212"/>
|
||||
<path id="path11084" opacity=".5" style="enable-background:new" d="m729.88 60.625a14.688 5.9375 0 1 1 -29.375 0 14.688 5.9375 0 1 1 29.375 0z" transform="matrix(1.0553 0 0 .97833 123.25 30.38)" display="inline" stroke-width=".98416"/>
|
||||
<path id="path11086" opacity=".5" style="enable-background:new" d="m729.88 60.625a14.688 5.9375 0 1 1 -29.375 0 14.688 5.9375 0 1 1 29.375 0z" transform="matrix(1.0894 0 0 .97833 98.901 27.38)" display="inline" stroke-width=".96866"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 5.5 KiB |
|
@ -1,105 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg id="svg8763" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="24.009" width="24.013" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<defs id="defs8765">
|
||||
<filter id="filter3330" height="1" width="1" color-interpolation-filters="sRGB" y="0" x="0">
|
||||
<feColorMatrix id="feColorMatrix3332" values="0" type="saturate"/>
|
||||
</filter>
|
||||
<filter id="filter4375-3-0" color-interpolation-filters="sRGB" width="1.0248" y="-.35609" x="-.012418" height="1.7122">
|
||||
<feGaussianBlur id="feGaussianBlur4377-0-0" stdDeviation="1.0664062"/>
|
||||
</filter>
|
||||
<linearGradient id="linearGradient11481">
|
||||
<stop id="stop11483" stop-color="#a04600" offset="0"/>
|
||||
<stop id="stop11485" stop-color="#ce5c00" offset="1"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient21508" y2="18.848" gradientUnits="userSpaceOnUse" x2="24.866" gradientTransform="matrix(.30890 0 0 .27375 301.94 218.48)" y1="30.385" x1="24.866">
|
||||
<stop id="stop4910-6" stop-color="#ce5c00" offset="0"/>
|
||||
<stop id="stop4912-9" stop-color="#f57900" offset="1"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient21510" y2="221.38" xlink:href="#linearGradient11481" gradientUnits="userSpaceOnUse" x2="315.29" gradientTransform="translate(0,1)" y1="232.34" x1="315.05"/>
|
||||
<radialGradient id="radialGradient21512" gradientUnits="userSpaceOnUse" cy="179.01" cx="306.1" gradientTransform="matrix(2.5489 0 0 .51730 -476.41 129.05)" r="8.6094">
|
||||
<stop id="stop4615" stop-color="#fff" offset="0"/>
|
||||
<stop id="stop4617" stop-color="#fff" stop-opacity="0" offset="1"/>
|
||||
</radialGradient>
|
||||
<linearGradient id="linearGradient21514" y2="-9.4962" gradientUnits="userSpaceOnUse" x2="25.188" gradientTransform="matrix(.28968 0 0 .17690 301.87 224.04)" y1="50.897" x1="25.188">
|
||||
<stop id="stop4991-0" stop-color="#f57900" offset="0"/>
|
||||
<stop id="stop4993-4" stop-color="#fcaf3e" offset=".060437"/>
|
||||
<stop id="stop4995-6" stop-color="#fcaf3e" offset=".17754"/>
|
||||
<stop id="stop4997-0" stop-color="#f57900" offset=".89422"/>
|
||||
<stop id="stop4999-3" stop-color="#ce5c00" offset="1"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient21516" y2="223.68" xlink:href="#linearGradient11481" gradientUnits="userSpaceOnUse" x2="314.47" y1="233.24" x1="314.49"/>
|
||||
<linearGradient id="linearGradient21518" y2="208.75" gradientUnits="userSpaceOnUse" x2="320.56" y1="184.62" x1="312.44">
|
||||
<stop id="stop4631" stop-color="#fff" offset="0"/>
|
||||
<stop id="stop4633" stop-color="#fff" stop-opacity="0" offset="1"/>
|
||||
</linearGradient>
|
||||
<radialGradient id="radialGradient21520" gradientUnits="userSpaceOnUse" cy="525.86" cx="147.02" gradientTransform="matrix(1.5869 1.2599e-7 -5.9773e-8 .75290 -86.287 85.9)" r="103.05">
|
||||
<stop id="stop4349-3-4" stop-color="#fff" offset="0"/>
|
||||
<stop id="stop16502" stop-color="#fff" stop-opacity=".49804" offset=".5"/>
|
||||
<stop id="stop4351-6-4" stop-color="#fff" stop-opacity="0" offset="1"/>
|
||||
</radialGradient>
|
||||
<linearGradient id="linearGradient21532" y2="263.79" gradientUnits="userSpaceOnUse" x2="117.64" y1="220.79" x1="117.64">
|
||||
<stop id="stop21528" stop-color="#fff" offset="0"/>
|
||||
<stop id="stop21530" stop-color="#fff" stop-opacity="0.36" offset="1"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient21612" y2="251.79" gradientUnits="userSpaceOnUse" x2="94.143" gradientTransform="translate(-333.93 -139.65)" y1="251.79" x1="70.143">
|
||||
<stop id="stop21608" stop-color="#5dbbc6" offset="0"/>
|
||||
<stop id="stop21610" stop-color="#96dadb" offset="1"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient21638" y2="112.14" gradientUnits="userSpaceOnUse" x2="-249.54" y1="112.14" x1="-263.79">
|
||||
<stop id="stop21634" stop-color="#3e3e3e" offset="0"/>
|
||||
<stop id="stop21636" stop-opacity="0" offset="1"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<metadata id="metadata8768">
|
||||
<rdf:RDF>
|
||||
<cc:Work rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
|
||||
<dc:title/>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g id="layer1" transform="translate(-474.29 -337.78)">
|
||||
<g id="g8506" transform="translate(374.14 98)">
|
||||
<rect id="rect3589" height="24" width="120" display="none" y="241.6" x="97.775" fill="#eeeeec"/>
|
||||
<rect id="rect4698" height="48" width="48" display="none" y="25.598" x="87.775" fill="#eeeeec"/>
|
||||
<rect id="rect4700" height="32" width="32" display="none" y="101.6" x="94.775" fill="#eeeeec"/>
|
||||
<rect id="rect4702" height="22" width="22" display="none" y="152.6" x="94.775" fill="#eeeeec"/>
|
||||
<rect id="rect4704" height="16" width="16" display="none" y="194.6" x="94.775" fill="#eeeeec"/>
|
||||
<rect id="rect4706" height="24" width="24" display="none" y="151.6" x="93.775" fill="#eeeeec"/>
|
||||
<rect id="rect4708" height="256" width="256" display="none" y="3.5985" x="-188.22" fill="#eeeeec"/>
|
||||
<text id="text4710" style="enable-background:new" xml:space="preserve" font-size="18.301px" display="none" y="-2.8879292" x="-187.25412" font-family="Bitstream Vera Sans" fill="#000000"><tspan id="tspan4712" x="-187.25412" y="-2.8879292">places</tspan></text>
|
||||
<text id="text4714" style="enable-background:new" line-height="125%" font-weight="bold" xml:space="preserve" font-size="18.301px" y="-2.8879292" x="-66.254158" font-family="Droid Sans" display="none" fill="#000000"><tspan id="tspan4716" x="-66.254158" y="-2.8879292">sparkleshare</tspan></text>
|
||||
<rect id="rect22378" height="22" width="22" display="none" y="152.6" x="124.78" fill="#ededed"/>
|
||||
<rect id="rect22380" height="24" width="24" display="none" y="151.6" x="123.78" fill="#ededed"/>
|
||||
<rect id="rect12657-5" style="color:#000000;enable-background:new" rx="0" ry="0" height="0" width="2" y="165.6" x="467.78" fill="#888a85"/>
|
||||
<use id="use3340" style="enable-background:new" xlink:href="#g3326" transform="translate(-203.22 225.6)" height="400" width="500" y="0" x="0"/>
|
||||
<rect id="rect20728" transform="rotate(-90)" rx="3.7196" ry="3.7196" height="22.998" width="22.998" stroke="#6196c5" stroke-linecap="round" y="100.64" x="-263.29" stroke-width="1.002" fill="url(#linearGradient21612)"/>
|
||||
<path id="path21534" opacity="0.333" d="m248.42 154.51h-6.8943s-2.6516 0.57452-3.0494-3.0494v-11.093s0.35356-1.5468 1.9446-1.9445h5.1265c1.5468 0.48614 2.0771 2.0771 2.0771 2.0771h6.8501s0.75131 0.30935 1.1049 1.1048v9.8276c-0.0442 2.1655-2.0992 3.0992-2.0992 3.0992z" transform="translate(-134.86 105.79)" stroke="#fff" stroke-width="1px" fill="none"/>
|
||||
<g id="g21596" opacity=".5">
|
||||
<path id="rect21555" opacity=".25" d="m103.14 239.79h7l2 12z"/>
|
||||
<path id="path21558" opacity=".25" d="m121.14 263.79h-7l-2-12z"/>
|
||||
<path id="path21560" opacity=".25" d="m121.14 239.79h-7l-2 12z"/>
|
||||
<path id="path21562" opacity=".25" d="m103.14 263.79h7l2-12z"/>
|
||||
<path id="path21570" opacity=".25" d="m124.14 242.79 0.00001 7-12 2z"/>
|
||||
<path id="path21572" opacity=".25" d="m100.14 260.79-0.00001-7 12-2z"/>
|
||||
<path id="path21574" opacity=".25" d="m124.14 260.79v-7l-12-2z"/>
|
||||
<path id="path21576" opacity=".25" d="m100.14 242.79 0.00001 7 12 2z"/>
|
||||
</g>
|
||||
<g id="g21498" transform="translate(9.3677 49.194)">
|
||||
<g id="g10370" style="enable-background:new" transform="translate(-208.22 -24.402)">
|
||||
<path id="path10372" style="enable-background:new" d="m304.53 220.5c-0.57203 0.064-1.0035 0.54941-1 1.125v10.344c0.00006 0.62129 0.50371 1.1249 1.125 1.125h12.719c0.62129-0.00006 1.1249-0.50371 1.125-1.125v-8.3125c-0.00006-0.62129-0.50371-1.1249-1.125-1.125h-5.8438c-0.3334 0-0.20853 0.0527-0.40625-0.21875l-0.96875-1.3438c-0.2098-0.29211-0.54661-0.46632-0.90625-0.46875h-4.5938c-0.0416-0.002-0.0834-0.002-0.125 0z" fill-rule="evenodd" stroke="url(#linearGradient21510)" fill="url(#linearGradient21508)"/>
|
||||
<path id="path10374" opacity=".4" style="enable-background:new" d="m304.62 221.44c-0.10325 0.0115-0.15688 0.0836-0.15625 0.1875v10.344c0.00001 0.11468 0.0728 0.18749 0.1875 0.1875h12.719c0.11468-0.00001 0.18749-0.0728 0.1875-0.1875v-8.3125c-0.00001-0.11468-0.0728-0.18749-0.1875-0.1875h-5.8438c-0.0587 0-0.0805-0.001-0.15625 0-0.0757 0.001-0.29559 0.0325-0.5625-0.125-0.26691-0.15754-0.34468-0.32772-0.375-0.375-0.0303-0.0473-0.0322-0.0522-0.0625-0.0937l-0.96875-1.3438c-0.0355-0.0494-0.0954-0.0933-0.15625-0.0937h-4.5938c-0.0104 0.00017-0.0208 0.00017-0.0313 0l0.00005-0.0001z" stroke="url(#radialGradient21512)" fill="none"/>
|
||||
<path id="path10377" stroke-linejoin="round" style="enable-background:new" d="m309.78 222.5c-0.2554 0-0.45965 0.13987-0.59375 0.34375-0.43264 0.54853-1.1235 1.6562-1.6562 1.6562h-2.6875c-0.83807 0-1.3437 0.5428-1.3438 1.4688v6.125c0 1.3376 0.65057 2.4062 1.4688 2.4062h12.062c0.81819 0 1.4688-1.0687 1.4688-2.4062v-8.9062c0-0.37505-0.29595-0.6875-0.65625-0.6875h-8.0625z" fill-rule="evenodd" stroke="url(#linearGradient21516)" fill="url(#linearGradient21514)"/>
|
||||
<path id="path10379" opacity=".40639" stroke-linejoin="round" style="enable-background:new" d="m310.94 183.5c-0.74659 0.74659-1.6086 2-2.4062 2h-2.6875c-0.20314 0-0.22418 0.0344-0.25 0.0625-0.0258 0.0281-0.0937 0.12531-0.0937 0.40625v7.5312h13v-10h-7.5625-0.00005z" transform="translate(-1,40)" stroke="url(#linearGradient21518)" fill="none"/>
|
||||
<path id="path10381" opacity=".71595" style="enable-background:new" d="m250.06 476.75c-0.0458 1.3355-0.49131 2.357-1.2188 3.0625-0.72744 0.70545-1.7687 1.125-3.1875 1.125h-197.25c-1.4189 0-2.4805-0.44927-3.2188-1.1562-0.73826-0.70698-1.1869-1.7049-1.2188-3.0312v3c0.03187 1.3263 0.48049 2.3243 1.2188 3.0312 0.73826 0.70698 1.7998 1.1562 3.2188 1.1562h197.25c1.4188 0 2.4601-0.41955 3.1875-1.125 0.72744-0.70545 1.1729-1.727 1.2188-3.0625v-3z" fill-rule="evenodd" transform="matrix(.065331 0 0 .29412 301.15 90.449)" filter="url(#filter4375-3-0)" fill="url(#radialGradient21520)"/>
|
||||
</g>
|
||||
<path id="path5717-2" stroke-linejoin="round" style="enable-background:new" d="m103.15 201.61c-0.1681 0.0217-0.3164 0.15386-0.3579 0.31842l-0.7155 2.1494c-0.019 0.0382-0.032 0.0777-0.039 0.11973-0.038-0.0191-0.078-0.0318-0.1196-0.0395h-2.1866c-0.1222 0-0.2415 0.0637-0.3181 0.15921-0.1612 0.18061-0.1208 0.50107 0.079 0.63685l1.7891 1.3136 0.038 0.19106-0.6757 2.1095c-0.094 0.32925 0.3466 0.66015 0.6361 0.47763l1.7889-1.3134h0.229l1.7891 1.3134c0.1556 0.1019 0.3785 0.0841 0.5167-0.0395 0.1171-0.10827 0.1659-0.28518 0.1196-0.4379l-0.6759-2.1095c-0.064-0.0127 0.025-0.12737 0.038-0.19105l1.7889-1.3136c0.2004-0.13577 0.2401-0.45623 0.079-0.63684-0.076-0.0955-0.1958-0.15526-0.318-0.15921h-2.2264c-0.042 0.0127-0.081 0.0204-0.1196 0.0395-0.013-0.042-0.02-0.0815-0.039-0.11973l-0.6759-2.1493c-0.02-0.0752-0.062-0.14546-0.1196-0.19908-0.084-0.0815-0.2016-0.1261-0.318-0.11973l0.014 0.00013-0.0006 0.00001z" stroke="#c66f11" stroke-linecap="round" fill="none"/>
|
||||
<path id="path5717" stroke-linejoin="round" style="enable-background:new" d="m103.15 200.61c-0.1681 0.0217-0.3164 0.15386-0.3579 0.31842l-0.7155 2.1494c-0.019 0.0382-0.032 0.0777-0.039 0.11973-0.038-0.0191-0.078-0.0318-0.1196-0.0395h-2.1866c-0.1222 0-0.2415 0.0637-0.3181 0.15921-0.1612 0.18061-0.1208 0.50107 0.079 0.63685l1.7891 1.3136 0.038 0.19106-0.6757 2.1095c-0.094 0.32925 0.3466 0.66015 0.6361 0.47763l1.7889-1.3134h0.229l1.7891 1.3134c0.1556 0.1019 0.3785 0.0841 0.5167-0.0395 0.1171-0.10827 0.1659-0.28518 0.1196-0.4379l-0.6759-2.1095c-0.064-0.0127 0.025-0.12737 0.038-0.19105l1.7889-1.3136c0.2004-0.13577 0.2401-0.45623 0.079-0.63684-0.076-0.0955-0.1958-0.15526-0.318-0.15921h-2.2264c-0.042 0.0127-0.081 0.0204-0.1196 0.0395-0.013-0.042-0.02-0.0815-0.039-0.11973l-0.6759-2.1493c-0.02-0.0752-0.062-0.14546-0.1196-0.19908-0.084-0.0815-0.2016-0.1261-0.318-0.11973l0.014 0.00013-0.0006 0.00001z" stroke="#fff" stroke-linecap="round" fill="none"/>
|
||||
</g>
|
||||
<rect id="rect21524" opacity=".83759" rx="2.8127" ry="2.8127" height="20.998" width="20.998" stroke="url(#linearGradient21532)" stroke-linecap="round" y="241.29" x="101.64" stroke-width="1.002" fill="none"/>
|
||||
<rect id="rect21630" opacity="0.33" ry="3.9071" rx="3.9071" transform="rotate(-90)" height="22.998" width="22.998" stroke="url(#linearGradient21638)" stroke-linecap="round" y="100.64" x="-263.29" stroke-width="1.002" fill="none"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 12 KiB |
|
@ -1,18 +0,0 @@
|
|||
dist_plugins_DATA = \
|
||||
bitbucket.xml \
|
||||
github.xml \
|
||||
gitorious.xml \
|
||||
ssnet.xml \
|
||||
own-server.xml \
|
||||
planio.xml \
|
||||
github.png \
|
||||
gitorious.png \
|
||||
bitbucket.png \
|
||||
ssnet.png \
|
||||
planio.png \
|
||||
own-server.png
|
||||
|
||||
pluginsdir = $(pkgdatadir)/plugins/
|
||||
|
||||
MAINTAINERCLEANFILES = \
|
||||
Makefile.in
|
Before Width: | Height: | Size: 1.2 KiB |
|
@ -1,20 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<sparkleshare>
|
||||
<plugin>
|
||||
<info>
|
||||
<name>Gitorious</name>
|
||||
<description>Open source infrastructure for hosting open source projects</description>
|
||||
<icon>gitorious.png</icon>
|
||||
<backend>Git</backend>
|
||||
<fingerprint>7e:af:8d:ec:f0:39:5e:ba:52:16:ce:19:fa:d4:b8:7d</fingerprint>
|
||||
</info>
|
||||
<address>
|
||||
<value>ssh://git@gitorious.org/</value>
|
||||
<example/>
|
||||
</address>
|
||||
<path>
|
||||
<value/>
|
||||
<example>/project/repository</example>
|
||||
</path>
|
||||
</plugin>
|
||||
</sparkleshare>
|
Before Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 3.2 KiB |
|
@ -1,21 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<sparkleshare>
|
||||
<plugin>
|
||||
<info>
|
||||
<name>Planio</name>
|
||||
<description>500MB of unlimited free hosted Git repos and project management</description>
|
||||
<icon>planio.png</icon>
|
||||
<backend>Git</backend>
|
||||
<fingerprint>77:d1:54:d7:33:7e:38:43:40:70:ca:2d:3a:24:05:22</fingerprint>
|
||||
<announcements_url>tcp://sparkleshare-notifications.plan.io:443</announcements_url>
|
||||
</info>
|
||||
<address>
|
||||
<value/>
|
||||
<example>ssh://git@[account].plan.io</example>
|
||||
</address>
|
||||
<path>
|
||||
<value/>
|
||||
<example>/[account]-[project].git</example>
|
||||
</path>
|
||||
</plugin>
|
||||
</sparkleshare>
|
Before Width: | Height: | Size: 4.5 KiB |
Before Width: | Height: | Size: 1.4 KiB |
|
@ -1,19 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<sparkleshare>
|
||||
<plugin>
|
||||
<info>
|
||||
<name>SparkleShare.Net</name>
|
||||
<description>The easiest way to share projects with SparkleShare</description>
|
||||
<icon>ssnet.png</icon>
|
||||
<backend>Git</backend>
|
||||
</info>
|
||||
<address>
|
||||
<value>ssh://storage@sparkleshare.net/</value>
|
||||
<example/>
|
||||
</address>
|
||||
<path>
|
||||
<value/>
|
||||
<example>/username/project</example>
|
||||
</path>
|
||||
</plugin>
|
||||
</sparkleshare>
|
Before Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
@ -1,12 +1,12 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<sparkleshare>
|
||||
<plugin>
|
||||
<preset>
|
||||
<info>
|
||||
<name>Bitbucket</name>
|
||||
<description>Free code hosting for Git and Mercurial</description>
|
||||
<icon>bitbucket.png</icon>
|
||||
<backend>Git</backend>
|
||||
<fingerprint>97:8c:1b:f2:6f:14:6b:5c:3b:ec:aa:46:46:74:7c:40</fingerprint>
|
||||
<fingerprint>4c:eb:19:11:0d:d6:19:65:7b:6a:40:8a:fb:b7:4d:51:81:a1:7a:07:74:4a:b5:22:0c:91:86:42:74:88:9b:bc</fingerprint>
|
||||
</info>
|
||||
<address>
|
||||
<value>ssh://git@bitbucket.org/</value>
|
||||
|
@ -17,5 +17,5 @@
|
|||
<example>/username/project</example>
|
||||
<uses_lower_case>True</uses_lower_case>
|
||||
</path>
|
||||
</plugin>
|
||||
</preset>
|
||||
</sparkleshare>
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
|
@ -1,12 +1,13 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<sparkleshare>
|
||||
<plugin>
|
||||
<preset>
|
||||
<info>
|
||||
<name>GitHub</name>
|
||||
<description>Collaborate on projects hosted on GitHub</description>
|
||||
<description>The biggest collection of Open Source projects</description>
|
||||
<icon>github.png</icon>
|
||||
<backend>Git</backend>
|
||||
<fingerprint>16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48</fingerprint>
|
||||
<storage_type>LargeFiles</storage_type>
|
||||
<fingerprint>92:a3:7f:bd:5e:21:a5:3a:95:c7:16:e1:14:4f:44:2f:58:2b:94:d0:fa:fc:67:3e:b6:71:7a:4e:b5:1a:88:a7</fingerprint>
|
||||
</info>
|
||||
<address>
|
||||
<value>ssh://git@github.com/</value>
|
||||
|
@ -16,5 +17,5 @@
|
|||
<value/>
|
||||
<example>/username/project</example>
|
||||
</path>
|
||||
</plugin>
|
||||
</preset>
|
||||
</sparkleshare>
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
BIN
SparkleShare/Common/Presets/gitlab.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
21
SparkleShare/Common/Presets/gitlab.xml
Normal file
|
@ -0,0 +1,21 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<sparkleshare>
|
||||
<preset>
|
||||
<info>
|
||||
<name>GitLab</name>
|
||||
<description>Open Source alternative to GitHub</description>
|
||||
<icon>gitlab.png</icon>
|
||||
<backend>Git</backend>
|
||||
<fingerprint>44:e4:05:bc:f4:e1:1a:b5:b8:46:e5:8b:a0:bf:6d:ab:d2:3d:cc:9e:36:7c:ae:17:cb:0c:91:b5:b3:b3:fc:44</fingerprint>
|
||||
</info>
|
||||
<address>
|
||||
<value>ssh://git@gitlab.com/</value>
|
||||
<example/>
|
||||
</address>
|
||||
<path>
|
||||
<value/>
|
||||
<example>/username/project</example>
|
||||
</path>
|
||||
</preset>
|
||||
</sparkleshare>
|
||||
|
BIN
SparkleShare/Common/Presets/gitlab@2x.png
Normal file
After Width: | Height: | Size: 2.9 KiB |
10
SparkleShare/Common/Presets/meson.build
Normal file
|
@ -0,0 +1,10 @@
|
|||
preset_files = ['github.xml', 'github.png',
|
||||
'gitlab.xml', 'gitlab.png',
|
||||
'bitbucket.xml', 'bitbucket.png',
|
||||
'own-server.xml', 'own-server.png'
|
||||
]
|
||||
|
||||
install_data(
|
||||
sources: preset_files,
|
||||
install_dir: join_paths(install_dir, 'presets'))
|
||||
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
@ -1,8 +1,8 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<sparkleshare>
|
||||
<plugin>
|
||||
<preset>
|
||||
<info>
|
||||
<name>On my own server</name>
|
||||
<name>Own server</name>
|
||||
<description>Everything under my control</description>
|
||||
<icon>own-server.png</icon>
|
||||
<backend>Git</backend>
|
||||
|
@ -15,5 +15,6 @@
|
|||
<value/>
|
||||
<example>/path/to/project</example>
|
||||
</path>
|
||||
</plugin>
|
||||
</preset>
|
||||
</sparkleshare>
|
||||
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.4 KiB |
264
SparkleShare/SparkleSetupController.cs → SparkleShare/Common/SetupController.cs
Executable file → Normal file
|
@ -1,5 +1,5 @@
|
|||
// SparkleShare, a collaboration and sharing tool.
|
||||
// Copyright (C) 2010 Hylke Bons <hylkebons@gmail.com>
|
||||
// Copyright (C) 2010 Hylke Bons <hi@planetpeanut.uk>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
|
@ -21,7 +21,7 @@ using System.IO;
|
|||
using System.Text.RegularExpressions;
|
||||
using System.Threading;
|
||||
|
||||
using SparkleLib;
|
||||
using Sparkles;
|
||||
|
||||
namespace SparkleShare {
|
||||
|
||||
|
@ -33,7 +33,7 @@ namespace SparkleShare {
|
|||
Syncing,
|
||||
Error,
|
||||
Finished,
|
||||
Tutorial,
|
||||
StorageSetup,
|
||||
CryptoSetup,
|
||||
CryptoPassword
|
||||
}
|
||||
|
@ -44,7 +44,7 @@ namespace SparkleShare {
|
|||
}
|
||||
|
||||
|
||||
public class SparkleSetupController {
|
||||
public class SetupController {
|
||||
|
||||
public event Action ShowWindowEvent = delegate { };
|
||||
public event Action HideWindowEvent = delegate { };
|
||||
|
@ -53,7 +53,7 @@ namespace SparkleShare {
|
|||
public delegate void ChangePageEventHandler (PageType page, string [] warnings);
|
||||
|
||||
public event UpdateProgressBarEventHandler UpdateProgressBarEvent = delegate { };
|
||||
public delegate void UpdateProgressBarEventHandler (double percentage, string speed);
|
||||
public delegate void UpdateProgressBarEventHandler (double percentage, string information);
|
||||
|
||||
public event UpdateSetupContinueButtonEventHandler UpdateSetupContinueButtonEvent = delegate { };
|
||||
public delegate void UpdateSetupContinueButtonEventHandler (bool button_enabled);
|
||||
|
@ -73,12 +73,11 @@ namespace SparkleShare {
|
|||
public event ChangePathFieldEventHandler ChangePathFieldEvent = delegate { };
|
||||
public delegate void ChangePathFieldEventHandler (string text, string example_text, FieldState state);
|
||||
|
||||
public readonly List<SparklePlugin> Plugins = new List<SparklePlugin> ();
|
||||
public SparklePlugin SelectedPlugin;
|
||||
public readonly List<Preset> Presets = new List<Preset> ();
|
||||
public Preset SelectedPreset;
|
||||
|
||||
public bool WindowIsOpen { get; private set; }
|
||||
public SparkleInvite PendingInvite { get; private set; }
|
||||
public int TutorialPageNumber { get; private set; }
|
||||
public string PreviousUrl { get; private set; }
|
||||
public string PreviousAddress { get; private set; }
|
||||
public string PreviousPath { get; private set; }
|
||||
|
@ -86,9 +85,9 @@ namespace SparkleShare {
|
|||
public double ProgressBarPercentage { get; private set; }
|
||||
|
||||
|
||||
public int SelectedPluginIndex {
|
||||
public int SelectedPresetIndex {
|
||||
get {
|
||||
return Plugins.IndexOf (SelectedPlugin);
|
||||
return Presets.IndexOf (SelectedPreset);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -101,61 +100,56 @@ namespace SparkleShare {
|
|||
private PageType current_page;
|
||||
private string saved_address = "";
|
||||
private string saved_remote_path = "";
|
||||
private bool create_startup_item = true;
|
||||
private bool fetch_prior_history = false;
|
||||
|
||||
|
||||
public SparkleSetupController ()
|
||||
public SetupController ()
|
||||
{
|
||||
ChangePageEvent += delegate (PageType page_type, string [] warnings) {
|
||||
this.current_page = page_type;
|
||||
};
|
||||
|
||||
TutorialPageNumber = 0;
|
||||
PreviousAddress = "";
|
||||
PreviousPath = "";
|
||||
PreviousUrl = "";
|
||||
SyncingFolder = "";
|
||||
|
||||
string local_plugins_path = SparklePlugin.LocalPluginsPath;
|
||||
int local_plugins_count = 0;
|
||||
string local_presets_path = Preset.LocalPresetsPath;
|
||||
int local_presets_count = 0;
|
||||
|
||||
// Import all of the plugins
|
||||
if (Directory.Exists (local_plugins_path))
|
||||
// Local plugins go first...
|
||||
foreach (string xml_file_path in Directory.GetFiles (local_plugins_path, "*.xml")) {
|
||||
Plugins.Add (new SparklePlugin (xml_file_path));
|
||||
local_plugins_count++;
|
||||
// Import all of the presets
|
||||
if (Directory.Exists (local_presets_path))
|
||||
// Local presets go first...
|
||||
foreach (string xml_file_path in Directory.GetFiles (local_presets_path, "*.xml")) {
|
||||
Presets.Add (new Preset (xml_file_path));
|
||||
local_presets_count++;
|
||||
}
|
||||
|
||||
// ...system plugins after that...
|
||||
if (Directory.Exists (Program.Controller.PluginsPath)) {
|
||||
foreach (string xml_file_path in Directory.GetFiles (Program.Controller.PluginsPath, "*.xml")) {
|
||||
// ...system presets after that...
|
||||
if (Directory.Exists (SparkleShare.Controller.PresetsPath)) {
|
||||
foreach (string xml_file_path in Directory.GetFiles (SparkleShare.Controller.PresetsPath, "*.xml")) {
|
||||
// ...and "Own server" at the very top
|
||||
if (xml_file_path.EndsWith ("own-server.xml")) {
|
||||
Plugins.Insert (0, new SparklePlugin (xml_file_path));
|
||||
|
||||
} else if (xml_file_path.EndsWith ("ssnet.xml")) {
|
||||
// Plugins.Insert ((local_plugins_count + 1), new SparklePlugin (xml_file_path));
|
||||
// TODO: Skip this plugin for now
|
||||
|
||||
} else {
|
||||
Plugins.Add (new SparklePlugin (xml_file_path));
|
||||
}
|
||||
if (xml_file_path.EndsWith ("own-server.xml"))
|
||||
Presets.Insert (0, new Preset (xml_file_path));
|
||||
else
|
||||
Presets.Add (new Preset (xml_file_path));
|
||||
}
|
||||
}
|
||||
|
||||
SelectedPlugin = Plugins [0];
|
||||
SelectedPreset = Presets [0];
|
||||
|
||||
Program.Controller.InviteReceived += delegate (SparkleInvite invite) {
|
||||
SparkleShare.Controller.InviteReceived += delegate (SparkleInvite invite) {
|
||||
PendingInvite = invite;
|
||||
|
||||
ChangePageEvent (PageType.Invite, null);
|
||||
ShowWindowEvent ();
|
||||
};
|
||||
|
||||
Program.Controller.ShowSetupWindowEvent += delegate (PageType page_type) {
|
||||
if (page_type == PageType.CryptoSetup || page_type == PageType.CryptoPassword) {
|
||||
SparkleShare.Controller.ShowSetupWindowEvent += delegate (PageType page_type) {
|
||||
if (page_type == PageType.StorageSetup ||
|
||||
page_type == PageType.CryptoSetup ||
|
||||
page_type == PageType.CryptoPassword) {
|
||||
|
||||
ChangePageEvent (page_type, null);
|
||||
return;
|
||||
}
|
||||
|
@ -184,7 +178,7 @@ namespace SparkleShare {
|
|||
ChangePageEvent (PageType.Add, null);
|
||||
}
|
||||
|
||||
} else if (!Program.Controller.FirstRun && TutorialPageNumber == 0) {
|
||||
} else if (!SparkleShare.Controller.FirstRun) {
|
||||
WindowIsOpen = true;
|
||||
ChangePageEvent (PageType.Add, null);
|
||||
}
|
||||
|
@ -203,7 +197,7 @@ namespace SparkleShare {
|
|||
public void PageCancelled ()
|
||||
{
|
||||
PendingInvite = null;
|
||||
SelectedPlugin = Plugins [0];
|
||||
SelectedPreset = Presets [0];
|
||||
|
||||
PreviousAddress = "";
|
||||
PreviousPath = "";
|
||||
|
@ -230,70 +224,44 @@ namespace SparkleShare {
|
|||
|
||||
public void SetupPageCancelled ()
|
||||
{
|
||||
Program.Controller.Quit ();
|
||||
SparkleShare.Controller.Quit ();
|
||||
}
|
||||
|
||||
|
||||
public void SetupPageCompleted (string full_name, string email)
|
||||
{
|
||||
Program.Controller.CurrentUser = new SparkleUser (full_name, email);
|
||||
SparkleShare.Controller.CurrentUser = new User (full_name, email);
|
||||
new Thread (() => SparkleShare.Controller.CreateStartupItem ()).Start ();
|
||||
|
||||
TutorialPageNumber = 1;
|
||||
ChangePageEvent (PageType.Tutorial, null);
|
||||
ChangePageEvent (PageType.Add, null);
|
||||
}
|
||||
|
||||
|
||||
public void TutorialSkipped ()
|
||||
{
|
||||
TutorialPageNumber = 4;
|
||||
ChangePageEvent (PageType.Tutorial, null);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void HistoryItemChanged (bool fetch_prior_history)
|
||||
{
|
||||
this.fetch_prior_history = fetch_prior_history;
|
||||
}
|
||||
|
||||
|
||||
public void TutorialPageCompleted ()
|
||||
public void SelectedPresetChanged (int preset_index)
|
||||
{
|
||||
TutorialPageNumber++;
|
||||
SelectedPreset = Presets [preset_index];
|
||||
|
||||
if (TutorialPageNumber == 5) {
|
||||
TutorialPageNumber = 0;
|
||||
if (SelectedPreset.Address != null) {
|
||||
ChangeAddressFieldEvent (SelectedPreset.Address, "", FieldState.Disabled);
|
||||
|
||||
WindowIsOpen = false;
|
||||
HideWindowEvent ();
|
||||
|
||||
if (this.create_startup_item)
|
||||
new Thread (() => Program.Controller.CreateStartupItem ()).Start ();
|
||||
|
||||
} else {
|
||||
ChangePageEvent (PageType.Tutorial, null);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void SelectedPluginChanged (int plugin_index)
|
||||
{
|
||||
SelectedPlugin = Plugins [plugin_index];
|
||||
|
||||
if (SelectedPlugin.Address != null) {
|
||||
ChangeAddressFieldEvent (SelectedPlugin.Address, "", FieldState.Disabled);
|
||||
|
||||
} else if (SelectedPlugin.AddressExample != null) {
|
||||
ChangeAddressFieldEvent (this.saved_address, SelectedPlugin.AddressExample, FieldState.Enabled);
|
||||
} else if (SelectedPreset.AddressExample != null) {
|
||||
ChangeAddressFieldEvent (this.saved_address, SelectedPreset.AddressExample, FieldState.Enabled);
|
||||
|
||||
} else {
|
||||
ChangeAddressFieldEvent (this.saved_address, "", FieldState.Enabled);
|
||||
}
|
||||
|
||||
if (SelectedPlugin.Path != null) {
|
||||
ChangePathFieldEvent (SelectedPlugin.Path, "", FieldState.Disabled);
|
||||
if (SelectedPreset.Path != null) {
|
||||
ChangePathFieldEvent (SelectedPreset.Path, "", FieldState.Disabled);
|
||||
|
||||
} else if (SelectedPlugin.PathExample != null) {
|
||||
ChangePathFieldEvent (this.saved_remote_path, SelectedPlugin.PathExample, FieldState.Enabled);
|
||||
} else if (SelectedPreset.PathExample != null) {
|
||||
ChangePathFieldEvent (this.saved_remote_path, SelectedPreset.PathExample, FieldState.Enabled);
|
||||
|
||||
} else {
|
||||
ChangePathFieldEvent (this.saved_remote_path, "", FieldState.Enabled);
|
||||
|
@ -301,18 +269,12 @@ namespace SparkleShare {
|
|||
}
|
||||
|
||||
|
||||
public void StartupItemChanged (bool create_startup_item)
|
||||
{
|
||||
this.create_startup_item = create_startup_item;
|
||||
}
|
||||
|
||||
|
||||
public void CheckAddPage (string address, string remote_path, int selected_plugin)
|
||||
public void CheckAddPage (string address, string remote_path, int selected_preset)
|
||||
{
|
||||
address = address.Trim ();
|
||||
remote_path = remote_path.Trim ();
|
||||
|
||||
if (selected_plugin == 0)
|
||||
if (selected_preset == 0)
|
||||
this.saved_address = address;
|
||||
|
||||
this.saved_remote_path = remote_path;
|
||||
|
@ -331,8 +293,7 @@ namespace SparkleShare {
|
|||
if (remote_path.EndsWith (".git"))
|
||||
SyncingFolder = remote_path.Substring (0, remote_path.Length - 4);
|
||||
|
||||
SyncingFolder = SyncingFolder.Replace ("-crypto", "");
|
||||
SyncingFolder = SyncingFolder.ReplaceUnderscoreWithSpace ();
|
||||
SyncingFolder = SyncingFolder.ReplaceUnderscoreWithSpace ();
|
||||
ProgressBarPercentage = 1.0;
|
||||
|
||||
ChangePageEvent (PageType.Syncing, null);
|
||||
|
@ -341,26 +302,26 @@ namespace SparkleShare {
|
|||
remote_path = remote_path.Trim ();
|
||||
remote_path = remote_path.TrimEnd ("/".ToCharArray ());
|
||||
|
||||
if (SelectedPlugin.PathUsesLowerCase)
|
||||
if (SelectedPreset.PathUsesLowerCase)
|
||||
remote_path = remote_path.ToLower ();
|
||||
|
||||
PreviousAddress = address;
|
||||
PreviousPath = remote_path;
|
||||
|
||||
Program.Controller.FolderFetched += AddPageFetchedDelegate;
|
||||
Program.Controller.FolderFetchError += AddPageFetchErrorDelegate;
|
||||
Program.Controller.FolderFetching += SyncingPageFetchingDelegate;
|
||||
SparkleShare.Controller.FolderFetched += AddPageFetchedDelegate;
|
||||
SparkleShare.Controller.FolderFetchError += AddPageFetchErrorDelegate;
|
||||
SparkleShare.Controller.FolderFetching += SyncingPageFetchingDelegate;
|
||||
|
||||
SparkleFetcherInfo info = new SparkleFetcherInfo {
|
||||
Address = address,
|
||||
Fingerprint = SelectedPlugin.Fingerprint,
|
||||
Fingerprint = SelectedPreset.Fingerprint,
|
||||
RemotePath = remote_path,
|
||||
FetchPriorHistory = this.fetch_prior_history,
|
||||
AnnouncementsUrl = SelectedPlugin.AnnouncementsUrl,
|
||||
Backend = SelectedPlugin.Backend
|
||||
AnnouncementsUrl = SelectedPreset.AnnouncementsUrl,
|
||||
Backend = SelectedPreset.Backend
|
||||
};
|
||||
|
||||
new Thread (() => { Program.Controller.StartFetcher (info); }).Start ();
|
||||
new Thread (() => { SparkleShare.Controller.StartFetcher (info); }).Start ();
|
||||
}
|
||||
|
||||
// The following private methods are
|
||||
|
@ -370,31 +331,31 @@ namespace SparkleShare {
|
|||
{
|
||||
SyncingFolder = "";
|
||||
|
||||
// Create a local plugin for succesfully added projects, so
|
||||
// Create a local preset for succesfully added projects, so
|
||||
// so the user can easily use the same host again
|
||||
if (SelectedPluginIndex == 0) {
|
||||
SparklePlugin new_plugin;
|
||||
if (SelectedPresetIndex == 0) {
|
||||
Preset new_preset;
|
||||
Uri uri = new Uri (remote_url);
|
||||
|
||||
try {
|
||||
string address = remote_url.Replace (uri.AbsolutePath, "");
|
||||
new_plugin = SparklePlugin.Create (uri.Host, address, address, "", "", "/path/to/project");
|
||||
new_preset = Preset.Create (uri.Host, address, address, "", "", "/path/to/project");
|
||||
|
||||
if (new_plugin != null) {
|
||||
Plugins.Insert (1, new_plugin);
|
||||
SparkleLogger.LogInfo ("Controller", "Added plugin for " + uri.Host);
|
||||
if (new_preset != null) {
|
||||
Presets.Insert (1, new_preset);
|
||||
Logger.LogInfo ("Controller", "Added preset for " + uri.Host);
|
||||
}
|
||||
|
||||
} catch {
|
||||
SparkleLogger.LogInfo ("Controller", "Failed adding plugin for " + uri.Host);
|
||||
} catch (Exception e) {
|
||||
Logger.LogInfo ("Controller", "Failed adding preset for " + uri.Host, e);
|
||||
}
|
||||
}
|
||||
|
||||
ChangePageEvent (PageType.Finished, warnings);
|
||||
|
||||
Program.Controller.FolderFetched -= AddPageFetchedDelegate;
|
||||
Program.Controller.FolderFetchError -= AddPageFetchErrorDelegate;
|
||||
Program.Controller.FolderFetching -= SyncingPageFetchingDelegate;
|
||||
SparkleShare.Controller.FolderFetched -= AddPageFetchedDelegate;
|
||||
SparkleShare.Controller.FolderFetchError -= AddPageFetchErrorDelegate;
|
||||
SparkleShare.Controller.FolderFetching -= SyncingPageFetchingDelegate;
|
||||
}
|
||||
|
||||
private void AddPageFetchErrorDelegate (string remote_url, string [] errors)
|
||||
|
@ -404,19 +365,19 @@ namespace SparkleShare {
|
|||
|
||||
ChangePageEvent (PageType.Error, errors);
|
||||
|
||||
Program.Controller.FolderFetched -= AddPageFetchedDelegate;
|
||||
Program.Controller.FolderFetchError -= AddPageFetchErrorDelegate;
|
||||
Program.Controller.FolderFetching -= SyncingPageFetchingDelegate;
|
||||
SparkleShare.Controller.FolderFetched -= AddPageFetchedDelegate;
|
||||
SparkleShare.Controller.FolderFetchError -= AddPageFetchErrorDelegate;
|
||||
SparkleShare.Controller.FolderFetching -= SyncingPageFetchingDelegate;
|
||||
}
|
||||
|
||||
private void SyncingPageFetchingDelegate (double percentage, double speed)
|
||||
private void SyncingPageFetchingDelegate (double percentage, double speed ,string information)
|
||||
{
|
||||
ProgressBarPercentage = percentage;
|
||||
|
||||
if (speed == 0.0)
|
||||
UpdateProgressBarEvent (ProgressBarPercentage, "");
|
||||
else
|
||||
UpdateProgressBarEvent (ProgressBarPercentage, "Fetching files… " + speed.ToSize () + "/s");
|
||||
if (speed > 0)
|
||||
information = speed.ToSize () + " – " + information;
|
||||
|
||||
UpdateProgressBarEvent (ProgressBarPercentage, information);
|
||||
}
|
||||
|
||||
|
||||
|
@ -427,7 +388,6 @@ namespace SparkleShare {
|
|||
if (PendingInvite.RemotePath.EndsWith (".git"))
|
||||
SyncingFolder = PendingInvite.RemotePath.Substring (0, PendingInvite.RemotePath.Length - 4);
|
||||
|
||||
SyncingFolder = SyncingFolder.Replace ("-crypto", "");
|
||||
SyncingFolder = SyncingFolder.ReplaceUnderscoreWithSpace ();
|
||||
PreviousAddress = PendingInvite.Address;
|
||||
PreviousPath = PendingInvite.RemotePath;
|
||||
|
@ -435,15 +395,15 @@ namespace SparkleShare {
|
|||
ChangePageEvent (PageType.Syncing, null);
|
||||
|
||||
new Thread (() => {
|
||||
if (!PendingInvite.Accept (Program.Controller.CurrentUser.PublicKey)) {
|
||||
if (!PendingInvite.Accept (SparkleShare.Controller.UserAuthenticationInfo.PublicKey)) {
|
||||
PreviousUrl = PendingInvite.Address + PendingInvite.RemotePath.TrimStart ("/".ToCharArray ());
|
||||
ChangePageEvent (PageType.Error, new string [] { "error: Failed to upload the public key" });
|
||||
return;
|
||||
}
|
||||
|
||||
Program.Controller.FolderFetched += InvitePageFetchedDelegate;
|
||||
Program.Controller.FolderFetchError += InvitePageFetchErrorDelegate;
|
||||
Program.Controller.FolderFetching += SyncingPageFetchingDelegate;
|
||||
SparkleShare.Controller.FolderFetched += InvitePageFetchedDelegate;
|
||||
SparkleShare.Controller.FolderFetchError += InvitePageFetchErrorDelegate;
|
||||
SparkleShare.Controller.FolderFetching += SyncingPageFetchingDelegate;
|
||||
|
||||
SparkleFetcherInfo info = new SparkleFetcherInfo {
|
||||
Address = PendingInvite.Address,
|
||||
|
@ -453,7 +413,7 @@ namespace SparkleShare {
|
|||
AnnouncementsUrl = PendingInvite.AnnouncementsUrl
|
||||
};
|
||||
|
||||
Program.Controller.StartFetcher (info);
|
||||
SparkleShare.Controller.StartFetcher (info);
|
||||
|
||||
}).Start ();
|
||||
}
|
||||
|
@ -468,9 +428,9 @@ namespace SparkleShare {
|
|||
|
||||
ChangePageEvent (PageType.Finished, warnings);
|
||||
|
||||
Program.Controller.FolderFetched -= AddPageFetchedDelegate;
|
||||
Program.Controller.FolderFetchError -= AddPageFetchErrorDelegate;
|
||||
Program.Controller.FolderFetching -= SyncingPageFetchingDelegate;
|
||||
SparkleShare.Controller.FolderFetched -= AddPageFetchedDelegate;
|
||||
SparkleShare.Controller.FolderFetchError -= AddPageFetchErrorDelegate;
|
||||
SparkleShare.Controller.FolderFetching -= SyncingPageFetchingDelegate;
|
||||
}
|
||||
|
||||
private void InvitePageFetchErrorDelegate (string remote_url, string [] errors)
|
||||
|
@ -480,15 +440,15 @@ namespace SparkleShare {
|
|||
|
||||
ChangePageEvent (PageType.Error, errors);
|
||||
|
||||
Program.Controller.FolderFetched -= AddPageFetchedDelegate;
|
||||
Program.Controller.FolderFetchError -= AddPageFetchErrorDelegate;
|
||||
Program.Controller.FolderFetching -= SyncingPageFetchingDelegate;
|
||||
SparkleShare.Controller.FolderFetched -= AddPageFetchedDelegate;
|
||||
SparkleShare.Controller.FolderFetchError -= AddPageFetchErrorDelegate;
|
||||
SparkleShare.Controller.FolderFetching -= SyncingPageFetchingDelegate;
|
||||
}
|
||||
|
||||
|
||||
public void SyncingCancelled ()
|
||||
{
|
||||
Program.Controller.StopFetcher ();
|
||||
SparkleShare.Controller.StopFetcher ();
|
||||
|
||||
if (PendingInvite != null)
|
||||
ChangePageEvent (PageType.Invite, null);
|
||||
|
@ -506,6 +466,24 @@ namespace SparkleShare {
|
|||
}
|
||||
|
||||
|
||||
public void StoragePageCompleted (StorageType storage_type)
|
||||
{
|
||||
if (storage_type == StorageType.Encrypted) {
|
||||
ChangePageEvent (PageType.CryptoSetup, null);
|
||||
return;
|
||||
}
|
||||
|
||||
ProgressBarPercentage = 100.0;
|
||||
ChangePageEvent (PageType.Syncing, null);
|
||||
|
||||
new Thread (() => {
|
||||
Thread.Sleep (1000);
|
||||
SparkleShare.Controller.FinishFetcher (storage_type);
|
||||
|
||||
}).Start ();
|
||||
}
|
||||
|
||||
|
||||
public void CheckCryptoSetupPage (string password)
|
||||
{
|
||||
new Thread (() => {
|
||||
|
@ -517,7 +495,7 @@ namespace SparkleShare {
|
|||
|
||||
public void CheckCryptoPasswordPage (string password)
|
||||
{
|
||||
bool is_password_correct = Program.Controller.CheckPassword (password);
|
||||
bool is_password_correct = SparkleShare.Controller.CheckPassword (password);
|
||||
UpdateCryptoPasswordContinueButtonEvent (is_password_correct);
|
||||
}
|
||||
|
||||
|
@ -541,7 +519,7 @@ namespace SparkleShare {
|
|||
|
||||
new Thread (() => {
|
||||
Thread.Sleep (1000);
|
||||
Program.Controller.FinishFetcher (password);
|
||||
SparkleShare.Controller.FinishFetcher (StorageType.Encrypted, password);
|
||||
|
||||
}).Start ();
|
||||
}
|
||||
|
@ -549,29 +527,23 @@ namespace SparkleShare {
|
|||
|
||||
public void CopyToClipboardClicked ()
|
||||
{
|
||||
Program.Controller.CopyToClipboard (Program.Controller.CurrentUser.PublicKey);
|
||||
SparkleShare.Controller.CopyToClipboard (SparkleShare.Controller.UserAuthenticationInfo.PublicKey);
|
||||
}
|
||||
|
||||
|
||||
public void ShowFilesClicked ()
|
||||
{
|
||||
string folder_name = Path.GetFileName (PreviousPath);
|
||||
folder_name = folder_name.ReplaceUnderscoreWithSpace ();
|
||||
string folder_name = Path.GetFileNameWithoutExtension (PreviousPath);
|
||||
folder_name = folder_name.ReplaceUnderscoreWithSpace ();
|
||||
|
||||
if (PreviousPath.EndsWith ("-crypto"))
|
||||
folder_name = folder_name.Replace ("-crypto", "");
|
||||
|
||||
if (PreviousPath.EndsWith ("-crypto.git"))
|
||||
folder_name = folder_name.Replace ("-crypto.git", "");
|
||||
|
||||
Program.Controller.OpenSparkleShareFolder (folder_name);
|
||||
SparkleShare.Controller.OpenSparkleShareFolder (folder_name);
|
||||
FinishPageCompleted ();
|
||||
}
|
||||
|
||||
|
||||
public void FinishPageCompleted ()
|
||||
{
|
||||
SelectedPlugin = Plugins [0];
|
||||
SelectedPreset = Presets [0];
|
||||
PreviousUrl = "";
|
||||
PreviousAddress = "";
|
||||
PreviousPath = "";
|
||||
|
@ -588,7 +560,7 @@ namespace SparkleShare {
|
|||
|
||||
private bool IsValidEmail (string email)
|
||||
{
|
||||
return new Regex (@"^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]+$", RegexOptions.IgnoreCase).IsMatch (email);
|
||||
return email.Contains ("@");
|
||||
}
|
||||
}
|
||||
}
|
66
SparkleShare/Common/SparkleShare.cs
Normal file
|
@ -0,0 +1,66 @@
|
|||
// SparkleShare, a collaboration and sharing tool.
|
||||
// Copyright (C) 2010 Hylke Bons <hi@planetpeanut.uk>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
using System;
|
||||
using System.Threading;
|
||||
|
||||
using Sparkles;
|
||||
|
||||
namespace SparkleShare {
|
||||
|
||||
public class SparkleShare {
|
||||
|
||||
public static Controller Controller;
|
||||
public static UserInterface UI;
|
||||
|
||||
static Mutex program_mutex = new Mutex (false, "SparkleShare");
|
||||
|
||||
|
||||
#if !__MonoCS__
|
||||
[STAThread]
|
||||
#endif
|
||||
public static void Main (string [] args)
|
||||
{
|
||||
// Only allow one instance of SparkleShare (on Windows)
|
||||
if (!program_mutex.WaitOne (0, exitContext: false)) {
|
||||
Console.WriteLine ("SparkleShare is already running.");
|
||||
Environment.Exit (-1);
|
||||
}
|
||||
|
||||
AppDomain.CurrentDomain.UnhandledException += OnUnhandledException;
|
||||
|
||||
Controller = new Controller (Configuration.DefaultConfiguration);
|
||||
Controller.Initialize ();
|
||||
|
||||
UI = new UserInterface ();
|
||||
UI.Run (args);
|
||||
|
||||
#if !__MonoCS__
|
||||
// Suppress assertion messages in debug mode
|
||||
GC.Collect (GC.MaxGeneration, GCCollectionMode.Forced);
|
||||
GC.WaitForPendingFinalizers ();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
static void OnUnhandledException (object sender, UnhandledExceptionEventArgs exception_args)
|
||||
{
|
||||
var exception = (Exception) exception_args.ExceptionObject;
|
||||
Logger.WriteCrashReport (exception);
|
||||
}
|
||||
}
|
||||
}
|
22
SparkleShare/Common/SparkleShare.projitems
Normal file
|
@ -0,0 +1,22 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
|
||||
<HasSharedItems>true</HasSharedItems>
|
||||
<SharedGUID>{F16E3683-B622-4654-B799-99C8D68AA963}</SharedGUID>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Label="Configuration">
|
||||
<Import_RootNamespace>SparkleShare</Import_RootNamespace>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="$(MSBuildThisFileDirectory)AboutController.cs" />
|
||||
<Compile Include="$(MSBuildThisFileDirectory)Avatars.cs" />
|
||||
<Compile Include="$(MSBuildThisFileDirectory)BaseController.cs" />
|
||||
<Compile Include="$(MSBuildThisFileDirectory)BubblesController.cs" />
|
||||
<Compile Include="$(MSBuildThisFileDirectory)EventLogController.cs" />
|
||||
<Compile Include="$(MSBuildThisFileDirectory)NoteController.cs" />
|
||||
<Compile Include="$(MSBuildThisFileDirectory)SetupController.cs" />
|
||||
<Compile Include="$(MSBuildThisFileDirectory)SparkleShare.cs" />
|
||||
<Compile Include="$(MSBuildThisFileDirectory)StatusIconController.cs" />
|
||||
</ItemGroup>
|
||||
</Project>
|
14
SparkleShare/Common/SparkleShare.shproj
Normal file
|
@ -0,0 +1,14 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<ProductVersion>8.0.30703</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{F16E3683-B622-4654-B799-99C8D68AA963}</ProjectGuid>
|
||||
<ReleaseVersion></ReleaseVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\CodeSharing\Microsoft.CodeSharing.Common.Default.props" />
|
||||
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\CodeSharing\Microsoft.CodeSharing.Common.props" />
|
||||
<Import Project="SparkleShare.projitems" Label="Shared" />
|
||||
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\CodeSharing\Microsoft.CodeSharing.CSharp.targets" />
|
||||
</Project>
|
216
SparkleShare/SparkleStatusIconController.cs → SparkleShare/Common/StatusIconController.cs
Executable file → Normal file
|
@ -1,5 +1,5 @@
|
|||
// SparkleShare, a collaboration and sharing tool.
|
||||
// Copyright (C) 2010 Hylke Bons <hylkebons@gmail.com>
|
||||
// Copyright (C) 2010 Hylke Bons <hi@planetpeanut.uk>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
|
@ -20,7 +20,7 @@ using System.Collections.Generic;
|
|||
using System.Threading;
|
||||
using Timers = System.Timers;
|
||||
|
||||
using SparkleLib;
|
||||
using Sparkles;
|
||||
|
||||
namespace SparkleShare {
|
||||
|
||||
|
@ -35,38 +35,41 @@ namespace SparkleShare {
|
|||
|
||||
public class ProjectInfo {
|
||||
|
||||
private SparkleRepoBase repo;
|
||||
readonly BaseRepository repo;
|
||||
|
||||
public string Name { get { return this.repo.Name; }}
|
||||
public string Path { get { return this.repo.LocalPath; }}
|
||||
public string Name { get { return repo.Name; }}
|
||||
public string Path { get { return repo.LocalPath; }}
|
||||
|
||||
public bool IsPaused { get { return this.repo.Status == SyncStatus.Paused; }}
|
||||
public bool HasError { get { return this.repo.Status == SyncStatus.Error; }}
|
||||
public bool IsPaused { get { return repo.Status == SyncStatus.Paused; }}
|
||||
public bool HasError { get { return repo.Status == SyncStatus.Error; }}
|
||||
|
||||
|
||||
public string StatusMessage {
|
||||
get {
|
||||
string status_message = "Waiting to sync";
|
||||
|
||||
if (!this.repo.LastSync.Equals (DateTime.MinValue))
|
||||
status_message = string.Format ("Synced {0}", this.repo.LastSync.ToPrettyDate ());
|
||||
if (!repo.LastSync.Equals (DateTime.MinValue))
|
||||
status_message = string.Format ("✓ Synced – Last change {0}", repo.LastSync.ToPrettyDate ());
|
||||
|
||||
if (this.repo.Status == SyncStatus.SyncUp)
|
||||
status_message = "Sending changes… " + this.repo.ProgressPercentage + "%";
|
||||
if (repo.Status == SyncStatus.SyncUp)
|
||||
status_message = "Sending… " + (int) repo.ProgressPercentage + "%";
|
||||
|
||||
if (this.repo.Status == SyncStatus.SyncDown)
|
||||
status_message = "Receiving changes… " + this.repo.ProgressPercentage + "%";
|
||||
if (repo.Status == SyncStatus.SyncDown)
|
||||
status_message = "Receiving… " + (int) repo.ProgressPercentage + "%";
|
||||
|
||||
if (this.repo.Status == SyncStatus.SyncUp || this.repo.Status == SyncStatus.SyncDown) {
|
||||
if (this.repo.ProgressSpeed > 0)
|
||||
status_message += " " + this.repo.ProgressSpeed.ToSize () + "/s";
|
||||
if (!string.IsNullOrWhiteSpace (repo.ProgressInformation))
|
||||
status_message += " – " + SparkleShare.Controller.ProgressInformation;
|
||||
|
||||
if (repo.Status == SyncStatus.SyncUp || repo.Status == SyncStatus.SyncDown) {
|
||||
if (repo.ProgressSpeed > 0)
|
||||
status_message += " " + repo.ProgressSpeed.ToSize () + "/s";
|
||||
}
|
||||
|
||||
if (IsPaused) {
|
||||
if (IsPaused)
|
||||
return "Paused";
|
||||
|
||||
} else if (HasError) {
|
||||
switch (this.repo.Error) {
|
||||
if (HasError) {
|
||||
switch (repo.Error) {
|
||||
case ErrorStatus.HostUnreachable: return "Can’t reach the host";
|
||||
case ErrorStatus.HostIdentityChanged: return "The host’s identity has changed";
|
||||
case ErrorStatus.AuthenticationFailed: return "Authentication failed";
|
||||
|
@ -86,20 +89,20 @@ namespace SparkleShare {
|
|||
|
||||
public Dictionary<string, string> UnsyncedChangesInfo {
|
||||
get {
|
||||
Dictionary<string, string> changes_info = new Dictionary<string, string> ();
|
||||
var changes_info = new Dictionary<string, string> ();
|
||||
|
||||
int changes_count = 0;
|
||||
foreach (SparkleChange change in repo.UnsyncedChanges) {
|
||||
foreach (Change change in repo.UnsyncedChanges) {
|
||||
changes_count++;
|
||||
|
||||
if (changes_count > 10)
|
||||
continue;
|
||||
|
||||
switch (change.Type) {
|
||||
case SparkleChangeType.Added: changes_info [change.Path] = "document-added-12.png"; break;
|
||||
case SparkleChangeType.Edited: changes_info [change.Path] = "document-edited-12.png"; break;
|
||||
case SparkleChangeType.Deleted: changes_info [change.Path] = "document-deleted-12.png"; break;
|
||||
case SparkleChangeType.Moved: changes_info [change.MovedToPath] = "document-moved-12.png"; break;
|
||||
case ChangeType.Added: changes_info [change.Path] = "document-added-12.png"; break;
|
||||
case ChangeType.Edited: changes_info [change.Path] = "document-edited-12.png"; break;
|
||||
case ChangeType.Deleted: changes_info [change.Path] = "document-deleted-12.png"; break;
|
||||
case ChangeType.Moved: changes_info [change.MovedToPath] = "document-moved-12.png"; break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -111,14 +114,14 @@ namespace SparkleShare {
|
|||
}
|
||||
|
||||
|
||||
public ProjectInfo (SparkleRepoBase repo)
|
||||
public ProjectInfo (BaseRepository repo)
|
||||
{
|
||||
this.repo = repo;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public class SparkleStatusIconController {
|
||||
public class StatusIconController {
|
||||
|
||||
public event UpdateIconEventHandler UpdateIconEvent = delegate { };
|
||||
public delegate void UpdateIconEventHandler (IconState state);
|
||||
|
@ -133,47 +136,20 @@ namespace SparkleShare {
|
|||
public delegate void UpdateQuitItemEventHandler (bool quit_item_enabled);
|
||||
|
||||
public IconState CurrentState = IconState.Idle;
|
||||
public string StateText = "Welcome to SparkleShare!";
|
||||
public string StateText = "Welcome to SparkleShare!";
|
||||
|
||||
public ProjectInfo [] Projects = new ProjectInfo [0];
|
||||
|
||||
|
||||
public int ProgressPercentage {
|
||||
get {
|
||||
return (int) Program.Controller.ProgressPercentage;
|
||||
}
|
||||
}
|
||||
|
||||
public string ProgressSpeed {
|
||||
get {
|
||||
string progress_speed = "";
|
||||
|
||||
if (Program.Controller.ProgressSpeedDown == 0 && Program.Controller.ProgressSpeedUp > 0) {
|
||||
progress_speed = Program.Controller.ProgressSpeedUp.ToSize () + "/s ";
|
||||
|
||||
} else if (Program.Controller.ProgressSpeedUp == 0 && Program.Controller.ProgressSpeedDown > 0) {
|
||||
progress_speed = Program.Controller.ProgressSpeedDown.ToSize () + "/s ";
|
||||
|
||||
} else if (Program.Controller.ProgressSpeedUp > 0 &&
|
||||
Program.Controller.ProgressSpeedDown > 0) {
|
||||
|
||||
progress_speed = "Up: " + Program.Controller.ProgressSpeedUp.ToSize () + "/s " +
|
||||
"Down: " + Program.Controller.ProgressSpeedDown.ToSize () + "/s";
|
||||
}
|
||||
|
||||
return progress_speed;
|
||||
}
|
||||
}
|
||||
|
||||
public bool RecentEventsItemEnabled {
|
||||
get {
|
||||
return (Program.Controller.Repositories.Length > 0);
|
||||
return (SparkleShare.Controller.Repositories.Length > 0);
|
||||
}
|
||||
}
|
||||
|
||||
public bool LinkCodeItemEnabled {
|
||||
get {
|
||||
return !string.IsNullOrEmpty (Program.Controller.CurrentUser.PublicKey);
|
||||
return !string.IsNullOrEmpty (SparkleShare.Controller.UserAuthenticationInfo.PublicKey);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -184,11 +160,11 @@ namespace SparkleShare {
|
|||
}
|
||||
|
||||
|
||||
public SparkleStatusIconController ()
|
||||
public StatusIconController ()
|
||||
{
|
||||
UpdateFolders ();
|
||||
|
||||
Program.Controller.FolderListChanged += delegate {
|
||||
SparkleShare.Controller.FolderListChanged += delegate {
|
||||
if (CurrentState != IconState.Error) {
|
||||
CurrentState = IconState.Idle;
|
||||
|
||||
|
@ -201,10 +177,9 @@ namespace SparkleShare {
|
|||
UpdateMenuEvent (CurrentState);
|
||||
};
|
||||
|
||||
Program.Controller.OnIdle += delegate {
|
||||
SparkleShare.Controller.OnIdle += delegate {
|
||||
if (CurrentState != IconState.Error) {
|
||||
CurrentState = IconState.Idle;
|
||||
|
||||
UpdateStateText ();
|
||||
}
|
||||
|
||||
|
@ -216,44 +191,61 @@ namespace SparkleShare {
|
|||
UpdateMenuEvent (CurrentState);
|
||||
};
|
||||
|
||||
Program.Controller.OnSyncing += delegate {
|
||||
int repos_syncing_up = 0;
|
||||
int repos_syncing_down = 0;
|
||||
|
||||
foreach (SparkleRepoBase repo in Program.Controller.Repositories) {
|
||||
if (repo.Status == SyncStatus.SyncUp)
|
||||
repos_syncing_up++;
|
||||
|
||||
if (repo.Status == SyncStatus.SyncDown)
|
||||
repos_syncing_down++;
|
||||
}
|
||||
|
||||
if (repos_syncing_up > 0 &&
|
||||
repos_syncing_down > 0) {
|
||||
|
||||
CurrentState = IconState.Syncing;
|
||||
StateText = "Syncing changes…";
|
||||
|
||||
} else if (repos_syncing_down == 0) {
|
||||
CurrentState = IconState.SyncingUp;
|
||||
StateText = "Sending changes…";
|
||||
|
||||
} else {
|
||||
CurrentState = IconState.SyncingDown;
|
||||
StateText = "Receiving changes…";
|
||||
}
|
||||
SparkleShare.Controller.OnSyncing += delegate {
|
||||
int repos_syncing_up = 0;
|
||||
int repos_syncing_down = 0;
|
||||
|
||||
if (ProgressPercentage > 0)
|
||||
StateText += " " + ProgressPercentage + "% " + ProgressSpeed;
|
||||
foreach (BaseRepository repo in SparkleShare.Controller.Repositories) {
|
||||
if (repo.Status == SyncStatus.SyncUp)
|
||||
repos_syncing_up++;
|
||||
|
||||
if (repo.Status == SyncStatus.SyncDown)
|
||||
repos_syncing_down++;
|
||||
}
|
||||
|
||||
if (repos_syncing_up > 0 &&
|
||||
repos_syncing_down > 0) {
|
||||
|
||||
CurrentState = IconState.Syncing;
|
||||
StateText = "Syncing…";
|
||||
|
||||
} else if (repos_syncing_down == 0) {
|
||||
CurrentState = IconState.SyncingUp;
|
||||
StateText = "Sending…";
|
||||
|
||||
} else {
|
||||
CurrentState = IconState.SyncingDown;
|
||||
StateText = "Receiving…";
|
||||
}
|
||||
|
||||
int progress_percentage = (int) SparkleShare.Controller.ProgressPercentage;
|
||||
string progress_speed = "";
|
||||
|
||||
if (SparkleShare.Controller.ProgressSpeedUp > 0.0 && SparkleShare.Controller.ProgressSpeedDown > 0.0) {
|
||||
progress_speed = "Up: " + SparkleShare.Controller.ProgressSpeedUp.ToSize () + "/s " +
|
||||
"Down: " + SparkleShare.Controller.ProgressSpeedDown.ToSize () + "/s";
|
||||
}
|
||||
|
||||
if (SparkleShare.Controller.ProgressSpeedUp > 0.0)
|
||||
progress_speed = SparkleShare.Controller.ProgressSpeedUp.ToSize () + "/s ";
|
||||
|
||||
if (SparkleShare.Controller.ProgressSpeedDown > 0.0)
|
||||
progress_speed = SparkleShare.Controller.ProgressSpeedDown.ToSize () + "/s ";
|
||||
|
||||
if (progress_percentage > 0)
|
||||
StateText += string.Format (" {0}% {1}", progress_percentage, progress_speed);
|
||||
|
||||
if (!string.IsNullOrEmpty (SparkleShare.Controller.ProgressInformation))
|
||||
StateText += " – " + SparkleShare.Controller.ProgressInformation;
|
||||
|
||||
UpdateIconEvent (CurrentState);
|
||||
UpdateStatusItemEvent (StateText);
|
||||
UpdateQuitItemEvent (QuitItemEnabled);
|
||||
};
|
||||
|
||||
Program.Controller.OnError += delegate {
|
||||
SparkleShare.Controller.OnError += delegate {
|
||||
CurrentState = IconState.Error;
|
||||
StateText = "Some changes weren’t synced";
|
||||
StateText = "Not everything synced";
|
||||
|
||||
UpdateFolders ();
|
||||
|
||||
|
@ -266,7 +258,7 @@ namespace SparkleShare {
|
|||
|
||||
// FIXME: Work around a race condition causing
|
||||
// the icon to not always show the right state
|
||||
Timers.Timer timer = new Timers.Timer () { Interval = 30 * 1000 };
|
||||
var timer = new Timers.Timer { Interval = 30 * 1000 };
|
||||
|
||||
timer.Elapsed += delegate {
|
||||
UpdateIconEvent (CurrentState);
|
||||
|
@ -282,7 +274,7 @@ namespace SparkleShare {
|
|||
if (Projects.Length == 0)
|
||||
return StateText = "Welcome to SparkleShare!";
|
||||
else
|
||||
return StateText = "Projects up to date " + GetPausedCount ();
|
||||
return StateText = "✓ Synced " + GetPausedCount ();
|
||||
}
|
||||
|
||||
|
||||
|
@ -305,56 +297,56 @@ namespace SparkleShare {
|
|||
public void RecentEventsClicked ()
|
||||
{
|
||||
new Thread (() => {
|
||||
while (!Program.Controller.RepositoriesLoaded)
|
||||
while (!SparkleShare.Controller.RepositoriesLoaded)
|
||||
Thread.Sleep (100);
|
||||
|
||||
Program.Controller.ShowEventLogWindow ();
|
||||
SparkleShare.Controller.ShowEventLogWindow ();
|
||||
|
||||
}).Start ();
|
||||
}
|
||||
|
||||
public void AddHostedProjectClicked ()
|
||||
{
|
||||
new Thread (() => Program.Controller.ShowSetupWindow (PageType.Add)).Start ();
|
||||
new Thread (() => SparkleShare.Controller.ShowSetupWindow (PageType.Add)).Start ();
|
||||
}
|
||||
|
||||
public void CopyToClipboardClicked ()
|
||||
{
|
||||
Program.Controller.CopyToClipboard (Program.Controller.CurrentUser.PublicKey);
|
||||
SparkleShare.Controller.CopyToClipboard (SparkleShare.Controller.UserAuthenticationInfo.PublicKey);
|
||||
}
|
||||
|
||||
public void AboutClicked ()
|
||||
{
|
||||
Program.Controller.ShowAboutWindow ();
|
||||
SparkleShare.Controller.ShowAboutWindow ();
|
||||
}
|
||||
|
||||
public void QuitClicked ()
|
||||
{
|
||||
Program.Controller.Quit ();
|
||||
SparkleShare.Controller.Quit ();
|
||||
}
|
||||
|
||||
|
||||
// Project items
|
||||
public void ProjectClicked (string project)
|
||||
{
|
||||
Program.Controller.OpenSparkleShareFolder (project);
|
||||
SparkleShare.Controller.OpenSparkleShareFolder (project);
|
||||
}
|
||||
|
||||
public void PauseClicked (string project)
|
||||
{
|
||||
Program.Controller.GetRepoByName (project).Pause ();
|
||||
SparkleShare.Controller.GetRepoByName (project).Pause ();
|
||||
UpdateStateText ();
|
||||
UpdateMenuEvent (CurrentState);
|
||||
}
|
||||
|
||||
public void ResumeClicked (string project)
|
||||
{
|
||||
if (Program.Controller.GetRepoByName (project).UnsyncedChanges.Count > 0) {
|
||||
Program.Controller.ShowNoteWindow (project);
|
||||
if (SparkleShare.Controller.GetRepoByName (project).UnsyncedChanges.Count > 0) {
|
||||
SparkleShare.Controller.ShowNoteWindow (project);
|
||||
|
||||
} else {
|
||||
new Thread (() => {
|
||||
Program.Controller.GetRepoByName (project).Resume ("");
|
||||
SparkleShare.Controller.GetRepoByName (project).Resume ("");
|
||||
|
||||
UpdateStateText ();
|
||||
UpdateMenuEvent (CurrentState);
|
||||
|
@ -365,7 +357,7 @@ namespace SparkleShare {
|
|||
|
||||
public void TryAgainClicked (string project)
|
||||
{
|
||||
new Thread (() => Program.Controller.GetRepoByName (project).ForceRetry ()).Start ();
|
||||
new Thread (() => SparkleShare.Controller.GetRepoByName (project).ForceRetry ()).Start ();
|
||||
}
|
||||
|
||||
|
||||
|
@ -391,18 +383,18 @@ namespace SparkleShare {
|
|||
}
|
||||
|
||||
|
||||
private Object projects_lock = new Object ();
|
||||
readonly object projects_lock = new object ();
|
||||
|
||||
private void UpdateFolders ()
|
||||
void UpdateFolders ()
|
||||
{
|
||||
lock (this.projects_lock) {
|
||||
List<ProjectInfo> projects = new List<ProjectInfo> ();
|
||||
var projects = new List<ProjectInfo> ();
|
||||
|
||||
foreach (SparkleRepoBase repo in Program.Controller.Repositories)
|
||||
lock (projects_lock) {
|
||||
foreach (BaseRepository repo in SparkleShare.Controller.Repositories)
|
||||
projects.Add (new ProjectInfo (repo));
|
||||
|
||||
Projects = projects.ToArray ();
|
||||
}
|
||||
|
||||
Projects = projects.ToArray ();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,222 +0,0 @@
|
|||
# Makefile for program source directory in GNU NLS utilities package.
|
||||
# Copyright (C) 1995, 1996, 1997 by Ulrich Drepper <drepper@gnu.ai.mit.edu>
|
||||
# Copyright (C) 2004-2008 Rodney Dawes <dobey.pwns@gmail.com>
|
||||
#
|
||||
# This file may be copied and used freely without restrictions. It may
|
||||
# be used in projects which are not available under a GNU Public License,
|
||||
# but which still want to provide support for the GNU gettext functionality.
|
||||
#
|
||||
# - Modified by Owen Taylor <otaylor@redhat.com> to use GETTEXT_PACKAGE
|
||||
# instead of PACKAGE and to look for po2tbl in ./ not in intl/
|
||||
#
|
||||
# - Modified by jacob berkman <jacob@ximian.com> to install
|
||||
# Makefile.in.in and po2tbl.sed.in for use with glib-gettextize
|
||||
#
|
||||
# - Modified by Rodney Dawes <dobey.pwns@gmail.com> for use with intltool
|
||||
#
|
||||
# We have the following line for use by intltoolize:
|
||||
# INTLTOOL_MAKEFILE
|
||||
|
||||
GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
|
||||
PACKAGE = @PACKAGE@
|
||||
VERSION = @VERSION@
|
||||
|
||||
SHELL = @SHELL@
|
||||
|
||||
srcdir = @srcdir@
|
||||
top_srcdir = @top_srcdir@
|
||||
top_builddir = @top_builddir@
|
||||
VPATH = @srcdir@
|
||||
|
||||
prefix = @prefix@
|
||||
exec_prefix = @exec_prefix@
|
||||
datadir = @datadir@
|
||||
datarootdir = @datarootdir@
|
||||
libdir = @libdir@
|
||||
DATADIRNAME = @DATADIRNAME@
|
||||
itlocaledir = $(prefix)/$(DATADIRNAME)/locale
|
||||
subdir = po
|
||||
install_sh = @install_sh@
|
||||
# Automake >= 1.8 provides @mkdir_p@.
|
||||
# Until it can be supposed, use the safe fallback:
|
||||
mkdir_p = $(install_sh) -d
|
||||
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
|
||||
GMSGFMT = @GMSGFMT@
|
||||
MSGFMT = @MSGFMT@
|
||||
XGETTEXT = @XGETTEXT@
|
||||
INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
|
||||
INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
|
||||
MSGMERGE = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --dist
|
||||
GENPOT = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --pot
|
||||
|
||||
ALL_LINGUAS = @ALL_LINGUAS@
|
||||
|
||||
PO_LINGUAS=$(shell if test -r $(srcdir)/LINGUAS; then grep -v "^\#" $(srcdir)/LINGUAS; else echo "$(ALL_LINGUAS)"; fi)
|
||||
|
||||
USER_LINGUAS=$(shell if test -n "$(LINGUAS)"; then LLINGUAS="$(LINGUAS)"; ALINGUAS="$(ALL_LINGUAS)"; for lang in $$LLINGUAS; do if test -n "`grep \^$$lang$$ $(srcdir)/LINGUAS 2>/dev/null`" -o -n "`echo $$ALINGUAS|tr ' ' '\n'|grep \^$$lang$$`"; then printf "$$lang "; fi; done; fi)
|
||||
|
||||
USE_LINGUAS=$(shell if test -n "$(USER_LINGUAS)" -o -n "$(LINGUAS)"; then LLINGUAS="$(USER_LINGUAS)"; else if test -n "$(PO_LINGUAS)"; then LLINGUAS="$(PO_LINGUAS)"; else LLINGUAS="$(ALL_LINGUAS)"; fi; fi; for lang in $$LLINGUAS; do printf "$$lang "; done)
|
||||
|
||||
POFILES=$(shell LINGUAS="$(PO_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.po "; done)
|
||||
|
||||
DISTFILES = Makefile.in.in POTFILES.in $(POFILES)
|
||||
EXTRA_DISTFILES = ChangeLog POTFILES.skip Makevars LINGUAS
|
||||
|
||||
POTFILES = \
|
||||
# This comment gets stripped out
|
||||
|
||||
CATALOGS=$(shell LINGUAS="$(USE_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.gmo "; done)
|
||||
|
||||
.SUFFIXES:
|
||||
.SUFFIXES: .po .pox .gmo .mo .msg .cat
|
||||
|
||||
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||
INTLTOOL_V_MSGFMT = $(INTLTOOL__v_MSGFMT_$(V))
|
||||
INTLTOOL__v_MSGFMT_= $(INTLTOOL__v_MSGFMT_$(AM_DEFAULT_VERBOSITY))
|
||||
INTLTOOL__v_MSGFMT_0 = @echo " MSGFMT" $@;
|
||||
|
||||
.po.pox:
|
||||
$(MAKE) $(GETTEXT_PACKAGE).pot
|
||||
$(MSGMERGE) $< $(GETTEXT_PACKAGE).pot -o $*.pox
|
||||
|
||||
.po.mo:
|
||||
$(INTLTOOL_V_MSGFMT)$(MSGFMT) -o $@ $<
|
||||
|
||||
.po.gmo:
|
||||
$(INTLTOOL_V_MSGFMT)file=`echo $* | sed 's,.*/,,'`.gmo \
|
||||
&& rm -f $$file && $(GMSGFMT) -o $$file $<
|
||||
|
||||
.po.cat:
|
||||
sed -f ../intl/po2msg.sed < $< > $*.msg \
|
||||
&& rm -f $@ && gencat $@ $*.msg
|
||||
|
||||
|
||||
all: all-@USE_NLS@
|
||||
|
||||
all-yes: $(CATALOGS)
|
||||
all-no:
|
||||
|
||||
$(GETTEXT_PACKAGE).pot: $(POTFILES)
|
||||
$(GENPOT)
|
||||
|
||||
install: install-data
|
||||
install-data: install-data-@USE_NLS@
|
||||
install-data-no: all
|
||||
install-data-yes: all
|
||||
linguas="$(USE_LINGUAS)"; \
|
||||
for lang in $$linguas; do \
|
||||
dir=$(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES; \
|
||||
$(mkdir_p) $$dir; \
|
||||
if test -r $$lang.gmo; then \
|
||||
$(INSTALL_DATA) $$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \
|
||||
echo "installing $$lang.gmo as $$dir/$(GETTEXT_PACKAGE).mo"; \
|
||||
else \
|
||||
$(INSTALL_DATA) $(srcdir)/$$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \
|
||||
echo "installing $(srcdir)/$$lang.gmo as" \
|
||||
"$$dir/$(GETTEXT_PACKAGE).mo"; \
|
||||
fi; \
|
||||
if test -r $$lang.gmo.m; then \
|
||||
$(INSTALL_DATA) $$lang.gmo.m $$dir/$(GETTEXT_PACKAGE).mo.m; \
|
||||
echo "installing $$lang.gmo.m as $$dir/$(GETTEXT_PACKAGE).mo.m"; \
|
||||
else \
|
||||
if test -r $(srcdir)/$$lang.gmo.m ; then \
|
||||
$(INSTALL_DATA) $(srcdir)/$$lang.gmo.m \
|
||||
$$dir/$(GETTEXT_PACKAGE).mo.m; \
|
||||
echo "installing $(srcdir)/$$lang.gmo.m as" \
|
||||
"$$dir/$(GETTEXT_PACKAGE).mo.m"; \
|
||||
else \
|
||||
true; \
|
||||
fi; \
|
||||
fi; \
|
||||
done
|
||||
|
||||
# Empty stubs to satisfy archaic automake needs
|
||||
dvi info ctags tags CTAGS TAGS ID:
|
||||
|
||||
# Define this as empty until I found a useful application.
|
||||
install-exec installcheck:
|
||||
|
||||
uninstall:
|
||||
linguas="$(USE_LINGUAS)"; \
|
||||
for lang in $$linguas; do \
|
||||
rm -f $(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo; \
|
||||
rm -f $(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \
|
||||
done
|
||||
|
||||
check: all $(GETTEXT_PACKAGE).pot
|
||||
rm -f missing notexist
|
||||
srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m
|
||||
if [ -r missing -o -r notexist ]; then \
|
||||
exit 1; \
|
||||
fi
|
||||
|
||||
mostlyclean:
|
||||
rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp
|
||||
rm -f .intltool-merge-cache
|
||||
|
||||
clean: mostlyclean
|
||||
|
||||
distclean: clean
|
||||
rm -f Makefile Makefile.in POTFILES stamp-it
|
||||
rm -f *.mo *.msg *.cat *.cat.m *.gmo
|
||||
|
||||
maintainer-clean: distclean
|
||||
@echo "This command is intended for maintainers to use;"
|
||||
@echo "it deletes files that may require special tools to rebuild."
|
||||
rm -f Makefile.in.in
|
||||
|
||||
distdir = ../$(PACKAGE)-$(VERSION)/$(subdir)
|
||||
dist distdir: $(DISTFILES)
|
||||
dists="$(DISTFILES)"; \
|
||||
extra_dists="$(EXTRA_DISTFILES)"; \
|
||||
for file in $$extra_dists; do \
|
||||
test -f $(srcdir)/$$file && dists="$$dists $(srcdir)/$$file"; \
|
||||
done; \
|
||||
for file in $$dists; do \
|
||||
test -f $$file || file="$(srcdir)/$$file"; \
|
||||
ln $$file $(distdir) 2> /dev/null \
|
||||
|| cp -p $$file $(distdir); \
|
||||
done
|
||||
|
||||
update-po: Makefile
|
||||
$(MAKE) $(GETTEXT_PACKAGE).pot
|
||||
tmpdir=`pwd`; \
|
||||
linguas="$(USE_LINGUAS)"; \
|
||||
for lang in $$linguas; do \
|
||||
echo "$$lang:"; \
|
||||
result="`$(MSGMERGE) -o $$tmpdir/$$lang.new.po $$lang`"; \
|
||||
if $$result; then \
|
||||
if cmp $(srcdir)/$$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
|
||||
rm -f $$tmpdir/$$lang.new.po; \
|
||||
else \
|
||||
if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \
|
||||
:; \
|
||||
else \
|
||||
echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \
|
||||
rm -f $$tmpdir/$$lang.new.po; \
|
||||
exit 1; \
|
||||
fi; \
|
||||
fi; \
|
||||
else \
|
||||
echo "msgmerge for $$lang.gmo failed!"; \
|
||||
rm -f $$tmpdir/$$lang.new.po; \
|
||||
fi; \
|
||||
done
|
||||
|
||||
Makefile POTFILES: stamp-it
|
||||
@if test ! -f $@; then \
|
||||
rm -f stamp-it; \
|
||||
$(MAKE) stamp-it; \
|
||||
fi
|
||||
|
||||
stamp-it: Makefile.in.in $(top_builddir)/config.status POTFILES.in
|
||||
cd $(top_builddir) \
|
||||
&& CONFIG_FILES=$(subdir)/Makefile.in CONFIG_HEADERS= CONFIG_LINKS= \
|
||||
$(SHELL) ./config.status
|
||||
|
||||
# Tell versions [3.59,3.63) of GNU make not to export all variables.
|
||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||
.NOEXPORT:
|
|
@ -2,7 +2,7 @@
|
|||
#
|
||||
# Translators:
|
||||
# <benjamincottyn@gmail.com>, 2011.
|
||||
# <hylkebons@gmail.com>, 2011.
|
||||
# <hi@planetpeanut.uk>, 2011.
|
||||
# <inxidious@gmail.com>, 2011.
|
||||
# Łukasz Jernaś <deejay1@srem.org>, 2011.
|
||||
# <m.manshanden@gmail.com>, 2011.
|
||||
|
|
166
SparkleShare/Linux/About.cs
Executable file
|
@ -0,0 +1,166 @@
|
|||
// SparkleShare, a collaboration and sharing tool.
|
||||
// Copyright (C) 2010 Hylke Bons (hi@planetpeanut.uk)
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see (http://www.gnu.org/licenses/).
|
||||
|
||||
|
||||
using System;
|
||||
|
||||
using Sparkles;
|
||||
using Gtk;
|
||||
|
||||
namespace SparkleShare {
|
||||
|
||||
public class About : Window {
|
||||
|
||||
public AboutController Controller = new AboutController ();
|
||||
|
||||
Label updates;
|
||||
|
||||
|
||||
public About () : base ("About SparkleShare")
|
||||
{
|
||||
IconName = "org.sparkleshare.SparkleShare";
|
||||
Resizable = false;
|
||||
WindowPosition = WindowPosition.CenterAlways;
|
||||
TypeHint = Gdk.WindowTypeHint.Dialog;
|
||||
|
||||
SetSizeRequest (640, 260);
|
||||
|
||||
|
||||
DeleteEvent += delegate (object o, DeleteEventArgs args) {
|
||||
Controller.WindowClosed ();
|
||||
args.RetVal = true;
|
||||
};
|
||||
|
||||
KeyPressEvent += delegate (object o, KeyPressEventArgs args) {
|
||||
if (args.Event.Key == Gdk.Key.Escape ||
|
||||
(args.Event.State == Gdk.ModifierType.ControlMask && args.Event.Key == Gdk.Key.w)) {
|
||||
|
||||
Controller.WindowClosed ();
|
||||
}
|
||||
};
|
||||
|
||||
Controller.HideWindowEvent += delegate {
|
||||
Application.Invoke (delegate { Hide (); });
|
||||
};
|
||||
|
||||
Controller.ShowWindowEvent += delegate {
|
||||
Application.Invoke (delegate {
|
||||
ShowAll ();
|
||||
Present ();
|
||||
});
|
||||
};
|
||||
|
||||
Controller.UpdateLabelEvent += delegate (string text) {
|
||||
Application.Invoke (delegate {
|
||||
updates.Text = text;
|
||||
updates.ShowAll();
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
CreateAbout ();
|
||||
}
|
||||
|
||||
|
||||
void CreateAbout ()
|
||||
{
|
||||
CssProvider window_css_provider = new CssProvider ();
|
||||
string image_path = InstallationInfo.Directory + "/pixmaps/about.png";
|
||||
|
||||
window_css_provider.LoadFromData ("window, GtkWindow {" +
|
||||
" background-image: url('" + image_path + "');" +
|
||||
" background-repeat: no-repeat;" +
|
||||
" background-position: left bottom;" +
|
||||
"}");
|
||||
|
||||
StyleContext.AddProvider (window_css_provider, 800);
|
||||
|
||||
var layout_vertical = new VBox (false, 0);
|
||||
var links_layout = new HBox (false, 16);
|
||||
|
||||
CssProvider label_css_provider = new CssProvider ();
|
||||
label_css_provider.LoadFromData ("label { color: #fff; font-size: 14pt; background-color: rgba(0, 0, 0, 0); }");
|
||||
|
||||
CssProvider label_highlight_css_provider = new CssProvider ();
|
||||
label_highlight_css_provider.LoadFromData ("label { color: #a8bbcf; font-size: 12pt; }");
|
||||
|
||||
var version = new Label {
|
||||
Text = "version " + Controller.RunningVersion,
|
||||
Xalign = 0, Xpad = 0
|
||||
};
|
||||
|
||||
if (InstallationInfo.IsFlatpak)
|
||||
version.Text += " (Flatpak)";
|
||||
|
||||
updates = new Label ("Checking for updates…") {
|
||||
Xalign = 0, Xpad = 0
|
||||
};
|
||||
|
||||
var copyright = new Label {
|
||||
Markup = string.Format ("Copyright © 2010–{0} Hylke Bons and others", DateTime.Now.Year),
|
||||
Xalign = 0, Xpad = 0
|
||||
};
|
||||
|
||||
var license = new Label ("SparkleShare is Open Source and you’re free to\n" +
|
||||
"use, change, and share it under the GNU GPLv3") {
|
||||
|
||||
Xalign = 0, Xpad = 0
|
||||
};
|
||||
|
||||
license.StyleContext.AddProvider (label_css_provider, 800);
|
||||
updates.StyleContext.AddProvider (label_highlight_css_provider, 800);
|
||||
version.StyleContext.AddProvider (label_css_provider, 800);
|
||||
copyright.StyleContext.AddProvider (label_css_provider, 800);
|
||||
|
||||
var website_link = new Link ("Website", Controller.WebsiteLinkAddress);
|
||||
var credits_link = new Link ("Credits", Controller.CreditsLinkAddress);
|
||||
var report_problem_link = new Link ("Report a problem", Controller.ReportProblemLinkAddress);
|
||||
var debug_log_link = new Link ("Debug log", Controller.DebugLogLinkAddress);
|
||||
|
||||
layout_vertical.PackStart (new Label (""), true, true, 0);
|
||||
layout_vertical.PackStart (version, false, false, 0);
|
||||
layout_vertical.PackStart (updates, false, false, 0);
|
||||
layout_vertical.PackStart (copyright, false, false, 6);
|
||||
layout_vertical.PackStart (license, false, false, 6);
|
||||
layout_vertical.PackStart (links_layout, false, false, 6);
|
||||
|
||||
links_layout.PackStart (website_link, false, false, 0);
|
||||
links_layout.PackStart (credits_link, false, false, 0);
|
||||
links_layout.PackStart (report_problem_link, false, false, 0);
|
||||
links_layout.PackStart (debug_log_link, false, false, 0);
|
||||
|
||||
var layout_horizontal = new HBox (false, 0);
|
||||
layout_horizontal.PackStart (new Label (""), false, false, 149);
|
||||
layout_horizontal.PackStart (layout_vertical, false, false, 0);
|
||||
|
||||
Add (layout_horizontal);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class Link : Label {
|
||||
|
||||
public Link (string label, string url)
|
||||
{
|
||||
Markup = string.Format ("<a href=\"{0}\">{1}</a>", url, label);
|
||||
CanFocus = false;
|
||||
|
||||
CssProvider css_provider = new CssProvider ();
|
||||
css_provider.LoadFromData ("label a { color: #729fcf; font-size: 14pt; }");
|
||||
StyleContext.AddProvider (css_provider, 800);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
// SparkleShare, a collaboration and sharing tool.
|
||||
// Copyright (C) 2010 Hylke Bons <hylkebons@gmail.com>
|
||||
// Copyright (C) 2010 Hylke Bons <hi@planetpeanut.uk>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
|
@ -19,27 +19,28 @@ using System;
|
|||
|
||||
using Gtk;
|
||||
using Notifications;
|
||||
using SparkleLib;
|
||||
|
||||
using Sparkles;
|
||||
|
||||
namespace SparkleShare {
|
||||
|
||||
public class SparkleBubbles {
|
||||
public class Bubbles {
|
||||
|
||||
public SparkleBubblesController Controller = new SparkleBubblesController ();
|
||||
public BubblesController Controller = new BubblesController ();
|
||||
|
||||
|
||||
public SparkleBubbles ()
|
||||
public Bubbles ()
|
||||
{
|
||||
Controller.ShowBubbleEvent += ShowBubbleEvent;
|
||||
}
|
||||
|
||||
|
||||
private void ShowBubbleEvent (string title, string subtext, string image_path)
|
||||
void ShowBubbleEvent (string title, string subtext, string image_path)
|
||||
{
|
||||
if (!Program.Controller.NotificationsEnabled)
|
||||
if (!SparkleShare.Controller.NotificationsEnabled)
|
||||
return;
|
||||
|
||||
Application.Invoke (delegate {
|
||||
Application.Invoke (delegate {
|
||||
Notification notification = new Notification () {
|
||||
Summary = title,
|
||||
Body = subtext,
|
||||
|
@ -50,16 +51,15 @@ namespace SparkleShare {
|
|||
if (image_path != null)
|
||||
notification.Icon = new Gdk.Pixbuf (image_path);
|
||||
else
|
||||
notification.IconName = "folder-sparkleshare";
|
||||
notification.IconName = "org.sparkleshare.SparkleShare";
|
||||
|
||||
try {
|
||||
notification.Show ();
|
||||
|
||||
} catch (Exception e) {
|
||||
SparkleLogger.LogInfo ("Notification", "Error showing notification: ", e);
|
||||
Logger.LogInfo ("Notification", "Could not show notification: ", e);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
151
SparkleShare/Linux/Controller.cs
Normal file
|
@ -0,0 +1,151 @@
|
|||
// SparkleShare, a collaboration and sharing tool.
|
||||
// Copyright (C) 2010 Hylke Bons <hi@planetpeanut.uk>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
|
||||
using Gtk;
|
||||
using Mono.Unix.Native;
|
||||
|
||||
using Sparkles;
|
||||
using Sparkles.Git;
|
||||
|
||||
namespace SparkleShare {
|
||||
|
||||
public class Controller : BaseController {
|
||||
|
||||
public Controller (Configuration config) : base (config)
|
||||
{
|
||||
if (InstallationInfo.IsFlatpak)
|
||||
GitCommand.ExecPath = Path.Combine ("/app", "libexec", "git-core");
|
||||
}
|
||||
|
||||
|
||||
public override void CreateSparkleShareFolder ()
|
||||
{
|
||||
if (!Directory.Exists (Configuration.DefaultConfiguration.FoldersPath)) {
|
||||
Directory.CreateDirectory (Configuration.DefaultConfiguration.FoldersPath);
|
||||
Syscall.chmod (Configuration.DefaultConfiguration.FoldersPath, (FilePermissions) 448); // 448 -> 700
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public override void SetFolderIcon ()
|
||||
{
|
||||
var gio_set = new Command ("gio", "set \"" + Configuration.DefaultConfiguration.FoldersPath + "\" " +
|
||||
"metadata::custom-icon-name org.sparkleshare.SparkleShare");
|
||||
|
||||
string XDG_DATA_HOME = Path.Combine (Config.HomePath, ".local", "share");
|
||||
gio_set.StartInfo.EnvironmentVariables ["XDG_DATA_HOME"] = XDG_DATA_HOME;
|
||||
|
||||
gio_set.StartAndWaitForExit ();
|
||||
}
|
||||
|
||||
|
||||
public override void CreateStartupItem ()
|
||||
{
|
||||
string autostart_file_path = Path.Combine (Path.GetDirectoryName (InstallationInfo.Directory),
|
||||
"applications", "SparkleShare.Autostart.desktop");
|
||||
|
||||
string autostart_file_dest = Path.Combine (Config.HomePath, ".config", "autostart", "SparkleShare.Autostart.desktop");
|
||||
string autostart_path = Path.GetDirectoryName (autostart_file_dest);
|
||||
|
||||
if (!Directory.Exists (autostart_path))
|
||||
Directory.CreateDirectory (autostart_path);
|
||||
|
||||
if (File.Exists (autostart_file_dest))
|
||||
return;
|
||||
|
||||
try {
|
||||
File.Copy (autostart_file_path, autostart_file_dest);
|
||||
Logger.LogInfo ("Controller", "Added SparkleShare to startup items");
|
||||
|
||||
} catch (Exception e) {
|
||||
Logger.LogInfo ("Controller", "Failed to add SparkleShare to startup items", e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public override void InstallProtocolHandler ()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
public override void CopyToClipboard (string text)
|
||||
{
|
||||
Clipboard.Get (Gdk.Atom.Intern ("CLIPBOARD", false)).Text = text;
|
||||
}
|
||||
|
||||
|
||||
public override void OpenFolder (string path)
|
||||
{
|
||||
OpenFile (path);
|
||||
}
|
||||
|
||||
|
||||
public override void OpenFile (string path)
|
||||
{
|
||||
if (InstallationInfo.IsFlatpak)
|
||||
Global.ShowUri (Gdk.Screen.Default, path);
|
||||
else
|
||||
new Command ("xdg-open", string.Format ("\"{0}\"", path)).Start ();
|
||||
}
|
||||
|
||||
|
||||
public override string EventLogHTML {
|
||||
get {
|
||||
string html_path = Path.Combine (InstallationInfo.Directory, "html", "event-log.html");
|
||||
string jquery_file_path = Path.Combine (InstallationInfo.Directory, "html", "jquery.js");
|
||||
|
||||
string html = File.ReadAllText (html_path);
|
||||
string jquery = File.ReadAllText (jquery_file_path);
|
||||
|
||||
return html.Replace ("<!-- $jquery -->", jquery);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public override string DayEntryHTML {
|
||||
get {
|
||||
string path = Path.Combine (InstallationInfo.Directory, "html", "day-entry.html");
|
||||
return File.ReadAllText (path);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public override string EventEntryHTML {
|
||||
get {
|
||||
string path = Path.Combine (InstallationInfo.Directory, "html", "event-entry.html");
|
||||
return File.ReadAllText (path);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public override string PresetsPath {
|
||||
get {
|
||||
return Path.Combine (InstallationInfo.Directory, "presets");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public override void PlatformQuit ()
|
||||
{
|
||||
Environment.Exit (0);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
// SparkleShare, a collaboration and sharing tool.
|
||||
// Copyright (C) 2010 Hylke Bons <hylkebons@gmail.com>
|
||||
// Copyright (C) 2010 Hylke Bons <hi@planetpeanut.uk>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
|
@ -16,41 +16,42 @@
|
|||
|
||||
|
||||
using System;
|
||||
using IO = System.IO;
|
||||
|
||||
using Gtk;
|
||||
using WebKit;
|
||||
using WebKit2;
|
||||
|
||||
namespace SparkleShare {
|
||||
|
||||
public class SparkleEventLog : Window {
|
||||
public class EventLog : Window {
|
||||
|
||||
public SparkleEventLogController Controller = new SparkleEventLogController ();
|
||||
public EventLogController Controller = new EventLogController ();
|
||||
|
||||
private Label size_label;
|
||||
private Label history_label;
|
||||
private ComboBox combo_box;
|
||||
private EventBox content_wrapper;
|
||||
private HBox combo_box_wrapper;
|
||||
private HBox layout_horizontal;
|
||||
private ScrolledWindow scrolled_window;
|
||||
private VBox spinner_wrapper;
|
||||
private Spinner spinner;
|
||||
private WebView web_view;
|
||||
|
||||
private int pos_x, pos_y;
|
||||
int pos_x, pos_y;
|
||||
|
||||
|
||||
public SparkleEventLog () : base ("Recent Changes")
|
||||
public EventLog () : base ("Recent Changes")
|
||||
{
|
||||
SetWmclass ("SparkleShare", "SparkleShare");
|
||||
TypeHint = Gdk.WindowTypeHint.Dialog;
|
||||
IconName = "org.sparkleshare.SparkleShare";
|
||||
|
||||
SetSizeRequest (480, 640);
|
||||
|
||||
Gdk.Rectangle monitor_0_rect = Gdk.Screen.Default.GetMonitorGeometry (0);
|
||||
SetSizeRequest (480, (int) (monitor_0_rect.Height * 0.8));
|
||||
|
||||
IconName = "sparkleshare";
|
||||
this.pos_x = (int) (monitor_0_rect.Width * 0.61);
|
||||
this.pos_y = (int) (monitor_0_rect.Height * 0.5 - (HeightRequest * 0.5));
|
||||
|
||||
Resize (480, (int) (monitor_0_rect.Height * 0.8));
|
||||
|
||||
pos_x = (int) (monitor_0_rect.Width * 0.62);
|
||||
pos_y = (int) ((monitor_0_rect.Height - (monitor_0_rect.Height * 0.8)) / 2);
|
||||
|
||||
this.size_label = new Label () { Xalign = 0, Markup = "<b>Size:</b> …" };
|
||||
this.history_label = new Label () { Xalign = 0, Markup = "<b>History:</b> …" };
|
||||
|
||||
|
@ -66,12 +67,11 @@ namespace SparkleShare {
|
|||
this.content_wrapper = new EventBox ();
|
||||
this.scrolled_window = new ScrolledWindow ();
|
||||
|
||||
this.content_wrapper.OverrideBackgroundColor (StateFlags.Normal,
|
||||
new Gdk.RGBA () { Red = 1, Green = 1, Blue=1, Alpha = 1 });
|
||||
|
||||
this.web_view = new WebView () { Editable = false };
|
||||
this.web_view.NavigationRequested += WebViewNavigationRequested;
|
||||
CssProvider css_provider = new CssProvider ();
|
||||
css_provider.LoadFromData ("GtkEventBox { background-color: #ffffff; }");
|
||||
this.content_wrapper.StyleContext.AddProvider (css_provider, 800);
|
||||
|
||||
this.web_view = CreateWebView ();
|
||||
this.scrolled_window.Add (this.web_view);
|
||||
|
||||
this.spinner_wrapper = new VBox (false, 0);
|
||||
|
@ -83,11 +83,6 @@ namespace SparkleShare {
|
|||
|
||||
this.content_wrapper.Add (this.spinner_wrapper);
|
||||
|
||||
this.layout_horizontal = new HBox (false, 0);
|
||||
this.layout_horizontal.PackStart (layout_sizes, true, true, 12);
|
||||
|
||||
layout_vertical.PackStart (this.layout_horizontal, false, false, 0);
|
||||
layout_vertical.PackStart (new HSeparator (), false, false, 0);
|
||||
layout_vertical.PackStart (this.content_wrapper, true, true, 0);
|
||||
|
||||
Add (layout_vertical);
|
||||
|
@ -104,7 +99,7 @@ namespace SparkleShare {
|
|||
|
||||
Controller.ShowWindowEvent += delegate {
|
||||
Application.Invoke (delegate {
|
||||
Move (this.pos_x, this.pos_y);
|
||||
Move (pos_x, pos_y);
|
||||
ShowAll ();
|
||||
Present ();
|
||||
});
|
||||
|
@ -128,14 +123,6 @@ namespace SparkleShare {
|
|||
});
|
||||
};
|
||||
|
||||
Controller.UpdateChooserEvent += delegate (string [] folders) {
|
||||
Application.Invoke (delegate { UpdateChooser (folders); });
|
||||
};
|
||||
|
||||
Controller.UpdateChooserEnablementEvent += delegate (bool enabled) {
|
||||
Application.Invoke (delegate { this.combo_box.Sensitive = enabled; });
|
||||
};
|
||||
|
||||
Controller.UpdateContentEvent += delegate (string html) {
|
||||
Application.Invoke (delegate { UpdateContent (html); });
|
||||
};
|
||||
|
@ -170,120 +157,81 @@ namespace SparkleShare {
|
|||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
public void UpdateChooser (string [] folders)
|
||||
{
|
||||
if (folders == null)
|
||||
folders = Controller.Folders;
|
||||
|
||||
if (this.combo_box_wrapper != null && this.combo_box_wrapper.Parent != null) {
|
||||
this.layout_horizontal.Remove (this.combo_box_wrapper);
|
||||
this.combo_box_wrapper.Remove (this.combo_box);
|
||||
}
|
||||
|
||||
this.combo_box_wrapper = new HBox (false, 0);
|
||||
this.combo_box = new ComboBox ();
|
||||
|
||||
CellRendererText cell = new CellRendererText();
|
||||
this.combo_box.PackStart (cell, false);
|
||||
this.combo_box.AddAttribute (cell, "text", 0);
|
||||
|
||||
ListStore store = new ListStore (typeof (string));
|
||||
|
||||
store.AppendValues ("Summary");
|
||||
store.AppendValues ("---");
|
||||
|
||||
this.combo_box.Model = store;
|
||||
this.combo_box.Active = 0;
|
||||
|
||||
int row = 2;
|
||||
foreach (string folder in folders) {
|
||||
store.AppendValues (folder);
|
||||
|
||||
if (folder.Equals (Controller.SelectedFolder))
|
||||
this.combo_box.Active = row;
|
||||
|
||||
row++;
|
||||
}
|
||||
|
||||
this.combo_box.RowSeparatorFunc = delegate (ITreeModel model, TreeIter iter) {
|
||||
string item = (string) this.combo_box.Model.GetValue (iter, 0);
|
||||
return (item == "---");
|
||||
};
|
||||
|
||||
this.combo_box.Changed += delegate {
|
||||
TreeIter iter;
|
||||
this.combo_box.GetActiveIter (out iter);
|
||||
string selection = (string) this.combo_box.Model.GetValue (iter, 0);
|
||||
TreePath path = this.combo_box.Model.GetPath (iter);
|
||||
|
||||
if (path.Indices [0] == 0)
|
||||
Controller.SelectedFolder = null;
|
||||
else
|
||||
Controller.SelectedFolder = selection;
|
||||
};
|
||||
|
||||
this.combo_box_wrapper.Add (this.combo_box);
|
||||
this.combo_box.GrabFocus ();
|
||||
|
||||
this.layout_horizontal.BorderWidth = 6;
|
||||
this.layout_horizontal.PackStart (this.combo_box_wrapper, false, false, 0);
|
||||
this.layout_horizontal.ShowAll ();
|
||||
}
|
||||
|
||||
|
||||
public void UpdateContent (string html)
|
||||
{
|
||||
string pixmaps_path = new string [] {SparkleUI.AssetsPath, "pixmaps"}.Combine ();
|
||||
string icons_path = new string [] {SparkleUI.AssetsPath, "icons", "hicolor", "12x12", "status"}.Combine ();
|
||||
string pixmaps_path = IO.Path.Combine (UserInterface.AssetsPath, "pixmaps");
|
||||
string icons_path = IO.Path.Combine (UserInterface.AssetsPath, "icons", "hicolor", "12x12", "status");
|
||||
|
||||
html = html.Replace ("<!-- $a-hover-color -->", "#009ff8");
|
||||
html = html.Replace ("<!-- $a-color -->", "#0085cf");
|
||||
|
||||
html = html.Replace ("<!-- $body-font-family -->", StyleContext.GetFont (StateFlags.Normal).Family);
|
||||
html = html.Replace ("<!-- $body-font-size -->", (double) (StyleContext.GetFont (StateFlags.Normal).Size / 1024 + 3) + "px");
|
||||
html = html.Replace ("<!-- $body-color -->", SparkleUIHelpers.RGBAToHex (StyleContext.GetColor (StateFlags.Normal)));
|
||||
html = html.Replace ("<!-- $body-background-color -->",
|
||||
SparkleUIHelpers.RGBAToHex (new TreeView ().StyleContext.GetBackgroundColor (StateFlags.Normal)));
|
||||
|
||||
html = html.Replace ("<!-- $body-color -->", UserInterfaceHelpers.RGBAToHex (StyleContext.GetColor (StateFlags.Normal)));
|
||||
html = html.Replace ("<!-- $body-background-color -->",UserInterfaceHelpers.RGBAToHex (new TreeView ().StyleContext.GetBackgroundColor (StateFlags.Normal)));
|
||||
html = html.Replace ("<!-- $day-entry-header-font-size -->", (StyleContext.GetFont (StateFlags.Normal).Size / 1024 + 3) + "px");
|
||||
html = html.Replace ("<!-- $day-entry-header-background-color -->",
|
||||
SparkleUIHelpers.RGBAToHex (StyleContext.GetBackgroundColor (StateFlags.Normal)));
|
||||
|
||||
html = html.Replace ("<!-- $secondary-font-color -->", SparkleUIHelpers.RGBAToHex (StyleContext.GetColor (StateFlags.Insensitive)));
|
||||
|
||||
html = html.Replace ("<!-- $small-color -->", SparkleUIHelpers.RGBAToHex (StyleContext.GetColor (StateFlags.Insensitive)));
|
||||
html = html.Replace ("<!-- $day-entry-header-background-color -->", UserInterfaceHelpers.RGBAToHex (StyleContext.GetBackgroundColor (StateFlags.Normal)));
|
||||
html = html.Replace ("<!-- $secondary-font-color -->", UserInterfaceHelpers.RGBAToHex (StyleContext.GetColor (StateFlags.Insensitive)));
|
||||
html = html.Replace ("<!-- $small-color -->", UserInterfaceHelpers.RGBAToHex (StyleContext.GetColor (StateFlags.Insensitive)));
|
||||
html = html.Replace ("<!-- $small-font-size -->", "90%");
|
||||
|
||||
html = html.Replace ("<!-- $pixmaps-path -->", pixmaps_path);
|
||||
html = html.Replace ("<!-- $document-added-background-image -->", "file://" + new string [] {icons_path, "document-added.png"}.Combine ());
|
||||
html = html.Replace ("<!-- $document-edited-background-image -->", "file://" + new string [] {icons_path, "document-edited.png"}.Combine ());
|
||||
html = html.Replace ("<!-- $document-deleted-background-image -->", "file://" + new string [] {icons_path, "document-deleted.png"}.Combine ());
|
||||
html = html.Replace ("<!-- $document-moved-background-image -->", "file://" + new string [] {icons_path, "document-moved.png"}.Combine ());
|
||||
|
||||
this.spinner.Stop ();
|
||||
this.scrolled_window.Remove (this.web_view);
|
||||
this.web_view.Dispose ();
|
||||
html = html.Replace ("<!-- $document-added-background-image -->", "file://" + IO.Path.Combine (icons_path, "document-added.png"));
|
||||
html = html.Replace ("<!-- $document-edited-background-image -->", "file://" + IO.Path.Combine (icons_path, "document-edited.png"));
|
||||
html = html.Replace ("<!-- $document-deleted-background-image -->", "file://" + IO.Path.Combine (icons_path, "document-deleted.png"));
|
||||
html = html.Replace ("<!-- $document-moved-background-image -->", "file://" + IO.Path.Combine (icons_path, "document-moved.png"));
|
||||
|
||||
this.spinner.Stop ();
|
||||
this.scrolled_window.Remove (this.scrolled_window.Child);
|
||||
|
||||
this.web_view.LoadHtml (html, "file:///");
|
||||
|
||||
this.web_view = new WebView () { Editable = false };
|
||||
this.web_view.LoadString (html, "text/html", "UTF-8", "file://");
|
||||
this.web_view.NavigationRequested += WebViewNavigationRequested;
|
||||
this.scrolled_window.Add (this.web_view);
|
||||
|
||||
this.content_wrapper.Remove (this.content_wrapper.Child);
|
||||
this.content_wrapper.Add (this.scrolled_window);
|
||||
|
||||
this.scrolled_window.ShowAll ();
|
||||
}
|
||||
|
||||
|
||||
private void WebViewNavigationRequested (object o, WebKit.NavigationRequestedArgs args) {
|
||||
Controller.LinkClicked (args.Request.Uri);
|
||||
WebView CreateWebView ()
|
||||
{
|
||||
var web_view = new SparkleWebView { Editable = false };
|
||||
web_view.Settings.EnablePlugins = false;
|
||||
|
||||
// Don't follow HREFs (as this would cause a page refresh)
|
||||
if (!args.Request.Uri.Equals ("file:"))
|
||||
args.RetVal = 1;
|
||||
web_view.LinkClicked += Controller.LinkClicked;
|
||||
|
||||
return web_view;
|
||||
}
|
||||
|
||||
|
||||
class SparkleWebView : WebView {
|
||||
|
||||
public event LinkClickedHandler LinkClicked = delegate { };
|
||||
public delegate void LinkClickedHandler (string href);
|
||||
|
||||
|
||||
protected override bool OnDecidePolicy (PolicyDecision decision, PolicyDecisionType decision_type)
|
||||
{
|
||||
if (decision_type != PolicyDecisionType.NavigationAction) {
|
||||
decision.Use ();
|
||||
return false;
|
||||
}
|
||||
|
||||
#pragma warning disable 0612
|
||||
string uri = (decision as NavigationPolicyDecision).Request.Uri;
|
||||
|
||||
if (uri.Equals ("file:///")) {
|
||||
decision.Use ();
|
||||
return false;
|
||||
}
|
||||
|
||||
LinkClicked (uri);
|
||||
decision.Ignore ();
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
BIN
SparkleShare/Linux/Images/gnome-software-screenshot-1.jpg
Normal file
After Width: | Height: | Size: 232 KiB |
BIN
SparkleShare/Linux/Images/gnome-software-screenshot-2.jpg
Normal file
After Width: | Height: | Size: 197 KiB |
BIN
SparkleShare/Linux/Images/gnome-software-screenshot-3.jpg
Normal file
After Width: | Height: | Size: 215 KiB |