Compare commits
6037 Commits
v1.0.1
...
test-errco
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
37aab966df | ||
|
|
d1347c3db0 | ||
|
|
fa9ff6709d | ||
|
|
2005a91891 | ||
|
|
ee8ee48418 | ||
|
|
5e634ac91f | ||
|
|
84afa86db2 | ||
|
|
ce16ce0aba | ||
|
|
d8396c2b46 | ||
|
|
a1fc6e4e65 | ||
|
|
fe08e8b6c9 | ||
|
|
fbbd651f05 | ||
|
|
e66b474ab9 | ||
|
|
bba7f47767 | ||
|
|
df888d22e7 | ||
|
|
e2cdc6a645 | ||
|
|
ba56e67129 | ||
|
|
bf887e6bdb | ||
|
|
c5dd8ad548 | ||
|
|
698515549b | ||
|
|
710e67ff83 | ||
|
|
eb91b83c83 | ||
|
|
24c1f43b2b | ||
|
|
55cc61d676 | ||
|
|
66c384d9c8 | ||
|
|
4e84153a5a | ||
|
|
94724ca443 | ||
|
|
b372451a76 | ||
|
|
0714ff780a | ||
|
|
fb35d550b1 | ||
|
|
8891274ccd | ||
|
|
39fd6e5407 | ||
|
|
685511981a | ||
|
|
2acff68f4c | ||
|
|
f921793af7 | ||
|
|
9818cc08f4 | ||
|
|
66194cf624 | ||
|
|
ab0d8477b9 | ||
|
|
72f8c6841b | ||
|
|
e41c50d461 | ||
|
|
1c1e05a8eb | ||
|
|
1614ca1def | ||
|
|
fe0c549bf7 | ||
|
|
2d09096317 | ||
|
|
22e0df5c11 | ||
|
|
092df7ecbd | ||
|
|
67cb0327fa | ||
|
|
e3615c6c99 | ||
|
|
65a76072df | ||
|
|
120101fdcc | ||
|
|
e8427ee33e | ||
|
|
1b35ab4cf7 | ||
|
|
180c888ba7 | ||
|
|
e0fd13bf4f | ||
|
|
a8fa943142 | ||
|
|
61953f4f7d | ||
|
|
fef5543392 | ||
|
|
3bc98aae2d | ||
|
|
923e943591 | ||
|
|
230513d61b | ||
|
|
636b00fe36 | ||
|
|
e7f76f44de | ||
|
|
48a8dda4f7 | ||
|
|
caf5b0d7c7 | ||
|
|
0a4a7daf71 | ||
|
|
5cd0f8f1ec | ||
|
|
1fb13fa5de | ||
|
|
d714e16333 | ||
|
|
f2e55fbf12 | ||
|
|
61a7c0f09a | ||
|
|
996eefc1a0 | ||
|
|
5ae56fc449 | ||
|
|
e3b9b5a8cd | ||
|
|
bef052ed8c | ||
|
|
c1b843ea2e | ||
|
|
d3a92132a1 | ||
|
|
638d2d4282 | ||
|
|
aa8c250c61 | ||
|
|
b3c60aaf10 | ||
|
|
0124a5c05d | ||
|
|
82e85c7083 | ||
|
|
87d64c6afe | ||
|
|
ad42eaed11 | ||
|
|
dd3f29be68 | ||
|
|
1055a11b03 | ||
|
|
cefeec9823 | ||
|
|
f6dcc2ba44 | ||
|
|
662584a115 | ||
|
|
43f782b6ce | ||
|
|
24120b61c0 | ||
|
|
78635e3f2b | ||
|
|
be0b5422ee | ||
|
|
53c28a954a | ||
|
|
6cc801ed06 | ||
|
|
2e457d5a74 | ||
|
|
dacee9e86f | ||
|
|
9d596e76dd | ||
|
|
358f57fb17 | ||
|
|
df68e1cb4f | ||
|
|
75bff3a3dd | ||
|
|
493e9b0570 | ||
|
|
24e7941b48 | ||
|
|
89f6bbc6a4 | ||
|
|
086835a31b | ||
|
|
e04f633fab | ||
|
|
3d119d4632 | ||
|
|
c16e7fc022 | ||
|
|
a990e6f19d | ||
|
|
7d69e35dcf | ||
|
|
52fa046346 | ||
|
|
7d7842c54e | ||
|
|
8cd9f730d7 | ||
|
|
e98d17b1b7 | ||
|
|
cb060ac585 | ||
|
|
8749e52809 | ||
|
|
e616136f33 | ||
|
|
931991f926 | ||
|
|
3c02880098 | ||
|
|
2637e81fa1 | ||
|
|
ab99be68e8 | ||
|
|
2c0ec630fd | ||
|
|
08f9bc705b | ||
|
|
16f215a82b | ||
|
|
518d63b9bc | ||
|
|
98837edfdd | ||
|
|
3b56c41406 | ||
|
|
44737777b6 | ||
|
|
3c8ae2370b | ||
|
|
b762650588 | ||
|
|
f3ec6346e0 | ||
|
|
8d6bd95c62 | ||
|
|
1ded8b64b1 | ||
|
|
202a90ab65 | ||
|
|
2a78974cc1 | ||
|
|
03d910028b | ||
|
|
89a1bf4742 | ||
|
|
331d90f198 | ||
|
|
34370e4cad | ||
|
|
fa72d06d80 | ||
|
|
c1975d4bb3 | ||
|
|
2e876dd58b | ||
|
|
dfb6c8e3d1 | ||
|
|
1f543e70b1 | ||
|
|
b536f489a4 | ||
|
|
442426d2b9 | ||
|
|
f230c06244 | ||
|
|
cd0acbba87 | ||
|
|
85e82b95ba | ||
|
|
e8dd795f4c | ||
|
|
47541c1d87 | ||
|
|
8d574b242b | ||
|
|
51ee11f7d8 | ||
|
|
c672e5b702 | ||
|
|
c7e684211d | ||
|
|
9069170b3d | ||
|
|
296def6596 | ||
|
|
6a43ca8302 | ||
|
|
ec35cf5e49 | ||
|
|
b902c9f266 | ||
|
|
38e1eee0e5 | ||
|
|
67612967f5 | ||
|
|
bd2d333a8d | ||
|
|
0d966603c4 | ||
|
|
cb13707d64 | ||
|
|
ffcc6743fd | ||
|
|
83321ad925 | ||
|
|
21cef30ca0 | ||
|
|
e382e6ad93 | ||
|
|
9f8cce569e | ||
|
|
d03d9d5383 | ||
|
|
6b24877924 | ||
|
|
383334efbe | ||
|
|
661871dd8d | ||
|
|
5b3c270468 | ||
|
|
36fee3f14a | ||
|
|
c7d2f7f3b2 | ||
|
|
b9ffab4a33 | ||
|
|
8b76ecd84e | ||
|
|
73fc29f93a | ||
|
|
6360980b66 | ||
|
|
74ea708893 | ||
|
|
b8e469fb2e | ||
|
|
a62860266b | ||
|
|
e103e9ad3b | ||
|
|
95cbf28b99 | ||
|
|
1e075a2468 | ||
|
|
b96707ea51 | ||
|
|
da3f9670e9 | ||
|
|
84ca9e560c | ||
|
|
05460a1b7e | ||
|
|
1f0aca8441 | ||
|
|
8413db3f03 | ||
|
|
8beb5c2e7b | ||
|
|
8ab6d91708 | ||
|
|
8d892da5a7 | ||
|
|
aac13ebae2 | ||
|
|
b188083452 | ||
|
|
ba7b9194c3 | ||
|
|
6a23a0dde9 | ||
|
|
85da9e0ac8 | ||
|
|
f75fabd664 | ||
|
|
b5e16aeb2c | ||
|
|
6c8f368908 | ||
|
|
43172ac8de | ||
|
|
35ceb7542a | ||
|
|
f661245d9f | ||
|
|
78cab78197 | ||
|
|
adb572a88f | ||
|
|
2411f4b8d5 | ||
|
|
6859352556 | ||
|
|
485abaa8f3 | ||
|
|
d968c1f976 | ||
|
|
edcd883b10 | ||
|
|
1a842c3e48 | ||
|
|
22cea07266 | ||
|
|
8278528aeb | ||
|
|
9ce683cd45 | ||
|
|
99c92a18fe | ||
|
|
44b622af37 | ||
|
|
b50dd674ab | ||
|
|
dc83136d81 | ||
|
|
e06b9ac674 | ||
|
|
4b77839202 | ||
|
|
89ae83850a | ||
|
|
6d0728bdc2 | ||
|
|
03a5f19816 | ||
|
|
69cf9dbcbe | ||
|
|
d3a2859b41 | ||
|
|
4dc9b86942 | ||
|
|
f3387c3787 | ||
|
|
a241ac1dd4 | ||
|
|
3d252540af | ||
|
|
4bf8a030ab | ||
|
|
deb049c01c | ||
|
|
13e64c129c | ||
|
|
b8f29e9c66 | ||
|
|
6dd16d2b67 | ||
|
|
ea39ae5ce2 | ||
|
|
bd9b5757f8 | ||
|
|
727a28d993 | ||
|
|
e045f562e7 | ||
|
|
a3662d16d1 | ||
|
|
728a78d48c | ||
|
|
5ec28faceb | ||
|
|
6224c937ad | ||
|
|
05ffb44ed5 | ||
|
|
6acc0a18b5 | ||
|
|
75df8db438 | ||
|
|
e926878e24 | ||
|
|
e0a12924b8 | ||
|
|
16e5710d68 | ||
|
|
fb37bea439 | ||
|
|
aac22db8fc | ||
|
|
85b45583f4 | ||
|
|
705e08a277 | ||
|
|
4a8f1d8392 | ||
|
|
5693bd3f07 | ||
|
|
5ca104c6fe | ||
|
|
b039e56b8a | ||
|
|
557980c63f | ||
|
|
fa274c2c40 | ||
|
|
2faf9698db | ||
|
|
12f6091122 | ||
|
|
dbb4e92e5d | ||
|
|
f6921161a0 | ||
|
|
b191d204ed | ||
|
|
27f0dc282b | ||
|
|
a3055f53af | ||
|
|
212c692228 | ||
|
|
f8bacd1dc2 | ||
|
|
7051c06c09 | ||
|
|
37e8dbfb94 | ||
|
|
97aa17af6c | ||
|
|
0ab9294fab | ||
|
|
0ad86f0cb4 | ||
|
|
246fce1136 | ||
|
|
2fcdd62149 | ||
|
|
a9c0a9a364 | ||
|
|
c097ce5ef7 | ||
|
|
1fd1db9e64 | ||
|
|
0e8589b068 | ||
|
|
b46e668f2e | ||
|
|
7625892baa | ||
|
|
b262103e48 | ||
|
|
0058cda6ee | ||
|
|
a918281625 | ||
|
|
3bd0553c6c | ||
|
|
68e48a39a6 | ||
|
|
9f07887329 | ||
|
|
e676a48c2c | ||
|
|
826b6113f8 | ||
|
|
ff7b6e200c | ||
|
|
a641f44486 | ||
|
|
7bf5a629af | ||
|
|
1a9df45ef6 | ||
|
|
1598c72794 | ||
|
|
8158a03b2d | ||
|
|
b5ff464efc | ||
|
|
2000b26049 | ||
|
|
7087bbe76d | ||
|
|
228514b1bf | ||
|
|
80c46919dd | ||
|
|
2aa7ed27e1 | ||
|
|
f3dacda90e | ||
|
|
cd273a9094 | ||
|
|
d9d64d810b | ||
|
|
dcd46e2363 | ||
|
|
a81ed61683 | ||
|
|
3554a89c41 | ||
|
|
09e63b293e | ||
|
|
21d7646431 | ||
|
|
b8d6440d6a | ||
|
|
bc6e694149 | ||
|
|
55099274fc | ||
|
|
9651549005 | ||
|
|
d41fddbba5 | ||
|
|
af4a6bddb2 | ||
|
|
b291d43d8f | ||
|
|
bca8cdee5c | ||
|
|
b1459cd7c7 | ||
|
|
90d77652ab | ||
|
|
e0d1a8b4e2 | ||
|
|
1d4b5960d2 | ||
|
|
54b651765b | ||
|
|
abb976fd53 | ||
|
|
16b41f83fe | ||
|
|
26c3c30b82 | ||
|
|
e8763f32d0 | ||
|
|
f61a5429a0 | ||
|
|
afacafbc97 | ||
|
|
dd283c1007 | ||
|
|
765a33db1f | ||
|
|
7a5c2f0038 | ||
|
|
f534a45c67 | ||
|
|
32c7029e63 | ||
|
|
634247a5c7 | ||
|
|
89bb7c14e1 | ||
|
|
21e4fcf7df | ||
|
|
38285c8885 | ||
|
|
b884b059e8 | ||
|
|
3b7705943c | ||
|
|
96bcc1bd4c | ||
|
|
72244b82f5 | ||
|
|
01ab3d28cc | ||
|
|
313a8c3a4a | ||
|
|
bcf5362316 | ||
|
|
08b9af8254 | ||
|
|
d26c9da4e0 | ||
|
|
da88ca85d4 | ||
|
|
4c17c64403 | ||
|
|
4c45148eca | ||
|
|
e00b686c80 | ||
|
|
40045710d4 | ||
|
|
fcd747ec88 | ||
|
|
5bb8d7fd0d | ||
|
|
0a71526698 | ||
|
|
b64f621b40 | ||
|
|
85bf1f44e0 | ||
|
|
1b109964ff | ||
|
|
2663c60850 | ||
|
|
703b5ebda0 | ||
|
|
d446516be8 | ||
|
|
576b699495 | ||
|
|
6e08f66ba7 | ||
|
|
11d3f4af0c | ||
|
|
02a1d10a8b | ||
|
|
f17de168d6 | ||
|
|
57028450df | ||
|
|
32d9eb83d1 | ||
|
|
acff4e01c2 | ||
|
|
25faf3579a | ||
|
|
efac87fbcf | ||
|
|
f4c51d1377 | ||
|
|
290d7cffde | ||
|
|
232abf46a4 | ||
|
|
02b4c012ad | ||
|
|
b4844a8a88 | ||
|
|
b7b988dff5 | ||
|
|
b6a0c32fdd | ||
|
|
b8974f09fb | ||
|
|
aa9042bd62 | ||
|
|
edad1eee41 | ||
|
|
be79131498 | ||
|
|
de185a74ea | ||
|
|
4d7b49aa1f | ||
|
|
8b31f676c2 | ||
|
|
6c7c5dea7b | ||
|
|
dd1c6154d8 | ||
|
|
3bdeb29483 | ||
|
|
2b14eae33d | ||
|
|
e2e1cb19c7 | ||
|
|
f1d2d4321c | ||
|
|
668f213974 | ||
|
|
c3fca48b9f | ||
|
|
5fbfafb1ab | ||
|
|
d10f14e934 | ||
|
|
df3f8b5a58 | ||
|
|
53a560afac | ||
|
|
e804358c8f | ||
|
|
753c0d9803 | ||
|
|
60670c5012 | ||
|
|
41c5b084ea | ||
|
|
e8042c9e3e | ||
|
|
1ba6bef27a | ||
|
|
501e03e57e | ||
|
|
1d441a9623 | ||
|
|
5f783fa078 | ||
|
|
2401cd3525 | ||
|
|
b17037f8d5 | ||
|
|
f34996f6e3 | ||
|
|
8a21e07d6d | ||
|
|
f389359dd0 | ||
|
|
85de9aaefb | ||
|
|
df148ae5af | ||
|
|
d1728463b0 | ||
|
|
6c271ef546 | ||
|
|
30d8276986 | ||
|
|
b8c3400145 | ||
|
|
4c8c30f496 | ||
|
|
c16c78aca5 | ||
|
|
b2e67b38c7 | ||
|
|
0c73b03e45 | ||
|
|
af406c3be4 | ||
|
|
f9d6ffdc1b | ||
|
|
597a3cf9b5 | ||
|
|
103cb3cb99 | ||
|
|
7bfd9aef2f | ||
|
|
8f21e7dcd2 | ||
|
|
1d22b44dd4 | ||
|
|
95cf1e292b | ||
|
|
9b271da739 | ||
|
|
5061047164 | ||
|
|
9e7bc1b769 | ||
|
|
724d8bcd97 | ||
|
|
ba3aa74469 | ||
|
|
2039b760b1 | ||
|
|
5983f429eb | ||
|
|
219d57528b | ||
|
|
02f8003b4d | ||
|
|
d35dd21374 | ||
|
|
708f55004c | ||
|
|
60bc755b36 | ||
|
|
df7e64513f | ||
|
|
d0f0fd6e66 | ||
|
|
0eaceafcf9 | ||
|
|
6230b53501 | ||
|
|
c5f1d874c8 | ||
|
|
14801b0e4e | ||
|
|
5974012fba | ||
|
|
416bf4921c | ||
|
|
6a6283f2e4 | ||
|
|
1b21dd6ee7 | ||
|
|
74289e912f | ||
|
|
7f585330ae | ||
|
|
241a4ad0b5 | ||
|
|
0467a24813 | ||
|
|
fc49325bb8 | ||
|
|
0394ee34e2 | ||
|
|
568f6abe80 | ||
|
|
ec5e3b269d | ||
|
|
d78db822a1 | ||
|
|
3b382aca99 | ||
|
|
d402115d66 | ||
|
|
3039cd5fc4 | ||
|
|
faa0522f41 | ||
|
|
ae0947efa3 | ||
|
|
62d4a4dd9c | ||
|
|
5f571f962f | ||
|
|
e0c70742a8 | ||
|
|
b87fd91dd7 | ||
|
|
22a93d814c | ||
|
|
16f0d0875d | ||
|
|
16475f3a70 | ||
|
|
73c74a929b | ||
|
|
76fd103a82 | ||
|
|
5fab4d3138 | ||
|
|
8ec4ebbc32 | ||
|
|
6ce26f93cc | ||
|
|
ca2eee17bc | ||
|
|
eb6cf53a0a | ||
|
|
f6e9104fa3 | ||
|
|
720c351da8 | ||
|
|
37dd079129 | ||
|
|
d0aa0a8772 | ||
|
|
e8e306eb98 | ||
|
|
b6b77376d5 | ||
|
|
37f8718bbb | ||
|
|
628a18c3ed | ||
|
|
b776b3f15e | ||
|
|
3a1dd0cb1d | ||
|
|
e7797167cb | ||
|
|
4ae5acefc0 | ||
|
|
044741ff20 | ||
|
|
49d391d9bd | ||
|
|
6f273832ea | ||
|
|
394b609a44 | ||
|
|
04b9e328b1 | ||
|
|
8e41e7cbbd | ||
|
|
af38f09faf | ||
|
|
01f773c0f8 | ||
|
|
71fd442c44 | ||
|
|
a2f3d11110 | ||
|
|
d01bd205ca | ||
|
|
97c08e982b | ||
|
|
f57f838e39 | ||
|
|
a9d7c5c33e | ||
|
|
a6e6476fef | ||
|
|
9614d1f31b | ||
|
|
1f5259d36a | ||
|
|
711c4878a8 | ||
|
|
405a9b75b0 | ||
|
|
833c052cea | ||
|
|
fb429c70c4 | ||
|
|
c53daa76f2 | ||
|
|
6646c393cb | ||
|
|
1dad0b06d1 | ||
|
|
70758c306a | ||
|
|
2358ec3d90 | ||
|
|
8a8cd8655a | ||
|
|
c3345af45a | ||
|
|
1c8df25603 | ||
|
|
a19d4eb44e | ||
|
|
5c610fd24d | ||
|
|
a2bdd3d30a | ||
|
|
bdb110a88c | ||
|
|
8f1988e23c | ||
|
|
731ee8b49f | ||
|
|
fd1527e112 | ||
|
|
87fb6d95ee | ||
|
|
7f66185798 | ||
|
|
99429a75fa | ||
|
|
c7684fe026 | ||
|
|
eb0bd2f4dd | ||
|
|
3131a4f83a | ||
|
|
d81b294384 | ||
|
|
dacf6cca31 | ||
|
|
9b633b6729 | ||
|
|
9fd8dfcf53 | ||
|
|
b004811809 | ||
|
|
3533dbd354 | ||
|
|
eccb8b7b30 | ||
|
|
b89d5ec0ab | ||
|
|
cf8d52d305 | ||
|
|
510cf9ff29 | ||
|
|
fc3c38ab65 | ||
|
|
6530bb65e4 | ||
|
|
4f6fb10006 | ||
|
|
5377f1501d | ||
|
|
316d766511 | ||
|
|
9e84009f74 | ||
|
|
478357fec3 | ||
|
|
6b6c6cabaa | ||
|
|
cad7b76d97 | ||
|
|
2446a5d48c | ||
|
|
7a3ff78d5a | ||
|
|
4451da23e8 | ||
|
|
67ad00ab04 | ||
|
|
9d3237e0ab | ||
|
|
9e66fd6263 | ||
|
|
ea8e5b241e | ||
|
|
20fc982f1f | ||
|
|
5e64903ca0 | ||
|
|
fbb9014fa6 | ||
|
|
ba8d14a5bf | ||
|
|
10c1e1df5a | ||
|
|
311192a122 | ||
|
|
4abf6d51ea | ||
|
|
32c2e7f5b1 | ||
|
|
437800d269 | ||
|
|
edaa6aefe6 | ||
|
|
41b8c242a7 | ||
|
|
95c1259d65 | ||
|
|
2e1d852095 | ||
|
|
03679caed9 | ||
|
|
fc1425b797 | ||
|
|
ed29bc1b5c | ||
|
|
b52e111de9 | ||
|
|
e679ddcde2 | ||
|
|
6ba457d7f9 | ||
|
|
f7d347ff4a | ||
|
|
0b5838c79b | ||
|
|
dbec5f2191 | ||
|
|
ccccf35344 | ||
|
|
a313dddaa6 | ||
|
|
54a5e06f37 | ||
|
|
2d6c837f0d | ||
|
|
f7cf573ba8 | ||
|
|
63f4757071 | ||
|
|
f35da7b8ba | ||
|
|
6bef075122 | ||
|
|
0d881c2139 | ||
|
|
b64e9af92f | ||
|
|
cc20c7af4b | ||
|
|
e6b7fe43d3 | ||
|
|
7456d3e8c0 | ||
|
|
01ccb6f404 | ||
|
|
9abff13008 | ||
|
|
8aff2e86a8 | ||
|
|
dd99f52355 | ||
|
|
303e2c4ecc | ||
|
|
6b204c6066 | ||
|
|
d4cb40c390 | ||
|
|
1dab783299 | ||
|
|
945b638d4d | ||
|
|
52b079a582 | ||
|
|
2c58335b9b | ||
|
|
482ea572c4 | ||
|
|
351c5bacfa | ||
|
|
89d5f7bd45 | ||
|
|
798f946651 | ||
|
|
6fc7fd1318 | ||
|
|
c4e23c09df | ||
|
|
1ebe0294ac | ||
|
|
5d4b290d06 | ||
|
|
ce7686800c | ||
|
|
46d2d04b20 | ||
|
|
f95e970de8 | ||
|
|
e8b46663ab | ||
|
|
b2bf50a4f2 | ||
|
|
24dbbb3857 | ||
|
|
150089c2b9 | ||
|
|
042d4ca670 | ||
|
|
eb841d0e0d | ||
|
|
2043abb24b | ||
|
|
651c904aff | ||
|
|
32ea0d4fcc | ||
|
|
e05d617893 | ||
|
|
c3b16aa678 | ||
|
|
e283e66f00 | ||
|
|
ead25c24ec | ||
|
|
b357f8508f | ||
|
|
6035bd5683 | ||
|
|
ec5f617437 | ||
|
|
20afd0a51f | ||
|
|
1e6e8ebf23 | ||
|
|
ac357f93eb | ||
|
|
a1d194266e | ||
|
|
73f31df60b | ||
|
|
16ca6313e8 | ||
|
|
143def1b0d | ||
|
|
84b26f1ac9 | ||
|
|
28c9f7fb77 | ||
|
|
30479902a0 | ||
|
|
563ed58544 | ||
|
|
2afe26336d | ||
|
|
88a2df00bd | ||
|
|
d0c2def5f6 | ||
|
|
d0e650b1d8 | ||
|
|
8df2b2357a | ||
|
|
68bc2c53b3 | ||
|
|
5c50be3c50 | ||
|
|
9884dcd7b1 | ||
|
|
dbb8c889ef | ||
|
|
de2f3a8582 | ||
|
|
22f4c3bf89 | ||
|
|
1ab8e42dd8 | ||
|
|
b6f20d1772 | ||
|
|
9ea3e4c758 | ||
|
|
17e747049c | ||
|
|
1ef3f527f3 | ||
|
|
f82b15e12b | ||
|
|
f8a2721406 | ||
|
|
aaf746d6dc | ||
|
|
6ac95de7b7 | ||
|
|
7397928acf | ||
|
|
d5b8c32433 | ||
|
|
2073c4bf46 | ||
|
|
6f3b4a9f02 | ||
|
|
c31b7af944 | ||
|
|
20828746ea | ||
|
|
22e0fc216b | ||
|
|
f5c80ffd50 | ||
|
|
d18c7e2c52 | ||
|
|
f6c6ea8706 | ||
|
|
c8b4b9b669 | ||
|
|
c402621359 | ||
|
|
ed978c40b2 | ||
|
|
b95496df73 | ||
|
|
b34d1e7ee7 | ||
|
|
12b2cc79ca | ||
|
|
2d57c94d0e | ||
|
|
121523626d | ||
|
|
4eb311dd21 | ||
|
|
573a669ac2 | ||
|
|
287b028ba8 | ||
|
|
d369d05ee4 | ||
|
|
a62335a910 | ||
|
|
4509530859 | ||
|
|
4cca3b54e4 | ||
|
|
3b4c8ad2f0 | ||
|
|
7df211ca18 | ||
|
|
a94ef2c290 | ||
|
|
0fd38ece0a | ||
|
|
c9334ca827 | ||
|
|
8d998ad63c | ||
|
|
72aa6d5eab | ||
|
|
b00bd8bc35 | ||
|
|
6b612ec345 | ||
|
|
66757099f6 | ||
|
|
d03e8634fb | ||
|
|
137751e5a9 | ||
|
|
e24d89ce52 | ||
|
|
455aa79dad | ||
|
|
5f7fa2a7a2 | ||
|
|
c0f8b9910a | ||
|
|
640313386b | ||
|
|
cfa543802e | ||
|
|
5d617cc240 | ||
|
|
9c76988225 | ||
|
|
334e1b77b6 | ||
|
|
076551594b | ||
|
|
4f01e10f65 | ||
|
|
8793271541 | ||
|
|
180b8c2d3f | ||
|
|
5c8208e0f8 | ||
|
|
3e1f97e300 | ||
|
|
0935f1d57b | ||
|
|
3b5ab4cb41 | ||
|
|
7a7a912352 | ||
|
|
d855beb354 | ||
|
|
573b39f248 | ||
|
|
e6b2a9f8f9 | ||
|
|
45ad252a44 | ||
|
|
6da0c38927 | ||
|
|
d7401e085d | ||
|
|
508cdf06ba | ||
|
|
f0a8b828be | ||
|
|
cf39ea7364 | ||
|
|
122f649da7 | ||
|
|
84ee1cdf9f | ||
|
|
4214521dea | ||
|
|
5c9ecf38df | ||
|
|
16231ee077 | ||
|
|
0dc16d54a5 | ||
|
|
c2a5f664af | ||
|
|
88427518b0 | ||
|
|
0a227f8731 | ||
|
|
aaf62f3e27 | ||
|
|
554445eeba | ||
|
|
83541fbbc8 | ||
|
|
64bb44d181 | ||
|
|
1fc2264028 | ||
|
|
66d996cbc1 | ||
|
|
cae843a6e3 | ||
|
|
469458dd2a | ||
|
|
180309c878 | ||
|
|
56a04aaf82 | ||
|
|
dc637059ab | ||
|
|
f4ba537328 | ||
|
|
9c594dacde | ||
|
|
0071252777 | ||
|
|
f6cebdbdef | ||
|
|
94b5703399 | ||
|
|
c80babaef6 | ||
|
|
b94dfae6b8 | ||
|
|
f57bdf42dd | ||
|
|
95e4506279 | ||
|
|
2ab6136b2f | ||
|
|
4dccfd0a81 | ||
|
|
cfbf1593c6 | ||
|
|
f815e9bd9a | ||
|
|
2196f69804 | ||
|
|
e3d907f113 | ||
|
|
2a7e305992 | ||
|
|
705ec6f65e | ||
|
|
b5fc6dbf04 | ||
|
|
9ec692585d | ||
|
|
c0ef0a8660 | ||
|
|
fde574be1b | ||
|
|
d891a1ca8e | ||
|
|
681c0747dd | ||
|
|
9d8f86f778 | ||
|
|
7f805e89bb | ||
|
|
4bcad908da | ||
|
|
886f59e19d | ||
|
|
8ad343e97c | ||
|
|
22c1b8eb59 | ||
|
|
2bd22b42b7 | ||
|
|
e1d2c52519 | ||
|
|
5bf165d2c3 | ||
|
|
934e531840 | ||
|
|
b05bedf243 | ||
|
|
9f523d980a | ||
|
|
d2068857e1 | ||
|
|
e6e5268df9 | ||
|
|
f86fd1fd95 | ||
|
|
8d57409392 | ||
|
|
6b9353d7b5 | ||
|
|
3fa1a5c485 | ||
|
|
ee7016753a | ||
|
|
0b0f38da20 | ||
|
|
1f02053ed3 | ||
|
|
d30fc3ef54 | ||
|
|
da180aacdd | ||
|
|
88ef5251f4 | ||
|
|
2b58579c0a | ||
|
|
df7c98e27d | ||
|
|
b7de5c46cf | ||
|
|
a927215197 | ||
|
|
ba45e9d50c | ||
|
|
57d623af9a | ||
|
|
4faced7d51 | ||
|
|
36da39e5ab | ||
|
|
a6f30db53b | ||
|
|
255c5ed1c3 | ||
|
|
5da12839fb | ||
|
|
a49f69ba8f | ||
|
|
5ddc04e992 | ||
|
|
984686e073 | ||
|
|
72e6f8bc99 | ||
|
|
ea299b73aa | ||
|
|
68563d4edd | ||
|
|
5432ea0869 | ||
|
|
e860991f06 | ||
|
|
fedee55842 | ||
|
|
c739b32e24 | ||
|
|
cfb600a632 | ||
|
|
c2f4550166 | ||
|
|
2152f5d45d | ||
|
|
1394f5add7 | ||
|
|
a2e845ec9f | ||
|
|
f118705a8f | ||
|
|
7dd93aa395 | ||
|
|
554c0961c1 | ||
|
|
d61bede62a | ||
|
|
5a1ba91872 | ||
|
|
7b48444a85 | ||
|
|
bf86c53915 | ||
|
|
0488ce6428 | ||
|
|
f4020a2508 | ||
|
|
fb668b3f0c | ||
|
|
c04b85aa29 | ||
|
|
f18b03987e | ||
|
|
a2b0edf8de | ||
|
|
3202b6869d | ||
|
|
22633cbe77 | ||
|
|
5f0346be77 | ||
|
|
9445f74e1a | ||
|
|
bbcc6c212a | ||
|
|
aed8536080 | ||
|
|
cce90a109d | ||
|
|
1039d44284 | ||
|
|
ede2097678 | ||
|
|
bde01538a0 | ||
|
|
3fa96b0700 | ||
|
|
111fbdcccf | ||
|
|
c81d958b78 | ||
|
|
0d3a1ba6f6 | ||
|
|
1a56deeb21 | ||
|
|
987e6b1004 | ||
|
|
85461165e8 | ||
|
|
15f6626282 | ||
|
|
c33eb316b3 | ||
|
|
f6d63cca46 | ||
|
|
085fc7adbf | ||
|
|
97bcab6c64 | ||
|
|
efa8d9297a | ||
|
|
96100501e7 | ||
|
|
2558e2a1db | ||
|
|
682eda06b2 | ||
|
|
7818bb100d | ||
|
|
e3b4ea7977 | ||
|
|
1578176f39 | ||
|
|
f6761d2544 | ||
|
|
993d048989 | ||
|
|
9910f98d1a | ||
|
|
80505ca74c | ||
|
|
dec9761a17 | ||
|
|
a882e12092 | ||
|
|
9b7451fa92 | ||
|
|
430d9e0a84 | ||
|
|
cb40e47c21 | ||
|
|
bd07c964a4 | ||
|
|
20c20ce01a | ||
|
|
33be38339e | ||
|
|
32343e17f8 | ||
|
|
97c1b235b5 | ||
|
|
5ece607224 | ||
|
|
c90eb51177 | ||
|
|
b0c06e9ee7 | ||
|
|
f5b618f76d | ||
|
|
00282652ea | ||
|
|
c021922213 | ||
|
|
2409d17892 | ||
|
|
b5234ad226 | ||
|
|
fe517070f9 | ||
|
|
0dec7e3a3c | ||
|
|
2fbe46eb6c | ||
|
|
cbe6005212 | ||
|
|
d55bb2c529 | ||
|
|
387a3cbe96 | ||
|
|
c81fb9ceca | ||
|
|
a83b4fc5d8 | ||
|
|
ffecab72d8 | ||
|
|
063062a0ad | ||
|
|
c2cd2e5d7c | ||
|
|
ee712593d1 | ||
|
|
8843933d45 | ||
|
|
b27efd54cc | ||
|
|
39aeabcd24 | ||
|
|
267cfe24ce | ||
|
|
12b19bdf64 | ||
|
|
c7f7e7c782 | ||
|
|
bd07594ae0 | ||
|
|
909b57558e | ||
|
|
0345099e99 | ||
|
|
38f0f37ece | ||
|
|
bb73b7e675 | ||
|
|
666e1f9273 | ||
|
|
bd6fb0b831 | ||
|
|
66ad26b71b | ||
|
|
b4e228c33e | ||
|
|
e2710958e2 | ||
|
|
3dac37b89b | ||
|
|
73747e0b38 | ||
|
|
5edcb9908d | ||
|
|
9b89b5c782 | ||
|
|
53a5ab4ebc | ||
|
|
2c3b6669d6 | ||
|
|
23daab441c | ||
|
|
1f59d9cda4 | ||
|
|
42f8709150 | ||
|
|
728aa97c86 | ||
|
|
2a33eaf4ea | ||
|
|
8ec04f46b0 | ||
|
|
93fe0d3cd7 | ||
|
|
2fd768df75 | ||
|
|
55c79c805f | ||
|
|
d1875af9be | ||
|
|
ff65eeddba | ||
|
|
18156980d9 | ||
|
|
8c5970e527 | ||
|
|
102072ef24 | ||
|
|
e7e287b6c1 | ||
|
|
3613787a6b | ||
|
|
e27be8f698 | ||
|
|
ca04748862 | ||
|
|
d0c042844e | ||
|
|
3c1b0e3994 | ||
|
|
330e8d0f05 | ||
|
|
3390dfff8d | ||
|
|
01f4a206c7 | ||
|
|
7becc2cfdd | ||
|
|
82a33d1c8c | ||
|
|
de661a54cd | ||
|
|
cb26321847 | ||
|
|
cfb157d2e4 | ||
|
|
a999b9d0c4 | ||
|
|
96321a2469 | ||
|
|
4777bdeb7e | ||
|
|
4706d830a2 | ||
|
|
de7d4fac85 | ||
|
|
4c7986e1b8 | ||
|
|
5873ed3b51 | ||
|
|
94847770bf | ||
|
|
4a013de0f1 | ||
|
|
3d46297aa4 | ||
|
|
9843d5c7ba | ||
|
|
53abc2703d | ||
|
|
aea5525de3 | ||
|
|
becbba877a | ||
|
|
fa477c2d17 | ||
|
|
862fca1019 | ||
|
|
83d91c7dc9 | ||
|
|
9158b62789 | ||
|
|
81d6ca8b31 | ||
|
|
8399613018 | ||
|
|
2fa02983fb | ||
|
|
9f19fd46e7 | ||
|
|
7975a377a0 | ||
|
|
eba6993726 | ||
|
|
05ae254d3d | ||
|
|
3d647ee41b | ||
|
|
8a073a9dfb | ||
|
|
3239dfe0a0 | ||
|
|
429d5da1d2 | ||
|
|
4c18e47e96 | ||
|
|
1199a45784 | ||
|
|
c8ba439a2c | ||
|
|
d9afe8a562 | ||
|
|
6fb9992957 | ||
|
|
7e7d5fc41b | ||
|
|
1291420db0 | ||
|
|
ad7fa572b5 | ||
|
|
07309b872b | ||
|
|
5017c61e28 | ||
|
|
d2a4ea5c4e | ||
|
|
3ccdc96229 | ||
|
|
dce1769bcc | ||
|
|
59fe9f0ca9 | ||
|
|
98e22cc699 | ||
|
|
735c35bd0f | ||
|
|
39c35e840d | ||
|
|
2baf208c02 | ||
|
|
132e1b987c | ||
|
|
a0d61769b2 | ||
|
|
52f49140b2 | ||
|
|
f109ead705 | ||
|
|
393dfa5902 | ||
|
|
a5380a971b | ||
|
|
2ba38d30f9 | ||
|
|
e08a127213 | ||
|
|
53ed7728f5 | ||
|
|
6382528360 | ||
|
|
889e6b0d84 | ||
|
|
be3c866dc0 | ||
|
|
ac8a53b1b3 | ||
|
|
c96d6b48d1 | ||
|
|
e794769eea | ||
|
|
87ae907df1 | ||
|
|
d88c45c415 | ||
|
|
985fa74b34 | ||
|
|
2564c2f06e | ||
|
|
0a90986d14 | ||
|
|
3ea2128b93 | ||
|
|
1e683fcf95 | ||
|
|
646cf767f9 | ||
|
|
56cd2b0a46 | ||
|
|
77a9fad102 | ||
|
|
1f80758ebb | ||
|
|
d2d3ee4979 | ||
|
|
19b8bd0ff6 | ||
|
|
2b0e0eb9e5 | ||
|
|
254313d11f | ||
|
|
1bb33a2dfc | ||
|
|
11ebe4e234 | ||
|
|
486e69fd33 | ||
|
|
ea7d61d281 | ||
|
|
b07bb1765e | ||
|
|
74e4c1cf2c | ||
|
|
c21523f863 | ||
|
|
900858e4ea | ||
|
|
c0d72d91fb | ||
|
|
008efc56d8 | ||
|
|
97608e47cd | ||
|
|
be98943d2a | ||
|
|
b05e89cd67 | ||
|
|
119f8bf820 | ||
|
|
c036d27b36 | ||
|
|
7eb28e7d0a | ||
|
|
1e8eb76013 | ||
|
|
c92e48dfa3 | ||
|
|
adfd117926 | ||
|
|
71156eca21 | ||
|
|
33a09acdee | ||
|
|
4230136064 | ||
|
|
aa09e77ab6 | ||
|
|
b24960449d | ||
|
|
357245691d | ||
|
|
c5974781fb | ||
|
|
78d5fa30ba | ||
|
|
762d6516a5 | ||
|
|
e0a422fd16 | ||
|
|
99c486295b | ||
|
|
7e2db9cd43 | ||
|
|
0aaa8cb36b | ||
|
|
c2862424f2 | ||
|
|
26de3bd859 | ||
|
|
eec9446abe | ||
|
|
3e15014e0a | ||
|
|
69106a4cca | ||
|
|
0bd80a81eb | ||
|
|
13adde5223 | ||
|
|
607fa18f27 | ||
|
|
f03c72541a | ||
|
|
05fc63a350 | ||
|
|
54e6299dc4 | ||
|
|
3519cfb3ab | ||
|
|
8e8270b090 | ||
|
|
2f6aa39824 | ||
|
|
d1c07f2e5c | ||
|
|
fd19cd89a3 | ||
|
|
58206f983e | ||
|
|
2e24846e15 | ||
|
|
7c8c809fb8 | ||
|
|
c9fd336812 | ||
|
|
04347bcc0d | ||
|
|
19f5354721 | ||
|
|
2f8c65f930 | ||
|
|
c8fd03a693 | ||
|
|
40333d62e3 | ||
|
|
a765160ee3 | ||
|
|
40da937c4c | ||
|
|
91e2f3caeb | ||
|
|
befd5c8636 | ||
|
|
1921e5b030 | ||
|
|
506a417b0b | ||
|
|
9716d478bd | ||
|
|
553606d2a8 | ||
|
|
7fd9a84271 | ||
|
|
7445f96e66 | ||
|
|
cf968c0b4c | ||
|
|
26341a5187 | ||
|
|
2ce1bc84f2 | ||
|
|
67e1faefd8 | ||
|
|
835cd6d14a | ||
|
|
22fa9dc0ba | ||
|
|
ea9c9a496b | ||
|
|
15610438d8 | ||
|
|
2966afca6b | ||
|
|
47637175d7 | ||
|
|
3f65376a35 | ||
|
|
3d9945393a | ||
|
|
ba6dddf986 | ||
|
|
f38bac44b4 | ||
|
|
202f033c02 | ||
|
|
0ffce32f62 | ||
|
|
d2cd3618e0 | ||
|
|
e7b1377444 | ||
|
|
73e6fbbe91 | ||
|
|
c331d6f200 | ||
|
|
5c38ffa15e | ||
|
|
a60dc3189c | ||
|
|
92d941b747 | ||
|
|
007e0cff26 | ||
|
|
1117488eec | ||
|
|
57c082c545 | ||
|
|
5a886f6837 | ||
|
|
f3937499fa | ||
|
|
0fd1e785fe | ||
|
|
1f935531f6 | ||
|
|
d725b9538f | ||
|
|
962c39f3c2 | ||
|
|
62920d3dd0 | ||
|
|
12d25e91bf | ||
|
|
9539f93640 | ||
|
|
23c704e93b | ||
|
|
ce87ef0a04 | ||
|
|
31833d06ba | ||
|
|
38d3c5d94d | ||
|
|
1f03ebdbe7 | ||
|
|
6ce1c6c048 | ||
|
|
9a0f9c2270 | ||
|
|
baae7875aa | ||
|
|
e99753f188 | ||
|
|
a8dd306196 | ||
|
|
642743957e | ||
|
|
be847d5d5e | ||
|
|
690a2195da | ||
|
|
63f5169dbe | ||
|
|
a529ba4f5b | ||
|
|
1680b96b65 | ||
|
|
17de3e7927 | ||
|
|
69f147a70c | ||
|
|
a0f3307fe3 | ||
|
|
574399669c | ||
|
|
e888910f3c | ||
|
|
cc93335d7f | ||
|
|
74d1d760aa | ||
|
|
2a60974ebd | ||
|
|
51d8c0ba51 | ||
|
|
f2d33991e1 | ||
|
|
970e6c40b4 | ||
|
|
7b17ed6303 | ||
|
|
808cd69429 | ||
|
|
cbfe679f06 | ||
|
|
42c9cc61ab | ||
|
|
d75d1f57e4 | ||
|
|
460cf8d8ba | ||
|
|
b8ef0b3513 | ||
|
|
becd3eb8f1 | ||
|
|
8dea2cacf4 | ||
|
|
d5b721be30 | ||
|
|
14e3e561ea | ||
|
|
4866e88eab | ||
|
|
fab8277086 | ||
|
|
e2421d7aa2 | ||
|
|
ea8de45a6c | ||
|
|
6c1525bd62 | ||
|
|
15d48fb0ad | ||
|
|
5b4cc786ed | ||
|
|
a40ad5df68 | ||
|
|
cb4b41476b | ||
|
|
4680b1e6be | ||
|
|
8d8c5071b5 | ||
|
|
a03bdb35ff | ||
|
|
41fb79d995 | ||
|
|
8437c9a38b | ||
|
|
eba9b8ad44 | ||
|
|
e9865539de | ||
|
|
a74c60927f | ||
|
|
49f855e1d1 | ||
|
|
3bc6e66b1a | ||
|
|
6de048d84f | ||
|
|
fcbcfbb17c | ||
|
|
fd2fb3dcaa | ||
|
|
2a49abc74a | ||
|
|
d827c9c598 | ||
|
|
37999fe322 | ||
|
|
316fa10257 | ||
|
|
384cca3689 | ||
|
|
19f3a9e077 | ||
|
|
64db33a6fd | ||
|
|
16561e1589 | ||
|
|
9995b1c8ab | ||
|
|
acb7a8be2d | ||
|
|
188dc6d322 | ||
|
|
6a95025e41 | ||
|
|
df78784ede | ||
|
|
6b98f27656 | ||
|
|
e96ae5907e | ||
|
|
0c5e5207e6 | ||
|
|
f6f4409357 | ||
|
|
714a68fc44 | ||
|
|
a3410beaec | ||
|
|
85b6f00b66 | ||
|
|
a2b7c4da7e | ||
|
|
b7413dffb2 | ||
|
|
fdf20f31c3 | ||
|
|
726f83a683 | ||
|
|
5a3cea56fa | ||
|
|
104b5748b8 | ||
|
|
1d04b6c924 | ||
|
|
b3031ea529 | ||
|
|
b2e4dce77a | ||
|
|
e6c02fcb8f | ||
|
|
5310f60422 | ||
|
|
5c6141d0e6 | ||
|
|
c33dab0e30 | ||
|
|
9bb30406ee | ||
|
|
845f858e7a | ||
|
|
b8a1b6644b | ||
|
|
b5a080623c | ||
|
|
dffc8da28f | ||
|
|
8c87b0c595 | ||
|
|
6afb47ba06 | ||
|
|
e9eea7cd9a | ||
|
|
ce72365842 | ||
|
|
d0211ebd89 | ||
|
|
2f6c5c6fe2 | ||
|
|
0536a5fee2 | ||
|
|
c3b109ad4a | ||
|
|
3f74d076f2 | ||
|
|
ef94239727 | ||
|
|
247c45db9d | ||
|
|
8dd2d3054f | ||
|
|
6d03169f12 | ||
|
|
9d80220d68 | ||
|
|
2c08e1c361 | ||
|
|
656206c95a | ||
|
|
2d476021a6 | ||
|
|
b67ce3c462 | ||
|
|
311cdbfdae | ||
|
|
102c300f24 | ||
|
|
daffe8a7b7 | ||
|
|
23c2d81c2c | ||
|
|
7631629468 | ||
|
|
351b59020d | ||
|
|
eeffefc9fc | ||
|
|
8c931818fd | ||
|
|
a018245d43 | ||
|
|
8b3ca92457 | ||
|
|
2986227f1c | ||
|
|
0b1c198dfe | ||
|
|
54a74c0b82 | ||
|
|
e28e6891d4 | ||
|
|
83b7794836 | ||
|
|
4547e809bf | ||
|
|
27a1197a97 | ||
|
|
bd4c6b1a97 | ||
|
|
217765be6e | ||
|
|
eb946ad181 | ||
|
|
9a68a9645a | ||
|
|
59b99edf79 | ||
|
|
8867c5e14a | ||
|
|
cf29bd6227 | ||
|
|
8a44305440 | ||
|
|
fed4dbd54f | ||
|
|
6187b15a88 | ||
|
|
4792ab7489 | ||
|
|
380ba11af0 | ||
|
|
0fa6ff2136 | ||
|
|
63cf4a60ae | ||
|
|
e243012438 | ||
|
|
863e32898a | ||
|
|
639e0c403a | ||
|
|
9fcfdc9fab | ||
|
|
78a30a7663 | ||
|
|
9645d16b2d | ||
|
|
bc2ae99ba7 | ||
|
|
cddf35fb2b | ||
|
|
6780be6d56 | ||
|
|
53d13ee17c | ||
|
|
3e8edce014 | ||
|
|
0b086e19a9 | ||
|
|
d9b1bc6c41 | ||
|
|
9709271ae3 | ||
|
|
04068d25cb | ||
|
|
c7a8536278 | ||
|
|
5feffcef42 | ||
|
|
d73ab781fe | ||
|
|
0b39dd9097 | ||
|
|
01a27008a1 | ||
|
|
a348af74fa | ||
|
|
ee738e11cd | ||
|
|
8ea9484255 | ||
|
|
012a173629 | ||
|
|
e326acb578 | ||
|
|
b61ab1201a | ||
|
|
ef0b9a9ebe | ||
|
|
1e1fc188b4 | ||
|
|
768f1ce032 | ||
|
|
c624880863 | ||
|
|
bebe89162f | ||
|
|
a86bb8dddf | ||
|
|
fd186e9e82 | ||
|
|
abc303d1b3 | ||
|
|
7a248377f0 | ||
|
|
6f09dfecd6 | ||
|
|
662254f30f | ||
|
|
d545a7f753 | ||
|
|
e7de7b4b64 | ||
|
|
c558bfa3ee | ||
|
|
a9c093ac59 | ||
|
|
4f0813889c | ||
|
|
c0afe5d24a | ||
|
|
49e7f15130 | ||
|
|
f6600edea0 | ||
|
|
cfefc757af | ||
|
|
549a0aceb0 | ||
|
|
745c96349d | ||
|
|
78034dc83a | ||
|
|
c15edd11ad | ||
|
|
7f861fa5c3 | ||
|
|
6f3320ab55 | ||
|
|
aca2843224 | ||
|
|
4ac827020d | ||
|
|
232a1be53e | ||
|
|
2cd0b34f5b | ||
|
|
7e622ae784 | ||
|
|
5447f27c80 | ||
|
|
1e24f651c8 | ||
|
|
2be3c9b0ad | ||
|
|
05f4333152 | ||
|
|
4081ed2ac6 | ||
|
|
acadfd2c35 | ||
|
|
955e776d3f | ||
|
|
946fba17ef | ||
|
|
a957f2227b | ||
|
|
ae2e09e48b | ||
|
|
82f499f942 | ||
|
|
3bcc696826 | ||
|
|
10cf431ccf | ||
|
|
7776db83ea | ||
|
|
8368b670e1 | ||
|
|
a3aa965b37 | ||
|
|
48722ebe36 | ||
|
|
f693b6f335 | ||
|
|
1f089cbbe3 | ||
|
|
b828f1d3d1 | ||
|
|
0c98231fcd | ||
|
|
046d645ef6 | ||
|
|
944b1a6680 | ||
|
|
8904ebccbc | ||
|
|
fae6fdc3ed | ||
|
|
889f3031bf | ||
|
|
ee11636d7e | ||
|
|
471b9cbea6 | ||
|
|
90c6130bc6 | ||
|
|
3421610acb | ||
|
|
4c25686060 | ||
|
|
2bc2b4cf24 | ||
|
|
9aea3b4981 | ||
|
|
12a0ab8ae8 | ||
|
|
2ccf040fbb | ||
|
|
0aa0b257ee | ||
|
|
90974298cd | ||
|
|
e10b0743dc | ||
|
|
040fd345e0 | ||
|
|
4c5210af59 | ||
|
|
b9edc90349 | ||
|
|
415f1f41c7 | ||
|
|
6d4cee96c8 | ||
|
|
7789b2251a | ||
|
|
c8717c88ea | ||
|
|
d3b711e91b | ||
|
|
7f3ee77116 | ||
|
|
52e03b0149 | ||
|
|
540c33ba74 | ||
|
|
74ba5ba614 | ||
|
|
1043142970 | ||
|
|
4c4a8341c4 | ||
|
|
4beb348333 | ||
|
|
a87a8c1fb3 | ||
|
|
9ce50095b5 | ||
|
|
345bf3a882 | ||
|
|
ca1cdbdeb7 | ||
|
|
5813d13fe4 | ||
|
|
ff6a503f53 | ||
|
|
f8ad35a6f7 | ||
|
|
107f4c950b | ||
|
|
e55167d0bf | ||
|
|
5df6847f7d | ||
|
|
c63f7c9e48 | ||
|
|
60876e865b | ||
|
|
30e9b44054 | ||
|
|
f0943276cb | ||
|
|
5dfda23ded | ||
|
|
e7f6f0f93e | ||
|
|
2c91185102 | ||
|
|
c1746fb32e | ||
|
|
380bf1cc8c | ||
|
|
320c978e94 | ||
|
|
f5309ee3b8 | ||
|
|
6bb8160a99 | ||
|
|
6eb13df2e2 | ||
|
|
13132efc6c | ||
|
|
32af58e861 | ||
|
|
ea614167a6 | ||
|
|
d80cf34f26 | ||
|
|
37d04c9fa0 | ||
|
|
102ab98276 | ||
|
|
555fc52acc | ||
|
|
4c5613084c | ||
|
|
d6704aed80 | ||
|
|
52d8ec6aee | ||
|
|
3fe9ee22fe | ||
|
|
1513933922 | ||
|
|
6ad93962aa | ||
|
|
373b317b1a | ||
|
|
757fd4bf0b | ||
|
|
5a77f91fa0 | ||
|
|
757a668047 | ||
|
|
427376977c | ||
|
|
5604ec9902 | ||
|
|
6ca1d403b2 | ||
|
|
5ca36ebc10 | ||
|
|
3ea0d1f765 | ||
|
|
94b0d55516 | ||
|
|
b26f115e67 | ||
|
|
5b175377ee | ||
|
|
9575ba74e8 | ||
|
|
23c24308f7 | ||
|
|
8143d589aa | ||
|
|
bfb67ed6b7 | ||
|
|
8ae9c2a278 | ||
|
|
a2674bfe9f | ||
|
|
612fe2173e | ||
|
|
a6562e5a0e | ||
|
|
77b2d4aad0 | ||
|
|
120477c092 | ||
|
|
8f0e6149be | ||
|
|
7342d2ebd0 | ||
|
|
65cd769645 | ||
|
|
15ff930661 | ||
|
|
df6eb2e6f1 | ||
|
|
9b830eb559 | ||
|
|
9945a2f8dc | ||
|
|
56306f33d7 | ||
|
|
79f7e17759 | ||
|
|
e07c9077ca | ||
|
|
a862fa3960 | ||
|
|
0ed07dfa2a | ||
|
|
db89a13f65 | ||
|
|
080dfa5563 | ||
|
|
2ca3f4673b | ||
|
|
de6fbf82e2 | ||
|
|
b2ea5036db | ||
|
|
a743a2cfd2 | ||
|
|
cdb8197156 | ||
|
|
b74e6b52f3 | ||
|
|
3a93f60555 | ||
|
|
ebe689324b | ||
|
|
3a23153e48 | ||
|
|
ebd1de919d | ||
|
|
4deedb6856 | ||
|
|
5e845c8fb6 | ||
|
|
d06235d28e | ||
|
|
f177715ada | ||
|
|
96d9b25b57 | ||
|
|
e93425c574 | ||
|
|
6150419842 | ||
|
|
7050b64b19 | ||
|
|
9c59b4d21d | ||
|
|
90fc925360 | ||
|
|
bff7d0923a | ||
|
|
d991947d4c | ||
|
|
fc009c7c6c | ||
|
|
8d0148c4ba | ||
|
|
9ecd43af73 | ||
|
|
82c3f871f4 | ||
|
|
84904b7eca | ||
|
|
acfdb90b6e | ||
|
|
0c417d3471 | ||
|
|
c2cfb32c45 | ||
|
|
ab6fa41438 | ||
|
|
2edb3cfd8c | ||
|
|
4ac9943565 | ||
|
|
886818e54c | ||
|
|
1538917089 | ||
|
|
e30e391756 | ||
|
|
cae6c53b01 | ||
|
|
4cf29ad565 | ||
|
|
586a113994 | ||
|
|
0411a5045b | ||
|
|
03ccd0131a | ||
|
|
e513a09e45 | ||
|
|
08fdac83fc | ||
|
|
0547f25ecb | ||
|
|
c019dd5f1e | ||
|
|
4c426c7c7c | ||
|
|
d7640ca864 | ||
|
|
ae8478dc5e | ||
|
|
cfe6aff3ac | ||
|
|
ffaf0bd021 | ||
|
|
2a0ad5c7af | ||
|
|
92764b3727 | ||
|
|
66aaa9b152 | ||
|
|
bb94a7947c | ||
|
|
dd7a7d9cda | ||
|
|
3106f671af | ||
|
|
e103644929 | ||
|
|
1e43ad2fc0 | ||
|
|
7930c230e4 | ||
|
|
50664c2486 | ||
|
|
c74841fd96 | ||
|
|
9f8833baa1 | ||
|
|
b41a0a66ef | ||
|
|
a26ca657fe | ||
|
|
8bdf86172f | ||
|
|
76565cded1 | ||
|
|
be11da75ae | ||
|
|
f586ab1ac2 | ||
|
|
fa8ca69a9e | ||
|
|
c8004279a4 | ||
|
|
2f1c064413 | ||
|
|
9c76722c90 | ||
|
|
2af2716c2c | ||
|
|
4fc00109ef | ||
|
|
2359d7ab37 | ||
|
|
eac2619c33 | ||
|
|
b4443c843a | ||
|
|
dae0c25a57 | ||
|
|
432627353c | ||
|
|
22c372a9d0 | ||
|
|
d54cab5d03 | ||
|
|
d56fef0a88 | ||
|
|
e1a27e6aea | ||
|
|
94d50a6c71 | ||
|
|
1d6e2ac000 | ||
|
|
f3e37650c6 | ||
|
|
3bae8edb39 | ||
|
|
28fb738410 | ||
|
|
cd00d91eee | ||
|
|
e94bf6216c | ||
|
|
62a2cf2976 | ||
|
|
f9e09d67bb | ||
|
|
a1e66e9da0 | ||
|
|
5751062605 | ||
|
|
edc09af93f | ||
|
|
ae40c8c8c0 | ||
|
|
9e4b59034d | ||
|
|
7e9b8f6808 | ||
|
|
6201e5c206 | ||
|
|
be1bf240ad | ||
|
|
e27d66cd2e | ||
|
|
f5fbe1d852 | ||
|
|
5bb42593ba | ||
|
|
762c49625c | ||
|
|
9b0682705e | ||
|
|
7338b633c8 | ||
|
|
141cfef1b6 | ||
|
|
2b38381296 | ||
|
|
c318c62542 | ||
|
|
d9359817c1 | ||
|
|
6ef8228064 | ||
|
|
5be441f4fd | ||
|
|
da9f4bb78e | ||
|
|
f0a0e0ade6 | ||
|
|
98769fefae | ||
|
|
5e6f9448bc | ||
|
|
ff542e83fe | ||
|
|
20ba4e33e8 | ||
|
|
1f7d2d73c7 | ||
|
|
ffdc7b8f9d | ||
|
|
fe2cf94d36 | ||
|
|
4683712e05 | ||
|
|
dc33071478 | ||
|
|
b6d19dba00 | ||
|
|
29a1f5b4f7 | ||
|
|
1ff8ba7fc2 | ||
|
|
f517e63fca | ||
|
|
bedb9e117b | ||
|
|
0d0a90a14b | ||
|
|
52a0a8aca4 | ||
|
|
3cc8e6a0a0 | ||
|
|
b2cdf4279d | ||
|
|
1b3eaed0e5 | ||
|
|
6619183a48 | ||
|
|
ed466387e4 | ||
|
|
c93aa15473 | ||
|
|
5baf05ba5e | ||
|
|
83950263ad | ||
|
|
71f1fcee57 | ||
|
|
64caafd6b6 | ||
|
|
e070a602f9 | ||
|
|
dea9a4c8fa | ||
|
|
0f776fb2f3 | ||
|
|
e147dc5b1b | ||
|
|
c63b543a4a | ||
|
|
e83a070e81 | ||
|
|
d4b125d010 | ||
|
|
bba819854c | ||
|
|
f40ae89c8c | ||
|
|
12eba46dab | ||
|
|
446ac63898 | ||
|
|
7c00d0f621 | ||
|
|
8f30818328 | ||
|
|
5d66ff951c | ||
|
|
1ae1f77a14 | ||
|
|
c237510080 | ||
|
|
9eb0ee55f3 | ||
|
|
731112e61b | ||
|
|
461fd5f1ff | ||
|
|
8435508f35 | ||
|
|
20829cdd28 | ||
|
|
4d8e19c6bb | ||
|
|
f5c4e755eb | ||
|
|
05d00a8174 | ||
|
|
b7d724a5e4 | ||
|
|
42c0e014e7 | ||
|
|
e1b6e054f0 | ||
|
|
a61a3253a5 | ||
|
|
c5f1c940d8 | ||
|
|
b7645ffda6 | ||
|
|
b27aa040f7 | ||
|
|
4cb7a286b9 | ||
|
|
1ed62aad97 | ||
|
|
b4f967ea97 | ||
|
|
d87cc24f9e | ||
|
|
d7ea41fa1a | ||
|
|
a9dec0c832 | ||
|
|
048d4b83e1 | ||
|
|
f3d43f8578 | ||
|
|
884d28b9a8 | ||
|
|
8fd81edc44 | ||
|
|
7414c20dd2 | ||
|
|
b607cc806a | ||
|
|
d2309aab32 | ||
|
|
6b47c471f7 | ||
|
|
03a7048d31 | ||
|
|
991a4d1d95 | ||
|
|
bf5a5bffa0 | ||
|
|
52e393dc45 | ||
|
|
ac1032800f | ||
|
|
217d6380f7 | ||
|
|
ec7f44358c | ||
|
|
452d9840bf | ||
|
|
adc84b68e7 | ||
|
|
cba70e3196 | ||
|
|
0f5cfbb2dc | ||
|
|
a3593379f6 | ||
|
|
85ebf24325 | ||
|
|
dbf41bf21f | ||
|
|
09c6fbdfe4 | ||
|
|
00e43cc955 | ||
|
|
b7107edc71 | ||
|
|
a92dd54354 | ||
|
|
2e3bb941b0 | ||
|
|
f985689a39 | ||
|
|
7e1b69cc3c | ||
|
|
4aaac8595a | ||
|
|
0e97285e0a | ||
|
|
4b3d965783 | ||
|
|
1e1c6de56e | ||
|
|
aff1c1f35e | ||
|
|
79c30fdc69 | ||
|
|
5d7809624c | ||
|
|
6eb231aae4 | ||
|
|
759432794f | ||
|
|
a15051bfde | ||
|
|
d6d6afb788 | ||
|
|
0198a628da | ||
|
|
bfc202f31f | ||
|
|
d26daa23f1 | ||
|
|
5da1195274 | ||
|
|
29b05499df | ||
|
|
ab30c77836 | ||
|
|
fc2d07212d | ||
|
|
8a1702fcf7 | ||
|
|
ccc7e6b3c8 | ||
|
|
eecf8bb8ae | ||
|
|
1075754458 | ||
|
|
414915eb3b | ||
|
|
2f7b65730a | ||
|
|
b422b49c06 | ||
|
|
00d64119fa | ||
|
|
d46970f519 | ||
|
|
099bbbb5d3 | ||
|
|
772a46e041 | ||
|
|
22f4d8f66d | ||
|
|
96ef753c77 | ||
|
|
ca6b704377 | ||
|
|
ddb4e1e6ea | ||
|
|
8975f62433 | ||
|
|
e2d61b3eb6 | ||
|
|
15cfe949bc | ||
|
|
8c6c7ee21f | ||
|
|
90e82ec2ef | ||
|
|
285ca8aff3 | ||
|
|
a016a48f9e | ||
|
|
b4ddf198bd | ||
|
|
42adc7bccc | ||
|
|
956df9b376 | ||
|
|
7b5560db69 | ||
|
|
26905e4cdb | ||
|
|
ac284b696a | ||
|
|
9a7ed2d24d | ||
|
|
62f0d1043d | ||
|
|
4826810c2a | ||
|
|
41d62937ff | ||
|
|
ba264e557b | ||
|
|
f20e9e71b7 | ||
|
|
b3ae69ce94 | ||
|
|
ec43f2847e | ||
|
|
324a0ae0ae | ||
|
|
db51bc87e2 | ||
|
|
6d700765d2 | ||
|
|
2193d380ca | ||
|
|
f5adb7a17e | ||
|
|
3423b224fd | ||
|
|
77edbe1edd | ||
|
|
dad31652ad | ||
|
|
bf5fbe8d6f | ||
|
|
0565474732 | ||
|
|
0a2e55311c | ||
|
|
4a32e98e62 | ||
|
|
84c59cecfb | ||
|
|
8fc54a7379 | ||
|
|
f4baf847ca | ||
|
|
66b6d5fc2f | ||
|
|
cfa5420d9d | ||
|
|
1716de808f | ||
|
|
26794503c3 | ||
|
|
4645eec8b6 | ||
|
|
0443b517fb | ||
|
|
90aa699d5f | ||
|
|
4f96cc9b1b | ||
|
|
7d3b203d03 | ||
|
|
ca1dde558b | ||
|
|
210d04d488 | ||
|
|
49983b8c83 | ||
|
|
1b09353991 | ||
|
|
8c30bde86e | ||
|
|
32d99595fb | ||
|
|
b801cde5c4 | ||
|
|
3d8902c670 | ||
|
|
d91039c99d | ||
|
|
516285952d | ||
|
|
bec4a89f7b | ||
|
|
d59c4367fb | ||
|
|
22c63ecdbd | ||
|
|
99504eec2e | ||
|
|
830ebdd472 | ||
|
|
795a90a194 | ||
|
|
1aa3ac9399 | ||
|
|
a2c4bccdb6 | ||
|
|
3320f81c8f | ||
|
|
64dee9f989 | ||
|
|
3b4c227519 | ||
|
|
f98d894a4b | ||
|
|
4d4a451926 | ||
|
|
adfcfac711 | ||
|
|
8e49d7e567 | ||
|
|
2243e8194d | ||
|
|
b637a29348 | ||
|
|
d5a9647902 | ||
|
|
77156014a1 | ||
|
|
e167d80469 | ||
|
|
ff88f5d54a | ||
|
|
730be9db47 | ||
|
|
01f7262d3a | ||
|
|
83eba5a9ea | ||
|
|
47b725ac69 | ||
|
|
dec0c8cc47 | ||
|
|
b7f0e2e6f3 | ||
|
|
e8a24ab59e | ||
|
|
0e5f3dacd6 | ||
|
|
778e3e5cd2 | ||
|
|
082a3b7e65 | ||
|
|
348cb921eb | ||
|
|
e175ef2b4e | ||
|
|
5402d33519 | ||
|
|
174c3e5fae | ||
|
|
f6cc91d7db | ||
|
|
94b0e60e83 | ||
|
|
0eb77e9b35 | ||
|
|
c3f6a0fa15 | ||
|
|
eb810f8dca | ||
|
|
645b8dc0a9 | ||
|
|
a9151868b0 | ||
|
|
c1af64854c | ||
|
|
dab552aed4 | ||
|
|
26b5ed72df | ||
|
|
eb3bb7948f | ||
|
|
c55785783d | ||
|
|
7ed60bd8f9 | ||
|
|
4649ce5354 | ||
|
|
848e861304 | ||
|
|
803ecd3f92 | ||
|
|
5bb731f884 | ||
|
|
cd6c056e73 | ||
|
|
6658566144 | ||
|
|
a5a1cbb077 | ||
|
|
2e19e3109e | ||
|
|
2b1868f558 | ||
|
|
3651274d68 | ||
|
|
1d42c220af | ||
|
|
cbe68507f3 | ||
|
|
c2fbcd1f22 | ||
|
|
d67515f53f | ||
|
|
d4952ebc16 | ||
|
|
0f3691893e | ||
|
|
fb436e7713 | ||
|
|
aafe17a0f3 | ||
|
|
80bde864c1 | ||
|
|
7c92de7899 | ||
|
|
e550c9a874 | ||
|
|
4bea4252ff | ||
|
|
ef475cb9d9 | ||
|
|
abd957a459 | ||
|
|
39463e68e3 | ||
|
|
01d3977766 | ||
|
|
26e130122c | ||
|
|
4ad6b74d75 | ||
|
|
40470bc320 | ||
|
|
839af18f49 | ||
|
|
e7eee16cf1 | ||
|
|
4067d7e4b9 | ||
|
|
d44c286ff3 | ||
|
|
bac9ba000e | ||
|
|
00bd22041b | ||
|
|
b3e141a3ce | ||
|
|
e0d05e1fa8 | ||
|
|
4c931fba5c | ||
|
|
d6b5a5278e | ||
|
|
954e01c951 | ||
|
|
8ecdcbfc0a | ||
|
|
4e580cb848 | ||
|
|
83c782df9f | ||
|
|
618ff03cbe | ||
|
|
b18fb5cd31 | ||
|
|
6aa4974e29 | ||
|
|
026649f875 | ||
|
|
467d44adc6 | ||
|
|
6bce40535e | ||
|
|
82c1b2352c | ||
|
|
fa45eb1fa8 | ||
|
|
29321b4e09 | ||
|
|
d50248ffd2 | ||
|
|
b881924144 | ||
|
|
1693359010 | ||
|
|
1e3e243a7f | ||
|
|
c1d6f5809b | ||
|
|
1b4f6054ae | ||
|
|
1ba5cde076 | ||
|
|
5c99bdf14f | ||
|
|
79b5d4b8bd | ||
|
|
67c082ab7b | ||
|
|
ec23d22d6d | ||
|
|
d9eb55d9df | ||
|
|
f38dc3b1f1 | ||
|
|
26ed14d1d3 | ||
|
|
5b8f66404c | ||
|
|
21a1e7dff2 | ||
|
|
2a76dc3ac8 | ||
|
|
007daaa014 | ||
|
|
8e1f524f68 | ||
|
|
0bec6eeb57 | ||
|
|
d49022c16a | ||
|
|
4c6e02f805 | ||
|
|
f76afd3185 | ||
|
|
b83260ca30 | ||
|
|
25f0173c10 | ||
|
|
0a81dd040f | ||
|
|
d2d8b9c41c | ||
|
|
c7237a64bb | ||
|
|
1d25a5e53f | ||
|
|
d6edb4aa8c | ||
|
|
704b18d900 | ||
|
|
16fa05f76e | ||
|
|
6a87d26420 | ||
|
|
8eee04e7be | ||
|
|
00b4538b0a | ||
|
|
b162909147 | ||
|
|
1e92e0ab28 | ||
|
|
0e1982083e | ||
|
|
29a78c469d | ||
|
|
cf4499e958 | ||
|
|
e241c65a9c | ||
|
|
a218bc1daa | ||
|
|
4688767c51 | ||
|
|
dc5ee4436e | ||
|
|
17d3ef2469 | ||
|
|
3e340f345d | ||
|
|
399e1520d6 | ||
|
|
56a89ad33b | ||
|
|
f65cd2aefc | ||
|
|
7b0eeb3049 | ||
|
|
39fc655b1a | ||
|
|
069b978b23 | ||
|
|
15166f53b0 | ||
|
|
b021089360 | ||
|
|
52ceb7682d | ||
|
|
4e10b361ed | ||
|
|
eebf7ca893 | ||
|
|
945449108d | ||
|
|
ebd329558c | ||
|
|
5e4e960524 | ||
|
|
68d595b558 | ||
|
|
5bf8f6728e | ||
|
|
c760b520ff | ||
|
|
601fac7a04 | ||
|
|
891e631b91 | ||
|
|
87e61046cb | ||
|
|
7fc279a329 | ||
|
|
c90d4330df | ||
|
|
19ae659e44 | ||
|
|
870cc25beb | ||
|
|
0b2854ddda | ||
|
|
36e82d0a6d | ||
|
|
7e4bc249be | ||
|
|
d9becad8e9 | ||
|
|
5af01e4da1 | ||
|
|
8d029a7ab3 | ||
|
|
0d3984233b | ||
|
|
640960a87b | ||
|
|
46a7a76b43 | ||
|
|
6e26c0d986 | ||
|
|
f83e8659be | ||
|
|
8b821ce32e | ||
|
|
9067172424 | ||
|
|
da48b27ada | ||
|
|
f528535cfd | ||
|
|
adccfff581 | ||
|
|
65cfb5c898 | ||
|
|
0a57d5a426 | ||
|
|
8e47b55ab4 | ||
|
|
142b9386fc | ||
|
|
6ab9cff3c3 | ||
|
|
f538a86e10 | ||
|
|
0f17f52c2c | ||
|
|
3e0c6f94ed | ||
|
|
727bf623b3 | ||
|
|
eea7adb1b8 | ||
|
|
3751e633e4 | ||
|
|
3f52c03b1d | ||
|
|
e31d162870 | ||
|
|
87d0e296c1 | ||
|
|
ffd306f25c | ||
|
|
58866c1b41 | ||
|
|
1d428785d1 | ||
|
|
df6bd5719d | ||
|
|
a55e27c581 | ||
|
|
d21b1e6e78 | ||
|
|
86157b4f7a | ||
|
|
12514a632d | ||
|
|
775951a09f | ||
|
|
46c6f532dc | ||
|
|
65a4c39ab8 | ||
|
|
beeb0f3e00 | ||
|
|
7a34a4e5aa | ||
|
|
a6f6915336 | ||
|
|
3c4051c5fc | ||
|
|
4854db030f | ||
|
|
822db2a63e | ||
|
|
38013d272b | ||
|
|
21ea555183 | ||
|
|
07d3467b7a | ||
|
|
689611bcd5 | ||
|
|
7061bf7667 | ||
|
|
b14863aea6 | ||
|
|
3f739459db | ||
|
|
3e344c16a2 | ||
|
|
99bcc50eb8 | ||
|
|
8a6435ddf6 | ||
|
|
62a67905af | ||
|
|
033d1e0919 | ||
|
|
a30162df52 | ||
|
|
87ce1895e3 | ||
|
|
80b22e0e0e | ||
|
|
40438f529a | ||
|
|
50d6b4053a | ||
|
|
176c65ebaf | ||
|
|
51529eece3 | ||
|
|
9b070bd8df | ||
|
|
24896299d3 | ||
|
|
16c9f670cf | ||
|
|
12cf665d42 | ||
|
|
28e0125d55 | ||
|
|
f78304602c | ||
|
|
0c9ca254e6 | ||
|
|
c16a994fd4 | ||
|
|
b224b1ab40 | ||
|
|
e2ebe19aff | ||
|
|
8e8ee2b968 | ||
|
|
29c1bb86d8 | ||
|
|
1797267a6b | ||
|
|
a35bb0ddc0 | ||
|
|
55cbc26742 | ||
|
|
6c3e710223 | ||
|
|
cc1a9e1d4a | ||
|
|
fcb7639833 | ||
|
|
6416127e39 | ||
|
|
82c32d24a1 | ||
|
|
6641637f12 | ||
|
|
fd8dd47d2a | ||
|
|
5e48231d51 | ||
|
|
31ff1cb673 | ||
|
|
022da8bdbd | ||
|
|
6bd62610dd | ||
|
|
a657fd8d51 | ||
|
|
ba81f0e4b9 | ||
|
|
fb1e10f32c | ||
|
|
44e6a5570e | ||
|
|
231e0adea1 | ||
|
|
57928f900e | ||
|
|
8be1ee90f6 | ||
|
|
35774878db | ||
|
|
0f4170907f | ||
|
|
56d4064b90 | ||
|
|
979f617209 | ||
|
|
da637d1ec2 | ||
|
|
653fce11da | ||
|
|
3270cbab8c | ||
|
|
8cc76e83f6 | ||
|
|
c9dc7885e9 | ||
|
|
a5dbcad87c | ||
|
|
939e6c9e4d | ||
|
|
f8372c2744 | ||
|
|
4e9f4ecaff | ||
|
|
92ee864b45 | ||
|
|
b0834ae437 | ||
|
|
6c6e02967a | ||
|
|
425ba5946f | ||
|
|
3720134fbd | ||
|
|
4e96e77d26 | ||
|
|
5ddc08e4fd | ||
|
|
21e44518cb | ||
|
|
fd7b0da269 | ||
|
|
f51ff6fa19 | ||
|
|
ec9ad4a06d | ||
|
|
e67dc28e82 | ||
|
|
007f9912eb | ||
|
|
8286fdc4d0 | ||
|
|
6c7b80f853 | ||
|
|
b6fc96aa31 | ||
|
|
d06dc3e4b5 | ||
|
|
16864dab7d | ||
|
|
8becaf07c7 | ||
|
|
fbffd9ea26 | ||
|
|
03dd50e25c | ||
|
|
8431b40c16 | ||
|
|
f5fc429b34 | ||
|
|
be39542832 | ||
|
|
09244e757f | ||
|
|
69e94c25f4 | ||
|
|
ff524b0ee7 | ||
|
|
7b10b17056 | ||
|
|
1a32b49662 | ||
|
|
6205c67b70 | ||
|
|
dac62d62ef | ||
|
|
631c7202b4 | ||
|
|
20aea0c335 | ||
|
|
3b82fbe4ca | ||
|
|
b57616cb29 | ||
|
|
2645e4da41 | ||
|
|
47766a2c2c | ||
|
|
6ee06ded3f | ||
|
|
9bc659e8f0 | ||
|
|
db51b597da | ||
|
|
6fd6c29ea4 | ||
|
|
6808d734b4 | ||
|
|
5e020bb514 | ||
|
|
7bc32e67bc | ||
|
|
dfb91b3fc0 | ||
|
|
4649eb11e6 | ||
|
|
cb713db9d2 | ||
|
|
59c477424c | ||
|
|
94eeb3abb2 | ||
|
|
2841109f31 | ||
|
|
d142988390 | ||
|
|
35c0e8303c | ||
|
|
6dafbf2165 | ||
|
|
4f2d9c548e | ||
|
|
59d83dd563 | ||
|
|
31a264f411 | ||
|
|
e466faa20d | ||
|
|
6c0175540b | ||
|
|
9b962a0368 | ||
|
|
6755303f0a | ||
|
|
e34ad36912 | ||
|
|
88d6fc663a | ||
|
|
dff32dd7ef | ||
|
|
53c278234d | ||
|
|
4ab18f191f | ||
|
|
b65f3151d1 | ||
|
|
2a7068942a | ||
|
|
d79936ef7b | ||
|
|
d3c9ef6992 | ||
|
|
a60a8441ba | ||
|
|
edced72be9 | ||
|
|
c96ccfc7f5 | ||
|
|
920fcc14f1 | ||
|
|
5669399b2d | ||
|
|
e8de74f76d | ||
|
|
b2460d5267 | ||
|
|
9058c96ea4 | ||
|
|
b05e4f131a | ||
|
|
1fc7c4434c | ||
|
|
46c3b5a6ea | ||
|
|
07a6439082 | ||
|
|
62ff4213e2 | ||
|
|
198cae5ade | ||
|
|
8f51749786 | ||
|
|
9341a5f57f | ||
|
|
2c7f7f27d3 | ||
|
|
6e8a2232a9 | ||
|
|
5f48eeb74b | ||
|
|
5cbfe7c73f | ||
|
|
69787064e9 | ||
|
|
aa2b43293d | ||
|
|
36be1f4be8 | ||
|
|
4a098a4a0e | ||
|
|
10fa4318e9 | ||
|
|
ac74d01d35 | ||
|
|
6830fe5f7a | ||
|
|
8478331ef9 | ||
|
|
0a803098ac | ||
|
|
5be07abbed | ||
|
|
42061ddaf0 | ||
|
|
d60d8096df | ||
|
|
80022dfb8f | ||
|
|
2e8396e408 | ||
|
|
fdaeb8a8bf | ||
|
|
90fddd34d2 | ||
|
|
90cc7937e6 | ||
|
|
463f08546e | ||
|
|
dab58d775a | ||
|
|
b0cc8fe947 | ||
|
|
6518473436 | ||
|
|
d9bff25958 | ||
|
|
250020e8c2 | ||
|
|
ebc8ab4cab | ||
|
|
490dafad0c | ||
|
|
692ec1f8c2 | ||
|
|
46cc5ccdf3 | ||
|
|
31cb75b024 | ||
|
|
18c4212aa0 | ||
|
|
028c2ac364 | ||
|
|
8d42184ff0 | ||
|
|
08bffa60f4 | ||
|
|
e0241d73de | ||
|
|
74f5663963 | ||
|
|
fb1b3687f4 | ||
|
|
2d67f95413 | ||
|
|
4aa7abf94b | ||
|
|
2db5a8b618 | ||
|
|
99fc84aaea | ||
|
|
7827ce1aee | ||
|
|
d28d470435 | ||
|
|
b76751ec79 | ||
|
|
635c703535 | ||
|
|
1fc0f0cb01 | ||
|
|
0f7b183e7c | ||
|
|
45aa8293e5 | ||
|
|
f3a3477811 | ||
|
|
cf82d3495e | ||
|
|
297f3c16a8 | ||
|
|
9d791c186b | ||
|
|
b81513e9bb | ||
|
|
e03a34cae4 | ||
|
|
89f0741cea | ||
|
|
8028ee790f | ||
|
|
4147c68f6d | ||
|
|
f5b598fde8 | ||
|
|
0138b7fc12 | ||
|
|
847860a0c7 | ||
|
|
c092c0e72d | ||
|
|
633aefad56 | ||
|
|
b9a11e4ca1 | ||
|
|
bd8536b9eb | ||
|
|
6bd9b3d82f | ||
|
|
7743801795 | ||
|
|
bedba8d8f5 | ||
|
|
4aad2c86ec | ||
|
|
b041cb6cbf | ||
|
|
99de72d723 | ||
|
|
f2cade3251 | ||
|
|
9d433fb248 | ||
|
|
94d087b1bc | ||
|
|
64b4e5570c | ||
|
|
86bf207e02 | ||
|
|
b13ab0f0ba | ||
|
|
2d8a538798 | ||
|
|
e9446d0360 | ||
|
|
5a2a57c706 | ||
|
|
c076f16793 | ||
|
|
58bb3fe3f1 | ||
|
|
491501c618 | ||
|
|
cbe7dcebea | ||
|
|
4acde81cc4 | ||
|
|
108685e8d0 | ||
|
|
1d5e4a0f8a | ||
|
|
89a4fe96b5 | ||
|
|
b2ce96eb67 | ||
|
|
84df63e249 | ||
|
|
efd5da9e87 | ||
|
|
b2dd39887d | ||
|
|
2888236e02 | ||
|
|
304474a5e1 | ||
|
|
6e4a17764e | ||
|
|
a76e93626d | ||
|
|
5e5d238e82 | ||
|
|
c77868bfae | ||
|
|
bf747e538b | ||
|
|
20d56aefa8 | ||
|
|
a2cd47f79f | ||
|
|
32d7846139 | ||
|
|
e588091bf6 | ||
|
|
eb49b27e16 | ||
|
|
4fd31e4367 | ||
|
|
aaad0c03a6 | ||
|
|
1026a6b2b6 | ||
|
|
f5ed0be023 | ||
|
|
a7f44b6ce7 | ||
|
|
481f12af5e | ||
|
|
16a7bc63f2 | ||
|
|
e8dc5ce085 | ||
|
|
98ce12d74e | ||
|
|
edb09f2081 | ||
|
|
86fc0e4101 | ||
|
|
fb72f4b1ae | ||
|
|
6bf0a3a804 | ||
|
|
4bcaa5eaca | ||
|
|
8ca6584299 | ||
|
|
e86e8820f3 | ||
|
|
07c300f35f | ||
|
|
b08936c27e | ||
|
|
0b4b408552 | ||
|
|
36e37052e0 | ||
|
|
9a3373a43d | ||
|
|
428e5a7a4e | ||
|
|
7445b84756 | ||
|
|
fa5be03fc3 | ||
|
|
49b21fb577 | ||
|
|
1f7e788585 | ||
|
|
43ac9de714 | ||
|
|
e80afa610d | ||
|
|
20a2cb3d3c | ||
|
|
26b3f742ce | ||
|
|
2ccbade642 | ||
|
|
fc8523da46 | ||
|
|
b67ad01d97 | ||
|
|
cdf49b2e37 | ||
|
|
920a7cfdac | ||
|
|
023ec9e53e | ||
|
|
7c9b4576f0 | ||
|
|
4f2d543651 | ||
|
|
25aa6a4345 | ||
|
|
0b9d9fa8d7 | ||
|
|
a01781d5b7 | ||
|
|
b15ae542aa | ||
|
|
b68f69dfc7 | ||
|
|
7d1cafc3d3 | ||
|
|
386c837f1a | ||
|
|
be8c544da3 | ||
|
|
a78e43bfe3 | ||
|
|
7b57b924ee | ||
|
|
46ee4e41a1 | ||
|
|
f87eed1336 | ||
|
|
e4964b050b | ||
|
|
83f128ddcc | ||
|
|
13b2aa675f | ||
|
|
a98f89a4e7 | ||
|
|
d42d4308e5 | ||
|
|
0608649961 | ||
|
|
3013af8e62 | ||
|
|
915118140f | ||
|
|
a662414b7f | ||
|
|
112ce9b450 | ||
|
|
0f1208dba9 | ||
|
|
21dcb55c82 | ||
|
|
25871aea49 | ||
|
|
63d75bb68b | ||
|
|
8e95e8c4f8 | ||
|
|
2b0a997573 | ||
|
|
84df956293 | ||
|
|
1acf21371b | ||
|
|
acee47e861 | ||
|
|
2dab70697c | ||
|
|
b3f5c2f185 | ||
|
|
25a848c4e4 | ||
|
|
ad814b6cbb | ||
|
|
ac55951c74 | ||
|
|
a0520ce5d8 | ||
|
|
6f20cdd905 | ||
|
|
6d45f0730c | ||
|
|
24288aa597 | ||
|
|
66f49feebb | ||
|
|
b77bbe6a66 | ||
|
|
084fe0e00f | ||
|
|
7f449aed5b | ||
|
|
9cb30e0ec6 | ||
|
|
1d78b68831 | ||
|
|
0fbf882059 | ||
|
|
4d56dfdfa2 | ||
|
|
53cd4205e8 | ||
|
|
a4e2e23fbe | ||
|
|
0e726a20ba | ||
|
|
be01c4da0c | ||
|
|
f190611bcc | ||
|
|
c0a2abeae9 | ||
|
|
5d4600a080 | ||
|
|
e6136cac08 | ||
|
|
f2a35fb833 | ||
|
|
11342a54c9 | ||
|
|
ab176b5b1d | ||
|
|
189911c77f | ||
|
|
4c9859a1ac | ||
|
|
01b1116017 | ||
|
|
d3af2e6547 | ||
|
|
b5a031be9f | ||
|
|
c24b0e1425 | ||
|
|
4272955097 | ||
|
|
0a267f69e6 | ||
|
|
5d5788e67e | ||
|
|
10ec7e8708 | ||
|
|
233ecf8b5f | ||
|
|
156c6429d3 | ||
|
|
d5e7d3298a | ||
|
|
837efc90b6 | ||
|
|
9394d340a2 | ||
|
|
be820e8401 | ||
|
|
75629ba5ea | ||
|
|
7e428e8f94 | ||
|
|
5a69eb2dd3 | ||
|
|
5b5abd2601 | ||
|
|
7c302cb19c | ||
|
|
71c836ae1a | ||
|
|
b2be663ba6 | ||
|
|
f6533b2ca4 | ||
|
|
a499112ece | ||
|
|
df78d87ec5 | ||
|
|
a9edd036e0 | ||
|
|
b75507396b | ||
|
|
6f69653a8b | ||
|
|
14fd7444e8 | ||
|
|
8d66128009 | ||
|
|
d9ecfddecd | ||
|
|
19da03dfa4 | ||
|
|
271934ef4b | ||
|
|
6f22b37e1d | ||
|
|
ad2df2f36f | ||
|
|
99739810a0 | ||
|
|
d2c1daf4e3 | ||
|
|
a30c8953c8 | ||
|
|
a6d676700d | ||
|
|
66aa690104 | ||
|
|
05b6fb4a7d | ||
|
|
c1c72927c1 | ||
|
|
d78bf6d1e1 | ||
|
|
86512f0dcb | ||
|
|
f738113020 | ||
|
|
1be16380da | ||
|
|
a9bb365760 | ||
|
|
10a0666de9 | ||
|
|
cf8dc4e529 | ||
|
|
ebed875c46 | ||
|
|
8ac36526a8 | ||
|
|
dce0e370cf | ||
|
|
067d23e2bc | ||
|
|
e494d21a57 | ||
|
|
0654ecc9bb | ||
|
|
b235c71c76 | ||
|
|
07842b0fa7 | ||
|
|
e0ad4e6e7b | ||
|
|
9be70d640e | ||
|
|
44a9724827 | ||
|
|
9065e8ed25 | ||
|
|
e1c7c11bdf | ||
|
|
56436adf4d | ||
|
|
1a8197aef1 | ||
|
|
e9f6521c6a | ||
|
|
07cdd8bbab | ||
|
|
53d7f60ebc | ||
|
|
819ebf0ede | ||
|
|
157f858975 | ||
|
|
a1a79ea619 | ||
|
|
672de78c81 | ||
|
|
d446bbb451 | ||
|
|
135973de09 | ||
|
|
9fddf6819b | ||
|
|
7f9812a488 | ||
|
|
f3a16e1ecd | ||
|
|
11405adcf6 | ||
|
|
c0d7f0f5fd | ||
|
|
68ad1e9645 | ||
|
|
4b0a95fc1b | ||
|
|
fdb0ba4349 | ||
|
|
4a3f168720 | ||
|
|
05d83ebe8b | ||
|
|
9aaee04a69 | ||
|
|
3f5dd5bad8 | ||
|
|
e53a895471 | ||
|
|
bfc8314f52 | ||
|
|
199d2e8298 | ||
|
|
4c7d7fad1b | ||
|
|
df58abfcdb | ||
|
|
710d37c640 | ||
|
|
56c63fb1a1 | ||
|
|
3e21c841be | ||
|
|
298763a4a7 | ||
|
|
d6f8f9704c | ||
|
|
f3e5b03af2 | ||
|
|
603f0d289a | ||
|
|
e7f0979c9e | ||
|
|
9b69a5c8f2 | ||
|
|
99b445e7bc | ||
|
|
a85bbc8ce8 | ||
|
|
ea85628389 | ||
|
|
bafd2f3b86 | ||
|
|
bd7009732f | ||
|
|
051f73013c | ||
|
|
6484b796cd | ||
|
|
7a5a308c9b | ||
|
|
4709e536ee | ||
|
|
4eb5df3f28 | ||
|
|
d3751da0e4 | ||
|
|
de90205b66 | ||
|
|
5d54225f9d | ||
|
|
a556cfcd40 | ||
|
|
405a60c4f8 | ||
|
|
de528270a2 | ||
|
|
ea0365b9da | ||
|
|
f8ca38b7e3 | ||
|
|
bfeb434920 | ||
|
|
7101ba472d | ||
|
|
a314f2d1cb | ||
|
|
99e1c53a41 | ||
|
|
b21cc930af | ||
|
|
ccad06b7b6 | ||
|
|
7364dc1989 | ||
|
|
5b816b095d | ||
|
|
08a4b92f3a | ||
|
|
3c8a0bb011 | ||
|
|
d6e14eafef | ||
|
|
15df8e0a08 | ||
|
|
42d9e7175f | ||
|
|
2aa7d6095d | ||
|
|
31aa75d745 | ||
|
|
dfd2847c12 | ||
|
|
db5f9572b1 | ||
|
|
cb9db10052 | ||
|
|
66960b147a | ||
|
|
8ec4f2e814 | ||
|
|
081e34f953 | ||
|
|
2800eef199 | ||
|
|
08f3a79e6e | ||
|
|
1c528b0f04 | ||
|
|
c5d144bcc4 | ||
|
|
9a9d6ac524 | ||
|
|
6ced618c1c | ||
|
|
bb1babad11 | ||
|
|
1a93592253 | ||
|
|
e52be45659 | ||
|
|
e7e08a94a9 | ||
|
|
d22c3867c1 | ||
|
|
e52f65f690 | ||
|
|
dfcfa643f0 | ||
|
|
a986068cbb | ||
|
|
af6915b1b0 | ||
|
|
af46999a16 | ||
|
|
322ec26829 | ||
|
|
935f80cd8a | ||
|
|
8379652ad5 | ||
|
|
decef23751 | ||
|
|
c639cf7162 | ||
|
|
2785ab6913 | ||
|
|
d92aca5b16 | ||
|
|
4cf00a4198 | ||
|
|
f6b549678d | ||
|
|
978a7e209e | ||
|
|
b06b8e4d2b | ||
|
|
3a3412486a | ||
|
|
624014572c | ||
|
|
24d917bb2d | ||
|
|
2a4fae4718 | ||
|
|
9f4a8952a4 | ||
|
|
029c020fe0 | ||
|
|
1f0040ceb6 | ||
|
|
76a3334f9d | ||
|
|
22d0d80bfe | ||
|
|
de13f5edbd | ||
|
|
953e284566 | ||
|
|
1b3fbf56d0 | ||
|
|
83779a684b | ||
|
|
d33e15a2bb | ||
|
|
a9b60b8052 | ||
|
|
329d475106 | ||
|
|
2cbecf439e | ||
|
|
389271c00d | ||
|
|
8839c36917 | ||
|
|
3649846423 | ||
|
|
f3858e8300 | ||
|
|
741cfec1ec | ||
|
|
9326b10d3a | ||
|
|
6d90cd59f2 | ||
|
|
5c503e71ed | ||
|
|
cdf851d196 | ||
|
|
bf09e49164 | ||
|
|
d391a4d023 | ||
|
|
9182f15ee0 | ||
|
|
be6811ddbd | ||
|
|
10d299d1b3 | ||
|
|
4989bb07f6 | ||
|
|
0d46349386 | ||
|
|
267e7c3b08 | ||
|
|
cad689b337 | ||
|
|
e54d5a13e8 | ||
|
|
ac7619de55 | ||
|
|
c75e258f81 | ||
|
|
e4ed6dde0c | ||
|
|
9025d8bd90 | ||
|
|
2433e27eb5 | ||
|
|
2610a27894 | ||
|
|
eba25f1bb8 | ||
|
|
59b625b7c0 | ||
|
|
0eeb2f6752 | ||
|
|
cd7b484fc2 | ||
|
|
16b3ea8b7e | ||
|
|
942afd7fec | ||
|
|
de271d5b76 | ||
|
|
7e826c70df | ||
|
|
162478563c | ||
|
|
8d0ae922b8 | ||
|
|
2200f757dc | ||
|
|
4f65882b5d | ||
|
|
5ba67af0e3 | ||
|
|
efeb394f3e | ||
|
|
9a0ee3516b | ||
|
|
55a873d0ef | ||
|
|
0561f3e398 | ||
|
|
68d587e484 | ||
|
|
c026754a68 | ||
|
|
32561b5616 | ||
|
|
6b30097bde | ||
|
|
7dc1f9b81b | ||
|
|
9964650014 | ||
|
|
a705f6a8b7 | ||
|
|
151cf3daf2 | ||
|
|
5758f1701d | ||
|
|
ac631f7c49 | ||
|
|
e814d9ea63 | ||
|
|
d7e88a3213 | ||
|
|
9b3dee6aa4 | ||
|
|
879ad86e0f | ||
|
|
ed63b9f3cc | ||
|
|
ef3f41bb69 | ||
|
|
4d9ed1a6cb | ||
|
|
4b8f6f1f66 | ||
|
|
cf57f999c5 | ||
|
|
fd9630ea84 | ||
|
|
9fed812872 | ||
|
|
41b7e5f32d | ||
|
|
3345b6e242 | ||
|
|
52a4577b4c | ||
|
|
267d93168d | ||
|
|
78895288d0 | ||
|
|
249d5e2788 | ||
|
|
488346979d | ||
|
|
cadecdb3b8 | ||
|
|
9d9d3db701 | ||
|
|
5b216e6a3a | ||
|
|
c03e26ee5e | ||
|
|
bcc2f05aa5 | ||
|
|
b18813689d | ||
|
|
79999edcea | ||
|
|
764b34d947 | ||
|
|
51fa675e90 | ||
|
|
e000dc18aa | ||
|
|
1f81c7ba2d | ||
|
|
c1811463cb | ||
|
|
7a1dc6da01 | ||
|
|
0a28bcfbe9 | ||
|
|
93f3dd14a5 | ||
|
|
6d82c9c3db | ||
|
|
3714873b7b | ||
|
|
5534c2a8f8 | ||
|
|
cad23f1672 | ||
|
|
2bf50bb8c2 | ||
|
|
6ad50e4e04 | ||
|
|
1c5aae2301 | ||
|
|
aed95ed4fc | ||
|
|
2a97801aae | ||
|
|
c6aefa984d | ||
|
|
5e9f1ac00f | ||
|
|
0a83470019 | ||
|
|
0ed1f6c341 | ||
|
|
e85463c4a1 | ||
|
|
31c18bf856 | ||
|
|
ca1d36556b | ||
|
|
3085bc1443 | ||
|
|
7843d81c18 | ||
|
|
8155551464 | ||
|
|
168dd1d01f | ||
|
|
18e92ccbd3 | ||
|
|
2ad71fc4ac | ||
|
|
29380b93ef | ||
|
|
00d2ff810b | ||
|
|
a99295f594 | ||
|
|
cc8a2e5fce | ||
|
|
7137320f1a | ||
|
|
376c9bbdc7 | ||
|
|
49d57f46ae | ||
|
|
a4fe45d58c | ||
|
|
db8763b610 | ||
|
|
1a61598322 | ||
|
|
d971397c8b | ||
|
|
427a598385 | ||
|
|
4c0b96d81a | ||
|
|
af2baba1e3 | ||
|
|
93cb01e7e6 | ||
|
|
139285c46a | ||
|
|
dc401c784a | ||
|
|
bb0f5e97a2 | ||
|
|
82cd3fd9f1 | ||
|
|
06117c98b1 | ||
|
|
aa41dc3650 | ||
|
|
98fe00a171 | ||
|
|
3bdafc2a11 | ||
|
|
3c4227696c | ||
|
|
5d78fa9519 | ||
|
|
eb2a9d540e | ||
|
|
665e2e3e83 | ||
|
|
c025d0d030 | ||
|
|
1ce0a3b5d3 | ||
|
|
7c79d10f5d | ||
|
|
eeb5ba4c7b | ||
|
|
5d32627553 | ||
|
|
07a038503e | ||
|
|
3a878f8426 | ||
|
|
1cfa55817a | ||
|
|
78ce5c3f69 | ||
|
|
97187af0c7 | ||
|
|
d26076c0e4 | ||
|
|
1f81bd121f | ||
|
|
02fa9142fe | ||
|
|
6759e0c25b | ||
|
|
46e233ccbb | ||
|
|
1b31de18e4 | ||
|
|
ccc65c846f | ||
|
|
9d73fc9932 | ||
|
|
d6abbacbf7 | ||
|
|
979100850c | ||
|
|
a0a2b6c340 | ||
|
|
7f1acb4532 | ||
|
|
9afaba4382 | ||
|
|
355c672ed1 | ||
|
|
144cf279f9 | ||
|
|
c1a94a1b6c | ||
|
|
c091b5f385 | ||
|
|
aa6b439e8c | ||
|
|
07170135e6 | ||
|
|
024ee6e602 | ||
|
|
a1f79f4508 | ||
|
|
6a6009827c | ||
|
|
375fc0c89e | ||
|
|
a110b4c26b | ||
|
|
ebdb875c56 | ||
|
|
266a2b4c76 | ||
|
|
7e5b62377f | ||
|
|
8dce5396b0 | ||
|
|
e78f7a2a37 | ||
|
|
aafbda47d4 | ||
|
|
e1b1af9a48 | ||
|
|
19f725965d | ||
|
|
5ce0cf1aad | ||
|
|
88bcb35a14 | ||
|
|
d534f026b0 | ||
|
|
939eb95cdc | ||
|
|
46d3dd409a | ||
|
|
398be73f5b | ||
|
|
e7ab59a932 | ||
|
|
285cb346b9 | ||
|
|
72d0920458 | ||
|
|
4aaa1a7afa | ||
|
|
f2f35e115c | ||
|
|
7295f39d68 | ||
|
|
685cacf490 | ||
|
|
1f36d970f9 | ||
|
|
60f0c80c36 | ||
|
|
c018d63117 | ||
|
|
88af048e90 | ||
|
|
c0190e21c6 | ||
|
|
2368a8fba3 | ||
|
|
e9ad462f9e | ||
|
|
4ac9d0410c | ||
|
|
1c53c90ab5 | ||
|
|
4d6e05989e | ||
|
|
54a3a755d6 | ||
|
|
e32a3fbfca | ||
|
|
f498f67f1e | ||
|
|
d491c482a5 | ||
|
|
7062676f9a | ||
|
|
0d52759455 | ||
|
|
9a5c0bae50 | ||
|
|
eb30e54dc8 | ||
|
|
4ea97ab23f | ||
|
|
82f2ec24fb | ||
|
|
d487465b2a | ||
|
|
899e88babe | ||
|
|
83f923aa10 | ||
|
|
04a0614319 | ||
|
|
632ff783c6 | ||
|
|
e4f86ee823 | ||
|
|
f7390c757b | ||
|
|
7a9b45d257 | ||
|
|
b699ce3512 | ||
|
|
da9003ec46 | ||
|
|
30a0743c8c | ||
|
|
a4fc493ea5 | ||
|
|
f5f6e9a882 | ||
|
|
21cda37380 | ||
|
|
941670a420 | ||
|
|
15b01a07b5 | ||
|
|
85565dc137 | ||
|
|
d59f699937 | ||
|
|
ef66b10501 | ||
|
|
081c47aba9 | ||
|
|
6cdb64fb8b | ||
|
|
765e8d4f79 | ||
|
|
8e7e496b44 | ||
|
|
cf14b19bf6 | ||
|
|
2131061482 | ||
|
|
692cebe659 | ||
|
|
189d5aed69 | ||
|
|
ea38953b47 | ||
|
|
9130881875 | ||
|
|
46b1803086 | ||
|
|
98dde67f65 | ||
|
|
34eedd7955 | ||
|
|
98d7c7bb86 | ||
|
|
74c2bafc9b | ||
|
|
912da395c9 | ||
|
|
061ad6df2c | ||
|
|
b5deceaa3b | ||
|
|
22099d82be | ||
|
|
07e1de2f62 | ||
|
|
2203638fc5 | ||
|
|
5ef7123f78 | ||
|
|
5ae9b84cce | ||
|
|
f41cebe776 | ||
|
|
dd47dbffe8 | ||
|
|
aebcd1db2e | ||
|
|
4af9d88771 | ||
|
|
6f706d9aaf | ||
|
|
700f1e0001 | ||
|
|
9cc0825185 | ||
|
|
26c65d0da8 | ||
|
|
602ac1ffb8 | ||
|
|
947609a3b3 | ||
|
|
db38a64a30 | ||
|
|
783a4d33b4 | ||
|
|
c80b4c1d32 | ||
|
|
b1f1ec5fbb | ||
|
|
2cad8a879d | ||
|
|
95910f5c17 | ||
|
|
f3a9c47c2a | ||
|
|
3d184c95ba | ||
|
|
6754fdb580 | ||
|
|
9842e5624e | ||
|
|
d00b265347 | ||
|
|
c72f898238 | ||
|
|
4a2a9eb997 | ||
|
|
5b399d0d06 | ||
|
|
8edacbff2f | ||
|
|
156e9e2fc7 | ||
|
|
4682abf4c1 | ||
|
|
6871c7e665 | ||
|
|
a508dd2c0f | ||
|
|
5469bb6508 | ||
|
|
099461dbbf | ||
|
|
5233e4c097 | ||
|
|
70e8811d5c | ||
|
|
7208dd6b2a | ||
|
|
44af6740c7 | ||
|
|
8d1dd92df7 | ||
|
|
a5cacaceda | ||
|
|
821e704b5b | ||
|
|
82c79bd91c | ||
|
|
bde0adfbd0 | ||
|
|
6c8b115479 | ||
|
|
82a8f18e88 | ||
|
|
bdae1f10d4 | ||
|
|
05b5a0ada3 | ||
|
|
3fcc2c2678 | ||
|
|
6af9d3129e | ||
|
|
d7cff79ac7 | ||
|
|
f6137dfc34 | ||
|
|
6dfbb90b80 | ||
|
|
72aff32024 | ||
|
|
9f4c367249 | ||
|
|
3f87958328 | ||
|
|
a0e689c437 | ||
|
|
49f05d334d | ||
|
|
a372ef3faa | ||
|
|
06e48516bb | ||
|
|
a317ebd8e7 | ||
|
|
6774a8594f | ||
|
|
56fb579da2 | ||
|
|
b401917c19 | ||
|
|
e990118475 | ||
|
|
ac2cc154b4 | ||
|
|
99ec0ed8df | ||
|
|
32daea25de | ||
|
|
946dbc5efc | ||
|
|
714dd597f1 | ||
|
|
c36dfd9eea | ||
|
|
67e5e3b56b | ||
|
|
fdc1cd26e7 | ||
|
|
988824f3f1 | ||
|
|
15ef064fc3 | ||
|
|
c7d544685e | ||
|
|
d622f1df3d | ||
|
|
c7e1302377 | ||
|
|
caea072f7d | ||
|
|
04b22c1a76 | ||
|
|
26d9d7630c | ||
|
|
4529047349 | ||
|
|
af110f75d6 | ||
|
|
1da5ad8830 | ||
|
|
8e063f6e59 | ||
|
|
d16ceac149 | ||
|
|
c2831e6676 | ||
|
|
a4b95cb7cf | ||
|
|
e5a7810d6e | ||
|
|
99e913637a | ||
|
|
9ff80466fc | ||
|
|
67319031ea | ||
|
|
5134faeefd | ||
|
|
77327f59b9 | ||
|
|
5b68d86052 | ||
|
|
54c56037e7 | ||
|
|
8f31bd93fa | ||
|
|
87dfdb2ddc | ||
|
|
2c2d3e4641 | ||
|
|
2a8b19d319 | ||
|
|
f43c042223 | ||
|
|
b75b46f415 | ||
|
|
42f7af3d52 | ||
|
|
a4767bc7e3 | ||
|
|
8d4e5ad3f1 | ||
|
|
49a127d97d | ||
|
|
8cfb604a0d | ||
|
|
da9918b655 | ||
|
|
c41464b974 | ||
|
|
5657f617e7 | ||
|
|
12e6cbb9e5 | ||
|
|
bc1cfed389 | ||
|
|
9b5e1465c3 | ||
|
|
7f5b12d4d2 | ||
|
|
c3d3f0986e | ||
|
|
8c21d0360f | ||
|
|
650141a498 | ||
|
|
6ff8fc7f87 | ||
|
|
0f0e99b42e | ||
|
|
96814109dc | ||
|
|
39720d401f | ||
|
|
5e6e30a5b3 | ||
|
|
a92c0ffac3 | ||
|
|
43f7ecc75a | ||
|
|
d598ec1852 | ||
|
|
fad61a0a2a | ||
|
|
3886d49b0a | ||
|
|
93f8ed223e | ||
|
|
96e0851563 | ||
|
|
9d1eb469b5 | ||
|
|
4001897338 | ||
|
|
27dd574c4d | ||
|
|
06a75a0a0e | ||
|
|
8cf7282f46 | ||
|
|
dd8e42ef71 | ||
|
|
221b4587d4 | ||
|
|
4203c4d30c | ||
|
|
059dd1993a | ||
|
|
e172364e86 | ||
|
|
0941a8e016 | ||
|
|
de67b9465a | ||
|
|
a2a71ff8f5 | ||
|
|
0befceef9a | ||
|
|
203bfbe411 | ||
|
|
1f4eeaa269 | ||
|
|
aa2d07ca8d | ||
|
|
3739127044 | ||
|
|
2dab179166 | ||
|
|
9590d2865a | ||
|
|
d542cdd898 | ||
|
|
1d0d063a6c | ||
|
|
9f15f50f9d | ||
|
|
f0ebc151db | ||
|
|
f0a9c63cd3 | ||
|
|
ec0cd9a348 | ||
|
|
b5afd304d0 | ||
|
|
4bd4e0863c | ||
|
|
463a5451e1 | ||
|
|
cb881e81a8 | ||
|
|
92fc43cb3d | ||
|
|
73a73b7bc7 | ||
|
|
3391bd8322 | ||
|
|
3d5876a8c0 | ||
|
|
7d04f06f7d | ||
|
|
24137bffdd | ||
|
|
621051cfb9 | ||
|
|
2c21bf3e0e | ||
|
|
c1a2dee0e9 | ||
|
|
782ad07940 | ||
|
|
d57729d3d7 | ||
|
|
1f8c2ba8c5 | ||
|
|
b176701e51 | ||
|
|
7dd6869cd1 | ||
|
|
33886f106c | ||
|
|
94ed160eee | ||
|
|
066eeb6ba6 | ||
|
|
402b3f5535 | ||
|
|
d4d9e08ae2 | ||
|
|
6553ada66f | ||
|
|
c0b49ff219 | ||
|
|
d20c89ba21 | ||
|
|
ee577cae4c | ||
|
|
ed5b215bbb | ||
|
|
a5f8e833ba | ||
|
|
decd70ff21 | ||
|
|
9f002172db | ||
|
|
5d661f2fc6 | ||
|
|
9a82dd356c | ||
|
|
840e08fc8a | ||
|
|
761b8c40d6 | ||
|
|
40b7314f6d | ||
|
|
5c3a43f602 | ||
|
|
dd001ab0e7 | ||
|
|
30b55ce25e | ||
|
|
943a5b36e3 | ||
|
|
0ebaefb8be | ||
|
|
5a995a8624 | ||
|
|
eee98c5175 | ||
|
|
4614107b2b | ||
|
|
d6dd99bb4a | ||
|
|
d0a200f652 | ||
|
|
9138f90843 | ||
|
|
766a8fa4dd | ||
|
|
6f2451edd3 | ||
|
|
864fccbdb2 | ||
|
|
8956df9599 | ||
|
|
a3daaa55b5 | ||
|
|
85a52f5d6b | ||
|
|
92d7ecdf68 | ||
|
|
cdf09aa1bd | ||
|
|
63a830cc95 | ||
|
|
3b9cc61669 | ||
|
|
b5166acada | ||
|
|
a38291fc17 | ||
|
|
723e304ed8 | ||
|
|
63ac7738bb | ||
|
|
bda96a2175 | ||
|
|
5b06791a6c | ||
|
|
64e1361ef5 | ||
|
|
2f6eb5969e | ||
|
|
125b6fa779 | ||
|
|
5e78871c00 | ||
|
|
487d9a6449 | ||
|
|
97b1a774fb | ||
|
|
12a4c12753 | ||
|
|
e8fdc454db | ||
|
|
69da4410dc | ||
|
|
5fc6f78555 | ||
|
|
15e0a7aa38 | ||
|
|
0d62bfb0c6 | ||
|
|
a37d82e2dd | ||
|
|
0a14c8b3e6 | ||
|
|
e779280428 | ||
|
|
753cd95a18 | ||
|
|
5bd34f19fe | ||
|
|
0e5b17adcc | ||
|
|
b23f10ecde | ||
|
|
08d6e142c3 | ||
|
|
2016a1656b | ||
|
|
5a44618289 | ||
|
|
338d7f0df6 | ||
|
|
fd19dd1a03 | ||
|
|
6d19af02c9 | ||
|
|
1deb7e9f95 | ||
|
|
5a6f96f84b | ||
|
|
3f74022142 | ||
|
|
ccd2ed8ac2 | ||
|
|
a72e422684 | ||
|
|
da8755fcb7 | ||
|
|
3be284c129 | ||
|
|
15e2d172a4 | ||
|
|
4e54cb56e5 | ||
|
|
ad1015c8b0 | ||
|
|
1dbe80afc4 | ||
|
|
0683352c4b | ||
|
|
d666f0245d | ||
|
|
7f252909fc | ||
|
|
7b9d0b4f1f | ||
|
|
37193c48d9 | ||
|
|
1747ae8984 | ||
|
|
dfee8891d3 | ||
|
|
cb10df7c9f | ||
|
|
c6b669eb9d | ||
|
|
919e2543ca | ||
|
|
b705ac24fa | ||
|
|
9aa7ba77f5 | ||
|
|
d5b873b70b | ||
|
|
4ec255917d | ||
|
|
9b86a18752 | ||
|
|
630fef29a2 | ||
|
|
05d45c94d5 | ||
|
|
44e4c59493 | ||
|
|
24e7076423 | ||
|
|
1f8a965b7a | ||
|
|
8b491f4c94 | ||
|
|
8b857f9980 | ||
|
|
7d1707ca7c | ||
|
|
5e3a3c61f3 | ||
|
|
073b6d200a | ||
|
|
652d560a21 | ||
|
|
be69ee8b1d | ||
|
|
fc5aefe435 | ||
|
|
d5239365be | ||
|
|
ac7f905248 | ||
|
|
1a2ea05361 | ||
|
|
39606248a1 | ||
|
|
73118ce447 | ||
|
|
4e5c1606f3 | ||
|
|
b8aa54a159 | ||
|
|
7caccce907 | ||
|
|
82777d641c | ||
|
|
5b248c82f5 | ||
|
|
9c7ae3b0ef | ||
|
|
9b130ae56c | ||
|
|
a48b2e9edb | ||
|
|
e4bbd57c41 | ||
|
|
0dba30977d | ||
|
|
69008e08be | ||
|
|
06236546a8 | ||
|
|
60029fc618 | ||
|
|
f3e71fec91 | ||
|
|
54cdb24cec | ||
|
|
206140c3fa | ||
|
|
c2bd1d0d83 | ||
|
|
5cb3b8cfbf | ||
|
|
f363722779 | ||
|
|
5e09e3e072 | ||
|
|
cc3f53d572 | ||
|
|
a2ddf3567c | ||
|
|
aa7ba6d659 | ||
|
|
c53bcd990d | ||
|
|
78c807a514 | ||
|
|
c4084cbcec | ||
|
|
062c4b53b6 | ||
|
|
c9d7b63ef7 | ||
|
|
06729c4e84 | ||
|
|
5c5f80691a | ||
|
|
5a0340e927 | ||
|
|
eb7e6a566b | ||
|
|
079fe089de | ||
|
|
5f83acf3ad | ||
|
|
0d16fbe4ab | ||
|
|
c1184fd7d2 | ||
|
|
429bee7e6c | ||
|
|
56e2df75b9 | ||
|
|
547ad7a2c7 | ||
|
|
e2c75f6836 | ||
|
|
ce591227ae | ||
|
|
ace424e78a | ||
|
|
10223c944c | ||
|
|
9e190cb5aa | ||
|
|
5d57e93ee1 | ||
|
|
75805e3c69 | ||
|
|
327ae4ac79 | ||
|
|
911614673b | ||
|
|
e80d3e7dac | ||
|
|
7b820ebb94 | ||
|
|
6bfa8643d6 | ||
|
|
25de6b58c3 | ||
|
|
cdc60ef5f0 | ||
|
|
edeb228315 | ||
|
|
f6c6d58045 | ||
|
|
b1d0ca76c9 | ||
|
|
5a058d9b97 | ||
|
|
2892add766 | ||
|
|
281f4b38d2 | ||
|
|
7b590e4bd6 | ||
|
|
923a035e6e | ||
|
|
a2a56980d9 | ||
|
|
2ee0943115 | ||
|
|
cfe218b8a4 | ||
|
|
4c10164970 | ||
|
|
a74168d1e1 | ||
|
|
6c0922a6d8 | ||
|
|
f279b9173e | ||
|
|
706f6c6747 | ||
|
|
dd6c2df5d2 | ||
|
|
bcc0c7c2df | ||
|
|
2c0a2d7877 | ||
|
|
7bd7edfec9 | ||
|
|
db8c4f369c | ||
|
|
569d5d2d89 | ||
|
|
5cbea2cab5 | ||
|
|
57a21ab8e6 | ||
|
|
c52bdce621 | ||
|
|
9358aa1bd8 | ||
|
|
c304de9288 | ||
|
|
52e57cf547 | ||
|
|
e33af2a316 | ||
|
|
ffc4da1589 | ||
|
|
4cfa8d880f | ||
|
|
cd65d42004 | ||
|
|
bba5e7db0c | ||
|
|
eb960f2606 | ||
|
|
92a68108a6 | ||
|
|
ae8acc6eba | ||
|
|
1e1381df8e | ||
|
|
2ba7fcd628 | ||
|
|
12cbb1f6f9 | ||
|
|
1f8e161001 | ||
|
|
b4b215a3f8 | ||
|
|
e2ff7ef113 | ||
|
|
73c998f510 | ||
|
|
11f29280b1 | ||
|
|
de752c69f4 | ||
|
|
2cf10fce38 | ||
|
|
4ba248a101 | ||
|
|
faae01cb8a | ||
|
|
600c5243dd | ||
|
|
00bddd5e57 | ||
|
|
2436ea6ff9 | ||
|
|
403489865c | ||
|
|
c8590b9e9c | ||
|
|
d1ffa9b330 | ||
|
|
37799ca0be | ||
|
|
ba5edabb2c | ||
|
|
1dfe8f866a | ||
|
|
e77b4f334d | ||
|
|
87c64bdb2b | ||
|
|
68eed69221 | ||
|
|
5db5bf17cb | ||
|
|
319631b5c4 | ||
|
|
0489c35417 | ||
|
|
10c0f3075a | ||
|
|
91a767b4fb | ||
|
|
4e69ff196a | ||
|
|
576348b1f2 | ||
|
|
db547d60df | ||
|
|
0f655e9292 | ||
|
|
3d0827a6da | ||
|
|
231d4db71d | ||
|
|
0117e96d5b | ||
|
|
ca7bba33e6 | ||
|
|
b294a8138c | ||
|
|
a99dbf634b | ||
|
|
cda0fb6a10 | ||
|
|
a1392a7677 | ||
|
|
e9da7f28cc | ||
|
|
c4ee293388 | ||
|
|
6417977617 | ||
|
|
f687f2eafb | ||
|
|
7057d7fffb | ||
|
|
d99b0893df | ||
|
|
b32463df53 | ||
|
|
f202d5f54a | ||
|
|
18891c554d | ||
|
|
22a39ed4d3 | ||
|
|
4003befc2a | ||
|
|
c17ca47e7d | ||
|
|
e2e5ab656f | ||
|
|
8e445caf26 | ||
|
|
b4d82579b7 | ||
|
|
6734c714d7 | ||
|
|
526aa15ff6 | ||
|
|
bc0e9eb74e | ||
|
|
a425c62156 | ||
|
|
d99375a536 | ||
|
|
4c610abd44 | ||
|
|
e1a941b998 | ||
|
|
a8a91fe945 | ||
|
|
9136838b63 | ||
|
|
ef9c291d9a | ||
|
|
6f968342dc | ||
|
|
4930906b62 | ||
|
|
c39df537b4 | ||
|
|
cfa9f2d13f | ||
|
|
0a8a248349 | ||
|
|
146cf8750f | ||
|
|
c25352b660 | ||
|
|
e8f7ad6c09 | ||
|
|
7cc9d6707c | ||
|
|
dca2f9323b | ||
|
|
7cf2fec3ea | ||
|
|
ab6b1f0fca | ||
|
|
0b08bfdcba | ||
|
|
4701300ed8 | ||
|
|
9d6d28dcae | ||
|
|
147e8d5f9e | ||
|
|
79a974946e | ||
|
|
151fec445e | ||
|
|
d653e139d3 | ||
|
|
04e826ff09 | ||
|
|
3681bea8b7 | ||
|
|
e09d8fc5f5 | ||
|
|
b29f93dcd2 | ||
|
|
1c85424488 | ||
|
|
b753536437 | ||
|
|
490c94fa95 | ||
|
|
1b92774778 | ||
|
|
34588f9da3 | ||
|
|
0811999081 | ||
|
|
cf7e1c7767 | ||
|
|
ba4988bb9b | ||
|
|
cd3778a620 | ||
|
|
5b065ee68d | ||
|
|
ee79728f9d | ||
|
|
482c502356 | ||
|
|
92cdff3043 | ||
|
|
b01474523e | ||
|
|
9121063ebc | ||
|
|
2c34b11980 | ||
|
|
e1af587040 | ||
|
|
2b54f0a7ae | ||
|
|
6def5bd3cf | ||
|
|
efe727ec71 | ||
|
|
d278dfb996 | ||
|
|
9ed6afd836 | ||
|
|
6a19c8130c | ||
|
|
c43290338d | ||
|
|
da540522ac | ||
|
|
64bfff5690 | ||
|
|
73c5dc159b | ||
|
|
783a982ca8 | ||
|
|
86d652f1eb | ||
|
|
766d9c2641 | ||
|
|
6e826cf369 | ||
|
|
8f12fa52b4 | ||
|
|
6d15e5b5a1 | ||
|
|
51679b47a6 | ||
|
|
1eda0ebea7 | ||
|
|
787cef54f5 | ||
|
|
36885b4f9e | ||
|
|
4b6332dbfa | ||
|
|
bbc62ef907 | ||
|
|
4c53023ebc | ||
|
|
17494b45bd | ||
|
|
90401d4d12 | ||
|
|
9730ada805 | ||
|
|
5a626e9dab | ||
|
|
14d5b3b316 | ||
|
|
0ddf5eadb6 | ||
|
|
803135ae46 | ||
|
|
641ac7c503 | ||
|
|
b1377218b1 | ||
|
|
80d74f6f38 | ||
|
|
5a262880b9 | ||
|
|
192c764c8c | ||
|
|
f84cc0554f | ||
|
|
2d20c4ee4c | ||
|
|
041a35e3c8 | ||
|
|
cf205c2480 | ||
|
|
09b830bcf9 | ||
|
|
8dca55aac8 | ||
|
|
adade8fcf1 | ||
|
|
589ac2863c | ||
|
|
5e7b2fbdcf | ||
|
|
bb9f7bb27b | ||
|
|
7561831624 | ||
|
|
ccf6ef6140 | ||
|
|
a3530be7b4 | ||
|
|
76505bd0e7 | ||
|
|
e61434347e | ||
|
|
84c068783d | ||
|
|
3bd42defaf | ||
|
|
a71b42c335 | ||
|
|
456e2f5693 | ||
|
|
f3ed48e0ac | ||
|
|
55cc8cead1 | ||
|
|
0d24078ee4 | ||
|
|
18db5c500f | ||
|
|
f87806edb4 | ||
|
|
a3f62e2246 | ||
|
|
a5ef78fd1e | ||
|
|
337d01008b | ||
|
|
92dc36f480 | ||
|
|
a937a94e43 | ||
|
|
8bb82be2b9 | ||
|
|
a6cf407a8f | ||
|
|
eec8eb4766 | ||
|
|
52c71e3843 | ||
|
|
b5ea79e3ea | ||
|
|
960e3d34eb | ||
|
|
cbb127ff38 | ||
|
|
db1a043261 | ||
|
|
f9eee19cbe | ||
|
|
eb1aeefc8c | ||
|
|
e64cf47d31 | ||
|
|
3f79409a11 | ||
|
|
dd0d518ecd | ||
|
|
6d236a2dd6 | ||
|
|
663db12594 | ||
|
|
f383d6c636 | ||
|
|
2b3bb92357 | ||
|
|
87a2944837 | ||
|
|
ea32c88d85 | ||
|
|
725f8ce761 | ||
|
|
3f42390f2f | ||
|
|
4d3343d0d0 | ||
|
|
4b22eb946c | ||
|
|
53eebb0638 | ||
|
|
4546e77d5b | ||
|
|
7d2eb31f05 | ||
|
|
7c15a53a62 | ||
|
|
1531db0a35 | ||
|
|
6d91f766e7 | ||
|
|
bf5bce9e64 | ||
|
|
5afa3380a6 | ||
|
|
85f5c59781 | ||
|
|
8ee4ca0357 | ||
|
|
656241c23f | ||
|
|
5936492f76 | ||
|
|
abe06b8753 | ||
|
|
ac536c48cd | ||
|
|
1b4b2b9bb1 | ||
|
|
ad1d759840 | ||
|
|
a55134ae63 | ||
|
|
67b20d073e | ||
|
|
2187f44ed7 | ||
|
|
026f61126a | ||
|
|
8a8fce927e | ||
|
|
99873e2136 | ||
|
|
e904651541 | ||
|
|
d65a0dbbc7 | ||
|
|
2b2ecad437 | ||
|
|
89406f1c57 | ||
|
|
ea93e97e79 | ||
|
|
1e6a93b4b6 | ||
|
|
8ad22f8148 | ||
|
|
e667ec944b | ||
|
|
b064244907 | ||
|
|
a01156feb6 | ||
|
|
af1d8fa834 | ||
|
|
0234795200 | ||
|
|
58f4ebe411 | ||
|
|
d4e575f777 | ||
|
|
2d110deb09 | ||
|
|
2e552e8711 | ||
|
|
fb4cef7ccb | ||
|
|
3b6b88fd62 | ||
|
|
95630c6d61 | ||
|
|
33222d59c2 | ||
|
|
adb7da7aaf | ||
|
|
04eb85d279 | ||
|
|
58847c7fb6 | ||
|
|
504e4cc6a3 | ||
|
|
ec5177342e | ||
|
|
4d982ab816 | ||
|
|
c390617151 | ||
|
|
fff7f30005 | ||
|
|
ca72d4840a | ||
|
|
7ccb1b6a6f | ||
|
|
126e1f44ca | ||
|
|
84a4382532 | ||
|
|
40f7048eee | ||
|
|
c94fb80cb0 | ||
|
|
2db194b9d1 | ||
|
|
34420c1265 | ||
|
|
9e0e2fe124 | ||
|
|
9cfbd8107e | ||
|
|
b70a4070f2 | ||
|
|
d3b302ce66 | ||
|
|
5a423f88dd | ||
|
|
b47877235f | ||
|
|
f89c1edadf | ||
|
|
bc5774c934 | ||
|
|
9e885c2379 | ||
|
|
1380d2c1e9 | ||
|
|
4895323200 | ||
|
|
f737d2e8ce | ||
|
|
3157f97ae6 | ||
|
|
278329b73c | ||
|
|
033ec6bc76 | ||
|
|
1aa106ba4a | ||
|
|
c638072902 | ||
|
|
6eb9041df4 | ||
|
|
4035f037d2 | ||
|
|
2b6f861f3b | ||
|
|
9a813030a3 | ||
|
|
04b7dd719c | ||
|
|
3ad3b30d97 | ||
|
|
d0e7147911 | ||
|
|
b0669b7eea | ||
|
|
a504961e93 | ||
|
|
b14bcf966d | ||
|
|
7ef37a9fa2 | ||
|
|
d7ce455f2f | ||
|
|
7ffe857f52 | ||
|
|
f2b0f54c0b | ||
|
|
a1025d8eee | ||
|
|
047ee6454b | ||
|
|
71dd28eabd | ||
|
|
b8cd9484dc | ||
|
|
2c823e094f | ||
|
|
a1bb9630d0 | ||
|
|
e23d5926dd | ||
|
|
5c4982a3f1 | ||
|
|
7d172d718f | ||
|
|
804b5423e5 | ||
|
|
5a825df6a1 | ||
|
|
50d1646ce0 | ||
|
|
1d01e61148 | ||
|
|
21e9958da9 | ||
|
|
7c18012ef2 | ||
|
|
cbeae74fc0 | ||
|
|
f3144f92c5 | ||
|
|
3dd9d51ca5 | ||
|
|
5f0873221a | ||
|
|
49cbb42d0d | ||
|
|
519a8bee71 | ||
|
|
834b88f68f | ||
|
|
e02150cdb0 | ||
|
|
5b4f94832d | ||
|
|
566d5e832c | ||
|
|
36667b8649 | ||
|
|
088f9dae9b | ||
|
|
813b6a6a68 | ||
|
|
c8d9fc7311 | ||
|
|
e555a047e6 | ||
|
|
ed52ecb259 | ||
|
|
f993ddf876 | ||
|
|
54566997b2 | ||
|
|
4783e3d061 | ||
|
|
658d97ff4e | ||
|
|
3373925acf | ||
|
|
9d84bf8f4c | ||
|
|
1650165f4b | ||
|
|
8849cd46c9 | ||
|
|
0835ecf0ed | ||
|
|
8bedfca646 | ||
|
|
1fa38a24b6 | ||
|
|
1d105dd345 | ||
|
|
7823306045 | ||
|
|
53b0d13342 | ||
|
|
f51fbecfee | ||
|
|
1f968a606b | ||
|
|
a13397bc17 | ||
|
|
323e8e72cc | ||
|
|
80a67d0970 | ||
|
|
4e22970784 | ||
|
|
ddc07ee160 | ||
|
|
e96b9b8bf8 | ||
|
|
013828eb03 | ||
|
|
10132879f2 | ||
|
|
832871d49d | ||
|
|
e5ccc1dd36 | ||
|
|
61951863ad | ||
|
|
64c6a68d34 | ||
|
|
0054c4cc58 | ||
|
|
5bf494ca7d | ||
|
|
da81f70161 | ||
|
|
f3e21ac814 | ||
|
|
2314c99c36 | ||
|
|
2907cac50f | ||
|
|
536c62c137 | ||
|
|
c1b855ebf7 | ||
|
|
84d76f0749 | ||
|
|
3ae0a05422 | ||
|
|
f700c15bc7 | ||
|
|
46e24556ef | ||
|
|
e20f953c7f | ||
|
|
3c24d50bde | ||
|
|
204d80d86f | ||
|
|
4eeef63724 | ||
|
|
0c7f57d55d | ||
|
|
3a55f50723 | ||
|
|
6853c64479 | ||
|
|
3da6597643 | ||
|
|
26bd3bf76d | ||
|
|
d17d7a792a | ||
|
|
dc9f7dc294 | ||
|
|
92b219769d | ||
|
|
3e630a3882 | ||
|
|
de32c46ea4 | ||
|
|
722b5d0726 | ||
|
|
d51af59f85 | ||
|
|
5102f83290 | ||
|
|
9da4da5fd6 | ||
|
|
5213860919 | ||
|
|
20f78d214f | ||
|
|
5207e268de | ||
|
|
226108f558 | ||
|
|
7280ef42a9 | ||
|
|
919eacc0a9 | ||
|
|
ccd7be7276 | ||
|
|
5bdf4e51de | ||
|
|
25704e5ddd | ||
|
|
cf15bd3697 | ||
|
|
14b53276b9 | ||
|
|
a6c63e7968 | ||
|
|
57e11c781b | ||
|
|
1d2da05f66 | ||
|
|
ceb0f778b8 | ||
|
|
d8717bd0b4 | ||
|
|
cfcc5c1095 | ||
|
|
79b1a801b5 | ||
|
|
79907b374a | ||
|
|
278d09e4db | ||
|
|
189a7d09a1 | ||
|
|
99062805ec | ||
|
|
87dbdc07d1 | ||
|
|
db7ef3ac4b | ||
|
|
5b8ef3a17c | ||
|
|
b7f257daf1 | ||
|
|
c27560ed44 | ||
|
|
ddddbf6987 | ||
|
|
2f5d8dfb80 | ||
|
|
218340e138 | ||
|
|
c4ea10d0af | ||
|
|
bb8dcd8b61 | ||
|
|
2372340e0d | ||
|
|
f78f7e97ee | ||
|
|
6b78b75638 | ||
|
|
2f2f72fe4b | ||
|
|
34fe9596a9 | ||
|
|
e4d35c2a86 | ||
|
|
af7dde61d6 | ||
|
|
a62388759a | ||
|
|
9337d150b9 | ||
|
|
910876f323 | ||
|
|
af152aa9b9 | ||
|
|
f34fedd822 | ||
|
|
ac7c0015db | ||
|
|
1a3b5d018a | ||
|
|
86c26793b7 | ||
|
|
d99d7ac63c | ||
|
|
5646db52a9 | ||
|
|
0fe838d588 | ||
|
|
c2686beb9b | ||
|
|
1bfae7627e | ||
|
|
06c523ea81 | ||
|
|
7f4e21d4ba | ||
|
|
c993bb2f5e | ||
|
|
5527f7c78a | ||
|
|
8e9ad57173 | ||
|
|
30ae608863 | ||
|
|
68e611794b | ||
|
|
b5c20f5be9 | ||
|
|
59a53c7c73 | ||
|
|
9b76eb6b55 | ||
|
|
08d9551230 | ||
|
|
c3bdd2f288 | ||
|
|
fae881c080 | ||
|
|
49797ce6ab | ||
|
|
7783e5b7cf | ||
|
|
b242aac7cd | ||
|
|
127ad802ff | ||
|
|
f42a2c9434 | ||
|
|
b80f510de5 | ||
|
|
134087c672 | ||
|
|
91a2406827 | ||
|
|
f82f9567c2 | ||
|
|
0a2951c2eb | ||
|
|
5601212f58 | ||
|
|
3451d22460 | ||
|
|
0d5dc6bdd8 | ||
|
|
87e6aedb74 | ||
|
|
9b5bd47760 | ||
|
|
007065b40e | ||
|
|
2e52867df4 | ||
|
|
c5eb8a3f9b | ||
|
|
cacde08e99 | ||
|
|
9443ed5d49 | ||
|
|
e3c702aca1 | ||
|
|
7fbdff391c | ||
|
|
92cb2e7eab | ||
|
|
04136d5b9d | ||
|
|
fd256a6c28 | ||
|
|
e64b8841c5 | ||
|
|
52ae2c3655 | ||
|
|
f1b5f56294 | ||
|
|
ed3b62480c | ||
|
|
365d282119 | ||
|
|
56d0c574f9 | ||
|
|
573937e1e5 | ||
|
|
3892883470 | ||
|
|
d1049b8022 | ||
|
|
8e3f090ffe | ||
|
|
903c39206f | ||
|
|
29dbb36961 | ||
|
|
20851f2a96 | ||
|
|
7bbf2b200b | ||
|
|
e9ac9faa49 | ||
|
|
a15e644a51 | ||
|
|
479679a1c6 | ||
|
|
a50001364f | ||
|
|
7ea7dffd4a | ||
|
|
5ea620a4cd | ||
|
|
4e11c7a9e2 | ||
|
|
9503766a68 | ||
|
|
6b29d54b50 | ||
|
|
19bbd9b528 | ||
|
|
28721c7d20 | ||
|
|
7dbf0a3594 | ||
|
|
e2f7dd67a2 | ||
|
|
3f455199eb | ||
|
|
24f2ffe82d | ||
|
|
86c5d694e5 | ||
|
|
8c963c669b | ||
|
|
d058cacb38 | ||
|
|
c3cb5f20d9 | ||
|
|
abb9ebaf76 | ||
|
|
167ebd6975 | ||
|
|
66d248ec8e | ||
|
|
966cb24911 | ||
|
|
98821c95b6 | ||
|
|
ceaa0b61eb | ||
|
|
89aef130a5 | ||
|
|
57d96b85f1 | ||
|
|
dd4817a65a | ||
|
|
b3dcff2d76 | ||
|
|
8d3d41831d | ||
|
|
066a7041d8 | ||
|
|
50df9bdf4e | ||
|
|
eab9e4ab92 | ||
|
|
56cf46a3a4 | ||
|
|
90442e3e39 | ||
|
|
02c594d4ec | ||
|
|
8c82f811cb | ||
|
|
dbc2713495 | ||
|
|
89ac29a019 | ||
|
|
96d3ae86cc | ||
|
|
071a7fa629 | ||
|
|
0a44a8e78a | ||
|
|
59743ef071 | ||
|
|
077482d759 | ||
|
|
7e6e214f08 | ||
|
|
b6634d26d1 | ||
|
|
5e51eebe8a | ||
|
|
310997f978 | ||
|
|
b67643ed95 | ||
|
|
1b1f4464ee | ||
|
|
1111cf48f3 | ||
|
|
41833712f0 | ||
|
|
f9a26e9195 | ||
|
|
ea76f20825 | ||
|
|
1a6a0d3592 | ||
|
|
0d2c0e91c8 | ||
|
|
bc2a7b902e | ||
|
|
2e7e278ba4 | ||
|
|
06915f5dc3 | ||
|
|
7cbd840060 | ||
|
|
cc8301cc6e | ||
|
|
a9603f44f4 | ||
|
|
04ee5269fe | ||
|
|
afa93aaf9e | ||
|
|
d74bea25aa | ||
|
|
1af78c9bcb | ||
|
|
9f7cc1ae69 | ||
|
|
f4f6ea681e | ||
|
|
21051900f9 | ||
|
|
f96e12a8b3 | ||
|
|
eef47017a3 | ||
|
|
4315d9dfbb | ||
|
|
d7961bf226 | ||
|
|
7dbc8a4253 | ||
|
|
1aee41e7e7 | ||
|
|
f4cdbe985e | ||
|
|
8a0c112072 | ||
|
|
16641f0494 | ||
|
|
5965dcd029 | ||
|
|
e45ef5c49a | ||
|
|
9a1682ebaf | ||
|
|
9eed6ce197 | ||
|
|
d3279694b7 | ||
|
|
8fe6231ebc | ||
|
|
6f0860d954 | ||
|
|
1e62ddce73 | ||
|
|
956d745034 | ||
|
|
ccc69ac2d0 | ||
|
|
68365aa3b7 | ||
|
|
a0581618a4 | ||
|
|
cfcccd0240 | ||
|
|
926de3fa94 | ||
|
|
38ded2c43d | ||
|
|
f324bb603d | ||
|
|
d190616d34 | ||
|
|
d7884f89f5 | ||
|
|
d8ce122254 | ||
|
|
9c1ca78fed | ||
|
|
31c123a09b | ||
|
|
0e93295cdf | ||
|
|
5e7eda6781 | ||
|
|
f31179bb9a | ||
|
|
805b7705b2 | ||
|
|
ae649a0e31 | ||
|
|
d797d7b47a | ||
|
|
7308d0f9c6 | ||
|
|
2ab1f3749c | ||
|
|
52199fb5d3 | ||
|
|
ad497b7386 | ||
|
|
257e98edb2 | ||
|
|
5be23220e4 | ||
|
|
25310d5e88 | ||
|
|
4bc9da3910 | ||
|
|
6dfba3c7b8 | ||
|
|
034201a45b | ||
|
|
d43b9fc6c1 | ||
|
|
94ec584dc3 | ||
|
|
043188ab5e | ||
|
|
2cbffb96fd | ||
|
|
50f7057f68 | ||
|
|
f3b083cafd | ||
|
|
d881ab5fea | ||
|
|
464200e693 | ||
|
|
9ae84a69be | ||
|
|
47184ca01e | ||
|
|
39d4d01814 | ||
|
|
5419478c48 | ||
|
|
52d8ab5389 | ||
|
|
7d6701780c | ||
|
|
dbc055efb4 | ||
|
|
f9c2b4c28e | ||
|
|
7c90baf7bf | ||
|
|
67807a3aa7 | ||
|
|
dca39d6eae | ||
|
|
768d139789 | ||
|
|
af612e4b92 | ||
|
|
ef23fba147 | ||
|
|
5f813c6f70 | ||
|
|
c171728749 | ||
|
|
85c0e1f330 | ||
|
|
8269e61163 | ||
|
|
ae6c09aae2 | ||
|
|
9619584de5 | ||
|
|
dad40d60b3 | ||
|
|
9216a085cf | ||
|
|
f232ffb5cc | ||
|
|
952033f409 | ||
|
|
dc10c7e3e7 | ||
|
|
a84c8bd273 | ||
|
|
2d3d351e26 | ||
|
|
e375188889 | ||
|
|
5860f1fa7a | ||
|
|
6a149c74d1 | ||
|
|
6ae71dba4f | ||
|
|
659cc7f1c6 | ||
|
|
a6a80a8b93 | ||
|
|
722ada3f0e | ||
|
|
aeb479641f | ||
|
|
8a471a5455 | ||
|
|
c8207b479e | ||
|
|
fdaf4380fa | ||
|
|
89d228e605 | ||
|
|
556ed8413f | ||
|
|
e95f09191a | ||
|
|
fa02c20e1c | ||
|
|
f51a074f86 | ||
|
|
915539ca0f | ||
|
|
26353fd28f | ||
|
|
0aa19ed1b0 | ||
|
|
843a9cedaf | ||
|
|
c9b25f73d3 | ||
|
|
df7d2b54bd | ||
|
|
5cb907b0f1 | ||
|
|
832f9c042d | ||
|
|
eaa416c394 | ||
|
|
16645bc568 | ||
|
|
25f9e28230 | ||
|
|
1687b70bde | ||
|
|
d49ceef637 | ||
|
|
da573ac573 | ||
|
|
743eaab9f6 | ||
|
|
202811f3c6 | ||
|
|
6250603440 | ||
|
|
650c7a3ae0 | ||
|
|
42d75decb0 | ||
|
|
55f6aa9ff8 | ||
|
|
0e77caa329 | ||
|
|
da0e73fe11 | ||
|
|
fc5ab3572e | ||
|
|
891738747a | ||
|
|
1c52e731e1 | ||
|
|
ee615fbadf | ||
|
|
2ede9ef8ed | ||
|
|
dbcfcafdfc | ||
|
|
7d63c82ddd | ||
|
|
1d4dc81e55 | ||
|
|
ceca0f095b | ||
|
|
793996e047 | ||
|
|
ab76d46007 | ||
|
|
ed1e22bac5 | ||
|
|
e57ce28d2b | ||
|
|
2b596e226a | ||
|
|
c46f574aa8 | ||
|
|
9b4890a99f | ||
|
|
3f129513bb | ||
|
|
698490b936 | ||
|
|
c8bf95578c | ||
|
|
064132833c | ||
|
|
60f8f93a02 | ||
|
|
7b08d98647 | ||
|
|
11e619d1b3 | ||
|
|
4f184a6723 | ||
|
|
5fd91e808a | ||
|
|
0dfa224aeb | ||
|
|
32565dd188 | ||
|
|
96f09c45f5 | ||
|
|
d2474c8a72 | ||
|
|
9eb0dd5e70 | ||
|
|
bbdcb34ab6 | ||
|
|
6525d63459 | ||
|
|
0babf89aa5 | ||
|
|
317e6f81bb | ||
|
|
ae684d6d39 | ||
|
|
d9710ac244 | ||
|
|
dff7a28094 | ||
|
|
da18950b3d | ||
|
|
6055ce9b6b | ||
|
|
bd14739a9e | ||
|
|
843cbe4f80 | ||
|
|
f650e73d5c | ||
|
|
d1293dd047 | ||
|
|
715e8a5000 | ||
|
|
a7a69008d8 | ||
|
|
553b56d094 | ||
|
|
fec57c4ed7 | ||
|
|
b46f106a91 | ||
|
|
0214419446 | ||
|
|
d587d14f86 | ||
|
|
a115151616 | ||
|
|
26771ee7d0 | ||
|
|
731263638b | ||
|
|
a4f69351ce | ||
|
|
fa5f234a38 | ||
|
|
5d2c981368 | ||
|
|
4a55842724 | ||
|
|
e9655ed05e | ||
|
|
ed7d2bbdd7 | ||
|
|
276328e0fd | ||
|
|
1bcd091330 | ||
|
|
536d7e2957 | ||
|
|
55e774344a | ||
|
|
7d0c8b0c5f | ||
|
|
88c4cff50c | ||
|
|
cfe01bb820 | ||
|
|
4f1bd4e509 | ||
|
|
88544a89b7 | ||
|
|
a87e41eecd | ||
|
|
e52639d1d4 | ||
|
|
0463f5e83d | ||
|
|
eb90314b38 | ||
|
|
6ce1d60ebb | ||
|
|
5fa62c9fbd | ||
|
|
ef93a1f42e | ||
|
|
5f42748e1b | ||
|
|
269df23851 | ||
|
|
c40dc64bd0 | ||
|
|
2b150e3c1c | ||
|
|
f7c17ac7e7 | ||
|
|
3f2638efaf | ||
|
|
f106664952 | ||
|
|
afe8dcc1ff | ||
|
|
8f1e439381 | ||
|
|
4418d031e1 | ||
|
|
f3fc452904 | ||
|
|
89f40fe3de | ||
|
|
f8962beca6 | ||
|
|
dae1569f0e | ||
|
|
dd76c268c5 | ||
|
|
52c52f23d3 | ||
|
|
3adcb9f164 | ||
|
|
0f1a061afe | ||
|
|
95705cc95a | ||
|
|
07b652c1d4 | ||
|
|
eac137a9a9 | ||
|
|
6ec65965a4 | ||
|
|
290ae774e0 | ||
|
|
31e12f682d | ||
|
|
ae52f85502 | ||
|
|
fcda79eb3c | ||
|
|
385f371c06 | ||
|
|
6efb1a6705 | ||
|
|
4695ef3208 | ||
|
|
34e8b79e7e | ||
|
|
3639f943bf | ||
|
|
d373369649 | ||
|
|
9106e70b37 | ||
|
|
4678189ed4 | ||
|
|
78298e1284 | ||
|
|
34c091f232 | ||
|
|
064b650fac | ||
|
|
f8b4cbcc13 | ||
|
|
2f9c8dbb33 | ||
|
|
8bd5db431b | ||
|
|
5754510d7a | ||
|
|
797e2fea1e | ||
|
|
538656fcc7 | ||
|
|
0f66fa528d | ||
|
|
1a42f6dded | ||
|
|
4efdd342d6 | ||
|
|
f15684a562 | ||
|
|
78dfba8771 | ||
|
|
e428e186f0 | ||
|
|
ebf07eddfb | ||
|
|
d3abc44976 | ||
|
|
dc7c10014d | ||
|
|
5e2e8f91c7 | ||
|
|
e5a314bb3a | ||
|
|
9d3882d5b9 | ||
|
|
a647007a0f | ||
|
|
e04a4908cf | ||
|
|
cfe0272022 | ||
|
|
2e3b55d9e8 | ||
|
|
6b8ebe11de | ||
|
|
1fffd36054 | ||
|
|
2b25fea86c | ||
|
|
409a8311b1 | ||
|
|
6996c008d0 | ||
|
|
64fa52452c | ||
|
|
16d33b1c1f | ||
|
|
0a260a67d5 | ||
|
|
1aacd3cb23 | ||
|
|
5af3ba9db6 | ||
|
|
14bfd78f63 | ||
|
|
febc672e6e | ||
|
|
a18dcfce9e | ||
|
|
48410c428a | ||
|
|
da1df91f49 | ||
|
|
b2df6e6d41 | ||
|
|
8315c61240 | ||
|
|
1ff7ebb04a | ||
|
|
ab914f4621 | ||
|
|
51ef00e0f2 | ||
|
|
2b4df5be16 | ||
|
|
f98da25fda | ||
|
|
4c305b7cc0 | ||
|
|
5c979a532f | ||
|
|
fcf2427878 | ||
|
|
31e923fc67 | ||
|
|
1c2ebb8c5d | ||
|
|
29e75a4851 | ||
|
|
3765661a4e | ||
|
|
628984c09d | ||
|
|
a630653d88 | ||
|
|
e693b908be | ||
|
|
f36b2433a0 | ||
|
|
47af0d0356 | ||
|
|
d4c587c668 | ||
|
|
dda453975b | ||
|
|
c28801ff27 | ||
|
|
4e609ebc33 | ||
|
|
1257e96d5e | ||
|
|
122a3ab4ce | ||
|
|
136cb43cd1 | ||
|
|
ad8086d2b6 | ||
|
|
d00641a73c | ||
|
|
197be51047 | ||
|
|
53c40a87b2 | ||
|
|
b304c13034 | ||
|
|
cb895d17ff | ||
|
|
f0dd3aada3 | ||
|
|
2d055c8d8d | ||
|
|
aad4482a78 | ||
|
|
d71536ab86 | ||
|
|
fe25d52082 | ||
|
|
0441662e0c | ||
|
|
0f40bc4cce | ||
|
|
13e9c20be0 | ||
|
|
17bab31b18 | ||
|
|
26f11fabb7 | ||
|
|
b892749c75 | ||
|
|
810b08c50d | ||
|
|
fc71a757dd | ||
|
|
6c324414b1 | ||
|
|
d7283b92ac | ||
|
|
d67fdbc24e | ||
|
|
1edaf15220 | ||
|
|
38bd2bd011 | ||
|
|
da4ac6d709 | ||
|
|
9e16629d69 | ||
|
|
0aefab34f1 | ||
|
|
05b4ddfd46 | ||
|
|
74f2d6bea6 | ||
|
|
5392c9fd38 | ||
|
|
cd8e12c747 | ||
|
|
591b292fbf | ||
|
|
3610525c88 | ||
|
|
1db3ecca22 | ||
|
|
0168ef4014 | ||
|
|
25450a4182 | ||
|
|
8cc6b048fd | ||
|
|
cf094a2048 | ||
|
|
10881c8f5b | ||
|
|
23c6c8b331 | ||
|
|
cf8a437361 | ||
|
|
653c0faa18 | ||
|
|
b108e5bf45 | ||
|
|
5e5597ef19 | ||
|
|
edb5cb4ee5 | ||
|
|
3b81108738 | ||
|
|
110f5e02f4 | ||
|
|
a4a7ce51ad | ||
|
|
08a7dbe319 | ||
|
|
0b9e6d52b4 | ||
|
|
ecf0a4f299 | ||
|
|
d3fe5cdf34 | ||
|
|
d3d5c11675 | ||
|
|
ae30b4359f | ||
|
|
bda1b0a304 | ||
|
|
839f3e52ef | ||
|
|
a85f6b8287 | ||
|
|
fe9f86b432 | ||
|
|
c0a3bdcf99 | ||
|
|
94125fa5dd | ||
|
|
a77971ae13 | ||
|
|
e7f153a5e5 | ||
|
|
8cd39861f8 | ||
|
|
dcff407670 | ||
|
|
3b453dea13 | ||
|
|
9981b8f16c | ||
|
|
da4663aa83 | ||
|
|
3895bbc801 | ||
|
|
7285e2b2c9 | ||
|
|
e9bf26e0ca | ||
|
|
ec0319d256 | ||
|
|
1bfefbd083 | ||
|
|
8967343079 | ||
|
|
b3ba06aecb | ||
|
|
8cdcd7105a | ||
|
|
cc6d8d28b5 | ||
|
|
b55e13dbeb | ||
|
|
bbe8c46df9 | ||
|
|
16a56457ed | ||
|
|
a4c0728e28 | ||
|
|
d6907f3f3a | ||
|
|
3f126be081 | ||
|
|
cbf0b3c05e | ||
|
|
0f0470b93c | ||
|
|
d104c6dbf4 | ||
|
|
a8705be6ee | ||
|
|
f54ba4b018 | ||
|
|
884b410dce | ||
|
|
e5945fa720 | ||
|
|
b155a9908b | ||
|
|
d67e4a3491 | ||
|
|
97d0ab1b75 | ||
|
|
f5befcc95f | ||
|
|
ab047944b6 | ||
|
|
ce5f927a8d | ||
|
|
dcb777d6ea | ||
|
|
decf728d91 | ||
|
|
098f8a52f7 | ||
|
|
1eeb7f8303 | ||
|
|
4b7177101a | ||
|
|
73cf3eb869 | ||
|
|
b4da35a0ab | ||
|
|
e3d92c27e8 | ||
|
|
8addb49012 | ||
|
|
ac1e557c46 | ||
|
|
d1651b54ec | ||
|
|
f61dbdccec | ||
|
|
9beff11125 | ||
|
|
d8c0a82411 | ||
|
|
2add9a02f9 | ||
|
|
2910a6effd | ||
|
|
5621a651a1 | ||
|
|
c83e816bda | ||
|
|
948e5a2dde | ||
|
|
94cd17909d | ||
|
|
bcfa3efef7 | ||
|
|
bf87eb68e2 | ||
|
|
a84298de86 | ||
|
|
ee47c6d727 | ||
|
|
ef5bd95620 | ||
|
|
b36703fc47 | ||
|
|
b2112ca8b9 | ||
|
|
7952545f0d | ||
|
|
c997fbafb0 | ||
|
|
60c8d3b832 | ||
|
|
778c1852b8 | ||
|
|
08cc287dff | ||
|
|
17b7ef80ba | ||
|
|
a4532cb834 | ||
|
|
dc2bc7fbf7 | ||
|
|
d37dd66ec5 | ||
|
|
79bbeea7f0 | ||
|
|
5b56de784d | ||
|
|
620dd0be78 | ||
|
|
7267fd080e | ||
|
|
2d8e03cc69 | ||
|
|
b797492dbd | ||
|
|
eb41d8b16d | ||
|
|
d791aa2e4f | ||
|
|
f969841464 | ||
|
|
93d63508dc | ||
|
|
84e7935971 | ||
|
|
730bedf0a5 | ||
|
|
0ed223ef01 | ||
|
|
fc677ca0e9 | ||
|
|
c02f95c2fc | ||
|
|
76b5affaaa | ||
|
|
72c7cc2c67 | ||
|
|
13b9749e8f | ||
|
|
3f76521bfe | ||
|
|
837cf10e36 | ||
|
|
e8fe7cc853 | ||
|
|
5db96847fc | ||
|
|
746b01f8ca | ||
|
|
eb2218c220 | ||
|
|
657ec411c3 | ||
|
|
9895806d23 | ||
|
|
5957e4b264 | ||
|
|
c544c4d6b5 | ||
|
|
061af3f827 | ||
|
|
4d8708a5ee | ||
|
|
9eb1870196 | ||
|
|
e961a44511 | ||
|
|
c16a35ec8c | ||
|
|
841566a5d1 | ||
|
|
4a822c5920 | ||
|
|
ce554fc442 | ||
|
|
e9a515ac34 | ||
|
|
b14b53329c | ||
|
|
b8641258d6 | ||
|
|
6022aff965 | ||
|
|
18eaae80ec | ||
|
|
a4e41462c7 | ||
|
|
f8bed154ce | ||
|
|
8ee3f7ab66 | ||
|
|
77c7efbe89 | ||
|
|
8d78ef5946 | ||
|
|
4571a3b50b | ||
|
|
b48197c8aa | ||
|
|
bb45c0c34b | ||
|
|
25c316165e | ||
|
|
1246f3aa21 | ||
|
|
49cd31fd41 | ||
|
|
94e6380485 | ||
|
|
36b5315075 | ||
|
|
c66ccfeda2 | ||
|
|
ae0cfe1575 | ||
|
|
79ff36d49a | ||
|
|
d6742812c8 | ||
|
|
13dc721cb0 | ||
|
|
57967835bd | ||
|
|
db9913c725 | ||
|
|
c3e3f4e947 | ||
|
|
f33937bc5d | ||
|
|
c176a5b80a | ||
|
|
e2db8c07af | ||
|
|
c224892609 | ||
|
|
f5ed9d93c3 | ||
|
|
88145694ce | ||
|
|
d58f7fd089 | ||
|
|
c32b53b3c0 | ||
|
|
9dfef527a3 | ||
|
|
df51c8b9a4 | ||
|
|
499c4a27d3 | ||
|
|
bfe08acfec | ||
|
|
ffae976e11 | ||
|
|
ced8eb419f | ||
|
|
0ab2eaa630 | ||
|
|
d385f555dd | ||
|
|
268e5cbdb1 | ||
|
|
247649ec34 | ||
|
|
2ada6d969d | ||
|
|
a4d2740f24 | ||
|
|
df7266cc75 | ||
|
|
3255b73a44 | ||
|
|
305e81bef1 | ||
|
|
84cc6e9140 | ||
|
|
b8d95f4b31 | ||
|
|
c0f7d02f44 | ||
|
|
7fc6b61f21 | ||
|
|
ed3a1296d8 | ||
|
|
66c62d8875 | ||
|
|
7d1b06471f | ||
|
|
b7309cdda8 | ||
|
|
6ffc12ef97 | ||
|
|
79b2d39305 | ||
|
|
b3525ea6a5 | ||
|
|
b5ceec4883 | ||
|
|
4287082f4b | ||
|
|
e3a8d12d4b | ||
|
|
ce15c26b59 | ||
|
|
48940272ae | ||
|
|
8c64538207 | ||
|
|
0460033281 | ||
|
|
8240cb9c0f | ||
|
|
e385f054df | ||
|
|
03ae935756 | ||
|
|
d196f455cb | ||
|
|
50bb13b7cd | ||
|
|
652afd6b57 | ||
|
|
d1cb176b31 | ||
|
|
767131a117 | ||
|
|
f0dadcef70 | ||
|
|
1f20024b91 | ||
|
|
f5c7197dda | ||
|
|
cb497fe720 | ||
|
|
bef0e40db8 | ||
|
|
24073b20ab | ||
|
|
64d83d9048 | ||
|
|
5c0b06f27d | ||
|
|
b09e2c11eb | ||
|
|
8c119a76d1 | ||
|
|
04a9788bc0 | ||
|
|
883e7f96ee | ||
|
|
d276be9594 | ||
|
|
2fc6b0a8cb | ||
|
|
9f295d8399 | ||
|
|
024f454702 | ||
|
|
821ad4de2e | ||
|
|
b864f9c6a9 | ||
|
|
31e0a8a88b | ||
|
|
be3d2b6552 | ||
|
|
e2eb546069 | ||
|
|
b2ae3b4fee | ||
|
|
5b9e5f904b | ||
|
|
7d1843f485 | ||
|
|
f1e2704407 | ||
|
|
17b4a0525d | ||
|
|
5cdba3c00a | ||
|
|
79b5551ec1 | ||
|
|
ac840323be | ||
|
|
c2e7863ca0 | ||
|
|
01b065b3c2 | ||
|
|
55907a9a05 | ||
|
|
6e9dcdbb50 | ||
|
|
0265ea45b2 | ||
|
|
ccb7e41434 | ||
|
|
38317c5497 | ||
|
|
9f62de0420 | ||
|
|
e8e4af7286 | ||
|
|
2c5d30a0ff | ||
|
|
eb27db2232 | ||
|
|
adb6337a27 | ||
|
|
624bb0a7e5 | ||
|
|
757829d286 | ||
|
|
c5f055718a | ||
|
|
a12c8f4dbc | ||
|
|
f072afa6ef | ||
|
|
686d77dcc1 | ||
|
|
7da227cdfa | ||
|
|
abcfaa05e2 | ||
|
|
aa144b0439 | ||
|
|
15329a97fe | ||
|
|
223b2678b4 | ||
|
|
930923e330 | ||
|
|
8fe929d8ab | ||
|
|
e12207fc73 | ||
|
|
ef05949e5a | ||
|
|
a2f7edcbcd | ||
|
|
7f80638928 | ||
|
|
222d6cdca1 | ||
|
|
aa733542e3 | ||
|
|
2b142baf19 | ||
|
|
78bfd1ff64 | ||
|
|
7ea1309146 | ||
|
|
a7be7a3e7a | ||
|
|
a14fd303fc | ||
|
|
b632a991b9 | ||
|
|
06aae24dad | ||
|
|
3bf04802e4 | ||
|
|
6f79e63b3f | ||
|
|
67cfdedcc4 | ||
|
|
f0c6295cff | ||
|
|
6c5629a0d7 | ||
|
|
06726758d2 | ||
|
|
866c7d4f2f | ||
|
|
17695927d5 | ||
|
|
ea8638c843 | ||
|
|
0fbc1095be | ||
|
|
b914e8388d | ||
|
|
31911a40c0 | ||
|
|
00a2a23190 | ||
|
|
5f25e605d3 | ||
|
|
d4f81f086c | ||
|
|
e048813c43 | ||
|
|
1186f2fb14 | ||
|
|
a2cdf6559d | ||
|
|
9d6d74ce98 | ||
|
|
dbc7023c00 | ||
|
|
6fd84dba8f | ||
|
|
e444a52b6a | ||
|
|
d431a81cf0 | ||
|
|
dcb03a2250 | ||
|
|
8d6e016e48 | ||
|
|
f067af664e | ||
|
|
6355e4e3bc | ||
|
|
e2f9c18a27 | ||
|
|
cc93dba508 | ||
|
|
b1f270c082 | ||
|
|
d086de8103 | ||
|
|
523ca2f7fc | ||
|
|
a2888b009d | ||
|
|
143e2908ad | ||
|
|
98542bd5d5 | ||
|
|
ee0a71de1b | ||
|
|
9f8cb6ca34 | ||
|
|
759fb8a802 | ||
|
|
ab06eaeca8 | ||
|
|
267b3a9547 | ||
|
|
0b49ecfc12 | ||
|
|
23b03919e6 | ||
|
|
4f165f3b27 | ||
|
|
967a4c7748 | ||
|
|
03c23f0fda | ||
|
|
44bad0146c | ||
|
|
d92d6e84d0 | ||
|
|
355b64fda4 | ||
|
|
c1632f8e65 | ||
|
|
1fa16bd8dd | ||
|
|
0ac531674c | ||
|
|
18a61061e1 | ||
|
|
b0e349212d | ||
|
|
9913e67928 | ||
|
|
888c837cdd | ||
|
|
0e03fb6393 | ||
|
|
317fed304c | ||
|
|
681cf349e6 | ||
|
|
313cf858f0 | ||
|
|
fa94fd075f | ||
|
|
3433d211a5 | ||
|
|
dcda3c7329 | ||
|
|
d2563063d1 | ||
|
|
9557baf22a | ||
|
|
c7b1d4514f | ||
|
|
09cd8bcb99 | ||
|
|
3046d63ad4 | ||
|
|
de9c2d3d85 | ||
|
|
2454c50380 | ||
|
|
e2f8156a4d | ||
|
|
6ea6a61e90 | ||
|
|
b978b6756e | ||
|
|
cbae83106b | ||
|
|
424f854145 | ||
|
|
faf72705cb | ||
|
|
381e72f1ef | ||
|
|
91fe549c25 | ||
|
|
a472da9ea6 | ||
|
|
20c7fe81dc | ||
|
|
3ef445eb2e | ||
|
|
4afc38523d | ||
|
|
15616e8d07 | ||
|
|
2534921af9 | ||
|
|
0206198f55 | ||
|
|
3c8c402f10 | ||
|
|
098dae9640 | ||
|
|
42c38de3e2 | ||
|
|
be10e6a9de | ||
|
|
6b5fb81e01 | ||
|
|
bb5991b111 | ||
|
|
8f261970e9 | ||
|
|
093a8f18ef | ||
|
|
9c19b5b785 | ||
|
|
35958ca3a2 | ||
|
|
3bc2e97e8b | ||
|
|
eb7ff77461 | ||
|
|
d36f4cf6f8 | ||
|
|
f373669f02 | ||
|
|
37596589a7 | ||
|
|
3e90426d8e | ||
|
|
35a184827a | ||
|
|
2edd3c5614 | ||
|
|
cec5a6ceeb | ||
|
|
dc6b0b4dde | ||
|
|
3ecc1816be | ||
|
|
9a90c2e568 | ||
|
|
ab747d0338 | ||
|
|
8753f91a4a | ||
|
|
f8af109821 | ||
|
|
a1a7900254 | ||
|
|
804eb6c076 | ||
|
|
f4f3ff0eda | ||
|
|
03c0b1ea91 | ||
|
|
38535bde84 | ||
|
|
17e1fa54cf | ||
|
|
a4f5dd9d89 | ||
|
|
6269902140 | ||
|
|
b964e424b2 | ||
|
|
73665f62b3 | ||
|
|
3fca780132 | ||
|
|
b5e01dcb5e | ||
|
|
f180b89a9c | ||
|
|
98a903e60c | ||
|
|
c20cc8fb18 | ||
|
|
99f5c4e12f | ||
|
|
17759f9a98 | ||
|
|
6c0e96213f | ||
|
|
2c89d80a27 | ||
|
|
e314fd4a0a | ||
|
|
affbe9f5a9 | ||
|
|
7a423eb6e1 | ||
|
|
7137924baa | ||
|
|
c998bce34f | ||
|
|
f5d4397f0b | ||
|
|
608b166b32 | ||
|
|
472cda8315 | ||
|
|
7a78e5d869 | ||
|
|
8effca3a7c | ||
|
|
fab52b6a56 | ||
|
|
e98ef5f5f2 | ||
|
|
7aa84607c8 | ||
|
|
928fc374c7 | ||
|
|
4ea8cb5903 | ||
|
|
db6acacf2e | ||
|
|
59aa71b3b8 | ||
|
|
ccfa487493 | ||
|
|
9fcc41aeff | ||
|
|
d9a4fa3f49 | ||
|
|
6c821dc42a | ||
|
|
d58e34ed3d | ||
|
|
ff37d1cb02 | ||
|
|
dcf119ae59 | ||
|
|
1338cf875a | ||
|
|
ed3e299e0b | ||
|
|
f85645a78a | ||
|
|
e412abd017 | ||
|
|
1efa654e7d | ||
|
|
00b58068dc | ||
|
|
7be5208daf | ||
|
|
7ad555a41b | ||
|
|
872f70a418 | ||
|
|
c37d2e78d2 | ||
|
|
b606d066fc | ||
|
|
d4608eec26 | ||
|
|
0bc8e231ad | ||
|
|
2dab5e4a78 | ||
|
|
c6aa37851d | ||
|
|
31bd106ffd | ||
|
|
74cea2b41c | ||
|
|
46f9a00b75 | ||
|
|
450d8c21cf | ||
|
|
2073bc77c8 | ||
|
|
b6a5501f71 | ||
|
|
e27b98cdc1 | ||
|
|
8af500462f | ||
|
|
30fc4c28b7 | ||
|
|
74b582369a | ||
|
|
c9ab2b507b | ||
|
|
2b479319c1 | ||
|
|
3a3ac012bb | ||
|
|
00265a7e8e | ||
|
|
0dafb50223 | ||
|
|
ac9620c253 | ||
|
|
6e226b165c | ||
|
|
6226f65e20 | ||
|
|
7de29c29e9 | ||
|
|
deed6c7bbe | ||
|
|
c234e2ca3d | ||
|
|
19bffa288d | ||
|
|
9303096430 | ||
|
|
98d5f5ee3e | ||
|
|
ba16fceeb8 | ||
|
|
c49b5f78bf | ||
|
|
446688d5b2 | ||
|
|
e2cacd9c4b | ||
|
|
d5c9e08888 | ||
|
|
ab0ead4e05 | ||
|
|
9a267db583 | ||
|
|
fb15cbef90 | ||
|
|
97e5d9f610 | ||
|
|
305ee394b1 | ||
|
|
a251d521a1 | ||
|
|
b5065cb52f | ||
|
|
dca16e83d3 | ||
|
|
c5256fe2cb | ||
|
|
1b93ba5355 | ||
|
|
fd7171f5a4 | ||
|
|
685fc1a37b | ||
|
|
a738c93163 | ||
|
|
4ac863fa6a | ||
|
|
fed369ad5d | ||
|
|
f2c91d015e | ||
|
|
e122349f9e | ||
|
|
bb07c3ab45 | ||
|
|
65a4b38ee5 | ||
|
|
bbc3f5c19a | ||
|
|
0b4ba548a5 | ||
|
|
747b963bd4 | ||
|
|
32b9820725 | ||
|
|
b217fede87 | ||
|
|
a9ce8a3b2e | ||
|
|
7914e7bc14 | ||
|
|
ed8716510b | ||
|
|
efd2ae59f5 | ||
|
|
1923d0b809 | ||
|
|
99f6752590 | ||
|
|
131746f94e | ||
|
|
f0ed6973c8 | ||
|
|
2cf070a26c | ||
|
|
3c68ecb7f1 | ||
|
|
243f5fcda4 | ||
|
|
e22b7f36ce | ||
|
|
308ea15763 | ||
|
|
e26f9c58fa | ||
|
|
4ca758174e | ||
|
|
bf8e35e168 | ||
|
|
2a3265ed71 | ||
|
|
3a06617a7d | ||
|
|
d75eb456dc | ||
|
|
8ed0f8ec73 | ||
|
|
185e0dce6e | ||
|
|
d9e74a78f0 | ||
|
|
700483dd48 | ||
|
|
1c80b820cb | ||
|
|
59e5cfb04d | ||
|
|
b06550e2cb | ||
|
|
ca4bf13569 | ||
|
|
eae3a50435 | ||
|
|
de2956ec3c | ||
|
|
a2e62c9fb5 | ||
|
|
e7fdc318f1 | ||
|
|
62dd559b7c | ||
|
|
4a631753a0 | ||
|
|
b696984655 | ||
|
|
f1dbec122a | ||
|
|
47cb54461f | ||
|
|
91e03f7cfd | ||
|
|
c0314d95c9 | ||
|
|
8e17b3ff51 | ||
|
|
b932a659b6 | ||
|
|
80b2ed19e0 | ||
|
|
88000926f4 | ||
|
|
12245fefed | ||
|
|
8eebd5fb9a | ||
|
|
c5b0e31d36 | ||
|
|
5c5e828cc6 | ||
|
|
ecb11cf927 | ||
|
|
485241d080 | ||
|
|
8701f8868c | ||
|
|
e68086e149 | ||
|
|
16a2d80801 | ||
|
|
d5e5659a2c | ||
|
|
3c2e8dcf87 | ||
|
|
03320e8644 | ||
|
|
40ae6ccf2f | ||
|
|
bcbade3729 | ||
|
|
58a6f9cae3 | ||
|
|
bf154eb8c3 | ||
|
|
766b6e9fef | ||
|
|
d89a41d4c7 | ||
|
|
d24a7d7b22 | ||
|
|
57a746fc21 | ||
|
|
2c1bd41fba | ||
|
|
6260cf24cc | ||
|
|
88d4a670d4 | ||
|
|
ea0b6c5ee5 | ||
|
|
20f61042fc | ||
|
|
2751a967e8 | ||
|
|
93057870a7 | ||
|
|
6b98c3fed5 | ||
|
|
eb63ed926d | ||
|
|
b72787f5bb | ||
|
|
0793b2ab38 | ||
|
|
604ed3e3e1 | ||
|
|
0aefbc2c7d | ||
|
|
eb1fa90788 | ||
|
|
65f02e5139 | ||
|
|
bbfe65a905 | ||
|
|
59468eb162 | ||
|
|
1889a283ee | ||
|
|
0655b2021d | ||
|
|
a1b8c9b6fd | ||
|
|
c4a60bc6f6 | ||
|
|
eb7037eea8 | ||
|
|
7546083cd5 | ||
|
|
74ee36f43a | ||
|
|
f8c3e4d66f | ||
|
|
6db8d9a38a | ||
|
|
61145a2d03 | ||
|
|
4a9410742a | ||
|
|
db78e4ef03 | ||
|
|
7b0eb4e79d | ||
|
|
17f6b8eb2a | ||
|
|
37c40d7dda | ||
|
|
1a2aa876e3 | ||
|
|
39822f323f | ||
|
|
338acfba75 | ||
|
|
490f4f36f1 | ||
|
|
69c46f684f | ||
|
|
1626406557 | ||
|
|
f662defcf9 | ||
|
|
8f07f8e9e1 | ||
|
|
7e44f7f110 | ||
|
|
b211a66e99 | ||
|
|
0bdb066820 | ||
|
|
4ee84e10fd | ||
|
|
ab706f4076 | ||
|
|
bd7266653f | ||
|
|
08f968dced | ||
|
|
9f9ebd838a | ||
|
|
a03f89fb68 | ||
|
|
51146a4ed5 | ||
|
|
80301f2cb2 | ||
|
|
9a9f26c435 | ||
|
|
eebe9cbd5f | ||
|
|
503d43b552 | ||
|
|
b3077fc15d | ||
|
|
fdc462d071 | ||
|
|
f44a26da3c | ||
|
|
d12d03fd5e | ||
|
|
51ee2df755 | ||
|
|
a89bb33015 | ||
|
|
7659cca8ba | ||
|
|
f754e951f7 | ||
|
|
e2905d01ac | ||
|
|
9d691f2452 | ||
|
|
a426c8bb26 | ||
|
|
bc8b1722b0 | ||
|
|
ac31c612b3 | ||
|
|
03c3eea54e | ||
|
|
bccaf16343 | ||
|
|
30df45ef2e | ||
|
|
6500ba48a7 | ||
|
|
03b35721a2 | ||
|
|
14327d4462 | ||
|
|
1b968903e2 | ||
|
|
b719e95e6e | ||
|
|
318eb2f47d | ||
|
|
010f24e5c3 | ||
|
|
db9762c5b2 | ||
|
|
d1ebcde725 | ||
|
|
545f9cad2d | ||
|
|
3247d84b6b | ||
|
|
e73f0a916a | ||
|
|
150af5ff8b | ||
|
|
1659ab146d | ||
|
|
86e17d38d4 | ||
|
|
1809c59f25 | ||
|
|
4eb9661730 | ||
|
|
4acbe4b31a | ||
|
|
df17dd749f | ||
|
|
20e5a88e56 | ||
|
|
0a939a5b91 | ||
|
|
6ad7c30a18 | ||
|
|
e6bfc60139 | ||
|
|
c866baa4eb | ||
|
|
91303acdbe | ||
|
|
1273af4b1b | ||
|
|
e682b408f3 | ||
|
|
0a0c206998 | ||
|
|
44ffd98d0c | ||
|
|
53ec93c8f8 | ||
|
|
f779ed7628 | ||
|
|
f2fdb74f23 | ||
|
|
4ba87e3349 | ||
|
|
7abee90992 | ||
|
|
159a9e00c8 | ||
|
|
9c62f38345 | ||
|
|
1443f5f997 | ||
|
|
17d8a124cd | ||
|
|
5cd565306e | ||
|
|
67010e20d7 | ||
|
|
704604f6fe | ||
|
|
e687f56c7f | ||
|
|
ff85575e98 | ||
|
|
26be25c218 | ||
|
|
d3d5e0cbfb | ||
|
|
4796bf632c | ||
|
|
5eef365baf | ||
|
|
937ff63af9 | ||
|
|
33211bfb27 | ||
|
|
a243da8b1e | ||
|
|
62e605a443 | ||
|
|
2bdaaa5a33 | ||
|
|
bcad3c1ced | ||
|
|
b865f5d6e7 | ||
|
|
00664822ec | ||
|
|
4594c15de7 | ||
|
|
2b6ec1672c | ||
|
|
d44d5711cb | ||
|
|
54cb13ba62 | ||
|
|
c32f5dd951 | ||
|
|
2e6c42c8ac | ||
|
|
5757b86d39 | ||
|
|
9df4a79827 | ||
|
|
071dd46a4c | ||
|
|
030d619910 | ||
|
|
c56fd399c1 | ||
|
|
31c954db0e | ||
|
|
cb6a040c4d | ||
|
|
51c3a753a9 | ||
|
|
c28c592c80 | ||
|
|
fc07f851f7 | ||
|
|
ab4a5e6719 | ||
|
|
88e9dd54b2 | ||
|
|
f53f34559a | ||
|
|
3e5d9a394f | ||
|
|
3f287eb148 | ||
|
|
dfe854a236 | ||
|
|
3854c7bba2 | ||
|
|
01c066419d | ||
|
|
040b1d9bc8 | ||
|
|
6c4acbad68 | ||
|
|
b5c11ece57 | ||
|
|
50696d2e88 | ||
|
|
e7661fd4be | ||
|
|
957e11eff0 | ||
|
|
bd6e8d093a | ||
|
|
f7b5a86a09 | ||
|
|
97fd107f47 | ||
|
|
fc688dca99 | ||
|
|
fe3bd2a1f1 | ||
|
|
3625befc0b | ||
|
|
6e6508aafd | ||
|
|
3a8a0a541e | ||
|
|
650495306f | ||
|
|
5664c34790 | ||
|
|
b1c66997ca | ||
|
|
114ffd4667 | ||
|
|
ad1770ec95 | ||
|
|
5f22402761 | ||
|
|
c11094a11e | ||
|
|
6873bf384e | ||
|
|
42242daf9b | ||
|
|
1f96b960ab | ||
|
|
f6b30ed0c6 | ||
|
|
c59dc129a8 | ||
|
|
472c1a9e3e | ||
|
|
24fe8ab4a4 | ||
|
|
453c6f05bd | ||
|
|
248de7f1f2 | ||
|
|
3bbf84861e | ||
|
|
0dac9044a5 | ||
|
|
a981d1082a | ||
|
|
803d0c2ae2 | ||
|
|
06e44cc649 | ||
|
|
fd01e5c263 | ||
|
|
ecc47dcfbb | ||
|
|
b6e06dfdc2 | ||
|
|
eb630b23ae | ||
|
|
eae7a48991 | ||
|
|
9436c836e6 | ||
|
|
7c64239b36 | ||
|
|
80ba371296 | ||
|
|
6787563efe | ||
|
|
9def85f9ba | ||
|
|
6d55f35404 | ||
|
|
1902c37924 | ||
|
|
02b5ff38a4 | ||
|
|
f076a927c9 | ||
|
|
6184eaa30e | ||
|
|
a42b72e9ce | ||
|
|
f4dcae722c | ||
|
|
bbcb3e9403 | ||
|
|
3d690b7c72 | ||
|
|
b4ab2c69ae | ||
|
|
4a7f406edb | ||
|
|
9e18bcaeb8 | ||
|
|
9abfe233bc | ||
|
|
3267958541 | ||
|
|
af5ee45206 | ||
|
|
300b72b9b8 | ||
|
|
42af55a740 | ||
|
|
3c1e6d0e5c | ||
|
|
edf7df368e | ||
|
|
cde38e012f | ||
|
|
bef4f0c4e2 | ||
|
|
bf081dce32 | ||
|
|
0bb3cb4aab | ||
|
|
0d5132f710 | ||
|
|
cad147faf8 | ||
|
|
cc405b83e2 | ||
|
|
c65f5b7279 | ||
|
|
c216340120 | ||
|
|
ff5cbc490e | ||
|
|
27cba5ba31 | ||
|
|
9976b8132f | ||
|
|
dbc5bd96f3 | ||
|
|
9489ab862b | ||
|
|
1bb634bc6f | ||
|
|
07b5c7fef4 | ||
|
|
4a7cfab543 | ||
|
|
426ef5cb88 | ||
|
|
5b86412407 | ||
|
|
4f8fcd2d3d | ||
|
|
16c40aa51c | ||
|
|
6449c4a53d | ||
|
|
d670356388 | ||
|
|
fb4c8549dc | ||
|
|
42dc5c1f0f | ||
|
|
659c3bc1cf | ||
|
|
f5684f2c45 | ||
|
|
1d2d2b1c9c | ||
|
|
bc06ba54b9 | ||
|
|
1b6e223456 | ||
|
|
9e4a2168c0 | ||
|
|
46aa26a444 | ||
|
|
4d01aa3006 | ||
|
|
2c308af615 | ||
|
|
caf4ab60cd | ||
|
|
4a8d37bde1 | ||
|
|
3289dd8419 | ||
|
|
13473eeb4d | ||
|
|
4264cd8830 | ||
|
|
edcc215774 | ||
|
|
3085fffb49 | ||
|
|
81a6e4b46c | ||
|
|
e0d612c92f | ||
|
|
fadbb91287 | ||
|
|
72146c08ae | ||
|
|
0c7cb274b4 | ||
|
|
a08c499c95 | ||
|
|
a879bbce59 | ||
|
|
f11f8b3e0e | ||
|
|
7842545627 | ||
|
|
2a0f8f5ce3 | ||
|
|
4ae3ad7abd | ||
|
|
a16025ca95 | ||
|
|
fdefe09187 | ||
|
|
06370a763c | ||
|
|
691e2580e5 | ||
|
|
f40369d061 | ||
|
|
046c523880 | ||
|
|
b3b7ae26cf | ||
|
|
49424b8b56 | ||
|
|
68ff4a52dc | ||
|
|
07c932e9e6 | ||
|
|
cbe3abeab0 | ||
|
|
3d5e3ce6cf | ||
|
|
4efdabc1ff | ||
|
|
8ca495ec50 | ||
|
|
69aba02c9a | ||
|
|
42225dd35e | ||
|
|
ad4c9fcc83 | ||
|
|
ef4d0c3c42 | ||
|
|
59cc45eaab | ||
|
|
f64c40e91f | ||
|
|
46d7d30089 | ||
|
|
48f15bb71c | ||
|
|
ac70b1d11b | ||
|
|
d720082644 | ||
|
|
1f45b642e9 | ||
|
|
83228d8aa6 | ||
|
|
34f1e50f90 | ||
|
|
b0c518a0d6 | ||
|
|
aa673a3a5c | ||
|
|
40d58f6bc2 | ||
|
|
7604b24ffc | ||
|
|
a47c0c91a3 | ||
|
|
0232f52281 | ||
|
|
08eba71c8a | ||
|
|
577a9249d1 | ||
|
|
ea6461bd0a | ||
|
|
f58c94146a | ||
|
|
6efe13d142 | ||
|
|
0a8fdc6cc8 | ||
|
|
b91b298174 | ||
|
|
f87038622b | ||
|
|
8b077848bb | ||
|
|
2945e6f8bf | ||
|
|
0f760dc388 | ||
|
|
5a9b5db99b | ||
|
|
6ba51fb338 | ||
|
|
146aa497f9 | ||
|
|
e7bc82d152 | ||
|
|
26f8172b1a | ||
|
|
634584400a | ||
|
|
7d6be79ba8 | ||
|
|
cef208f6ef | ||
|
|
f4921d1317 | ||
|
|
7f1a74b576 | ||
|
|
3dc11777c6 | ||
|
|
b536165910 | ||
|
|
7c7aa9e7a7 | ||
|
|
2b03b57b5c | ||
|
|
77c6120014 | ||
|
|
b82ff7b88d | ||
|
|
a16a75230c | ||
|
|
0e27b302bc | ||
|
|
c369ab9b1c | ||
|
|
bb267ccae7 | ||
|
|
efe24658a4 | ||
|
|
5cdf9e7551 | ||
|
|
4390302384 | ||
|
|
dab00e7fb2 | ||
|
|
929c5e7a5b | ||
|
|
d600042110 | ||
|
|
0a58e7433e | ||
|
|
5639c985df | ||
|
|
9fbfbfb23b | ||
|
|
ecd2f0e2bf | ||
|
|
60418276bd | ||
|
|
170392f0bc | ||
|
|
6744745152 | ||
|
|
009ae6a235 | ||
|
|
bf5f72c00b | ||
|
|
84aca5b9e1 | ||
|
|
6164266870 | ||
|
|
cc9df9c586 | ||
|
|
29a268d476 | ||
|
|
18d7aab703 | ||
|
|
373e6b6c8e | ||
|
|
71fab4f6be | ||
|
|
de55c14a16 | ||
|
|
e8517e954d | ||
|
|
78281fc82c | ||
|
|
bc260fffde | ||
|
|
db00a08bdc | ||
|
|
85cf7f26ce | ||
|
|
acca147ff2 | ||
|
|
d53da0e422 | ||
|
|
11eaaab72d | ||
|
|
475e64fc5b | ||
|
|
1bd8154ac4 | ||
|
|
d2fa0e7852 | ||
|
|
f2b324abc2 | ||
|
|
d2225dd841 | ||
|
|
8d26aa86b9 | ||
|
|
7e937d7d29 | ||
|
|
fe4b534b78 | ||
|
|
d0a65c7c68 | ||
|
|
416f87f4bb | ||
|
|
7eeb67be28 | ||
|
|
7ed6ee5075 | ||
|
|
d3c8215e15 | ||
|
|
30bc6c274e | ||
|
|
ecb1068f0b | ||
|
|
f6eef21b45 | ||
|
|
1aeff25316 | ||
|
|
6de569537f | ||
|
|
764bc3fead | ||
|
|
a89d617532 | ||
|
|
fef33795d0 | ||
|
|
d2c04b761d | ||
|
|
c5828aba91 | ||
|
|
1286f9dcb6 | ||
|
|
391e525fc5 | ||
|
|
afc32b1cfa | ||
|
|
0797181967 | ||
|
|
14c5e631ff | ||
|
|
5cdb039c33 | ||
|
|
a11c4fcb58 | ||
|
|
c67a937d40 | ||
|
|
03fa7137b9 | ||
|
|
e95400988e | ||
|
|
942c9c6a63 | ||
|
|
6c45665fde | ||
|
|
d92ac8f588 | ||
|
|
169665da32 | ||
|
|
c4d80b4844 | ||
|
|
7827749453 | ||
|
|
5e78697a69 | ||
|
|
a0e6a78496 | ||
|
|
af99a93536 | ||
|
|
e9ea117985 | ||
|
|
b9ddb0140f | ||
|
|
dae70371d1 | ||
|
|
228cbb4082 | ||
|
|
679c913f3a | ||
|
|
03fb7947c3 | ||
|
|
c39f5a27b2 | ||
|
|
dbdb516f3c | ||
|
|
c1a97b7356 | ||
|
|
a6d8f7ea24 | ||
|
|
574c7600e0 | ||
|
|
d1c0205d77 | ||
|
|
13c29d2c1e | ||
|
|
dc1a0f050e | ||
|
|
e252a00d55 | ||
|
|
5bedbb7c7d | ||
|
|
e510418152 | ||
|
|
8197ae6aa7 | ||
|
|
9d619d520d | ||
|
|
46605479e9 | ||
|
|
6d20eddd43 | ||
|
|
c1ee2a0adb | ||
|
|
9d29d49ada | ||
|
|
e7b95892ff | ||
|
|
4bf5c77374 | ||
|
|
df4a75f4b0 | ||
|
|
4bdb4cbbb5 | ||
|
|
4cdcdee8e4 | ||
|
|
e6c36411cb | ||
|
|
a4788a95af | ||
|
|
b5de638c0b | ||
|
|
c1a210313e | ||
|
|
ab0ed67f81 | ||
|
|
5d54d5b7d6 | ||
|
|
1d09ffa529 | ||
|
|
eef9d15aaa | ||
|
|
8034ddc413 | ||
|
|
e75adb165a | ||
|
|
09ce0d5285 | ||
|
|
cc1ad41e94 | ||
|
|
8a38646bc5 | ||
|
|
a2b65f52f6 | ||
|
|
c16d8da784 | ||
|
|
a55582a018 | ||
|
|
ea6d472002 | ||
|
|
3dc4290f2a | ||
|
|
6c43f75f9f | ||
|
|
e0c6972bed | ||
|
|
1ab3e04cba | ||
|
|
1b8f664c8a | ||
|
|
25adfe5b28 | ||
|
|
7637b2bec2 | ||
|
|
6b3d984ca6 | ||
|
|
da5bfe32af | ||
|
|
cfab49a7dd | ||
|
|
f93d22ae22 | ||
|
|
91b9e50fd0 | ||
|
|
1b457b0be6 | ||
|
|
d77894c8fe | ||
|
|
366f7621fa | ||
|
|
984bc37e29 | ||
|
|
604de144b9 | ||
|
|
5dddaeb6e5 | ||
|
|
7790686a84 | ||
|
|
60950f056b | ||
|
|
ef07634e09 | ||
|
|
f70a20f740 | ||
|
|
c1cda2d536 | ||
|
|
2b03e7aea8 | ||
|
|
58cea3e947 | ||
|
|
f02fb7ba15 | ||
|
|
fbafcd0cbc | ||
|
|
bf09c88e6e | ||
|
|
cb8f7e0ddb | ||
|
|
f63aa33082 | ||
|
|
7bdf6717e1 | ||
|
|
2fc2801ad4 | ||
|
|
2bb6061a44 | ||
|
|
a0e3488af0 | ||
|
|
8fef1f975a | ||
|
|
17fad47ca1 | ||
|
|
b0aa168c9a | ||
|
|
367888968b | ||
|
|
11c65e6b90 | ||
|
|
e9699ed8cc | ||
|
|
812362338e | ||
|
|
b7ff0cf2a2 | ||
|
|
fa21ae6161 | ||
|
|
fb815c0be0 | ||
|
|
27c6a187a2 | ||
|
|
852d3b9f48 | ||
|
|
10884b8175 | ||
|
|
5f37414fee | ||
|
|
e95644ada2 | ||
|
|
ab4aee93c1 | ||
|
|
5df94a03fe | ||
|
|
ab9f3a1635 | ||
|
|
110c43b97a | ||
|
|
e0a86a8016 | ||
|
|
9e7f3b83c4 | ||
|
|
011960b159 | ||
|
|
d23a3cedef | ||
|
|
b782b539a5 | ||
|
|
2930e49d61 | ||
|
|
45777e6047 | ||
|
|
204b27ca5d | ||
|
|
dde8f427af | ||
|
|
1db0966675 | ||
|
|
b4c16002ff | ||
|
|
ca23c76426 | ||
|
|
0c50815944 | ||
|
|
185f3c05fb | ||
|
|
bde88ecc79 | ||
|
|
38e5b1f853 | ||
|
|
83fffe717e | ||
|
|
8757faf965 | ||
|
|
9b61fb1f85 | ||
|
|
16a6465453 | ||
|
|
1d3f05c22b | ||
|
|
470bdb6efb | ||
|
|
fa53530055 | ||
|
|
02d0b4c99b | ||
|
|
ca9ac35eb5 | ||
|
|
cb68f83451 | ||
|
|
972675d4da | ||
|
|
347b1dd31c | ||
|
|
d34e729e32 | ||
|
|
4954dcead8 | ||
|
|
a2f3677784 | ||
|
|
fb22b8bba5 | ||
|
|
c0ca3569fd | ||
|
|
bae5042eea | ||
|
|
a5f831e81e | ||
|
|
6cb6c60eba | ||
|
|
d4098180b6 | ||
|
|
9bec4b2713 | ||
|
|
82b899f883 | ||
|
|
69daec4f86 | ||
|
|
e5d348140c | ||
|
|
8ba136e0a3 | ||
|
|
63f48a3c4c | ||
|
|
e9d10bc012 | ||
|
|
96be2e6262 | ||
|
|
91fa230016 | ||
|
|
d4b33a1342 | ||
|
|
8d08bc7fd1 | ||
|
|
7c08249e08 | ||
|
|
4f5fff96e0 | ||
|
|
cf6379283b | ||
|
|
9659638f0c | ||
|
|
433fef9992 | ||
|
|
d60039454a | ||
|
|
d90b31c5df | ||
|
|
965dac5ff9 | ||
|
|
564f77bcdc | ||
|
|
6136ac4116 | ||
|
|
bba84b4d11 | ||
|
|
b52317f56b | ||
|
|
98f2806be6 | ||
|
|
ebf7a1d40d | ||
|
|
0ce164079e | ||
|
|
3693d2e93d | ||
|
|
d3a38963ae | ||
|
|
9ab9ae0408 | ||
|
|
0abb4a82b1 | ||
|
|
94a579e7d3 | ||
|
|
9d132d7f92 | ||
|
|
0315abc0df | ||
|
|
24e04f1303 | ||
|
|
51c2f845d8 | ||
|
|
edc81534c4 | ||
|
|
b10ba999cd | ||
|
|
12d10ce8b5 | ||
|
|
c4554cb4e9 | ||
|
|
0e575a9366 | ||
|
|
13efbf5f98 | ||
|
|
c8be20e9f2 | ||
|
|
15aabb3859 | ||
|
|
b2a9867297 | ||
|
|
e734b000de | ||
|
|
127e5af6f3 | ||
|
|
319f46406c | ||
|
|
ddf79d06d0 | ||
|
|
fafad9217d | ||
|
|
08022497e6 | ||
|
|
29f849c184 | ||
|
|
1572d9df89 | ||
|
|
4c297164a5 | ||
|
|
a7c8eda290 | ||
|
|
1bcd2d4531 | ||
|
|
eb1e596cde | ||
|
|
9bbcf0c5d7 | ||
|
|
341ec6e9a0 | ||
|
|
7e9234e712 | ||
|
|
fec33c0b96 | ||
|
|
af2917adb9 | ||
|
|
2e1459e29c | ||
|
|
95f6035aa8 | ||
|
|
d6e7cfb044 | ||
|
|
8dc04667b0 | ||
|
|
c108115c83 | ||
|
|
bcae7720e1 | ||
|
|
399d0b94d5 | ||
|
|
a5712e1216 | ||
|
|
3805db1263 | ||
|
|
88b8a5323a | ||
|
|
02510528d1 | ||
|
|
7deffeffd8 | ||
|
|
4d4520226d | ||
|
|
9f80e0a0e6 | ||
|
|
2ed3fd3cba | ||
|
|
3698f1dab8 | ||
|
|
fb4c02ca9b | ||
|
|
9cec4b0c8e | ||
|
|
6cef26f893 | ||
|
|
e2b5b7016c | ||
|
|
2d55e2edd5 | ||
|
|
85dbf4f98f | ||
|
|
d13a6b0c36 | ||
|
|
48f03f306a | ||
|
|
f1c11ac114 | ||
|
|
97ec9602f7 | ||
|
|
53cdf884ef | ||
|
|
d8a729c961 | ||
|
|
25f24801d6 | ||
|
|
e6b302abf9 | ||
|
|
c0c08fe373 | ||
|
|
60e29cc894 | ||
|
|
dcfd802757 | ||
|
|
84a01569d6 | ||
|
|
72ed38156a | ||
|
|
0e9e02de0b | ||
|
|
58163cefa0 | ||
|
|
c4ec54f6e4 | ||
|
|
de7dae4455 | ||
|
|
6362500741 | ||
|
|
9b3d1f5734 | ||
|
|
123aad2707 | ||
|
|
0bed7ee669 | ||
|
|
7d8d314962 | ||
|
|
f01a6e82dc | ||
|
|
67d7ee2751 | ||
|
|
04f8a7247d | ||
|
|
7b6ef76d54 | ||
|
|
ed65ad842f | ||
|
|
a33fe330f7 | ||
|
|
b30da3eea4 | ||
|
|
05fbbfcf39 | ||
|
|
09aec06790 | ||
|
|
00a52475de | ||
|
|
6c03211ac4 | ||
|
|
ca18958669 | ||
|
|
e1f58f07fe | ||
|
|
9d28736849 | ||
|
|
739096a9c0 | ||
|
|
2775d9b78a | ||
|
|
4f01b0b2ad | ||
|
|
2427671093 | ||
|
|
8c9d1b7dec | ||
|
|
55c8399084 | ||
|
|
a1067492b7 | ||
|
|
961beb3e85 | ||
|
|
23e86f1067 | ||
|
|
a1333dcace | ||
|
|
82690b5f2f | ||
|
|
70b97aa856 | ||
|
|
05210e2a8b | ||
|
|
751c278052 | ||
|
|
9a1620d51f | ||
|
|
157cd9a035 | ||
|
|
010736839a | ||
|
|
2c26efb5a9 | ||
|
|
fe9e2aa287 | ||
|
|
2585014ace | ||
|
|
0410003ceb | ||
|
|
e1a0c2fc48 | ||
|
|
b0a8c0a35a | ||
|
|
0fca91ca37 | ||
|
|
65ba2d2e27 | ||
|
|
188ca8fc58 | ||
|
|
3b80b74730 | ||
|
|
d9f5f960a5 | ||
|
|
e31da8bbd0 | ||
|
|
1e602975f3 | ||
|
|
541ccda754 | ||
|
|
1b68363b80 | ||
|
|
fc11b3c463 | ||
|
|
f9f36cd1d6 | ||
|
|
566c05bcef | ||
|
|
effb21bc6c | ||
|
|
4c92ee4a8a | ||
|
|
8f5b5ab0f9 | ||
|
|
5dacbfc17e | ||
|
|
5defc18a64 | ||
|
|
d2ba299f42 | ||
|
|
e78e5d6f32 | ||
|
|
ebbdcbe5a5 | ||
|
|
1d0ca5f11e | ||
|
|
d22935703d | ||
|
|
d66a567b8f | ||
|
|
34695f2aa3 | ||
|
|
dcacd88f11 | ||
|
|
2bbf794501 | ||
|
|
e3937c5ef2 | ||
|
|
a93775bb64 | ||
|
|
eddcac2343 | ||
|
|
95c125a5af | ||
|
|
927380741c | ||
|
|
861dfc43a8 | ||
|
|
a1cbf8724f | ||
|
|
cae88e7946 | ||
|
|
952ad0e162 | ||
|
|
b751156b5c | ||
|
|
aad27f40cf | ||
|
|
55d7c6e672 | ||
|
|
75590eb765 | ||
|
|
dfdb952e2b | ||
|
|
c09ebc146b | ||
|
|
139ef08af3 | ||
|
|
2d13a5fd35 | ||
|
|
a3fb32dfc6 | ||
|
|
079efe5de6 | ||
|
|
4d28ccebad | ||
|
|
2171acc909 | ||
|
|
1e05811c13 | ||
|
|
ec023ec13e | ||
|
|
996570cc57 | ||
|
|
7cf712daff | ||
|
|
9a35af9fb2 | ||
|
|
ede3b07963 | ||
|
|
53a4b90d96 | ||
|
|
bf948789ea | ||
|
|
db116f39fd | ||
|
|
c962a19eb7 | ||
|
|
571c83314a | ||
|
|
d906d49930 | ||
|
|
344bafff45 | ||
|
|
4858390346 | ||
|
|
f16f0e3069 | ||
|
|
3ee12221a4 | ||
|
|
8915848a52 | ||
|
|
a2cd7c8007 | ||
|
|
6e9b9341d4 | ||
|
|
e90d8a87ee | ||
|
|
45c43888e7 | ||
|
|
68e7dfb1cc | ||
|
|
f086f33097 | ||
|
|
737ce2c2e7 | ||
|
|
3c7c7cde3c | ||
|
|
3913d9e48e | ||
|
|
84d4645efa | ||
|
|
8a7442648c | ||
|
|
f1616461f7 | ||
|
|
ed2a5af5ed | ||
|
|
3b73a4c69a | ||
|
|
17954dfdc9 | ||
|
|
3aadf61fde | ||
|
|
5e65e394a6 | ||
|
|
8c357ec213 | ||
|
|
a599a334a3 | ||
|
|
36d39669e4 | ||
|
|
028171a91a | ||
|
|
2647e1cdac | ||
|
|
994cebea82 | ||
|
|
a533a3e0ef | ||
|
|
caa915b31d | ||
|
|
2996d8537d | ||
|
|
65be1263b9 | ||
|
|
d81ae835aa | ||
|
|
c405cedc41 | ||
|
|
2a7f366cbf | ||
|
|
ea580e4c64 | ||
|
|
445100f32d | ||
|
|
648a852ba7 | ||
|
|
9f136fb150 | ||
|
|
6d5b38fc8a | ||
|
|
2e7fd5fe93 | ||
|
|
626895166a | ||
|
|
1ca8d2b2db | ||
|
|
aa57f25b2c | ||
|
|
a321676b99 | ||
|
|
5b49b105f6 | ||
|
|
d610b19f4e | ||
|
|
b9241288c4 | ||
|
|
a7470dc284 | ||
|
|
154624a767 | ||
|
|
6f1a5eb79c | ||
|
|
a8334a22f8 | ||
|
|
8cdea2bfeb | ||
|
|
c413eda330 | ||
|
|
22bfb6be4b | ||
|
|
6bfbf37749 | ||
|
|
7797e47561 | ||
|
|
52579c5fab | ||
|
|
a5ed6d897c | ||
|
|
439605bafc | ||
|
|
9f6fd3ee6a | ||
|
|
1539c0b2f2 | ||
|
|
109e8b53a1 | ||
|
|
216697d4b5 | ||
|
|
77bb88ed59 | ||
|
|
7e52477908 | ||
|
|
45816fa84f | ||
|
|
18babef78b | ||
|
|
df8970f59b | ||
|
|
3103c33dda | ||
|
|
a9fa7ee26a | ||
|
|
e605560e5c | ||
|
|
af330d7f8a | ||
|
|
563d466374 | ||
|
|
fd59cc6226 | ||
|
|
6a8a0f2249 | ||
|
|
8c43b0953b | ||
|
|
a885d7f003 | ||
|
|
63af591938 | ||
|
|
bf6efc3530 | ||
|
|
609ec24c6a | ||
|
|
c99cbec3df | ||
|
|
6eb44cb9d8 | ||
|
|
f67f2a31ee | ||
|
|
3d5b8287ce | ||
|
|
548a27fe48 | ||
|
|
7970a0b3b4 | ||
|
|
2c67845dd6 | ||
|
|
e02ca2f7e3 | ||
|
|
84a2197027 | ||
|
|
41dd808c9a | ||
|
|
6a7a76dce3 | ||
|
|
b7a8f6c2a1 | ||
|
|
f574017b66 | ||
|
|
b35d5ded77 | ||
|
|
a3f712306e | ||
|
|
e455b3ff00 | ||
|
|
17dd73834f | ||
|
|
189020298e | ||
|
|
375b400b1e | ||
|
|
192ac0e013 | ||
|
|
b80c8013c0 | ||
|
|
0606428cd9 | ||
|
|
8cd7b85711 | ||
|
|
e91f2b89df | ||
|
|
93706c94af | ||
|
|
6de61cb214 | ||
|
|
a21e7adeb5 | ||
|
|
11aecf43ba | ||
|
|
ee3490a520 | ||
|
|
178c1afdea | ||
|
|
3a2cd0276a | ||
|
|
a81e5aa6e4 | ||
|
|
927cde3777 | ||
|
|
bed2bfb6db | ||
|
|
72f87b449b | ||
|
|
02b95b16f9 | ||
|
|
3e16519793 | ||
|
|
a4b6cb3232 | ||
|
|
8883701297 | ||
|
|
225c0a9b03 | ||
|
|
43a9bba96f | ||
|
|
2c670b3b21 | ||
|
|
02aad295f9 | ||
|
|
163da78bc6 | ||
|
|
a549f86624 | ||
|
|
27262436d1 | ||
|
|
fa2b691dc1 | ||
|
|
03a010406f | ||
|
|
1e5245efd0 | ||
|
|
abd8369dd9 | ||
|
|
d0dbffebe1 | ||
|
|
c202cee81f | ||
|
|
95153a6609 | ||
|
|
e157bc195b | ||
|
|
ac09da9efc | ||
|
|
dc1ad8fb2d | ||
|
|
ba5d178ba0 | ||
|
|
9ceebacfb1 | ||
|
|
2a872eb995 | ||
|
|
9077b56df1 | ||
|
|
3380cab2c3 | ||
|
|
1355fa0636 | ||
|
|
70fb869852 | ||
|
|
73da15586b | ||
|
|
b3024a6f7c | ||
|
|
4c42f5a2f5 | ||
|
|
14cf30cd98 | ||
|
|
e94dbe4965 | ||
|
|
a7f9faf868 | ||
|
|
6cbdc958cd | ||
|
|
fb396d9cf0 | ||
|
|
fca092d392 | ||
|
|
0ed393b1a5 | ||
|
|
b992faa468 | ||
|
|
3f911ab437 | ||
|
|
84586b675a | ||
|
|
f952f715c8 | ||
|
|
79d097c903 | ||
|
|
cdc2428aca | ||
|
|
82c8ace8df | ||
|
|
8525dcb376 | ||
|
|
1607853393 | ||
|
|
27d402104e | ||
|
|
d58bcd136a | ||
|
|
1944b24fba | ||
|
|
8e10533681 | ||
|
|
5a9f3f1f5e | ||
|
|
64f2fb9e73 | ||
|
|
cbed698a1c | ||
|
|
cd7efee49c | ||
|
|
f7ab90724e | ||
|
|
aa7b891150 | ||
|
|
911100923f | ||
|
|
3c64d84980 | ||
|
|
e4f87b53b4 | ||
|
|
ff779fcc7c | ||
|
|
e7c7784fec | ||
|
|
184f0900fb | ||
|
|
9ca83b7349 | ||
|
|
8b3df83e7e | ||
|
|
da24249850 | ||
|
|
04e509fc49 | ||
|
|
99a8eaea91 | ||
|
|
4c3474a9f7 | ||
|
|
14ccbf335d | ||
|
|
14841a44ad | ||
|
|
d2b411ecbb | ||
|
|
544e60eb6d | ||
|
|
db80d8f56f | ||
|
|
ae09d73257 | ||
|
|
ca0f095d6b | ||
|
|
1a0f626a80 | ||
|
|
c23426425e | ||
|
|
de52439276 | ||
|
|
757b296fd0 | ||
|
|
83e842d121 | ||
|
|
7f00a3075f | ||
|
|
1c362e4871 | ||
|
|
0dc5c9dbac | ||
|
|
28d9304ec6 | ||
|
|
d132e53c06 | ||
|
|
e28a8db3b4 | ||
|
|
b6380a17ce | ||
|
|
f4ceef485b | ||
|
|
f3507569b5 | ||
|
|
da5e60a009 | ||
|
|
896a69086b | ||
|
|
b375877a6d | ||
|
|
0ed5f8081a | ||
|
|
7416fa3a4c | ||
|
|
b90bb10a3f | ||
|
|
69643c37c1 | ||
|
|
bf208485f8 | ||
|
|
d12d571c2b | ||
|
|
a456936853 | ||
|
|
655f7ff7d0 | ||
|
|
5d8e972ac7 | ||
|
|
31a6797fc3 | ||
|
|
b9b0e9cf43 | ||
|
|
7f4eb5624b | ||
|
|
766a05236a | ||
|
|
92a6c7b89e | ||
|
|
a583a31220 | ||
|
|
87f14be30c | ||
|
|
7e13cc84c8 | ||
|
|
a2440a2e80 | ||
|
|
17b96dd7c1 | ||
|
|
b2c2c1247b | ||
|
|
e4b6b18712 | ||
|
|
4601633605 | ||
|
|
839123408b | ||
|
|
2a3cf5f002 | ||
|
|
4d172ec4f5 | ||
|
|
6f411e96ed | ||
|
|
7f7664eb4f | ||
|
|
3d994cc2cf | ||
|
|
6bc69d5a75 | ||
|
|
0db2c271a0 | ||
|
|
02b09c58a1 | ||
|
|
b0a8ad1ac1 | ||
|
|
3e6302e44a | ||
|
|
1f493c427a | ||
|
|
89eb39ca3e | ||
|
|
b495761283 | ||
|
|
29e92015d5 | ||
|
|
c71f2f7fae | ||
|
|
548c92dc0d | ||
|
|
59a5f675f6 | ||
|
|
d80a669515 | ||
|
|
bc0c5d4fcb | ||
|
|
1a69fdf1e0 | ||
|
|
df6643f1c5 | ||
|
|
03fc008dfc | ||
|
|
fa330c766f | ||
|
|
cb80742eaa | ||
|
|
0ae46455af | ||
|
|
d6133c325a | ||
|
|
edfb89a8d9 | ||
|
|
aafbee2a28 | ||
|
|
5c9dc62015 | ||
|
|
5fef41e132 | ||
|
|
a677d4da5f | ||
|
|
136e0cde06 | ||
|
|
06af2b6aa3 | ||
|
|
29e2a00109 | ||
|
|
d5b5929e9b | ||
|
|
fea89ad451 | ||
|
|
3d6f1e42d2 | ||
|
|
1ad80e1870 | ||
|
|
ea0b8df5d4 | ||
|
|
0e39aac5cd | ||
|
|
7e88621aa1 | ||
|
|
9b76407193 | ||
|
|
b6bd2687d2 | ||
|
|
82c0f8a863 | ||
|
|
9782802bd8 | ||
|
|
87659b56a4 | ||
|
|
cd62d7f0d9 | ||
|
|
1290bc8cc9 | ||
|
|
fe285ecd6b | ||
|
|
da7d187612 | ||
|
|
9b2fde6ea2 | ||
|
|
da1a563a3c | ||
|
|
9bee5c79c8 | ||
|
|
aab6ad96eb | ||
|
|
c8d803b559 | ||
|
|
ab5faec68c | ||
|
|
dcba4fef48 | ||
|
|
a654073c71 | ||
|
|
eb417c7e22 | ||
|
|
0fce4c6177 | ||
|
|
e964ff0b70 | ||
|
|
a5765fc25a | ||
|
|
18600bcd11 | ||
|
|
7a3bb59d3e | ||
|
|
29e1535c64 | ||
|
|
7b41ce1f24 | ||
|
|
1e6a170c3c | ||
|
|
887028a1b4 | ||
|
|
816ceab057 | ||
|
|
324152e363 | ||
|
|
1b11cd571e | ||
|
|
627419aa5f | ||
|
|
aa99e710d1 | ||
|
|
f3a9857747 | ||
|
|
fdf1c0448b | ||
|
|
a09b39dd69 | ||
|
|
e4989d8b9f | ||
|
|
b135de80c0 | ||
|
|
79a39b39d9 | ||
|
|
0c02afa54e | ||
|
|
1e9ef321f0 | ||
|
|
7301bc30b1 | ||
|
|
ccecd8f4f0 | ||
|
|
93e669d7d3 | ||
|
|
a0f28c07f2 | ||
|
|
bd14e5019f | ||
|
|
6d0f454e6a | ||
|
|
a031311ab5 | ||
|
|
492915567b | ||
|
|
8b1a7def38 | ||
|
|
2f62339f0c | ||
|
|
288f25c827 | ||
|
|
1392a8ecf1 | ||
|
|
1eee8f439b | ||
|
|
0db7aca1cd | ||
|
|
89d69a8fb6 | ||
|
|
7574d06718 | ||
|
|
4336a1a13e | ||
|
|
9409d6e05e | ||
|
|
0971445289 | ||
|
|
32fe763c0c | ||
|
|
6790d2be44 | ||
|
|
f579c6b56d | ||
|
|
81aaa95170 | ||
|
|
e0c91f7fda | ||
|
|
bd0596dd86 | ||
|
|
cc5125d51d | ||
|
|
e90be1bb88 | ||
|
|
b32567681f | ||
|
|
9f5897e06c | ||
|
|
e8ffcb0630 | ||
|
|
88aaa38676 | ||
|
|
6692867db5 | ||
|
|
42c898d5aa | ||
|
|
2936f886a9 | ||
|
|
f582967711 | ||
|
|
68985e9eda | ||
|
|
7c3e429f22 | ||
|
|
cb79b1aea5 | ||
|
|
b687eb09b4 | ||
|
|
83874ad466 | ||
|
|
c0172b0a49 | ||
|
|
f59208b9cf | ||
|
|
6d9ee74360 | ||
|
|
5ae6e98572 | ||
|
|
3f639e2ffe | ||
|
|
43a690c8cf | ||
|
|
2725a1cd8d | ||
|
|
ac3159193f | ||
|
|
f2c0a3994a | ||
|
|
d7dbe986f1 | ||
|
|
f93090596a | ||
|
|
8b7e62e819 | ||
|
|
28ef79f371 | ||
|
|
e39312828c | ||
|
|
3bbf9d2e0f | ||
|
|
be4ba6cc69 | ||
|
|
51126ca941 | ||
|
|
faae2d7a1e | ||
|
|
ca92bc899b | ||
|
|
ace5fd61bd | ||
|
|
31fabb4624 | ||
|
|
b4935fef76 | ||
|
|
d1fba4c125 | ||
|
|
de8ac68466 | ||
|
|
0392eab129 | ||
|
|
479ce592fa | ||
|
|
9eaa180c10 | ||
|
|
4b38f0bc6b | ||
|
|
40ed7258d4 | ||
|
|
b0c05fd80d | ||
|
|
1537330b61 | ||
|
|
abd91260ab | ||
|
|
5dcb321a6f | ||
|
|
38cc72a3f9 | ||
|
|
6f03c470ae | ||
|
|
4cb02bd3a5 | ||
|
|
9f55418bfb | ||
|
|
8faf1140fb | ||
|
|
6e14375b86 | ||
|
|
7138d7ac59 | ||
|
|
a02b810412 | ||
|
|
bd5480b264 | ||
|
|
7c04bcae26 | ||
|
|
efa61dcb39 | ||
|
|
6c137d9098 | ||
|
|
3ca92c7a03 | ||
|
|
bb2d5e570a | ||
|
|
1ce2a86f37 | ||
|
|
c6ee7c5082 | ||
|
|
a52d674a14 | ||
|
|
69b1ee2ec7 | ||
|
|
95a771c2fb | ||
|
|
cf59f57ab8 | ||
|
|
8cd38693dd | ||
|
|
ef67aa9e48 | ||
|
|
4623b5d5db | ||
|
|
65456d331b | ||
|
|
20f51092ad | ||
|
|
0b0173f155 | ||
|
|
4e4bab2bf0 | ||
|
|
679c907b78 | ||
|
|
cd6bb1b98f | ||
|
|
667ceb2115 | ||
|
|
03f491ab5a | ||
|
|
fb7c4114c1 | ||
|
|
669ea69357 | ||
|
|
5b32e0db6f | ||
|
|
20aa2bdc6e | ||
|
|
c7b7847a82 | ||
|
|
d99f3e1522 | ||
|
|
903b53033d | ||
|
|
f2fa08ea82 | ||
|
|
c049cde8cf | ||
|
|
d58dc29550 | ||
|
|
e75e36e999 | ||
|
|
7903dc7c2e | ||
|
|
a8e13d86e2 | ||
|
|
8e173d8273 | ||
|
|
7b67dc03f7 | ||
|
|
c4fca3b23d | ||
|
|
c42e70686d | ||
|
|
df861b59c1 | ||
|
|
447ccdf042 | ||
|
|
db37d0197a | ||
|
|
e6f21d166a | ||
|
|
2e0923a26a | ||
|
|
bd1af2223d | ||
|
|
ec395acae0 | ||
|
|
5ff69b86db | ||
|
|
ce6cd8070f | ||
|
|
ddf985b445 | ||
|
|
6a37072b9a | ||
|
|
d2ea06ef4a | ||
|
|
943f58f2c0 | ||
|
|
0891e2d432 | ||
|
|
740dd0e0a6 | ||
|
|
2fcd21ae94 | ||
|
|
c312f079fb | ||
|
|
a480dfe59e | ||
|
|
453eddc089 | ||
|
|
51cb558317 | ||
|
|
f0c5b1e544 | ||
|
|
348ce56776 | ||
|
|
d8ab13e249 | ||
|
|
376f61e213 | ||
|
|
b30cb5254e | ||
|
|
3737e889ea | ||
|
|
ec144da8ce | ||
|
|
e61b37b6bf | ||
|
|
47a3c3c253 | ||
|
|
23c5f4040e | ||
|
|
39ceb20332 | ||
|
|
e80c5c89e0 | ||
|
|
8cfc5925da | ||
|
|
da73347231 | ||
|
|
e26c3d9462 | ||
|
|
f4c3c86dd1 | ||
|
|
5c509ee85a | ||
|
|
12ebf232d5 | ||
|
|
05ee76b0a9 | ||
|
|
12df670681 | ||
|
|
6d589a1204 | ||
|
|
1e50556f64 | ||
|
|
7ee703f077 | ||
|
|
141936e609 | ||
|
|
188a90f97d | ||
|
|
ec95f0a7af | ||
|
|
848510d4ca | ||
|
|
16e276d08e | ||
|
|
62d0a7e6ff | ||
|
|
eeee9a54d7 | ||
|
|
3ec1d1a965 | ||
|
|
2b60430c55 | ||
|
|
dbd3ed49ed | ||
|
|
eb640157f2 | ||
|
|
166ec71a28 | ||
|
|
8e4f3b4f06 | ||
|
|
f43e1a1018 | ||
|
|
508ccf4f9c | ||
|
|
6f92fa0069 | ||
|
|
2293253d52 | ||
|
|
1cb7b6a67e | ||
|
|
817a5e4b64 | ||
|
|
8286c10406 | ||
|
|
12c2d18325 | ||
|
|
28cfc2a9c1 | ||
|
|
1e3cad4b20 | ||
|
|
b6944c4308 | ||
|
|
38542f9888 | ||
|
|
4223b2d0f0 | ||
|
|
c0db257e9b | ||
|
|
6b1f4e1686 | ||
|
|
6e8080b87d | ||
|
|
292a8620e0 | ||
|
|
f0f1c54244 | ||
|
|
30024c9814 | ||
|
|
3446442eca | ||
|
|
e439ef4ddd | ||
|
|
774e348f95 | ||
|
|
3d4e0a0479 | ||
|
|
30b9ca7f37 | ||
|
|
04e064e86e | ||
|
|
6a88d64a90 | ||
|
|
e64bc40ca9 | ||
|
|
33ae9dae0a | ||
|
|
ba249d294e | ||
|
|
d40e1e47fd | ||
|
|
1be993801f | ||
|
|
b76aa03d3a | ||
|
|
743715fa73 | ||
|
|
5f09d6a26f | ||
|
|
27fd4f444b | ||
|
|
2d56dacd0e | ||
|
|
333453df79 | ||
|
|
cfddc75ccb | ||
|
|
3a01ee9973 | ||
|
|
1efe753a04 | ||
|
|
a8e80a44e6 | ||
|
|
cf94122406 | ||
|
|
a5518eb492 | ||
|
|
6bdfc570a8 | ||
|
|
26640b3b07 | ||
|
|
777805fc1a | ||
|
|
57e08e282c | ||
|
|
fb5ea3be84 | ||
|
|
05c15a104f | ||
|
|
5f18723e2c | ||
|
|
7db98e55c5 | ||
|
|
75e1e2e678 | ||
|
|
2876e77a08 | ||
|
|
3ba881f641 | ||
|
|
264451d923 | ||
|
|
e63b3ab0e3 | ||
|
|
8987005e60 | ||
|
|
d6614decd1 | ||
|
|
42726cf2b6 | ||
|
|
ff1ac3387b | ||
|
|
f933abe48e | ||
|
|
be94674507 | ||
|
|
c8b1e5bafc | ||
|
|
7403619cbc | ||
|
|
7a6df3abd3 | ||
|
|
b84dbbc3b8 | ||
|
|
7adde6a0a9 | ||
|
|
a328080ba4 | ||
|
|
525889e366 | ||
|
|
88d181f9fe | ||
|
|
2dc773ebe6 | ||
|
|
043ce653a9 | ||
|
|
8b4da90497 | ||
|
|
59fffc6fbe | ||
|
|
8b81d60dce | ||
|
|
0ed9aa5372 | ||
|
|
2ace964573 | ||
|
|
a8201aaa58 | ||
|
|
776fa2f4f6 | ||
|
|
eabef540cf | ||
|
|
d6ec8f4930 | ||
|
|
aaf834a33b | ||
|
|
043f9bde59 | ||
|
|
170310e23c | ||
|
|
31a558cfea | ||
|
|
adc4fec19b | ||
|
|
74beec2b85 | ||
|
|
d7cd8ba780 | ||
|
|
a69ebf4299 | ||
|
|
8085c62774 | ||
|
|
3e51e781a6 | ||
|
|
fa028fdafd | ||
|
|
d2ce4192cc | ||
|
|
822f689c48 | ||
|
|
c6ade8d9bc | ||
|
|
0e99fb27b5 | ||
|
|
058a191e61 | ||
|
|
ebd867a6d5 | ||
|
|
687933a63e | ||
|
|
1f40c87dd9 | ||
|
|
93ffbe2a79 | ||
|
|
a090e602b3 | ||
|
|
c9a48081fd | ||
|
|
5b026e13f6 | ||
|
|
f1aab5ad3b | ||
|
|
d7028f22e2 | ||
|
|
570c0cb9a1 | ||
|
|
053792e89d | ||
|
|
31212d4f4b | ||
|
|
19489afefc | ||
|
|
5dd494d9a2 | ||
|
|
2adbf9f686 | ||
|
|
9dbad9ce53 | ||
|
|
52498bf05e | ||
|
|
e4e5608c8c | ||
|
|
d629874468 | ||
|
|
7da98935b9 | ||
|
|
d50a0abd2a | ||
|
|
33b9685985 | ||
|
|
cd14f3e649 | ||
|
|
70eaa7d968 | ||
|
|
f1b51f9c97 | ||
|
|
65398fb147 | ||
|
|
a8575b4fc7 | ||
|
|
67ede12fd8 | ||
|
|
e6b5819099 | ||
|
|
5cd1af5b48 | ||
|
|
6d1c70b8d3 | ||
|
|
cda28cb2ee | ||
|
|
aac7a0f5af | ||
|
|
0501cbcf4c | ||
|
|
f08941c0bd | ||
|
|
c1ed2f14c8 | ||
|
|
3ae5c9dca1 | ||
|
|
ace6ef0029 | ||
|
|
140724d665 | ||
|
|
c476c255b8 | ||
|
|
cf069970bd | ||
|
|
a8341ec86d | ||
|
|
23b965a20a | ||
|
|
2104ba787a | ||
|
|
15660663f6 | ||
|
|
4d3e79281d | ||
|
|
21ff7a36b8 | ||
|
|
42e2957bee | ||
|
|
bd62da8e1a | ||
|
|
df592d99dd | ||
|
|
39f5e13463 | ||
|
|
58785e9470 | ||
|
|
3495d75a6f | ||
|
|
bee12423b0 | ||
|
|
a705e595ee | ||
|
|
45f29c4c6f | ||
|
|
5f90851458 | ||
|
|
01515f919d | ||
|
|
a2292b1177 | ||
|
|
b2f5f56fa0 | ||
|
|
2be1e1a70d | ||
|
|
b416cd380a | ||
|
|
f18f54afc6 | ||
|
|
b02830c891 | ||
|
|
aff733bbd9 | ||
|
|
4a66911a61 | ||
|
|
c9b3a017a4 | ||
|
|
6712d65de4 | ||
|
|
c2a45cdbeb | ||
|
|
0f20e58a46 | ||
|
|
2f37767899 | ||
|
|
f4c7272305 | ||
|
|
8a8e33763c | ||
|
|
d55eda0bb3 | ||
|
|
6c7483733f | ||
|
|
c7590c120d | ||
|
|
b3dec3653a | ||
|
|
7cb42c49de | ||
|
|
32dffb0375 | ||
|
|
c3d13c73ce | ||
|
|
0ea48af892 | ||
|
|
72b09864ce | ||
|
|
d8e5fe367b | ||
|
|
b1244c0a1b | ||
|
|
7a3b56955c | ||
|
|
5dcb7f2a80 | ||
|
|
64e71440e2 | ||
|
|
e7e3b6dd15 | ||
|
|
06551575b1 | ||
|
|
912ec51315 | ||
|
|
1363c98cd8 | ||
|
|
b9e49e37ea | ||
|
|
4bb64e301e | ||
|
|
1c9c911373 | ||
|
|
75a638f728 | ||
|
|
09fd45346e | ||
|
|
3329068bcc | ||
|
|
aae6874928 | ||
|
|
6dacf23312 | ||
|
|
bcc0cd33f1 | ||
|
|
0daa840eaa | ||
|
|
ea5e69e26d | ||
|
|
26f0234e3d | ||
|
|
95ac2c62e8 | ||
|
|
f65e4aad63 | ||
|
|
d7f82196dc | ||
|
|
e88f41323f | ||
|
|
8f483b498b | ||
|
|
85a75be30e | ||
|
|
4b13874d44 | ||
|
|
ace77e6fd0 | ||
|
|
46deb5a099 | ||
|
|
6158ea436d | ||
|
|
7accffd7cd | ||
|
|
f337b8d7cc | ||
|
|
aeaab0a8d9 | ||
|
|
d81b95d5a6 | ||
|
|
34e8961601 | ||
|
|
b729cac998 | ||
|
|
a08aeee0c2 | ||
|
|
90a466ef01 | ||
|
|
ad14e259ba | ||
|
|
8a92326241 | ||
|
|
3e45d489b8 | ||
|
|
04ad424efa | ||
|
|
7f2270844e | ||
|
|
e77a156f29 | ||
|
|
0cc641d1f8 | ||
|
|
51cef0bc53 | ||
|
|
d6168cbad9 | ||
|
|
76f2ea01bf | ||
|
|
37a8ddbae6 | ||
|
|
7c3aa7ee0b | ||
|
|
65157ede23 | ||
|
|
8913ca161f | ||
|
|
3d7fd2c192 | ||
|
|
b2cc597755 | ||
|
|
d6ba0a803d | ||
|
|
0e6432f95a | ||
|
|
0dfaa49c97 | ||
|
|
efeba3432c | ||
|
|
f16cd5b8db | ||
|
|
72b23ca235 | ||
|
|
1871b616ba | ||
|
|
f21623e1b8 | ||
|
|
a2e204667f | ||
|
|
1ec9486452 | ||
|
|
2b66aafdba | ||
|
|
3169900f80 | ||
|
|
737edb985b | ||
|
|
bc94d4e0b3 | ||
|
|
585715adbf | ||
|
|
1a12eb9703 | ||
|
|
b4195bd81c | ||
|
|
5fb4ea2aa3 | ||
|
|
9367ad901d | ||
|
|
c956add8b0 | ||
|
|
432a91cc64 | ||
|
|
629a322d1d |
65
.docker-compose_cfg/config.yaml
Normal file
65
.docker-compose_cfg/config.yaml
Normal file
@@ -0,0 +1,65 @@
|
||||
#---------------Infrastructure configuration---------------------#
|
||||
etcd:
|
||||
etcdSchema: openim #默认即可
|
||||
etcdAddr: [ 127.0.0.1:2379 ] #单机部署时,默认即可
|
||||
userName:
|
||||
password:
|
||||
secret: openIM123
|
||||
|
||||
mysql:
|
||||
dbMysqlDatabaseName: admin_chat # 数据库名字 默认即可
|
||||
|
||||
# 默认管理员账号
|
||||
admin:
|
||||
defaultAccount:
|
||||
account: [ "admin1", "admin2" ]
|
||||
defaultPassword: [ "password1", "password2" ]
|
||||
openIMUserID: [ "openIM123456", "openIMAdmin" ]
|
||||
faceURL: [ "", "" ]
|
||||
nickname: [ "admin1", "admin2" ]
|
||||
level: [ 1, 100 ]
|
||||
|
||||
|
||||
adminapi:
|
||||
openImAdminApiPort: [ 10009 ] #管理后台api服务端口,默认即可,需要开放此端口或做nginx转发
|
||||
listenIP: 0.0.0.0
|
||||
|
||||
chatapi:
|
||||
openImChatApiPort: [ 10008 ] #登录注册,默认即可,需要开放此端口或做nginx转发
|
||||
listenIP: 0.0.0.0
|
||||
|
||||
rpcport: # rpc服务端口 默认即可
|
||||
openImAdminPort: [ 30200 ]
|
||||
openImChatPort: [ 30300 ]
|
||||
|
||||
|
||||
rpcregistername: #rpc注册服务名,默认即可
|
||||
openImChatName: Chat
|
||||
openImAdminCMSName: Admin
|
||||
|
||||
chat:
|
||||
codeTTL: 300 #短信验证码有效时间(秒)
|
||||
superVerificationCode: 666666 # 超级验证码
|
||||
alismsverify: #阿里云短信配置,在阿里云申请成功后修改以下四项
|
||||
accessKeyId:
|
||||
accessKeySecret:
|
||||
signName:
|
||||
verificationCodeTemplateCode:
|
||||
|
||||
|
||||
oss:
|
||||
tempDir: enterprise-temp # 临时密钥上传的目录
|
||||
dataDir: enterprise-data # 最终存放目录
|
||||
aliyun:
|
||||
endpoint: https://oss-cn-chengdu.aliyuncs.com
|
||||
accessKeyID: ""
|
||||
accessKeySecret: ""
|
||||
bucket: ""
|
||||
tencent:
|
||||
BucketURL: ""
|
||||
serviceURL: https://cos.COS_REGION.myqcloud.com
|
||||
secretID: ""
|
||||
secretKey: ""
|
||||
sessionToken: ""
|
||||
bucket: ""
|
||||
use: "minio"
|
||||
13
.docker-compose_cfg/datasource-compose.yaml
Normal file
13
.docker-compose_cfg/datasource-compose.yaml
Normal file
@@ -0,0 +1,13 @@
|
||||
#more datasource-compose.yaml
|
||||
apiVersion: 1
|
||||
|
||||
datasources:
|
||||
- name: Prometheus
|
||||
type: prometheus
|
||||
access: proxy
|
||||
orgId: 1
|
||||
url: http://127.0.0.1:9091
|
||||
basicAuth: false
|
||||
isDefault: true
|
||||
version: 1
|
||||
editable: true
|
||||
BIN
.docker-compose_cfg/grafana.db
Normal file
BIN
.docker-compose_cfg/grafana.db
Normal file
Binary file not shown.
1285
.docker-compose_cfg/grafana.ini
Normal file
1285
.docker-compose_cfg/grafana.ini
Normal file
File diff suppressed because it is too large
Load Diff
7253
.docker-compose_cfg/node-exporter-full_rev1.json
Normal file
7253
.docker-compose_cfg/node-exporter-full_rev1.json
Normal file
File diff suppressed because it is too large
Load Diff
71
.docker-compose_cfg/prometheus-compose.yml
Normal file
71
.docker-compose_cfg/prometheus-compose.yml
Normal file
@@ -0,0 +1,71 @@
|
||||
#more prometheus-compose.yml
|
||||
global:
|
||||
scrape_interval: 15s
|
||||
evaluation_interval: 15s
|
||||
external_labels:
|
||||
monitor: 'openIM-monitor'
|
||||
|
||||
scrape_configs:
|
||||
- job_name: 'prometheus'
|
||||
static_configs:
|
||||
- targets: ['localhost:9091']
|
||||
|
||||
- job_name: 'openIM-server'
|
||||
metrics_path: /metrics
|
||||
static_configs:
|
||||
- targets: ['localhost:10002']
|
||||
labels:
|
||||
group: 'api'
|
||||
|
||||
- targets: ['localhost:20110']
|
||||
labels:
|
||||
group: 'user'
|
||||
|
||||
- targets: ['localhost:20120']
|
||||
labels:
|
||||
group: 'friend'
|
||||
|
||||
- targets: ['localhost:20130']
|
||||
labels:
|
||||
group: 'message'
|
||||
|
||||
- targets: ['localhost:20140']
|
||||
labels:
|
||||
group: 'msg-gateway'
|
||||
|
||||
- targets: ['localhost:20150']
|
||||
labels:
|
||||
group: 'group'
|
||||
|
||||
- targets: ['localhost:20160']
|
||||
labels:
|
||||
group: 'auth'
|
||||
|
||||
- targets: ['localhost:20170']
|
||||
labels:
|
||||
group: 'push'
|
||||
|
||||
- targets: ['localhost:20120']
|
||||
labels:
|
||||
group: 'friend'
|
||||
|
||||
|
||||
- targets: ['localhost:20230']
|
||||
labels:
|
||||
group: 'conversation'
|
||||
|
||||
|
||||
- targets: ['localhost:21400', 'localhost:21401', 'localhost:21402', 'localhost:21403']
|
||||
labels:
|
||||
group: 'msg-transfer'
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
- job_name: 'node'
|
||||
scrape_interval: 8s
|
||||
static_configs:
|
||||
- targets: ['localhost:9100']
|
||||
|
||||
4
.env
Normal file
4
.env
Normal file
@@ -0,0 +1,4 @@
|
||||
USER=root
|
||||
PASSWORD=openIM123
|
||||
MINIO_ENDPOINT=http://127.0.0.1:10005
|
||||
DATA_DIR=./
|
||||
37
.github/ISSUE_TEMPLATE/ISSUE_TEMPLATE.md
vendored
Normal file
37
.github/ISSUE_TEMPLATE/ISSUE_TEMPLATE.md
vendored
Normal file
@@ -0,0 +1,37 @@
|
||||
---
|
||||
name: "\U0001F41E Bug"
|
||||
about: File a bug/issue
|
||||
title: "[BUG] <title>"
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
<!--
|
||||
Note: Please search to see if an issue already exists for the bug you encountered.
|
||||
-->
|
||||
|
||||
### Environment:
|
||||
<!-- linux? windows? or Mac?
|
||||
Example:
|
||||
- OS: Ubuntu 20.04 -->
|
||||
|
||||
### Physical Memory Capacity:
|
||||
<!-- 8G or above is better -->
|
||||
|
||||
### Docker Image:
|
||||
<!-- Did you pull the docker image before execute docker images -->
|
||||
|
||||
### Code Version:
|
||||
<!-- Did you pull code from github? Make sure the code is up to date-->
|
||||
|
||||
### Component installation:
|
||||
<!-- Has etcd, mysql, mongodb, redis or Kafka been installed on the server before Open-IM-Server deployment-->
|
||||
|
||||
|
||||
### Log File:
|
||||
<!-- view log file(logs/openIM.log) content. -->
|
||||
|
||||
|
||||
### screenshot:
|
||||
<!---->
|
||||
36
.github/ISSUE_TEMPLATE/deployment-issues.md
vendored
Normal file
36
.github/ISSUE_TEMPLATE/deployment-issues.md
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
---
|
||||
name: Deployment issues
|
||||
about: Deployment issues
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
If you are deploying OpenIM for the first time
|
||||
|
||||
|
||||
|
||||
```
|
||||
git clone https://github.com/OpenIMSDK/Open-IM-Server.git --recursive
|
||||
```
|
||||
|
||||
screenshot here
|
||||
|
||||
```
|
||||
cd Open-IM-Server/script ; chmod +x *.sh ; ./env_check.sh
|
||||
```
|
||||
|
||||
screenshot here
|
||||
|
||||
```
|
||||
cd .. ; docker-compose up -d
|
||||
```
|
||||
|
||||
screenshot here
|
||||
|
||||
```
|
||||
cd script ; ./docker_check_service.sh
|
||||
```
|
||||
|
||||
screenshot here
|
||||
38
.github/ISSUE_TEMPLATE/update-.md
vendored
Normal file
38
.github/ISSUE_TEMPLATE/update-.md
vendored
Normal file
@@ -0,0 +1,38 @@
|
||||
---
|
||||
name: 'update '
|
||||
about: update docker image
|
||||
title: update docker image
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
```
|
||||
cd Open-IM-Server ; docker-compose down
|
||||
```
|
||||
|
||||
screenshot here
|
||||
|
||||
```
|
||||
git pull
|
||||
```
|
||||
|
||||
screenshot here
|
||||
|
||||
```
|
||||
docker-compose pull
|
||||
```
|
||||
|
||||
screenshot here
|
||||
|
||||
```
|
||||
chmod +x script/*.sh ; docker-compose up -d
|
||||
```
|
||||
|
||||
screenshot here
|
||||
|
||||
```
|
||||
cd script ; ./docker_check_service.sh
|
||||
```
|
||||
|
||||
screenshot here
|
||||
71
.github/workflows/codeql-analysis.yml
vendored
Normal file
71
.github/workflows/codeql-analysis.yml
vendored
Normal file
@@ -0,0 +1,71 @@
|
||||
# For most projects, this workflow file will not need changing; you simply need
|
||||
# to commit it to your repository.
|
||||
#
|
||||
# You may wish to alter this file to override the set of languages analyzed,
|
||||
# or to provide custom queries or build logic.
|
||||
#
|
||||
# ******** NOTE ********
|
||||
# We have attempted to detect the languages in your repository. Please check
|
||||
# the `language` matrix defined below to confirm you have the correct set of
|
||||
# supported CodeQL languages.
|
||||
#
|
||||
name: "CodeQL"
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ main ]
|
||||
pull_request:
|
||||
# The branches below must be a subset of the branches above
|
||||
branches: [ main ]
|
||||
schedule:
|
||||
- cron: '23 2 * * 2'
|
||||
|
||||
jobs:
|
||||
analyze:
|
||||
name: Analyze
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
actions: read
|
||||
contents: read
|
||||
security-events: write
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
language: [ 'go' ]
|
||||
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ]
|
||||
# Learn more:
|
||||
# https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v2
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v1
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||
# By default, queries listed here will override any specified in a config file.
|
||||
# Prefix the list here with "+" to use these queries and those in the config file.
|
||||
# queries: ./path/to/local/query, your-org/your-repo/queries@main
|
||||
|
||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||
# If this step fails, then you should remove it and run the build manually (see below)
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@v1
|
||||
|
||||
# ℹ️ Command-line programs to run using the OS shell.
|
||||
# 📚 https://git.io/JvXDl
|
||||
|
||||
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
|
||||
# and modify them (or add more) to build your code if your project
|
||||
# uses a compiled language
|
||||
|
||||
#- run: |
|
||||
# make bootstrap
|
||||
# make release
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v1
|
||||
20
.gitignore
vendored
20
.gitignore
vendored
@@ -1,2 +1,20 @@
|
||||
bin
|
||||
logs
|
||||
.devcontainer
|
||||
components
|
||||
logs
|
||||
out-test
|
||||
.github
|
||||
.idea
|
||||
.exe
|
||||
_output/
|
||||
|
||||
deploy/open_im_api
|
||||
deploy/open_im_msg_gateway
|
||||
deploy/open_im_msg_transfer
|
||||
deploy/open_im_push
|
||||
deploy/open_im_rpc_user
|
||||
deploy/open_im_rpc_friend
|
||||
deploy/open_im_rpc_group
|
||||
deploy/open_im_rpc_msg
|
||||
deploy/open_im_rpc_auth
|
||||
deploy/Open-IM-SDK-Core
|
||||
|
||||
4
.gitmodules
vendored
4
.gitmodules
vendored
@@ -1,4 +1,4 @@
|
||||
|
||||
[submodule "src/Open-IM-SDK-Core"]
|
||||
path = src/Open-IM-SDK-Core
|
||||
[submodule "cmd/Open-IM-SDK-Core"]
|
||||
path = cmd/Open-IM-SDK-Core
|
||||
url = https://github.com/OpenIMSDK/Open-IM-SDK-Core.git
|
||||
|
||||
84
README.md
84
README.md
@@ -1,4 +1,5 @@
|
||||
# Open-IM-Server
|
||||
# Open-IM-Server
|
||||

|
||||
|
||||

|
||||
|
||||
@@ -26,7 +27,6 @@ By deployment of the Open-IM-Server on the customer's server, developers can int
|
||||
|
||||
## Community
|
||||
|
||||
- Join the Telegram-OpenIM group: https://t.me/joinchat/zSJLPaHBNLZmODI1
|
||||
- 中文官网访问这里:[Open-IM中文开发文档](https://doc.rentsoft.cn/)
|
||||
|
||||
## Quick start
|
||||
@@ -35,73 +35,69 @@ By deployment of the Open-IM-Server on the customer's server, developers can int
|
||||
|
||||
> Open-IM relies on five open source high-performance components: ETCD, MySQL, MongoDB, Redis, and Kafka. Privatization deployment Before Open-IM-Server, please make sure that the above five components have been installed. If your server does not have the above components, you must first install Missing components. If you have the above components, it is recommended to use them directly. If not, it is recommended to use Docker-compose, no To install dependencies, one-click deployment, faster and more convenient.
|
||||
|
||||
#### Source code deployment
|
||||
#### Deploy using Docker
|
||||
|
||||
1. Install [Go environment](https://golang.org/doc/install). Make sure Go version is at least 1.15.
|
||||
1. Install [Go environment](https://golang.org/doc/install). Make sure Go version is at least 1.17
|
||||
|
||||
2. Clone the Open-IM project to your server.
|
||||
2. Clone the Open-IM project to your server
|
||||
|
||||
```
|
||||
git clone https://github.com/OpenIMSDK/Open-IM-Server.git --recursive
|
||||
```
|
||||
|
||||
3. Build and start Service.
|
||||
3. Deploy
|
||||
|
||||
1. Shell authorization
|
||||
1. Modify env
|
||||
|
||||
```
|
||||
#cd Open-IM-server/script
|
||||
|
||||
chmod +x *.sh
|
||||
#cd Open-IM-server
|
||||
USER=root
|
||||
PASSWORD=openIM123 #Password with more than 8 digits, excluding special characters
|
||||
ENDPOINT=http://127.0.0.1:10005 #Replace 127.0.0.1 with Internet IP
|
||||
DATA_DIR=./
|
||||
```
|
||||
|
||||
2. Execute the build shell
|
||||
|
||||
2. Deploy && Start
|
||||
|
||||
```
|
||||
./build_all_service.sh
|
||||
chmod +x install_im_server.sh;
|
||||
./install_im_server.sh;
|
||||
```
|
||||
|
||||
3. Start service
|
||||
|
||||
```
|
||||
./start_all.sh
|
||||
```
|
||||
|
||||
|
||||
4. Check service
|
||||
|
||||
|
||||
```
|
||||
./check_all.sh
|
||||
cd script;
|
||||
./docker_check_service.sh./check_all.sh
|
||||
```
|
||||
|
||||
|
||||

|
||||
|
||||
#### Docker deployment
|
||||
#### Deploy using source code
|
||||
|
||||
All images are available at https://hub.docker.com/r/lyt1123/open_im_server
|
||||
1. Go 1.17 or above。
|
||||
2. Clone
|
||||
|
||||
1. [Install Docker](https://docs.docker.com/install/) 1.13 or above.
|
||||
```shell
|
||||
git clone https://github.com/OpenIMSDK/Open-IM-Server.git --recursive
|
||||
cd cmd/Open-IM-SDK-Core
|
||||
git checkout main
|
||||
```
|
||||
|
||||
2. [Install Docker Compose](https://docs.docker.com/compose/install/) 1.22 or above.
|
||||
1. Set executable permissions
|
||||
|
||||
3. Clone the Open-IM project to your server.
|
||||
```shell
|
||||
cd ../../script/
|
||||
chmod +x *.sh
|
||||
```
|
||||
|
||||
```
|
||||
git clone https://github.com/OpenIMSDK/Open-IM-Server.git --recursive
|
||||
```
|
||||
1. build
|
||||
|
||||
4. Start docker-compose with one click(Docker automatically pulls all images)
|
||||
```shell
|
||||
./batch_build_all_service.sh
|
||||
```
|
||||
|
||||
```
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
5. Check service
|
||||
|
||||
```
|
||||
./docker_check_service.sh
|
||||
```
|
||||
|
||||

|
||||
all services build success
|
||||
|
||||
### CONFIGURATION INSTRUCTIONS
|
||||
|
||||
@@ -154,4 +150,4 @@ All images are available at https://hub.docker.com/r/lyt1123/open_im_server
|
||||
|
||||
## License
|
||||
|
||||
Open-IM-Server is under the Apache 2.0 license. See the [LICENSE](https://github.com/OpenIMSDK/Open-IM-Server/blob/main/LICENSE) file for details.
|
||||
Open-IM-Server is under the Apache 2.0 license. See the [LICENSE](https://github.com/OpenIMSDK/Open-IM-Server/blob/main/LICENSE) file for details
|
||||
|
||||
1
cmd/Open-IM-SDK-Core
Submodule
1
cmd/Open-IM-SDK-Core
Submodule
Submodule cmd/Open-IM-SDK-Core added at 373b6c00d4
34
cmd/api/Makefile
Normal file
34
cmd/api/Makefile
Normal file
@@ -0,0 +1,34 @@
|
||||
.PHONY: all build run gotool install clean help
|
||||
|
||||
NAME=open_im_api
|
||||
BIN_DIR=../../bin/
|
||||
|
||||
OS:= $(or $(os),linux)
|
||||
ARCH:=$(or $(arch),amd64)
|
||||
all: gotool build
|
||||
|
||||
ifeq ($(OS),windows)
|
||||
|
||||
BINARY_NAME=${NAME}.exe
|
||||
|
||||
else
|
||||
|
||||
BINARY_NAME=${NAME}
|
||||
|
||||
endif
|
||||
|
||||
build:
|
||||
CGO_ENABLED=0 GOOS=${OS} GOARCH=${ARCH}; go build -ldflags="-w -s" -o ${BINARY_NAME}
|
||||
|
||||
run:
|
||||
@go run ./
|
||||
|
||||
gotool:
|
||||
go fmt ./
|
||||
go vet ./
|
||||
|
||||
install:build
|
||||
mv ${BINARY_NAME} ${BIN_DIR}
|
||||
|
||||
clean:
|
||||
@if [ -f ${BINARY_NAME} ] ; then rm ${BINARY_NAME} ; fi
|
||||
18
cmd/api/deploy.Dockerfile
Normal file
18
cmd/api/deploy.Dockerfile
Normal file
@@ -0,0 +1,18 @@
|
||||
FROM ubuntu
|
||||
|
||||
WORKDIR /Open-IM-Server/bin
|
||||
|
||||
RUN apt-get update && apt-get install apt-transport-https && apt-get install procps\
|
||||
&&apt-get install net-tools
|
||||
#Non-interactive operation
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
RUN apt-get install -y vim curl tzdata gawk
|
||||
#Time zone adjusted to East eighth District
|
||||
RUN ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && dpkg-reconfigure -f noninteractive tzdata
|
||||
RUN apt-get -qq update \
|
||||
&& apt-get -qq install -y --no-install-recommends ca-certificates curl
|
||||
COPY ./open_im_api ./
|
||||
|
||||
VOLUME ["/Open-IM-Server/logs","/Open-IM-Server/config"]
|
||||
|
||||
CMD ["./open_im_api","--port", "10002"]
|
||||
91
cmd/api/main.go
Normal file
91
cmd/api/main.go
Normal file
@@ -0,0 +1,91 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"fmt"
|
||||
"net"
|
||||
"os"
|
||||
"runtime"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"gopkg.in/yaml.v3"
|
||||
|
||||
"net/http"
|
||||
_ "net/http/pprof"
|
||||
|
||||
"github.com/OpenIMSDK/Open-IM-Server/internal/api"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/cmd"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/log"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry"
|
||||
openKeeper "github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry/zookeeper"
|
||||
)
|
||||
|
||||
func main() {
|
||||
apiCmd := cmd.NewApiCmd()
|
||||
apiCmd.AddPortFlag()
|
||||
apiCmd.AddApi(run)
|
||||
if err := apiCmd.Execute(); err != nil {
|
||||
panic(err.Error())
|
||||
}
|
||||
}
|
||||
|
||||
func startPprof() {
|
||||
runtime.GOMAXPROCS(1)
|
||||
runtime.SetMutexProfileFraction(1)
|
||||
runtime.SetBlockProfileRate(1)
|
||||
if err := http.ListenAndServe(":6060", nil); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
os.Exit(0)
|
||||
}
|
||||
|
||||
func run(port int) error {
|
||||
if port == 0 {
|
||||
port = config.Config.Api.GinPort[0]
|
||||
}
|
||||
var err error
|
||||
rdb, err := cache.NewRedis()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fmt.Println("api start init discov client")
|
||||
var client discoveryregistry.SvcDiscoveryRegistry
|
||||
client, err = openKeeper.NewClient(config.Config.Zookeeper.ZkAddr, config.Config.Zookeeper.Schema,
|
||||
openKeeper.WithFreq(time.Hour), openKeeper.WithUserNameAndPassword(config.Config.Zookeeper.UserName,
|
||||
config.Config.Zookeeper.Password), openKeeper.WithRoundRobin(), openKeeper.WithTimeout(10), openKeeper.WithLogger(log.NewZkLogger()))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fmt.Println("api init discov client success")
|
||||
buf := bytes.NewBuffer(nil)
|
||||
if err := yaml.NewEncoder(buf).Encode(config.Config); err != nil {
|
||||
return err
|
||||
}
|
||||
fmt.Println("api register public config to discov")
|
||||
if err := client.RegisterConf2Registry(constant.OpenIMCommonConfigKey, buf.Bytes()); err != nil {
|
||||
return err
|
||||
}
|
||||
fmt.Println("api register public config to discov success")
|
||||
router := api.NewGinRouter(client, rdb)
|
||||
fmt.Println("api init router success")
|
||||
var address string
|
||||
if config.Config.Api.ListenIP != "" {
|
||||
address = net.JoinHostPort(config.Config.Api.ListenIP, strconv.Itoa(port))
|
||||
} else {
|
||||
address = net.JoinHostPort("0.0.0.0", strconv.Itoa(port))
|
||||
}
|
||||
fmt.Println("start api server, address: ", address, ", OpenIM version: ", config.Version)
|
||||
log.ZInfo(context.Background(), "start server success", "address", address, "version", config.Version)
|
||||
go startPprof()
|
||||
err = router.Run(address)
|
||||
if err != nil {
|
||||
log.ZError(context.Background(), "api run failed ", err, "address", address)
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
34
cmd/cmdutils/Makefile
Normal file
34
cmd/cmdutils/Makefile
Normal file
@@ -0,0 +1,34 @@
|
||||
.PHONY: all build run gotool install clean help
|
||||
|
||||
NAME=open_im_cmd_utils
|
||||
BIN_DIR=../../bin/
|
||||
|
||||
OS:= $(or $(os),linux)
|
||||
ARCH:=$(or $(arch),amd64)
|
||||
all: gotool build
|
||||
|
||||
ifeq ($(OS),windows)
|
||||
|
||||
BINARY_NAME=${NAME}.exe
|
||||
|
||||
else
|
||||
|
||||
BINARY_NAME=${NAME}
|
||||
|
||||
endif
|
||||
|
||||
build:
|
||||
CGO_ENABLED=0 GOOS=${OS} GOARCH=${ARCH}; go build -ldflags="-w -s" -o ${BINARY_NAME}
|
||||
|
||||
run:
|
||||
@go run ./
|
||||
|
||||
gotool:
|
||||
go fmt ./
|
||||
go vet ./
|
||||
|
||||
install:build
|
||||
mv ${BINARY_NAME} ${BIN_DIR}
|
||||
|
||||
clean:
|
||||
@if [ -f ${BINARY_NAME} ] ; then rm ${BINARY_NAME} ; fi
|
||||
45
cmd/cmdutils/main.go
Normal file
45
cmd/cmdutils/main.go
Normal file
@@ -0,0 +1,45 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/cmd"
|
||||
)
|
||||
|
||||
func main() {
|
||||
msgUtilsCmd := cmd.NewMsgUtilsCmd("openIMCmdUtils", "openIM cmd utils", nil)
|
||||
getCmd := cmd.NewGetCmd()
|
||||
fixCmd := cmd.NewFixCmd()
|
||||
clearCmd := cmd.NewClearCmd()
|
||||
seqCmd := cmd.NewSeqCmd()
|
||||
msgCmd := cmd.NewMsgCmd()
|
||||
getCmd.AddCommand(seqCmd.GetSeqCmd(), msgCmd.GetMsgCmd())
|
||||
getCmd.AddSuperGroupIDFlag()
|
||||
getCmd.AddUserIDFlag()
|
||||
getCmd.AddBeginSeqFlag()
|
||||
getCmd.AddLimitFlag()
|
||||
// openIM get seq --userID=xxx
|
||||
// openIM get seq --superGroupID=xxx
|
||||
// openIM get msg --userID=xxx --beginSeq=100 --limit=10
|
||||
// openIM get msg --superGroupID=xxx --beginSeq=100 --limit=10
|
||||
|
||||
fixCmd.AddCommand(seqCmd.FixSeqCmd())
|
||||
fixCmd.AddSuperGroupIDFlag()
|
||||
fixCmd.AddUserIDFlag()
|
||||
fixCmd.AddFixAllFlag()
|
||||
// openIM fix seq --userID=xxx
|
||||
// openIM fix seq --superGroupID=xxx
|
||||
// openIM fix seq --fixAll
|
||||
|
||||
clearCmd.AddCommand(msgCmd.ClearMsgCmd())
|
||||
clearCmd.AddSuperGroupIDFlag()
|
||||
clearCmd.AddUserIDFlag()
|
||||
clearCmd.AddClearAllFlag()
|
||||
clearCmd.AddBeginSeqFlag()
|
||||
clearCmd.AddLimitFlag()
|
||||
// openIM clear msg --userID=xxx --beginSeq=100 --limit=10
|
||||
// openIM clear msg --superGroupID=xxx --beginSeq=100 --limit=10
|
||||
// openIM clear msg --clearAll
|
||||
msgUtilsCmd.AddCommand(&getCmd.Command, &fixCmd.Command, &clearCmd.Command)
|
||||
if err := msgUtilsCmd.Execute(); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
34
cmd/crontask/Makefile
Normal file
34
cmd/crontask/Makefile
Normal file
@@ -0,0 +1,34 @@
|
||||
.PHONY: all build run gotool install clean help
|
||||
|
||||
NAME=open_im_cron_task
|
||||
BIN_DIR=../../bin/
|
||||
|
||||
OS:= $(or $(os),linux)
|
||||
ARCH:=$(or $(arch),amd64)
|
||||
all: gotool build
|
||||
|
||||
ifeq ($(OS),windows)
|
||||
|
||||
BINARY_NAME=${NAME}.exe
|
||||
|
||||
else
|
||||
|
||||
BINARY_NAME=${NAME}
|
||||
|
||||
endif
|
||||
|
||||
build:
|
||||
CGO_ENABLED=0 GOOS=${OS} GOARCH=${ARCH}; go build -ldflags="-w -s" -o ${BINARY_NAME}
|
||||
|
||||
run:
|
||||
@go run ./
|
||||
|
||||
gotool:
|
||||
go fmt ./
|
||||
go vet ./
|
||||
|
||||
install:build
|
||||
mv ${BINARY_NAME} ${BIN_DIR}
|
||||
|
||||
clean:
|
||||
@if [ -f ${BINARY_NAME} ] ; then rm ${BINARY_NAME} ; fi
|
||||
18
cmd/crontask/deploy.Dockerfile
Normal file
18
cmd/crontask/deploy.Dockerfile
Normal file
@@ -0,0 +1,18 @@
|
||||
FROM ubuntu
|
||||
|
||||
WORKDIR /Open-IM-Server/bin
|
||||
|
||||
RUN apt-get update && apt-get install apt-transport-https && apt-get install procps\
|
||||
&&apt-get install net-tools
|
||||
#Non-interactive operation
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
RUN apt-get install -y vim curl tzdata gawk
|
||||
#Time zone adjusted to East eighth District
|
||||
RUN ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && dpkg-reconfigure -f noninteractive tzdata
|
||||
RUN apt-get -qq update \
|
||||
&& apt-get -qq install -y --no-install-recommends ca-certificates curl
|
||||
COPY ./open_im_cron_task ./
|
||||
|
||||
VOLUME ["/Open-IM-Server/logs","/Open-IM-Server/config"]
|
||||
|
||||
CMD ["./open_im_cron_task"]
|
||||
13
cmd/crontask/main.go
Normal file
13
cmd/crontask/main.go
Normal file
@@ -0,0 +1,13 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/OpenIMSDK/Open-IM-Server/internal/tools"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/cmd"
|
||||
)
|
||||
|
||||
func main() {
|
||||
cronTaskCmd := cmd.NewCronTaskCmd()
|
||||
if err := cronTaskCmd.Exec(tools.StartCronTask); err != nil {
|
||||
panic(err.Error())
|
||||
}
|
||||
}
|
||||
35
cmd/msggateway/Makefile
Normal file
35
cmd/msggateway/Makefile
Normal file
@@ -0,0 +1,35 @@
|
||||
.PHONY: all build run gotool install clean help
|
||||
|
||||
NAME=open_im_msg_gateway
|
||||
BIN_DIR=../../bin/
|
||||
|
||||
OS:= $(or $(os),linux)
|
||||
ARCH:=$(or $(arch),amd64)
|
||||
all: gotool build
|
||||
|
||||
ifeq ($(OS),windows)
|
||||
|
||||
BINARY_NAME=${NAME}.exe
|
||||
|
||||
else
|
||||
|
||||
BINARY_NAME=${NAME}
|
||||
|
||||
endif
|
||||
|
||||
build:
|
||||
CGO_ENABLED=0 GOOS=${OS} GOARCH=${ARCH}; go build -ldflags="-w -s" -o ${BINARY_NAME}
|
||||
|
||||
run:
|
||||
@go run ./
|
||||
|
||||
gotool:
|
||||
go fmt ./
|
||||
go vet ./
|
||||
|
||||
install:build
|
||||
mv ${BINARY_NAME} ${BIN_DIR}
|
||||
|
||||
clean:
|
||||
@if [ -f ${BINARY_NAME} ] ; then rm ${BINARY_NAME} ; fi
|
||||
|
||||
18
cmd/msggateway/deploy.Dockerfile
Normal file
18
cmd/msggateway/deploy.Dockerfile
Normal file
@@ -0,0 +1,18 @@
|
||||
FROM ubuntu
|
||||
|
||||
WORKDIR /Open-IM-Server/bin
|
||||
|
||||
RUN apt-get update && apt-get install apt-transport-https && apt-get install procps\
|
||||
&&apt-get install net-tools
|
||||
#Non-interactive operation
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
RUN apt-get install -y vim curl tzdata gawk
|
||||
#Time zone adjusted to East eighth District
|
||||
RUN ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && dpkg-reconfigure -f noninteractive tzdata
|
||||
RUN apt-get -qq update \
|
||||
&& apt-get -qq install -y --no-install-recommends ca-certificates curl
|
||||
COPY ./open_im_msg_gateway ./
|
||||
|
||||
VOLUME ["/Open-IM-Server/logs","/Open-IM-Server/config"]
|
||||
|
||||
CMD ["./open_im_msg_gateway","--port", "10140" "--ws_port", "10001", "--prometheus_port", "20240"]
|
||||
15
cmd/msggateway/main.go
Normal file
15
cmd/msggateway/main.go
Normal file
@@ -0,0 +1,15 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/cmd"
|
||||
)
|
||||
|
||||
func main() {
|
||||
msgGatewayCmd := cmd.NewMsgGatewayCmd()
|
||||
msgGatewayCmd.AddWsPortFlag()
|
||||
msgGatewayCmd.AddPortFlag()
|
||||
msgGatewayCmd.AddPrometheusPortFlag()
|
||||
if err := msgGatewayCmd.Exec(); err != nil {
|
||||
panic(err.Error())
|
||||
}
|
||||
}
|
||||
34
cmd/msgtransfer/Makefile
Normal file
34
cmd/msgtransfer/Makefile
Normal file
@@ -0,0 +1,34 @@
|
||||
.PHONY: all build run gotool install clean help
|
||||
|
||||
NAME=open_im_msg_transfer
|
||||
BIN_DIR=../../bin/
|
||||
|
||||
OS:= $(or $(os),linux)
|
||||
ARCH:=$(or $(arch),amd64)
|
||||
all: gotool build
|
||||
|
||||
ifeq ($(OS),windows)
|
||||
|
||||
BINARY_NAME=${NAME}.exe
|
||||
|
||||
else
|
||||
|
||||
BINARY_NAME=${NAME}
|
||||
|
||||
endif
|
||||
|
||||
build:
|
||||
CGO_ENABLED=0 GOOS=${OS} GOARCH=${ARCH}; go build -ldflags="-w -s" -o ${BINARY_NAME}
|
||||
|
||||
run:
|
||||
@go run ./
|
||||
|
||||
gotool:
|
||||
go fmt ./
|
||||
go vet ./
|
||||
|
||||
install:build
|
||||
mv ${BINARY_NAME} ${BIN_DIR}
|
||||
|
||||
clean:
|
||||
@if [ -f ${BINARY_NAME} ] ; then rm ${BINARY_NAME} ; fi
|
||||
18
cmd/msgtransfer/deploy.Dockerfile
Normal file
18
cmd/msgtransfer/deploy.Dockerfile
Normal file
@@ -0,0 +1,18 @@
|
||||
FROM ubuntu
|
||||
|
||||
WORKDIR /Open-IM-Server/bin
|
||||
|
||||
RUN apt-get update && apt-get install apt-transport-https && apt-get install procps\
|
||||
&&apt-get install net-tools
|
||||
#Non-interactive operation
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
RUN apt-get install -y vim curl tzdata gawk
|
||||
#Time zone adjusted to East eighth District
|
||||
RUN ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && dpkg-reconfigure -f noninteractive tzdata
|
||||
RUN apt-get -qq update \
|
||||
&& apt-get -qq install -y --no-install-recommends ca-certificates curl
|
||||
COPY ./open_im_msg_transfer ./
|
||||
|
||||
VOLUME ["/Open-IM-Server/logs","/Open-IM-Server/config"]
|
||||
|
||||
CMD ["./open_im_msg_transfer","--prometheus_port", "21400"]
|
||||
13
cmd/msgtransfer/main.go
Normal file
13
cmd/msgtransfer/main.go
Normal file
@@ -0,0 +1,13 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/cmd"
|
||||
)
|
||||
|
||||
func main() {
|
||||
msgTransferCmd := cmd.NewMsgTransferCmd()
|
||||
msgTransferCmd.AddPrometheusPortFlag()
|
||||
if err := msgTransferCmd.Exec(); err != nil {
|
||||
panic(err.Error())
|
||||
}
|
||||
}
|
||||
34
cmd/push/Makefile
Normal file
34
cmd/push/Makefile
Normal file
@@ -0,0 +1,34 @@
|
||||
.PHONY: all build run gotool install clean help
|
||||
|
||||
NAME=open_im_push
|
||||
BIN_DIR=../../bin/
|
||||
|
||||
OS:= $(or $(os),linux)
|
||||
ARCH:=$(or $(arch),amd64)
|
||||
all: gotool build
|
||||
|
||||
ifeq ($(OS),windows)
|
||||
|
||||
BINARY_NAME=${NAME}.exe
|
||||
|
||||
else
|
||||
|
||||
BINARY_NAME=${NAME}
|
||||
|
||||
endif
|
||||
|
||||
build:
|
||||
CGO_ENABLED=0 GOOS=${OS} GOARCH=${ARCH}; go build -ldflags="-w -s" -o ${BINARY_NAME}
|
||||
|
||||
run:
|
||||
@go run ./
|
||||
|
||||
gotool:
|
||||
go fmt ./
|
||||
go vet ./
|
||||
|
||||
install:build
|
||||
mv ${BINARY_NAME} ${BIN_DIR}
|
||||
|
||||
clean:
|
||||
@if [ -f ${BINARY_NAME} ] ; then rm ${BINARY_NAME} ; fi
|
||||
18
cmd/push/deploy.Dockerfile
Normal file
18
cmd/push/deploy.Dockerfile
Normal file
@@ -0,0 +1,18 @@
|
||||
FROM ubuntu
|
||||
|
||||
WORKDIR /Open-IM-Server/bin
|
||||
|
||||
RUN apt-get update && apt-get install apt-transport-https && apt-get install procps\
|
||||
&&apt-get install net-tools
|
||||
#Non-interactive operation
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
RUN apt-get install -y vim curl tzdata gawk
|
||||
#Time zone adjusted to East eighth District
|
||||
RUN ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && dpkg-reconfigure -f noninteractive tzdata
|
||||
RUN apt-get -qq update \
|
||||
&& apt-get -qq install -y --no-install-recommends ca-certificates curl
|
||||
COPY ./open_im_push ./
|
||||
|
||||
VOLUME ["/Open-IM-Server/logs","/Open-IM-Server/config"]
|
||||
|
||||
CMD ["./open_im_push", "--port", "10170", "--prometheus_port", "20170"]
|
||||
19
cmd/push/main.go
Normal file
19
cmd/push/main.go
Normal file
@@ -0,0 +1,19 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/OpenIMSDK/Open-IM-Server/internal/push"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/cmd"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
|
||||
)
|
||||
|
||||
func main() {
|
||||
pushCmd := cmd.NewRpcCmd("push")
|
||||
pushCmd.AddPortFlag()
|
||||
pushCmd.AddPrometheusPortFlag()
|
||||
if err := pushCmd.Exec(); err != nil {
|
||||
panic(err.Error())
|
||||
}
|
||||
if err := pushCmd.StartSvr(config.Config.RpcRegisterName.OpenImPushName, push.Start); err != nil {
|
||||
panic(err.Error())
|
||||
}
|
||||
}
|
||||
34
cmd/rpc/auth/Makefile
Normal file
34
cmd/rpc/auth/Makefile
Normal file
@@ -0,0 +1,34 @@
|
||||
.PHONY: all build run gotool install clean help
|
||||
|
||||
NAME=open_im_auth
|
||||
BIN_DIR=../../../bin/
|
||||
|
||||
OS:= $(or $(os),linux)
|
||||
ARCH:=$(or $(arch),amd64)
|
||||
all: gotool build
|
||||
|
||||
ifeq ($(OS),windows)
|
||||
|
||||
BINARY_NAME=${NAME}.exe
|
||||
|
||||
else
|
||||
|
||||
BINARY_NAME=${NAME}
|
||||
|
||||
endif
|
||||
|
||||
build:
|
||||
CGO_ENABLED=0 GOOS=${OS} GOARCH=${ARCH}; go build -ldflags="-w -s" -o ${BINARY_NAME}
|
||||
|
||||
run:
|
||||
@go run ./
|
||||
|
||||
gotool:
|
||||
go fmt ./
|
||||
go vet ./
|
||||
|
||||
install:build
|
||||
mv ${BINARY_NAME} ${BIN_DIR}
|
||||
|
||||
clean:
|
||||
@if [ -f ${BINARY_NAME} ] ; then rm ${BINARY_NAME} ; fi
|
||||
18
cmd/rpc/auth/deploy.Dockerfile
Normal file
18
cmd/rpc/auth/deploy.Dockerfile
Normal file
@@ -0,0 +1,18 @@
|
||||
FROM ubuntu
|
||||
|
||||
WORKDIR /Open-IM-Server/bin
|
||||
|
||||
RUN apt-get update && apt-get install apt-transport-https && apt-get install procps\
|
||||
&&apt-get install net-tools
|
||||
#Non-interactive operation
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
RUN apt-get install -y vim curl tzdata gawk
|
||||
#Time zone adjusted to East eighth District
|
||||
RUN ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && dpkg-reconfigure -f noninteractive tzdata
|
||||
RUN apt-get -qq update \
|
||||
&& apt-get -qq install -y --no-install-recommends ca-certificates curl
|
||||
COPY ./open_im_auth ./
|
||||
|
||||
VOLUME ["/Open-IM-Server/logs","/Open-IM-Server/config"]
|
||||
|
||||
CMD ["./open_im_auth", "--port", "10160"]
|
||||
19
cmd/rpc/auth/main.go
Normal file
19
cmd/rpc/auth/main.go
Normal file
@@ -0,0 +1,19 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/OpenIMSDK/Open-IM-Server/internal/rpc/auth"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/cmd"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
|
||||
)
|
||||
|
||||
func main() {
|
||||
authCmd := cmd.NewRpcCmd("auth")
|
||||
authCmd.AddPortFlag()
|
||||
authCmd.AddPrometheusPortFlag()
|
||||
if err := authCmd.Exec(); err != nil {
|
||||
panic(err.Error())
|
||||
}
|
||||
if err := authCmd.StartSvr(config.Config.RpcRegisterName.OpenImAuthName, auth.Start); err != nil {
|
||||
panic(err.Error())
|
||||
}
|
||||
}
|
||||
34
cmd/rpc/conversation/Makefile
Normal file
34
cmd/rpc/conversation/Makefile
Normal file
@@ -0,0 +1,34 @@
|
||||
.PHONY: all build run gotool install clean help
|
||||
|
||||
NAME=open_im_conversation
|
||||
BIN_DIR=../../../bin/
|
||||
|
||||
OS:= $(or $(os),linux)
|
||||
ARCH:=$(or $(arch),amd64)
|
||||
all: gotool build
|
||||
|
||||
ifeq ($(OS),windows)
|
||||
|
||||
BINARY_NAME=${NAME}.exe
|
||||
|
||||
else
|
||||
|
||||
BINARY_NAME=${NAME}
|
||||
|
||||
endif
|
||||
|
||||
build:
|
||||
CGO_ENABLED=0 GOOS=${OS} GOARCH=${ARCH}; go build -ldflags="-w -s" -o ${BINARY_NAME}
|
||||
|
||||
run:
|
||||
@go run ./
|
||||
|
||||
gotool:
|
||||
go fmt ./
|
||||
go vet ./
|
||||
|
||||
install:build
|
||||
mv ${BINARY_NAME} ${BIN_DIR}
|
||||
|
||||
clean:
|
||||
@if [ -f ${BINARY_NAME} ] ; then rm ${BINARY_NAME} ; fi
|
||||
18
cmd/rpc/conversation/deploy.Dockerfile
Normal file
18
cmd/rpc/conversation/deploy.Dockerfile
Normal file
@@ -0,0 +1,18 @@
|
||||
FROM ubuntu
|
||||
|
||||
WORKDIR /Open-IM-Server/bin
|
||||
|
||||
RUN apt-get update && apt-get install apt-transport-https && apt-get install procps\
|
||||
&&apt-get install net-tools
|
||||
#Non-interactive operation
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
RUN apt-get install -y vim curl tzdata gawk
|
||||
#Time zone adjusted to East eighth District
|
||||
RUN ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && dpkg-reconfigure -f noninteractive tzdata
|
||||
RUN apt-get -qq update \
|
||||
&& apt-get -qq install -y --no-install-recommends ca-certificates curl
|
||||
COPY ./open_im_conversation ./
|
||||
|
||||
VOLUME ["/Open-IM-Server/logs","/Open-IM-Server/config"]
|
||||
|
||||
CMD ["./open_im_conversation", "--port", "10230", "--prometheus_port","20230"]
|
||||
19
cmd/rpc/conversation/main.go
Normal file
19
cmd/rpc/conversation/main.go
Normal file
@@ -0,0 +1,19 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/OpenIMSDK/Open-IM-Server/internal/rpc/conversation"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/cmd"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
|
||||
)
|
||||
|
||||
func main() {
|
||||
rpcCmd := cmd.NewRpcCmd("conversation")
|
||||
rpcCmd.AddPortFlag()
|
||||
rpcCmd.AddPrometheusPortFlag()
|
||||
if err := rpcCmd.Exec(); err != nil {
|
||||
panic(err.Error())
|
||||
}
|
||||
if err := rpcCmd.StartSvr(config.Config.RpcRegisterName.OpenImConversationName, conversation.Start); err != nil {
|
||||
panic(err.Error())
|
||||
}
|
||||
}
|
||||
36
cmd/rpc/friend/Makefile
Normal file
36
cmd/rpc/friend/Makefile
Normal file
@@ -0,0 +1,36 @@
|
||||
.PHONY: all build run gotool install clean help
|
||||
|
||||
NAME=open_im_friend
|
||||
BIN_DIR=../../../bin/
|
||||
|
||||
OS:= $(or $(os),linux)
|
||||
ARCH:=$(or $(arch),amd64)
|
||||
all: gotool build
|
||||
|
||||
ifeq ($(OS),windows)
|
||||
|
||||
BINARY_NAME=${NAME}.exe
|
||||
|
||||
else
|
||||
|
||||
BINARY_NAME=${NAME}
|
||||
|
||||
endif
|
||||
|
||||
build:
|
||||
CGO_ENABLED=0 GOOS=${OS} GOARCH=${ARCH}; go build -ldflags="-w -s" -o ${BINARY_NAME}
|
||||
|
||||
run:
|
||||
@go run ./
|
||||
|
||||
gotool:
|
||||
go fmt ./
|
||||
go vet ./
|
||||
|
||||
install:build
|
||||
mv ${BINARY_NAME} ${BIN_DIR}
|
||||
|
||||
clean:
|
||||
@if [ -f ${BINARY_NAME} ] ; then rm ${BINARY_NAME} ; fi
|
||||
|
||||
|
||||
18
cmd/rpc/friend/deploy.Dockerfile
Normal file
18
cmd/rpc/friend/deploy.Dockerfile
Normal file
@@ -0,0 +1,18 @@
|
||||
FROM ubuntu
|
||||
|
||||
WORKDIR /Open-IM-Server/bin
|
||||
|
||||
RUN apt-get update && apt-get install apt-transport-https && apt-get install procps\
|
||||
&&apt-get install net-tools
|
||||
#Non-interactive operation
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
RUN apt-get install -y vim curl tzdata gawk
|
||||
#Time zone adjusted to East eighth District
|
||||
RUN ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && dpkg-reconfigure -f noninteractive tzdata
|
||||
RUN apt-get -qq update \
|
||||
&& apt-get -qq install -y --no-install-recommends ca-certificates curl
|
||||
COPY ./open_im_friend ./
|
||||
|
||||
VOLUME ["/Open-IM-Server/logs","/Open-IM-Server/config"]
|
||||
|
||||
CMD ["./open_im_friend", "--port", "10120", "--prometheus_port","20120"]
|
||||
19
cmd/rpc/friend/main.go
Normal file
19
cmd/rpc/friend/main.go
Normal file
@@ -0,0 +1,19 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/OpenIMSDK/Open-IM-Server/internal/rpc/friend"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/cmd"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
|
||||
)
|
||||
|
||||
func main() {
|
||||
rpcCmd := cmd.NewRpcCmd("friend")
|
||||
rpcCmd.AddPortFlag()
|
||||
rpcCmd.AddPrometheusPortFlag()
|
||||
if err := rpcCmd.Exec(); err != nil {
|
||||
panic(err.Error())
|
||||
}
|
||||
if err := rpcCmd.StartSvr(config.Config.RpcRegisterName.OpenImFriendName, friend.Start); err != nil {
|
||||
panic(err.Error())
|
||||
}
|
||||
}
|
||||
39
cmd/rpc/group/Makefile
Normal file
39
cmd/rpc/group/Makefile
Normal file
@@ -0,0 +1,39 @@
|
||||
.PHONY: all build run gotool install clean help
|
||||
|
||||
NAME=open_im_group
|
||||
BIN_DIR=../../../bin/
|
||||
|
||||
OS:= $(or $(os),linux)
|
||||
ARCH:=$(or $(arch),amd64)
|
||||
all: gotool build
|
||||
|
||||
ifeq ($(OS),windows)
|
||||
|
||||
BINARY_NAME=${NAME}.exe
|
||||
|
||||
else
|
||||
|
||||
BINARY_NAME=${NAME}
|
||||
|
||||
endif
|
||||
|
||||
build:
|
||||
CGO_ENABLED=0 GOOS=${OS} GOARCH=${ARCH}; go build -ldflags="-w -s" -o ${BINARY_NAME}
|
||||
|
||||
run:
|
||||
@go run ./
|
||||
|
||||
gotool:
|
||||
go fmt ./
|
||||
go vet ./
|
||||
|
||||
install:build
|
||||
mv ${BINARY_NAME} ${BIN_DIR}
|
||||
|
||||
clean:
|
||||
@if [ -f ${BINARY_NAME} ] ; then rm ${BINARY_NAME} ; fi
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
18
cmd/rpc/group/deploy.Dockerfile
Normal file
18
cmd/rpc/group/deploy.Dockerfile
Normal file
@@ -0,0 +1,18 @@
|
||||
FROM ubuntu
|
||||
|
||||
WORKDIR /Open-IM-Server/bin
|
||||
|
||||
RUN apt-get update && apt-get install apt-transport-https && apt-get install procps\
|
||||
&&apt-get install net-tools
|
||||
#Non-interactive operation
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
RUN apt-get install -y vim curl tzdata gawk
|
||||
#Time zone adjusted to East eighth District
|
||||
RUN ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && dpkg-reconfigure -f noninteractive tzdata
|
||||
RUN apt-get -qq update \
|
||||
&& apt-get -qq install -y --no-install-recommends ca-certificates curl
|
||||
COPY ./open_im_group ./
|
||||
|
||||
VOLUME ["/Open-IM-Server/logs","/Open-IM-Server/config"]
|
||||
|
||||
CMD ["./open_im_group", "--port", "10150", "--prometheus_port","20150"]
|
||||
19
cmd/rpc/group/main.go
Normal file
19
cmd/rpc/group/main.go
Normal file
@@ -0,0 +1,19 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/OpenIMSDK/Open-IM-Server/internal/rpc/group"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/cmd"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
|
||||
)
|
||||
|
||||
func main() {
|
||||
rpcCmd := cmd.NewRpcCmd("group")
|
||||
rpcCmd.AddPortFlag()
|
||||
rpcCmd.AddPrometheusPortFlag()
|
||||
if err := rpcCmd.Exec(); err != nil {
|
||||
panic(err.Error())
|
||||
}
|
||||
if err := rpcCmd.StartSvr(config.Config.RpcRegisterName.OpenImGroupName, group.Start); err != nil {
|
||||
panic(err.Error())
|
||||
}
|
||||
}
|
||||
36
cmd/rpc/msg/Makefile
Normal file
36
cmd/rpc/msg/Makefile
Normal file
@@ -0,0 +1,36 @@
|
||||
.PHONY: all build run gotool install clean help
|
||||
|
||||
NAME=open_im_msg
|
||||
BIN_DIR=../../../bin/
|
||||
|
||||
OS:= $(or $(os),linux)
|
||||
ARCH:=$(or $(arch),amd64)
|
||||
all: gotool build
|
||||
|
||||
ifeq ($(OS),windows)
|
||||
|
||||
BINARY_NAME=${NAME}.exe
|
||||
|
||||
else
|
||||
|
||||
BINARY_NAME=${NAME}
|
||||
|
||||
endif
|
||||
|
||||
build:
|
||||
CGO_ENABLED=0 GOOS=${OS} GOARCH=${ARCH}; go build -ldflags="-w -s" -o ${BINARY_NAME}
|
||||
|
||||
run:
|
||||
@go run ./
|
||||
|
||||
gotool:
|
||||
go fmt ./
|
||||
go vet ./
|
||||
|
||||
install:build
|
||||
mv ${BINARY_NAME} ${BIN_DIR}
|
||||
|
||||
clean:
|
||||
@if [ -f ${BINARY_NAME} ] ; then rm ${BINARY_NAME} ; fi
|
||||
|
||||
|
||||
18
cmd/rpc/msg/deploy.Dockerfile
Normal file
18
cmd/rpc/msg/deploy.Dockerfile
Normal file
@@ -0,0 +1,18 @@
|
||||
FROM ubuntu
|
||||
|
||||
WORKDIR /Open-IM-Server/bin
|
||||
|
||||
RUN apt-get update && apt-get install apt-transport-https && apt-get install procps\
|
||||
&&apt-get install net-tools
|
||||
#Non-interactive operation
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
RUN apt-get install -y vim curl tzdata gawk
|
||||
#Time zone adjusted to East eighth District
|
||||
RUN ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && dpkg-reconfigure -f noninteractive tzdata
|
||||
RUN apt-get -qq update \
|
||||
&& apt-get -qq install -y --no-install-recommends ca-certificates curl
|
||||
COPY ./open_im_msg ./
|
||||
|
||||
VOLUME ["/Open-IM-Server/logs","/Open-IM-Server/config"]
|
||||
|
||||
CMD ["./open_im_msg", "--port", "10130", "--prometheus_port","20130"]
|
||||
19
cmd/rpc/msg/main.go
Normal file
19
cmd/rpc/msg/main.go
Normal file
@@ -0,0 +1,19 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/OpenIMSDK/Open-IM-Server/internal/rpc/msg"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/cmd"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
|
||||
)
|
||||
|
||||
func main() {
|
||||
rpcCmd := cmd.NewRpcCmd("msg")
|
||||
rpcCmd.AddPortFlag()
|
||||
rpcCmd.AddPrometheusPortFlag()
|
||||
if err := rpcCmd.Exec(); err != nil {
|
||||
panic(err.Error())
|
||||
}
|
||||
if err := rpcCmd.StartSvr(config.Config.RpcRegisterName.OpenImMsgName, msg.Start); err != nil {
|
||||
panic(err.Error())
|
||||
}
|
||||
}
|
||||
39
cmd/rpc/third/Makefile
Normal file
39
cmd/rpc/third/Makefile
Normal file
@@ -0,0 +1,39 @@
|
||||
.PHONY: all build run gotool install clean help
|
||||
|
||||
NAME=open_im_third
|
||||
BIN_DIR=../../../bin/
|
||||
|
||||
OS:= $(or $(os),linux)
|
||||
ARCH:=$(or $(arch),amd64)
|
||||
all: gotool build
|
||||
|
||||
ifeq ($(OS),windows)
|
||||
|
||||
BINARY_NAME=${NAME}.exe
|
||||
|
||||
else
|
||||
|
||||
BINARY_NAME=${NAME}
|
||||
|
||||
endif
|
||||
|
||||
build:
|
||||
CGO_ENABLED=0 GOOS=${OS} GOARCH=${ARCH}; go build -ldflags="-w -s" -o ${BINARY_NAME}
|
||||
|
||||
run:
|
||||
@go run ./
|
||||
|
||||
gotool:
|
||||
go fmt ./
|
||||
go vet ./
|
||||
|
||||
install:build
|
||||
mv ${BINARY_NAME} ${BIN_DIR}
|
||||
|
||||
clean:
|
||||
@if [ -f ${BINARY_NAME} ] ; then rm ${BINARY_NAME} ; fi
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
18
cmd/rpc/third/deploy.Dockerfile
Normal file
18
cmd/rpc/third/deploy.Dockerfile
Normal file
@@ -0,0 +1,18 @@
|
||||
FROM ubuntu
|
||||
|
||||
WORKDIR /Open-IM-Server/bin
|
||||
|
||||
RUN apt-get update && apt-get install apt-transport-https && apt-get install procps\
|
||||
&&apt-get install net-tools
|
||||
#Non-interactive operation
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
RUN apt-get install -y vim curl tzdata gawk
|
||||
#Time zone adjusted to East eighth District
|
||||
RUN ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && dpkg-reconfigure -f noninteractive tzdata
|
||||
RUN apt-get -qq update \
|
||||
&& apt-get -qq install -y --no-install-recommends ca-certificates curl
|
||||
COPY ./open_im_third ./
|
||||
|
||||
VOLUME ["/Open-IM-Server/logs","/Open-IM-Server/config"]
|
||||
|
||||
CMD ["./open_im_third", "--port", "10200"]
|
||||
19
cmd/rpc/third/main.go
Normal file
19
cmd/rpc/third/main.go
Normal file
@@ -0,0 +1,19 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/OpenIMSDK/Open-IM-Server/internal/rpc/third"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/cmd"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
|
||||
)
|
||||
|
||||
func main() {
|
||||
rpcCmd := cmd.NewRpcCmd("third")
|
||||
rpcCmd.AddPortFlag()
|
||||
rpcCmd.AddPrometheusPortFlag()
|
||||
if err := rpcCmd.Exec(); err != nil {
|
||||
panic(err.Error())
|
||||
}
|
||||
if err := rpcCmd.StartSvr(config.Config.RpcRegisterName.OpenImThirdName, third.Start); err != nil {
|
||||
panic(err.Error())
|
||||
}
|
||||
}
|
||||
39
cmd/rpc/user/Makefile
Normal file
39
cmd/rpc/user/Makefile
Normal file
@@ -0,0 +1,39 @@
|
||||
.PHONY: all build run gotool install clean help
|
||||
|
||||
NAME=open_im_user
|
||||
BIN_DIR=../../../bin/
|
||||
|
||||
OS:= $(or $(os),linux)
|
||||
ARCH:=$(or $(arch),amd64)
|
||||
all: gotool build
|
||||
|
||||
ifeq ($(OS),windows)
|
||||
|
||||
BINARY_NAME=${NAME}.exe
|
||||
|
||||
else
|
||||
|
||||
BINARY_NAME=${NAME}
|
||||
|
||||
endif
|
||||
|
||||
build:
|
||||
CGO_ENABLED=0 GOOS=${OS} GOARCH=${ARCH}; go build -ldflags="-w -s" -o ${BINARY_NAME}
|
||||
|
||||
run:
|
||||
@go run ./
|
||||
|
||||
gotool:
|
||||
go fmt ./
|
||||
go vet ./
|
||||
|
||||
install:build
|
||||
mv ${BINARY_NAME} ${BIN_DIR}
|
||||
|
||||
clean:
|
||||
@if [ -f ${BINARY_NAME} ] ; then rm ${BINARY_NAME} ; fi
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
18
cmd/rpc/user/deploy.Dockerfile
Normal file
18
cmd/rpc/user/deploy.Dockerfile
Normal file
@@ -0,0 +1,18 @@
|
||||
FROM ubuntu
|
||||
|
||||
WORKDIR /Open-IM-Server/bin
|
||||
|
||||
RUN apt-get update && apt-get install apt-transport-https && apt-get install procps\
|
||||
&&apt-get install net-tools
|
||||
#Non-interactive operation
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
RUN apt-get install -y vim curl tzdata gawk
|
||||
#Time zone adjusted to East eighth District
|
||||
RUN ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && dpkg-reconfigure -f noninteractive tzdata
|
||||
RUN apt-get -qq update \
|
||||
&& apt-get -qq install -y --no-install-recommends ca-certificates curl
|
||||
COPY ./open_im_user ./
|
||||
|
||||
VOLUME ["/Open-IM-Server/logs","/Open-IM-Server/config"]
|
||||
|
||||
CMD ["./open_im_user", "--port", "10110"]
|
||||
19
cmd/rpc/user/main.go
Normal file
19
cmd/rpc/user/main.go
Normal file
@@ -0,0 +1,19 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/OpenIMSDK/Open-IM-Server/internal/rpc/user"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/cmd"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
|
||||
)
|
||||
|
||||
func main() {
|
||||
rpcCmd := cmd.NewRpcCmd("user")
|
||||
rpcCmd.AddPortFlag()
|
||||
rpcCmd.AddPrometheusPortFlag()
|
||||
if err := rpcCmd.Exec(); err != nil {
|
||||
panic(err.Error())
|
||||
}
|
||||
if err := rpcCmd.StartSvr(config.Config.RpcRegisterName.OpenImUserName, user.Start); err != nil {
|
||||
panic(err.Error())
|
||||
}
|
||||
}
|
||||
@@ -1,53 +1,70 @@
|
||||
# The class cannot be named by Pascal or camel case.
|
||||
# If it is not used, the corresponding structure will not be set,
|
||||
# and it will not be read naturally.
|
||||
serverversion: 1.0.0
|
||||
serverversion: 2.3.7
|
||||
#---------------Infrastructure configuration---------------------#
|
||||
etcd:
|
||||
etcdSchema: openIM
|
||||
etcdAddr: [ 127.0.0.1:2379 ]
|
||||
zookeeper:
|
||||
schema: openim #默认即可
|
||||
zkAddr: [ 127.0.0.1:2181 ] #单机部署时,默认即可
|
||||
userName:
|
||||
password:
|
||||
|
||||
mysql:
|
||||
dbMysqlAddress: [ 127.0.0.1:3306 ]
|
||||
dbMysqlUserName: root
|
||||
dbMysqlPassword: openIM
|
||||
dbMysqlDatabaseName: openIM
|
||||
dbTableName: eMsg
|
||||
dbMysqlAddress: [ 127.0.0.1:13306 ] #mysql地址 目前仅支持单机,默认即可
|
||||
dbMysqlUserName: root #mysql用户名,建议修改
|
||||
dbMysqlPassword: openIM123 # mysql密码,建议修改
|
||||
dbMysqlDatabaseName: openIM_v2 #默认即可
|
||||
dbTableName: eMsg #默认即可
|
||||
dbMsgTableNum: 1
|
||||
dbMaxOpenConns: 20
|
||||
dbMaxOpenConns: 100
|
||||
dbMaxIdleConns: 10
|
||||
dbMaxLifeTime: 120
|
||||
dbMaxLifeTime: 5
|
||||
logLevel: 4 #1=slient 2=error 3=warn 4=info
|
||||
slowThreshold: 500
|
||||
|
||||
mongo:
|
||||
dbAddress: [ 127.0.0.1:27017 ]
|
||||
dbUri: ""#当dbUri值不为空则直接使用该值
|
||||
dbAddress: [ 127.0.0.1:37017 ] #单机时为mongo地址,使用分片集群时,为mongos地址 默认即可
|
||||
dbDirect: false
|
||||
dbTimeout: 10
|
||||
dbDatabase: openIM
|
||||
dbTimeout: 60
|
||||
dbDatabase: openIM #mongo db 默认即可
|
||||
dbSource: admin
|
||||
dbUserName:
|
||||
dbPassword:
|
||||
dbMaxPoolSize: 20
|
||||
dbRetainChatRecords: 7
|
||||
dbUserName: root #mongo用户名,建议先不设置
|
||||
dbPassword: openIM123 #mongo密码,建议先不设置
|
||||
dbMaxPoolSize: 100
|
||||
dbRetainChatRecords: 3650 #mongo保存离线消息时间(天),根据需求修改
|
||||
chatRecordsClearTime: "0 2 * * 3" # 每周三凌晨2点清除消息,该配置和linux定时任务一样, 清理操作建议设置在用户活跃少的时候 # 0 3 * * *
|
||||
|
||||
redis:
|
||||
dbAddress: 127.0.0.1:6379
|
||||
dbAddress: [ 127.0.0.1:16379 ] #redis地址 单机时,填写一个地址即可,使用redis集群时候,填写集群中多个节点地址(主从地址都可以填写,增加容灾能力),默认即可
|
||||
dbMaxIdle: 128
|
||||
dbMaxActive: 0
|
||||
dbIdleTimeout: 120
|
||||
dbPassWord: openIM
|
||||
dbUserName: #only redis version 6.0+ need username
|
||||
dbPassWord: openIM123 #redis密码 建议修改
|
||||
enableCluster: false #如果外部redis以集群方式启动,需要打开此开关
|
||||
|
||||
kafka:
|
||||
SASLUserName:
|
||||
SASLPassword:
|
||||
ws2mschat:
|
||||
addr: [ 127.0.0.1:9092 ]
|
||||
topic: "ws2ms_chat"
|
||||
addr: [ 127.0.0.1:9092 ] #kafka配置,默认即可
|
||||
topic: "ws2ms_chat" #用于mongo和mysql保存消息
|
||||
msgtomongo:
|
||||
addr: [ 127.0.0.1:9092 ] #kafka配置,默认即可
|
||||
topic: "msg_to_mongo"
|
||||
ms2pschat:
|
||||
addr: [ 127.0.0.1:9092 ]
|
||||
topic: "ms2ps_chat"
|
||||
addr: [ 127.0.0.1:9092 ] #kafka配置,默认即可
|
||||
topic: "ms2ps_chat" #消息push
|
||||
msgtomodify:
|
||||
addr: [ 127.0.0.1:9092 ] #kafka配置,默认即可
|
||||
topic: "msg_to_modify"
|
||||
consumergroupid:
|
||||
msgToMongo: mongo
|
||||
msgToTransfer: mongo
|
||||
msgToMongo: mongo_ex
|
||||
msgToMySql: mysql
|
||||
msgToPush: push
|
||||
|
||||
msgToModify: modify
|
||||
|
||||
|
||||
#---------------Internal service configuration---------------------#
|
||||
@@ -55,92 +72,247 @@ kafka:
|
||||
# The service ip default is empty,
|
||||
# automatically obtain the machine's valid network card ip as the service ip,
|
||||
# otherwise the configuration ip is preferred
|
||||
serverip:
|
||||
#如果是单机模式,用0.0.0.0或者不填,默认即可
|
||||
|
||||
#作为rpc时,注册到etcd的地址,单机默认即可,如果是集群部署,需要修改(具体使用内网地址还是外网地址,要依情况而定,目的是api/gateway能访问到)
|
||||
rpcRegisterIP:
|
||||
#默认即可
|
||||
listenIP: 0.0.0.0
|
||||
|
||||
|
||||
api:
|
||||
openImApiPort: [ 10000 ]
|
||||
openImApiPort: [ 10002 ] #api服务端口,默认即可,需要开放此端口或做nginx转发
|
||||
listenIP: 0.0.0.0
|
||||
|
||||
sdk:
|
||||
openImSdkWsPort: [ 30000 ]
|
||||
openImSdkWsPort: [ 10003 ] #jssdk服务端口,默认即可,项目中使用jssdk才需开放此端口或做nginx转发
|
||||
dataDir: [ ../db/sdk/ ]
|
||||
openImWsAddress: ws://127.0.0.1:10001
|
||||
openImApiAddress: http://127.0.0.1:10002
|
||||
|
||||
credential:
|
||||
#对象存储服务,以下配置二选一,目前支持两种,腾讯云和minio,二者配置好其中一种即可(如果使用minio参考https://doc.rentsoft.cn/#/qa/minio搭建minio服务器)
|
||||
credential: #腾讯cos,发送图片、视频、文件时需要,请自行申请后替换,必须修改
|
||||
|
||||
|
||||
object:
|
||||
enable: minio
|
||||
apiURL: http://127.0.0.1:10002/third/object
|
||||
minio: #MinIO 发送图片、视频、文件时需要,请自行申请后替换,必须修改。 客户端初始化InitSDK,中 object_storage参数为minio
|
||||
tempBucket: "openim"
|
||||
dataBucket: "openim"
|
||||
location: us-east-1
|
||||
endpoint: http://127.0.0.1:10005 #minio外网ip 这个ip是给客户端访问的
|
||||
accessKeyID: root
|
||||
secretAccessKey: openIM123
|
||||
isDistributedMod: false # 是否分布式多硬盘部署 默认docker-compose中为false,如果是多硬盘部署,需要修改为true
|
||||
tencent:
|
||||
appID: 1302656840
|
||||
region: ap-chengdu
|
||||
bucket: echat-1302656840
|
||||
secretID: AKIDGNYVChzIQinu7QEgtNp0hnNgqcV8vZTC
|
||||
secretKey: kz15vW83qM6dBUWIq681eBZA0c0vlIbe
|
||||
appID:
|
||||
region:
|
||||
bucket:
|
||||
secretID:
|
||||
secretKey:
|
||||
ali: # ali oss
|
||||
regionID:
|
||||
accessKeyID:
|
||||
accessKeySecret:
|
||||
stsEndpoint:
|
||||
ossEndpoint:
|
||||
bucket:
|
||||
finalHost:
|
||||
stsDurationSeconds:
|
||||
OssRoleArn:
|
||||
aws:
|
||||
accessKeyID: #AssumeRole用户关联的accessKeyID
|
||||
accessKeySecret: #AssumeRole用户关联的accessKeySecrect
|
||||
region: #分区
|
||||
bucket: #桶
|
||||
finalHost: #对外Host
|
||||
roleArn: #RoleArn
|
||||
externalId: #角色扩展Id
|
||||
roleSessionName: #角色SESSION名称
|
||||
|
||||
rpcport: #rpc服务端口 默认即可
|
||||
openImUserPort: [ 10110 ]
|
||||
openImFriendPort: [ 10120 ]
|
||||
openImMessagePort: [ 10130 ]
|
||||
openImMessageGatewayPort: [ 10140 ]
|
||||
openImGroupPort: [ 10150 ]
|
||||
openImAuthPort: [ 10160 ]
|
||||
openImPushPort: [ 10170 ]
|
||||
openImConversationPort: [ 10180 ]
|
||||
openImRtcPort: [ 10190 ]
|
||||
openImThirdPort: [ 10200 ]
|
||||
|
||||
rpcport:
|
||||
openImUserPort: [ 10100 ]
|
||||
openImFriendPort: [ 10200 ]
|
||||
openImOfflineMessagePort: [ 10300]
|
||||
openImOnlineRelayPort: [ 10400 ]
|
||||
openImGroupPort: [ 10500 ]
|
||||
openImAuthPort: [ 10600 ]
|
||||
openImPushPort: [ 10700 ]
|
||||
|
||||
|
||||
rpcregistername:
|
||||
rpcregistername: #rpc注册服务名,默认即可
|
||||
openImUserName: User
|
||||
openImFriendName: Friend
|
||||
openImOfflineMessageName: OfflineMessage
|
||||
openImMsgName: Msg
|
||||
openImPushName: Push
|
||||
openImOnlineMessageRelayName: OnlineMessageRelay
|
||||
openImMessageGatewayName: MessageGateway
|
||||
openImGroupName: Group
|
||||
openImAuthName: Auth
|
||||
openImConversationName: Conversation
|
||||
openImRtcName: Rtc
|
||||
openImThirdName: Third
|
||||
|
||||
log:
|
||||
storageLocation: ../logs/
|
||||
rotationTime: 24
|
||||
remainRotationCount: 5
|
||||
remainRotationCount: 2 #日志数量
|
||||
#日志级别 6表示全都打印,测试阶段建议设置为6
|
||||
remainLogLevel: 6
|
||||
elasticSearchSwitch: false
|
||||
elasticSearchAddr: [ 127.0.0.1:9201 ]
|
||||
elasticSearchUser: ""
|
||||
elasticSearchPassword: ""
|
||||
isStdout: false
|
||||
isJson: false
|
||||
withStack: false
|
||||
|
||||
modulename:
|
||||
modulename: #日志文件按模块命名,默认即可
|
||||
longConnSvrName: msg_gateway
|
||||
msgTransferName: msg_transfer
|
||||
pushName: push
|
||||
|
||||
longconnsvr:
|
||||
openImWsPort: [ 17778 ]
|
||||
openImWsPort: [ 10001 ] # ws服务端口,默认即可,要开放此端口或做nginx转发
|
||||
websocketMaxConnNum: 10000
|
||||
websocketMaxMsgLen: 4096
|
||||
websocketTimeOut: 10
|
||||
|
||||
## 推送只能开启一个 enable代表开启
|
||||
push:
|
||||
tpns:
|
||||
tpns: #腾讯推送,暂未测试 暂不要使用
|
||||
ios:
|
||||
accessID: 1600018281
|
||||
secretKey: 3cd68a77a95b89e5089a1aca523f318f
|
||||
android:
|
||||
accessID: 111
|
||||
secretKey: 111
|
||||
jpns:
|
||||
appKey: cf47465a368f24c659608e7e
|
||||
masterSecret: 02204efe3f3832947a236ee5
|
||||
pushUrl: "https://api.jpush.cn/v3/push"
|
||||
enable: false # true or false (bool)
|
||||
jpns: #极光推送 在极光后台申请后,修改以下四项,必须修改
|
||||
appKey:
|
||||
masterSecret:
|
||||
pushUrl:
|
||||
pushIntent:
|
||||
enable: false # true or false (bool)
|
||||
getui: #个推推送
|
||||
pushUrl: "https://restapi.getui.com/v2/$appId"
|
||||
masterSecret: ""
|
||||
appKey: ""
|
||||
intent: ""
|
||||
enable: false # true or false (bool)
|
||||
channelID: ""
|
||||
channelName: ""
|
||||
fcm: #firebase cloud message 消息推送
|
||||
serviceAccount: "openim-5c6c0-firebase-adminsdk-ppwol-8765884a78.json" #帐号文件,此处需要改修配置,并且这个文件放在 config目录下
|
||||
enable: false
|
||||
|
||||
manager:
|
||||
appManagerUid: ["openIM123456","openIM654321"]
|
||||
secrets: ["openIM1","openIM2"]
|
||||
#app管理员userID和对应的secret 建议修改。 用于管理后台登录,也可以用户管理后台对应的api
|
||||
appManagerUid: [ "openIM123456","openIM654321", "openIM333", "openIMAdmin" ]
|
||||
nickname: [ "系统通知","openIM654321", "openIM333", "openIMAdmin" ]
|
||||
|
||||
|
||||
secret: tuoyun
|
||||
# 多端互踢策略
|
||||
# 1:多平台登录:Android、iOS、Windows、Mac 每种平台只能一个在线,web端可以多个同时在线
|
||||
multiloginpolicy: 1
|
||||
|
||||
multiloginpolicy:
|
||||
onlyOneTerminalAccess: false
|
||||
mobileAndPCTerminalAccessButOtherTerminalKickEachOther: true
|
||||
allTerminalAccess: false
|
||||
#msg log insert to db
|
||||
chatpersistencemysql: true
|
||||
#消息缓存时间
|
||||
msgCacheTimeout: 86400
|
||||
#群聊已读开启
|
||||
groupMessageHasReadReceiptEnable: true
|
||||
#单聊已读开启
|
||||
singleMessageHasReadReceiptEnable: true
|
||||
|
||||
#token config
|
||||
tokenpolicy:
|
||||
accessSecret: "open_im_server"
|
||||
# Token effective time seconds as a unit
|
||||
#Seven days 7*24*60*60
|
||||
accessExpire: 604800
|
||||
accessSecret: "OpenIM_server" #token生成相关,默认即可
|
||||
# Token effective time day as a unit
|
||||
accessExpire: 90 #token过期时间(天) 默认即可
|
||||
messageverify:
|
||||
friendVerify: false
|
||||
|
||||
#ios系统推送声音以及标记计数
|
||||
iospush:
|
||||
pushSound: "xxx"
|
||||
badgeCount: true
|
||||
production: false
|
||||
|
||||
callback:
|
||||
# callback url 需要自行更换callback url
|
||||
callbackUrl: "http://127.0.0.1:10008/callback/open_im"
|
||||
# 开启关闭操作前后回调的配置
|
||||
callbackBeforeSendSingleMsg:
|
||||
enable: false # 回调是否启用
|
||||
callbackTimeOut: 2 # 回调超时时间
|
||||
callbackFailedContinue: true # 回调超时是否继续执行代码
|
||||
callbackAfterSendSingleMsg:
|
||||
enable: false
|
||||
callbackTimeOut: 2
|
||||
callbackBeforeSendGroupMsg:
|
||||
enable: false
|
||||
callbackTimeOut: 2
|
||||
callbackFailedContinue: true
|
||||
callbackAfterSendGroupMsg:
|
||||
enable: false
|
||||
callbackTimeOut: 2
|
||||
callbackMsgModify:
|
||||
enable: false
|
||||
callbackTimeOut: 2
|
||||
callbackFailedContinue: true
|
||||
callbackUserOnline:
|
||||
enable: false
|
||||
callbackTimeOut: 2
|
||||
callbackUserOffline:
|
||||
enable: false
|
||||
callbackTimeOut: 2
|
||||
callbackUserKickOff:
|
||||
enable: false
|
||||
callbackTimeOut: 2
|
||||
callbackOfflinePush:
|
||||
enable: false
|
||||
callbackTimeOut: 2
|
||||
callbackFailedContinue: true # 回调超时是否继续离线推送
|
||||
callbackOnlinePush:
|
||||
enable: false
|
||||
callbackTimeOut: 2
|
||||
callbackFailedContinue: true # 回调超时是否继续离线推送
|
||||
callbackSuperGroupOnlinePush:
|
||||
enable: false
|
||||
callbackTimeOut: 2
|
||||
callbackFailedContinue: true # 回调超时是否继续离线推送
|
||||
callbackBeforeAddFriend:
|
||||
enable: false
|
||||
callbackTimeOut: 2
|
||||
callbackFailedContinue: true # 回调超时是否继续
|
||||
callbackBeforeCreateGroup:
|
||||
enable: false
|
||||
callbackTimeOut: 2
|
||||
callbackFailedContinue: true # 回调超时是否继续
|
||||
callbackBeforeMemberJoinGroup:
|
||||
enable: false
|
||||
callbackTimeOut: 2
|
||||
callbackFailedContinue: true # 回调超时是否继续
|
||||
callbackBeforeSetGroupMemberInfo:
|
||||
enable: false
|
||||
callbackTimeOut: 2
|
||||
callbackFailedContinue: true # 回调超时是否继续
|
||||
callbackSetMessageReactionExtensions:
|
||||
enable: false
|
||||
callbackTimeOut: 2
|
||||
callbackFailedContinue: true # 回调超时是否继续
|
||||
|
||||
# prometheus每个服务监听的端口数量需要和rpc port保持一致
|
||||
prometheus:
|
||||
enable: false
|
||||
userPrometheusPort: [ 20110 ]
|
||||
friendPrometheusPort: [ 20120 ]
|
||||
messagePrometheusPort: [ 20130 ]
|
||||
messageGatewayPrometheusPort: [ 20140 ]
|
||||
groupPrometheusPort: [ 20150 ]
|
||||
authPrometheusPort: [ 20160 ]
|
||||
pushPrometheusPort: [ 20170 ]
|
||||
conversationPrometheusPort: [ 20230 ]
|
||||
rtcPrometheusPort: [ 21300 ]
|
||||
messageTransferPrometheusPort: [ 21400, 21401, 21402, 21403 ] # 端口数量和 script/path_info.cfg msg_transfer_service_num保持一致
|
||||
|
||||
messagecallback:
|
||||
callbackSwitch: false
|
||||
callbackUrl: "http://www.xxx.com/msg/judge"
|
||||
313
config/notification.yaml
Normal file
313
config/notification.yaml
Normal file
@@ -0,0 +1,313 @@
|
||||
groupCreated:
|
||||
isSendMsg: true #是否发送消息,false不发消息为无声的触发同步。true发消息需要触发会话,rpc notification直接发两次,一次消息一次通知, options字段isNotification是否为通知
|
||||
reliabilityLevel: 1 # 1为online才发送 2为必达
|
||||
unreadCount: false # 只在isSendMsg为true的情况下有作用
|
||||
offlinePush:
|
||||
enable: false # 开启该开关
|
||||
title: "create group title" # xx create the group
|
||||
desc: "create group desc"
|
||||
ext: "create group ext"
|
||||
|
||||
# 不加消息contentType,content统一json 结构体使用pb的
|
||||
|
||||
|
||||
groupInfoSet:
|
||||
isSendMsg: false
|
||||
reliabilityLevel: 1
|
||||
unreadCount: false
|
||||
offlinePush:
|
||||
enable: false
|
||||
title: "groupInfoSet title"
|
||||
desc: "groupInfoSet desc"
|
||||
ext: "groupInfoSet ext"
|
||||
|
||||
|
||||
joinGroupApplication:
|
||||
isSendMsg: false
|
||||
reliabilityLevel: 1
|
||||
unreadCount: false
|
||||
offlinePush:
|
||||
enable: false
|
||||
title: "joinGroupApplication title"
|
||||
desc: "joinGroupApplication desc"
|
||||
ext: "joinGroupApplication ext"
|
||||
|
||||
memberQuit:
|
||||
isSendMsg: true
|
||||
reliabilityLevel: 1
|
||||
unreadCount: false
|
||||
offlinePush:
|
||||
enable: false
|
||||
title: "memberQuit title"
|
||||
desc: "memberQuit desc"
|
||||
ext: "memberQuit ext"
|
||||
|
||||
groupApplicationAccepted:
|
||||
isSendMsg: false
|
||||
reliabilityLevel: 1
|
||||
unreadCount: false
|
||||
offlinePush:
|
||||
enable: false
|
||||
title: "groupApplicationAccepted title"
|
||||
desc: "groupApplicationAccepted desc"
|
||||
ext: "groupApplicationAccepted ext"
|
||||
|
||||
groupApplicationRejected:
|
||||
isSendMsg: false
|
||||
reliabilityLevel: 1
|
||||
unreadCount: false
|
||||
offlinePush:
|
||||
enable: false
|
||||
title: " title"
|
||||
desc: " desc"
|
||||
ext: " ext"
|
||||
|
||||
|
||||
groupOwnerTransferred:
|
||||
isSendMsg: true
|
||||
reliabilityLevel: 1
|
||||
unreadCount: false
|
||||
offlinePush:
|
||||
enable: false
|
||||
title: "groupOwnerTransferred title"
|
||||
desc: "groupOwnerTransferred desc"
|
||||
ext: "groupOwnerTransferred ext"
|
||||
|
||||
memberKicked:
|
||||
isSendMsg: true
|
||||
reliabilityLevel: 1
|
||||
unreadCount: false
|
||||
offlinePush:
|
||||
enable: false
|
||||
title: "memberKicked title"
|
||||
desc: "memberKicked desc"
|
||||
ext: "memberKicked ext"
|
||||
|
||||
memberInvited:
|
||||
isSendMsg: true
|
||||
reliabilityLevel: 1
|
||||
unreadCount: false
|
||||
offlinePush:
|
||||
enable: false
|
||||
title: "memberInvited title"
|
||||
desc: "memberInvited desc"
|
||||
ext: "memberInvited ext"
|
||||
|
||||
memberEnter:
|
||||
isSendMsg: true
|
||||
reliabilityLevel: 1
|
||||
unreadCount: false
|
||||
offlinePush:
|
||||
enable: false
|
||||
title: "memberEnter title"
|
||||
desc: "memberEnter desc"
|
||||
ext: "memberEnter ext"
|
||||
|
||||
groupDismissed:
|
||||
isSendMsg: true
|
||||
reliabilityLevel: 1
|
||||
unreadCount: false
|
||||
offlinePush:
|
||||
enable: false
|
||||
title: "groupDismissed title"
|
||||
desc: "groupDismissed desc"
|
||||
ext: "groupDismissed ext"
|
||||
|
||||
groupMuted:
|
||||
isSendMsg: true
|
||||
reliabilityLevel: 1
|
||||
unreadCount: false
|
||||
offlinePush:
|
||||
enable: false
|
||||
title: "groupMuted title"
|
||||
desc: "groupMuted desc"
|
||||
ext: "groupMuted ext"
|
||||
|
||||
groupCancelMuted:
|
||||
isSendMsg: true
|
||||
reliabilityLevel: 1
|
||||
unreadCount: false
|
||||
offlinePush:
|
||||
enable: false
|
||||
title: "groupCancelMuted title"
|
||||
desc: "groupCancelMuted desc"
|
||||
ext: "groupCancelMuted ext"
|
||||
defaultTips:
|
||||
tips: "group Cancel Muted"
|
||||
|
||||
|
||||
groupMemberMuted:
|
||||
isSendMsg: true
|
||||
reliabilityLevel: 1
|
||||
unreadCount: false
|
||||
offlinePush:
|
||||
enable: false
|
||||
title: "groupMemberMuted title"
|
||||
desc: "groupMemberMuted desc"
|
||||
ext: "groupMemberMuted ext"
|
||||
|
||||
groupMemberCancelMuted:
|
||||
isSendMsg: true
|
||||
reliabilityLevel: 1
|
||||
unreadCount: false
|
||||
offlinePush:
|
||||
enable: false
|
||||
title: "groupMemberCancelMuted title"
|
||||
desc: "groupMemberCancelMuted desc"
|
||||
ext: "groupMemberCancelMuted ext"
|
||||
|
||||
groupMemberInfoSet:
|
||||
isSendMsg: false
|
||||
reliabilityLevel: 1
|
||||
unreadCount: false
|
||||
offlinePush:
|
||||
enable: false
|
||||
title: "groupMemberInfoSet title"
|
||||
desc: "groupMemberInfoSet desc"
|
||||
ext: "groupMemberInfoSet ext"
|
||||
|
||||
groupInfoSetAnnouncement:
|
||||
isSendMsg: true
|
||||
reliabilityLevel: 1
|
||||
unreadCount: false
|
||||
offlinePush:
|
||||
enable: false
|
||||
title: "groupInfoSetAnnouncement title"
|
||||
desc: "groupInfoSetAnnouncement desc"
|
||||
ext: "groupInfoSetAnnouncement ext"
|
||||
|
||||
|
||||
groupInfoSetName:
|
||||
isSendMsg: true
|
||||
reliabilityLevel: 1
|
||||
unreadCount: false
|
||||
offlinePush:
|
||||
enable: false
|
||||
title: "groupInfoSetName title"
|
||||
desc: "groupInfoSetName desc"
|
||||
ext: "groupInfoSetName ext"
|
||||
|
||||
|
||||
#############################friend#################################
|
||||
friendApplicationAdded:
|
||||
isSendMsg: false
|
||||
reliabilityLevel: 1
|
||||
unreadCount: false
|
||||
offlinePush:
|
||||
enable: false
|
||||
title: "Somebody applies to add you as a friend"
|
||||
desc: "Somebody applies to add you as a friend"
|
||||
ext: "Somebody applies to add you as a friend"
|
||||
|
||||
friendApplicationApproved:
|
||||
isSendMsg: true
|
||||
reliabilityLevel: 1
|
||||
unreadCount: false
|
||||
offlinePush:
|
||||
enable: true
|
||||
title: "Someone applies to add your friend application"
|
||||
desc: "Someone applies to add your friend application"
|
||||
ext: "Someone applies to add your friend application"
|
||||
|
||||
friendApplicationRejected:
|
||||
isSendMsg: false
|
||||
reliabilityLevel: 1
|
||||
unreadCount: false
|
||||
offlinePush:
|
||||
enable: true
|
||||
title: "Someone rejected your friend application"
|
||||
desc: "Someone rejected your friend application"
|
||||
ext: "Someone rejected your friend application"
|
||||
|
||||
friendAdded:
|
||||
isSendMsg: false
|
||||
reliabilityLevel: 1
|
||||
unreadCount: false
|
||||
offlinePush:
|
||||
enable: true
|
||||
title: "We have become friends"
|
||||
desc: "We have become friends"
|
||||
ext: "We have become friends"
|
||||
|
||||
friendDeleted:
|
||||
isSendMsg: false
|
||||
reliabilityLevel: 1
|
||||
unreadCount: false
|
||||
offlinePush:
|
||||
enable: true
|
||||
title: "deleted a friend"
|
||||
desc: "deleted a friend"
|
||||
ext: "deleted a friend"
|
||||
|
||||
friendRemarkSet:
|
||||
isSendMsg: false
|
||||
reliabilityLevel: 1
|
||||
unreadCount: false
|
||||
offlinePush:
|
||||
enable: true
|
||||
title: "Your friend's profile has been changed"
|
||||
desc: "Your friend's profile has been changed"
|
||||
ext: "Your friend's profile has been changed"
|
||||
|
||||
blackAdded:
|
||||
isSendMsg: false
|
||||
reliabilityLevel: 1
|
||||
unreadCount: false
|
||||
offlinePush:
|
||||
enable: true
|
||||
title: "blocked a user"
|
||||
desc: "blocked a user"
|
||||
ext: "blocked a user"
|
||||
|
||||
blackDeleted:
|
||||
isSendMsg: false
|
||||
reliabilityLevel: 1
|
||||
unreadCount: false
|
||||
offlinePush:
|
||||
enable: true
|
||||
title: "Remove a blocked user"
|
||||
desc: "Remove a blocked user"
|
||||
ext: "Remove a blocked user"
|
||||
|
||||
friendInfoUpdated:
|
||||
isSendMsg: false
|
||||
reliabilityLevel: 1
|
||||
unreadCount: false
|
||||
offlinePush:
|
||||
enable: true
|
||||
title: "friend info updated"
|
||||
desc: "friend info updated"
|
||||
ext: "friend info updated"
|
||||
|
||||
#####################user#########################
|
||||
userInfoUpdated:
|
||||
isSendMsg: false
|
||||
reliabilityLevel: 1
|
||||
unreadCount: false
|
||||
offlinePush:
|
||||
enable: true
|
||||
title: "Remove a blocked user"
|
||||
desc: "Remove a blocked user"
|
||||
ext: "Remove a blocked user"
|
||||
|
||||
#####################conversation#########################
|
||||
conversationChanged:
|
||||
isSendMsg: false
|
||||
reliabilityLevel: 1
|
||||
unreadCount: false
|
||||
offlinePush:
|
||||
enable: true
|
||||
title: "conversation changed"
|
||||
desc: "conversation changed"
|
||||
ext: "conversation changed"
|
||||
|
||||
conversationSetPrivate:
|
||||
isSendMsg: true
|
||||
reliabilityLevel: 1
|
||||
unreadCount: false
|
||||
offlinePush:
|
||||
enable: true
|
||||
title: "burn after reading"
|
||||
desc: "burn after reading"
|
||||
ext: "burn after reading"
|
||||
|
||||
194
config/open-im-ng-example.conf
Normal file
194
config/open-im-ng-example.conf
Normal file
@@ -0,0 +1,194 @@
|
||||
upstream im_msg_gateway{
|
||||
server 127.0.0.1:10001; #IM消息服务器地址 根据部署情况可指定多台
|
||||
}
|
||||
upstream im_api{
|
||||
server 127.0.0.1:10002; #IM群组用户api服务器地址 根据部署情况可指定多台
|
||||
}
|
||||
upstream im_jssdk_gateway{
|
||||
server 127.0.0.1:10003; #IM jssdk服务器地址 根据部署情况可指定多台
|
||||
}
|
||||
upstream storage {
|
||||
server 127.0.0.1:10005; #MinIO服务器地址 暂时支持1台
|
||||
}
|
||||
upstream im_admin{
|
||||
server 127.0.0.1:10006; #IM admin服务器地址 根据部署情况可指定多台
|
||||
}
|
||||
upstream im_grafana{
|
||||
server 127.0.0.1:10007; #IM 统计服务器地址 docker-compose启动所在机器
|
||||
}
|
||||
upstream im_chat{
|
||||
server 127.0.0.1:10008; #IM 商业版登录注册服务器地址 根据部署情况可指定多台
|
||||
}
|
||||
upstream im_complete_admin{
|
||||
server 127.0.0.1:10009; #IM 商业版admin地址 根据部署情况可指定多台
|
||||
}
|
||||
upstream im_organization{
|
||||
server 127.0.0.1:10010; #IM 商业版组织架构服务器地址 根据部署情况可指定多台
|
||||
}
|
||||
upstream im_open_rtc{
|
||||
server 127.0.0.1:7880; #rtc 音视频通话 服务器地址 根据部署情况可指定多台
|
||||
}
|
||||
|
||||
server {
|
||||
listen 443;
|
||||
server_name web.rentsoft.cn; #1 web im 端 域名
|
||||
|
||||
ssl on;
|
||||
ssl_certificate /etc/nginx/conf.d/ssl/web.rentsoft.cn.crt; #2 证书
|
||||
ssl_certificate_key /etc/nginx/conf.d/ssl/web.rentsoft.cn.key; #3 证书
|
||||
ssl_session_timeout 5m;
|
||||
gzip on;
|
||||
gzip_min_length 1k;
|
||||
gzip_buffers 4 16k;
|
||||
gzip_comp_level 2;
|
||||
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png application/wasm;
|
||||
gzip_vary off;
|
||||
gzip_disable "MSIE [1-6]\.";
|
||||
error_page 405 =200 $uri;
|
||||
|
||||
default_type application/wasm;
|
||||
location /{ #web demo
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-Ip $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $remote_addr;
|
||||
proxy_set_header X-NginX-Proxy true;
|
||||
root /data1/online/Pc-Web-Demo/build/; # web im静态资源存放路径
|
||||
index index.html;
|
||||
try_files $uri $uri/ /index.html;
|
||||
}
|
||||
location /msg_gateway { #10001 ws
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "Upgrade";
|
||||
proxy_set_header X-real-ip $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $remote_addr;
|
||||
proxy_pass http://im_msg_gateway/;
|
||||
}
|
||||
location ^~/api/ { #10002 api
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "Upgrade";
|
||||
proxy_set_header X-real-ip $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $remote_addr;
|
||||
proxy_pass http://im_api/;
|
||||
}
|
||||
location /jssdk_gateway { #10003 jssdk
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "Upgrade";
|
||||
proxy_set_header X-real-ip $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $remote_addr;
|
||||
proxy_pass http://im_jssdk_gateway/;
|
||||
}
|
||||
location ^~/admin/ { #10006 admin
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "Upgrade";
|
||||
proxy_set_header X-real-ip $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $remote_addr;
|
||||
proxy_pass http://im_admin/;
|
||||
}
|
||||
location ^~/grafana/ { #10007 prometheus
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "Upgrade";
|
||||
proxy_set_header X-real-ip $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $remote_addr;
|
||||
proxy_pass http://im_grafana/;
|
||||
}
|
||||
location ^~/chat/ { #10008 chat login
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "Upgrade";
|
||||
proxy_set_header X-real-ip $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $remote_addr;
|
||||
proxy_pass http://im_chat/;
|
||||
}
|
||||
location ^~/complete_admin/ { #10009 admin
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "Upgrade";
|
||||
proxy_set_header X-real-ip $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $remote_addr;
|
||||
proxy_pass http://im_complete_admin/;
|
||||
}
|
||||
location ^~/organization/ { #10010 organization
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "Upgrade";
|
||||
proxy_set_header X-real-ip $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $remote_addr;
|
||||
proxy_pass http://im_organization/;
|
||||
}
|
||||
location ^~/open_rtc/ { #7880 rtc
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "Upgrade";
|
||||
proxy_set_header X-real-ip $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $remote_addr;
|
||||
proxy_pass http://im_open_rtc/;
|
||||
}
|
||||
}
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
server_name web.rentsoft.cn ; #1 web im 端 域名
|
||||
rewrite ^(.*)$ https://${server_name}$1 permanent;
|
||||
}
|
||||
|
||||
server {
|
||||
ssl_session_timeout 5m;
|
||||
listen 443;
|
||||
server_name storage.rentsoft.cn; #1 MinIO存储域名
|
||||
ssl on;
|
||||
ssl_certificate /etc/nginx/conf.d/ssl/storage.rentsoft.cn.crt; #证书
|
||||
ssl_certificate_key /etc/nginx/conf.d/ssl/storage.rentsoft.cn.key; #证书
|
||||
gzip on;
|
||||
gzip_min_length 1k;
|
||||
gzip_buffers 4 16k;
|
||||
gzip_comp_level 2;
|
||||
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
|
||||
gzip_vary off;
|
||||
gzip_disable "MSIE [1-6]\.";
|
||||
location / {
|
||||
proxy_pass http://storage;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header Host $http_host;
|
||||
proxy_http_version 1.1;
|
||||
client_max_body_size 8000M;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
server {
|
||||
listen 443;
|
||||
server_name admin.rentsoft.cn; #后台管理域名
|
||||
ssl on;
|
||||
ssl_certificate /etc/nginx/conf.d/ssl/admin.rentsoft.cn.crt; # 证书
|
||||
ssl_certificate_key /etc/nginx/conf.d/ssl/admin.rentsoft.cn.key; #证书
|
||||
ssl_session_timeout 5m;
|
||||
gzip on;
|
||||
gzip_min_length 1k;
|
||||
gzip_buffers 4 16k;
|
||||
gzip_comp_level 2;
|
||||
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
|
||||
gzip_vary off;
|
||||
gzip_disable "MSIE [1-6]\.";
|
||||
location / {
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-Ip $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $remote_addr;
|
||||
proxy_set_header X-NginX-Proxy true;
|
||||
root /data1/online/Open-IM-Admin/dist/; #管理后台web静态资源存放路径
|
||||
index index.html;
|
||||
try_files $uri $uri/ /index.html;
|
||||
}
|
||||
}
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
server_name admin.rentsoft.cn; #管理后台 域名
|
||||
rewrite ^(.*)$ https://${server_name}$1 permanent;
|
||||
}
|
||||
139
docker-compose-mongos.yaml
Normal file
139
docker-compose-mongos.yaml
Normal file
@@ -0,0 +1,139 @@
|
||||
version: "3"
|
||||
#fixme Clone openIM Server project before using docker-compose,project address:https://github.com/OpenIMSDK/Open-IM-Server.git
|
||||
|
||||
services:
|
||||
mysql:
|
||||
image: mysql:5.7
|
||||
ports:
|
||||
- 13306:3306
|
||||
- 23306:33060
|
||||
container_name: mysql
|
||||
volumes:
|
||||
- ./components/mysql/data:/var/lib/mysql
|
||||
- /etc/localtime:/etc/localtime
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: openIM
|
||||
restart: always
|
||||
|
||||
mongos:
|
||||
image: mongo:latest
|
||||
ports:
|
||||
- 37017:27017
|
||||
container_name: mongos
|
||||
command: mongos --configdb config/103.116.45.174:27019 --bind_ip_all
|
||||
volumes:
|
||||
- ./components/mongos_mongodb/data/db:/data/db
|
||||
- ./components/mongos_mongodb/data/logs:/data/logs
|
||||
- ./components/mongos_mongodb/data/conf:/etc/mongo
|
||||
- ./components/mongos_mongodb/data/configdb:/data/configdb
|
||||
environment:
|
||||
- TZ=Asia/Shanghai
|
||||
# cache
|
||||
- wiredTigerCacheSizeGB=1
|
||||
# environment:
|
||||
# - MONGO_INITDB_ROOT_USERNAME=openIM
|
||||
# - MONGO_INITDB_ROOT_PASSWORD=openIM
|
||||
|
||||
|
||||
#TZ: Asia/Shanghai
|
||||
restart: always
|
||||
|
||||
|
||||
redis:
|
||||
image: redis
|
||||
ports:
|
||||
- 16379:6379
|
||||
container_name: redis
|
||||
volumes:
|
||||
- ./components/redis/data:/data
|
||||
#redis config file
|
||||
- ./components/redis/config/redis.conf:/usr/local/redis/config/redis.conf
|
||||
environment:
|
||||
TZ: Asia/Shanghai
|
||||
restart: always
|
||||
sysctls:
|
||||
net.core.somaxconn: 1024
|
||||
command: redis-server --requirepass openIM --appendonly yes
|
||||
|
||||
|
||||
zookeeper:
|
||||
image: wurstmeister/zookeeper
|
||||
ports:
|
||||
- 2181:2181
|
||||
container_name: zookeeper
|
||||
volumes:
|
||||
- /etc/localtime:/etc/localtime
|
||||
environment:
|
||||
TZ: Asia/Shanghai
|
||||
restart: always
|
||||
|
||||
|
||||
kafka:
|
||||
image: wurstmeister/kafka
|
||||
container_name: kafka
|
||||
restart: always
|
||||
ports:
|
||||
- 9092:9092
|
||||
environment:
|
||||
TZ: Asia/Shanghai
|
||||
KAFKA_BROKER_ID: 0
|
||||
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
|
||||
KAFKA_CREATE_TOPICS: "ws2ms_chat:8:1,ms2ps_chat:8:1,msg_to_mongo:8:1"
|
||||
KAFKA_ADVERTISED_LISTENERS: INSIDE://127.0.0.1:9092,OUTSIDE://103.116.45.174:9092
|
||||
KAFKA_LISTENERS: INSIDE://:9092,OUTSIDE://:9093
|
||||
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: "INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT"
|
||||
KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
|
||||
depends_on:
|
||||
- zookeeper
|
||||
|
||||
etcd:
|
||||
image: quay.io/coreos/etcd
|
||||
ports:
|
||||
- 2379:2379
|
||||
- 2380:2380
|
||||
container_name: etcd
|
||||
volumes:
|
||||
- /etc/timezone:/etc/timezone
|
||||
- /etc/localtime:/etc/localtime
|
||||
environment:
|
||||
ETCDCTL_API: 3
|
||||
restart: always
|
||||
command: /usr/local/bin/etcd --name etcd0 --data-dir /etcd-data --listen-client-urls http://0.0.0.0:2379 --advertise-client-urls http://0.0.0.0:2379 --listen-peer-urls http://0.0.0.0:2380 --initial-advertise-peer-urls http://0.0.0.0:2380 --initial-cluster etcd0=http://0.0.0.0:2380 --initial-cluster-token tkn --initial-cluster-state new
|
||||
|
||||
minio:
|
||||
image: minio/minio
|
||||
ports:
|
||||
- 10005:9000
|
||||
- 9090:9090
|
||||
container_name: minio
|
||||
volumes:
|
||||
- /mnt/data:/data
|
||||
- /mnt/config:/root/.minio
|
||||
environment:
|
||||
MINIO_ROOT_USER: user12345
|
||||
MINIO_ROOT_PASSWORD: key12345
|
||||
restart: always
|
||||
command: minio server /data --console-address ':9090'
|
||||
|
||||
open_im_server:
|
||||
image: openim/open_im_server:v2.3.0-rc1
|
||||
container_name: open_im_server
|
||||
volumes:
|
||||
- ./logs:/Open-IM-Server/logs
|
||||
- ./config/config.yaml:/Open-IM-Server/config/config.yaml
|
||||
- ./db/sdk:/Open-IM-Server/db/sdk
|
||||
- ./script:/Open-IM-Server/script
|
||||
restart: always
|
||||
depends_on:
|
||||
- kafka
|
||||
- mysql
|
||||
- mongos
|
||||
- redis
|
||||
- etcd
|
||||
- minio
|
||||
network_mode: "host"
|
||||
logging:
|
||||
driver: json-file
|
||||
options:
|
||||
max-size: "1g"
|
||||
max-file: "2"
|
||||
113
docker-compose-shard-cluster.yaml
Normal file
113
docker-compose-shard-cluster.yaml
Normal file
@@ -0,0 +1,113 @@
|
||||
version: '3'
|
||||
networks:
|
||||
mongo-network:
|
||||
external: false
|
||||
services:
|
||||
# 配置服务器configsvr
|
||||
config:
|
||||
image: mongo:latest
|
||||
networks:
|
||||
- mongo-network
|
||||
container_name: config
|
||||
restart: always
|
||||
ports:
|
||||
- 27019:27019
|
||||
command: --configsvr --replSet "config" --bind_ip_all
|
||||
volumes:
|
||||
- ./components/config_mongodb/data/db:/data/db
|
||||
- ./components/config_mongodb/data/logs:/data/logs
|
||||
- ./components/config_mongodb/data/conf:/etc/mongo
|
||||
- ./components/config_mongodb/data/configdb:/data/configdb
|
||||
environment:
|
||||
- TZ=Asia/Shanghai
|
||||
# cache
|
||||
- wiredTigerCacheSizeGB=1
|
||||
|
||||
# shard分片1
|
||||
shard1:
|
||||
image: mongo:latest
|
||||
networks:
|
||||
- mongo-network
|
||||
container_name: shard1
|
||||
restart: always
|
||||
ports:
|
||||
- 27118:27018
|
||||
command: --shardsvr --replSet "shard1" --bind_ip_all
|
||||
volumes:
|
||||
- /data01/mongo/shard1/db:/data/db
|
||||
- /data01/mongo/shard1/configdb:/data/configdb
|
||||
environment:
|
||||
- TZ=Asia/Shanghai
|
||||
# cache
|
||||
- wiredTigerCacheSizeGB=1
|
||||
|
||||
# shard分片2
|
||||
shard2:
|
||||
image: mongo:latest
|
||||
networks:
|
||||
- mongo-network
|
||||
container_name: shard2
|
||||
restart: always
|
||||
ports:
|
||||
- 27218:27018
|
||||
command: --shardsvr --replSet "shard2" --bind_ip_all
|
||||
volumes:
|
||||
- /data02/mongo/shard2/db:/data/db
|
||||
- /data02/mongo/shard2/configdb:/data/configdb
|
||||
environment:
|
||||
- TZ=Asia/Shanghai
|
||||
# cache
|
||||
- wiredTigerCacheSizeGB=1
|
||||
# - ${PWD}/key.file:/data/mongodb/key.file
|
||||
|
||||
# shard分片3
|
||||
shard3:
|
||||
image: mongo:latest
|
||||
networks:
|
||||
- mongo-network
|
||||
container_name: shard3
|
||||
restart: always
|
||||
ports:
|
||||
- 27318:27018
|
||||
command: --shardsvr --replSet "shard3" --bind_ip_all
|
||||
volumes:
|
||||
- /data03/mongo/shard3/db:/data/db
|
||||
- /data03/mongo/shard3/configdb:/data/configdb
|
||||
environment:
|
||||
- TZ=Asia/Shanghai
|
||||
# cache
|
||||
- wiredTigerCacheSizeGB=1
|
||||
# shard分片4
|
||||
shard4:
|
||||
image: mongo:latest
|
||||
networks:
|
||||
- mongo-network
|
||||
container_name: shard4
|
||||
restart: always
|
||||
ports:
|
||||
- 27418:27018
|
||||
command: --shardsvr --replSet "shard4" --bind_ip_all
|
||||
volumes:
|
||||
- /data04/mongo/shard4/db:/data/db
|
||||
- /data04/mongo/shard4/configdb:/data/configdb
|
||||
environment:
|
||||
- TZ=Asia/Shanghai
|
||||
# cache
|
||||
- wiredTigerCacheSizeGB=1
|
||||
# shard分片5
|
||||
shard5:
|
||||
image: mongo:latest
|
||||
networks:
|
||||
- mongo-network
|
||||
container_name: shard5
|
||||
restart: always
|
||||
ports:
|
||||
- 27518:27018
|
||||
command: --shardsvr --replSet "shard5" --bind_ip_all
|
||||
volumes:
|
||||
- /data05/mongo/shard5/db:/data/db
|
||||
- /data05/mongo/shard5/configdb:/data/configdb
|
||||
environment:
|
||||
- TZ=Asia/Shanghai
|
||||
# cache
|
||||
- wiredTigerCacheSizeGB=1
|
||||
@@ -1,49 +1,60 @@
|
||||
version: "3"
|
||||
#fixme Clone openIM Server project before using docker-compose,project address:https://github.com/OpenIMSDK/Open-IM-Server.git
|
||||
|
||||
version: "3"
|
||||
services:
|
||||
mysql:
|
||||
image: mysql:5.7
|
||||
ports:
|
||||
- 3306:3306
|
||||
- 13306:3306
|
||||
- 23306:33060
|
||||
container_name: mysql
|
||||
volumes:
|
||||
- ./components/mysql/data:/var/lib/mysql
|
||||
- ${DATA_DIR}/components/mysql/data:/var/lib/mysql
|
||||
- /etc/localtime:/etc/localtime
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: openIM
|
||||
MYSQL_ROOT_PASSWORD: ${PASSWORD}
|
||||
restart: always
|
||||
|
||||
mongodb:
|
||||
image: mongo
|
||||
image: mongo:4.0
|
||||
ports:
|
||||
- 27017:27017
|
||||
- 37017:27017
|
||||
container_name: mongo
|
||||
command: --wiredTigerCacheSizeGB 1 --auth
|
||||
volumes:
|
||||
- ./components/mongodb/data:/data/db
|
||||
- ${DATA_DIR}/components/mongodb/data/db:/data/db
|
||||
- ${DATA_DIR}/components/mongodb/data/logs:/data/logs
|
||||
- ${DATA_DIR}/components/mongodb/data/conf:/etc/mongo
|
||||
- ./script/mongo-init.sh:/docker-entrypoint-initdb.d/mongo-init.sh:ro
|
||||
environment:
|
||||
TZ: Asia/Shanghai
|
||||
- TZ=Asia/Shanghai
|
||||
# cache
|
||||
- wiredTigerCacheSizeGB=1
|
||||
- MONGO_INITDB_ROOT_USERNAME=${USER}
|
||||
- MONGO_INITDB_ROOT_PASSWORD=${PASSWORD}
|
||||
- MONGO_INITDB_DATABASE=openIM
|
||||
- MONGO_USERNAME=${USER}
|
||||
- MONGO_PASSWORD=${PASSWORD}
|
||||
restart: always
|
||||
|
||||
redis:
|
||||
image: redis
|
||||
ports:
|
||||
- 6379:6379
|
||||
- 16379:6379
|
||||
container_name: redis
|
||||
volumes:
|
||||
- ./components/redis/data:/data
|
||||
- ${DATA_DIR}/components/redis/data:/data
|
||||
#redis config file
|
||||
#- ./components/redis/config/redis.conf:/usr/local/redis/config/redis.conf
|
||||
- ${DATA_DIR}/components/redis/config/redis.conf:/usr/local/redis/config/redis.conf
|
||||
environment:
|
||||
TZ: Asia/Shanghai
|
||||
restart: always
|
||||
sysctls:
|
||||
net.core.somaxconn: 1024
|
||||
command: redis-server --requirepass openIM --appendonly yes
|
||||
command: redis-server --requirepass ${PASSWORD} --appendonly yes
|
||||
|
||||
|
||||
zookeeper:
|
||||
image: wurstmeister/zookeeper
|
||||
image: zookeeper
|
||||
ports:
|
||||
- 2181:2181
|
||||
container_name: zookeeper
|
||||
@@ -58,72 +69,107 @@ services:
|
||||
image: wurstmeister/kafka
|
||||
container_name: kafka
|
||||
restart: always
|
||||
ports:
|
||||
- 9092:9092
|
||||
environment:
|
||||
TZ: Asia/Shanghai
|
||||
KAFKA_BROKER_ID: 0
|
||||
KAFKA_ZOOKEEPER_CONNECT: 127.0.0.1:2181
|
||||
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://127.0.0.1:9092
|
||||
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
|
||||
network_mode: "host"
|
||||
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
|
||||
KAFKA_CREATE_TOPICS: "ws2ms_chat:8:1,ms2ps_chat:8:1,msg_to_mongo:8:1"
|
||||
KAFKA_ADVERTISED_LISTENERS: INSIDE://127.0.0.1:9092,OUTSIDE://103.116.45.174:9092
|
||||
KAFKA_LISTENERS: INSIDE://:9092,OUTSIDE://:9093
|
||||
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: "INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT"
|
||||
KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
|
||||
depends_on:
|
||||
- zookeeper
|
||||
|
||||
etcd:
|
||||
image: quay.io/coreos/etcd
|
||||
minio:
|
||||
image: minio/minio
|
||||
ports:
|
||||
- 2379:2379
|
||||
- 2380:2380
|
||||
container_name: etcd
|
||||
- 10005:9000
|
||||
- 9090:9090
|
||||
container_name: minio
|
||||
volumes:
|
||||
- /etc/timezone:/etc/timezone
|
||||
- /etc/localtime:/etc/localtime
|
||||
- /mnt/data:/data
|
||||
- /mnt/config:/root/.minio
|
||||
environment:
|
||||
ETCDCTL_API: 3
|
||||
MINIO_ROOT_USER: ${USER}
|
||||
MINIO_ROOT_PASSWORD: ${PASSWORD}
|
||||
restart: always
|
||||
command: /usr/local/bin/etcd --name etcd0 --data-dir /etcd-data --listen-client-urls http://0.0.0.0:2379 --advertise-client-urls http://0.0.0.0:2379 --listen-peer-urls http://0.0.0.0:2380 --initial-advertise-peer-urls http://0.0.0.0:2380 --initial-cluster etcd0=http://0.0.0.0:2380 --initial-cluster-token tkn --initial-cluster-state new
|
||||
command: minio server /data --console-address ':9090'
|
||||
|
||||
|
||||
#fixme-----build from dockerfile---------
|
||||
# open-im-server:
|
||||
# image: open_im_server
|
||||
# container_name: open-im-server
|
||||
# volumes:
|
||||
# - ./logs:/Open-IM-Server/logs
|
||||
# - ./config/config.yaml:/Open-IM-Server/config/config.yaml
|
||||
# restart: always
|
||||
# build:
|
||||
# context: .
|
||||
# dockerfile: deploy.Dockerfile
|
||||
# depends_on:
|
||||
# - mysql
|
||||
# - mongodb
|
||||
# - redis
|
||||
# - kafka
|
||||
# - etcd
|
||||
# network_mode: "host"
|
||||
# logging:
|
||||
# driver: json-file
|
||||
# options:
|
||||
# max-size: "1g"
|
||||
# max-file: "2"
|
||||
|
||||
#fixme----build from docker hub------
|
||||
open-im-server:
|
||||
image: lyt1123/open_im_server
|
||||
container_name: open-im-server
|
||||
open_im_server:
|
||||
image: openim/open_im_server:v3.0.0
|
||||
container_name: open_im_server
|
||||
volumes:
|
||||
- ./logs:/Open-IM-Server/logs
|
||||
- ./config/config.yaml:/Open-IM-Server/config/config.yaml
|
||||
- ./config/notification.yaml:/Open-IM-Server/config/notification.yaml
|
||||
- ${DATA_DIR}/db/sdk:/Open-IM-Server/db/sdk
|
||||
- ./script:/Open-IM-Server/script
|
||||
restart: always
|
||||
depends_on:
|
||||
- kafka
|
||||
- mysql
|
||||
- mongodb
|
||||
- redis
|
||||
- etcd
|
||||
- minio
|
||||
network_mode: "host"
|
||||
logging:
|
||||
driver: json-file
|
||||
options:
|
||||
max-size: "1g"
|
||||
max-file: "2"
|
||||
|
||||
open_im_enterprise:
|
||||
image: openim/open_im_enterprise:v1.0.2
|
||||
container_name: open_im_enterprise
|
||||
volumes:
|
||||
- ./logs:/Open-IM-Enterprise/logs
|
||||
- ./.docker-compose_cfg/config.yaml:/Open-IM-Enterprise/config/config.yaml
|
||||
restart: always
|
||||
depends_on:
|
||||
- mysql
|
||||
- mongodb
|
||||
- redis
|
||||
- minio
|
||||
- open_im_server
|
||||
network_mode: "host"
|
||||
logging:
|
||||
driver: json-file
|
||||
options:
|
||||
max-size: "1g"
|
||||
max-file: "2"
|
||||
environment:
|
||||
CONFIG_NAME: "/Open-IM-Enterprise"
|
||||
|
||||
prometheus:
|
||||
image: prom/prometheus
|
||||
volumes:
|
||||
- ./.docker-compose_cfg/prometheus-compose.yml:/etc/prometheus/prometheus.yml
|
||||
container_name: prometheus
|
||||
# ports:
|
||||
# - 9091:9091
|
||||
depends_on:
|
||||
- open_im_server
|
||||
command: --web.listen-address=:9091 --config.file="/etc/prometheus/prometheus.yml"
|
||||
network_mode: "host"
|
||||
|
||||
grafana:
|
||||
image: grafana/grafana
|
||||
volumes:
|
||||
- ./.docker-compose_cfg/datasource-compose.yaml:/etc/grafana/provisioning/datasources/datasource.yaml
|
||||
- ./.docker-compose_cfg/grafana.ini:/etc/grafana/grafana.ini
|
||||
- ./.docker-compose_cfg/node-exporter-full_rev1.json:/var/lib/grafana/dashboards/node-exporter-full_rev1.json
|
||||
container_name: grafana
|
||||
depends_on:
|
||||
- prometheus
|
||||
network_mode: "host"
|
||||
|
||||
# node-exporter:
|
||||
# image: quay.io/prometheus/node-exporter
|
||||
# container_name: node-exporter
|
||||
# restart: always
|
||||
# ports:
|
||||
# - "9100:9100"
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 21 KiB |
BIN
docs/Wechat.jpg
BIN
docs/Wechat.jpg
Binary file not shown.
|
Before Width: | Height: | Size: 208 KiB After Width: | Height: | Size: 144 KiB |
163
go.mod
163
go.mod
@@ -1,47 +1,140 @@
|
||||
module Open_IM
|
||||
module github.com/OpenIMSDK/Open-IM-Server
|
||||
|
||||
go 1.15
|
||||
go 1.18
|
||||
|
||||
require (
|
||||
github.com/Shopify/sarama v1.19.0
|
||||
github.com/Shopify/toxiproxy v2.1.4+incompatible // indirect
|
||||
github.com/antonfisher/nested-logrus-formatter v1.3.0
|
||||
github.com/coreos/go-semver v0.3.0 // indirect
|
||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible
|
||||
firebase.google.com/go v3.13.0+incompatible
|
||||
github.com/OpenIMSDK/open_utils v1.0.8
|
||||
github.com/Shopify/sarama v1.32.0
|
||||
github.com/bwmarrin/snowflake v0.3.0
|
||||
github.com/dtm-labs/rockscache v0.1.1
|
||||
github.com/gin-gonic/gin v1.9.1
|
||||
github.com/go-playground/validator/v10 v10.14.0
|
||||
github.com/gogo/protobuf v1.3.2
|
||||
github.com/golang-jwt/jwt/v4 v4.4.2
|
||||
github.com/golang/protobuf v1.5.3
|
||||
github.com/gorilla/websocket v1.4.2
|
||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0
|
||||
github.com/jinzhu/copier v0.3.5
|
||||
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible
|
||||
github.com/minio/minio-go/v7 v7.0.22
|
||||
github.com/mitchellh/mapstructure v1.4.2
|
||||
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646
|
||||
github.com/pkg/errors v0.9.1
|
||||
github.com/prometheus/client_golang v1.13.0
|
||||
github.com/robfig/cron/v3 v3.0.1
|
||||
github.com/sirupsen/logrus v1.9.0 // indirect
|
||||
github.com/stretchr/testify v1.8.3
|
||||
github.com/tencentyun/qcloud-cos-sts-sdk v0.0.0-20210325043845-84a0811633ca
|
||||
go.mongodb.org/mongo-driver v1.8.3
|
||||
golang.org/x/image v0.3.0
|
||||
google.golang.org/api v0.114.0
|
||||
google.golang.org/grpc v1.55.0
|
||||
google.golang.org/protobuf v1.30.0
|
||||
gopkg.in/yaml.v3 v3.0.1
|
||||
gorm.io/driver/mysql v1.3.5
|
||||
gorm.io/gorm v1.23.8
|
||||
)
|
||||
|
||||
require github.com/google/uuid v1.3.0
|
||||
|
||||
require (
|
||||
github.com/go-redis/redis v6.15.9+incompatible
|
||||
github.com/go-sql-driver/mysql v1.6.0
|
||||
github.com/go-zookeeper/zk v1.0.3
|
||||
github.com/redis/go-redis/v9 v9.0.5
|
||||
)
|
||||
|
||||
require (
|
||||
cloud.google.com/go v0.110.0 // indirect
|
||||
cloud.google.com/go/compute v1.19.0 // indirect
|
||||
cloud.google.com/go/compute/metadata v0.2.3 // indirect
|
||||
cloud.google.com/go/firestore v1.9.0 // indirect
|
||||
cloud.google.com/go/iam v0.13.0 // indirect
|
||||
cloud.google.com/go/longrunning v0.4.1 // indirect
|
||||
cloud.google.com/go/storage v1.28.1 // indirect
|
||||
github.com/beorn7/perks v1.0.1 // indirect
|
||||
github.com/bytedance/sonic v1.9.1 // indirect
|
||||
github.com/cespare/xxhash/v2 v2.2.0 // indirect
|
||||
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect
|
||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
|
||||
github.com/dustin/go-humanize v1.0.0 // indirect
|
||||
github.com/eapache/go-resiliency v1.2.0 // indirect
|
||||
github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 // indirect
|
||||
github.com/eapache/queue v1.1.0 // indirect
|
||||
github.com/frankban/quicktest v1.11.3 // indirect
|
||||
github.com/garyburd/redigo v1.6.2
|
||||
github.com/gin-gonic/gin v1.7.0
|
||||
github.com/go-playground/validator/v10 v10.4.1
|
||||
github.com/golang/protobuf v1.5.2
|
||||
github.com/gabriel-vasile/mimetype v1.4.2 // indirect
|
||||
github.com/gin-contrib/sse v0.1.0 // indirect
|
||||
github.com/go-playground/universal-translator v0.18.1 // indirect
|
||||
github.com/go-stack/stack v1.8.0 // indirect
|
||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
||||
github.com/golang/snappy v0.0.3 // indirect
|
||||
github.com/gorilla/websocket v1.4.2
|
||||
github.com/jinzhu/gorm v1.9.16
|
||||
github.com/jonboulle/clockwork v0.2.2 // indirect
|
||||
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible
|
||||
github.com/lestrrat-go/strftime v1.0.4 // indirect
|
||||
github.com/lib/pq v1.2.0 // indirect
|
||||
github.com/mattn/go-sqlite3 v1.14.6 // indirect
|
||||
github.com/mitchellh/mapstructure v1.4.1
|
||||
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646
|
||||
github.com/olivere/elastic/v7 v7.0.23
|
||||
github.com/google/go-cmp v0.5.9 // indirect
|
||||
github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect
|
||||
github.com/googleapis/gax-go/v2 v2.7.1 // indirect
|
||||
github.com/hashicorp/go-uuid v1.0.2 // indirect
|
||||
github.com/inconshreveable/mousetrap v1.0.1 // indirect
|
||||
github.com/jcmturner/aescts/v2 v2.0.0 // indirect
|
||||
github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect
|
||||
github.com/jcmturner/gofork v1.0.0 // indirect
|
||||
github.com/jcmturner/gokrb5/v8 v8.4.2 // indirect
|
||||
github.com/jcmturner/rpc/v2 v2.0.3 // indirect
|
||||
github.com/jinzhu/inflection v1.0.0 // indirect
|
||||
github.com/jinzhu/now v1.1.5 // indirect
|
||||
github.com/json-iterator/go v1.1.12 // indirect
|
||||
github.com/klauspost/compress v1.13.6 // indirect
|
||||
github.com/klauspost/cpuid v1.3.1 // indirect
|
||||
github.com/klauspost/cpuid/v2 v2.2.4 // indirect
|
||||
github.com/leodido/go-urn v1.2.4 // indirect
|
||||
github.com/lithammer/shortuuid v3.0.0+incompatible // indirect
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
|
||||
github.com/minio/md5-simd v1.1.0 // indirect
|
||||
github.com/minio/sha256-simd v0.1.1 // indirect
|
||||
github.com/mitchellh/go-homedir v1.1.0 // indirect
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||
github.com/onsi/ginkgo v1.16.5 // indirect
|
||||
github.com/onsi/gomega v1.18.1 // indirect
|
||||
github.com/pelletier/go-toml/v2 v2.0.8 // indirect
|
||||
github.com/pierrec/lz4 v2.6.0+incompatible // indirect
|
||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||
github.com/prometheus/client_model v0.2.0 // indirect
|
||||
github.com/prometheus/common v0.37.0 // indirect
|
||||
github.com/prometheus/procfs v0.8.0 // indirect
|
||||
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect
|
||||
github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5
|
||||
github.com/sirupsen/logrus v1.6.0
|
||||
github.com/tencentyun/qcloud-cos-sts-sdk v0.0.0-20210325043845-84a0811633ca
|
||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 // indirect
|
||||
go.etcd.io/etcd v0.0.0-20200402134248-51bdeb39e698
|
||||
golang.org/x/image v0.0.0-20210220032944-ac19c3e999fb
|
||||
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b
|
||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a // indirect
|
||||
google.golang.org/grpc v1.33.2
|
||||
gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c
|
||||
sigs.k8s.io/yaml v1.2.0 // indirect
|
||||
github.com/rs/xid v1.2.1 // indirect
|
||||
github.com/spf13/pflag v1.0.5 // indirect
|
||||
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
|
||||
github.com/xdg-go/pbkdf2 v1.0.0 // indirect
|
||||
github.com/xdg-go/scram v1.0.2 // indirect
|
||||
github.com/xdg-go/stringprep v1.0.2 // indirect
|
||||
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
|
||||
go.opencensus.io v0.24.0 // indirect
|
||||
go.uber.org/atomic v1.7.0 // indirect
|
||||
go.uber.org/multierr v1.6.0 // indirect
|
||||
golang.org/x/arch v0.3.0 // indirect
|
||||
golang.org/x/net v0.10.0 // indirect
|
||||
golang.org/x/oauth2 v0.6.0 // indirect
|
||||
golang.org/x/sync v0.1.0 // indirect
|
||||
golang.org/x/sys v0.8.0 // indirect
|
||||
golang.org/x/text v0.9.0 // indirect
|
||||
golang.org/x/time v0.1.0 // indirect
|
||||
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect
|
||||
google.golang.org/appengine v1.6.7 // indirect
|
||||
)
|
||||
|
||||
replace google.golang.org/grpc => google.golang.org/grpc v1.29.1
|
||||
require (
|
||||
github.com/go-playground/locales v0.14.1 // indirect
|
||||
github.com/goccy/go-json v0.10.2 // indirect
|
||||
github.com/jonboulle/clockwork v0.3.0 // indirect
|
||||
github.com/lestrrat-go/strftime v1.0.6 // indirect
|
||||
github.com/mattn/go-isatty v0.0.19 // indirect
|
||||
github.com/spf13/cobra v1.6.1
|
||||
github.com/ugorji/go/codec v1.2.11 // indirect
|
||||
go.uber.org/zap v1.24.0
|
||||
golang.org/x/crypto v0.9.0 // indirect
|
||||
google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect
|
||||
gopkg.in/ini.v1 v1.66.2 // indirect
|
||||
)
|
||||
|
||||
replace github.com/Shopify/sarama => github.com/Shopify/sarama v1.29.0
|
||||
|
||||
801
go.sum
801
go.sum
@@ -1,38 +1,99 @@
|
||||
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
|
||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
|
||||
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
|
||||
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
|
||||
cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
|
||||
cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
|
||||
cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
|
||||
cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
|
||||
cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
|
||||
cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
|
||||
cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
|
||||
cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
|
||||
cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
|
||||
cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
|
||||
cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys=
|
||||
cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY=
|
||||
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
|
||||
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
|
||||
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
|
||||
cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
|
||||
cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
|
||||
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
|
||||
cloud.google.com/go/compute v1.19.0 h1:+9zda3WGgW1ZSTlVppLCYFIr48Pa35q1uG2N1itbCEQ=
|
||||
cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU=
|
||||
cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY=
|
||||
cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA=
|
||||
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
|
||||
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
|
||||
cloud.google.com/go/firestore v1.9.0 h1:IBlRyxgGySXu5VuW0RgGFlTtLukSnNkpDiEOMkQkmpA=
|
||||
cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE=
|
||||
cloud.google.com/go/iam v0.13.0 h1:+CmB+K0J/33d0zSQ9SlFWUeCCEn5XJA0ZMZ3pHE9u8k=
|
||||
cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0=
|
||||
cloud.google.com/go/longrunning v0.4.1 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM=
|
||||
cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo=
|
||||
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
|
||||
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
|
||||
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
|
||||
cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
|
||||
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
|
||||
cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
|
||||
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
|
||||
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
|
||||
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
|
||||
cloud.google.com/go/storage v1.28.1 h1:F5QDG5ChchaAVQhINh24U99OWHURqrW8OmQcGKXcbgI=
|
||||
cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y=
|
||||
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
||||
firebase.google.com/go v3.13.0+incompatible h1:3TdYC3DDi6aHn20qoRkxwGqNgdjtblwVAyRLQwGn/+4=
|
||||
firebase.google.com/go v3.13.0+incompatible/go.mod h1:xlah6XbEyW6tbfSklcfe5FHJIwjt8toICdV5Wh9ptHs=
|
||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc=
|
||||
github.com/Shopify/sarama v1.19.0 h1:9oksLxC6uxVPHPVYUmq6xhr1BOF/hHobWH2UzO67z1s=
|
||||
github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
|
||||
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
||||
github.com/OpenIMSDK/open_utils v1.0.8 h1:IopxWgJwEF5ZAPsRuiZZOfcxNOQOCt/p8VDENcHN9r4=
|
||||
github.com/OpenIMSDK/open_utils v1.0.8/go.mod h1:FLoaQblWUVKQgqt2LrNzfSZLT6D3DICBn1kcOMDLUOI=
|
||||
github.com/Shopify/sarama v1.29.0 h1:ARid8o8oieau9XrHI55f/L3EoRAhm9px6sonbD7yuUE=
|
||||
github.com/Shopify/sarama v1.29.0/go.mod h1:2QpgD79wpdAESqNQMxNc0KYMkycd4slxGdV3TWSVqrU=
|
||||
github.com/Shopify/toxiproxy v2.1.4+incompatible h1:TKdv8HiTLgE5wdJuEML90aBgNWsokNbMijUGhmcoBJc=
|
||||
github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
|
||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||
github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
|
||||
github.com/antonfisher/nested-logrus-formatter v1.3.0 h1:8zixYquU1Odk+vzAaAQPAdRh1ZjmUXNQ1T+dUBvlhVo=
|
||||
github.com/antonfisher/nested-logrus-formatter v1.3.0/go.mod h1:6WTfyWFkBc9+zyBaKIqRrg/KwMqBbodBjgbHjDz7zjA=
|
||||
github.com/aws/aws-sdk-go v1.38.3/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro=
|
||||
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
|
||||
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
|
||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
||||
github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0=
|
||||
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
||||
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
|
||||
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
||||
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
||||
github.com/bsm/ginkgo/v2 v2.7.0 h1:ItPMPH90RbmZJt5GtkcNvIRuGEdwlBItdNVoyzaNQao=
|
||||
github.com/bsm/gomega v1.26.0 h1:LhQm+AFcgV2M0WyKroMASzAzCAJVpAxQXv4SaI9a69Y=
|
||||
github.com/bwmarrin/snowflake v0.3.0 h1:xm67bEhkKh6ij1790JB83OujPR5CzNe8QuQqAgISZN0=
|
||||
github.com/bwmarrin/snowflake v0.3.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE=
|
||||
github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=
|
||||
github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s=
|
||||
github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=
|
||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||
github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
|
||||
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||
github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=
|
||||
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams=
|
||||
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=
|
||||
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
|
||||
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
|
||||
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
|
||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
||||
github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa h1:OaNxuTZr7kxeODyLWsRMC+OD03aFUH+mW6r2d+MWa5Y=
|
||||
github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
|
||||
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
||||
github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM=
|
||||
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
||||
github.com/coreos/go-systemd/v22 v22.0.0 h1:XJIw/+VlJ+87J+doOxznsAWIdmWuViOVhkQamW5YV28=
|
||||
github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk=
|
||||
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
|
||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd h1:83Wprp6ROGeiHFAP8WJdI2RoxALQYgdllERc3N5N2DM=
|
||||
github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
|
||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
|
||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
||||
github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
|
||||
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
|
||||
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
|
||||
github.com/dtm-labs/rockscache v0.1.1 h1:6S1vgaHvGqrLd8Ka4hRTKeKPV7v+tT0MSkTIX81LRyA=
|
||||
github.com/dtm-labs/rockscache v0.1.1/go.mod h1:c76WX0kyIibmQ2ACxUXvDvaLykoPakivMqIxt+UzE7A=
|
||||
github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
|
||||
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
|
||||
github.com/eapache/go-resiliency v1.2.0 h1:v7g92e/KSN71Rq7vSThKaWIq68fL4YHvWyiUKorFR1Q=
|
||||
@@ -41,153 +102,248 @@ github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 h1:YEetp8
|
||||
github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
|
||||
github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc=
|
||||
github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
|
||||
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
|
||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||
github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 h1:Yzb9+7DPaBjB8zlTR87/ElzFsnQfuHnVUVqpZZIcV5Y=
|
||||
github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0=
|
||||
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
||||
github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw=
|
||||
github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
|
||||
github.com/frankban/quicktest v1.11.3 h1:8sXhOn0uLys67V8EsXLc6eszDs8VXWxL3iRvebPhedY=
|
||||
github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=
|
||||
github.com/garyburd/redigo v1.6.2 h1:yE/pwKCrbLpLpQICzYTeZ7JsTA/C53wFTJHaEtRqniM=
|
||||
github.com/garyburd/redigo v1.6.2/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
|
||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
|
||||
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
||||
github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU=
|
||||
github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA=
|
||||
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
|
||||
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
|
||||
github.com/gin-gonic/gin v1.7.0 h1:jGB9xAJQ12AIGNB4HguylppmDK1Am9ppF7XnGXXJuoU=
|
||||
github.com/gin-gonic/gin v1.7.0/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY=
|
||||
github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg=
|
||||
github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU=
|
||||
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||
github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
|
||||
github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
|
||||
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
||||
github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A=
|
||||
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
|
||||
github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q=
|
||||
github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
|
||||
github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no=
|
||||
github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
|
||||
github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE=
|
||||
github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=
|
||||
github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs=
|
||||
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
||||
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
||||
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
|
||||
github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
|
||||
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
|
||||
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
|
||||
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
|
||||
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
|
||||
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
|
||||
github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js=
|
||||
github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU=
|
||||
github.com/go-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGKFlFgcHWWmHQjg=
|
||||
github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
|
||||
github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
|
||||
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
||||
github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
|
||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||
github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
|
||||
github.com/go-zookeeper/zk v1.0.3 h1:7M2kwOsc//9VeeFiPtf+uSJlVpU66x9Ba5+8XK7/TDg=
|
||||
github.com/go-zookeeper/zk v1.0.3/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw=
|
||||
github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
|
||||
github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
|
||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||
github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE=
|
||||
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
|
||||
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY=
|
||||
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
|
||||
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
||||
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
||||
github.com/golang-jwt/jwt/v4 v4.4.2 h1:rcc4lwaZgFMCZ5jxF9ABolDcIHdBytAFgqFPbSJQAYs=
|
||||
github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
|
||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||
github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY=
|
||||
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
|
||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
|
||||
github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
|
||||
github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
|
||||
github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
|
||||
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
|
||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
|
||||
github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
|
||||
github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
|
||||
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
|
||||
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
|
||||
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
|
||||
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
|
||||
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
||||
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
|
||||
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
||||
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
|
||||
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
|
||||
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA=
|
||||
github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo=
|
||||
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
|
||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
|
||||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||
github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no=
|
||||
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
||||
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
|
||||
github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw=
|
||||
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||
github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||
github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||
github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||
github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||
github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
||||
github.com/google/uuid v1.0.0 h1:b4Gk+7WdP/d3HZH8EJsZpvV7EtDOgaZLtnaNGIu1adA=
|
||||
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
||||
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
|
||||
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k=
|
||||
github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k=
|
||||
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
||||
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
||||
github.com/googleapis/gax-go/v2 v2.7.1 h1:gF4c0zjUP2H/s/hEGyLA3I0fA2ZWjzYiONAD6cvPr8A=
|
||||
github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI=
|
||||
github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4=
|
||||
github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM=
|
||||
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
|
||||
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||
github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4 h1:z53tR0945TRRQO/fLEVPI6SMv7ZflF0TEaTAoU7tOzg=
|
||||
github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
|
||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho=
|
||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.9.5 h1:UImYN5qQ8tuGpGE16ZmjvcTtTw24zw1QAp/SlnNrZhI=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
||||
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
||||
github.com/jinzhu/gorm v1.9.16 h1:+IyIjPEABKRpsu/F8OvDPy9fyQlgsg2luMV2ZIH5i5o=
|
||||
github.com/jinzhu/gorm v1.9.16/go.mod h1:G3LB3wezTOWM2ITLzPxEXgSkOXAntiLHS7UdBefADcs=
|
||||
github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE=
|
||||
github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
||||
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
||||
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
||||
github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc=
|
||||
github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
|
||||
github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8=
|
||||
github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs=
|
||||
github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo=
|
||||
github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM=
|
||||
github.com/jcmturner/gofork v1.0.0 h1:J7uCkflzTEhUZ64xqKnkDxq3kzc96ajM1Gli5ktUem8=
|
||||
github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o=
|
||||
github.com/jcmturner/goidentity/v6 v6.0.1 h1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o=
|
||||
github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg=
|
||||
github.com/jcmturner/gokrb5/v8 v8.4.2 h1:6ZIM6b/JJN0X8UM43ZOM6Z4SJzla+a/u7scXFJzodkA=
|
||||
github.com/jcmturner/gokrb5/v8 v8.4.2/go.mod h1:sb+Xq/fTY5yktf/VxLsE3wlfPqQjp0aWNYyvBVK62bc=
|
||||
github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY=
|
||||
github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc=
|
||||
github.com/jinzhu/copier v0.3.5 h1:GlvfUwHk62RokgqVNvYsku0TATCF7bAHVwEXoBh3iJg=
|
||||
github.com/jinzhu/copier v0.3.5/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg=
|
||||
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
|
||||
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
|
||||
github.com/jinzhu/now v1.0.1 h1:HjfetcXq097iXP0uoPCdnM4Efp5/9MsM0/M+XOTeR3M=
|
||||
github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
|
||||
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
|
||||
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
|
||||
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
|
||||
github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ=
|
||||
github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
|
||||
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
|
||||
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
|
||||
github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
|
||||
github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
|
||||
github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
|
||||
github.com/jonboulle/clockwork v0.3.0 h1:9BSCMi8C+0qdApAp4auwX0RkLGUjs956h0EkuQymUhg=
|
||||
github.com/jonboulle/clockwork v0.3.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
|
||||
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
|
||||
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
||||
github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||
github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns=
|
||||
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||
github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||
github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
|
||||
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
|
||||
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
|
||||
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
|
||||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
||||
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
|
||||
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
|
||||
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||
github.com/klauspost/compress v1.12.2/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
|
||||
github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc=
|
||||
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
|
||||
github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
|
||||
github.com/klauspost/cpuid v1.3.1 h1:5JNjFYYQrZeKRJ0734q51WCEEn2huer72Dc7K+R/b6s=
|
||||
github.com/klauspost/cpuid v1.3.1/go.mod h1:bYW4mA6ZgKPob1/Dlai2LviZJO7KGI3uoWLd42rAQw4=
|
||||
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
|
||||
github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=
|
||||
github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||
github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
|
||||
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||
github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y=
|
||||
github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
|
||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||
github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q=
|
||||
github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4=
|
||||
github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc h1:RKf14vYWi2ttpEmkA4aQ3j4u9dStX2t4M8UM6qqNsG8=
|
||||
github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc/go.mod h1:kopuH9ugFRkIXf3YoqHKyrJ9YfUFsckUU9S7B+XP+is=
|
||||
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible h1:Y6sqxHMyB1D2YSzWkLibYKgg+SwmyFU9dF2hn6MdTj4=
|
||||
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible/go.mod h1:ZQnN8lSECaebrkQytbHj4xNgtg8CR7RYXnPok8e0EHA=
|
||||
github.com/lestrrat-go/strftime v1.0.4 h1:T1Rb9EPkAhgxKqbcMIPguPq8glqXTA1koF8n9BHElA8=
|
||||
github.com/lestrrat-go/strftime v1.0.4/go.mod h1:E1nN3pCbtMSu1yjSVeyuRFVm/U0xoR76fd03sz+Qz4g=
|
||||
github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||
github.com/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0=
|
||||
github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
|
||||
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
|
||||
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
|
||||
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
||||
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
|
||||
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
||||
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||
github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus=
|
||||
github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRUbg=
|
||||
github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
|
||||
github.com/lestrrat-go/strftime v1.0.6 h1:CFGsDEt1pOpFNU+TJB0nhz9jl+K0hZSLE205AhTIGQQ=
|
||||
github.com/lestrrat-go/strftime v1.0.6/go.mod h1:f7jQKgV5nnJpYgdEasS+/y7EsTb8ykN2z68n3TtcTaw=
|
||||
github.com/lithammer/shortuuid v3.0.0+incompatible h1:NcD0xWW/MZYXEHa6ITy6kaXN5nwm/V115vj2YXfhS0w=
|
||||
github.com/lithammer/shortuuid v3.0.0+incompatible/go.mod h1:FR74pbAuElzOUuenUHTK2Tciko1/vKuIKS9dSkDrA4w=
|
||||
github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
|
||||
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||
github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=
|
||||
github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
||||
github.com/minio/md5-simd v1.1.0 h1:QPfiOqlZH+Cj9teu0t9b1nTBfPbyTl16Of5MeuShdK4=
|
||||
github.com/minio/md5-simd v1.1.0/go.mod h1:XpBqgZULrMYD3R+M28PcmP0CkI7PEMzB3U77ZrKZ0Gw=
|
||||
github.com/minio/minio-go/v7 v7.0.22 h1:iXhsiRyYh1ozm/+jN2qGgEIahYjEkvcpuu6NcdpSxcA=
|
||||
github.com/minio/minio-go/v7 v7.0.22/go.mod h1:ei5JjmxwHaMrgsMrn4U/+Nmg+d8MKS1U2DAn1ou4+Do=
|
||||
github.com/minio/sha256-simd v0.1.1 h1:5QHSlgo3nt5yKOJrC7W8w7X+NFl8cMPZm96iu8kKUJU=
|
||||
github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM=
|
||||
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
|
||||
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||
github.com/mitchellh/mapstructure v1.4.2 h1:6h7AQ0yhTcIsmFmnAwQls75jp2Gzs4iB8W7pjMO+rqo=
|
||||
github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||
github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
|
||||
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
|
||||
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
|
||||
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
|
||||
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
||||
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
||||
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ=
|
||||
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
|
||||
github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
|
||||
github.com/olivere/elastic/v7 v7.0.23 h1:b7tjMogDMhf2CisGI+L02LXLVa0ZyE82Z15XfW1e8t8=
|
||||
github.com/olivere/elastic/v7 v7.0.23/go.mod h1:OuWmD2DiuYhddWegBKPWQuelVKBLrW0fa/VUYgxuGTY=
|
||||
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
|
||||
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
|
||||
github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
|
||||
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
|
||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
|
||||
github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
|
||||
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
|
||||
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
|
||||
github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
|
||||
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
||||
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
||||
github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
|
||||
github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE=
|
||||
github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs=
|
||||
github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ=
|
||||
github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4=
|
||||
github.com/pierrec/lz4 v2.6.0+incompatible h1:Ix9yFKn1nSPBLFl/yZknTp8TU5G4Ps0JDmguYK6iH1A=
|
||||
github.com/pierrec/lz4 v2.6.0+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
|
||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
@@ -197,171 +353,458 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||
github.com/prometheus/client_golang v1.0.0 h1:vrDKnkGzuGvhNAL56c7DBz29ZL+KxnoR0x7enabFceM=
|
||||
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
|
||||
github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
|
||||
github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
|
||||
github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
|
||||
github.com/prometheus/client_golang v1.13.0 h1:b71QUfeo5M8gq2+evJdTPfZhYMAU0uKPkyPJ7TPsloU=
|
||||
github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ=
|
||||
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 h1:gQz4mCbXsO+nc9n1hCxHcGA3Zx3Eo+UHZoInFGUIXNM=
|
||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/prometheus/common v0.4.1 h1:K0MGApIoQvMw27RTdJkPbr3JZ7DNbtxQNyi5STVM6Kw=
|
||||
github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
|
||||
github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
||||
github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
|
||||
github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
|
||||
github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
|
||||
github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE=
|
||||
github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=
|
||||
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||
github.com/prometheus/procfs v0.0.2 h1:6LJUbpNm42llc4HRCuvApCSWB/WfhuNo9K98Q9sNGfs=
|
||||
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
||||
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
|
||||
github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
|
||||
github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
|
||||
github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo=
|
||||
github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=
|
||||
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM=
|
||||
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
||||
github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5 h1:mZHayPoR0lNmnHyvtYjDeq0zlVHn9K/ZXoy17ylucdo=
|
||||
github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5/go.mod h1:GEXHk5HgEKCvEIIrSpFI3ozzG5xOKA2DVlEX/gGnewM=
|
||||
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
|
||||
github.com/redis/go-redis/v9 v9.0.5 h1:CuQcn5HIEeK7BgElubPP8CGtE0KakrnbBSTLjathl5o=
|
||||
github.com/redis/go-redis/v9 v9.0.5/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDOjzMvcuQHk=
|
||||
github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
|
||||
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
|
||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||
github.com/rs/xid v1.2.1 h1:mhH9Nq+C1fY2l1XIpgxIiUOfNpRBYH1kKcr+qfKgjRc=
|
||||
github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
|
||||
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
||||
github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I=
|
||||
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
|
||||
github.com/smartystreets/assertions v1.1.1/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo=
|
||||
github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM=
|
||||
github.com/smartystreets/gunit v1.4.2/go.mod h1:ZjM1ozSIMJlAz/ay4SG8PeKF00ckUp+zMHZXV9/bvak=
|
||||
github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E=
|
||||
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
|
||||
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
|
||||
github.com/spf13/pflag v1.0.1 h1:aCvUg6QPl3ibpQUxyLkrEkCHtPqYJL4x9AuhqVqFis4=
|
||||
github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||
github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
|
||||
github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
||||
github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA=
|
||||
github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY=
|
||||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
||||
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
||||
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||
github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
|
||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||
github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY=
|
||||
github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||
github.com/tencentyun/qcloud-cos-sts-sdk v0.0.0-20210325043845-84a0811633ca h1:G/aIr3WiUesWHL2YGYgEqjM5tCAJ43Ml+0C18wDkWWs=
|
||||
github.com/tencentyun/qcloud-cos-sts-sdk v0.0.0-20210325043845-84a0811633ca/go.mod h1:b18KQa4IxHbxeseW1GcZox53d7J0z39VNONTxvvlkXw=
|
||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 h1:LnC5Kc/wtumK+WB441p7ynQJzVuNRJiqddSIE3IlSEQ=
|
||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
||||
github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo=
|
||||
github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
|
||||
github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs=
|
||||
github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
|
||||
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8=
|
||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
|
||||
github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
|
||||
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
|
||||
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
|
||||
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
|
||||
github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU=
|
||||
github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
|
||||
github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
|
||||
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
|
||||
github.com/xdg-go/scram v1.0.2 h1:akYIkZ28e6A96dkWNJQu3nmCzH3YfwMPQExUYDaRv7w=
|
||||
github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs=
|
||||
github.com/xdg-go/stringprep v1.0.2 h1:6iq84/ryjjeRmMJwxutI51F2GIPlP5BfTvXHeYjyhBc=
|
||||
github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM=
|
||||
github.com/xdg/scram v1.0.3/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I=
|
||||
github.com/xdg/stringprep v1.0.3/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y=
|
||||
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA=
|
||||
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
|
||||
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
go.etcd.io/bbolt v1.3.4 h1:hi1bXHMVrlQh6WwxAy+qZCV/SYIlqo+Ushwdpa4tAKg=
|
||||
go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
|
||||
go.etcd.io/etcd v0.0.0-20200402134248-51bdeb39e698 h1:jWtjCJX1qxhHISBMLRztWwR+EXkI7MJAF2HjHAE/x/I=
|
||||
go.etcd.io/etcd v0.0.0-20200402134248-51bdeb39e698/go.mod h1:YoUyTScD3Vcv2RBm3eGVOq7i1ULiz3OuXoQFWOirmAM=
|
||||
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
|
||||
go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk=
|
||||
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
|
||||
go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A=
|
||||
go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
|
||||
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4=
|
||||
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
|
||||
go.uber.org/zap v1.14.1 h1:nYDKopTbvAPq/NrUVZwT15y2lpROBiLLyoRTbXOYWOo=
|
||||
go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc=
|
||||
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||
go.mongodb.org/mongo-driver v1.8.3 h1:TDKlTkGDKm9kkJVUOAXDK5/fkqKHJVwYQSpoRfB43R4=
|
||||
go.mongodb.org/mongo-driver v1.8.3/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY=
|
||||
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
||||
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
|
||||
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||
go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
|
||||
go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
|
||||
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
|
||||
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
||||
go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI=
|
||||
go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=
|
||||
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
|
||||
go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60=
|
||||
go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg=
|
||||
golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
|
||||
golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k=
|
||||
golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
|
||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
|
||||
golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
|
||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g=
|
||||
golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/image v0.0.0-20210220032944-ac19c3e999fb h1:fqpd0EBDzlHRCjiphRR5Zo/RSWWQlWv34418dnEixWk=
|
||||
golang.org/x/image v0.0.0-20210220032944-ac19c3e999fb/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
||||
golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
|
||||
golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
|
||||
golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
|
||||
golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
|
||||
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
|
||||
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
|
||||
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
|
||||
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
||||
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
golang.org/x/image v0.3.0 h1:HTDXbdK9bjfSWkPzDJIw89W8CAtfFGduujWs33NLLsg=
|
||||
golang.org/x/image v0.3.0/go.mod h1:fXd9211C/0VTlYuAcOhW8dY/RtEJqODXOWBDpmYBf+A=
|
||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||
golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs=
|
||||
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
|
||||
golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
||||
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
||||
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
|
||||
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
|
||||
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
|
||||
golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4=
|
||||
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
|
||||
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
||||
golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b h1:uwuIcX0g4Yl1NC5XAz37xsr2lTtcqevgzYNVt49waME=
|
||||
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
golang.org/x/net v0.0.0-20210427231257-85d9c07bbe3a/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
|
||||
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
|
||||
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||
golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
|
||||
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||
golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
|
||||
golang.org/x/oauth2 v0.6.0 h1:Lh8GPgSKBfWSwFvtuWOfeI3aAAnbXTSutYxJiOJFgIw=
|
||||
golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
|
||||
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f h1:+Nyd8tzPX9R7BWHguqsrbFdRx3WQ/1ib8I44HXV5yTA=
|
||||
golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=
|
||||
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||
golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2 h1:+DCIGbF/swA92ohVg0//6X2IVY3KZs6p9mix0ziNYJM=
|
||||
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||
golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||
golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
|
||||
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.1.0 h1:xYY+Bajn2a7VBmTM5GikTmnK8ZuX8YgnQCqZpbBNtmA=
|
||||
golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||
golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a h1:CB3a9Nez8M13wwlr/E2YtwoU+qYHKfC+JrDa45RXXoQ=
|
||||
golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
|
||||
golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
|
||||
golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
|
||||
golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||
golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||
golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||
golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||
golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
||||
golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
||||
golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
||||
golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk=
|
||||
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
|
||||
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
|
||||
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
|
||||
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
|
||||
google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
|
||||
google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
|
||||
google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
|
||||
google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
|
||||
google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
||||
google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
||||
google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
||||
google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
||||
google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
||||
google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
|
||||
google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
|
||||
google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
|
||||
google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
|
||||
google.golang.org/api v0.114.0 h1:1xQPji6cO2E2vLiI+C/XiFAnsn1WV3mjaEwGLhi3grE=
|
||||
google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg=
|
||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
|
||||
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
|
||||
google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
|
||||
google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=
|
||||
google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
|
||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE=
|
||||
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||
google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
||||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
||||
google.golang.org/grpc v1.29.1 h1:EC2SB8S04d2r73uptxphDSUG+kTKVgjRPF+N3xpxRB4=
|
||||
google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
|
||||
google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||
google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||
google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||
google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||
google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||
google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||
google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
|
||||
google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||
google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||
google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||
google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||
google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||
google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||
google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||
google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||
google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
|
||||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
||||
google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
|
||||
google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||
google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||
google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A=
|
||||
google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU=
|
||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
||||
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
||||
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
||||
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
|
||||
google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||
google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||
google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
|
||||
google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
|
||||
google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||
google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
|
||||
google.golang.org/grpc v1.55.0 h1:3Oj82/tFSCeUrRTg/5E/7d/W5A1tj6Ky1ABAuZuv5ag=
|
||||
google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8=
|
||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
|
||||
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
|
||||
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
|
||||
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
||||
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
||||
google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk=
|
||||
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||
google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng=
|
||||
google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
|
||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
||||
gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 h1:VpOs+IwYnYBaFnrNAeB8UUWtL3vEUnzSCL1nVjPhqrw=
|
||||
gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
|
||||
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
|
||||
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
|
||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
||||
gopkg.in/ini.v1 v1.66.2 h1:XfR1dOYubytKy4Shzc2LHrrGhU0lDCfDGG1yLPmpgsI=
|
||||
gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
|
||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
|
||||
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
|
||||
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gorm.io/driver/mysql v1.3.5 h1:iWBTVW/8Ij5AG4e0G/zqzaJblYkBI1VIL1LG2HUGsvY=
|
||||
gorm.io/driver/mysql v1.3.5/go.mod h1:sSIebwZAVPiT+27jK9HIwvsqOGKx3YMPmrA3mBJR10c=
|
||||
gorm.io/gorm v1.23.8 h1:h8sGJ+biDgBA1AD1Ha9gFCx7h8npU7AsLdlkX0n2TpE=
|
||||
gorm.io/gorm v1.23.8/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=
|
||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM=
|
||||
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
|
||||
sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
|
||||
sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q=
|
||||
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
|
||||
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
||||
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
||||
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
|
||||
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
|
||||
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
|
||||
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
|
||||
|
||||
9
init_docker.sh
Normal file
9
init_docker.sh
Normal file
@@ -0,0 +1,9 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
cd script ;
|
||||
chmod +x *.sh ;
|
||||
./env_check.sh;
|
||||
cd .. ;
|
||||
docker-compose up -d;
|
||||
cd script ;
|
||||
./docker_check_service.sh
|
||||
177
install_guide.sh
Normal file
177
install_guide.sh
Normal file
@@ -0,0 +1,177 @@
|
||||
#!/bin/bash
|
||||
|
||||
echo "Welcome to the Open-IM-Server installation script."
|
||||
echo "Please select an deploy option:"
|
||||
echo "1. docker-compose install"
|
||||
echo "2. exit"
|
||||
|
||||
clear_openimlog() {
|
||||
rm -rf ./logs/*
|
||||
}
|
||||
|
||||
is_path() {
|
||||
if [ -e "$1" ]; then
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
fi
|
||||
}
|
||||
|
||||
is_empty() {
|
||||
if [ -z "$1" ]; then
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
fi
|
||||
}
|
||||
|
||||
is_directory_exists() {
|
||||
if [ -d "$1" ]; then
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
fi
|
||||
}
|
||||
|
||||
edit_config() {
|
||||
echo "Is edit config.yaml?"
|
||||
echo "1. vi edit config"
|
||||
echo "2. do not edit config"
|
||||
read choice
|
||||
case $choice in
|
||||
1)
|
||||
vi config/config.yaml
|
||||
;;
|
||||
2)
|
||||
echo "do not edit config"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
edit_enterprise_config() {
|
||||
echo "Is edit enterprise config.yaml?"
|
||||
echo "1. vi edit enterprise config"
|
||||
echo "2. do not edit enterprise config"
|
||||
read choice
|
||||
case $choice in
|
||||
1)
|
||||
vi ./.docker-compose_cfg/config.yaml
|
||||
;;
|
||||
2)
|
||||
echo "Do not edit enterprise config"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
install_docker_compose() {
|
||||
echo "Please input the installation path, default is $(pwd)/Open-IM-Server, press enter to use default"
|
||||
read install_path
|
||||
is_empty $install_path
|
||||
if [ $? -eq 1 ]; then
|
||||
install_path="."
|
||||
fi
|
||||
echo "Installing Open-IM-Server to ${install_path}/Open-IM-Server..."
|
||||
is_path $install_path
|
||||
mkdir -p $install_path
|
||||
cd $install_path
|
||||
is_directory_exists "${install_path}/Open-IM-Server"
|
||||
if [ $? -eq 1 ]; then
|
||||
echo "WARNING: Directory $install_path/Open-IM-Server exist, please ensure your path"
|
||||
echo "1. delete the directory and install"
|
||||
echo "2. exit"
|
||||
read choice
|
||||
case $choice in
|
||||
1)
|
||||
rm -rf "${install_path}/Open-IM-Server"
|
||||
;;
|
||||
2)
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
rm -rf ./Open-IM-Server
|
||||
set -e
|
||||
git clone https://github.com/OpenIMSDK/Open-IM-Server.git --recursive;
|
||||
set +e
|
||||
cd ./Open-IM-Server
|
||||
git checkout errcode
|
||||
echo "======== git clone success ========"
|
||||
source .env
|
||||
if [ $DATA_DIR = "./" ]; then
|
||||
DATA_DIR=$(pwd)/components
|
||||
fi
|
||||
echo "Please input the components data directory, deault is ${DATA_DIR}, press enter to use default"
|
||||
read NEW_DATA_DIR
|
||||
is_empty $NEW_DATA_DIR
|
||||
if [ $? -eq 0 ]; then
|
||||
DATA_DIR=$NEW_DATA_DIR
|
||||
fi
|
||||
echo "Please input the user, deault is root, press enter to use default"
|
||||
read NEW_USER
|
||||
is_empty $NEW_USER
|
||||
if [ $? -eq 0 ]; then
|
||||
USER=$NEW_USER
|
||||
fi
|
||||
|
||||
echo "Please input the password, default is openIM123, press enter to use default"
|
||||
read NEW_PASSWORD
|
||||
is_empty $NEW_PASSWORD
|
||||
if [ $? -eq 0 ]; then
|
||||
PASSWORD=$NEW_PASSWORD
|
||||
fi
|
||||
|
||||
echo "Please input the minio_endpoint, default will detect auto, press enter to use default"
|
||||
read NEW_MINIO_ENDPOINT
|
||||
is_empty $NEW_MINIO_ENDPOINT
|
||||
if [ $? -eq 1 ]; then
|
||||
internet_ip=`curl ifconfig.me -s`
|
||||
MINIO_ENDPOINT="http://${internet_ip}:10005"
|
||||
else
|
||||
MINIO_ENDPOINT=$NEW_MINIO_ENDPOINT
|
||||
fi
|
||||
set -e
|
||||
export MINIO_ENDPOINT
|
||||
export USER
|
||||
export PASSWORD
|
||||
export DATA_DIR
|
||||
|
||||
cat <<EOF > .env
|
||||
USER=${USER}
|
||||
PASSWORD=${PASSWORD}
|
||||
MINIO_ENDPOINT=${MINIO_ENDPOINT}
|
||||
DATA_DIR=${DATA_DIR}
|
||||
EOF
|
||||
|
||||
edit_config
|
||||
edit_enterprise_config
|
||||
|
||||
cd script;
|
||||
chmod +x *.sh;
|
||||
./init_pwd.sh;
|
||||
./env_check.sh;
|
||||
cd ..;
|
||||
docker-compose up -d;
|
||||
cd script;
|
||||
./docker_check_service.sh;
|
||||
}
|
||||
|
||||
read choice
|
||||
|
||||
case $choice in
|
||||
1)
|
||||
install_docker_compose
|
||||
;;
|
||||
2)
|
||||
|
||||
;;
|
||||
3)
|
||||
;;
|
||||
4)
|
||||
echo "Exiting installation script..."
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
echo "Invalid option, please try again."
|
||||
;;
|
||||
esac
|
||||
|
||||
21
install_im_compose.sh
Normal file
21
install_im_compose.sh
Normal file
@@ -0,0 +1,21 @@
|
||||
#!/usr/bin/env bash
|
||||
internet_ip=`curl ifconfig.me -s`
|
||||
echo $internet_ip
|
||||
|
||||
source .env
|
||||
echo $MINIO_ENDPOINT
|
||||
if [ $MINIO_ENDPOINT == "http://127.0.0.1:10005" ]; then
|
||||
sed -i "s/127.0.0.1/${internet_ip}/" .env
|
||||
|
||||
fi
|
||||
|
||||
cd script ;
|
||||
chmod +x *.sh ;
|
||||
./init_pwd.sh
|
||||
./env_check.sh;
|
||||
cd .. ;
|
||||
docker-compose -f im-compose.yaml up -d
|
||||
docker ps
|
||||
|
||||
|
||||
|
||||
19
install_im_server.sh
Normal file
19
install_im_server.sh
Normal file
@@ -0,0 +1,19 @@
|
||||
#!/usr/bin/env bash
|
||||
internet_ip=`curl ifconfig.me -s`
|
||||
echo $internet_ip
|
||||
|
||||
source .env
|
||||
echo $MINIO_ENDPOINT
|
||||
if [ $MINIO_ENDPOINT == "http://127.0.0.1:10005" ]; then
|
||||
sed -i "s/127.0.0.1/${internet_ip}/" .env
|
||||
|
||||
fi
|
||||
|
||||
cd script ;
|
||||
chmod +x *.sh ;
|
||||
./init_pwd.sh
|
||||
./env_check.sh;
|
||||
cd .. ;
|
||||
docker-compose up -d;
|
||||
cd script ;
|
||||
./docker_check_service.sh
|
||||
27
internal/api/auth.go
Normal file
27
internal/api/auth.go
Normal file
@@ -0,0 +1,27 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/a2r"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/auth"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
type AuthApi rpcclient.Auth
|
||||
|
||||
func NewAuthApi(discov discoveryregistry.SvcDiscoveryRegistry) AuthApi {
|
||||
return AuthApi(*rpcclient.NewAuth(discov))
|
||||
}
|
||||
|
||||
func (o *AuthApi) UserToken(c *gin.Context) {
|
||||
a2r.Call(auth.AuthClient.UserToken, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *AuthApi) ParseToken(c *gin.Context) {
|
||||
a2r.Call(auth.AuthClient.ParseToken, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *AuthApi) ForceLogout(c *gin.Context) {
|
||||
a2r.Call(auth.AuthClient.ForceLogout, o.Client, c)
|
||||
}
|
||||
49
internal/api/conversation.go
Normal file
49
internal/api/conversation.go
Normal file
@@ -0,0 +1,49 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/a2r"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/conversation"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
type ConversationApi rpcclient.Conversation
|
||||
|
||||
func NewConversationApi(discov discoveryregistry.SvcDiscoveryRegistry) ConversationApi {
|
||||
return ConversationApi(*rpcclient.NewConversation(discov))
|
||||
}
|
||||
|
||||
func (o *ConversationApi) GetAllConversations(c *gin.Context) {
|
||||
a2r.Call(conversation.ConversationClient.GetAllConversations, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *ConversationApi) GetConversation(c *gin.Context) {
|
||||
a2r.Call(conversation.ConversationClient.GetConversation, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *ConversationApi) GetConversations(c *gin.Context) {
|
||||
a2r.Call(conversation.ConversationClient.GetConversations, o.Client, c)
|
||||
}
|
||||
|
||||
// deprecated
|
||||
func (o *ConversationApi) SetConversation(c *gin.Context) {
|
||||
a2r.Call(conversation.ConversationClient.SetConversation, o.Client, c)
|
||||
}
|
||||
|
||||
// deprecated
|
||||
func (o *ConversationApi) BatchSetConversations(c *gin.Context) {
|
||||
a2r.Call(conversation.ConversationClient.BatchSetConversations, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *ConversationApi) SetRecvMsgOpt(c *gin.Context) {
|
||||
a2r.Call(conversation.ConversationClient.SetRecvMsgOpt, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *ConversationApi) ModifyConversationField(c *gin.Context) {
|
||||
a2r.Call(conversation.ConversationClient.ModifyConversationField, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *ConversationApi) SetConversations(c *gin.Context) {
|
||||
a2r.Call(conversation.ConversationClient.SetConversations, o.Client, c)
|
||||
}
|
||||
23
internal/api/custom_validator.go
Normal file
23
internal/api/custom_validator.go
Normal file
@@ -0,0 +1,23 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
|
||||
"github.com/go-playground/validator/v10"
|
||||
)
|
||||
|
||||
func RequiredIf(fl validator.FieldLevel) bool {
|
||||
sessionType := fl.Parent().FieldByName("SessionType").Int()
|
||||
switch sessionType {
|
||||
case constant.SingleChatType, constant.NotificationChatType:
|
||||
if fl.FieldName() == "RecvID" {
|
||||
return fl.Field().String() != ""
|
||||
}
|
||||
case constant.GroupChatType, constant.SuperGroupChatType:
|
||||
if fl.FieldName() == "GroupID" {
|
||||
return fl.Field().String() != ""
|
||||
}
|
||||
default:
|
||||
return true
|
||||
}
|
||||
return true
|
||||
}
|
||||
64
internal/api/friend.go
Normal file
64
internal/api/friend.go
Normal file
@@ -0,0 +1,64 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/a2r"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/friend"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
type FriendApi rpcclient.Friend
|
||||
|
||||
func NewFriendApi(discov discoveryregistry.SvcDiscoveryRegistry) FriendApi {
|
||||
return FriendApi(*rpcclient.NewFriend(discov))
|
||||
}
|
||||
|
||||
func (o *FriendApi) ApplyToAddFriend(c *gin.Context) {
|
||||
a2r.Call(friend.FriendClient.ApplyToAddFriend, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *FriendApi) RespondFriendApply(c *gin.Context) {
|
||||
a2r.Call(friend.FriendClient.RespondFriendApply, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *FriendApi) DeleteFriend(c *gin.Context) {
|
||||
a2r.Call(friend.FriendClient.DeleteFriend, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *FriendApi) GetFriendApplyList(c *gin.Context) {
|
||||
a2r.Call(friend.FriendClient.GetPaginationFriendsApplyTo, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *FriendApi) GetSelfApplyList(c *gin.Context) {
|
||||
a2r.Call(friend.FriendClient.GetPaginationFriendsApplyFrom, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *FriendApi) GetFriendList(c *gin.Context) {
|
||||
a2r.Call(friend.FriendClient.GetPaginationFriends, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *FriendApi) SetFriendRemark(c *gin.Context) {
|
||||
a2r.Call(friend.FriendClient.SetFriendRemark, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *FriendApi) AddBlack(c *gin.Context) {
|
||||
a2r.Call(friend.FriendClient.AddBlack, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *FriendApi) GetPaginationBlacks(c *gin.Context) {
|
||||
a2r.Call(friend.FriendClient.GetPaginationBlacks, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *FriendApi) RemoveBlack(c *gin.Context) {
|
||||
a2r.Call(friend.FriendClient.RemoveBlack, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *FriendApi) ImportFriends(c *gin.Context) {
|
||||
a2r.Call(friend.FriendClient.ImportFriends, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *FriendApi) IsFriend(c *gin.Context) {
|
||||
a2r.Call(friend.FriendClient.IsFriend, o.Client, c)
|
||||
}
|
||||
116
internal/api/group.go
Normal file
116
internal/api/group.go
Normal file
@@ -0,0 +1,116 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/a2r"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/group"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
type GroupApi rpcclient.Group
|
||||
|
||||
func NewGroupApi(discov discoveryregistry.SvcDiscoveryRegistry) GroupApi {
|
||||
return GroupApi(*rpcclient.NewGroup(discov))
|
||||
}
|
||||
|
||||
func (o *GroupApi) CreateGroup(c *gin.Context) {
|
||||
a2r.Call(group.GroupClient.CreateGroup, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *GroupApi) SetGroupInfo(c *gin.Context) {
|
||||
a2r.Call(group.GroupClient.SetGroupInfo, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *GroupApi) JoinGroup(c *gin.Context) {
|
||||
a2r.Call(group.GroupClient.JoinGroup, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *GroupApi) QuitGroup(c *gin.Context) {
|
||||
a2r.Call(group.GroupClient.QuitGroup, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *GroupApi) ApplicationGroupResponse(c *gin.Context) {
|
||||
a2r.Call(group.GroupClient.GroupApplicationResponse, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *GroupApi) TransferGroupOwner(c *gin.Context) {
|
||||
a2r.Call(group.GroupClient.TransferGroupOwner, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *GroupApi) GetRecvGroupApplicationList(c *gin.Context) {
|
||||
a2r.Call(group.GroupClient.GetGroupApplicationList, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *GroupApi) GetUserReqGroupApplicationList(c *gin.Context) {
|
||||
a2r.Call(group.GroupClient.GetUserReqApplicationList, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *GroupApi) GetGroupsInfo(c *gin.Context) {
|
||||
a2r.Call(group.GroupClient.GetGroupsInfo, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *GroupApi) KickGroupMember(c *gin.Context) {
|
||||
a2r.Call(group.GroupClient.KickGroupMember, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *GroupApi) GetGroupMembersInfo(c *gin.Context) {
|
||||
a2r.Call(group.GroupClient.GetGroupMembersInfo, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *GroupApi) GetGroupMemberList(c *gin.Context) {
|
||||
a2r.Call(group.GroupClient.GetGroupMemberList, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *GroupApi) InviteUserToGroup(c *gin.Context) {
|
||||
a2r.Call(group.GroupClient.InviteUserToGroup, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *GroupApi) GetJoinedGroupList(c *gin.Context) {
|
||||
a2r.Call(group.GroupClient.GetJoinedGroupList, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *GroupApi) DismissGroup(c *gin.Context) {
|
||||
a2r.Call(group.GroupClient.DismissGroup, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *GroupApi) MuteGroupMember(c *gin.Context) {
|
||||
a2r.Call(group.GroupClient.MuteGroupMember, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *GroupApi) CancelMuteGroupMember(c *gin.Context) {
|
||||
a2r.Call(group.GroupClient.CancelMuteGroupMember, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *GroupApi) MuteGroup(c *gin.Context) {
|
||||
a2r.Call(group.GroupClient.MuteGroup, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *GroupApi) CancelMuteGroup(c *gin.Context) {
|
||||
a2r.Call(group.GroupClient.CancelMuteGroup, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *GroupApi) SetGroupMemberInfo(c *gin.Context) {
|
||||
a2r.Call(group.GroupClient.SetGroupMemberInfo, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *GroupApi) GetGroupAbstractInfo(c *gin.Context) {
|
||||
a2r.Call(group.GroupClient.GetGroupAbstractInfo, o.Client, c)
|
||||
}
|
||||
|
||||
//func (g *Group) SetGroupMemberNickname(c *gin.Context) {
|
||||
// a2r.Call(group.GroupClient.SetGroupMemberNickname, g.userClient, c)
|
||||
//}
|
||||
//
|
||||
//func (g *Group) GetGroupAllMemberList(c *gin.Context) {
|
||||
// a2r.Call(group.GroupClient.GetGroupAllMember, g.userClient, c)
|
||||
//}
|
||||
|
||||
func (o *GroupApi) GetJoinedSuperGroupList(c *gin.Context) {
|
||||
a2r.Call(group.GroupClient.GetJoinedSuperGroupList, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *GroupApi) GetSuperGroupsInfo(c *gin.Context) {
|
||||
a2r.Call(group.GroupClient.GetSuperGroupsInfo, o.Client, c)
|
||||
}
|
||||
240
internal/api/msg.go
Normal file
240
internal/api/msg.go
Normal file
@@ -0,0 +1,240 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/a2r"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/apiresp"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/apistruct"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/log"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msg"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/go-playground/validator/v10"
|
||||
"github.com/mitchellh/mapstructure"
|
||||
"google.golang.org/protobuf/proto"
|
||||
)
|
||||
|
||||
type MessageApi struct {
|
||||
rpcclient.Message
|
||||
validate *validator.Validate
|
||||
}
|
||||
|
||||
func NewMessageApi(discov discoveryregistry.SvcDiscoveryRegistry) MessageApi {
|
||||
return MessageApi{Message: *rpcclient.NewMessage(discov), validate: validator.New()}
|
||||
}
|
||||
|
||||
func (MessageApi) SetOptions(options map[string]bool, value bool) {
|
||||
utils.SetSwitchFromOptions(options, constant.IsHistory, value)
|
||||
utils.SetSwitchFromOptions(options, constant.IsPersistent, value)
|
||||
utils.SetSwitchFromOptions(options, constant.IsSenderSync, value)
|
||||
utils.SetSwitchFromOptions(options, constant.IsConversationUpdate, value)
|
||||
}
|
||||
|
||||
func (m MessageApi) newUserSendMsgReq(c *gin.Context, params *apistruct.ManagementSendMsgReq) *msg.SendMsgReq {
|
||||
var newContent string
|
||||
var err error
|
||||
switch params.ContentType {
|
||||
case constant.Text:
|
||||
newContent = params.Content["text"].(string)
|
||||
case constant.Picture:
|
||||
fallthrough
|
||||
case constant.Custom:
|
||||
fallthrough
|
||||
case constant.Voice:
|
||||
fallthrough
|
||||
case constant.Video:
|
||||
fallthrough
|
||||
case constant.File:
|
||||
fallthrough
|
||||
case constant.CustomNotTriggerConversation:
|
||||
fallthrough
|
||||
case constant.CustomOnlineOnly:
|
||||
fallthrough
|
||||
case constant.Revoke:
|
||||
newContent = params.Content["revokeMsgClientID"].(string)
|
||||
default:
|
||||
}
|
||||
options := make(map[string]bool, 5)
|
||||
if params.IsOnlineOnly {
|
||||
m.SetOptions(options, false)
|
||||
}
|
||||
if params.NotOfflinePush {
|
||||
utils.SetSwitchFromOptions(options, constant.IsOfflinePush, false)
|
||||
}
|
||||
if params.ContentType == constant.CustomOnlineOnly {
|
||||
m.SetOptions(options, false)
|
||||
} else if params.ContentType == constant.CustomNotTriggerConversation {
|
||||
utils.SetSwitchFromOptions(options, constant.IsConversationUpdate, false)
|
||||
}
|
||||
pbData := msg.SendMsgReq{
|
||||
MsgData: &sdkws.MsgData{
|
||||
SendID: params.SendID,
|
||||
GroupID: params.GroupID,
|
||||
ClientMsgID: utils.GetMsgID(params.SendID),
|
||||
SenderPlatformID: params.SenderPlatformID,
|
||||
SenderNickname: params.SenderNickname,
|
||||
SenderFaceURL: params.SenderFaceURL,
|
||||
SessionType: params.SessionType,
|
||||
MsgFrom: constant.SysMsgType,
|
||||
ContentType: params.ContentType,
|
||||
Content: []byte(newContent),
|
||||
RecvID: params.RecvID,
|
||||
CreateTime: utils.GetCurrentTimestampByMill(),
|
||||
Options: options,
|
||||
OfflinePushInfo: params.OfflinePushInfo,
|
||||
},
|
||||
}
|
||||
if params.ContentType == constant.OANotification {
|
||||
var tips sdkws.TipsComm
|
||||
tips.JsonDetail = utils.StructToJsonString(params.Content)
|
||||
pbData.MsgData.Content, err = proto.Marshal(&tips)
|
||||
if err != nil {
|
||||
log.ZError(c, "Marshal failed ", err, "tips", tips.String())
|
||||
}
|
||||
}
|
||||
return &pbData
|
||||
}
|
||||
|
||||
func (m *MessageApi) GetSeq(c *gin.Context) {
|
||||
a2r.Call(msg.MsgClient.GetMaxSeq, m.Client, c)
|
||||
}
|
||||
|
||||
func (m *MessageApi) PullMsgBySeqs(c *gin.Context) {
|
||||
a2r.Call(msg.MsgClient.PullMessageBySeqs, m.Client, c)
|
||||
}
|
||||
|
||||
func (m *MessageApi) RevokeMsg(c *gin.Context) {
|
||||
a2r.Call(msg.MsgClient.RevokeMsg, m.Client, c)
|
||||
}
|
||||
|
||||
func (m *MessageApi) MarkMsgsAsRead(c *gin.Context) {
|
||||
a2r.Call(msg.MsgClient.MarkMsgsAsRead, m.Client, c)
|
||||
}
|
||||
|
||||
func (m *MessageApi) MarkConversationAsRead(c *gin.Context) {
|
||||
a2r.Call(msg.MsgClient.MarkConversationAsRead, m.Client, c)
|
||||
}
|
||||
|
||||
func (m *MessageApi) GetConversationsHasReadAndMaxSeq(c *gin.Context) {
|
||||
a2r.Call(msg.MsgClient.GetConversationsHasReadAndMaxSeq, m.Client, c)
|
||||
}
|
||||
|
||||
func (m *MessageApi) SetConversationHasReadSeq(c *gin.Context) {
|
||||
a2r.Call(msg.MsgClient.SetConversationHasReadSeq, m.Client, c)
|
||||
}
|
||||
|
||||
func (m *MessageApi) ClearConversationsMsg(c *gin.Context) {
|
||||
a2r.Call(msg.MsgClient.ClearConversationsMsg, m.Client, c)
|
||||
}
|
||||
|
||||
func (m *MessageApi) UserClearAllMsg(c *gin.Context) {
|
||||
a2r.Call(msg.MsgClient.UserClearAllMsg, m.Client, c)
|
||||
}
|
||||
|
||||
func (m *MessageApi) DeleteMsgs(c *gin.Context) {
|
||||
a2r.Call(msg.MsgClient.DeleteMsgs, m.Client, c)
|
||||
}
|
||||
|
||||
func (m *MessageApi) DeleteMsgPhysicalBySeq(c *gin.Context) {
|
||||
a2r.Call(msg.MsgClient.DeleteMsgPhysicalBySeq, m.Client, c)
|
||||
}
|
||||
|
||||
func (m *MessageApi) DeleteMsgPhysical(c *gin.Context) {
|
||||
a2r.Call(msg.MsgClient.DeleteMsgPhysical, m.Client, c)
|
||||
}
|
||||
|
||||
func (m *MessageApi) SetMessageReactionExtensions(c *gin.Context) {
|
||||
a2r.Call(msg.MsgClient.SetMessageReactionExtensions, m.Client, c)
|
||||
}
|
||||
|
||||
func (m *MessageApi) GetMessageListReactionExtensions(c *gin.Context) {
|
||||
a2r.Call(msg.MsgClient.GetMessagesReactionExtensions, m.Client, c)
|
||||
}
|
||||
|
||||
func (m *MessageApi) AddMessageReactionExtensions(c *gin.Context) {
|
||||
a2r.Call(msg.MsgClient.AddMessageReactionExtensions, m.Client, c)
|
||||
}
|
||||
|
||||
func (m *MessageApi) DeleteMessageReactionExtensions(c *gin.Context) {
|
||||
a2r.Call(msg.MsgClient.DeleteMessageReactionExtensions, m.Client, c)
|
||||
}
|
||||
|
||||
func (m *MessageApi) SendMessage(c *gin.Context) {
|
||||
params := apistruct.ManagementSendMsgReq{}
|
||||
if err := c.BindJSON(¶ms); err != nil {
|
||||
apiresp.GinError(c, errs.ErrArgs.WithDetail(err.Error()).Wrap())
|
||||
return
|
||||
}
|
||||
// todo
|
||||
//if !tokenverify.IsAppManagerUid(c) {
|
||||
// apiresp.GinError(c, errs.ErrNoPermission.Wrap("only app manager can send message"))
|
||||
// return
|
||||
//}
|
||||
|
||||
var data interface{}
|
||||
switch params.ContentType {
|
||||
case constant.Text:
|
||||
data = apistruct.TextElem{}
|
||||
case constant.Picture:
|
||||
data = apistruct.PictureElem{}
|
||||
case constant.Voice:
|
||||
data = apistruct.SoundElem{}
|
||||
case constant.Video:
|
||||
data = apistruct.VideoElem{}
|
||||
case constant.File:
|
||||
data = apistruct.FileElem{}
|
||||
case constant.Custom:
|
||||
data = apistruct.CustomElem{}
|
||||
case constant.Revoke:
|
||||
data = apistruct.RevokeElem{}
|
||||
case constant.OANotification:
|
||||
data = apistruct.OANotificationElem{}
|
||||
params.SessionType = constant.NotificationChatType
|
||||
case constant.CustomNotTriggerConversation:
|
||||
data = apistruct.CustomElem{}
|
||||
case constant.CustomOnlineOnly:
|
||||
data = apistruct.CustomElem{}
|
||||
default:
|
||||
apiresp.GinError(c, errs.ErrArgs.WithDetail("not support err contentType").Wrap())
|
||||
return
|
||||
}
|
||||
if err := mapstructure.WeakDecode(params.Content, &data); err != nil {
|
||||
apiresp.GinError(c, errs.ErrArgs.Wrap(err.Error()))
|
||||
return
|
||||
} else if err := m.validate.Struct(data); err != nil {
|
||||
apiresp.GinError(c, errs.ErrArgs.Wrap(err.Error()))
|
||||
return
|
||||
}
|
||||
pbReq := m.newUserSendMsgReq(c, ¶ms)
|
||||
var status int
|
||||
respPb, err := m.Client.SendMsg(c, pbReq)
|
||||
if err != nil {
|
||||
status = constant.MsgSendFailed
|
||||
apiresp.GinError(c, err)
|
||||
return
|
||||
}
|
||||
status = constant.MsgSendSuccessed
|
||||
_, err = m.Client.SetSendMsgStatus(c, &msg.SetSendMsgStatusReq{
|
||||
Status: int32(status),
|
||||
})
|
||||
if err != nil {
|
||||
log.ZError(c, "SetSendMsgStatus failed", err)
|
||||
}
|
||||
apiresp.GinSuccess(c, respPb)
|
||||
}
|
||||
|
||||
func (m *MessageApi) ManagementBatchSendMsg(c *gin.Context) {
|
||||
a2r.Call(msg.MsgClient.SendMsg, m.Client, c)
|
||||
}
|
||||
|
||||
func (m *MessageApi) CheckMsgIsSendSuccess(c *gin.Context) {
|
||||
a2r.Call(msg.MsgClient.GetSendMsgStatus, m.Client, c)
|
||||
}
|
||||
|
||||
func (m *MessageApi) GetUsersOnlineStatus(c *gin.Context) {
|
||||
a2r.Call(msg.MsgClient.GetSendMsgStatus, m.Client, c)
|
||||
}
|
||||
182
internal/api/route.go
Normal file
182
internal/api/route.go
Normal file
@@ -0,0 +1,182 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/log"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/mw"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/prome"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/gin-gonic/gin/binding"
|
||||
"github.com/go-playground/validator/v10"
|
||||
"github.com/redis/go-redis/v9"
|
||||
"google.golang.org/grpc"
|
||||
"google.golang.org/grpc/credentials/insecure"
|
||||
)
|
||||
|
||||
func NewGinRouter(discov discoveryregistry.SvcDiscoveryRegistry, rdb redis.UniversalClient) *gin.Engine {
|
||||
discov.AddOption(mw.GrpcClient(), grpc.WithTransportCredentials(insecure.NewCredentials())) // 默认RPC中间件
|
||||
gin.SetMode(gin.ReleaseMode)
|
||||
//f, _ := os.Create("../logs/api.log")
|
||||
//gin.DefaultWriter = io.MultiWriter(f)
|
||||
//gin.SetMode(gin.DebugMode)
|
||||
r := gin.New()
|
||||
if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
|
||||
_ = v.RegisterValidation("required_if", RequiredIf)
|
||||
}
|
||||
log.ZInfo(context.Background(), "load config", "config", config.Config)
|
||||
r.Use(gin.Recovery(), mw.CorsHandler(), mw.GinParseOperationID())
|
||||
if config.Config.Prometheus.Enable {
|
||||
prome.NewApiRequestCounter()
|
||||
prome.NewApiRequestFailedCounter()
|
||||
prome.NewApiRequestSuccessCounter()
|
||||
r.Use(prome.PrometheusMiddleware)
|
||||
r.GET("/metrics", prome.PrometheusHandler())
|
||||
}
|
||||
userRouterGroup := r.Group("/user")
|
||||
{
|
||||
u := NewUserApi(discov)
|
||||
userRouterGroupChild := mw.NewRouterGroup(userRouterGroup, "")
|
||||
userRouterGroupChildToken := mw.NewRouterGroup(userRouterGroup, "", mw.WithGinParseToken(rdb))
|
||||
userRouterGroupChild.POST("/user_register", u.UserRegister)
|
||||
userRouterGroupChildToken.POST("/update_user_info", u.UpdateUserInfo) //1
|
||||
userRouterGroupChildToken.POST("/set_global_msg_recv_opt", u.SetGlobalRecvMessageOpt)
|
||||
userRouterGroupChildToken.POST("/get_users_info", u.GetUsersPublicInfo) //1
|
||||
userRouterGroupChildToken.POST("/get_all_users_uid", u.GetAllUsersID) // todo
|
||||
userRouterGroupChildToken.POST("/account_check", u.AccountCheck) // todo
|
||||
userRouterGroupChildToken.POST("/get_users", u.GetUsers)
|
||||
userRouterGroupChildToken.POST("/get_users_online_status", u.GetUsersOnlineStatus)
|
||||
}
|
||||
//friend routing group
|
||||
friendRouterGroup := r.Group("/friend")
|
||||
{
|
||||
f := NewFriendApi(discov)
|
||||
friendRouterGroup.Use(mw.GinParseToken(rdb))
|
||||
friendRouterGroup.POST("/delete_friend", f.DeleteFriend) //1
|
||||
friendRouterGroup.POST("/get_friend_apply_list", f.GetFriendApplyList) //1
|
||||
friendRouterGroup.POST("/get_self_friend_apply_list", f.GetSelfApplyList) //1
|
||||
friendRouterGroup.POST("/get_friend_list", f.GetFriendList) //1
|
||||
friendRouterGroup.POST("/add_friend", f.ApplyToAddFriend) //1
|
||||
friendRouterGroup.POST("/add_friend_response", f.RespondFriendApply) //1
|
||||
friendRouterGroup.POST("/set_friend_remark", f.SetFriendRemark) //1
|
||||
friendRouterGroup.POST("/add_black", f.AddBlack) //1
|
||||
friendRouterGroup.POST("/get_black_list", f.GetPaginationBlacks) //1
|
||||
friendRouterGroup.POST("/remove_black", f.RemoveBlack) //1
|
||||
friendRouterGroup.POST("/import_friend", f.ImportFriends) //1
|
||||
friendRouterGroup.POST("/is_friend", f.IsFriend) //1
|
||||
}
|
||||
g := NewGroupApi(discov)
|
||||
groupRouterGroup := r.Group("/group")
|
||||
{
|
||||
|
||||
groupRouterGroup.Use(mw.GinParseToken(rdb))
|
||||
groupRouterGroup.POST("/create_group", g.CreateGroup) //1
|
||||
groupRouterGroup.POST("/set_group_info", g.SetGroupInfo) //1
|
||||
groupRouterGroup.POST("/join_group", g.JoinGroup) //1
|
||||
groupRouterGroup.POST("/quit_group", g.QuitGroup) //1
|
||||
groupRouterGroup.POST("/group_application_response", g.ApplicationGroupResponse) //1
|
||||
groupRouterGroup.POST("/transfer_group", g.TransferGroupOwner) //1
|
||||
groupRouterGroup.POST("/get_recv_group_applicationList", g.GetRecvGroupApplicationList) //1
|
||||
groupRouterGroup.POST("/get_user_req_group_applicationList", g.GetUserReqGroupApplicationList)
|
||||
groupRouterGroup.POST("/get_groups_info", g.GetGroupsInfo) //1
|
||||
groupRouterGroup.POST("/kick_group", g.KickGroupMember) //1
|
||||
// groupRouterGroup.POST("/get_group_all_member_list", g.GetGroupAllMemberList) //1
|
||||
groupRouterGroup.POST("/get_group_members_info", g.GetGroupMembersInfo) //1
|
||||
groupRouterGroup.POST("/get_group_member_list", g.GetGroupMemberList) //1
|
||||
groupRouterGroup.POST("/invite_user_to_group", g.InviteUserToGroup) //1
|
||||
groupRouterGroup.POST("/get_joined_group_list", g.GetJoinedGroupList)
|
||||
groupRouterGroup.POST("/dismiss_group", g.DismissGroup) //
|
||||
groupRouterGroup.POST("/mute_group_member", g.MuteGroupMember)
|
||||
groupRouterGroup.POST("/cancel_mute_group_member", g.CancelMuteGroupMember) //MuteGroup
|
||||
groupRouterGroup.POST("/mute_group", g.MuteGroup)
|
||||
groupRouterGroup.POST("/cancel_mute_group", g.CancelMuteGroup)
|
||||
//groupRouterGroup.POST("/set_group_member_nickname", g.SetGroupMemberNickname)
|
||||
groupRouterGroup.POST("/set_group_member_info", g.SetGroupMemberInfo)
|
||||
groupRouterGroup.POST("/get_group_abstract_info", g.GetGroupAbstractInfo)
|
||||
}
|
||||
superGroupRouterGroup := r.Group("/super_group")
|
||||
{
|
||||
superGroupRouterGroup.Use(mw.GinParseToken(rdb))
|
||||
superGroupRouterGroup.POST("/get_joined_group_list", g.GetJoinedSuperGroupList)
|
||||
superGroupRouterGroup.POST("/get_groups_info", g.GetSuperGroupsInfo)
|
||||
}
|
||||
////certificate
|
||||
authRouterGroup := r.Group("/auth")
|
||||
{
|
||||
a := NewAuthApi(discov)
|
||||
u := NewUserApi(discov)
|
||||
authRouterGroupChild := mw.NewRouterGroup(authRouterGroup, "")
|
||||
authRouterGroupChildToken := mw.NewRouterGroup(authRouterGroup, "", mw.WithGinParseToken(rdb))
|
||||
authRouterGroupChild.POST("/user_register", u.UserRegister) //1
|
||||
authRouterGroupChild.POST("/user_token", a.UserToken) //1
|
||||
authRouterGroupChildToken.POST("/parse_token", a.ParseToken) //1
|
||||
authRouterGroupChildToken.POST("/force_logout", a.ForceLogout) //1
|
||||
}
|
||||
////Third service
|
||||
thirdGroup := r.Group("/third")
|
||||
{
|
||||
t := NewThirdApi(discov)
|
||||
thirdGroup.Use(mw.GinParseToken(rdb))
|
||||
thirdGroup.POST("/fcm_update_token", t.FcmUpdateToken)
|
||||
thirdGroup.POST("/set_app_badge", t.SetAppBadge)
|
||||
|
||||
thirdGroup.POST("/apply_put", t.ApplyPut)
|
||||
thirdGroup.POST("/get_put", t.GetPut)
|
||||
thirdGroup.POST("/confirm_put", t.ConfirmPut)
|
||||
thirdGroup.POST("/get_hash", t.GetHash)
|
||||
thirdGroup.POST("/object", t.GetURL)
|
||||
thirdGroup.GET("/object", t.GetURL)
|
||||
}
|
||||
////Message
|
||||
msgGroup := r.Group("/msg")
|
||||
{
|
||||
m := NewMessageApi(discov)
|
||||
msgGroup.Use(mw.GinParseToken(rdb))
|
||||
msgGroup.POST("/newest_seq", m.GetSeq)
|
||||
msgGroup.POST("/send_msg", m.SendMessage)
|
||||
msgGroup.POST("/pull_msg_by_seq", m.PullMsgBySeqs)
|
||||
msgGroup.POST("/revoke_msg", m.RevokeMsg)
|
||||
msgGroup.POST("/mark_msgs_as_read", m.MarkMsgsAsRead)
|
||||
msgGroup.POST("/mark_conversation_as_read", m.MarkConversationAsRead)
|
||||
msgGroup.POST("/get_conversations_has_read_and_max_seq", m.GetConversationsHasReadAndMaxSeq)
|
||||
msgGroup.POST("/set_conversation_has_read_seq", m.SetConversationHasReadSeq)
|
||||
|
||||
msgGroup.POST("/clear_conversation_msg", m.ClearConversationsMsg)
|
||||
msgGroup.POST("/user_clear_all_msg", m.UserClearAllMsg)
|
||||
msgGroup.POST("/delete_msgs", m.DeleteMsgs)
|
||||
msgGroup.POST("/delete_msg_phsical_by_seq", m.DeleteMsgPhysicalBySeq)
|
||||
msgGroup.POST("/delete_msg_physical", m.DeleteMsgPhysical)
|
||||
|
||||
msgGroup.POST("/batch_send_msg", m.ManagementBatchSendMsg)
|
||||
msgGroup.POST("/check_msg_is_send_success", m.CheckMsgIsSendSuccess)
|
||||
|
||||
//msgGroup.POST("/set_message_reaction_extensions", msg.SetMessageReactionExtensions)
|
||||
//msgGroup.POST("/get_message_list_reaction_extensions", msg.GetMessageListReactionExtensions)
|
||||
//msgGroup.POST("/add_message_reaction_extensions", msg.AddMessageReactionExtensions)
|
||||
//msgGroup.POST("/delete_message_reaction_extensions", msg.DeleteMessageReactionExtensions)
|
||||
}
|
||||
////Conversation
|
||||
conversationGroup := r.Group("/conversation")
|
||||
{
|
||||
c := NewConversationApi(discov)
|
||||
conversationGroup.Use(mw.GinParseToken(rdb))
|
||||
conversationGroup.POST("/get_all_conversations", c.GetAllConversations)
|
||||
conversationGroup.POST("/get_conversation", c.GetConversation)
|
||||
conversationGroup.POST("/get_conversations", c.GetConversations)
|
||||
conversationGroup.POST("/set_conversation", c.SetConversation)
|
||||
conversationGroup.POST("/batch_set_conversation", c.BatchSetConversations)
|
||||
conversationGroup.POST("/set_recv_msg_opt", c.SetRecvMsgOpt)
|
||||
conversationGroup.POST("/modify_conversation_field", c.ModifyConversationField)
|
||||
conversationGroup.POST("/set_conversations", c.SetConversations)
|
||||
}
|
||||
|
||||
statisticsGroup := r.Group("/statistics")
|
||||
{
|
||||
s := NewStatisticsApi(discov)
|
||||
conversationGroup.Use(mw.GinParseToken(rdb))
|
||||
statisticsGroup.POST("/user_register", s.UserRegister)
|
||||
}
|
||||
return r
|
||||
}
|
||||
19
internal/api/statistics.go
Normal file
19
internal/api/statistics.go
Normal file
@@ -0,0 +1,19 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/a2r"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/user"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
type StatisticsApi rpcclient.User
|
||||
|
||||
func NewStatisticsApi(discov discoveryregistry.SvcDiscoveryRegistry) StatisticsApi {
|
||||
return StatisticsApi(*rpcclient.NewUser(discov))
|
||||
}
|
||||
|
||||
func (s *StatisticsApi) UserRegister(c *gin.Context) {
|
||||
a2r.Call(user.UserClient.UserRegisterCount, s.Client, c)
|
||||
}
|
||||
82
internal/api/third.go
Normal file
82
internal/api/third.go
Normal file
@@ -0,0 +1,82 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"math/rand"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/a2r"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/mcontext"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/third"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
type ThirdApi rpcclient.Third
|
||||
|
||||
func NewThirdApi(discov discoveryregistry.SvcDiscoveryRegistry) ThirdApi {
|
||||
return ThirdApi(*rpcclient.NewThird(discov))
|
||||
}
|
||||
|
||||
func (o *ThirdApi) ApplyPut(c *gin.Context) {
|
||||
a2r.Call(third.ThirdClient.ApplyPut, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *ThirdApi) GetPut(c *gin.Context) {
|
||||
a2r.Call(third.ThirdClient.GetPut, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *ThirdApi) ConfirmPut(c *gin.Context) {
|
||||
a2r.Call(third.ThirdClient.ConfirmPut, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *ThirdApi) GetHash(c *gin.Context) {
|
||||
a2r.Call(third.ThirdClient.GetHashInfo, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *ThirdApi) FcmUpdateToken(c *gin.Context) {
|
||||
a2r.Call(third.ThirdClient.FcmUpdateToken, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *ThirdApi) SetAppBadge(c *gin.Context) {
|
||||
a2r.Call(third.ThirdClient.SetAppBadge, o.Client, c)
|
||||
}
|
||||
|
||||
func (o *ThirdApi) GetURL(c *gin.Context) {
|
||||
if c.Request.Method == http.MethodPost {
|
||||
a2r.Call(third.ThirdClient.GetUrl, o.Client, c)
|
||||
return
|
||||
}
|
||||
name := c.Query("name")
|
||||
if name == "" {
|
||||
c.String(http.StatusBadRequest, "name is empty")
|
||||
return
|
||||
}
|
||||
operationID := c.Query("operationID")
|
||||
if operationID == "" {
|
||||
operationID = "auto_" + strconv.Itoa(rand.Int())
|
||||
}
|
||||
expires, _ := strconv.ParseInt(c.Query("expires"), 10, 64)
|
||||
if expires <= 0 {
|
||||
expires = 3600 * 1000
|
||||
}
|
||||
attachment, _ := strconv.ParseBool(c.Query("attachment"))
|
||||
c.Set(constant.OperationID, operationID)
|
||||
resp, err := o.Client.GetUrl(mcontext.SetOperationID(c, operationID), &third.GetUrlReq{Name: name, Expires: expires, Attachment: attachment})
|
||||
if err != nil {
|
||||
if errs.ErrArgs.Is(err) {
|
||||
c.String(http.StatusBadRequest, err.Error())
|
||||
return
|
||||
}
|
||||
if errs.ErrRecordNotFound.Is(err) {
|
||||
c.String(http.StatusNotFound, err.Error())
|
||||
return
|
||||
}
|
||||
c.String(http.StatusInternalServerError, err.Error())
|
||||
return
|
||||
}
|
||||
c.Redirect(http.StatusTemporaryRedirect, resp.Url)
|
||||
}
|
||||
59
internal/api/user.go
Normal file
59
internal/api/user.go
Normal file
@@ -0,0 +1,59 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/a2r"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/apiresp"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/apistruct"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/tokenverify"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/user"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
type UserApi rpcclient.User
|
||||
|
||||
func NewUserApi(discov discoveryregistry.SvcDiscoveryRegistry) UserApi {
|
||||
return UserApi(*rpcclient.NewUser(discov))
|
||||
}
|
||||
|
||||
func (u *UserApi) UserRegister(c *gin.Context) {
|
||||
a2r.Call(user.UserClient.UserRegister, u.Client, c)
|
||||
}
|
||||
|
||||
func (u *UserApi) UpdateUserInfo(c *gin.Context) {
|
||||
a2r.Call(user.UserClient.UpdateUserInfo, u.Client, c)
|
||||
}
|
||||
|
||||
func (u *UserApi) SetGlobalRecvMessageOpt(c *gin.Context) {
|
||||
a2r.Call(user.UserClient.SetGlobalRecvMessageOpt, u.Client, c)
|
||||
}
|
||||
|
||||
func (u *UserApi) GetUsersPublicInfo(c *gin.Context) {
|
||||
a2r.Call(user.UserClient.GetDesignateUsers, u.Client, c)
|
||||
}
|
||||
|
||||
func (u *UserApi) GetAllUsersID(c *gin.Context) {
|
||||
a2r.Call(user.UserClient.GetDesignateUsers, u.Client, c)
|
||||
}
|
||||
|
||||
func (u *UserApi) AccountCheck(c *gin.Context) {
|
||||
a2r.Call(user.UserClient.AccountCheck, u.Client, c)
|
||||
}
|
||||
|
||||
func (u *UserApi) GetUsers(c *gin.Context) {
|
||||
a2r.Call(user.UserClient.GetPaginationUsers, u.Client, c)
|
||||
}
|
||||
|
||||
func (u *UserApi) GetUsersOnlineStatus(c *gin.Context) {
|
||||
params := apistruct.ManagementSendMsgReq{}
|
||||
if err := c.BindJSON(¶ms); err != nil {
|
||||
apiresp.GinError(c, errs.ErrArgs.WithDetail(err.Error()).Wrap())
|
||||
return
|
||||
}
|
||||
if !tokenverify.IsAppManagerUid(c) {
|
||||
apiresp.GinError(c, errs.ErrNoPermission.Wrap("only app manager can send message"))
|
||||
return
|
||||
}
|
||||
}
|
||||
155
internal/msggateway/callback.go
Normal file
155
internal/msggateway/callback.go
Normal file
@@ -0,0 +1,155 @@
|
||||
package msggateway
|
||||
|
||||
import (
|
||||
"context"
|
||||
cbapi "github.com/OpenIMSDK/Open-IM-Server/pkg/callbackstruct"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/http"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/mcontext"
|
||||
"time"
|
||||
)
|
||||
|
||||
func url() string {
|
||||
return config.Config.Callback.CallbackUrl
|
||||
}
|
||||
|
||||
func CallbackUserOnline(ctx context.Context, userID string, platformID int, isAppBackground bool, connID string) error {
|
||||
if !config.Config.Callback.CallbackUserOnline.Enable {
|
||||
return nil
|
||||
}
|
||||
req := cbapi.CallbackUserOnlineReq{
|
||||
UserStatusCallbackReq: cbapi.UserStatusCallbackReq{
|
||||
UserStatusBaseCallback: cbapi.UserStatusBaseCallback{
|
||||
CallbackCommand: constant.CallbackUserOnlineCommand,
|
||||
OperationID: mcontext.GetOperationID(ctx),
|
||||
PlatformID: platformID,
|
||||
Platform: constant.PlatformIDToName(platformID),
|
||||
},
|
||||
UserID: userID,
|
||||
},
|
||||
Seq: time.Now().UnixMilli(),
|
||||
IsAppBackground: isAppBackground,
|
||||
ConnID: connID,
|
||||
}
|
||||
resp := cbapi.CommonCallbackResp{}
|
||||
return http.CallBackPostReturn(ctx, url(), &req, &resp, config.Config.Callback.CallbackUserOnline)
|
||||
}
|
||||
|
||||
func CallbackUserOffline(ctx context.Context, userID string, platformID int, connID string) error {
|
||||
if !config.Config.Callback.CallbackUserOffline.Enable {
|
||||
return nil
|
||||
}
|
||||
req := &cbapi.CallbackUserOfflineReq{
|
||||
UserStatusCallbackReq: cbapi.UserStatusCallbackReq{
|
||||
UserStatusBaseCallback: cbapi.UserStatusBaseCallback{
|
||||
CallbackCommand: constant.CallbackUserOfflineCommand,
|
||||
OperationID: mcontext.GetOperationID(ctx),
|
||||
PlatformID: platformID,
|
||||
Platform: constant.PlatformIDToName(platformID),
|
||||
},
|
||||
UserID: userID,
|
||||
},
|
||||
Seq: time.Now().UnixMilli(),
|
||||
ConnID: connID,
|
||||
}
|
||||
resp := &cbapi.CallbackUserOfflineResp{}
|
||||
return http.CallBackPostReturn(ctx, url(), req, resp, config.Config.Callback.CallbackUserOffline)
|
||||
}
|
||||
|
||||
func CallbackUserKickOff(ctx context.Context, userID string, platformID int) error {
|
||||
if !config.Config.Callback.CallbackUserKickOff.Enable {
|
||||
return nil
|
||||
}
|
||||
req := &cbapi.CallbackUserKickOffReq{
|
||||
UserStatusCallbackReq: cbapi.UserStatusCallbackReq{
|
||||
UserStatusBaseCallback: cbapi.UserStatusBaseCallback{
|
||||
CallbackCommand: constant.CallbackUserKickOffCommand,
|
||||
OperationID: mcontext.GetOperationID(ctx),
|
||||
PlatformID: platformID,
|
||||
Platform: constant.PlatformIDToName(platformID),
|
||||
},
|
||||
UserID: userID,
|
||||
},
|
||||
Seq: time.Now().UnixMilli(),
|
||||
}
|
||||
resp := &cbapi.CommonCallbackResp{}
|
||||
return http.CallBackPostReturn(ctx, url(), req, resp, config.Config.Callback.CallbackUserOffline)
|
||||
}
|
||||
|
||||
//func callbackUserOnline(operationID, userID string, platformID int, token string, isAppBackground bool, connID string) cbApi.CommonCallbackResp {
|
||||
// callbackResp := cbApi.CommonCallbackResp{OperationID: operationID}
|
||||
// if !config.Config.Callback.CallbackUserOnline.Enable {
|
||||
// return callbackResp
|
||||
// }
|
||||
// callbackUserOnlineReq := cbApi.CallbackUserOnlineReq{
|
||||
// Token: token,
|
||||
// UserStatusCallbackReq: cbApi.UserStatusCallbackReq{
|
||||
// UserStatusBaseCallback: cbApi.UserStatusBaseCallback{
|
||||
// CallbackCommand: constant.CallbackUserOnlineCommand,
|
||||
// OperationID: operationID,
|
||||
// PlatformID: int32(platformID),
|
||||
// Platform: constant.PlatformIDToName(platformID),
|
||||
// },
|
||||
// UserID: userID,
|
||||
// },
|
||||
// Seq: int(time.Now().UnixNano() / 1e6),
|
||||
// IsAppBackground: isAppBackground,
|
||||
// ConnID: connID,
|
||||
// }
|
||||
// callbackUserOnlineResp := &cbApi.CallbackUserOnlineResp{CommonCallbackResp: &callbackResp}
|
||||
// if err := http.CallBackPostReturn(ctx, config.Config.Callback.CallbackUrl, constant.CallbackUserOnlineCommand, callbackUserOnlineReq, callbackUserOnlineResp, config.Config.Callback.CallbackUserOnline.CallbackTimeOut); err != nil {
|
||||
// callbackResp.ErrCode = http2.StatusInternalServerError
|
||||
// callbackResp.ErrMsg = err.Error()
|
||||
// }
|
||||
// return callbackResp
|
||||
//}
|
||||
//func callbackUserOffline(operationID, userID string, platformID int, connID string) cbApi.CommonCallbackResp {
|
||||
// callbackResp := cbApi.CommonCallbackResp{OperationID: operationID}
|
||||
// if !config.Config.Callback.CallbackUserOffline.Enable {
|
||||
// return callbackResp
|
||||
// }
|
||||
// callbackOfflineReq := cbApi.CallbackUserOfflineReq{
|
||||
// UserStatusCallbackReq: cbApi.UserStatusCallbackReq{
|
||||
// UserStatusBaseCallback: cbApi.UserStatusBaseCallback{
|
||||
// CallbackCommand: constant.CallbackUserOfflineCommand,
|
||||
// OperationID: operationID,
|
||||
// PlatformID: int32(platformID),
|
||||
// Platform: constant.PlatformIDToName(platformID),
|
||||
// },
|
||||
// UserID: userID,
|
||||
// },
|
||||
// Seq: int(time.Now().UnixNano() / 1e6),
|
||||
// ConnID: connID,
|
||||
// }
|
||||
// callbackUserOfflineResp := &cbApi.CallbackUserOfflineResp{CommonCallbackResp: &callbackResp}
|
||||
// if err := http.CallBackPostReturn(ctx, config.Config.Callback.CallbackUrl, constant.CallbackUserOfflineCommand, callbackOfflineReq, callbackUserOfflineResp, config.Config.Callback.CallbackUserOffline.CallbackTimeOut); err != nil {
|
||||
// callbackResp.ErrCode = http2.StatusInternalServerError
|
||||
// callbackResp.ErrMsg = err.Error()
|
||||
// }
|
||||
// return callbackResp
|
||||
//}
|
||||
//func callbackUserKickOff(operationID string, userID string, platformID int) cbApi.CommonCallbackResp {
|
||||
// callbackResp := cbApi.CommonCallbackResp{OperationID: operationID}
|
||||
// if !config.Config.Callback.CallbackUserKickOff.Enable {
|
||||
// return callbackResp
|
||||
// }
|
||||
// callbackUserKickOffReq := cbApi.CallbackUserKickOffReq{
|
||||
// UserStatusCallbackReq: cbApi.UserStatusCallbackReq{
|
||||
// UserStatusBaseCallback: cbApi.UserStatusBaseCallback{
|
||||
// CallbackCommand: constant.CallbackUserKickOffCommand,
|
||||
// OperationID: operationID,
|
||||
// PlatformID: int32(platformID),
|
||||
// Platform: constant.PlatformIDToName(platformID),
|
||||
// },
|
||||
// UserID: userID,
|
||||
// },
|
||||
// Seq: int(time.Now().UnixNano() / 1e6),
|
||||
// }
|
||||
// callbackUserKickOffResp := &cbApi.CallbackUserKickOffResp{CommonCallbackResp: &callbackResp}
|
||||
// if err := http.CallBackPostReturn(ctx, config.Config.Callback.CallbackUrl, constant.CallbackUserKickOffCommand, callbackUserKickOffReq, callbackUserKickOffResp, config.Config.Callback.CallbackUserOffline.CallbackTimeOut); err != nil {
|
||||
// callbackResp.ErrCode = http2.StatusInternalServerError
|
||||
// callbackResp.ErrMsg = err.Error()
|
||||
// }
|
||||
// return callbackResp
|
||||
//}
|
||||
268
internal/msggateway/client.go
Normal file
268
internal/msggateway/client.go
Normal file
@@ -0,0 +1,268 @@
|
||||
package msggateway
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"runtime/debug"
|
||||
"sync"
|
||||
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/apiresp"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/log"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/mcontext"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
|
||||
"google.golang.org/protobuf/proto"
|
||||
)
|
||||
|
||||
var ErrConnClosed = errors.New("conn has closed")
|
||||
var ErrNotSupportMessageProtocol = errors.New("not support message protocol")
|
||||
var ErrClientClosed = errors.New("client actively close the connection")
|
||||
var ErrPanic = errors.New("panic error")
|
||||
|
||||
const (
|
||||
// MessageText is for UTF-8 encoded text messages like JSON.
|
||||
MessageText = iota + 1
|
||||
// MessageBinary is for binary messages like protobufs.
|
||||
MessageBinary
|
||||
// CloseMessage denotes a close control message. The optional message
|
||||
// payload contains a numeric code and text. Use the FormatCloseMessage
|
||||
// function to format a close message payload.
|
||||
CloseMessage = 8
|
||||
|
||||
// PingMessage denotes a ping control message. The optional message payload
|
||||
// is UTF-8 encoded text.
|
||||
PingMessage = 9
|
||||
|
||||
// PongMessage denotes a pong control message. The optional message payload
|
||||
// is UTF-8 encoded text.
|
||||
PongMessage = 10
|
||||
)
|
||||
|
||||
type PongHandler func(string) error
|
||||
|
||||
type Client struct {
|
||||
w *sync.Mutex
|
||||
conn LongConn
|
||||
PlatformID int `json:"platformID"`
|
||||
IsCompress bool `json:"isCompress"`
|
||||
UserID string `json:"userID"`
|
||||
IsBackground bool `json:"isBackground"`
|
||||
ctx *UserConnContext
|
||||
longConnServer LongConnServer
|
||||
closed bool
|
||||
closedErr error
|
||||
}
|
||||
|
||||
func newClient(ctx *UserConnContext, conn LongConn, isCompress bool) *Client {
|
||||
return &Client{
|
||||
w: new(sync.Mutex),
|
||||
conn: conn,
|
||||
PlatformID: utils.StringToInt(ctx.GetPlatformID()),
|
||||
IsCompress: isCompress,
|
||||
UserID: ctx.GetUserID(),
|
||||
ctx: ctx,
|
||||
}
|
||||
}
|
||||
func (c *Client) ResetClient(ctx *UserConnContext, conn LongConn, isBackground, isCompress bool, longConnServer LongConnServer) {
|
||||
c.w = new(sync.Mutex)
|
||||
c.conn = conn
|
||||
c.PlatformID = utils.StringToInt(ctx.GetPlatformID())
|
||||
c.IsCompress = isCompress
|
||||
c.IsBackground = isBackground
|
||||
c.UserID = ctx.GetUserID()
|
||||
c.ctx = ctx
|
||||
c.longConnServer = longConnServer
|
||||
c.IsBackground = false
|
||||
c.closed = false
|
||||
c.closedErr = nil
|
||||
}
|
||||
func (c *Client) pongHandler(_ string) error {
|
||||
c.conn.SetReadDeadline(pongWait)
|
||||
return nil
|
||||
}
|
||||
func (c *Client) readMessage() {
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
c.closedErr = ErrPanic
|
||||
fmt.Println("socket have panic err:", r, string(debug.Stack()))
|
||||
}
|
||||
c.close()
|
||||
}()
|
||||
c.conn.SetReadLimit(maxMessageSize)
|
||||
_ = c.conn.SetReadDeadline(pongWait)
|
||||
c.conn.SetPongHandler(c.pongHandler)
|
||||
for {
|
||||
messageType, message, returnErr := c.conn.ReadMessage()
|
||||
if returnErr != nil {
|
||||
c.closedErr = returnErr
|
||||
return
|
||||
}
|
||||
log.ZDebug(c.ctx, "readMessage", "messageType", messageType)
|
||||
if c.closed == true { //连接刚置位已经关闭,但是协程还没退出的场景
|
||||
c.closedErr = ErrConnClosed
|
||||
return
|
||||
}
|
||||
switch messageType {
|
||||
case MessageBinary:
|
||||
_ = c.conn.SetReadDeadline(pongWait)
|
||||
parseDataErr := c.handleMessage(message)
|
||||
if parseDataErr != nil {
|
||||
c.closedErr = parseDataErr
|
||||
return
|
||||
}
|
||||
case MessageText:
|
||||
c.closedErr = ErrNotSupportMessageProtocol
|
||||
return
|
||||
case PingMessage:
|
||||
err := c.writePongMsg()
|
||||
log.ZError(c.ctx, "writePongMsg", err)
|
||||
case CloseMessage:
|
||||
c.closedErr = ErrClientClosed
|
||||
return
|
||||
default:
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
func (c *Client) handleMessage(message []byte) error {
|
||||
if c.IsCompress {
|
||||
var decompressErr error
|
||||
message, decompressErr = c.longConnServer.DeCompress(message)
|
||||
if decompressErr != nil {
|
||||
return utils.Wrap(decompressErr, "")
|
||||
}
|
||||
}
|
||||
var binaryReq Req
|
||||
err := c.longConnServer.Decode(message, &binaryReq)
|
||||
if err != nil {
|
||||
return utils.Wrap(err, "")
|
||||
}
|
||||
if err := c.longConnServer.Validate(binaryReq); err != nil {
|
||||
return utils.Wrap(err, "")
|
||||
}
|
||||
if binaryReq.SendID != c.UserID {
|
||||
return utils.Wrap(errors.New("exception conn userID not same to req userID"), binaryReq.String())
|
||||
}
|
||||
ctx := mcontext.WithMustInfoCtx([]string{binaryReq.OperationID, binaryReq.SendID, constant.PlatformIDToName(c.PlatformID), c.ctx.GetConnID()})
|
||||
log.ZDebug(ctx, "gateway req message", "req", binaryReq.String())
|
||||
var messageErr error
|
||||
var resp []byte
|
||||
switch binaryReq.ReqIdentifier {
|
||||
case WSGetNewestSeq:
|
||||
resp, messageErr = c.longConnServer.GetSeq(ctx, binaryReq)
|
||||
case WSSendMsg:
|
||||
resp, messageErr = c.longConnServer.SendMessage(ctx, binaryReq)
|
||||
case WSSendSignalMsg:
|
||||
resp, messageErr = c.longConnServer.SendSignalMessage(ctx, binaryReq)
|
||||
case WSPullMsgBySeqList:
|
||||
resp, messageErr = c.longConnServer.PullMessageBySeqList(ctx, binaryReq)
|
||||
case WsLogoutMsg:
|
||||
resp, messageErr = c.longConnServer.UserLogout(ctx, binaryReq)
|
||||
case WsSetBackgroundStatus:
|
||||
resp, messageErr = c.setAppBackgroundStatus(ctx, binaryReq)
|
||||
default:
|
||||
return fmt.Errorf("ReqIdentifier failed,sendID:%s,msgIncr:%s,reqIdentifier:%d", binaryReq.SendID, binaryReq.MsgIncr, binaryReq.ReqIdentifier)
|
||||
}
|
||||
c.replyMessage(ctx, &binaryReq, messageErr, resp)
|
||||
return nil
|
||||
|
||||
}
|
||||
func (c *Client) setAppBackgroundStatus(ctx context.Context, req Req) ([]byte, error) {
|
||||
resp, isBackground, messageErr := c.longConnServer.SetUserDeviceBackground(ctx, req)
|
||||
if messageErr != nil {
|
||||
return nil, messageErr
|
||||
}
|
||||
c.IsBackground = isBackground
|
||||
//todo callback
|
||||
return resp, nil
|
||||
|
||||
}
|
||||
func (c *Client) close() {
|
||||
c.w.Lock()
|
||||
defer c.w.Unlock()
|
||||
c.closed = true
|
||||
c.conn.Close()
|
||||
c.longConnServer.UnRegister(c)
|
||||
|
||||
}
|
||||
func (c *Client) replyMessage(ctx context.Context, binaryReq *Req, err error, resp []byte) {
|
||||
errResp := apiresp.ParseError(err)
|
||||
mReply := Resp{
|
||||
ReqIdentifier: binaryReq.ReqIdentifier,
|
||||
MsgIncr: binaryReq.MsgIncr,
|
||||
OperationID: binaryReq.OperationID,
|
||||
ErrCode: errResp.ErrCode,
|
||||
ErrMsg: errResp.ErrMsg,
|
||||
Data: resp,
|
||||
}
|
||||
log.ZDebug(ctx, "gateway reply message", "resp", mReply.String())
|
||||
err = c.writeBinaryMsg(mReply)
|
||||
if err != nil {
|
||||
log.ZWarn(ctx, "wireBinaryMsg replyMessage", err, "resp", mReply.String())
|
||||
}
|
||||
}
|
||||
func (c *Client) PushMessage(ctx context.Context, msgData *sdkws.MsgData) error {
|
||||
var msg sdkws.PushMessages
|
||||
conversationID := utils.GetConversationIDByMsg(msgData)
|
||||
m := map[string]*sdkws.PullMsgs{conversationID: {Msgs: []*sdkws.MsgData{msgData}}}
|
||||
if utils.IsNotification(conversationID) {
|
||||
msg.NotificationMsgs = m
|
||||
} else {
|
||||
msg.Msgs = m
|
||||
}
|
||||
data, err := proto.Marshal(&msg)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
resp := Resp{
|
||||
ReqIdentifier: WSPushMsg,
|
||||
OperationID: mcontext.GetOperationID(ctx),
|
||||
Data: data,
|
||||
}
|
||||
return c.writeBinaryMsg(resp)
|
||||
}
|
||||
|
||||
func (c *Client) KickOnlineMessage() error {
|
||||
resp := Resp{
|
||||
ReqIdentifier: WSKickOnlineMsg,
|
||||
}
|
||||
return c.writeBinaryMsg(resp)
|
||||
}
|
||||
|
||||
func (c *Client) writeBinaryMsg(resp Resp) error {
|
||||
c.w.Lock()
|
||||
defer c.w.Unlock()
|
||||
if c.closed == true {
|
||||
return nil
|
||||
}
|
||||
encodedBuf := bufferPool.Get().([]byte)
|
||||
resultBuf := bufferPool.Get().([]byte)
|
||||
encodedBuf, err := c.longConnServer.Encode(resp)
|
||||
if err != nil {
|
||||
return utils.Wrap(err, "")
|
||||
}
|
||||
_ = c.conn.SetWriteDeadline(writeWait)
|
||||
if c.IsCompress {
|
||||
var compressErr error
|
||||
resultBuf, compressErr = c.longConnServer.Compress(encodedBuf)
|
||||
if compressErr != nil {
|
||||
return utils.Wrap(compressErr, "")
|
||||
}
|
||||
return c.conn.WriteMessage(MessageBinary, resultBuf)
|
||||
} else {
|
||||
return c.conn.WriteMessage(MessageBinary, encodedBuf)
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Client) writePongMsg() error {
|
||||
c.w.Lock()
|
||||
defer c.w.Unlock()
|
||||
if c.closed == true {
|
||||
return nil
|
||||
}
|
||||
_ = c.conn.SetWriteDeadline(writeWait)
|
||||
return c.conn.WriteMessage(PongMessage, nil)
|
||||
|
||||
}
|
||||
46
internal/msggateway/compressor.go
Normal file
46
internal/msggateway/compressor.go
Normal file
@@ -0,0 +1,46 @@
|
||||
package msggateway
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"compress/gzip"
|
||||
"io"
|
||||
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
|
||||
)
|
||||
|
||||
type Compressor interface {
|
||||
Compress(rawData []byte) ([]byte, error)
|
||||
DeCompress(compressedData []byte) ([]byte, error)
|
||||
}
|
||||
type GzipCompressor struct {
|
||||
compressProtocol string
|
||||
}
|
||||
|
||||
func NewGzipCompressor() *GzipCompressor {
|
||||
return &GzipCompressor{compressProtocol: "gzip"}
|
||||
}
|
||||
func (g *GzipCompressor) Compress(rawData []byte) ([]byte, error) {
|
||||
gzipBuffer := bytes.Buffer{}
|
||||
gz := gzip.NewWriter(&gzipBuffer)
|
||||
if _, err := gz.Write(rawData); err != nil {
|
||||
return nil, utils.Wrap(err, "")
|
||||
}
|
||||
if err := gz.Close(); err != nil {
|
||||
return nil, utils.Wrap(err, "")
|
||||
}
|
||||
return gzipBuffer.Bytes(), nil
|
||||
}
|
||||
|
||||
func (g *GzipCompressor) DeCompress(compressedData []byte) ([]byte, error) {
|
||||
buff := bytes.NewBuffer(compressedData)
|
||||
reader, err := gzip.NewReader(buff)
|
||||
if err != nil {
|
||||
return nil, utils.Wrap(err, "NewReader failed")
|
||||
}
|
||||
compressedData, err = io.ReadAll(reader)
|
||||
if err != nil {
|
||||
return nil, utils.Wrap(err, "ReadAll failed")
|
||||
}
|
||||
_ = reader.Close()
|
||||
return compressedData, nil
|
||||
}
|
||||
41
internal/msggateway/constant.go
Normal file
41
internal/msggateway/constant.go
Normal file
@@ -0,0 +1,41 @@
|
||||
package msggateway
|
||||
|
||||
import "time"
|
||||
|
||||
const (
|
||||
WsUserID = "sendID"
|
||||
CommonUserID = "userID"
|
||||
PlatformID = "platformID"
|
||||
ConnID = "connID"
|
||||
Token = "token"
|
||||
OperationID = "operationID"
|
||||
Compression = "compression"
|
||||
GzipCompressionProtocol = "gzip"
|
||||
BackgroundStatus = "isBackground"
|
||||
)
|
||||
const (
|
||||
WebSocket = iota + 1
|
||||
)
|
||||
const (
|
||||
//Websocket Protocol
|
||||
WSGetNewestSeq = 1001
|
||||
WSPullMsgBySeqList = 1002
|
||||
WSSendMsg = 1003
|
||||
WSSendSignalMsg = 1004
|
||||
WSPushMsg = 2001
|
||||
WSKickOnlineMsg = 2002
|
||||
WsLogoutMsg = 2003
|
||||
WsSetBackgroundStatus = 2004
|
||||
WSDataError = 3001
|
||||
)
|
||||
|
||||
const (
|
||||
// Time allowed to write a message to the peer.
|
||||
writeWait = 10 * time.Second
|
||||
|
||||
// Time allowed to read the next pong message from the peer.
|
||||
pongWait = 30 * time.Second
|
||||
|
||||
// Maximum message size allowed from peer.
|
||||
maxMessageSize = 51200
|
||||
)
|
||||
104
internal/msggateway/context.go
Normal file
104
internal/msggateway/context.go
Normal file
@@ -0,0 +1,104 @@
|
||||
package msggateway
|
||||
|
||||
import (
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"time"
|
||||
)
|
||||
|
||||
type UserConnContext struct {
|
||||
RespWriter http.ResponseWriter
|
||||
Req *http.Request
|
||||
Path string
|
||||
Method string
|
||||
RemoteAddr string
|
||||
ConnID string
|
||||
}
|
||||
|
||||
func (c *UserConnContext) Deadline() (deadline time.Time, ok bool) {
|
||||
return
|
||||
}
|
||||
|
||||
func (c *UserConnContext) Done() <-chan struct{} {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *UserConnContext) Err() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *UserConnContext) Value(key any) any {
|
||||
switch key {
|
||||
case constant.OpUserID:
|
||||
return c.GetUserID()
|
||||
case constant.OperationID:
|
||||
return c.GetOperationID()
|
||||
case constant.ConnID:
|
||||
return c.GetConnID()
|
||||
case constant.OpUserPlatform:
|
||||
return constant.PlatformIDToName(utils.StringToInt(c.GetPlatformID()))
|
||||
case constant.RemoteAddr:
|
||||
return c.RemoteAddr
|
||||
default:
|
||||
return ""
|
||||
}
|
||||
}
|
||||
|
||||
func newContext(respWriter http.ResponseWriter, req *http.Request) *UserConnContext {
|
||||
return &UserConnContext{
|
||||
RespWriter: respWriter,
|
||||
Req: req,
|
||||
Path: req.URL.Path,
|
||||
Method: req.Method,
|
||||
RemoteAddr: req.RemoteAddr,
|
||||
ConnID: utils.Md5(req.RemoteAddr + "_" + strconv.Itoa(int(utils.GetCurrentTimestampByMill()))),
|
||||
}
|
||||
}
|
||||
func (c *UserConnContext) GetRemoteAddr() string {
|
||||
return c.RemoteAddr
|
||||
}
|
||||
func (c *UserConnContext) Query(key string) (string, bool) {
|
||||
var value string
|
||||
if value = c.Req.URL.Query().Get(key); value == "" {
|
||||
return value, false
|
||||
}
|
||||
return value, true
|
||||
}
|
||||
func (c *UserConnContext) GetHeader(key string) (string, bool) {
|
||||
var value string
|
||||
if value = c.Req.Header.Get(key); value == "" {
|
||||
return value, false
|
||||
}
|
||||
return value, true
|
||||
}
|
||||
func (c *UserConnContext) SetHeader(key, value string) {
|
||||
c.RespWriter.Header().Set(key, value)
|
||||
}
|
||||
func (c *UserConnContext) ErrReturn(error string, code int) {
|
||||
http.Error(c.RespWriter, error, code)
|
||||
}
|
||||
func (c *UserConnContext) GetConnID() string {
|
||||
return c.ConnID
|
||||
}
|
||||
func (c *UserConnContext) GetUserID() string {
|
||||
return c.Req.URL.Query().Get(WsUserID)
|
||||
}
|
||||
func (c *UserConnContext) GetPlatformID() string {
|
||||
return c.Req.URL.Query().Get(PlatformID)
|
||||
}
|
||||
func (c *UserConnContext) GetOperationID() string {
|
||||
return c.Req.URL.Query().Get(OperationID)
|
||||
}
|
||||
func (c *UserConnContext) GetToken() string {
|
||||
return c.Req.URL.Query().Get(Token)
|
||||
}
|
||||
func (c *UserConnContext) GetBackground() bool {
|
||||
b, err := strconv.ParseBool(c.Req.URL.Query().Get(BackgroundStatus))
|
||||
if err != nil {
|
||||
return false
|
||||
} else {
|
||||
return b
|
||||
}
|
||||
}
|
||||
37
internal/msggateway/encoder.go
Normal file
37
internal/msggateway/encoder.go
Normal file
@@ -0,0 +1,37 @@
|
||||
package msggateway
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/gob"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
|
||||
)
|
||||
|
||||
type Encoder interface {
|
||||
Encode(data interface{}) ([]byte, error)
|
||||
Decode(encodeData []byte, decodeData interface{}) error
|
||||
}
|
||||
|
||||
type GobEncoder struct {
|
||||
}
|
||||
|
||||
func NewGobEncoder() *GobEncoder {
|
||||
return &GobEncoder{}
|
||||
}
|
||||
func (g *GobEncoder) Encode(data interface{}) ([]byte, error) {
|
||||
buff := bytes.Buffer{}
|
||||
enc := gob.NewEncoder(&buff)
|
||||
err := enc.Encode(data)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return buff.Bytes(), nil
|
||||
}
|
||||
func (g *GobEncoder) Decode(encodeData []byte, decodeData interface{}) error {
|
||||
buff := bytes.NewBuffer(encodeData)
|
||||
dec := gob.NewDecoder(buff)
|
||||
err := dec.Decode(decodeData)
|
||||
if err != nil {
|
||||
return utils.Wrap(err, "")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
7
internal/msggateway/http_error.go
Normal file
7
internal/msggateway/http_error.go
Normal file
@@ -0,0 +1,7 @@
|
||||
package msggateway
|
||||
|
||||
import "github.com/OpenIMSDK/Open-IM-Server/pkg/apiresp"
|
||||
|
||||
func httpError(ctx *UserConnContext, err error) {
|
||||
apiresp.HttpError(ctx.RespWriter, err)
|
||||
}
|
||||
154
internal/msggateway/hub_server.go
Normal file
154
internal/msggateway/hub_server.go
Normal file
@@ -0,0 +1,154 @@
|
||||
package msggateway
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache"
|
||||
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/log"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/prome"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/tokenverify"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msggateway"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/startrpc"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
|
||||
"google.golang.org/grpc"
|
||||
)
|
||||
|
||||
func (s *Server) InitServer(client discoveryregistry.SvcDiscoveryRegistry, server *grpc.Server) error {
|
||||
rdb, err := cache.NewRedis()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
msgModel := cache.NewMsgCacheModel(rdb)
|
||||
s.LongConnServer.SetDiscoveryRegistry(client)
|
||||
s.LongConnServer.SetCacheHandler(msgModel)
|
||||
msggateway.RegisterMsgGatewayServer(server, s)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *Server) Start() error {
|
||||
return startrpc.Start(s.rpcPort, config.Config.RpcRegisterName.OpenImMessageGatewayName, s.prometheusPort, s.InitServer)
|
||||
}
|
||||
|
||||
type Server struct {
|
||||
rpcPort int
|
||||
prometheusPort int
|
||||
LongConnServer LongConnServer
|
||||
pushTerminal []int
|
||||
}
|
||||
|
||||
func (s *Server) SetLongConnServer(LongConnServer LongConnServer) {
|
||||
s.LongConnServer = LongConnServer
|
||||
}
|
||||
|
||||
func NewServer(rpcPort int, longConnServer LongConnServer) *Server {
|
||||
return &Server{rpcPort: rpcPort, LongConnServer: longConnServer, pushTerminal: []int{constant.IOSPlatformID, constant.AndroidPlatformID}}
|
||||
}
|
||||
|
||||
func (s *Server) OnlinePushMsg(context context.Context, req *msggateway.OnlinePushMsgReq) (*msggateway.OnlinePushMsgResp, error) {
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (s *Server) GetUsersOnlineStatus(ctx context.Context, req *msggateway.GetUsersOnlineStatusReq) (*msggateway.GetUsersOnlineStatusResp, error) {
|
||||
if !tokenverify.IsAppManagerUid(ctx) {
|
||||
return nil, errs.ErrNoPermission.Wrap("only app manager")
|
||||
}
|
||||
var resp msggateway.GetUsersOnlineStatusResp
|
||||
for _, userID := range req.UserIDs {
|
||||
clients, ok := s.LongConnServer.GetUserAllCons(userID)
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
temp := new(msggateway.GetUsersOnlineStatusResp_SuccessResult)
|
||||
temp.UserID = userID
|
||||
for _, client := range clients {
|
||||
if client != nil {
|
||||
ps := new(msggateway.GetUsersOnlineStatusResp_SuccessDetail)
|
||||
ps.Platform = constant.PlatformIDToName(client.PlatformID)
|
||||
ps.Status = constant.OnlineStatus
|
||||
ps.ConnID = client.ctx.GetConnID()
|
||||
ps.IsBackground = client.IsBackground
|
||||
temp.Status = constant.OnlineStatus
|
||||
temp.DetailPlatformStatus = append(temp.DetailPlatformStatus, ps)
|
||||
}
|
||||
}
|
||||
if temp.Status == constant.OnlineStatus {
|
||||
resp.SuccessResult = append(resp.SuccessResult, temp)
|
||||
}
|
||||
}
|
||||
return &resp, nil
|
||||
}
|
||||
|
||||
func (s *Server) OnlineBatchPushOneMsg(ctx context.Context, req *msggateway.OnlineBatchPushOneMsgReq) (*msggateway.OnlineBatchPushOneMsgResp, error) {
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (s *Server) SuperGroupOnlineBatchPushOneMsg(ctx context.Context, req *msggateway.OnlineBatchPushOneMsgReq) (*msggateway.OnlineBatchPushOneMsgResp, error) {
|
||||
var singleUserResult []*msggateway.SingleMsgToUserResults
|
||||
for _, v := range req.PushToUserIDs {
|
||||
var resp []*msggateway.SingleMsgToUserPlatform
|
||||
tempT := &msggateway.SingleMsgToUserResults{
|
||||
UserID: v,
|
||||
}
|
||||
clients, ok := s.LongConnServer.GetUserAllCons(v)
|
||||
if !ok {
|
||||
log.ZDebug(ctx, "push user not online", "userID", v)
|
||||
tempT.Resp = resp
|
||||
singleUserResult = append(singleUserResult, tempT)
|
||||
continue
|
||||
}
|
||||
log.ZDebug(ctx, "push user online", "clients", clients, "userID", v)
|
||||
for _, client := range clients {
|
||||
if client != nil {
|
||||
temp := &msggateway.SingleMsgToUserPlatform{
|
||||
RecvID: v,
|
||||
RecvPlatFormID: int32(client.PlatformID),
|
||||
}
|
||||
if !client.IsBackground {
|
||||
err := client.PushMessage(ctx, req.MsgData)
|
||||
if err != nil {
|
||||
temp.ResultCode = -2
|
||||
resp = append(resp, temp)
|
||||
} else {
|
||||
if utils.IsContainInt(client.PlatformID, s.pushTerminal) {
|
||||
tempT.OnlinePush = true
|
||||
prome.Inc(prome.MsgOnlinePushSuccessCounter)
|
||||
resp = append(resp, temp)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
temp.ResultCode = -3
|
||||
resp = append(resp, temp)
|
||||
}
|
||||
}
|
||||
}
|
||||
tempT.Resp = resp
|
||||
singleUserResult = append(singleUserResult, tempT)
|
||||
}
|
||||
|
||||
return &msggateway.OnlineBatchPushOneMsgResp{
|
||||
SinglePushResult: singleUserResult,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (s *Server) KickUserOffline(ctx context.Context, req *msggateway.KickUserOfflineReq) (*msggateway.KickUserOfflineResp, error) {
|
||||
for _, v := range req.KickUserIDList {
|
||||
if clients, _, ok := s.LongConnServer.GetUserPlatformCons(v, int(req.PlatformID)); ok {
|
||||
for _, client := range clients {
|
||||
err := client.KickOnlineMessage()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return &msggateway.KickUserOfflineResp{}, nil
|
||||
}
|
||||
|
||||
func (s *Server) MultiTerminalLoginCheck(ctx context.Context, req *msggateway.MultiTerminalLoginCheckReq) (*msggateway.MultiTerminalLoginCheckResp, error) {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
24
internal/msggateway/init.go
Normal file
24
internal/msggateway/init.go
Normal file
@@ -0,0 +1,24 @@
|
||||
package msggateway
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
|
||||
)
|
||||
|
||||
func RunWsAndServer(rpcPort, wsPort, prometheusPort int) error {
|
||||
fmt.Println("start rpc/msg_gateway server, port: ", rpcPort, wsPort, prometheusPort, ", OpenIM version: ", config.Version)
|
||||
longServer, err := NewWsServer(
|
||||
WithPort(wsPort),
|
||||
WithMaxConnNum(int64(config.Config.LongConnSvr.WebsocketMaxConnNum)),
|
||||
WithHandshakeTimeout(time.Duration(config.Config.LongConnSvr.WebsocketTimeOut)*time.Second),
|
||||
WithMessageMaxMsgLength(config.Config.LongConnSvr.WebsocketMaxMsgLen))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
hubServer := NewServer(rpcPort, longServer)
|
||||
go hubServer.Start()
|
||||
hubServer.LongConnServer.Run()
|
||||
return nil
|
||||
}
|
||||
107
internal/msggateway/long_conn.go
Normal file
107
internal/msggateway/long_conn.go
Normal file
@@ -0,0 +1,107 @@
|
||||
package msggateway
|
||||
|
||||
import (
|
||||
"github.com/gorilla/websocket"
|
||||
"net/http"
|
||||
"time"
|
||||
)
|
||||
|
||||
type LongConn interface {
|
||||
//Close this connection
|
||||
Close() error
|
||||
// WriteMessage Write message to connection,messageType means data type,can be set binary(2) and text(1).
|
||||
WriteMessage(messageType int, message []byte) error
|
||||
// ReadMessage Read message from connection.
|
||||
ReadMessage() (int, []byte, error)
|
||||
// SetReadDeadline sets the read deadline on the underlying network connection,
|
||||
//after a read has timed out, will return an error.
|
||||
SetReadDeadline(timeout time.Duration) error
|
||||
// SetWriteDeadline sets to write deadline when send message,when read has timed out,will return error.
|
||||
SetWriteDeadline(timeout time.Duration) error
|
||||
// Dial Try to dial a connection,url must set auth args,header can control compress data
|
||||
Dial(urlStr string, requestHeader http.Header) (*http.Response, error)
|
||||
// IsNil Whether the connection of the current long connection is nil
|
||||
IsNil() bool
|
||||
// SetConnNil Set the connection of the current long connection to nil
|
||||
SetConnNil()
|
||||
// SetReadLimit sets the maximum size for a message read from the peer.bytes
|
||||
SetReadLimit(limit int64)
|
||||
SetPongHandler(handler PongHandler)
|
||||
// GenerateLongConn Check the connection of the current and when it was sent are the same
|
||||
GenerateLongConn(w http.ResponseWriter, r *http.Request) error
|
||||
}
|
||||
type GWebSocket struct {
|
||||
protocolType int
|
||||
conn *websocket.Conn
|
||||
handshakeTimeout time.Duration
|
||||
}
|
||||
|
||||
func newGWebSocket(protocolType int, handshakeTimeout time.Duration) *GWebSocket {
|
||||
return &GWebSocket{protocolType: protocolType, handshakeTimeout: handshakeTimeout}
|
||||
}
|
||||
|
||||
func (d *GWebSocket) Close() error {
|
||||
return d.conn.Close()
|
||||
}
|
||||
func (d *GWebSocket) GenerateLongConn(w http.ResponseWriter, r *http.Request) error {
|
||||
upgrader := &websocket.Upgrader{
|
||||
HandshakeTimeout: d.handshakeTimeout,
|
||||
CheckOrigin: func(r *http.Request) bool { return true },
|
||||
}
|
||||
conn, err := upgrader.Upgrade(w, r, nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
d.conn = conn
|
||||
return nil
|
||||
|
||||
}
|
||||
func (d *GWebSocket) WriteMessage(messageType int, message []byte) error {
|
||||
//d.setSendConn(d.conn)
|
||||
return d.conn.WriteMessage(messageType, message)
|
||||
}
|
||||
|
||||
//func (d *GWebSocket) setSendConn(sendConn *websocket.Conn) {
|
||||
// d.sendConn = sendConn
|
||||
//}
|
||||
|
||||
func (d *GWebSocket) ReadMessage() (int, []byte, error) {
|
||||
return d.conn.ReadMessage()
|
||||
}
|
||||
func (d *GWebSocket) SetReadDeadline(timeout time.Duration) error {
|
||||
return d.conn.SetReadDeadline(time.Now().Add(timeout))
|
||||
}
|
||||
|
||||
func (d *GWebSocket) SetWriteDeadline(timeout time.Duration) error {
|
||||
return d.conn.SetWriteDeadline(time.Now().Add(timeout))
|
||||
}
|
||||
|
||||
func (d *GWebSocket) Dial(urlStr string, requestHeader http.Header) (*http.Response, error) {
|
||||
conn, httpResp, err := websocket.DefaultDialer.Dial(urlStr, requestHeader)
|
||||
if err == nil {
|
||||
d.conn = conn
|
||||
}
|
||||
return httpResp, err
|
||||
|
||||
}
|
||||
|
||||
func (d *GWebSocket) IsNil() bool {
|
||||
if d.conn != nil {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (d *GWebSocket) SetConnNil() {
|
||||
d.conn = nil
|
||||
}
|
||||
func (d *GWebSocket) SetReadLimit(limit int64) {
|
||||
d.conn.SetReadLimit(limit)
|
||||
}
|
||||
func (d *GWebSocket) SetPongHandler(handler PongHandler) {
|
||||
d.conn.SetPongHandler(handler)
|
||||
}
|
||||
|
||||
//func (d *GWebSocket) CheckSendConnDiffNow() bool {
|
||||
// return d.conn == d.sendConn
|
||||
//}
|
||||
181
internal/msggateway/message_handler.go
Normal file
181
internal/msggateway/message_handler.go
Normal file
@@ -0,0 +1,181 @@
|
||||
package msggateway
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/push"
|
||||
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msg"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
|
||||
"github.com/go-playground/validator/v10"
|
||||
"google.golang.org/protobuf/proto"
|
||||
)
|
||||
|
||||
type Req struct {
|
||||
ReqIdentifier int32 `json:"reqIdentifier" validate:"required"`
|
||||
Token string `json:"token" `
|
||||
SendID string `json:"sendID" validate:"required"`
|
||||
OperationID string `json:"operationID" validate:"required"`
|
||||
MsgIncr string `json:"msgIncr" validate:"required"`
|
||||
Data []byte `json:"data"`
|
||||
}
|
||||
|
||||
func (r *Req) String() string {
|
||||
return utils.StructToJsonString(r)
|
||||
}
|
||||
|
||||
type Resp struct {
|
||||
ReqIdentifier int32 `json:"reqIdentifier"`
|
||||
MsgIncr string `json:"msgIncr"`
|
||||
OperationID string `json:"operationID"`
|
||||
ErrCode int `json:"errCode"`
|
||||
ErrMsg string `json:"errMsg"`
|
||||
Data []byte `json:"data"`
|
||||
}
|
||||
|
||||
func (r *Resp) String() string {
|
||||
return utils.StructToJsonString(r)
|
||||
}
|
||||
|
||||
type MessageHandler interface {
|
||||
GetSeq(context context.Context, data Req) ([]byte, error)
|
||||
SendMessage(context context.Context, data Req) ([]byte, error)
|
||||
SendSignalMessage(context context.Context, data Req) ([]byte, error)
|
||||
PullMessageBySeqList(context context.Context, data Req) ([]byte, error)
|
||||
UserLogout(context context.Context, data Req) ([]byte, error)
|
||||
SetUserDeviceBackground(context context.Context, data Req) ([]byte, bool, error)
|
||||
}
|
||||
|
||||
var _ MessageHandler = (*GrpcHandler)(nil)
|
||||
|
||||
type GrpcHandler struct {
|
||||
msgRpcClient *rpcclient.MessageRpcClient
|
||||
pushClient *rpcclient.PushRpcClient
|
||||
validate *validator.Validate
|
||||
}
|
||||
|
||||
func NewGrpcHandler(validate *validator.Validate, client discoveryregistry.SvcDiscoveryRegistry) *GrpcHandler {
|
||||
msgRpcClient := rpcclient.NewMessageRpcClient(client)
|
||||
pushRpcClient := rpcclient.NewPushRpcClient(client)
|
||||
return &GrpcHandler{msgRpcClient: &msgRpcClient,
|
||||
pushClient: &pushRpcClient, validate: validate}
|
||||
}
|
||||
|
||||
func (g GrpcHandler) GetSeq(context context.Context, data Req) ([]byte, error) {
|
||||
req := sdkws.GetMaxSeqReq{}
|
||||
if err := proto.Unmarshal(data.Data, &req); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err := g.validate.Struct(&req); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
resp, err := g.msgRpcClient.GetMaxSeq(context, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
c, err := proto.Marshal(resp)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return c, nil
|
||||
}
|
||||
|
||||
func (g GrpcHandler) SendMessage(context context.Context, data Req) ([]byte, error) {
|
||||
msgData := sdkws.MsgData{}
|
||||
if err := proto.Unmarshal(data.Data, &msgData); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err := g.validate.Struct(&msgData); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
req := msg.SendMsgReq{MsgData: &msgData}
|
||||
resp, err := g.msgRpcClient.SendMsg(context, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
c, err := proto.Marshal(resp)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return c, nil
|
||||
}
|
||||
|
||||
func (g GrpcHandler) SendSignalMessage(context context.Context, data Req) ([]byte, error) {
|
||||
resp, err := g.msgRpcClient.SendMsg(context, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
c, err := proto.Marshal(resp)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return c, nil
|
||||
}
|
||||
|
||||
func (g GrpcHandler) PullMessageBySeqList(context context.Context, data Req) ([]byte, error) {
|
||||
req := sdkws.PullMessageBySeqsReq{}
|
||||
if err := proto.Unmarshal(data.Data, &req); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err := g.validate.Struct(data); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
resp, err := g.msgRpcClient.PullMessageBySeqList(context, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
c, err := proto.Marshal(resp)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return c, nil
|
||||
}
|
||||
|
||||
func (g GrpcHandler) UserLogout(context context.Context, data Req) ([]byte, error) {
|
||||
req := push.DelUserPushTokenReq{}
|
||||
if err := proto.Unmarshal(data.Data, &req); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
resp, err := g.pushClient.DelUserPushToken(context, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
c, err := proto.Marshal(resp)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return c, nil
|
||||
}
|
||||
func (g GrpcHandler) SetUserDeviceBackground(_ context.Context, data Req) ([]byte, bool, error) {
|
||||
req := sdkws.SetAppBackgroundStatusReq{}
|
||||
if err := proto.Unmarshal(data.Data, &req); err != nil {
|
||||
return nil, false, err
|
||||
}
|
||||
if err := g.validate.Struct(data); err != nil {
|
||||
return nil, false, err
|
||||
}
|
||||
return nil, req.IsBackground, nil
|
||||
}
|
||||
|
||||
//func (g GrpcHandler) call[T any](ctx context.Context, data Req, m proto.Message, rpc func(ctx context.Context, req proto.Message)) ([]byte, error) {
|
||||
// if err := proto.Unmarshal(data.Data, m); err != nil {
|
||||
// return nil, err
|
||||
// }
|
||||
// if err := g.validate.Struct(m); err != nil {
|
||||
// return nil, err
|
||||
// }
|
||||
// rpc(ctx, m)
|
||||
// req := msg.SendMsgReq{MsgData: &msgData}
|
||||
// resp, err := g.notification.Msg.SendMsg(context, &req)
|
||||
// if err != nil {
|
||||
// return nil, err
|
||||
// }
|
||||
// c, err := proto.Marshal(resp)
|
||||
// if err != nil {
|
||||
// return nil, err
|
||||
// }
|
||||
// return c, nil
|
||||
//}
|
||||
318
internal/msggateway/n_ws_server.go
Normal file
318
internal/msggateway/n_ws_server.go
Normal file
@@ -0,0 +1,318 @@
|
||||
package msggateway
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
"time"
|
||||
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache"
|
||||
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry"
|
||||
"github.com/redis/go-redis/v9"
|
||||
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/log"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/tokenverify"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
|
||||
"github.com/go-playground/validator/v10"
|
||||
)
|
||||
|
||||
type LongConnServer interface {
|
||||
Run() error
|
||||
wsHandler(w http.ResponseWriter, r *http.Request)
|
||||
GetUserAllCons(userID string) ([]*Client, bool)
|
||||
GetUserPlatformCons(userID string, platform int) ([]*Client, bool, bool)
|
||||
Validate(s interface{}) error
|
||||
SetCacheHandler(cache cache.MsgModel)
|
||||
SetDiscoveryRegistry(client discoveryregistry.SvcDiscoveryRegistry)
|
||||
UnRegister(c *Client)
|
||||
Compressor
|
||||
Encoder
|
||||
MessageHandler
|
||||
}
|
||||
|
||||
var bufferPool = sync.Pool{
|
||||
New: func() interface{} {
|
||||
return make([]byte, 1024)
|
||||
},
|
||||
}
|
||||
|
||||
type WsServer struct {
|
||||
port int
|
||||
wsMaxConnNum int64
|
||||
registerChan chan *Client
|
||||
unregisterChan chan *Client
|
||||
kickHandlerChan chan *kickHandler
|
||||
clients *UserMap
|
||||
clientPool sync.Pool
|
||||
onlineUserNum int64
|
||||
onlineUserConnNum int64
|
||||
handshakeTimeout time.Duration
|
||||
hubServer *Server
|
||||
validate *validator.Validate
|
||||
cache cache.MsgModel
|
||||
Compressor
|
||||
Encoder
|
||||
MessageHandler
|
||||
}
|
||||
type kickHandler struct {
|
||||
clientOK bool
|
||||
oldClients []*Client
|
||||
newClient *Client
|
||||
}
|
||||
|
||||
func (ws *WsServer) SetDiscoveryRegistry(client discoveryregistry.SvcDiscoveryRegistry) {
|
||||
ws.MessageHandler = NewGrpcHandler(ws.validate, client)
|
||||
}
|
||||
func (ws *WsServer) SetCacheHandler(cache cache.MsgModel) {
|
||||
ws.cache = cache
|
||||
}
|
||||
|
||||
func (ws *WsServer) UnRegister(c *Client) {
|
||||
ws.unregisterChan <- c
|
||||
}
|
||||
|
||||
func (ws *WsServer) Validate(s interface{}) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (ws *WsServer) GetUserAllCons(userID string) ([]*Client, bool) {
|
||||
return ws.clients.GetAll(userID)
|
||||
}
|
||||
|
||||
func (ws *WsServer) GetUserPlatformCons(userID string, platform int) ([]*Client, bool, bool) {
|
||||
return ws.clients.Get(userID, platform)
|
||||
}
|
||||
|
||||
func NewWsServer(opts ...Option) (*WsServer, error) {
|
||||
var config configs
|
||||
for _, o := range opts {
|
||||
o(&config)
|
||||
}
|
||||
if config.port < 1024 {
|
||||
return nil, errors.New("port not allow to listen")
|
||||
|
||||
}
|
||||
v := validator.New()
|
||||
return &WsServer{
|
||||
port: config.port,
|
||||
wsMaxConnNum: config.maxConnNum,
|
||||
handshakeTimeout: config.handshakeTimeout,
|
||||
clientPool: sync.Pool{
|
||||
New: func() interface{} {
|
||||
return new(Client)
|
||||
},
|
||||
},
|
||||
registerChan: make(chan *Client, 1000),
|
||||
unregisterChan: make(chan *Client, 1000),
|
||||
kickHandlerChan: make(chan *kickHandler, 1000),
|
||||
validate: v,
|
||||
clients: newUserMap(),
|
||||
Compressor: NewGzipCompressor(),
|
||||
Encoder: NewGobEncoder(),
|
||||
}, nil
|
||||
}
|
||||
func (ws *WsServer) Run() error {
|
||||
var client *Client
|
||||
go func() {
|
||||
for {
|
||||
select {
|
||||
case client = <-ws.registerChan:
|
||||
ws.registerClient(client)
|
||||
case client = <-ws.unregisterChan:
|
||||
ws.unregisterClient(client)
|
||||
case onlineInfo := <-ws.kickHandlerChan:
|
||||
ws.multiTerminalLoginChecker(onlineInfo)
|
||||
}
|
||||
}
|
||||
}()
|
||||
http.HandleFunc("/", ws.wsHandler)
|
||||
// http.HandleFunc("/metrics", func(w http.ResponseWriter, r *http.Request) {})
|
||||
return http.ListenAndServe(":"+utils.IntToString(ws.port), nil) //Start listening
|
||||
}
|
||||
|
||||
func (ws *WsServer) registerClient(client *Client) {
|
||||
var (
|
||||
userOK bool
|
||||
clientOK bool
|
||||
oldClients []*Client
|
||||
)
|
||||
oldClients, userOK, clientOK = ws.clients.Get(client.UserID, client.PlatformID)
|
||||
if !userOK {
|
||||
ws.clients.Set(client.UserID, client)
|
||||
log.ZDebug(client.ctx, "user not exist", "userID", client.UserID, "platformID", client.PlatformID)
|
||||
atomic.AddInt64(&ws.onlineUserNum, 1)
|
||||
atomic.AddInt64(&ws.onlineUserConnNum, 1)
|
||||
|
||||
} else {
|
||||
i := &kickHandler{
|
||||
clientOK: clientOK,
|
||||
oldClients: oldClients,
|
||||
newClient: client,
|
||||
}
|
||||
ws.kickHandlerChan <- i
|
||||
log.ZDebug(client.ctx, "user exist", "userID", client.UserID, "platformID", client.PlatformID)
|
||||
if clientOK {
|
||||
ws.clients.Set(client.UserID, client)
|
||||
//已经有同平台的连接存在
|
||||
log.ZInfo(client.ctx, "repeat login", "userID", client.UserID, "platformID", client.PlatformID, "old remote addr", getRemoteAdders(oldClients))
|
||||
atomic.AddInt64(&ws.onlineUserConnNum, 1)
|
||||
} else {
|
||||
ws.clients.Set(client.UserID, client)
|
||||
|
||||
atomic.AddInt64(&ws.onlineUserConnNum, 1)
|
||||
}
|
||||
}
|
||||
log.ZInfo(client.ctx, "user online", "online user Num", ws.onlineUserNum, "online user conn Num", ws.onlineUserConnNum)
|
||||
}
|
||||
func getRemoteAdders(client []*Client) string {
|
||||
var ret string
|
||||
for i, c := range client {
|
||||
if i == 0 {
|
||||
ret = c.ctx.GetRemoteAddr()
|
||||
} else {
|
||||
ret += "@" + c.ctx.GetRemoteAddr()
|
||||
}
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
func (ws *WsServer) multiTerminalLoginChecker(info *kickHandler) {
|
||||
switch config.Config.MultiLoginPolicy {
|
||||
case constant.DefalutNotKick:
|
||||
case constant.PCAndOther:
|
||||
if constant.PlatformIDToClass(info.newClient.PlatformID) == constant.TerminalPC {
|
||||
return
|
||||
}
|
||||
fallthrough
|
||||
case constant.AllLoginButSameTermKick:
|
||||
if info.clientOK {
|
||||
ws.clients.deleteClients(info.newClient.UserID, info.oldClients)
|
||||
for _, c := range info.oldClients {
|
||||
err := c.KickOnlineMessage()
|
||||
if err != nil {
|
||||
log.ZWarn(c.ctx, "KickOnlineMessage", err)
|
||||
}
|
||||
}
|
||||
m, err := ws.cache.GetTokensWithoutError(info.newClient.ctx, info.newClient.UserID, info.newClient.PlatformID)
|
||||
if err != nil && err != redis.Nil {
|
||||
log.ZWarn(info.newClient.ctx, "get token from redis err", err, "userID", info.newClient.UserID, "platformID", info.newClient.PlatformID)
|
||||
return
|
||||
}
|
||||
if m == nil {
|
||||
log.ZWarn(info.newClient.ctx, "m is nil", errors.New("m is nil"), "userID", info.newClient.UserID, "platformID", info.newClient.PlatformID)
|
||||
return
|
||||
}
|
||||
log.ZDebug(info.newClient.ctx, "get token from redis", "userID", info.newClient.UserID, "platformID", info.newClient.PlatformID, "tokenMap", m)
|
||||
|
||||
for k, _ := range m {
|
||||
if k != info.newClient.ctx.GetToken() {
|
||||
m[k] = constant.KickedToken
|
||||
}
|
||||
}
|
||||
log.ZDebug(info.newClient.ctx, "set token map is ", "token map", m, "userID", info.newClient.UserID)
|
||||
err = ws.cache.SetTokenMapByUidPid(info.newClient.ctx, info.newClient.UserID, info.newClient.PlatformID, m)
|
||||
if err != nil {
|
||||
log.ZWarn(info.newClient.ctx, "SetTokenMapByUidPid err", err, "userID", info.newClient.UserID, "platformID", info.newClient.PlatformID)
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
func (ws *WsServer) unregisterClient(client *Client) {
|
||||
defer ws.clientPool.Put(client)
|
||||
isDeleteUser := ws.clients.delete(client.UserID, client.ctx.GetRemoteAddr())
|
||||
if isDeleteUser {
|
||||
atomic.AddInt64(&ws.onlineUserNum, -1)
|
||||
}
|
||||
atomic.AddInt64(&ws.onlineUserConnNum, -1)
|
||||
log.ZInfo(client.ctx, "user offline", "close reason", client.closedErr, "online user Num", ws.onlineUserNum, "online user conn Num", ws.onlineUserConnNum)
|
||||
}
|
||||
|
||||
func (ws *WsServer) wsHandler(w http.ResponseWriter, r *http.Request) {
|
||||
connContext := newContext(w, r)
|
||||
if ws.onlineUserConnNum >= ws.wsMaxConnNum {
|
||||
httpError(connContext, errs.ErrConnOverMaxNumLimit)
|
||||
return
|
||||
}
|
||||
var (
|
||||
token string
|
||||
userID string
|
||||
platformIDStr string
|
||||
exists bool
|
||||
compression bool
|
||||
)
|
||||
|
||||
token, exists = connContext.Query(Token)
|
||||
if !exists {
|
||||
httpError(connContext, errs.ErrConnArgsErr)
|
||||
return
|
||||
}
|
||||
userID, exists = connContext.Query(WsUserID)
|
||||
if !exists {
|
||||
httpError(connContext, errs.ErrConnArgsErr)
|
||||
return
|
||||
}
|
||||
platformIDStr, exists = connContext.Query(PlatformID)
|
||||
if !exists {
|
||||
httpError(connContext, errs.ErrConnArgsErr)
|
||||
return
|
||||
}
|
||||
platformID, err := strconv.Atoi(platformIDStr)
|
||||
if err != nil {
|
||||
httpError(connContext, errs.ErrConnArgsErr)
|
||||
return
|
||||
}
|
||||
if err := tokenverify.WsVerifyToken(token, userID, platformID); err != nil {
|
||||
httpError(connContext, err)
|
||||
return
|
||||
}
|
||||
m, err := ws.cache.GetTokensWithoutError(context.Background(), userID, platformID)
|
||||
if err != nil {
|
||||
httpError(connContext, err)
|
||||
return
|
||||
}
|
||||
if v, ok := m[token]; ok {
|
||||
switch v {
|
||||
case constant.NormalToken:
|
||||
case constant.KickedToken:
|
||||
httpError(connContext, errs.ErrTokenKicked.Wrap())
|
||||
return
|
||||
default:
|
||||
httpError(connContext, errs.ErrTokenUnknown.Wrap())
|
||||
return
|
||||
}
|
||||
} else {
|
||||
httpError(connContext, errs.ErrTokenNotExist.Wrap())
|
||||
return
|
||||
}
|
||||
wsLongConn := newGWebSocket(WebSocket, ws.handshakeTimeout)
|
||||
err = wsLongConn.GenerateLongConn(w, r)
|
||||
if err != nil {
|
||||
httpError(connContext, err)
|
||||
return
|
||||
}
|
||||
compressProtoc, exists := connContext.Query(Compression)
|
||||
if exists {
|
||||
if compressProtoc == GzipCompressionProtocol {
|
||||
compression = true
|
||||
}
|
||||
}
|
||||
compressProtoc, exists = connContext.GetHeader(Compression)
|
||||
if exists {
|
||||
if compressProtoc == GzipCompressionProtocol {
|
||||
compression = true
|
||||
}
|
||||
}
|
||||
client := ws.clientPool.Get().(*Client)
|
||||
client.ResetClient(connContext, wsLongConn, connContext.GetBackground(), compression, ws)
|
||||
ws.registerChan <- client
|
||||
go client.readMessage()
|
||||
}
|
||||
36
internal/msggateway/options.go
Normal file
36
internal/msggateway/options.go
Normal file
@@ -0,0 +1,36 @@
|
||||
package msggateway
|
||||
|
||||
import "time"
|
||||
|
||||
type Option func(opt *configs)
|
||||
type configs struct {
|
||||
//长连接监听端口
|
||||
port int
|
||||
//长连接允许最大链接数
|
||||
maxConnNum int64
|
||||
//连接握手超时时间
|
||||
handshakeTimeout time.Duration
|
||||
//允许消息最大长度
|
||||
messageMaxMsgLength int
|
||||
}
|
||||
|
||||
func WithPort(port int) Option {
|
||||
return func(opt *configs) {
|
||||
opt.port = port
|
||||
}
|
||||
}
|
||||
func WithMaxConnNum(num int64) Option {
|
||||
return func(opt *configs) {
|
||||
opt.maxConnNum = num
|
||||
}
|
||||
}
|
||||
func WithHandshakeTimeout(t time.Duration) Option {
|
||||
return func(opt *configs) {
|
||||
opt.handshakeTimeout = t
|
||||
}
|
||||
}
|
||||
func WithMessageMaxMsgLength(length int) Option {
|
||||
return func(opt *configs) {
|
||||
opt.messageMaxMsgLength = length
|
||||
}
|
||||
}
|
||||
100
internal/msggateway/user_map.go
Normal file
100
internal/msggateway/user_map.go
Normal file
@@ -0,0 +1,100 @@
|
||||
package msggateway
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/log"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
|
||||
"sync"
|
||||
)
|
||||
|
||||
type UserMap struct {
|
||||
m sync.Map
|
||||
}
|
||||
|
||||
func newUserMap() *UserMap {
|
||||
return &UserMap{}
|
||||
}
|
||||
func (u *UserMap) GetAll(key string) ([]*Client, bool) {
|
||||
allClients, ok := u.m.Load(key)
|
||||
if ok {
|
||||
return allClients.([]*Client), ok
|
||||
}
|
||||
return nil, ok
|
||||
}
|
||||
func (u *UserMap) Get(key string, platformID int) ([]*Client, bool, bool) {
|
||||
allClients, userExisted := u.m.Load(key)
|
||||
if userExisted {
|
||||
var clients []*Client
|
||||
for _, client := range allClients.([]*Client) {
|
||||
if client.PlatformID == platformID {
|
||||
clients = append(clients, client)
|
||||
}
|
||||
}
|
||||
if len(clients) > 0 {
|
||||
return clients, userExisted, true
|
||||
|
||||
}
|
||||
return clients, userExisted, false
|
||||
}
|
||||
return nil, userExisted, false
|
||||
}
|
||||
func (u *UserMap) Set(key string, v *Client) {
|
||||
allClients, existed := u.m.Load(key)
|
||||
if existed {
|
||||
log.ZDebug(context.Background(), "Set existed", "user_id", key, "client", *v)
|
||||
oldClients := allClients.([]*Client)
|
||||
oldClients = append(oldClients, v)
|
||||
u.m.Store(key, oldClients)
|
||||
} else {
|
||||
log.ZDebug(context.Background(), "Set not existed", "user_id", key, "client", *v)
|
||||
var clients []*Client
|
||||
clients = append(clients, v)
|
||||
u.m.Store(key, clients)
|
||||
}
|
||||
}
|
||||
func (u *UserMap) delete(key string, connRemoteAddr string) (isDeleteUser bool) {
|
||||
allClients, existed := u.m.Load(key)
|
||||
if existed {
|
||||
oldClients := allClients.([]*Client)
|
||||
var a []*Client
|
||||
for _, client := range oldClients {
|
||||
if client.ctx.GetRemoteAddr() != connRemoteAddr {
|
||||
a = append(a, client)
|
||||
}
|
||||
}
|
||||
if len(a) == 0 {
|
||||
u.m.Delete(key)
|
||||
return true
|
||||
} else {
|
||||
u.m.Store(key, a)
|
||||
return false
|
||||
}
|
||||
}
|
||||
return existed
|
||||
}
|
||||
func (u *UserMap) deleteClients(key string, clients []*Client) (isDeleteUser bool) {
|
||||
m := utils.SliceToMapAny(clients, func(c *Client) (string, struct{}) {
|
||||
return c.ctx.GetRemoteAddr(), struct{}{}
|
||||
})
|
||||
allClients, existed := u.m.Load(key)
|
||||
if existed {
|
||||
oldClients := allClients.([]*Client)
|
||||
var a []*Client
|
||||
for _, client := range oldClients {
|
||||
if _, ok := m[client.ctx.GetRemoteAddr()]; !ok {
|
||||
a = append(a, client)
|
||||
}
|
||||
}
|
||||
if len(a) == 0 {
|
||||
u.m.Delete(key)
|
||||
return true
|
||||
} else {
|
||||
u.m.Store(key, a)
|
||||
return false
|
||||
}
|
||||
}
|
||||
return existed
|
||||
}
|
||||
func (u *UserMap) DeleteAll(key string) {
|
||||
u.m.Delete(key)
|
||||
}
|
||||
107
internal/msgtransfer/init.go
Normal file
107
internal/msgtransfer/init.go
Normal file
@@ -0,0 +1,107 @@
|
||||
package msgtransfer
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/controller"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/relation"
|
||||
relationTb "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/relation"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/tx"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/unrelation"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/log"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/mw"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/prome"
|
||||
openKeeper "github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry/zookeeper"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
|
||||
"google.golang.org/grpc"
|
||||
"google.golang.org/grpc/credentials/insecure"
|
||||
)
|
||||
|
||||
type MsgTransfer struct {
|
||||
persistentCH *PersistentConsumerHandler // 聊天记录持久化到mysql的消费者 订阅的topic: ws2ms_chat
|
||||
historyCH *OnlineHistoryRedisConsumerHandler // 这个消费者聚合消息, 订阅的topic:ws2ms_chat, 修改通知发往msg_to_modify topic, 消息存入redis后Incr Redis, 再发消息到ms2pschat topic推送, 发消息到msg_to_mongo topic持久化
|
||||
historyMongoCH *OnlineHistoryMongoConsumerHandler // mongoDB批量插入, 成功后删除redis中消息,以及处理删除通知消息删除的 订阅的topic: msg_to_mongo
|
||||
modifyCH *ModifyMsgConsumerHandler // 负责消费修改消息通知的consumer, 订阅的topic: msg_to_modify
|
||||
}
|
||||
|
||||
func StartTransfer(prometheusPort int) error {
|
||||
db, err := relation.NewGormDB()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err := db.AutoMigrate(&relationTb.ChatLogModel{}); err != nil {
|
||||
return err
|
||||
}
|
||||
rdb, err := cache.NewRedis()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
mongo, err := unrelation.NewMongo()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err := mongo.CreateMsgIndex(); err != nil {
|
||||
return err
|
||||
}
|
||||
client, err := openKeeper.NewClient(config.Config.Zookeeper.ZkAddr, config.Config.Zookeeper.Schema,
|
||||
openKeeper.WithFreq(time.Hour), openKeeper.WithRoundRobin(), openKeeper.WithUserNameAndPassword(config.Config.Zookeeper.UserName,
|
||||
config.Config.Zookeeper.Password), openKeeper.WithTimeout(10), openKeeper.WithLogger(log.NewZkLogger()))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
client.AddOption(mw.GrpcClient(), grpc.WithTransportCredentials(insecure.NewCredentials()))
|
||||
msgModel := cache.NewMsgCacheModel(rdb)
|
||||
msgDocModel := unrelation.NewMsgMongoDriver(mongo.GetDatabase())
|
||||
extendMsgModel := unrelation.NewExtendMsgSetMongoDriver(mongo.GetDatabase())
|
||||
extendMsgCache := cache.NewExtendMsgSetCacheRedis(rdb, extendMsgModel, cache.GetDefaultOpt())
|
||||
chatLogDatabase := controller.NewChatLogDatabase(relation.NewChatLogGorm(db))
|
||||
extendMsgDatabase := controller.NewExtendMsgDatabase(extendMsgModel, extendMsgCache, tx.NewMongo(mongo.GetClient()))
|
||||
msgDatabase := controller.NewCommonMsgDatabase(msgDocModel, msgModel)
|
||||
conversationRpcClient := rpcclient.NewConversationRpcClient(client)
|
||||
groupRpcClient := rpcclient.NewGroupRpcClient(client)
|
||||
msgTransfer := NewMsgTransfer(chatLogDatabase, extendMsgDatabase, msgDatabase, &conversationRpcClient, &groupRpcClient)
|
||||
msgTransfer.initPrometheus()
|
||||
return msgTransfer.Start(prometheusPort)
|
||||
}
|
||||
|
||||
func NewMsgTransfer(chatLogDatabase controller.ChatLogDatabase,
|
||||
extendMsgDatabase controller.ExtendMsgDatabase, msgDatabase controller.CommonMsgDatabase,
|
||||
conversationRpcClient *rpcclient.ConversationRpcClient, groupRpcClient *rpcclient.GroupRpcClient) *MsgTransfer {
|
||||
return &MsgTransfer{persistentCH: NewPersistentConsumerHandler(chatLogDatabase), historyCH: NewOnlineHistoryRedisConsumerHandler(msgDatabase, conversationRpcClient, groupRpcClient),
|
||||
historyMongoCH: NewOnlineHistoryMongoConsumerHandler(msgDatabase), modifyCH: NewModifyMsgConsumerHandler(extendMsgDatabase)}
|
||||
}
|
||||
|
||||
func (m *MsgTransfer) initPrometheus() {
|
||||
prome.NewSeqGetSuccessCounter()
|
||||
prome.NewSeqGetFailedCounter()
|
||||
prome.NewSeqSetSuccessCounter()
|
||||
prome.NewSeqSetFailedCounter()
|
||||
prome.NewMsgInsertRedisSuccessCounter()
|
||||
prome.NewMsgInsertRedisFailedCounter()
|
||||
prome.NewMsgInsertMongoSuccessCounter()
|
||||
prome.NewMsgInsertMongoFailedCounter()
|
||||
}
|
||||
|
||||
func (m *MsgTransfer) Start(prometheusPort int) error {
|
||||
var wg sync.WaitGroup
|
||||
wg.Add(1)
|
||||
fmt.Println("start msg transfer", "prometheusPort:", prometheusPort)
|
||||
if config.Config.ChatPersistenceMysql {
|
||||
// go m.persistentCH.persistentConsumerGroup.RegisterHandleAndConsumer(m.persistentCH)
|
||||
} else {
|
||||
fmt.Println("msg transfer not start mysql consumer")
|
||||
}
|
||||
go m.historyCH.historyConsumerGroup.RegisterHandleAndConsumer(m.historyCH)
|
||||
go m.historyMongoCH.historyConsumerGroup.RegisterHandleAndConsumer(m.historyMongoCH)
|
||||
go m.modifyCH.modifyMsgConsumerGroup.RegisterHandleAndConsumer(m.modifyCH)
|
||||
err := prome.StartPrometheusSrv(prometheusPort)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
wg.Wait()
|
||||
return nil
|
||||
}
|
||||
113
internal/msgtransfer/modify_msg_handler.go
Normal file
113
internal/msgtransfer/modify_msg_handler.go
Normal file
@@ -0,0 +1,113 @@
|
||||
package msgtransfer
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/controller"
|
||||
unRelationTb "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/unrelation"
|
||||
kfk "github.com/OpenIMSDK/Open-IM-Server/pkg/common/kafka"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/log"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/mcontext"
|
||||
pbMsg "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msg"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
|
||||
"github.com/Shopify/sarama"
|
||||
|
||||
"google.golang.org/protobuf/proto"
|
||||
)
|
||||
|
||||
type ModifyMsgConsumerHandler struct {
|
||||
modifyMsgConsumerGroup *kfk.MConsumerGroup
|
||||
|
||||
extendMsgDatabase controller.ExtendMsgDatabase
|
||||
extendSetMsgModel unRelationTb.ExtendMsgSetModel
|
||||
}
|
||||
|
||||
func NewModifyMsgConsumerHandler(database controller.ExtendMsgDatabase) *ModifyMsgConsumerHandler {
|
||||
return &ModifyMsgConsumerHandler{
|
||||
modifyMsgConsumerGroup: kfk.NewMConsumerGroup(&kfk.MConsumerGroupConfig{KafkaVersion: sarama.V2_0_0_0,
|
||||
OffsetsInitial: sarama.OffsetNewest, IsReturnErr: false}, []string{config.Config.Kafka.MsgToModify.Topic},
|
||||
config.Config.Kafka.MsgToModify.Addr, config.Config.Kafka.ConsumerGroupID.MsgToModify),
|
||||
extendMsgDatabase: database,
|
||||
}
|
||||
}
|
||||
|
||||
func (ModifyMsgConsumerHandler) Setup(_ sarama.ConsumerGroupSession) error { return nil }
|
||||
func (ModifyMsgConsumerHandler) Cleanup(_ sarama.ConsumerGroupSession) error { return nil }
|
||||
func (mmc *ModifyMsgConsumerHandler) ConsumeClaim(sess sarama.ConsumerGroupSession,
|
||||
claim sarama.ConsumerGroupClaim) error {
|
||||
for msg := range claim.Messages() {
|
||||
ctx := mmc.modifyMsgConsumerGroup.GetContextFromMsg(msg)
|
||||
log.ZDebug(ctx, "kafka get info to mysql", "ModifyMsgConsumerHandler", msg.Topic, "msgPartition", msg.Partition, "msg", string(msg.Value), "key", string(msg.Key))
|
||||
if len(msg.Value) != 0 {
|
||||
mmc.ModifyMsg(ctx, msg, string(msg.Key), sess)
|
||||
} else {
|
||||
log.ZError(ctx, "msg get from kafka but is nil", nil, "key", msg.Key)
|
||||
}
|
||||
sess.MarkMessage(msg, "")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (mmc *ModifyMsgConsumerHandler) ModifyMsg(ctx context.Context, cMsg *sarama.ConsumerMessage, msgKey string, _ sarama.ConsumerGroupSession) {
|
||||
msgFromMQ := pbMsg.MsgDataToModifyByMQ{}
|
||||
operationID := mcontext.GetOperationID(ctx)
|
||||
err := proto.Unmarshal(cMsg.Value, &msgFromMQ)
|
||||
if err != nil {
|
||||
log.ZError(ctx, "msg_transfer Unmarshal msg err", err, "msg", string(cMsg.Value))
|
||||
return
|
||||
}
|
||||
log.ZDebug(ctx, "proto.Unmarshal MsgDataToMQ", "msgs", msgFromMQ.String())
|
||||
for _, msg := range msgFromMQ.Messages {
|
||||
isReactionFromCache := utils.GetSwitchFromOptions(msg.Options, constant.IsReactionFromCache)
|
||||
if !isReactionFromCache {
|
||||
continue
|
||||
}
|
||||
ctx = mcontext.SetOperationID(ctx, operationID)
|
||||
if msg.ContentType == constant.ReactionMessageModifier {
|
||||
notification := &sdkws.ReactionMessageModifierNotification{}
|
||||
if err := json.Unmarshal(msg.Content, notification); err != nil {
|
||||
continue
|
||||
}
|
||||
if notification.IsExternalExtensions {
|
||||
continue
|
||||
}
|
||||
if !notification.IsReact {
|
||||
// first time to modify
|
||||
var reactionExtensionList = make(map[string]unRelationTb.KeyValueModel)
|
||||
extendMsg := unRelationTb.ExtendMsgModel{
|
||||
ReactionExtensionList: reactionExtensionList,
|
||||
ClientMsgID: notification.ClientMsgID,
|
||||
MsgFirstModifyTime: notification.MsgFirstModifyTime,
|
||||
}
|
||||
for _, v := range notification.SuccessReactionExtensions {
|
||||
reactionExtensionList[v.TypeKey] = unRelationTb.KeyValueModel{
|
||||
TypeKey: v.TypeKey,
|
||||
Value: v.Value,
|
||||
LatestUpdateTime: v.LatestUpdateTime,
|
||||
}
|
||||
}
|
||||
|
||||
if err := mmc.extendMsgDatabase.InsertExtendMsg(ctx, notification.ConversationID, notification.SessionType, &extendMsg); err != nil {
|
||||
// log.ZError(ctx, "MsgFirstModify InsertExtendMsg failed", notification.ConversationID, notification.SessionType, extendMsg, err.Error())
|
||||
continue
|
||||
}
|
||||
} else {
|
||||
if err := mmc.extendMsgDatabase.InsertOrUpdateReactionExtendMsgSet(ctx, notification.ConversationID, notification.SessionType, notification.ClientMsgID, notification.MsgFirstModifyTime, mmc.extendSetMsgModel.Pb2Model(notification.SuccessReactionExtensions)); err != nil {
|
||||
// log.NewError(operationID, "InsertOrUpdateReactionExtendMsgSet failed")
|
||||
}
|
||||
}
|
||||
} else if msg.ContentType == constant.ReactionMessageDeleter {
|
||||
notification := &sdkws.ReactionMessageDeleteNotification{}
|
||||
if err := json.Unmarshal(msg.Content, notification); err != nil {
|
||||
continue
|
||||
}
|
||||
if err := mmc.extendMsgDatabase.DeleteReactionExtendMsgSet(ctx, notification.ConversationID, notification.SessionType, notification.ClientMsgID, notification.MsgFirstModifyTime, mmc.extendSetMsgModel.Pb2Model(notification.SuccessReactionExtensions)); err != nil {
|
||||
// log.NewError(operationID, "InsertOrUpdateReactionExtendMsgSet failed")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
343
internal/msgtransfer/online_history_msg_handler.go
Normal file
343
internal/msgtransfer/online_history_msg_handler.go
Normal file
@@ -0,0 +1,343 @@
|
||||
package msgtransfer
|
||||
|
||||
import (
|
||||
"context"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
|
||||
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/controller"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/kafka"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/log"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/mcontext"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
|
||||
"github.com/Shopify/sarama"
|
||||
"github.com/go-redis/redis"
|
||||
"google.golang.org/protobuf/proto"
|
||||
)
|
||||
|
||||
const ConsumerMsgs = 3
|
||||
const SourceMessages = 4
|
||||
const MongoMessages = 5
|
||||
const ChannelNum = 100
|
||||
|
||||
type MsgChannelValue struct {
|
||||
uniqueKey string
|
||||
ctx context.Context
|
||||
ctxMsgList []*ContextMsg
|
||||
}
|
||||
|
||||
type TriggerChannelValue struct {
|
||||
ctx context.Context
|
||||
cMsgList []*sarama.ConsumerMessage
|
||||
}
|
||||
|
||||
type Cmd2Value struct {
|
||||
Cmd int
|
||||
Value interface{}
|
||||
}
|
||||
type ContextMsg struct {
|
||||
message *sdkws.MsgData
|
||||
ctx context.Context
|
||||
}
|
||||
|
||||
type OnlineHistoryRedisConsumerHandler struct {
|
||||
historyConsumerGroup *kafka.MConsumerGroup
|
||||
chArrays [ChannelNum]chan Cmd2Value
|
||||
msgDistributionCh chan Cmd2Value
|
||||
|
||||
singleMsgSuccessCount uint64
|
||||
singleMsgFailedCount uint64
|
||||
singleMsgSuccessCountMutex sync.Mutex
|
||||
singleMsgFailedCountMutex sync.Mutex
|
||||
|
||||
msgDatabase controller.CommonMsgDatabase
|
||||
conversationRpcClient *rpcclient.ConversationRpcClient
|
||||
groupRpcClient *rpcclient.GroupRpcClient
|
||||
}
|
||||
|
||||
func NewOnlineHistoryRedisConsumerHandler(database controller.CommonMsgDatabase, conversationRpcClient *rpcclient.ConversationRpcClient, groupRpcClient *rpcclient.GroupRpcClient) *OnlineHistoryRedisConsumerHandler {
|
||||
var och OnlineHistoryRedisConsumerHandler
|
||||
och.msgDatabase = database
|
||||
och.msgDistributionCh = make(chan Cmd2Value) //no buffer channel
|
||||
go och.MessagesDistributionHandle()
|
||||
for i := 0; i < ChannelNum; i++ {
|
||||
och.chArrays[i] = make(chan Cmd2Value, 50)
|
||||
go och.Run(i)
|
||||
}
|
||||
och.conversationRpcClient = conversationRpcClient
|
||||
och.groupRpcClient = groupRpcClient
|
||||
och.historyConsumerGroup = kafka.NewMConsumerGroup(&kafka.MConsumerGroupConfig{KafkaVersion: sarama.V2_0_0_0,
|
||||
OffsetsInitial: sarama.OffsetNewest, IsReturnErr: false}, []string{config.Config.Kafka.Ws2mschat.Topic},
|
||||
config.Config.Kafka.Ws2mschat.Addr, config.Config.Kafka.ConsumerGroupID.MsgToRedis)
|
||||
//statistics.NewStatistics(&och.singleMsgSuccessCount, config.Config.ModuleName.MsgTransferName, fmt.Sprintf("%d second singleMsgCount insert to mongo", constant.StatisticsTimeInterval), constant.StatisticsTimeInterval)
|
||||
return &och
|
||||
}
|
||||
|
||||
func (och *OnlineHistoryRedisConsumerHandler) Run(channelID int) {
|
||||
for {
|
||||
select {
|
||||
case cmd := <-och.chArrays[channelID]:
|
||||
switch cmd.Cmd {
|
||||
case SourceMessages:
|
||||
msgChannelValue := cmd.Value.(MsgChannelValue)
|
||||
ctxMsgList := msgChannelValue.ctxMsgList
|
||||
ctx := msgChannelValue.ctx
|
||||
log.ZDebug(ctx, "msg arrived channel", "channel id", channelID, "msgList length", len(ctxMsgList), "uniqueKey", msgChannelValue.uniqueKey)
|
||||
storageMsgList, notStorageMsgList, storageNotificationList, notStorageNotificationList, modifyMsgList := och.getPushStorageMsgList(ctxMsgList)
|
||||
log.ZDebug(ctx, "msg lens", "storageMsgList", len(storageMsgList), "notStorageMsgList", len(notStorageMsgList),
|
||||
"storageNotificationList", len(storageNotificationList), "notStorageNotificationList", len(notStorageNotificationList), "modifyMsgList", len(modifyMsgList))
|
||||
conversationIDMsg := utils.GetChatConversationIDByMsg(ctxMsgList[0].message)
|
||||
conversationIDNotification := utils.GetNotificationConversationID(ctxMsgList[0].message)
|
||||
och.handleMsg(ctx, msgChannelValue.uniqueKey, conversationIDMsg, storageMsgList, notStorageMsgList)
|
||||
och.handleNotification(ctx, msgChannelValue.uniqueKey, conversationIDNotification, storageNotificationList, notStorageNotificationList)
|
||||
if err := och.msgDatabase.MsgToModifyMQ(ctx, msgChannelValue.uniqueKey, conversationIDNotification, modifyMsgList); err != nil {
|
||||
log.ZError(ctx, "msg to modify mq error", err, "uniqueKey", msgChannelValue.uniqueKey, "modifyMsgList", modifyMsgList)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 获取消息/通知 存储的消息列表, 不存储并且推送的消息列表,
|
||||
func (och *OnlineHistoryRedisConsumerHandler) getPushStorageMsgList(totalMsgs []*ContextMsg) (storageMsgList, notStorageMsgList, storageNotificatoinList, notStorageNotificationList, modifyMsgList []*sdkws.MsgData) {
|
||||
isStorage := func(msg *sdkws.MsgData) bool {
|
||||
options2 := utils.Options(msg.Options)
|
||||
if options2.IsHistory() {
|
||||
return true
|
||||
} else {
|
||||
// if !(!options2.IsSenderSync() && conversationID == msg.MsgData.SendID) {
|
||||
// return false
|
||||
// }
|
||||
return false
|
||||
}
|
||||
}
|
||||
for _, v := range totalMsgs {
|
||||
options := utils.Options(v.message.Options)
|
||||
if !options.IsNotNotification() {
|
||||
// clone msg from notificationMsg
|
||||
if options.IsSendMsg() {
|
||||
msg := proto.Clone(v.message).(*sdkws.MsgData)
|
||||
// 消息
|
||||
if v.message.Options != nil {
|
||||
msg.Options = utils.NewMsgOptions()
|
||||
}
|
||||
if options.IsOfflinePush() {
|
||||
v.message.Options = utils.WithOptions(utils.Options(v.message.Options), utils.WithOfflinePush(false))
|
||||
msg.Options = utils.WithOptions(utils.Options(msg.Options), utils.WithOfflinePush(true))
|
||||
}
|
||||
if options.IsUnreadCount() {
|
||||
v.message.Options = utils.WithOptions(utils.Options(v.message.Options), utils.WithUnreadCount(false))
|
||||
msg.Options = utils.WithOptions(utils.Options(msg.Options), utils.WithUnreadCount(true))
|
||||
}
|
||||
storageMsgList = append(storageMsgList, msg)
|
||||
}
|
||||
if isStorage(v.message) {
|
||||
storageNotificatoinList = append(storageNotificatoinList, v.message)
|
||||
} else {
|
||||
notStorageNotificationList = append(notStorageNotificationList, v.message)
|
||||
}
|
||||
} else {
|
||||
if isStorage(v.message) {
|
||||
storageMsgList = append(storageMsgList, v.message)
|
||||
} else {
|
||||
notStorageMsgList = append(notStorageMsgList, v.message)
|
||||
}
|
||||
}
|
||||
if v.message.ContentType == constant.ReactionMessageModifier || v.message.ContentType == constant.ReactionMessageDeleter {
|
||||
modifyMsgList = append(modifyMsgList, v.message)
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (och *OnlineHistoryRedisConsumerHandler) handleNotification(ctx context.Context, key, conversationID string, storageList, notStorageList []*sdkws.MsgData) {
|
||||
och.toPushTopic(ctx, key, conversationID, notStorageList)
|
||||
if len(storageList) > 0 {
|
||||
lastSeq, _, err := och.msgDatabase.BatchInsertChat2Cache(ctx, conversationID, storageList)
|
||||
if err != nil {
|
||||
log.ZError(ctx, "notification batch insert to redis error", err, "conversationID", conversationID, "storageList", storageList)
|
||||
return
|
||||
}
|
||||
log.ZDebug(ctx, "success to next topic", "conversationID", conversationID)
|
||||
och.msgDatabase.MsgToMongoMQ(ctx, key, conversationID, storageList, lastSeq)
|
||||
och.toPushTopic(ctx, key, conversationID, storageList)
|
||||
}
|
||||
}
|
||||
|
||||
func (och *OnlineHistoryRedisConsumerHandler) toPushTopic(ctx context.Context, key, conversationID string, msgs []*sdkws.MsgData) {
|
||||
for _, v := range msgs {
|
||||
och.msgDatabase.MsgToPushMQ(ctx, key, conversationID, v)
|
||||
}
|
||||
}
|
||||
|
||||
func (och *OnlineHistoryRedisConsumerHandler) handleMsg(ctx context.Context, key, conversationID string, storageList, notStorageList []*sdkws.MsgData) {
|
||||
och.toPushTopic(ctx, key, conversationID, notStorageList)
|
||||
if len(storageList) > 0 {
|
||||
lastSeq, isNewConversation, err := och.msgDatabase.BatchInsertChat2Cache(ctx, conversationID, storageList)
|
||||
if err != nil && errs.Unwrap(err) != redis.Nil {
|
||||
log.ZError(ctx, "batch data insert to redis err", err, "storageMsgList", storageList)
|
||||
och.singleMsgFailedCountMutex.Lock()
|
||||
och.singleMsgFailedCount += uint64(len(storageList))
|
||||
och.singleMsgFailedCountMutex.Unlock()
|
||||
return
|
||||
}
|
||||
if isNewConversation {
|
||||
if storageList[0].SessionType == constant.SuperGroupChatType {
|
||||
log.ZInfo(ctx, "group chat first create conversation", "conversationID", conversationID)
|
||||
userIDs, err := och.groupRpcClient.GetGroupMemberIDs(ctx, storageList[0].GroupID)
|
||||
if err != nil {
|
||||
log.ZWarn(ctx, "get group member ids error", err, "conversationID", conversationID)
|
||||
} else {
|
||||
if err := och.conversationRpcClient.GroupChatFirstCreateConversation(ctx, storageList[0].GroupID, userIDs); err != nil {
|
||||
log.ZWarn(ctx, "single chat first create conversation error", err, "conversationID", conversationID)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if err := och.conversationRpcClient.SingleChatFirstCreateConversation(ctx, storageList[0].RecvID, storageList[0].SendID); err != nil {
|
||||
log.ZWarn(ctx, "single chat first create conversation error", err, "conversationID", conversationID)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
log.ZDebug(ctx, "success incr to next topic")
|
||||
och.singleMsgSuccessCountMutex.Lock()
|
||||
och.singleMsgSuccessCount += uint64(len(storageList))
|
||||
och.singleMsgSuccessCountMutex.Unlock()
|
||||
och.msgDatabase.MsgToMongoMQ(ctx, key, conversationID, storageList, lastSeq)
|
||||
och.toPushTopic(ctx, key, conversationID, storageList)
|
||||
}
|
||||
}
|
||||
|
||||
func (och *OnlineHistoryRedisConsumerHandler) MessagesDistributionHandle() {
|
||||
for {
|
||||
aggregationMsgs := make(map[string][]*ContextMsg, ChannelNum)
|
||||
select {
|
||||
case cmd := <-och.msgDistributionCh:
|
||||
switch cmd.Cmd {
|
||||
case ConsumerMsgs:
|
||||
triggerChannelValue := cmd.Value.(TriggerChannelValue)
|
||||
ctx := triggerChannelValue.ctx
|
||||
consumerMessages := triggerChannelValue.cMsgList
|
||||
//Aggregation map[userid]message list
|
||||
log.ZDebug(ctx, "batch messages come to distribution center", "length", len(consumerMessages))
|
||||
for i := 0; i < len(consumerMessages); i++ {
|
||||
ctxMsg := &ContextMsg{}
|
||||
msgFromMQ := &sdkws.MsgData{}
|
||||
err := proto.Unmarshal(consumerMessages[i].Value, msgFromMQ)
|
||||
if err != nil {
|
||||
log.ZError(ctx, "msg_transfer Unmarshal msg err", err, string(consumerMessages[i].Value))
|
||||
continue
|
||||
}
|
||||
var arr []string
|
||||
for i, header := range consumerMessages[i].Headers {
|
||||
arr = append(arr, strconv.Itoa(i), string(header.Key), string(header.Value))
|
||||
}
|
||||
log.ZInfo(ctx, "consumer.kafka.GetContextWithMQHeader", "len", len(consumerMessages[i].Headers), "header", strings.Join(arr, ", "))
|
||||
ctxMsg.ctx = kafka.GetContextWithMQHeader(consumerMessages[i].Headers)
|
||||
ctxMsg.message = msgFromMQ
|
||||
log.ZDebug(ctx, "single msg come to distribution center", "message", msgFromMQ, "key", string(consumerMessages[i].Key))
|
||||
//aggregationMsgs[string(consumerMessages[i].Key)] = append(aggregationMsgs[string(consumerMessages[i].Key)], ctxMsg)
|
||||
if oldM, ok := aggregationMsgs[string(consumerMessages[i].Key)]; ok {
|
||||
oldM = append(oldM, ctxMsg)
|
||||
aggregationMsgs[string(consumerMessages[i].Key)] = oldM
|
||||
} else {
|
||||
m := make([]*ContextMsg, 0, 100)
|
||||
m = append(m, ctxMsg)
|
||||
aggregationMsgs[string(consumerMessages[i].Key)] = m
|
||||
}
|
||||
}
|
||||
log.ZDebug(ctx, "generate map list users len", "length", len(aggregationMsgs))
|
||||
for uniqueKey, v := range aggregationMsgs {
|
||||
if len(v) >= 0 {
|
||||
hashCode := utils.GetHashCode(uniqueKey)
|
||||
channelID := hashCode % ChannelNum
|
||||
newCtx := withAggregationCtx(ctx, v)
|
||||
log.ZDebug(newCtx, "generate channelID", "hashCode", hashCode, "channelID", channelID, "uniqueKey", uniqueKey)
|
||||
och.chArrays[channelID] <- Cmd2Value{Cmd: SourceMessages, Value: MsgChannelValue{uniqueKey: uniqueKey, ctxMsgList: v, ctx: newCtx}}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
func withAggregationCtx(ctx context.Context, values []*ContextMsg) context.Context {
|
||||
var allMessageOperationID string
|
||||
for i, v := range values {
|
||||
if opid := mcontext.GetOperationID(v.ctx); opid != "" {
|
||||
if i == 0 {
|
||||
allMessageOperationID += opid
|
||||
|
||||
} else {
|
||||
allMessageOperationID += "$" + opid
|
||||
}
|
||||
}
|
||||
}
|
||||
return mcontext.SetOperationID(ctx, allMessageOperationID)
|
||||
}
|
||||
|
||||
func (och *OnlineHistoryRedisConsumerHandler) Setup(_ sarama.ConsumerGroupSession) error { return nil }
|
||||
func (och *OnlineHistoryRedisConsumerHandler) Cleanup(_ sarama.ConsumerGroupSession) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (och *OnlineHistoryRedisConsumerHandler) ConsumeClaim(sess sarama.ConsumerGroupSession, claim sarama.ConsumerGroupClaim) error { // a instance in the consumer group
|
||||
for {
|
||||
if sess == nil {
|
||||
log.ZWarn(context.Background(), "sess == nil, waiting", nil)
|
||||
time.Sleep(100 * time.Millisecond)
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
rwLock := new(sync.RWMutex)
|
||||
log.ZDebug(context.Background(), "online new session msg come", "highWaterMarkOffset",
|
||||
claim.HighWaterMarkOffset(), "topic", claim.Topic(), "partition", claim.Partition())
|
||||
cMsg := make([]*sarama.ConsumerMessage, 0, 1000)
|
||||
t := time.NewTicker(time.Millisecond * 100)
|
||||
go func() {
|
||||
for {
|
||||
select {
|
||||
case <-t.C:
|
||||
if len(cMsg) > 0 {
|
||||
rwLock.Lock()
|
||||
ccMsg := make([]*sarama.ConsumerMessage, 0, 1000)
|
||||
for _, v := range cMsg {
|
||||
ccMsg = append(ccMsg, v)
|
||||
}
|
||||
cMsg = make([]*sarama.ConsumerMessage, 0, 1000)
|
||||
rwLock.Unlock()
|
||||
split := 1000
|
||||
ctx := mcontext.WithTriggerIDContext(context.Background(), utils.OperationIDGenerator())
|
||||
log.ZDebug(ctx, "timer trigger msg consumer start", "length", len(ccMsg))
|
||||
for i := 0; i < len(ccMsg)/split; i++ {
|
||||
//log.Debug()
|
||||
och.msgDistributionCh <- Cmd2Value{Cmd: ConsumerMsgs, Value: TriggerChannelValue{
|
||||
ctx: ctx, cMsgList: ccMsg[i*split : (i+1)*split]}}
|
||||
}
|
||||
if (len(ccMsg) % split) > 0 {
|
||||
och.msgDistributionCh <- Cmd2Value{Cmd: ConsumerMsgs, Value: TriggerChannelValue{
|
||||
ctx: ctx, cMsgList: ccMsg[split*(len(ccMsg)/split):]}}
|
||||
}
|
||||
log.ZDebug(ctx, "timer trigger msg consumer end", "length", len(ccMsg))
|
||||
}
|
||||
}
|
||||
}
|
||||
}()
|
||||
for msg := range claim.Messages() {
|
||||
rwLock.Lock()
|
||||
if len(msg.Value) != 0 {
|
||||
cMsg = append(cMsg, msg)
|
||||
}
|
||||
rwLock.Unlock()
|
||||
sess.MarkMessage(msg, "")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
73
internal/msgtransfer/online_msg_to_mongo_handler.go
Normal file
73
internal/msgtransfer/online_msg_to_mongo_handler.go
Normal file
@@ -0,0 +1,73 @@
|
||||
package msgtransfer
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/controller"
|
||||
kfk "github.com/OpenIMSDK/Open-IM-Server/pkg/common/kafka"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/log"
|
||||
pbMsg "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msg"
|
||||
"github.com/Shopify/sarama"
|
||||
"google.golang.org/protobuf/proto"
|
||||
)
|
||||
|
||||
type OnlineHistoryMongoConsumerHandler struct {
|
||||
historyConsumerGroup *kfk.MConsumerGroup
|
||||
msgDatabase controller.CommonMsgDatabase
|
||||
}
|
||||
|
||||
func NewOnlineHistoryMongoConsumerHandler(database controller.CommonMsgDatabase) *OnlineHistoryMongoConsumerHandler {
|
||||
mc := &OnlineHistoryMongoConsumerHandler{
|
||||
historyConsumerGroup: kfk.NewMConsumerGroup(&kfk.MConsumerGroupConfig{KafkaVersion: sarama.V2_0_0_0,
|
||||
OffsetsInitial: sarama.OffsetNewest, IsReturnErr: false}, []string{config.Config.Kafka.MsgToMongo.Topic},
|
||||
config.Config.Kafka.MsgToMongo.Addr, config.Config.Kafka.ConsumerGroupID.MsgToMongo),
|
||||
msgDatabase: database,
|
||||
}
|
||||
return mc
|
||||
}
|
||||
|
||||
func (mc *OnlineHistoryMongoConsumerHandler) handleChatWs2Mongo(ctx context.Context, cMsg *sarama.ConsumerMessage, key string, session sarama.ConsumerGroupSession) {
|
||||
msg := cMsg.Value
|
||||
msgFromMQ := pbMsg.MsgDataToMongoByMQ{}
|
||||
err := proto.Unmarshal(msg, &msgFromMQ)
|
||||
if err != nil {
|
||||
log.ZError(ctx, "unmarshall failed", err, "key", key, "len", len(msg))
|
||||
return
|
||||
}
|
||||
if len(msgFromMQ.MsgData) == 0 {
|
||||
log.ZError(ctx, "msgFromMQ.MsgData is empty", nil, "cMsg", cMsg)
|
||||
return
|
||||
}
|
||||
log.ZInfo(ctx, "mongo consumer recv msg", "msgs", msgFromMQ.MsgData)
|
||||
err = mc.msgDatabase.BatchInsertChat2DB(ctx, msgFromMQ.ConversationID, msgFromMQ.MsgData, msgFromMQ.LastSeq)
|
||||
if err != nil {
|
||||
log.ZError(ctx, "single data insert to mongo err", err, "msg", msgFromMQ.MsgData, "conversationID", msgFromMQ.ConversationID)
|
||||
}
|
||||
var seqs []int64
|
||||
for _, msg := range msgFromMQ.MsgData {
|
||||
seqs = append(seqs, msg.Seq)
|
||||
}
|
||||
err = mc.msgDatabase.DeleteMessagesFromCache(ctx, msgFromMQ.ConversationID, seqs)
|
||||
if err != nil {
|
||||
log.ZError(ctx, "remove cache msg from redis err", err, "msg", msgFromMQ.MsgData, "conversationID", msgFromMQ.ConversationID)
|
||||
}
|
||||
mc.msgDatabase.DelUserDeleteMsgsList(ctx, msgFromMQ.ConversationID, seqs)
|
||||
}
|
||||
|
||||
func (OnlineHistoryMongoConsumerHandler) Setup(_ sarama.ConsumerGroupSession) error { return nil }
|
||||
func (OnlineHistoryMongoConsumerHandler) Cleanup(_ sarama.ConsumerGroupSession) error { return nil }
|
||||
func (mc *OnlineHistoryMongoConsumerHandler) ConsumeClaim(sess sarama.ConsumerGroupSession, claim sarama.ConsumerGroupClaim) error { // a instance in the consumer group
|
||||
log.ZDebug(context.Background(), "online new session msg come", "highWaterMarkOffset",
|
||||
claim.HighWaterMarkOffset(), "topic", claim.Topic(), "partition", claim.Partition())
|
||||
for msg := range claim.Messages() {
|
||||
ctx := mc.historyConsumerGroup.GetContextFromMsg(msg)
|
||||
if len(msg.Value) != 0 {
|
||||
mc.handleChatWs2Mongo(ctx, msg, string(msg.Key), sess)
|
||||
} else {
|
||||
log.ZError(ctx, "mongo msg get from kafka but is nil", nil, "conversationID", msg.Key)
|
||||
}
|
||||
sess.MarkMessage(msg, "")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
88
internal/msgtransfer/persistent_msg_handler.go
Normal file
88
internal/msgtransfer/persistent_msg_handler.go
Normal file
@@ -0,0 +1,88 @@
|
||||
/*
|
||||
** description("").
|
||||
** copyright('tuoyun,www.tuoyun.net').
|
||||
** author("fg,Gordon@tuoyun.net").
|
||||
** time(2021/5/11 15:37).
|
||||
*/
|
||||
package msgtransfer
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/controller"
|
||||
kfk "github.com/OpenIMSDK/Open-IM-Server/pkg/common/kafka"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/log"
|
||||
pbMsg "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msg"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
|
||||
|
||||
"github.com/Shopify/sarama"
|
||||
"google.golang.org/protobuf/proto"
|
||||
)
|
||||
|
||||
type PersistentConsumerHandler struct {
|
||||
persistentConsumerGroup *kfk.MConsumerGroup
|
||||
chatLogDatabase controller.ChatLogDatabase
|
||||
}
|
||||
|
||||
func NewPersistentConsumerHandler(database controller.ChatLogDatabase) *PersistentConsumerHandler {
|
||||
return &PersistentConsumerHandler{
|
||||
persistentConsumerGroup: kfk.NewMConsumerGroup(&kfk.MConsumerGroupConfig{KafkaVersion: sarama.V2_0_0_0,
|
||||
OffsetsInitial: sarama.OffsetNewest, IsReturnErr: false}, []string{config.Config.Kafka.Ws2mschat.Topic},
|
||||
config.Config.Kafka.Ws2mschat.Addr, config.Config.Kafka.ConsumerGroupID.MsgToMySql),
|
||||
chatLogDatabase: database,
|
||||
}
|
||||
}
|
||||
|
||||
func (pc *PersistentConsumerHandler) handleChatWs2Mysql(ctx context.Context, cMsg *sarama.ConsumerMessage, msgKey string, _ sarama.ConsumerGroupSession) {
|
||||
msg := cMsg.Value
|
||||
var tag bool
|
||||
msgFromMQ := pbMsg.MsgDataToMQ{}
|
||||
err := proto.Unmarshal(msg, &msgFromMQ)
|
||||
if err != nil {
|
||||
log.ZError(ctx, "msg_transfer Unmarshal msg err", err)
|
||||
return
|
||||
}
|
||||
return
|
||||
log.ZDebug(ctx, "handleChatWs2Mysql", "msg", msgFromMQ.MsgData)
|
||||
//Control whether to store history messages (mysql)
|
||||
isPersist := utils.GetSwitchFromOptions(msgFromMQ.MsgData.Options, constant.IsPersistent)
|
||||
//Only process receiver data
|
||||
if isPersist {
|
||||
switch msgFromMQ.MsgData.SessionType {
|
||||
case constant.SingleChatType, constant.NotificationChatType:
|
||||
if msgKey == msgFromMQ.MsgData.RecvID {
|
||||
tag = true
|
||||
}
|
||||
case constant.GroupChatType:
|
||||
if msgKey == msgFromMQ.MsgData.SendID {
|
||||
tag = true
|
||||
}
|
||||
case constant.SuperGroupChatType:
|
||||
tag = true
|
||||
}
|
||||
if tag {
|
||||
log.ZInfo(ctx, "msg_transfer msg persisting", "msg", string(msg))
|
||||
if err = pc.chatLogDatabase.CreateChatLog(&msgFromMQ); err != nil {
|
||||
log.ZError(ctx, "Message insert failed", err, "msg", msgFromMQ.String())
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
func (PersistentConsumerHandler) Setup(_ sarama.ConsumerGroupSession) error { return nil }
|
||||
func (PersistentConsumerHandler) Cleanup(_ sarama.ConsumerGroupSession) error { return nil }
|
||||
func (pc *PersistentConsumerHandler) ConsumeClaim(sess sarama.ConsumerGroupSession, claim sarama.ConsumerGroupClaim) error {
|
||||
for msg := range claim.Messages() {
|
||||
ctx := pc.persistentConsumerGroup.GetContextFromMsg(msg)
|
||||
log.ZDebug(ctx, "kafka get info to mysql", "msgTopic", msg.Topic, "msgPartition", msg.Partition, "msg", string(msg.Value), "key", string(msg.Key))
|
||||
if len(msg.Value) != 0 {
|
||||
pc.handleChatWs2Mysql(ctx, msg, string(msg.Key), sess)
|
||||
} else {
|
||||
log.ZError(ctx, "msg get from kafka but is nil", nil, "key", msg.Key)
|
||||
}
|
||||
sess.MarkMessage(msg, "")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
116
internal/push/callback.go
Normal file
116
internal/push/callback.go
Normal file
@@ -0,0 +1,116 @@
|
||||
package push
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/callbackstruct"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/http"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/mcontext"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
|
||||
)
|
||||
|
||||
func url() string {
|
||||
return config.Config.Callback.CallbackUrl
|
||||
}
|
||||
|
||||
func callbackOfflinePush(ctx context.Context, userIDs []string, msg *sdkws.MsgData, offlinePushUserIDs *[]string) error {
|
||||
if !config.Config.Callback.CallbackOfflinePush.Enable {
|
||||
return nil
|
||||
}
|
||||
req := &callbackstruct.CallbackBeforePushReq{
|
||||
UserStatusBatchCallbackReq: callbackstruct.UserStatusBatchCallbackReq{
|
||||
UserStatusBaseCallback: callbackstruct.UserStatusBaseCallback{
|
||||
CallbackCommand: constant.CallbackOfflinePushCommand,
|
||||
OperationID: mcontext.GetOperationID(ctx),
|
||||
PlatformID: int(msg.SenderPlatformID),
|
||||
Platform: constant.PlatformIDToName(int(msg.SenderPlatformID)),
|
||||
},
|
||||
UserIDList: userIDs,
|
||||
},
|
||||
OfflinePushInfo: msg.OfflinePushInfo,
|
||||
ClientMsgID: msg.ClientMsgID,
|
||||
SendID: msg.SendID,
|
||||
GroupID: msg.GroupID,
|
||||
ContentType: msg.ContentType,
|
||||
SessionType: msg.SessionType,
|
||||
AtUserIDs: msg.AtUserIDList,
|
||||
Content: utils.GetContent(msg),
|
||||
}
|
||||
resp := &callbackstruct.CallbackBeforePushResp{}
|
||||
if err := http.CallBackPostReturn(ctx, url(), req, resp, config.Config.Callback.CallbackOfflinePush); err != nil {
|
||||
if err == errs.ErrCallbackContinue {
|
||||
return nil
|
||||
}
|
||||
return err
|
||||
}
|
||||
if len(resp.UserIDs) != 0 {
|
||||
*offlinePushUserIDs = resp.UserIDs
|
||||
}
|
||||
if resp.OfflinePushInfo != nil {
|
||||
msg.OfflinePushInfo = resp.OfflinePushInfo
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func callbackOnlinePush(ctx context.Context, userIDs []string, msg *sdkws.MsgData) error {
|
||||
if !config.Config.Callback.CallbackOnlinePush.Enable || utils.Contain(msg.SendID, userIDs...) {
|
||||
return nil
|
||||
}
|
||||
req := callbackstruct.CallbackBeforePushReq{
|
||||
UserStatusBatchCallbackReq: callbackstruct.UserStatusBatchCallbackReq{
|
||||
UserStatusBaseCallback: callbackstruct.UserStatusBaseCallback{
|
||||
CallbackCommand: constant.CallbackOnlinePushCommand,
|
||||
OperationID: mcontext.GetOperationID(ctx),
|
||||
PlatformID: int(msg.SenderPlatformID),
|
||||
Platform: constant.PlatformIDToName(int(msg.SenderPlatformID)),
|
||||
},
|
||||
UserIDList: userIDs,
|
||||
},
|
||||
ClientMsgID: msg.ClientMsgID,
|
||||
SendID: msg.SendID,
|
||||
GroupID: msg.GroupID,
|
||||
ContentType: msg.ContentType,
|
||||
SessionType: msg.SessionType,
|
||||
AtUserIDs: msg.AtUserIDList,
|
||||
Content: utils.GetContent(msg),
|
||||
}
|
||||
resp := &callbackstruct.CallbackBeforePushResp{}
|
||||
return http.CallBackPostReturn(ctx, url(), req, resp, config.Config.Callback.CallbackOnlinePush)
|
||||
}
|
||||
|
||||
func callbackBeforeSuperGroupOnlinePush(ctx context.Context, groupID string, msg *sdkws.MsgData, pushToUserIDs *[]string) error {
|
||||
if !config.Config.Callback.CallbackBeforeSuperGroupOnlinePush.Enable {
|
||||
return nil
|
||||
}
|
||||
req := callbackstruct.CallbackBeforeSuperGroupOnlinePushReq{
|
||||
UserStatusBaseCallback: callbackstruct.UserStatusBaseCallback{
|
||||
CallbackCommand: constant.CallbackSuperGroupOnlinePushCommand,
|
||||
OperationID: mcontext.GetOperationID(ctx),
|
||||
PlatformID: int(msg.SenderPlatformID),
|
||||
Platform: constant.PlatformIDToName(int(msg.SenderPlatformID)),
|
||||
},
|
||||
ClientMsgID: msg.ClientMsgID,
|
||||
SendID: msg.SendID,
|
||||
GroupID: groupID,
|
||||
ContentType: msg.ContentType,
|
||||
SessionType: msg.SessionType,
|
||||
AtUserIDs: msg.AtUserIDList,
|
||||
Content: utils.GetContent(msg),
|
||||
Seq: msg.Seq,
|
||||
}
|
||||
resp := &callbackstruct.CallbackBeforeSuperGroupOnlinePushResp{}
|
||||
if err := http.CallBackPostReturn(ctx, config.Config.Callback.CallbackUrl, req, resp, config.Config.Callback.CallbackBeforeSuperGroupOnlinePush); err != nil {
|
||||
if err == errs.ErrCallbackContinue {
|
||||
return nil
|
||||
}
|
||||
return err
|
||||
}
|
||||
if len(resp.UserIDs) != 0 {
|
||||
*pushToUserIDs = resp.UserIDs
|
||||
}
|
||||
return nil
|
||||
}
|
||||
26
internal/push/consumer_init.go
Normal file
26
internal/push/consumer_init.go
Normal file
@@ -0,0 +1,26 @@
|
||||
package push
|
||||
|
||||
import (
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/prome"
|
||||
)
|
||||
|
||||
type Consumer struct {
|
||||
pushCh ConsumerHandler
|
||||
successCount uint64
|
||||
}
|
||||
|
||||
func NewConsumer(pusher *Pusher) *Consumer {
|
||||
return &Consumer{
|
||||
pushCh: *NewConsumerHandler(pusher),
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Consumer) initPrometheus() {
|
||||
prome.NewMsgOfflinePushSuccessCounter()
|
||||
prome.NewMsgOfflinePushFailedCounter()
|
||||
}
|
||||
|
||||
func (c *Consumer) Start() {
|
||||
//statistics.NewStatistics(&c.successCount, config.Config.ModuleName.PushName, fmt.Sprintf("%d second push to msg_gateway count", constant.StatisticsTimeInterval), constant.StatisticsTimeInterval)
|
||||
go c.pushCh.pushConsumerGroup.RegisterHandleAndConsumer(&c.pushCh)
|
||||
}
|
||||
122
internal/push/offlinepush/fcm/push.go
Normal file
122
internal/push/offlinepush/fcm/push.go
Normal file
@@ -0,0 +1,122 @@
|
||||
package fcm
|
||||
|
||||
import (
|
||||
"context"
|
||||
"path/filepath"
|
||||
|
||||
firebase "firebase.google.com/go"
|
||||
"firebase.google.com/go/messaging"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/internal/push/offlinepush"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache"
|
||||
"github.com/redis/go-redis/v9"
|
||||
"google.golang.org/api/option"
|
||||
)
|
||||
|
||||
const SinglePushCountLimit = 400
|
||||
|
||||
var Terminal = []int{constant.IOSPlatformID, constant.AndroidPlatformID, constant.WebPlatformID}
|
||||
|
||||
type Fcm struct {
|
||||
fcmMsgCli *messaging.Client
|
||||
cache cache.MsgModel
|
||||
}
|
||||
|
||||
func NewClient(cache cache.MsgModel) *Fcm {
|
||||
opt := option.WithCredentialsFile(filepath.Join(config.Root, "config", config.Config.Push.Fcm.ServiceAccount))
|
||||
fcmApp, err := firebase.NewApp(context.Background(), nil, opt)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
// auth
|
||||
// fcmClient, err := fcmApp.Auth(context.Background())
|
||||
// if err != nil {
|
||||
// return
|
||||
// }
|
||||
ctx := context.Background()
|
||||
fcmMsgClient, err := fcmApp.Messaging(ctx)
|
||||
if err != nil {
|
||||
panic(err.Error())
|
||||
return nil
|
||||
}
|
||||
return &Fcm{fcmMsgCli: fcmMsgClient, cache: cache}
|
||||
}
|
||||
|
||||
func (f *Fcm) Push(ctx context.Context, userIDs []string, title, content string, opts *offlinepush.Opts) error {
|
||||
// accounts->registrationToken
|
||||
allTokens := make(map[string][]string, 0)
|
||||
for _, account := range userIDs {
|
||||
var personTokens []string
|
||||
for _, v := range Terminal {
|
||||
Token, err := f.cache.GetFcmToken(ctx, account, v)
|
||||
if err == nil {
|
||||
personTokens = append(personTokens, Token)
|
||||
}
|
||||
}
|
||||
allTokens[account] = personTokens
|
||||
}
|
||||
Success := 0
|
||||
Fail := 0
|
||||
notification := &messaging.Notification{}
|
||||
notification.Body = content
|
||||
notification.Title = title
|
||||
var messages []*messaging.Message
|
||||
for userID, personTokens := range allTokens {
|
||||
apns := &messaging.APNSConfig{Payload: &messaging.APNSPayload{Aps: &messaging.Aps{Sound: opts.IOSPushSound}}}
|
||||
messageCount := len(messages)
|
||||
if messageCount >= SinglePushCountLimit {
|
||||
response, err := f.fcmMsgCli.SendAll(ctx, messages)
|
||||
if err != nil {
|
||||
Fail = Fail + messageCount
|
||||
} else {
|
||||
Success = Success + response.SuccessCount
|
||||
Fail = Fail + response.FailureCount
|
||||
}
|
||||
messages = messages[0:0]
|
||||
}
|
||||
if opts.IOSBadgeCount {
|
||||
unreadCountSum, err := f.cache.IncrUserBadgeUnreadCountSum(ctx, userID)
|
||||
if err == nil {
|
||||
apns.Payload.Aps.Badge = &unreadCountSum
|
||||
} else {
|
||||
//log.Error(operationID, "IncrUserBadgeUnreadCountSum redis err", err.Error(), uid)
|
||||
Fail++
|
||||
continue
|
||||
}
|
||||
} else {
|
||||
unreadCountSum, err := f.cache.GetUserBadgeUnreadCountSum(ctx, userID)
|
||||
if err == nil && unreadCountSum != 0 {
|
||||
apns.Payload.Aps.Badge = &unreadCountSum
|
||||
} else if err == redis.Nil || unreadCountSum == 0 {
|
||||
zero := 1
|
||||
apns.Payload.Aps.Badge = &zero
|
||||
} else {
|
||||
//log.Error(operationID, "GetUserBadgeUnreadCountSum redis err", err.Error(), uid)
|
||||
Fail++
|
||||
continue
|
||||
}
|
||||
}
|
||||
for _, token := range personTokens {
|
||||
temp := &messaging.Message{
|
||||
Data: map[string]string{"ex": opts.Ex},
|
||||
Token: token,
|
||||
Notification: notification,
|
||||
APNS: apns,
|
||||
}
|
||||
messages = append(messages, temp)
|
||||
}
|
||||
}
|
||||
messageCount := len(messages)
|
||||
if messageCount > 0 {
|
||||
response, err := f.fcmMsgCli.SendAll(ctx, messages)
|
||||
if err != nil {
|
||||
Fail = Fail + messageCount
|
||||
//log.Info(operationID, "some token push err", err.Error(), messageCount)
|
||||
} else {
|
||||
Success = Success + response.SuccessCount
|
||||
Fail = Fail + response.FailureCount
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
16
internal/push/offlinepush/fcm/push_test.go
Normal file
16
internal/push/offlinepush/fcm/push_test.go
Normal file
@@ -0,0 +1,16 @@
|
||||
package fcm
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/internal/push/offlinepush"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func Test_Push(t *testing.T) {
|
||||
var redis cache.MsgModel
|
||||
offlinePusher := NewClient(redis)
|
||||
err := offlinePusher.Push(context.Background(), []string{"userID1"}, "test", "test", &offlinepush.Opts{})
|
||||
assert.Nil(t, err)
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user