Compare commits

...

275 Commits

Author SHA1 Message Date
e40caa55e8 Tower: upload cetmix_tower_aws 18.0.1.0.1 (was 18.0.1.0.1, via marketplace) 2026-05-03 18:54:19 +00:00
d4789aaed6 Tower: upload cetmix_tower 18.0.1.0.0 (was 18.0.1.0.0, via marketplace) 2026-05-03 18:54:12 +00:00
OdooSky Tower
7048450ad5 Cleanup: remove orphan addon source at_master_order (no tags reference it) 2026-05-02 13:20:08 +02:00
OdooSky Tower
a3b7a9a521 Cleanup: remove orphan addon source at_accounting (no tags reference it) 2026-05-02 13:20:06 +02:00
686c06f52c Tower: unpublish om_data_remove — remove source from 18.0 branch 2026-05-02 11:15:12 +00:00
99dd5ad688 Tower: upload om_data_remove 1.4 (via marketplace) 2026-05-02 06:09:09 +00:00
2d88df12c0 Tower: upload om_data_remove 1.4 (via marketplace) 2026-05-02 06:09:07 +00:00
bb3dd53fbd Tower: upload om_data_remove 1.4 (via marketplace) 2026-05-02 06:09:05 +00:00
d2c8473122 Tower: upload om_data_remove 1.4 (via marketplace) 2026-05-02 06:09:03 +00:00
f726994409 Tower: upload om_data_remove 1.4 (via marketplace) 2026-05-02 06:09:02 +00:00
5915c32ba7 Tower: upload om_data_remove 1.4 (via marketplace) 2026-05-02 06:08:59 +00:00
2d76c220f0 Tower: upload om_data_remove 1.4 (via marketplace) 2026-05-02 06:08:58 +00:00
005da073e8 Tower: upload om_data_remove 1.4 (via marketplace) 2026-05-02 06:08:57 +00:00
7a4a89cef9 Tower: upload om_data_remove 1.4 (via marketplace) 2026-05-02 06:08:55 +00:00
9295668143 Tower: upload om_data_remove 1.4 (via marketplace) 2026-05-02 06:08:54 +00:00
c53a0b6b30 Tower: upload om_data_remove 1.4 (via marketplace) 2026-05-02 06:08:52 +00:00
a498653c26 Tower: upload at_master_order 18.0.10.0 (via marketplace) 2026-04-30 19:03:57 +00:00
730cb8ddde Tower: upload at_master_order 18.0.10.0 (via marketplace) 2026-04-30 19:03:57 +00:00
33b1eeedf8 Tower: upload at_master_order 18.0.10.0 (via marketplace) 2026-04-30 19:03:56 +00:00
4915aaa882 Tower: upload at_master_order 18.0.10.0 (via marketplace) 2026-04-30 19:03:55 +00:00
ffd1dd0b18 Tower: upload at_master_order 18.0.10.0 (via marketplace) 2026-04-30 19:03:55 +00:00
c670be57f6 Tower: upload at_master_order 18.0.10.0 (via marketplace) 2026-04-30 19:03:54 +00:00
4ac0b04bca Tower: upload at_master_order 18.0.10.0 (via marketplace) 2026-04-30 19:03:53 +00:00
c5a4899c9f Tower: upload at_master_order 18.0.10.0 (via marketplace) 2026-04-30 19:03:53 +00:00
bbb6d4c35c Tower: upload at_master_order 18.0.10.0 (via marketplace) 2026-04-30 19:03:52 +00:00
0a9a96ae77 Tower: upload at_master_order 18.0.10.0 (via marketplace) 2026-04-30 19:03:51 +00:00
7a4b7d8e8f Tower: upload at_master_order 18.0.10.0 (via marketplace) 2026-04-30 19:03:50 +00:00
285e2e807a Tower: upload at_master_order 18.0.10.0 (via marketplace) 2026-04-30 19:03:50 +00:00
b3c96f6416 Tower: upload at_master_order 18.0.10.0 (via marketplace) 2026-04-30 19:03:49 +00:00
30f5ab37d2 Tower: upload at_master_order 18.0.10.0 (via marketplace) 2026-04-30 19:03:48 +00:00
de21d5cb55 Tower: upload at_master_order 18.0.10.0 (via marketplace) 2026-04-30 19:03:48 +00:00
d4dd28c402 Tower: upload at_master_order 18.0.10.0 (via marketplace) 2026-04-30 19:03:47 +00:00
45eaa252bd Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:38:50 +00:00
45222f6bb7 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:38:49 +00:00
d9715fff07 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:38:48 +00:00
5227767283 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:38:46 +00:00
f76d79a606 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:38:45 +00:00
14fd3e2f1e Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:38:43 +00:00
e3ce2be1f4 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:38:40 +00:00
0329122548 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:38:39 +00:00
f31284a113 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:38:38 +00:00
dcccf8b034 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:38:37 +00:00
9751faf173 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:38:36 +00:00
0d94303107 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:38:35 +00:00
fcd0cfb26f Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:38:34 +00:00
48863fc6d5 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:38:33 +00:00
8ba35217bf Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:38:32 +00:00
afe168723d Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:38:30 +00:00
72273b580f Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:38:28 +00:00
095ed48ded Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:38:27 +00:00
3a18336cc4 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:38:26 +00:00
33c3ae3585 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:38:24 +00:00
aa7c94b0dc Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:38:22 +00:00
e30a37898b Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:38:19 +00:00
88e1fa7965 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:38:19 +00:00
9f19b53414 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:38:18 +00:00
26fa9e2871 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:38:16 +00:00
825423b3af Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:38:14 +00:00
06a1e15a4f Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:38:12 +00:00
23c6cf64cf Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:38:11 +00:00
ae9617dedd Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:38:10 +00:00
2884546072 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:38:09 +00:00
d5ae939266 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:38:08 +00:00
89047fe79c Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:38:06 +00:00
d323267a28 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:38:05 +00:00
edf915943b Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:38:04 +00:00
d7c9aee436 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:38:03 +00:00
e497c2b5d0 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:38:00 +00:00
582b9e1b9b Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:37:59 +00:00
2b1c7afdf1 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:37:57 +00:00
882ba9247a Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:37:55 +00:00
0671d0b2e9 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:37:55 +00:00
509006cce4 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:37:53 +00:00
44c55e900a Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:37:51 +00:00
db83188b88 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:37:50 +00:00
aa4d44164c Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:37:49 +00:00
ea9d3ff61f Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:37:48 +00:00
f63dd818aa Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:37:47 +00:00
27f8b2541e Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:37:46 +00:00
558a815535 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:37:44 +00:00
6d6add697b Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:37:42 +00:00
bb235faf39 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:37:40 +00:00
3951faca64 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:37:39 +00:00
3db314cedb Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:37:36 +00:00
3e4faf0dc7 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:37:34 +00:00
a70964ad21 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:37:31 +00:00
d0a79ac5a6 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:37:28 +00:00
04c6e4d523 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:37:27 +00:00
3d2cbfcb74 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:37:26 +00:00
320f8e5bbf Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:37:24 +00:00
4d495e5cc5 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:37:21 +00:00
dbb7322fce Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:37:19 +00:00
ad78baae06 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:37:17 +00:00
b3f9c9f989 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:37:16 +00:00
773476029f Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:37:14 +00:00
bdf313b39e Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:37:13 +00:00
0b3fafc478 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:37:11 +00:00
ebe63f69ab Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:37:08 +00:00
a59bf97a36 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:37:05 +00:00
a64c72a5d4 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:37:04 +00:00
8b0f9d6361 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:37:02 +00:00
aa5439325d Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:37:00 +00:00
b1dbab9942 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:59 +00:00
43ae1490f5 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:57 +00:00
2a07cab00b Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:56 +00:00
08fe99a3dd Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:55 +00:00
1dae9452af Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:54 +00:00
0c15c42d4f Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:54 +00:00
7a0ffe51cd Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:53 +00:00
effc02f01b Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:51 +00:00
e585583bf5 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:49 +00:00
eab73a9964 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:47 +00:00
fe62898189 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:47 +00:00
dd454b6269 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:46 +00:00
3a469c333d Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:44 +00:00
3fe3d5944a Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:43 +00:00
42ecceac62 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:42 +00:00
f5a379f683 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:40 +00:00
834b292f73 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:39 +00:00
d29c58ac6c Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:39 +00:00
1095317b23 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:38 +00:00
80ff9d095b Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:36 +00:00
e110187874 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:35 +00:00
0786f81d63 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:34 +00:00
dcb6ca59fc Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:32 +00:00
3eb6ee6758 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:30 +00:00
97753affb8 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:29 +00:00
e19d374f2b Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:28 +00:00
30a33e939f Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:26 +00:00
d2e38977c2 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:25 +00:00
fa3cb047c8 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:24 +00:00
8441d1956d Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:23 +00:00
633253de00 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:21 +00:00
9dfa1d4d03 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:20 +00:00
4350577ab7 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:20 +00:00
63becde73e Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:19 +00:00
65dc01b15e Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:17 +00:00
d0e0bb7b0c Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:16 +00:00
26ce32efb8 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:14 +00:00
aa9004b2ef Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:12 +00:00
cd8b9c7975 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:11 +00:00
500026c640 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:10 +00:00
bd2ee6d072 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:09 +00:00
da58849aae Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:07 +00:00
570140673c Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:05 +00:00
0e56aa652c Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:04 +00:00
f3b0ba4632 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:36:02 +00:00
2462220921 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:35:59 +00:00
17efcd0fbc Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:35:57 +00:00
5d3db75b14 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:35:55 +00:00
ea03f85024 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:35:53 +00:00
be600989ba Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:35:51 +00:00
362fe7126a Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:35:49 +00:00
439ebf4356 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:35:47 +00:00
9b50ec37a6 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:35:45 +00:00
829a0fe36f Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:35:44 +00:00
6fc36fd5c5 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:35:44 +00:00
cbc31eaf55 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:35:43 +00:00
d63a402aaf Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:35:42 +00:00
31047a2670 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:35:41 +00:00
24adc03ab3 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:35:39 +00:00
4e051d6c52 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:35:38 +00:00
2ebb0a73c2 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:35:36 +00:00
906671a8b5 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:35:35 +00:00
a401dc3abd Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:35:33 +00:00
124377f7c5 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:35:31 +00:00
90836e2f2a Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:35:31 +00:00
90d9a2b202 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:35:30 +00:00
c62d637f56 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:35:28 +00:00
ce90945990 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:35:25 +00:00
bb42154f35 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:35:24 +00:00
3fd4eb215e Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:35:23 +00:00
543f423825 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:35:22 +00:00
3d2ad55cfa Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:35:20 +00:00
50cf4b4107 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:35:17 +00:00
8b6528cb8b Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:35:14 +00:00
a55dafa6e0 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:35:12 +00:00
24c89d97e5 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:35:11 +00:00
a7c36be076 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:35:10 +00:00
2ef98a3897 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:35:09 +00:00
e21d4e66a9 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:35:07 +00:00
38c91ef94c Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:35:05 +00:00
454e6936fb Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:35:03 +00:00
6d49162c09 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:35:00 +00:00
5bd5c7b906 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:34:59 +00:00
a4de8697da Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:34:58 +00:00
ce8f7f8711 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:34:55 +00:00
ca0ca65f14 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:34:54 +00:00
30f2cf9b0e Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:34:54 +00:00
f68e2d23e7 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:34:53 +00:00
05c33d06c3 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:34:52 +00:00
46fca55d81 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:34:50 +00:00
4db469f273 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:34:49 +00:00
72a652a5c6 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:34:48 +00:00
5523995594 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:34:46 +00:00
7b7bcf73e6 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:34:45 +00:00
acb3564750 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:34:43 +00:00
bb3359a309 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:34:40 +00:00
8b1544647a Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:34:38 +00:00
f727f3ab67 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:34:38 +00:00
a371ac9bdc Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:34:36 +00:00
f84c891e96 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:34:35 +00:00
c31947bfab Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:34:33 +00:00
d783d0d08d Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:34:31 +00:00
7a9e3c56fe Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:34:30 +00:00
11770d4950 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:34:29 +00:00
0d150fa92e Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:34:28 +00:00
2933122464 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:34:26 +00:00
5ab0886edf Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:34:25 +00:00
e2045b21e2 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:34:24 +00:00
596bd0a761 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:34:22 +00:00
2a19267d2f Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:34:19 +00:00
50105c5ba6 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:34:16 +00:00
434b1d46ab Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:34:15 +00:00
d4945d20ee Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:34:13 +00:00
6e05ee4c57 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:34:12 +00:00
33ba2de5dd Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:34:11 +00:00
bb075fe036 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:34:09 +00:00
60687c611a Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:34:08 +00:00
776bcc1f7f Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:34:07 +00:00
61061bdee9 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:34:06 +00:00
77d467de70 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:34:04 +00:00
e4a63ec0e4 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:34:04 +00:00
77dc1762c0 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:34:03 +00:00
e2bf6c22f9 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:34:01 +00:00
f9b4e1582a Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:33:59 +00:00
53a05d2240 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:33:58 +00:00
8512a1d196 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:33:57 +00:00
41a130c1d6 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:33:55 +00:00
13b8322e3c Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:33:54 +00:00
d18265433c Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:33:53 +00:00
16e661f8e8 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:33:51 +00:00
8a40edf6c6 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:33:49 +00:00
831cbe1449 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:33:48 +00:00
aea1722933 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:33:48 +00:00
51a39b2e6e Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:33:46 +00:00
21e6a6f3f6 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:33:43 +00:00
dbca7e34e1 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:33:42 +00:00
ac8400512b Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:33:41 +00:00
817b05fe06 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:33:40 +00:00
cb1c9a1ffa Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:33:39 +00:00
bc7dbb494a Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:33:38 +00:00
7827e2f224 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:33:36 +00:00
c4edb6b3af Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:33:35 +00:00
bdc66120f3 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:33:34 +00:00
636938581d Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:33:33 +00:00
2c3cfc3978 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:33:32 +00:00
0236ef0809 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:33:31 +00:00
de9fd7b71d Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:33:29 +00:00
eaeb978c19 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:33:27 +00:00
2e55efb312 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:33:26 +00:00
b786492d5e Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:33:25 +00:00
6086717e66 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:33:24 +00:00
375466beea Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:33:23 +00:00
8dfe9e9874 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:33:21 +00:00
385ef060ed Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:33:20 +00:00
6c8b3cbd74 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:33:18 +00:00
90d1e47e03 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:33:17 +00:00
9700c192d0 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:33:16 +00:00
25596b4149 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:33:14 +00:00
0885b59bb3 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:33:14 +00:00
fcbe9a17db Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:33:12 +00:00
860fedb7e0 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:33:10 +00:00
85ada8e9b7 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:33:08 +00:00
6b98bf8be1 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:33:07 +00:00
55fb716490 Tower: upload at_accounting 18.0.1.7 (via marketplace) 2026-04-28 07:33:06 +00:00
Tower Deploy
ab214ac9dd Wipe addons/: full reset for clean re-upload 2026-04-27 11:20:55 +03:00
Tower Deploy
304da43eb8 Wipe test artifacts from 18.0 branch (test_correct_encode + web_responsive*); keep odoosky_demo 2026-04-27 10:59:55 +03:00
48b0b7a283 Tower: upload test_correct_encode 18.0.1.0.0 (via marketplace) 2026-04-27 07:38:22 +00:00
40c3e1d471 Tower: upload test_correct_encode 18.0.1.0.0 (via marketplace) 2026-04-27 07:38:22 +00:00
c1ecf1289d Tower: upload web_responsive 18.0.1.0.0 (via marketplace) 2026-04-27 06:42:13 +00:00
0741834b31 Tower: upload web_responsive 18.0.1.0.0 (via marketplace) 2026-04-27 06:42:13 +00:00
7a2debb3d7 Tower: upload web_responsive_test 18.0.0.1.0 (via marketplace) 2026-04-27 06:03:21 +00:00
6ef9d029eb Tower: upload web_responsive_test 18.0.0.1.0 (via marketplace) 2026-04-27 06:03:21 +00:00
Tower Deploy
96edc0c694 Seed addons/odoosky_demo (18.0.1.0.0) — platform smoke-test addon 2026-04-27 00:44:36 +03:00
63 changed files with 15486 additions and 0 deletions

View File

@@ -0,0 +1,60 @@
============
Cetmix Tower
============
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:e6c57b8f0bfeb65328c359735e0e2b0fcdb4852bc9bff24afaa5ae2cbab95658
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-cetmix%2Fcetmix--tower-lightgray.png?logo=github
:target: https://github.com/cetmix/cetmix-tower/tree/18.0/cetmix_tower
:alt: cetmix/cetmix-tower
|badge1| |badge2| |badge3|
This is a technical module that allows to get `Cetmix
Tower <https://cetmix.com/tower>`__ modules from the `Odoo App
Store <https://apps.odoo.com>`__.
It's designed to install all the `Cetmix
Tower <https://cetmix.com/tower>`__ modules at once.
**Table of contents**
.. contents::
:local:
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/cetmix/cetmix-tower/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/cetmix/cetmix-tower/issues/new?body=module:%20cetmix_tower%0Aversion:%2018.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
-------
* Cetmix
Maintainers
-----------
This module is part of the `cetmix/cetmix-tower <https://github.com/cetmix/cetmix-tower/tree/18.0/cetmix_tower>`_ project on GitHub.
You are welcome to contribute.

View File

View File

@@ -0,0 +1,22 @@
# Copyright Cetmix OU
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
{
"name": "Cetmix Tower",
"summary": "Odoo SAAS Server Application Management",
"version": "18.0.1.0.0",
"development_status": "Beta",
"category": "Productivity",
"website": "https://tower.cetmix.com",
"live_test_url": "https://tower.cetmix.com/download",
"images": ["static/description/banner.png"],
"author": "Cetmix",
"license": "AGPL-3",
"application": True,
"installable": True,
"depends": [
"cetmix_tower_server",
"cetmix_tower_server_queue",
"cetmix_tower_git",
"cetmix_tower_webhook",
],
}

View File

@@ -0,0 +1,13 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 18.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"

View File

@@ -0,0 +1,3 @@
[build-system]
requires = ["whool"]
build-backend = "whool.buildapi"

View File

@@ -0,0 +1,3 @@
This is a technical module that allows to get [Cetmix Tower](https://cetmix.com/tower) modules from the [Odoo App Store](https://apps.odoo.com).
It's designed to install all the [Cetmix Tower](https://cetmix.com/tower) modules at once.

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

View File

@@ -0,0 +1,435 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.1.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Слой_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 756 322.5" style="enable-background:new 0 0 756 322.5;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;}
.st1{fill:#FFFFFF;stroke:#FFFFFF;stroke-width:0.75;stroke-miterlimit:10;}
</style>
<g>
<g>
<g>
<path class="st0" d="M447.2,121.7c-2,1.6-4.7,2.9-8.3,3.9c-3.6,1-6.8,1.6-9.6,1.6c-10.9,0-19.5-2.8-25.8-8.3s-9.4-13.3-9.4-23.5
V53.7h-11.8V35.6H394V14.7l23.5-4.2v25.1h16l0.2,18l-16.2,0.1v37.4c0,4.6,1.1,8.4,3.3,11.3c2.2,3,5.4,4.5,9.7,4.5
c1.6,0,3.2-0.2,4.8-0.5c1.6-0.4,3.2-1,4.9-1.8L447.2,121.7z"/>
</g>
<g>
<path class="st0" d="M536.3,49.4c3.8-4.3,8.8-7.6,15-10.1c6.3-2.5,11.8-3.7,16.8-3.7c12,0,20.6,3.5,25.6,10.5
c5.1,7.1,7.6,15.6,7.6,25.8v55.2h-23.9v-54c0-5.6-1.3-9.9-4-12.8s-6.6-4.5-11.6-4.5c-3.4,0-7,0.9-10.7,2.7s-7.2,3.9-10.3,6.2
c0.1,1.2,0.2,2.4,0.4,3.7c0.1,1.2,0.2,2.4,0.2,3.7v55.2h-23.9V73.1c0-5.6-1.3-9.9-4-12.8s-6.5-4.5-11.4-4.5
c-3.1,0-6.1,0.6-9.2,1.9c-3.1,1.3-6.1,2.9-8.9,4.8v64.7h-23.7V39l23.3-3v7c3-2,5-3,9.4-4.5c5.7-1.9,10.7-3,15.2-3
c7,0,12.7,1.2,17.3,3.7C530.1,41.8,533.7,45.2,536.3,49.4z"/>
</g>
<g>
<path class="st0" d="M634.8,0c3.8,0,7,1.3,9.6,3.8c2.6,2.6,3.9,5.7,3.9,9.5s-1.3,6.9-3.9,9.5c-2.6,2.6-5.8,3.8-9.6,3.8
c-3.7,0-6.8-1.3-9.3-3.8c-2.6-2.6-3.8-5.7-3.8-9.5s1.3-6.9,3.8-9.5C628.1,1.3,631.2,0,634.8,0z M646.9,36l-0.2,91.1H623L622.9,36
H646.9z"/>
</g>
<g>
<path class="st0" d="M659.4,127.2l34.1-45.3l-32.8-45.8h25.8l21,29.9l21.9-29.9H756l-34.5,45.8l31.6,45.3H727l-20.5-28.4
l-20.9,28.4H659.4z"/>
</g>
<g>
<path class="st0" d="M198.4,81.5c0-26.6,19.5-45.5,46.7-45.5c18,0,29,7.8,34.8,15.6l-15.1,14c-4.2-6.1-10.5-9.4-18.6-9.4
c-14,0-23.9,10.1-23.9,25.2s9.9,25.4,23.9,25.4c8.1,0,14.4-3.6,18.6-9.4l15.1,13.8c-5.9,8.1-16.7,15.8-34.8,15.8
C217.9,127.2,198.4,108.3,198.4,81.5z"/>
</g>
<g>
<path class="st0" d="M289.4,81.5c0-25.2,18.8-45.5,45.6-45.5c26.3,0,44.1,19.4,44.1,47.8v5.1h-65.5c1.5,10.9,10.4,20.1,25.3,20.1
c7.5,0,17.8-3.2,23.5-8.7l10.3,14.7c-8.8,7.9-22.6,12-36.2,12C309.6,127.2,289.4,109.4,289.4,81.5z M334.8,54.2
c-14.4,0-20.6,10.6-21.7,19.2h43.4C356,65.2,350.2,54.2,334.8,54.2z"/>
</g>
</g>
<g>
<g>
<path class="st0" d="M92.3,91.5c0.6,0.3,0.7,1,0.2,1.5c-3.1,2.8-6.6,5.2-10.3,7.1c-6.6,3.2-13.7,4.8-20.9,4.7
c-7.2-0.3-14.2-2.2-20.3-5.7s-11.2-8.5-14.9-14.3s-5.8-12.5-6.4-19.3c-0.4-6.8,0.8-13.6,3.5-19.7c1.4-3,3.1-5.9,5.2-8.5
s4.5-4.9,7.1-7c5.2-4,11.3-6.7,17.7-7.8C46.9,24,41,27.1,36.4,31.4c-2.4,2.1-4.5,4.5-6.2,7.1c-1.8,2.6-3.1,5.5-4.3,8.4
c-2.1,5.8-2.7,12-1.9,18.1c0.9,6.1,3.3,11.7,6.8,16.6c3.6,4.8,8.3,8.7,13.6,11.2s11.1,3.6,16.9,3.4c5.8-0.3,11.3-2,16.2-4.9
c1.9-1.2,3.7-2.5,5.4-4c0.3-0.2,0.7-0.3,1-0.1L92.3,91.5z"/>
</g>
<g>
<path class="st0" d="M110.3,107.7c0.4,0.4,0.3,1.1-0.1,1.5c-0.2,0.2-0.4,0.4-0.6,0.6c-2.6,2.3-5.4,4.5-8.3,6.4s-6,3.6-9.2,5
s-6.5,2.6-9.8,3.5c-13.3,3.7-27.7,2.9-40.4-1.9s-23.8-13.5-31.3-24.7C3.2,86.8-0.4,73.5,0,60.3c0.5-13.1,5.2-26,13.1-36.1
C21.2,14,32.3,6.5,44.5,3C56.8-0.6,70-0.2,81.8,4c5.9,2.1,11.4,5.1,16.3,8.9c5,3.7,9.3,8.3,12.7,13.2c-3.8-4.8-8.3-9.1-13.3-12.4
S87,7.7,81.1,6c-11.5-3.4-24-2.9-35.3,1S24.9,18.4,18.3,28c-6.7,9.6-10.2,21.1-9.9,32.4c0.2,11.3,4.1,22.5,10.8,31.5
c6.7,8.9,16.2,15.5,26.7,18.8s21.9,3.1,32-0.3c8.2-2.7,15.4-7.5,21.2-13.5c0.4-0.4,1.1-0.5,1.5-0.1c0.6,0.6,1.3,1.3,1.8,2
C102.6,98.6,108.3,105.4,110.3,107.7z"/>
</g>
<g>
<path class="st0" d="M149.8,41l-35.6,43.5l2,4.1l4.1,8.6c0.7,1.5,0.4,3.3-0.8,4.5l-2.9,2.7c-0.2,0.2-0.4,0.2-0.7,0.2
c-0.1,0-0.2-0.1-0.3-0.2c0,0-0.1,0-0.1-0.1l-7.9-9.4c-0.8-0.9-1.6-1.8-2.5-2.6c-0.7-0.6-1.3-1.2-2.1-1.8c-1.4-1.1-3-2.2-4.6-3
c-0.2-0.2-0.5-0.3-0.8-0.4l-9.1-4.8l-1.7-0.9c-0.4-0.2-0.5-0.6-0.3-1l2-3.4c0.9-1.5,2.6-2.2,4.2-1.8l13.7,3.1l13.9-18L91.8,47.8
c-0.4-0.2-0.5-0.7-0.3-1l4.5-5.6c1.8-2.3,4.8-3.4,7.7-3l30.2,5.1l7.5-9.6c1.7-2.2,3.9-3.9,6.4-5l3.5-1.5c0.5-0.2,1-0.2,1.4-0.1
c0.3,0.1,0.5,0.2,0.7,0.3l0,0c0.5,0.4,0.9,1.2,0.7,2l-0.6,3.7C152.9,36,151.7,38.7,149.8,41z"/>
</g>
<g>
<g>
<path class="st0" d="M155.2,85.4l-4.5,5.6c-0.2,0.2-0.5,0.3-0.7,0.2c-0.1,0-0.3-0.1-0.4-0.2l-17.2-23.3l13.3-16.1l10.5,25.7
C157.5,79.9,157,83,155.2,85.4z"/>
</g>
</g>
</g>
</g>
<g>
<path class="st0" d="M397.4,241.7c-15.1,0-27.3-12.3-27.3-27.3s12.3-27.3,27.3-27.3c15.1,0,27.3,12.3,27.3,27.3l0,0
C424.7,229.5,412.4,241.7,397.4,241.7z M397.4,230.4c8.9,0,16-7.2,16-16c0-8.8-7.2-16-16-16c-8.9,0-16,7.2-16,16
C381.4,223.2,388.5,230.4,397.4,230.4z M340.2,241.7c-15.1,0-27.3-12.3-27.3-27.3s12.3-27.3,27.3-27.3c15.1,0,27.3,12.3,27.3,27.3
l0,0C367.5,229.5,355.3,241.7,340.2,241.7z M340.2,230.4c8.9,0,16-7.2,16-16c0-8.8-7.2-16-16-16c-8.9,0-16,7.2-16,16
C324.2,223.2,331.3,230.4,340.2,230.4z M310.3,214.1c0,15.3-12.3,27.7-27.3,27.7s-27.3-12.4-27.3-27.7s11.1-27,27.3-27
c6,0,11.5,1.2,16,4.6v-15.8c0-3,2.7-5.5,5.7-5.5s5.7,2.5,5.7,5.5V214.1z M282.9,230.4c8.9,0,16-7.2,16-16c0-8.8-7.2-16-16-16
c-8.9,0-16,7.2-16,16C266.9,223.2,274.1,230.4,282.9,230.4z"/>
</g>
<g>
<path class="st0" d="M225.7,241.7c-15.1,0-27.3-12.3-27.3-27.3s12.3-27.3,27.3-27.3s27.3,12.3,27.3,27.3l0,0
C253.1,229.5,240.9,241.7,225.7,241.7z M225.7,230.4c8.9,0,16-7.2,16-16c0-8.8-7.2-16-16-16c-8.9,0-16,7.2-16,16
C209.7,223.2,216.9,230.4,225.7,230.4z"/>
</g>
<g>
<g>
<path class="st0" d="M547.4,229.9c0.1,0,0.2,0,0.4,0c0.1,0,0.2,0.1,0.1,0.1v0.1c0,3.8,0,7.6,0,11.4c0,0.1,0,0.1,0,0.1
c-0.9,0-1.8,0-2.7,0c0-0.1,0-0.2,0-0.2c0-3.7,0-7.4,0-11.1c0-0.3-0.1-0.2,0.2-0.2c0.1,0,0.2,0,0.4,0
C546.4,229.9,546.9,229.9,547.4,229.9z"/>
</g>
<g>
<path class="st0" d="M520.6,200.7c-0.1,0.2-0.1,0.5-0.1,0.8c0,0.1-0.1,0.2-0.2,0.2c-0.4-0.1-0.9-0.1-1.3-0.2
c-1.5-0.2-3.2-0.4-4.7-0.6c-1.4-0.2-2.7-0.4-4.1-0.5c-0.4-0.1-0.8-0.1-1.2-0.2c-0.1-0.1-0.1-0.1-0.1-0.2c0.2-1.2,0.3-2.4,0.4-3.6
c0-0.1,0.1-0.2,0.2-0.2c1.1,0.1,2.1,0.2,3.2,0.4c1.2,0.2,2.6,0.4,3.7,0.5c1.4,0.2,2.7,0.4,4.1,0.5c0.4,0.1,0.4,0.1,0.3,0.4
c-0.1,0.3-0.1,0.6-0.1,1c-0.1,0-0.1,0.1-0.1,0.1c-0.1,0.4-0.1,0.9-0.2,1.4C520.6,200.7,520.6,200.7,520.6,200.7z"/>
</g>
<g>
<path class="st0" d="M572.9,206.4c0.1-0.2,0.1-0.6,0.1-0.8c0-0.1,0.1-0.1,0.2-0.1c1,0.1,2,0.2,3,0.4c1.1,0.1,2.1,0.2,3.2,0.4
c1.2,0.1,2.3,0.3,3.5,0.5c0.5,0.1,1.1,0.1,1.5,0.2c0.1,0,0.2,0.1,0.2,0.2c0.1,0.6-0.1,1.2-0.2,1.8c-0.1,0.6-0.2,1.2-0.2,1.7
c0,0.1-0.1,0.2-0.2,0.1c-1.4-0.2-2.8-0.4-4.2-0.6c-1.4-0.2-2.7-0.4-4-0.5c-1.1-0.1-2.1-0.2-3.1-0.4c-0.1,0-0.1-0.1-0.1-0.2
c0.1-0.4,0.1-0.7,0.1-1.1c0.1,0,0.1-0.1,0.1-0.1c0.1-0.4,0.1-0.9,0.2-1.3C573,206.6,573,206.5,572.9,206.4z"/>
</g>
<g>
<path class="st0" d="M571.1,213.7c0.1-0.2,0.2-0.4,0.3-0.7c0.1-0.1,0.1-0.1,0.2-0.1c2.2,1,4.4,2,6.6,3c1.2,0.6,2.4,1.1,3.7,1.7
c0.2,0.1,0.2,0.1,0.1,0.3c-0.5,1-0.9,2-1.4,3c-0.1,0.1-0.1,0.1-0.2,0.1c-2.3-1.1-4.6-2.1-7-3.2c-1.1-0.5-2.2-1-3.3-1.5
c-0.2-0.1-0.2-0.1-0.1-0.3c0.2-0.3,0.2-0.6,0.4-0.9c0.2-0.3,0.3-0.6,0.4-0.9C571,214.1,571.1,213.9,571.1,213.7z"/>
</g>
<g>
<path class="st0" d="M522.6,193.4c-0.1,0.2-0.2,0.5-0.4,0.7c-0.1,0.1-0.1,0.1-0.2,0.1c-1.2-0.6-2.6-1.1-3.8-1.7
c-1.5-0.7-3.2-1.4-4.8-2.2c-0.6-0.2-1.1-0.5-1.7-0.8c-0.1-0.1-0.1-0.1-0.1-0.2c0.5-1,1-2.1,1.4-3c0.1-0.1,0.1-0.1,0.2-0.1
c1,0.5,2.1,0.9,3,1.4c2.4,1.1,4.8,2.2,7.2,3.3c0.1,0.1,0.2,0.1,0.1,0.3c-0.1,0.2-0.2,0.5-0.4,0.8c-0.1,0.2-0.2,0.4-0.2,0.6
C522.8,192.7,522.6,193,522.6,193.4z"/>
</g>
<g>
<path class="st0" d="M567.2,220.1c0.1-0.2,0.2-0.3,0.4-0.5c0.1-0.1,0.1-0.1,0.2,0c2.1,1.9,4.3,3.7,6.5,5.6
c0.7,0.6,1.4,1.2,2.1,1.8c0.1,0.1,0.1,0.2,0.1,0.3c-0.7,0.8-1.4,1.5-2,2.4c-0.1,0.1-0.1,0.1-0.2,0c-1.9-1.7-3.9-3.3-5.8-5
c-0.9-0.8-1.8-1.6-2.8-2.4c-0.1-0.1-0.1-0.1,0-0.2c0.2-0.2,0.4-0.4,0.6-0.7"/>
</g>
<g>
<path class="st0" d="M526.4,186.9c-0.2,0.2-0.4,0.4-0.5,0.6c-0.1,0.1-0.1,0.1-0.2,0c-1.2-1-2.4-2-3.5-3c-1.4-1.2-2.7-2.4-4.1-3.6
c-0.3-0.2-0.6-0.5-1-0.8c-0.1-0.1-0.1-0.1-0.1-0.2c0.7-0.8,1.4-1.5,2-2.3c0.1-0.1,0.2-0.1,0.2-0.1c1.4,1.2,2.7,2.4,4.1,3.6
c1.5,1.2,3,2.6,4.5,3.9c0.1,0.1,0.1,0.1,0.1,0.2c-0.2,0.2-0.3,0.4-0.4,0.5c-0.1,0-0.1,0-0.1,0.1
C527.1,186.1,526.8,186.5,526.4,186.9C526.4,186.8,526.4,186.9,526.4,186.9z"/>
</g>
<g>
<path class="st0" d="M531.8,181.9c-0.1,0.1-0.2,0.2-0.4,0.2c-0.1,0.1-0.2,0.1-0.3-0.1c-0.7-1.1-1.4-2.1-2-3.2
c-1.4-2.1-2.7-4.2-4-6.3c-0.1-0.1-0.1-0.2,0.1-0.2c0.8-0.5,1.6-1,2.4-1.5c0.1-0.1,0.2-0.1,0.2,0.1c1,1.5,2,3.1,3,4.7
c1,1.6,2.1,3.2,3,4.8c0.2,0.2,0.2,0.2-0.1,0.4c-0.1,0.1-0.2,0.1-0.3,0.2c-0.1,0-0.1,0.1-0.2,0.1c-0.4,0.2-0.8,0.5-1.1,0.7
C532,181.8,531.9,181.8,531.8,181.9z"/>
</g>
<g>
<path class="st0" d="M561.7,225.3c0.2-0.1,0.4-0.2,0.5-0.4c0.1-0.1,0.2-0.1,0.2,0.1c0.8,1.2,1.5,2.4,2.3,3.6
c1.1,1.7,2.2,3.4,3.3,5.1c0.2,0.2,0.4,0.5,0.5,0.8c0.1,0.1,0.1,0.2-0.1,0.2c-0.8,0.5-1.6,1.1-2.4,1.5c-0.1,0.1-0.2,0.1-0.2-0.1
c-1.7-2.7-3.4-5.3-5.1-8c-0.4-0.5-0.7-1.1-1-1.5c-0.1-0.1-0.1-0.1,0.1-0.2c0.2-0.1,0.4-0.2,0.6-0.4"/>
</g>
<g>
<path class="st0" d="M554.9,228.6c0.2-0.1,0.4-0.1,0.5-0.1c0.1-0.1,0.2-0.1,0.2,0.1c0.4,1.4,0.8,2.9,1.2,4.3
c0.6,2.1,1.2,4.3,1.9,6.5c0.1,0.2,0.1,0.2-0.2,0.3c-0.8,0.2-1.6,0.5-2.4,0.7c-0.2,0.1-0.2,0-0.3-0.2c-0.4-1.2-0.7-2.4-1.1-3.6
c-0.7-2.4-1.4-4.8-2.1-7.1c-0.1-0.2-0.1-0.2,0.2-0.2c0.2-0.1,0.3-0.1,0.4-0.1C553.9,228.9,554.4,228.8,554.9,228.6z"/>
</g>
<g>
<path class="st0" d="M538.7,178.5c-0.2,0.1-0.4,0.1-0.5,0.1c-0.1,0.1-0.2,0-0.2-0.1c-0.2-0.8-0.5-1.6-0.7-2.4
c-0.8-2.6-1.5-5.2-2.3-7.9c-0.1-0.2-0.1-0.3-0.1-0.5c-0.1-0.1-0.1-0.2,0.1-0.2c0.7-0.2,1.5-0.4,2.2-0.7c0.5-0.1,0.4-0.1,0.6,0.3
c0.6,2,1.2,4,1.7,6c0.4,1.5,0.9,3,1.4,4.5c0.1,0.1,0,0.2-0.1,0.2c-0.2,0.1-0.3,0.1-0.4,0.1c-0.1-0.1-0.1,0-0.1,0
c-0.4,0.1-0.7,0.2-1.1,0.4C538.9,178.5,538.8,178.5,538.7,178.5z"/>
</g>
<g>
<path class="st0" d="M546.1,177.3c-0.5,0-0.5,0-0.5-0.5c0-3.6,0-7.3,0-11c0-0.2,0.1-0.2,0.2-0.2c0.8,0,1.5,0,2.4,0
c0.1,0,0.2,0.1,0.2,0.2c0,3.7,0,7.6,0,11.3c0,0.1-0.1,0.2-0.2,0.2c-0.1,0-0.3,0-0.4,0C547.2,177.2,546.7,177.2,546.1,177.3z"/>
</g>
<g>
<path class="st0" d="M540.1,229.1c0.4,0.1,0.4,0.1,0.2,0.4c-1,3.6-2.1,7.1-3,10.7c-0.1,0.2-0.1,0.2-0.2,0.1
c-0.7-0.2-1.4-0.4-2.1-0.6c-0.2-0.1-0.2-0.1-0.1-0.2c0.5-1.8,1.1-3.6,1.5-5.4c0.5-1.8,1.1-3.6,1.5-5.5c0.1-0.2,0.1-0.2,0.2-0.1
c0.1,0.1,0.2,0.1,0.4,0.1C539,228.8,539.6,228.9,540.1,229.1z"/>
</g>
<g>
<path class="st0" d="M553.6,178.2c-0.4-0.1-0.4-0.1-0.3-0.5c0.8-2.9,1.7-5.9,2.5-8.9c0.2-0.6,0.4-1.2,0.5-1.8
c0.1-0.1,0.1-0.2,0.2-0.1c0.7,0.2,1.4,0.4,2.2,0.6c0.2,0.1,0.1,0.1,0.1,0.2c-0.4,1.6-0.9,3.2-1.4,4.9c-0.6,2-1.1,4-1.7,6
c-0.1,0.2-0.1,0.2-0.3,0.2c-0.1-0.1-0.1-0.1-0.2-0.1c-0.3-0.1-0.7-0.2-1-0.3C554,178.2,553.8,178.2,553.6,178.2z"/>
</g>
<g>
<path class="st0" d="M560.3,181.2c-0.3-0.2-0.2-0.2-0.1-0.5c1.7-2.6,3.3-5.2,4.9-7.8c0.4-0.5,0.7-1.1,1-1.6
c0.1-0.1,0.1-0.1,0.2-0.1c0.6,0.4,1.1,0.7,1.7,1.1c0.1,0.1,0.1,0.1,0.1,0.2c-1,1.5-2,3-2.9,4.6c-1.1,1.6-2.1,3.2-3.1,4.9
c-0.1,0.2-0.2,0.2-0.4,0.1"/>
</g>
<g>
<path class="st0" d="M533.1,226.1c0.2,0.2,0.2,0.2,0.1,0.5c-1.2,1.9-2.4,3.7-3.6,5.6c-0.8,1.2-1.6,2.5-2.4,3.7
c-0.1,0.1-0.2,0.2-0.3,0.1c-0.5-0.4-1.1-0.7-1.6-1.1c-0.1-0.1-0.1-0.1-0.1-0.2c1.4-2.1,2.7-4.3,4.1-6.4c0.7-1,1.2-2,1.9-3
c0.1-0.2,0.1-0.2,0.4-0.1c0,0,0.1,0,0.1,0.1C532.3,225.5,532.7,225.8,533.1,226.1z"/>
</g>
<g>
<path class="st0" d="M527.4,221.4c0.1,0.1,0.1,0.2-0.1,0.3c-2.7,2.4-5.4,4.7-8.2,7c-0.1,0.1-0.2,0.2-0.4,0.4
c-0.1,0.1-0.1,0.1-0.2,0c-0.4-0.5-0.8-0.9-1.2-1.4c-0.1-0.1-0.1-0.1,0.1-0.2c0.7-0.6,1.4-1.2,2.1-1.8c1.4-1.2,2.7-2.4,4.1-3.6
c0.8-0.7,1.6-1.4,2.4-2.1c0.2-0.1,0.2-0.1,0.3,0.1C526.7,220.6,527.1,221,527.4,221.4z"/>
</g>
<g>
<path class="st0" d="M566.2,185.8c-0.1-0.1-0.1-0.2,0.1-0.4c2.1-1.8,4.2-3.7,6.4-5.5c0.7-0.6,1.4-1.2,2.1-1.8
c0.1-0.1,0.2-0.1,0.2,0c0.4,0.4,0.7,0.9,1.1,1.3c0.1,0.1,0.1,0.2-0.1,0.2c-2.1,1.8-4.2,3.6-6.2,5.4c-0.7,0.7-1.5,1.2-2.2,1.9
c-0.1,0.1-0.2,0.1-0.4,0C566.9,186.6,566.6,186.2,566.2,185.8z"/>
</g>
<g>
<path class="st0" d="M570.3,191.9c-0.1-0.1,0.1-0.1,0.1-0.2c0.9-0.4,1.8-0.8,2.7-1.2c1.2-0.5,2.3-1.1,3.5-1.6
c1.4-0.6,2.7-1.2,4-1.9c0.1-0.1,0.2-0.1,0.3,0.1c0.2,0.4,0.4,0.9,0.6,1.3c0.1,0.1,0.1,0.2-0.1,0.2c-1.8,0.8-3.6,1.7-5.5,2.5
c-1.6,0.7-3.2,1.5-4.9,2.2c-0.1,0.1-0.2,0.1-0.2-0.1C570.8,192.9,570.6,192.4,570.3,191.9z"/>
</g>
<g>
<path class="st0" d="M523.2,215.2c0.1,0.1-0.1,0.1-0.1,0.2c-1,0.4-1.9,0.9-2.9,1.4c-1.2,0.6-2.4,1.1-3.6,1.7
c-1.3,0.6-2.6,1.2-3.9,1.8c-0.1,0.1-0.1,0.1-0.2-0.1c-0.2-0.5-0.4-1-0.7-1.4c-0.1-0.1-0.1-0.2,0.1-0.2c2.7-1.2,5.4-2.4,8-3.7
c0.7-0.4,1.5-0.7,2.3-1.1c0.1-0.1,0.2-0.1,0.2,0C522.7,214.2,523,214.8,523.2,215.2z"/>
</g>
<g>
<path class="st0" d="M531.8,181.9c0.1-0.1,0.1-0.1,0.2-0.2c0.4-0.2,0.7-0.5,1.1-0.7c0.1-0.1,0.1-0.1,0.2-0.1
c0.4,0.7,0.8,1.4,1.2,2c1,1.7,2,3.3,3,4.9c0.5,0.9,1.1,1.7,1.5,2.6c0.1,0.1,0.1,0.2-0.1,0.2c-0.4,0.2-0.9,0.5-1.2,0.8
c-0.1,0.1-0.1,0.1-0.2-0.1c-1-1.6-1.9-3.2-2.9-4.8c-0.7-1.1-1.4-2.2-2.1-3.4c-0.2-0.4-0.5-0.8-0.7-1.2
C532,182,531.9,182,531.8,181.9z"/>
</g>
<g>
<path class="st0" d="M514.2,209c-1.6,0.2-3.2,0.4-4.8,0.7c-0.1,0-0.2,0-0.2-0.1c-0.1-0.4-0.1-0.9-0.2-1.3c0-0.1,0.1-0.2,0.1-0.2
c1.3-0.2,2.6-0.4,3.9-0.5c1.5-0.2,3-0.4,4.5-0.6c1-0.1,2-0.2,3-0.4c0.1,0.6,0.2,1.1,0.2,1.6"/>
</g>
<g>
<path class="st0" d="M572.8,199c1.4-0.2,2.9-0.4,4.4-0.6c1.3-0.2,2.7-0.4,4-0.5c1-0.1,2-0.2,3-0.4c0.2-0.1,0.2,0,0.2,0.2
c0.1,0.4,0.1,0.8,0.2,1.2c0,0.1,0,0.2-0.1,0.2c-1,0.1-1.9,0.2-2.9,0.4c-1.6,0.2-3.2,0.4-4.9,0.7c-1.2,0.2-2.4,0.3-3.6,0.5
c-0.1,0-0.1,0-0.1,0C572.9,200.1,572.8,199.5,572.8,199z"/>
</g>
<g>
<path class="st0" d="M546.1,177.3c0.5-0.1,1.1-0.1,1.6,0c0,3.7,0,7.4,0,11.1c0,0.2,0,0.2-0.2,0.2c-0.4,0-0.7,0-1.1,0
c-0.2,0-0.2-0.1-0.2-0.2c0-3.6,0-7.2,0-10.8C546.1,177.5,546.1,177.3,546.1,177.3z"/>
</g>
<g>
<path class="st0" d="M547.4,229.9c-0.5,0-1.1,0-1.6,0c0-3.7,0-7.4,0-11.1c0-0.2,0.1-0.2,0.2-0.2c0.4,0,0.8,0,1.2,0
c0.1,0,0.2,0.1,0.2,0.2c0,0.8,0,1.6,0,2.4C547.4,224.1,547.4,227,547.4,229.9z"/>
</g>
<g>
<path class="st0" d="M553.6,178.2c0.2,0,0.4,0.1,0.6,0.1c0.4,0.1,0.7,0.2,1,0.3c-0.1,0.2-0.2,0.5-0.2,0.8c-0.5,1.6-1,3.3-1.4,4.9
c-0.5,1.7-1,3.3-1.5,5c-0.1,0.1-0.1,0.2-0.2,0.1c-0.4-0.1-0.8-0.2-1.2-0.4c-0.1-0.1-0.1-0.1-0.1-0.2c0.4-1.2,0.7-2.4,1.1-3.7
c0.5-1.7,1-3.4,1.5-5.1C553.1,179.5,553.4,178.8,553.6,178.2z"/>
</g>
<g>
<path class="st0" d="M526.4,186.9c0-0.1,0-0.1,0.1-0.1c0.3-0.4,0.6-0.7,1-1.1c0.1-0.1,0.1-0.1,0.1-0.1c0.4,0.3,0.7,0.6,1,0.9
c0.5,0.5,1.1,1,1.5,1.4c1,0.9,2,1.8,3,2.7c0.6,0.6,1.2,1.1,1.8,1.7c0.2,0.2,0.5,0.5,0.8,0.7c0.1,0.1,0.1,0.1,0,0.2
c-0.3,0.3-0.6,0.7-0.8,1c-0.1,0.1-0.1,0.1-0.2,0.1c-0.3-0.3-0.6-0.6-1-0.8c-1.2-1.1-2.4-2.1-3.6-3.2c-1-0.9-1.9-1.7-2.9-2.6
C527.1,187.5,526.8,187.2,526.4,186.9z"/>
</g>
<g>
<path class="st0" d="M540.1,229.1c-0.5-0.1-1.1-0.2-1.5-0.4c0.4-1.1,0.7-2.3,1-3.4c0.4-1.4,0.8-2.7,1.2-4.1
c0.3-1.1,0.6-2.1,0.9-3.2c0.1-0.2,0.1-0.2,0.2-0.2c0.4,0.1,0.8,0.2,1.2,0.4c0.1,0.1,0.2,0.1,0.1,0.2c-0.5,1.7-1,3.4-1.5,5.1
c-0.5,1.7-1,3.5-1.5,5.2C540.1,228.8,540.1,228.9,540.1,229.1z"/>
</g>
<g>
<path class="st0" d="M522.6,193.4c0.1-0.3,0.2-0.6,0.4-0.9c0.1-0.2,0.1-0.4,0.2-0.6c0.7,0.3,1.3,0.6,2,0.9c1.5,0.7,3,1.4,4.5,2.1
c0.9,0.4,1.7,0.8,2.6,1.2c0.3,0.2,0.7,0.3,1,0.4c0.1,0.1,0.1,0.1,0.1,0.2c-0.2,0.4-0.4,0.8-0.5,1.2c-0.1,0.1-0.1,0.2-0.2,0.1
c-0.7-0.4-1.4-0.7-2.1-1c-1.9-0.9-3.9-1.8-5.8-2.7C524,194.1,523.3,193.7,522.6,193.4z"/>
</g>
<g>
<path class="st0" d="M571.1,213.7c-0.1,0.2-0.1,0.4-0.2,0.6c-0.1,0.3-0.2,0.6-0.4,0.9c-0.7-0.3-1.4-0.6-2.1-1
c-1.6-0.7-3.2-1.5-4.8-2.2c-0.8-0.4-1.6-0.7-2.4-1.1c-0.2-0.1-0.6-0.2-0.8-0.4c-0.1-0.1-0.1-0.1-0.1-0.2c0.2-0.4,0.4-0.8,0.6-1.2
c0.1-0.1,0.1-0.1,0.2-0.1c1.4,0.7,2.7,1.2,4.2,1.9C567.2,211.8,569.2,212.7,571.1,213.7C571.1,213.7,571.1,213.7,571.1,213.7z"/>
</g>
<g>
<path class="st0" d="M538.7,178.5c0.1-0.1,0.2-0.1,0.2-0.1c0.4-0.1,0.7-0.2,1.1-0.4c0.1,0,0.1-0.1,0.1,0c0.5,1.6,1,3.2,1.4,4.8
c0.4,1.2,0.7,2.4,1.1,3.6c0.2,0.7,0.4,1.5,0.7,2.2c0.1,0.1,0,0.2-0.1,0.2c-0.4,0.1-0.8,0.2-1.2,0.4c-0.2,0.1-0.2,0-0.2-0.2
c-0.3-1-0.6-2-0.9-3c-0.4-1.2-0.7-2.5-1.1-3.7C539.5,181.1,539.1,179.8,538.7,178.5z"/>
</g>
<g>
<path class="st0" d="M520.6,200.7c-0.1,0-0.1-0.1-0.1-0.1c0.1-0.4,0.1-0.9,0.2-1.4c0-0.1,0.1-0.1,0.1-0.1c0.9,0.1,1.7,0.2,2.6,0.4
c1,0.1,2.1,0.2,3,0.4c1,0.2,2,0.2,3,0.4c0.7,0.1,1.4,0.2,2.2,0.2c0.2,0,0.2,0.1,0.2,0.2c-0.1,0.4-0.1,0.8-0.2,1.2
c0,0.1-0.1,0.1-0.2,0.1c-0.9-0.1-1.8-0.2-2.7-0.4c-1-0.1-1.9-0.2-2.9-0.4c-0.9-0.1-1.8-0.2-2.7-0.4
C522.4,200.9,521.6,200.8,520.6,200.7C520.8,200.8,520.8,200.8,520.6,200.7z"/>
</g>
<g>
<path class="st0" d="M533.1,226.1c-0.4-0.3-0.9-0.6-1.4-0.9c0.3-0.4,0.5-0.8,0.8-1.2c0.7-1.1,1.4-2.1,2.1-3.2
c1.1-1.7,2.1-3.3,3.2-5c0.1-0.1,0.1-0.1,0.2-0.1c0.4,0.2,0.7,0.5,1.1,0.7c0.1,0.1,0.1,0.1,0.1,0.2c-0.5,0.7-0.9,1.4-1.4,2.2
c-1.5,2.4-3,4.7-4.5,7.1C533.2,226,533.2,226.1,533.1,226.1z"/>
</g>
<g>
<path class="st0" d="M560.4,181.1c0.5,0.2,0.9,0.6,1.4,0.9c-0.5,0.7-0.9,1.4-1.4,2.2c-1.5,2.4-3,4.8-4.6,7.2
c-0.1,0.1-0.1,0.1-0.2,0.1c-0.4-0.2-0.7-0.4-1.1-0.7c-0.1-0.1-0.2-0.1-0.1-0.2c0.8-1.2,1.5-2.4,2.3-3.6c1.2-1.9,2.4-3.8,3.6-5.7
C560.4,181.1,560.4,181.1,560.4,181.1z"/>
</g>
<g>
<path class="st0" d="M527.4,221.4c-0.4-0.4-0.7-0.8-1.1-1.2c1-0.9,2-1.7,3-2.6c1-0.9,2-1.7,3-2.6c0.8-0.7,1.7-1.4,2.5-2.1
c0.1-0.1,0.2-0.1,0.2,0.1c0.2,0.3,0.5,0.7,0.8,1c0.1,0.1,0.1,0.2,0,0.2c-0.6,0.5-1.2,1.1-1.8,1.6c-0.6,0.5-1.2,1.1-1.9,1.6
c-0.9,0.8-1.8,1.5-2.7,2.4C528.7,220.3,528,220.8,527.4,221.4z"/>
</g>
<g>
<path class="st0" d="M572.8,199c0.1,0.5,0.1,1.1,0.2,1.5c-0.4,0.1-0.7,0.1-1.1,0.2c-0.7,0.1-1.5,0.2-2.2,0.3
c-0.8,0.1-1.7,0.2-2.5,0.4c-0.8,0.1-1.7,0.2-2.5,0.4c-0.7,0.1-1.4,0.2-2.2,0.3c-0.2,0.1-0.4,0.1-0.7,0.1c-0.1,0.1-0.2-0.1-0.2-0.1
c-0.1-0.3-0.1-0.6-0.1-0.9c0-0.2-0.1-0.4,0-0.5c0.1-0.1,0.3-0.1,0.4-0.1c1.4-0.2,2.8-0.4,4.2-0.6c1.4-0.2,2.7-0.4,4-0.6
C571.2,199.2,571.9,199.2,572.8,199z"/>
</g>
<g>
<path class="st0" d="M554.9,228.8c-0.5,0.2-1,0.4-1.5,0.5c-0.2-1-0.6-2.2-0.9-3.2c-0.4-1.4-0.8-2.9-1.2-4.3
c-0.3-1.1-0.6-2.3-0.9-3.4c-0.1-0.1-0.1-0.2,0.1-0.2c0.4-0.1,0.8-0.2,1.2-0.4c0.1-0.1,0.2,0,0.2,0.1c0.4,1.5,0.8,3,1.2,4.5
c0.6,2,1.1,4,1.7,6.1C554.9,228.6,554.9,228.8,554.9,228.8z"/>
</g>
<g>
<path class="st0" d="M520.8,208.1c-0.1-0.5-0.1-1.1-0.2-1.5c1.2-0.2,2.4-0.4,3.6-0.5c1.1-0.1,2.2-0.3,3.3-0.5
c1.2-0.2,2.4-0.3,3.7-0.5c0.1,0,0.3-0.1,0.4-0.1c0.1,0,0.2,0,0.2,0.1c0.1,0.4,0.1,0.9,0.2,1.2c0,0.1-0.1,0.2-0.1,0.2
c-0.4,0.1-0.9,0.1-1.2,0.2c-0.7,0.1-1.4,0.2-2.2,0.3c-0.7,0.1-1.5,0.2-2.2,0.3c-0.7,0.1-1.4,0.2-2.1,0.3"/>
</g>
<g>
<path class="st0" d="M566.3,221.4c-1.4-1.2-2.9-2.5-4.3-3.7c-1.1-1-2.2-1.9-3.4-2.9c-0.2-0.2-0.5-0.5-0.8-0.7
c-0.1-0.1-0.1-0.1,0-0.2c0.2-0.3,0.5-0.6,0.8-0.9c0.1-0.1,0.2-0.1,0.3,0c0.4,0.4,0.9,0.8,1.4,1.2c0.9,0.7,1.7,1.5,2.6,2.3
c0.7,0.6,1.4,1.2,2,1.7c0.8,0.8,1.5,1.4,2.3,2.1c0,0.1-0.1,0.2-0.2,0.2"/>
</g>
<g>
<path class="st0" d="M572.9,206.4c0.1,0.1,0.1,0.1,0.1,0.2c-0.1,0.4-0.1,0.9-0.2,1.3c0,0.1,0,0.1-0.1,0.1
c-0.4-0.1-0.9-0.1-1.4-0.2c-0.8-0.1-1.7-0.2-2.6-0.4c-0.7-0.1-1.4-0.2-2.2-0.3c-0.7-0.1-1.4-0.2-2.2-0.3c-0.7-0.1-1.2-0.2-1.9-0.2
c-0.2-0.1-0.6-0.1-0.8-0.1c-0.1,0-0.1-0.1-0.1-0.2c0.1-0.4,0.1-0.9,0.2-1.3c0-0.1,0.1-0.1,0.2-0.1c0.4,0.1,0.7,0.1,1.1,0.1
c0.8,0.1,1.6,0.2,2.4,0.4c0.7,0.1,1.5,0.2,2.3,0.3c0.8,0.1,1.7,0.2,2.5,0.4c0.8,0.1,1.6,0.2,2.4,0.4
C572.7,206.4,572.8,206.4,572.9,206.4z"/>
</g>
<g>
<path class="st0" d="M566.2,185.8c0.4,0.4,0.7,0.8,1.1,1.2c-0.4,0.3-0.7,0.6-1.1,0.9c-0.9,0.8-1.8,1.5-2.8,2.4
c-0.8,0.7-1.7,1.4-2.4,2.1c-0.7,0.6-1.4,1.2-2.1,1.8c-0.1,0.1-0.2,0.1-0.4-0.1c-0.2-0.3-0.5-0.6-0.8-0.9c-0.1-0.1-0.1-0.2,0-0.2
c0.5-0.4,1-0.9,1.5-1.3c0.6-0.5,1.2-1.1,1.8-1.5c0.9-0.8,1.9-1.6,2.8-2.4C564.7,187.1,565.5,186.4,566.2,185.8z"/>
</g>
<g>
<path class="st0" d="M561.7,225.3c-0.1,0.2-0.4,0.2-0.6,0.4c-0.2,0.1-0.4,0.2-0.6,0.4c-0.1,0.1-0.1,0.1-0.2,0.1
c-0.2-0.5-0.6-1-0.9-1.5c-1.1-1.7-2.1-3.5-3.2-5.2c-0.6-0.9-1.1-1.8-1.7-2.7c-0.1-0.1-0.1-0.2,0.1-0.2c0.4-0.2,0.7-0.4,1.1-0.7
c0.1-0.1,0.2-0.1,0.2,0.1c1.5,2.4,3,4.9,4.5,7.4C560.8,223.9,561.2,224.6,561.7,225.3z"/>
</g>
<g>
<path class="st0" d="M523.2,215.2c-0.2-0.5-0.5-1-0.7-1.4c0.7-0.4,1.4-0.7,2.2-1c2-0.9,4-1.8,6-2.7c0.6-0.3,1.2-0.6,1.9-0.9
c0.1-0.1,0.2-0.1,0.2,0.1c0.2,0.4,0.4,0.8,0.5,1.2c0.1,0.1,0.1,0.1-0.1,0.2c-2.1,0.9-4,1.9-6.1,2.8c-1.1,0.5-2.3,1.1-3.4,1.5
C523.6,215.1,523.4,215.2,523.2,215.2z"/>
</g>
<g>
<path class="st0" d="M570.3,191.9c0.2,0.5,0.5,1,0.7,1.4c-0.4,0.2-0.7,0.4-1.1,0.5c-1,0.5-2,0.9-3,1.4c-1.5,0.7-3,1.4-4.6,2.1
c-0.5,0.2-1,0.4-1.5,0.7c-0.1,0.1-0.2,0.1-0.2-0.1c-0.2-0.4-0.4-0.8-0.6-1.2c-0.1-0.1,0-0.1,0.1-0.2c1.6-0.7,3.2-1.5,4.9-2.2
c1.2-0.5,2.3-1.1,3.5-1.6c0.6-0.2,1.1-0.5,1.7-0.7C570.3,192,570.3,192,570.3,191.9z"/>
</g>
</g>
<g>
<g>
<g>
<path class="st0" d="M599.3,214.7c0-8.1,2.2-14.5,6.5-19c4.3-4.6,9.9-6.8,16.8-6.8c4.5,0,8.6,1.1,12.2,3.2c3.6,2.1,6.4,5.2,8.3,9
c1.9,3.9,2.9,8.2,2.9,13.1c0,4.9-1,9.3-3,13.3c-2,3.9-4.8,6.8-8.5,8.9c-3.6,2-7.6,3-11.8,3c-4.6,0-8.7-1.1-12.3-3.3
c-3.6-2.2-6.4-5.2-8.2-9.1C600.2,223,599.3,219,599.3,214.7z M605.9,214.8c0,5.9,1.6,10.5,4.8,13.9c3.2,3.4,7.1,5.1,11.9,5.1
c4.9,0,8.9-1.7,12-5.1c3.2-3.4,4.7-8.3,4.7-14.5c0-4-0.7-7.4-2-10.4s-3.3-5.2-5.9-6.9c-2.6-1.6-5.5-2.4-8.7-2.4
c-4.6,0-8.5,1.5-11.8,4.7C607.6,202.2,605.9,207.4,605.9,214.8z"/>
</g>
<g>
<path class="st0" d="M622.7,241.4c-4.9,0-9.4-1.2-13.4-3.6s-7-5.8-9-10c-2-4-3-8.3-3-13.1c0-8.6,2.4-15.5,7.1-20.4
c4.7-4.9,10.9-7.5,18.3-7.5c4.9,0,9.3,1.2,13.3,3.5c3.9,2.3,7,5.6,9.1,9.8c2,4.2,3.1,8.9,3.1,14s-1.1,9.9-3.2,14.2
c-2.3,4.3-5.3,7.6-9.3,9.8C631.6,240.3,627.3,241.4,622.7,241.4z M622.7,191c-6.4,0-11.4,2-15.4,6.2c-4,4.1-6,10.1-6,17.6
c0,4.1,0.8,7.8,2.6,11.2c1.7,3.5,4.2,6.3,7.4,8.3c3.3,2,7.1,3,11.2,3c3.9,0,7.6-1,10.8-2.8c3.3-1.8,5.8-4.5,7.7-8
c1.8-3.6,2.7-7.8,2.7-12.3c0-4.6-0.9-8.6-2.6-12.2c-1.7-3.5-4.3-6.2-7.4-8.1C630.5,191.9,626.9,191,622.7,191z M622.6,235.8
c-5.4,0-9.9-1.9-13.5-5.7c-3.5-3.7-5.3-8.9-5.3-15.3c0-7.9,1.9-13.7,5.7-17.3c3.6-3.5,8.1-5.3,13.2-5.3c3.6,0,6.9,1,9.8,2.7
c2.9,1.9,5.2,4.5,6.7,7.8c1.5,3.2,2.2,6.9,2.2,11.3c0,6.8-1.8,12.2-5.2,16C632.6,233.8,628,235.8,622.6,235.8z M622.7,196.4
c-4.1,0-7.4,1.4-10.4,4.1c-2.9,2.8-4.3,7.6-4.3,14.3c0,5.3,1.4,9.5,4.2,12.4c2.7,3,6.1,4.4,10.4,4.4s7.7-1.4,10.5-4.5
c2.7-3,4.2-7.4,4.2-13.1c0-3.7-0.6-6.8-1.8-9.5c-1.2-2.6-2.9-4.5-5.1-6C628.1,197.1,625.5,196.4,622.7,196.4z"/>
</g>
</g>
<g>
<g>
<path class="st0" d="M693.7,221.3l6.4,1.6c-1.4,5.3-3.8,9.3-7.3,12.1s-7.8,4.2-12.9,4.2c-5.2,0-9.5-1.1-12.8-3.2
c-3.3-2.1-5.8-5.2-7.5-9.3c-1.7-4-2.6-8.4-2.6-13.1c0-5.1,1-9.5,2.9-13.3c2-3.8,4.7-6.7,8.3-8.6s7.5-2.9,11.8-2.9
c4.9,0,9,1.2,12.3,3.7c3.3,2.5,5.7,6,7,10.5l-6.4,1.5c-1.1-3.6-2.8-6.1-4.9-7.7c-2.1-1.6-4.9-2.4-8.1-2.4c-3.7,0-6.9,0.9-9.4,2.7
c-2.5,1.8-4.3,4.2-5.3,7.3c-1,3-1.5,6.1-1.5,9.3c0,4.2,0.6,7.8,1.8,10.9c1.2,3.1,3.1,5.4,5.7,7c2.6,1.5,5.3,2.3,8.3,2.3
c3.6,0,6.7-1.1,9.2-3.2C691,228.5,692.8,225.4,693.7,221.3z"/>
</g>
<g>
<path class="st0" d="M679.9,241.3c-5.7,0-10.4-1.2-13.9-3.6c-3.6-2.4-6.4-5.8-8.3-10.2c-1.8-4.2-2.7-8.9-2.7-13.9
c0-5.5,1.1-10.2,3.2-14.2c2.1-4.2,5.2-7.3,9.1-9.5c3.8-2.1,8.2-3.2,12.9-3.2c5.3,0,9.9,1.4,13.6,4.2c3.7,2.8,6.3,6.7,7.7,11.5
l0.6,2.1l-10.4,2.4l-0.6-1.8c-1-3.1-2.4-5.4-4.2-6.7c-1.8-1.4-4.1-2-6.8-2c-3.3,0-6.1,0.8-8.2,2.3c-2.1,1.5-3.7,3.6-4.5,6.2
c-1,2.9-1.4,5.8-1.4,8.7c0,3.9,0.5,7.3,1.7,10.1c1,2.6,2.6,4.6,4.8,6c2.3,1.4,4.6,2,7.2,2c3.1,0,5.7-0.9,7.9-2.7
c2.1-1.8,3.6-4.6,4.4-8.2l0.5-2.1l10.5,2.6l-0.5,2c-1.5,5.7-4.2,10.2-8,13.3C690.2,239.8,685.4,241.3,679.9,241.3z M680,190.9
c-4,0-7.6,0.9-10.8,2.7c-3.2,1.8-5.7,4.3-7.4,7.7c-1.8,3.4-2.7,7.6-2.7,12.3c0,4.5,0.8,8.5,2.4,12.3c1.5,3.6,3.8,6.4,6.7,8.3
s6.8,2.9,11.7,2.9c4.7,0,8.5-1.2,11.6-3.7c2.7-2.1,4.7-5.2,6-9l-2.3-0.6c-1.1,3.5-2.9,6.3-5.2,8.4c-2.9,2.4-6.4,3.6-10.5,3.6
c-3.3,0-6.5-0.9-9.3-2.6c-3-1.8-5.2-4.5-6.5-8c-1.2-3.3-1.9-7.3-1.9-11.7c0-3.4,0.5-6.7,1.7-10c1.1-3.5,3.2-6.2,6.1-8.3
c2.9-2,6.4-3.1,10.6-3.1c3.7,0,6.8,1,9.3,2.9c2.1,1.6,3.8,3.9,5,7l2.3-0.5c-1.2-3-3-5.5-5.5-7.3C688.1,192,684.4,190.9,680,190.9
z"/>
</g>
</g>
<g>
<g>
<path class="st0" d="M707.2,238.5l18.7-48.8h7l19.9,48.8h-7.4l-5.7-14.8h-20.4l-5.4,14.8H707.2z M721.3,218.4h16.5l-5.1-13.5
c-1.5-4.1-2.7-7.5-3.5-10.1c-0.6,3.2-1.5,6.2-2.6,9.3L721.3,218.4z"/>
</g>
<g>
<path class="st0" d="M729.4,187.6h5l21.7,53h-11.9l-5.7-14.8h-17.5l-5.4,14.8h-11.2l20.2-53h4 M746.9,236.4h2.9l-18.2-44.6h-1
l0.7,2.4c0.8,2.9,2,6.3,3.4,10l6.2,16.3h-22.6l6.4-17.1c1.1-3.2,2-6.1,2.5-9l0.5-2.7h-0.4l-17.1,44.6h2.3l5.4-14.8h23.3
L746.9,236.4z M724.4,216.3h10.5l-4-10.7c-0.4-1.2-0.8-2.3-1.2-3.5c-0.3,0.9-0.6,1.7-0.9,2.6L724.4,216.3z"/>
</g>
</g>
</g>
<g>
<path class="st1" d="M327.3,257c1.3-0.2,3-0.4,5.3-0.4c2.7,0,4.7,0.7,6,1.8c1.2,1,1.8,2.6,1.8,4.5c0,1.9-0.6,3.5-1.7,4.5
c-1.4,1.5-3.8,2.3-6.5,2.3c-0.8,0-1.5-0.1-2.2-0.2v8.5h-2.7V257z M330,267.3c0.6,0.2,1.4,0.2,2.3,0.2c3.3,0,5.4-1.6,5.4-4.5
c0-2.8-2-4.2-5-4.2c-1.2,0-2.1,0.1-2.6,0.2L330,267.3L330,267.3z"/>
<path class="st1" d="M352,278l-0.2-1.9h-0.1c-0.8,1.2-2.5,2.3-4.6,2.3c-3.1,0-4.6-2.2-4.6-4.4c0-3.7,3.3-5.7,9.2-5.7V268
c0-1.2-0.4-3.5-3.5-3.5c-1.4,0-2.9,0.4-4,1.1l-0.7-1.8c1.2-0.8,3.1-1.4,5-1.4c4.6,0,5.8,3.2,5.8,6.2v5.7c0,1.3,0.1,2.6,0.2,3.6H352
L352,278z M351.6,270.2c-3-0.1-6.5,0.5-6.5,3.5c0,1.8,1.2,2.7,2.6,2.7c2,0,3.3-1.2,3.7-2.6c0.1-0.3,0.2-0.6,0.2-0.9V270.2z"/>
<path class="st1" d="M359.2,267.6c0-1.8-0.1-3.3-0.1-4.8h2.4l0.1,3h0.1c0.7-2,2.4-3.3,4.2-3.3c0.3,0,0.5,0.1,0.8,0.1v2.6
c-0.3-0.1-0.6-0.1-1-0.1c-2,0-3.3,1.5-3.7,3.6c-0.1,0.4-0.1,0.8-0.1,1.3v8.1h-2.7V267.6z"/>
<path class="st1" d="M374.1,258.4v4.4h4v2.1h-4v8.2c0,1.9,0.5,3,2.1,3c0.7,0,1.2-0.1,1.6-0.2l0.1,2.1c-0.5,0.2-1.4,0.4-2.4,0.4
c-1.3,0-2.3-0.4-3-1.2c-0.8-0.8-1.1-2.2-1.1-4v-8.3H369v-2.1h2.4v-3.6L374.1,258.4z"/>
<path class="st1" d="M381.6,266.9c0-1.5-0.1-2.9-0.1-4.1h2.4l0.2,2.5h0.1c0.8-1.4,2.5-2.9,5.1-2.9c2.1,0,5.4,1.2,5.4,6.5v9.1h-2.8
v-8.8c0-2.4-0.9-4.5-3.5-4.5c-1.8,0-3.3,1.3-3.7,2.9c-0.1,0.4-0.2,0.8-0.2,1.3v9.2h-2.8L381.6,266.9L381.6,266.9z"/>
<path class="st1" d="M401.1,270.9c0.1,3.7,2.4,5.3,5.2,5.3c2,0,3.2-0.4,4.2-0.8l0.5,2c-1,0.4-2.7,1-5.1,1c-4.7,0-7.5-3.1-7.5-7.7
c0-4.6,2.7-8.2,7.1-8.2c5,0,6.3,4.4,6.3,7.2c0,0.6-0.1,1-0.1,1.3L401.1,270.9L401.1,270.9L401.1,270.9z M409.2,268.9
c0.1-1.8-0.7-4.5-3.9-4.5c-2.8,0-4,2.6-4.3,4.5H409.2z"/>
<path class="st1" d="M415.8,267.6c0-1.8-0.1-3.3-0.1-4.8h2.4l0.1,3h0.1c0.7-2,2.4-3.3,4.2-3.3c0.3,0,0.5,0.1,0.8,0.1v2.6
c-0.3-0.1-0.6-0.1-1-0.1c-2,0-3.3,1.5-3.7,3.6c-0.1,0.4-0.1,0.8-0.1,1.3v8.1h-2.7V267.6z"/>
</g>
<g>
<path class="st1" d="M614.7,277.4c-1,0.5-3,1-5.6,1c-6,0-10.5-3.8-10.5-10.8c0-6.7,4.5-11.2,11.1-11.2c2.7,0,4.3,0.6,5.1,1
l-0.7,2.3c-1-0.5-2.5-0.9-4.3-0.9c-5,0-8.3,3.2-8.3,8.7c0,5.2,3,8.6,8.2,8.6c1.7,0,3.4-0.4,4.5-0.9L614.7,277.4z"/>
<path class="st1" d="M631.9,270.3c0,5.7-3.9,8.1-7.6,8.1c-4.1,0-7.3-3-7.3-7.9c0-5.1,3.3-8.1,7.6-8.1
C629,262.4,631.9,265.6,631.9,270.3z M619.9,270.5c0,3.3,1.9,5.9,4.6,5.9c2.7,0,4.6-2.5,4.6-6c0-2.6-1.3-5.9-4.6-5.9
C621.2,264.5,619.9,267.6,619.9,270.5z"/>
<path class="st1" d="M635.9,266.9c0-1.5-0.1-2.9-0.1-4.1h2.4l0.2,2.5h0.1c0.8-1.4,2.5-2.9,5.1-2.9c2.1,0,5.4,1.2,5.4,6.5v9.1h-2.8
v-8.8c0-2.4-0.9-4.5-3.5-4.5c-1.8,0-3.3,1.3-3.7,2.9c-0.1,0.4-0.2,0.8-0.2,1.3v9.2h-2.8V266.9z"/>
<path class="st1" d="M657.1,258.4v4.4h4v2.1h-4v8.2c0,1.9,0.5,3,2.1,3c0.7,0,1.2-0.1,1.6-0.2l0.1,2.1c-0.5,0.2-1.4,0.4-2.4,0.4
c-1.3,0-2.3-0.4-3-1.2c-0.8-0.8-1.1-2.2-1.1-4v-8.3H652v-2.1h2.4v-3.6L657.1,258.4z"/>
<path class="st1" d="M664.6,267.6c0-1.8-0.1-3.3-0.1-4.8h2.4l0.1,3h0.1c0.7-2,2.4-3.3,4.2-3.3c0.3,0,0.5,0.1,0.8,0.1v2.6
c-0.3-0.1-0.6-0.1-1-0.1c-2,0-3.3,1.5-3.7,3.6c-0.1,0.4-0.1,0.8-0.1,1.3v8.1h-2.7V267.6z"/>
<path class="st1" d="M678.5,258.5c0.1,1-0.7,1.7-1.8,1.7c-1,0-1.7-0.8-1.7-1.7s0.7-1.7,1.7-1.7
C677.9,256.8,678.5,257.5,678.5,258.5z M675.4,278v-15.2h2.8V278H675.4z"/>
<path class="st1" d="M683.2,278c0.1-1,0.1-2.6,0.1-3.9v-18.4h2.7v9.6h0.1c1-1.7,2.7-2.8,5.2-2.8c3.8,0,6.5,3.2,6.4,7.8
c0,5.5-3.5,8.2-6.8,8.2c-2.2,0-4-0.8-5.1-2.9h-0.1l-0.1,2.5H683.2z M686,271.9c0,0.4,0.1,0.7,0.1,1c0.5,1.9,2.1,3.3,4.2,3.3
c2.9,0,4.6-2.4,4.6-5.9c0-3-1.6-5.7-4.5-5.7c-1.9,0-3.6,1.3-4.2,3.4c-0.1,0.3-0.2,0.7-0.2,1.1L686,271.9L686,271.9z"/>
<path class="st1" d="M714.4,273.9c0,1.5,0.1,3,0.1,4.2h-2.4l-0.2-2.5h-0.1c-0.7,1.2-2.3,2.9-5.1,2.9c-2.4,0-5.2-1.3-5.2-6.7v-8.9
h2.8v8.5c0,2.9,0.9,4.9,3.4,4.9c1.8,0,3.2-1.3,3.6-2.5c0.2-0.4,0.2-0.9,0.2-1.4v-9.3h2.8L714.4,273.9L714.4,273.9z"/>
<path class="st1" d="M722.8,258.4v4.4h4v2.1h-4v8.2c0,1.9,0.5,3,2.1,3c0.7,0,1.2-0.1,1.6-0.2l0.1,2.1c-0.5,0.2-1.4,0.4-2.4,0.4
c-1.3,0-2.3-0.4-3-1.2c-0.8-0.8-1.1-2.2-1.1-4v-8.3h-2.4v-2.1h2.4v-3.6L722.8,258.4z"/>
<path class="st1" d="M744,270.3c0,5.7-3.9,8.1-7.6,8.1c-4.1,0-7.3-3-7.3-7.9c0-5.1,3.3-8.1,7.6-8.1C741,262.4,744,265.6,744,270.3z
M731.9,270.5c0,3.3,1.9,5.9,4.6,5.9c2.7,0,4.6-2.5,4.6-6c0-2.6-1.3-5.9-4.6-5.9C733.3,264.5,731.9,267.6,731.9,270.5z"/>
<path class="st1" d="M747.9,267.6c0-1.8-0.1-3.3-0.1-4.8h2.4l0.1,3h0.1c0.7-2,2.4-3.3,4.2-3.3c0.3,0,0.5,0.1,0.8,0.1v2.6
c-0.3-0.1-0.6-0.1-1-0.1c-2,0-3.3,1.5-3.7,3.6c-0.1,0.4-0.1,0.8-0.1,1.3v8.1h-2.7V267.6L747.9,267.6z"/>
<path class="st1" d="M646.9,312.6c1.2,0.8,3,1.4,4.9,1.4c2.8,0,4.5-1.5,4.5-3.6c0-2-1.1-3.1-4-4.2c-3.5-1.2-5.6-3-5.6-6
c0-3.3,2.7-5.8,6.9-5.8c2.2,0,3.7,0.5,4.7,1l-0.8,2.3c-0.7-0.4-2.1-1-4-1c-2.9,0-4,1.7-4,3.2c0,2,1.3,3,4.2,4.1
c3.6,1.4,5.4,3.1,5.4,6.2c0,3.3-2.4,6.1-7.4,6.1c-2,0-4.3-0.6-5.4-1.4L646.9,312.6z"/>
<path class="st1" d="M663.2,305.6c0-2-0.1-3.5-0.1-5h2.5l0.1,2.6h0.1c1.1-1.8,2.9-3,5.4-3c3.7,0,6.5,3.1,6.5,7.7
c0,5.5-3.3,8.2-7,8.2c-2,0-3.8-0.9-4.7-2.4h-0.1v8.3h-2.7V305.6z M665.9,309.7c0,0.4,0.1,0.8,0.1,1.1c0.5,1.9,2.2,3.3,4.2,3.3
c2.9,0,4.6-2.4,4.6-5.9c0-3-1.6-5.7-4.5-5.7c-1.9,0-3.6,1.4-4.2,3.5c-0.1,0.4-0.2,0.8-0.2,1.1L665.9,309.7L665.9,309.7z"/>
<path class="st1" d="M695.4,308.1c0,5.7-3.9,8.1-7.6,8.1c-4.1,0-7.3-3-7.3-7.9c0-5.1,3.3-8.1,7.6-8.1
C692.4,300.3,695.4,303.4,695.4,308.1z M683.2,308.3c0,3.3,1.9,5.9,4.6,5.9c2.7,0,4.6-2.5,4.6-6c0-2.6-1.3-5.9-4.6-5.9
C684.7,302.4,683.2,305.4,683.2,308.3z"/>
<path class="st1" d="M699.3,304.8c0-1.5-0.1-2.9-0.1-4.1h2.4l0.2,2.5h0.1c0.8-1.4,2.5-2.9,5.1-2.9c2.1,0,5.4,1.2,5.4,6.5v9.1h-2.8
v-8.8c0-2.4-0.9-4.5-3.5-4.5c-1.8,0-3.3,1.3-3.7,2.9c-0.1,0.4-0.2,0.8-0.2,1.3v9.2h-2.8L699.3,304.8L699.3,304.8z"/>
<path class="st1" d="M716.9,313.1c0.8,0.5,2.3,1.1,3.6,1.1c2,0,3-1,3-2.3c0-1.3-0.8-2-2.9-2.8c-2.7-1-4-2.5-4-4.3
c0-2.4,2-4.5,5.2-4.5c1.5,0,2.9,0.4,3.7,1l-0.7,2c-0.6-0.4-1.7-0.9-3.1-0.9c-1.7,0-2.6,1-2.6,2.1c0,1.2,0.9,1.8,2.9,2.6
c2.7,1,4,2.3,4,4.6c0,2.7-2.1,4.6-5.7,4.6c-1.7,0-3.2-0.4-4.3-1L716.9,313.1z"/>
<path class="st1" d="M744,308.1c0,5.7-3.9,8.1-7.6,8.1c-4.1,0-7.3-3-7.3-7.9c0-5.1,3.3-8.1,7.6-8.1C741,300.3,744,303.4,744,308.1z
M731.9,308.3c0,3.3,1.9,5.9,4.6,5.9c2.7,0,4.6-2.5,4.6-6c0-2.6-1.3-5.9-4.6-5.9C733.3,302.4,731.9,305.4,731.9,308.3z"/>
<path class="st1" d="M747.9,305.4c0-1.8-0.1-3.3-0.1-4.8h2.4l0.1,3h0.1c0.7-2,2.4-3.3,4.2-3.3c0.3,0,0.5,0.1,0.8,0.1v2.6
c-0.3-0.1-0.6-0.1-1-0.1c-2,0-3.3,1.5-3.7,3.6c-0.1,0.4-0.1,0.8-0.1,1.3v8.2h-2.7V305.4L747.9,305.4z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 285 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 342 KiB

View File

@@ -0,0 +1,62 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.1.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Server" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:#039BE5;}
.st1{opacity:0.1;fill:#FFFFFF;enable-background:new ;}
.st2{opacity:5.000000e-02;enable-background:new ;}
.st3{fill:#303C42;}
.st4{opacity:0.1;enable-background:new ;}
.st5{opacity:0.2;enable-background:new ;}
.st6{fill:#69B342;}
.st7{fill:#C6CDD1;}
.st8{fill:url(#SVGID_1_);}
.st9{fill:url(#SVGID_2_);}
.st10{fill:url(#SVGID_3_);}
</style>
<circle class="st0" cx="11.1" cy="11.1" r="9.2"/>
<path class="st1" d="M11.1,2c-3.8,0-7,2.3-8.4,5.5h16.8C18.1,4.2,14.9,2,11.1,2z"/>
<path class="st2" d="M2.7,14.8c1.4,3.2,4.6,5.5,8.4,5.5s7-2.3,8.4-5.5H2.7z"/>
<path class="st1" d="M7.5,11.1C7.5,6.1,8.6,2,11.1,2C6.1,2,2,6.1,2,11.1s4.1,9.2,9.2,9.2C8.6,20.3,7.5,16.2,7.5,11.1z"/>
<path class="st2" d="M11.1,2c2.5,0,3.7,4.1,3.7,9.2s-1.1,9.2-3.7,9.2c5.1,0,9.2-4.1,9.2-9.2S16.2,2,11.1,2z"/>
<path class="st3" d="M6.5,16.2h14.7V18H6.5V16.2z"/>
<path class="st4" d="M6.5,16.2h14.7V18H6.5V16.2z"/>
<path class="st3" d="M21.2,16.6H6.5c-0.5,0-0.9-0.4-0.9-0.9V13c0-0.5,0.4-0.9,0.9-0.9h14.7c0.5,0,0.9,0.4,0.9,0.9v2.7
C22.1,16.2,21.7,16.6,21.2,16.6z"/>
<path class="st1" d="M21.2,12.1H6.5c-0.5,0-0.9,0.4-0.9,0.9v0.2c0-0.5,0.4-0.9,0.9-0.9h14.7c0.5,0,0.9,0.4,0.9,0.9V13
C22.1,12.5,21.7,12.1,21.2,12.1z"/>
<path class="st5" d="M21.2,16.4H6.5c-0.5,0-0.9-0.4-0.9-0.9v0.2c0,0.5,0.4,0.9,0.9,0.9h14.7c0.5,0,0.9-0.4,0.9-0.9v-0.2
C22.1,16,21.7,16.4,21.2,16.4z"/>
<path class="st3" d="M21.2,22.1H6.5c-0.5,0-0.9-0.4-0.9-0.9v-2.7c0-0.5,0.4-0.9,0.9-0.9h14.7c0.5,0,0.9,0.4,0.9,0.9v2.7
C22.1,21.7,21.7,22.1,21.2,22.1z"/>
<circle class="st6" cx="19.8" cy="19.8" r="0.5"/>
<circle class="st6" cx="18" cy="19.8" r="0.5"/>
<circle class="st6" cx="16.2" cy="19.8" r="0.5"/>
<circle class="st7" cx="7.9" cy="19.8" r="0.9"/>
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="7.336" y1="6.7378" x2="8.3616" y2="5.7121" gradientTransform="matrix(1 0 0 -1 0 26)">
<stop offset="0" style="stop-color:#000000;stop-opacity:0.1"/>
<stop offset="1" style="stop-color:#000000;stop-opacity:0"/>
</linearGradient>
<circle class="st8" cx="7.9" cy="19.8" r="0.9"/>
<circle class="st6" cx="19.8" cy="14.3" r="0.5"/>
<circle class="st6" cx="18" cy="14.3" r="0.5"/>
<circle class="st6" cx="16.2" cy="14.3" r="0.5"/>
<path class="st1" d="M21.2,17.6H6.5c-0.5,0-0.9,0.4-0.9,0.9v0.2c0-0.5,0.4-0.9,0.9-0.9h14.7c0.5,0,0.9,0.4,0.9,0.9v-0.2
C22.1,18,21.7,17.6,21.2,17.6z"/>
<path class="st5" d="M21.2,21.9H6.5c-0.5,0-0.9-0.4-0.9-0.9v0.2c0,0.5,0.4,0.9,0.9,0.9h14.7c0.5,0,0.9-0.4,0.9-0.9V21
C22.1,21.5,21.7,21.9,21.2,21.9z"/>
<circle class="st7" cx="7.9" cy="14.3" r="0.9"/>
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="7.336" y1="12.2373" x2="8.3616" y2="11.2116" gradientTransform="matrix(1 0 0 -1 0 26)">
<stop offset="0" style="stop-color:#000000;stop-opacity:0.1"/>
<stop offset="1" style="stop-color:#000000;stop-opacity:0"/>
</linearGradient>
<circle class="st9" cx="7.9" cy="14.3" r="0.9"/>
<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="2.2175" y1="17.461" x2="23.5011" y2="7.5369" gradientTransform="matrix(1 0 0 -1 0 26)">
<stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.2"/>
<stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0"/>
</linearGradient>
<path class="st10" d="M22.1,15.7V13c0-0.5-0.4-0.9-0.9-0.9h-1c0-0.3,0-0.6,0-0.9c0-5.1-4.1-9.2-9.2-9.2S2,6.1,2,11.1
c0,3,1.4,5.6,3.7,7.3l0,0v2.7c0,0.5,0.4,0.9,0.9,0.9h14.7c0.5,0,0.9-0.4,0.9-0.9v-2.7c0-0.5-0.4-0.9-0.9-0.9v-0.9
C21.7,16.6,22.1,16.2,22.1,15.7z"/>
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.1.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Слой_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 200 200" style="enable-background:new 0 0 200 200;" xml:space="preserve">
<style type="text/css">
.st0{fill:#29A1DC;}
.st1{fill:#FFFFFF;}
</style>
<circle class="st0" cx="100.5" cy="99.8" r="92.2"/>
<path class="st1" d="M113.4,127.1c0.6,0.3,0.7,1,0.2,1.5c-3.1,2.8-6.6,5.2-10.3,7.1c-6.6,3.2-13.8,4.8-21,4.7
c-7.2-0.3-14.3-2.2-20.4-5.7s-11.3-8.5-15.1-14.4c-3.7-5.9-5.8-12.6-6.4-19.4c-0.4-6.8,0.8-13.7,3.5-19.8c1.5-3,3.1-5.9,5.2-8.5
c2.1-2.6,4.5-5,7.1-7c5.2-4,11.4-6.7,17.8-7.8c-6.3,1.5-12.2,4.6-16.9,8.9c-2.4,2.1-4.5,4.5-6.2,7.1c-1.8,2.6-3.1,5.5-4.3,8.4
c-2.1,5.9-2.7,12.2-1.9,18.3c0.9,6.1,3.3,11.8,6.8,16.7c3.6,4.8,8.4,8.7,13.7,11.3c5.3,2.5,11.3,3.7,17,3.4c5.8-0.3,11.4-2,16.3-4.9
c1.9-1.2,3.8-2.5,5.4-4c0.3-0.3,0.7-0.3,1-0.1L113.4,127.1z"/>
<path class="st1" d="M131.5,143.1c0.4,0.4,0.3,1.1-0.1,1.4c-0.2,0.2-0.4,0.4-0.6,0.6c-2.6,2.3-5.4,4.4-8.3,6.3c-2.9,1.9-6,3.5-9.2,5
c-3.2,1.4-6.4,2.6-9.8,3.5c-13.3,3.6-27.7,2.9-40.4-1.9c-12.8-4.8-23.8-13.5-31.2-24.7c-7.4-11.1-11-24.4-10.6-37.6
c0.4-13.1,5.2-25.9,13.2-36.1c7.9-10.2,19-17.7,31.3-21.2c12.2-3.5,25.4-3.2,37.2,1c5.9,2.1,11.4,5.1,16.3,8.8s9.2,8.2,12.7,13.3
c-3.8-4.8-8.3-9-13.4-12.4c-5-3.4-10.6-6-16.4-7.7c-11.6-3.4-24.1-2.9-35.2,1c-11.2,3.9-20.9,11.4-27.5,21
c-6.6,9.5-10.1,21-9.8,32.4c0.3,11.4,4.2,22.6,10.9,31.5c6.7,8.9,16.3,15.5,26.7,18.7c10.5,3.3,21.8,3.1,32-0.3
c8.1-2.7,15.4-7.4,21.2-13.6c0.4-0.4,1.1-0.5,1.5-0.1c0.6,0.6,1.3,1.3,1.8,1.9C123.8,134,129.5,140.8,131.5,143.1z"/>
<path class="st1" d="M171.3,74.2l-35.9,43.7l2,4.1l4.1,8.6c0.7,1.5,0.4,3.3-0.8,4.5l-2.9,2.7c-0.2,0.2-0.4,0.2-0.7,0.2
c-0.1,0-0.2-0.1-0.3-0.2c0,0-0.1,0-0.1-0.1l-7.9-9.4c-0.8-0.9-1.6-1.8-2.5-2.6c-0.7-0.6-1.3-1.2-2.1-1.8c-1.4-1.1-2.9-2.2-4.6-3
c-0.3-0.2-0.5-0.3-0.8-0.4l-9.3-4.8l-1.7-0.9c-0.3-0.2-0.5-0.6-0.3-1l2-3.4c0.9-1.5,2.6-2.2,4.2-1.8l13.8,3.1l14-18.1L112.9,81
c-0.4-0.2-0.5-0.7-0.3-1l4.5-5.6c1.8-2.3,4.8-3.4,7.7-3l30.3,5.1l7.5-9.6c1.7-2.2,3.9-3.9,6.4-5l3.5-1.5c0.5-0.2,1-0.2,1.4-0.1
c0.3,0.1,0.5,0.2,0.7,0.3l0,0c0.5,0.5,0.9,1.2,0.7,2l-0.6,3.7C174.4,69.2,173.1,71.9,171.3,74.2z"/>
<g>
<path class="st1" d="M175.6,119.1l-4.5,5.6c-0.2,0.2-0.5,0.3-0.7,0.2c-0.1,0-0.3-0.1-0.4-0.3l-17.3-23.3l13.5-16.1l10.6,25.8
C177.9,113.7,177.5,116.8,175.6,119.1z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -0,0 +1,63 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.1.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Server" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:#D9DBDC;}
.st1{opacity:0.1;fill:#010101;enable-background:new ;}
.st2{opacity:0.2;fill:#FFFFFF;enable-background:new ;}
.st3{fill:#818181;}
.st4{fill:url(#SVGID_1_);}
.st5{fill:url(#SVGID_2_);}
.st6{fill:#333333;}
.st7{opacity:5.000000e-02;fill:#FFFFFF;enable-background:new ;}
.st8{fill:url(#SVGID_3_);}
.st9{fill:url(#SVGID_4_);}
.st10{fill:#00425A;}
.st11{fill:#27A0DA;}
</style>
<path class="st0" d="M1.1,14.7v1.8c0,1,0.8,1.8,1.8,1.8h6.4c0,0.7-0.2,1.9-0.6,2.5c-0.2,0.2-0.5,0.3-0.7,0.3s-0.5,0.2-0.5,0.5
S7.6,22,7.9,22h8.2c0.3,0,0.5-0.2,0.5-0.5s-0.2-0.5-0.5-0.5c-0.3,0-0.5-0.1-0.7-0.3c-0.5-0.5-0.6-1.7-0.6-2.5h6.4
c1,0,1.8-0.8,1.8-1.8v-1.8H1.1z"/>
<path class="st1" d="M21.1,18.2H2.9c-1,0-1.8-0.8-1.8-1.8v0.2c0,1,0.8,1.8,1.8,1.8h18.2c1,0,1.8-0.8,1.8-1.8v-0.3
C22.9,17.3,22.1,18.2,21.1,18.2z"/>
<path class="st2" d="M7.9,21.3h8.2c0.2,0,0.4,0.2,0.5,0.4v-0.1c0-0.3-0.2-0.5-0.5-0.5H7.9c-0.3-0.1-0.5,0.1-0.5,0.4v0.1
C7.6,21.4,7.7,21.3,7.9,21.3z"/>
<path class="st3" d="M12,17.7c-0.4,0-0.6-0.4-0.6-0.7c0-0.4,0.3-0.6,0.6-0.6s0.6,0.4,0.6,0.7C12.6,17.3,12.4,17.6,12,17.7z"/>
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="11.3652" y1="-732.7223" x2="12.6001" y2="-733.298" gradientTransform="matrix(1 0 0 -1 0 -716)">
<stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.2"/>
<stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0"/>
</linearGradient>
<path class="st4" d="M12,17.7c-0.4,0-0.6-0.4-0.6-0.7c0-0.4,0.3-0.6,0.6-0.6s0.6,0.4,0.6,0.7C12.6,17.3,12.4,17.6,12,17.7z"/>
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="10.8905" y1="-733.225" x2="14.6633" y2="-736.9988" gradientTransform="matrix(1 0 0 -1 0 -716)">
<stop offset="0" style="stop-color:#010101;stop-opacity:0.1"/>
<stop offset="1" style="stop-color:#010101;stop-opacity:0"/>
</linearGradient>
<path class="st5" d="M15.4,20.8c-0.5-0.5-0.6-1.7-0.6-2.5H9.3l2.7,2.7h4.1C15.8,21.1,15.5,21,15.4,20.8z"/>
<path class="st6" d="M22.9,3.8c0-1-0.8-1.8-1.8-1.8H2.9c-1,0-1.8,0.8-1.8,1.8v11.8h21.8V3.8z"/>
<path class="st7" d="M2.9,2.3h18.2c1,0,1.8,0.8,1.8,1.8V3.8c0-1-0.8-1.8-1.8-1.8H2.9c-1,0-1.8,0.8-1.8,1.8v0.3
C1.1,3,1.9,2.3,2.9,2.3z"/>
<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="0.2378" y1="-721.2634" x2="23.3135" y2="-732.0244" gradientTransform="matrix(1 0 0 -1 0 -716)">
<stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.2"/>
<stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0"/>
</linearGradient>
<path class="st8" d="M21.1,2H2.9c-1,0-1.8,0.8-1.8,1.8v12.7c0,1,0.8,1.8,1.8,1.8h6.4c0,0.7-0.2,1.9-0.6,2.5
c-0.2,0.2-0.5,0.3-0.7,0.3s-0.5,0.2-0.5,0.5S7.6,22,7.9,22h8.2c0.3,0,0.5-0.2,0.5-0.5s-0.2-0.5-0.5-0.5c-0.3,0-0.5-0.1-0.7-0.3
c-0.5-0.5-0.6-1.7-0.6-2.5h6.4c1,0,1.8-0.8,1.8-1.8V3.8C22.9,2.8,22.1,2,21.1,2z"/>
<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="1.7228" y1="746.1478" x2="22.4117" y2="755.7944" gradientTransform="matrix(1 0 0 1 0 -742)">
<stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.2"/>
<stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0"/>
</linearGradient>
<path class="st9" d="M22,3.7c0-0.5-0.4-0.8-0.7-0.8H2.7C2.4,2.9,2,3.3,2,3.7v11h20V3.7z"/>
<path class="st10" d="M6.7,13.8c-0.3,0-0.5-0.1-0.6-0.3c-0.4-0.4-0.4-1,0-1.4l3.1-3.1L6.1,5.9c-0.4-0.4-0.4-1,0-1.4
c0.4-0.4,1-0.4,1.4,0l3.8,3.8c0.4,0.4,0.4,1,0,1.4l-3.8,3.8C7.3,13.7,7,13.8,6.7,13.8z M17.3,13.8h-4.7c-0.5,0-0.9-0.5-0.9-0.9
s0.5-0.9,0.9-0.9h4.7c0.5,0,0.9,0.5,0.9,0.9S17.7,13.8,17.3,13.8z"/>
<g>
<path class="st11" d="M6.7,13.3c-0.3,0-0.5-0.1-0.6-0.3c-0.4-0.4-0.4-1,0-1.4l3.1-3.1L6.1,5.4c-0.4-0.4-0.4-1,0-1.4
c0.4-0.4,1-0.4,1.4,0l3.8,3.8c0.4,0.4,0.4,1,0,1.4l-3.8,3.8C7.3,13.2,7,13.3,6.7,13.3z"/>
</g>
<g>
<path class="st11" d="M17.3,13.3h-4.7c-0.5,0-0.9-0.5-0.9-0.9c0-0.5,0.5-0.9,0.9-0.9h4.7c0.5,0,0.9,0.5,0.9,0.9
S17.7,13.3,17.3,13.3z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

@@ -0,0 +1,63 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.1.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Server" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:#303C42;}
.st1{opacity:0.1;enable-background:new ;}
.st2{opacity:0.2;enable-background:new ;}
.st3{opacity:0.1;fill:#FFFFFF;enable-background:new ;}
.st4{fill:#428EB3;}
.st5{fill:#C6CDD1;}
.st6{fill:url(#SVGID_1_);}
.st7{fill:url(#SVGID_2_);}
.st8{fill:#29A1DC;}
.st9{opacity:0.2;fill:#FFFFFF;enable-background:new ;}
.st10{fill:url(#SVGID_3_);}
</style>
<path class="st0" d="M2,7.5h18.2v2.7H2V7.5z"/>
<path class="st1" d="M2,7.5h18.2v2.7H2V7.5z"/>
<path class="st0" d="M1.1,3.8v3.6C1.1,8,1.5,8.4,2,8.4h18.2c0.5,0,0.9-0.4,0.9-0.9V3.8c0-0.5-0.4-0.9-0.9-0.9H2
C1.5,2.9,1.1,3.3,1.1,3.8z"/>
<path class="st2" d="M20.2,8.1H2c-0.5,0-0.9-0.4-0.9-0.9v0.2C1.1,8,1.5,8.4,2,8.4h18.2c0.5,0,0.9-0.4,0.9-0.9V7.2
C21.1,7.7,20.7,8.1,20.2,8.1z"/>
<path class="st3" d="M20.2,2.9H2c-0.5,0-0.9,0.4-0.9,0.9v0.2c0-0.5,0.4-0.9,0.9-0.9h18.2c0.5,0,0.9,0.4,0.9,0.9V3.8
C21.1,3.3,20.7,2.9,20.2,2.9z"/>
<circle class="st4" cx="17.9" cy="5.6" r="0.5"/>
<circle class="st4" cx="16.1" cy="5.6" r="0.5"/>
<circle class="st4" cx="14.3" cy="5.6" r="0.5"/>
<circle class="st5" cx="4.7" cy="5.6" r="0.9"/>
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="4.1628" y1="20.9292" x2="5.1788" y2="19.9133" gradientTransform="matrix(1 0 0 -1 0 26)">
<stop offset="0" style="stop-color:#000000;stop-opacity:0.1"/>
<stop offset="1" style="stop-color:#000000;stop-opacity:0"/>
</linearGradient>
<circle class="st6" cx="4.7" cy="5.6" r="0.9"/>
<path class="st0" d="M1.1,10.2v3.6c0,0.5,0.4,0.9,0.9,0.9h18.2c0.5,0,0.9-0.4,0.9-0.9v-3.6c0-0.5-0.4-0.9-0.9-0.9H2
C1.5,9.3,1.1,9.7,1.1,10.2z"/>
<path class="st2" d="M20.2,14.5H2c-0.5,0-0.9-0.4-0.9-0.9v0.2c0,0.5,0.4,0.9,0.9,0.9h18.2c0.5,0,0.9-0.4,0.9-0.9v-0.2
C21.1,14.1,20.7,14.5,20.2,14.5z"/>
<path class="st3" d="M20.2,9.3H2c-0.5,0-0.9,0.4-0.9,0.9v0.2c0-0.5,0.4-0.9,0.9-0.9h18.2c0.5,0,0.9,0.4,0.9,0.9v-0.2
C21.1,9.7,20.7,9.3,20.2,9.3z"/>
<circle class="st4" cx="17.9" cy="12" r="0.5"/>
<circle class="st4" cx="16.1" cy="12" r="0.5"/>
<circle class="st4" cx="14.3" cy="12" r="0.5"/>
<circle class="st5" cx="4.7" cy="12" r="0.9"/>
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="4.1628" y1="14.5738" x2="5.1788" y2="13.5578" gradientTransform="matrix(1 0 0 -1 0 26)">
<stop offset="0" style="stop-color:#000000;stop-opacity:0.1"/>
<stop offset="1" style="stop-color:#000000;stop-opacity:0"/>
</linearGradient>
<circle class="st7" cx="4.7" cy="12" r="0.9"/>
<path class="st8" d="M22.4,13.8h-4.4l-0.9-0.9h-3.8c-0.3,0-0.5,0.2-0.5,0.5v7.3c0,0.3,0.2,0.5,0.5,0.5h9.1c0.3,0,0.5-0.2,0.5-0.5
v-6.4C22.9,14,22.7,13.8,22.4,13.8z"/>
<path class="st9" d="M22.4,13.8h-4.4l-0.9-0.9h-3.8c-0.3,0-0.5,0.2-0.5,0.5v0.2c0-0.3,0.2-0.5,0.5-0.5h3.8l0.9,0.9h4.4
c0.3,0,0.5,0.2,0.5,0.5v-0.2C22.9,14,22.7,13.8,22.4,13.8z"/>
<path class="st1" d="M22.4,20.9h-9.1c-0.3,0-0.5-0.2-0.5-0.5v0.2c0,0.3,0.2,0.5,0.5,0.5h9.1c0.3,0,0.5-0.2,0.5-0.5v-0.2
C22.9,20.6,22.7,20.9,22.4,20.9z"/>
<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="0.7043" y1="21.5139" x2="25.1518" y2="10.1132" gradientTransform="matrix(1 0 0 -1 0 26)">
<stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.2"/>
<stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0"/>
</linearGradient>
<path class="st10" d="M22.4,13.8h-1.4v-3.6c0-0.5-0.4-0.9-0.9-0.9V8.4c0.5,0,0.9-0.4,0.9-0.9V3.8c0-0.5-0.4-0.9-0.9-0.9H2
c-0.5,0-0.9,0.4-0.9,0.9v3.6C1.1,8,1.5,8.4,2,8.4v0.9c-0.5,0-0.9,0.4-0.9,0.9v3.6c0,0.5,0.4,0.9,0.9,0.9h10.9v5.9
c0,0.3,0.2,0.5,0.5,0.5h9.1c0.3,0,0.5-0.2,0.5-0.5v-6.4C22.9,14,22.7,13.8,22.4,13.8z"/>
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 248 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 245 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 281 KiB

View File

@@ -0,0 +1,380 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.1.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Server" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;}
.st1{fill:#173E51;}
.st2{fill:#51BCF0;}
.st3{fill:#29A1DC;}
.st4{fill:#1381B7;}
.st5{fill:#D1D6D8;}
.st6{fill:#C0C2C3;}
.st7{fill:url(#SVGID_24_);}
.st8{fill:#CECECE;}
.st9{fill:#727272;}
.st10{fill:url(#SVGID_25_);}
.st11{fill:url(#SVGID_26_);}
.st12{fill:url(#SVGID_27_);}
.st13{fill:url(#SVGID_28_);}
.st14{fill:url(#SVGID_29_);}
.st15{fill:url(#SVGID_30_);}
.st16{fill:url(#SVGID_31_);}
.st17{fill:url(#SVGID_32_);}
.st18{fill:url(#SVGID_33_);}
.st19{fill:url(#SVGID_34_);}
.st20{fill:url(#SVGID_35_);}
.st21{fill:url(#SVGID_36_);}
.st22{fill:url(#SVGID_37_);}
.st23{fill:url(#SVGID_38_);}
.st24{fill:url(#SVGID_39_);}
.st25{fill:url(#SVGID_40_);}
.st26{fill:url(#SVGID_41_);}
.st27{fill:url(#SVGID_42_);}
.st28{fill:url(#SVGID_43_);}
.st29{fill:url(#SVGID_44_);}
.st30{fill:url(#SVGID_45_);}
.st31{fill:url(#SVGID_46_);}
</style>
<pattern y="24" width="103.5" height="99" patternUnits="userSpaceOnUse" id="SVGID_1_" viewBox="0 -99 103.5 99" style="overflow:visible;">
<g>
<rect y="-99" class="st0" width="103.5" height="99"/>
<g>
<rect y="-99" class="st0" width="103.5" height="99"/>
<path class="st0" d="M0-99h103.5V0H0V-99z"/>
<path class="st1" d="M0-99h103.5V0H0V-99z"/>
</g>
</g>
</pattern>
<pattern y="24" width="37.5" height="40.5" patternUnits="userSpaceOnUse" id="SVGID_10_" viewBox="0 -40.5 37.5 40.5" style="overflow:visible;">
<g>
<rect y="-40.5" class="st0" width="37.5" height="40.5"/>
<g>
<rect y="-40.5" class="st0" width="37.5" height="40.5"/>
<path class="st0" d="M0-40.5h37.5V0H0V-40.5z"/>
<path class="st2" d="M0-40.5h37.5V0H0V-40.5z"/>
</g>
</g>
</pattern>
<pattern y="24" width="103.5" height="99" patternUnits="userSpaceOnUse" id="SVGID_11_" viewBox="0 -99 103.5 99" style="overflow:visible;">
<g>
<rect y="-99" class="st0" width="103.5" height="99"/>
<g>
<rect y="-99" class="st0" width="103.5" height="99"/>
<path class="st0" d="M0-99h103.5V0H0V-99z"/>
<path class="st1" d="M0-99h103.5V0H0V-99z"/>
</g>
</g>
</pattern>
<pattern y="24" width="37.5" height="40.5" patternUnits="userSpaceOnUse" id="SVGID_12_" viewBox="0 -40.5 37.5 40.5" style="overflow:visible;">
<g>
<rect y="-40.5" class="st0" width="37.5" height="40.5"/>
<g>
<rect y="-40.5" class="st0" width="37.5" height="40.5"/>
<path class="st0" d="M0-40.5h37.5V0H0V-40.5z"/>
<path class="st2" d="M0-40.5h37.5V0H0V-40.5z"/>
</g>
</g>
</pattern>
<pattern y="24" width="103.5" height="99" patternUnits="userSpaceOnUse" id="SVGID_13_" viewBox="0 -99 103.5 99" style="overflow:visible;">
<g>
<rect y="-99" class="st0" width="103.5" height="99"/>
<g>
<rect y="-99" class="st0" width="103.5" height="99"/>
<path class="st0" d="M0-99h103.5V0H0V-99z"/>
<path class="st1" d="M0-99h103.5V0H0V-99z"/>
</g>
</g>
</pattern>
<pattern y="24" width="37.5" height="40.5" patternUnits="userSpaceOnUse" id="SVGID_14_" viewBox="0 -40.5 37.5 40.5" style="overflow:visible;">
<g>
<rect y="-40.5" class="st0" width="37.5" height="40.5"/>
<g>
<rect y="-40.5" class="st0" width="37.5" height="40.5"/>
<path class="st0" d="M0-40.5h37.5V0H0V-40.5z"/>
<path class="st2" d="M0-40.5h37.5V0H0V-40.5z"/>
</g>
</g>
</pattern>
<pattern y="24" width="103.5" height="99" patternUnits="userSpaceOnUse" id="SVGID_15_" viewBox="0 -99 103.5 99" style="overflow:visible;">
<g>
<rect y="-99" class="st0" width="103.5" height="99"/>
<g>
<rect y="-99" class="st0" width="103.5" height="99"/>
<path class="st0" d="M0-99h103.5V0H0V-99z"/>
<path class="st1" d="M0-99h103.5V0H0V-99z"/>
</g>
</g>
</pattern>
<pattern y="24" width="103.5" height="99" patternUnits="userSpaceOnUse" id="SVGID_16_" viewBox="0 -99 103.5 99" style="overflow:visible;">
<g>
<rect y="-99" class="st0" width="103.5" height="99"/>
<g>
<rect y="-99" class="st0" width="103.5" height="99"/>
<path class="st0" d="M0-99h103.5V0H0V-99z"/>
<path class="st1" d="M0-99h103.5V0H0V-99z"/>
</g>
</g>
</pattern>
<pattern y="24" width="103.5" height="99" patternUnits="userSpaceOnUse" id="SVGID_17_" viewBox="0 -99 103.5 99" style="overflow:visible;">
<g>
<rect y="-99" class="st0" width="103.5" height="99"/>
<g>
<rect y="-99" class="st0" width="103.5" height="99"/>
<path class="st0" d="M0-99h103.5V0H0V-99z"/>
<path class="st1" d="M0-99h103.5V0H0V-99z"/>
</g>
</g>
</pattern>
<pattern y="24" width="103.5" height="99" patternUnits="userSpaceOnUse" id="SVGID_18_" viewBox="0 -99 103.5 99" style="overflow:visible;">
<g>
<rect y="-99" class="st0" width="103.5" height="99"/>
<g>
<rect y="-99" class="st0" width="103.5" height="99"/>
<path class="st0" d="M0-99h103.5V0H0V-99z"/>
<path class="st1" d="M0-99h103.5V0H0V-99z"/>
</g>
</g>
</pattern>
<pattern y="24" width="103.5" height="99" patternUnits="userSpaceOnUse" id="SVGID_19_" viewBox="0 -99 103.5 99" style="overflow:visible;">
<g>
<rect y="-99" class="st0" width="103.5" height="99"/>
<g>
<rect y="-99" class="st0" width="103.5" height="99"/>
<path class="st0" d="M0-99h103.5V0H0V-99z"/>
<path class="st1" d="M0-99h103.5V0H0V-99z"/>
</g>
</g>
</pattern>
<pattern y="24" width="37.5" height="40.5" patternUnits="userSpaceOnUse" id="SVGID_2_" viewBox="0 -40.5 37.5 40.5" style="overflow:visible;">
<g>
<rect y="-40.5" class="st0" width="37.5" height="40.5"/>
<g>
<rect y="-40.5" class="st0" width="37.5" height="40.5"/>
<path class="st0" d="M0-40.5h37.5V0H0V-40.5z"/>
<path class="st3" d="M0-40.5h37.5V0H0V-40.5z"/>
</g>
</g>
</pattern>
<pattern y="24" width="37.5" height="40.5" patternUnits="userSpaceOnUse" id="SVGID_20_" viewBox="0 -40.5 37.5 40.5" style="overflow:visible;">
<g>
<rect y="-40.5" class="st0" width="37.5" height="40.5"/>
<g>
<rect y="-40.5" class="st0" width="37.5" height="40.5"/>
<path class="st0" d="M0-40.5h37.5V0H0V-40.5z"/>
<path class="st3" d="M0-40.5h37.5V0H0V-40.5z"/>
</g>
</g>
</pattern>
<pattern y="24" width="37.5" height="40.5" patternUnits="userSpaceOnUse" id="SVGID_21_" viewBox="0 -40.5 37.5 40.5" style="overflow:visible;">
<g>
<rect y="-40.5" class="st0" width="37.5" height="40.5"/>
<g>
<rect y="-40.5" class="st0" width="37.5" height="40.5"/>
<path class="st0" d="M0-40.5h37.5V0H0V-40.5z"/>
<path class="st4" d="M0-40.5h37.5V0H0V-40.5z"/>
</g>
</g>
</pattern>
<pattern y="24" width="37.5" height="40.5" patternUnits="userSpaceOnUse" id="SVGID_22_" viewBox="0 -40.5 37.5 40.5" style="overflow:visible;">
<g>
<rect y="-40.5" class="st0" width="37.5" height="40.5"/>
<g>
<rect y="-40.5" class="st0" width="37.5" height="40.5"/>
<path class="st0" d="M0-40.5h37.5V0H0V-40.5z"/>
<path class="st5" d="M0-40.5h37.5V0H0V-40.5z"/>
</g>
</g>
</pattern>
<pattern y="24" width="37.5" height="40.5" patternUnits="userSpaceOnUse" id="SVGID_23_" viewBox="0 -40.5 37.5 40.5" style="overflow:visible;">
<g>
<rect y="-40.5" class="st0" width="37.5" height="40.5"/>
<g>
<rect y="-40.5" class="st0" width="37.5" height="40.5"/>
<path class="st0" d="M0-40.5h37.5V0H0V-40.5z"/>
<path class="st2" d="M0-40.5h37.5V0H0V-40.5z"/>
</g>
</g>
</pattern>
<pattern y="24" width="37.5" height="40.5" patternUnits="userSpaceOnUse" id="SVGID_3_" viewBox="0 -40.5 37.5 40.5" style="overflow:visible;">
<g>
<rect y="-40.5" class="st0" width="37.5" height="40.5"/>
<g>
<rect y="-40.5" class="st0" width="37.5" height="40.5"/>
<path class="st0" d="M0-40.5h37.5V0H0V-40.5z"/>
<path class="st4" d="M0-40.5h37.5V0H0V-40.5z"/>
</g>
</g>
</pattern>
<pattern y="24" width="103.5" height="99" patternUnits="userSpaceOnUse" id="SVGID_4_" viewBox="0 -99 103.5 99" style="overflow:visible;">
<g>
<rect y="-99" class="st0" width="103.5" height="99"/>
<g>
<rect y="-99" class="st0" width="103.5" height="99"/>
<path class="st0" d="M0-99h103.5V0H0V-99z"/>
<path class="st1" d="M0-99h103.5V0H0V-99z"/>
</g>
</g>
</pattern>
<pattern y="24" width="37.5" height="40.5" patternUnits="userSpaceOnUse" id="SVGID_5_" viewBox="0 -40.5 37.5 40.5" style="overflow:visible;">
<g>
<rect y="-40.5" class="st0" width="37.5" height="40.5"/>
<g>
<rect y="-40.5" class="st0" width="37.5" height="40.5"/>
<path class="st0" d="M0-40.5h37.5V0H0V-40.5z"/>
<path class="st5" d="M0-40.5h37.5V0H0V-40.5z"/>
</g>
</g>
</pattern>
<pattern y="24" width="37.5" height="40.5" patternUnits="userSpaceOnUse" id="SVGID_6_" viewBox="0 -40.5 37.5 40.5" style="overflow:visible;">
<g>
<rect y="-40.5" class="st0" width="37.5" height="40.5"/>
<g>
<rect y="-40.5" class="st0" width="37.5" height="40.5"/>
<path class="st0" d="M0-40.5h37.5V0H0V-40.5z"/>
<path class="st6" d="M0-40.5h37.5V0H0V-40.5z"/>
</g>
</g>
</pattern>
<pattern y="24" width="103.5" height="99" patternUnits="userSpaceOnUse" id="SVGID_7_" viewBox="0 -99 103.5 99" style="overflow:visible;">
<g>
<rect y="-99" class="st0" width="103.5" height="99"/>
<g>
<rect y="-99" class="st0" width="103.5" height="99"/>
<path class="st0" d="M0-99h103.5V0H0V-99z"/>
<path class="st1" d="M0-99h103.5V0H0V-99z"/>
</g>
</g>
</pattern>
<pattern y="24" width="37.5" height="40.5" patternUnits="userSpaceOnUse" id="SVGID_8_" viewBox="0 -40.5 37.5 40.5" style="overflow:visible;">
<g>
<rect y="-40.5" class="st0" width="37.5" height="40.5"/>
<g>
<rect y="-40.5" class="st0" width="37.5" height="40.5"/>
<path class="st0" d="M0-40.5h37.5V0H0V-40.5z"/>
<path class="st2" d="M0-40.5h37.5V0H0V-40.5z"/>
</g>
</g>
</pattern>
<pattern y="24" width="103.5" height="99" patternUnits="userSpaceOnUse" id="SVGID_9_" viewBox="0 -99 103.5 99" style="overflow:visible;">
<g>
<rect y="-99" class="st0" width="103.5" height="99"/>
<g>
<rect y="-99" class="st0" width="103.5" height="99"/>
<path class="st0" d="M0-99h103.5V0H0V-99z"/>
<path class="st1" d="M0-99h103.5V0H0V-99z"/>
</g>
</g>
</pattern>
<pattern id="SVGID_24_" xlink:href="#SVGID_1_" patternTransform="matrix(1 0 0 1 -636.654 15918.918)">
</pattern>
<path class="st7" d="M15.9,4.3h-1.6V4c0-0.4-0.3-0.7-0.8-0.7h-1.6c-0.1,0-0.2,0-0.2-0.1c0-0.1,0-0.3-0.1-0.4
c-0.2-0.5-0.7-0.9-1.3-0.9C9.9,1.8,9.4,2,9,2.3c-0.3,0.3-0.5,0.6-0.5,1c0,0,0,0,0,0c0,0-0.1,0-0.1,0H6.8C6.4,3.3,6,3.6,6,4v0.3H4.5
C3.7,4.3,3,4.9,3,5.8v14.6c0,0.8,0.7,1.5,1.5,1.5h11.4c0.8,0,1.5-0.7,1.5-1.5V5.8C17.4,4.9,16.7,4.3,15.9,4.3z M6.7,4
c0,0,0.1-0.1,0.2-0.1h1.6c0.2,0,0.4-0.1,0.6-0.2c0.1-0.1,0.2-0.3,0.2-0.5l0,0c0-0.2,0.1-0.3,0.3-0.5c0.3-0.2,0.6-0.3,0.9-0.3
c0.3,0.1,0.7,0.3,0.8,0.6c0,0.1,0,0.1,0,0.2c0,0.2,0.1,0.3,0.2,0.4c0.2,0.2,0.3,0.3,0.6,0.3h1.6c0.1,0,0.2,0.1,0.2,0.1v1.2
c0,0-0.1,0.1-0.2,0.1H6.8c-0.1,0-0.1,0-0.2-0.1C6.7,5.2,6.7,4,6.7,4z M16.8,20.4c0,0.5-0.4,0.9-0.9,0.9H4.5c0,0-0.1,0-0.1,0
s0,0-0.1,0s-0.1,0-0.1,0c0,0-0.1,0-0.1,0S4,21.2,4,21.1c0,0-0.1-0.1-0.1-0.1c0,0-0.1-0.1-0.1-0.1c0,0,0-0.1-0.1-0.1
c0,0-0.1-0.1-0.1-0.1c-0.1-0.1-0.1-0.3-0.1-0.4V5.8c0-0.5,0.4-0.9,0.9-0.9h1.6v0.3c0,0.4,0.3,0.7,0.8,0.7h6.7c0.4,0,0.8-0.3,0.8-0.7
V4.9h1.6c0.2,0,0.3,0,0.4,0.1l0,0c0.1,0,0.1,0.1,0.2,0.1c0,0,0,0,0.1,0.1c0.1,0.1,0.1,0.1,0.1,0.2c0,0,0,0.1,0.1,0.1
c0,0,0,0.1,0,0.1c0,0,0,0.1,0,0.1s0,0,0,0.1s0,0.1,0,0.1L16.8,20.4L16.8,20.4z"/>
<path class="st8" d="M16.8,5.7C16.8,5.7,16.8,5.7,16.8,5.7c0-0.1,0-0.1,0-0.2c0,0,0-0.1,0-0.1c0,0,0-0.1-0.1-0.1
c0-0.1-0.1-0.1-0.1-0.2C16.5,5.1,16.4,5,16.3,5l0,0c-0.1-0.1-0.3-0.1-0.4-0.1h-1.6v0.3c0,0.4-0.3,0.7-0.8,0.7H6.8
c-0.4,0-0.8-0.3-0.8-0.7V4.9H4.5C4,4.9,3.6,5.3,3.6,5.8v14.6c0,0.2,0,0.3,0.1,0.4c0,0,0,0.1,0.1,0.1c0,0.1,0,0.1,0.1,0.1
c0,0,0.1,0.1,0.1,0.1c0,0,0.1,0.1,0.1,0.1c0,0,0.1,0,0.1,0.1c0.1,0,0.1,0,0.1,0.1c0,0,0.1,0,0.1,0s0,0,0.1,0s0.1,0,0.1,0h11.4
c0.5,0,0.9-0.4,0.9-0.9L16.8,5.7C16.8,5.7,16.8,5.7,16.8,5.7z M4.6,6.9c0-0.2,0.1-0.3,0.3-0.3h10.7c0.2,0,0.3,0.1,0.3,0.3v13.3
c0,0.2-0.1,0.3-0.3,0.3H4.8c-0.2,0-0.3-0.1-0.3-0.3L4.6,6.9L4.6,6.9z"/>
<path class="st9" d="M16.8,5.8v14.6c0,0.5-0.4,0.9-0.9,0.9H4.5c-0.3,0-0.7-0.2-0.8-0.5c0.1,0.1,0.3,0.1,0.4,0.1h11.4
c0.5,0,0.9-0.4,0.9-0.9V5.4c0-0.2,0-0.3-0.1-0.4C16.6,5.1,16.8,5.4,16.8,5.8z"/>
<pattern id="SVGID_25_" xlink:href="#SVGID_2_" patternTransform="matrix(1 0 0 1 -585.044 15869.5332)">
</pattern>
<path class="st10" d="M13.7,4v1.2c0,0-0.1,0.1-0.2,0.1H6.8c-0.1,0-0.1,0-0.2-0.1V4c0,0,0.1-0.1,0.2-0.1h1.6c0.2,0,0.4-0.1,0.6-0.2
c0.1-0.1,0.2-0.3,0.2-0.5l0,0c0-0.2,0.1-0.3,0.3-0.5c0.3-0.2,0.6-0.3,0.9-0.3c0.3,0.1,0.7,0.3,0.8,0.6c0,0.1,0,0.1,0,0.2
c0,0.2,0.1,0.3,0.2,0.4c0.2,0.2,0.3,0.3,0.6,0.3L13.7,4C13.7,3.9,13.7,4,13.7,4z"/>
<pattern id="SVGID_26_" xlink:href="#SVGID_3_" patternTransform="matrix(1 0 0 1 -585.044 15869.5332)">
</pattern>
<path class="st11" d="M13.7,4v1.2c0,0-0.1,0.1-0.2,0.1H6.8c-0.1,0-0.1,0-0.2-0.1V4.8H13c0.1,0,0.2,0,0.2-0.1V3.9h0.4
C13.7,3.9,13.7,4,13.7,4z"/>
<pattern id="SVGID_27_" xlink:href="#SVGID_4_" patternTransform="matrix(1 0 0 1 -636.654 15918.918)">
</pattern>
<path class="st12" d="M15.5,6.6H4.8c-0.2,0-0.3,0.1-0.3,0.3v13.3c0,0.2,0.1,0.3,0.3,0.3h10.7c0.2,0,0.3-0.1,0.3-0.3V6.9
C15.9,6.7,15.7,6.6,15.5,6.6L15.5,6.6z M15.2,19.9H5.2V7.2h10.1V19.9z"/>
<pattern id="SVGID_28_" xlink:href="#SVGID_5_" patternTransform="matrix(1 0 0 1 -585.044 15869.5332)">
</pattern>
<path class="st13" d="M5.2,7.2v12.7h10.1V7.2H5.2z M8.6,18.8c0,0.2-0.1,0.3-0.3,0.3H6.8c-0.2,0-0.3-0.1-0.3-0.3v-1.5
c0-0.2,0.1-0.3,0.3-0.3h1.5c0.2,0,0.3,0.1,0.3,0.3V18.8z M8.6,15.8c0,0.2-0.1,0.3-0.3,0.3H6.8c-0.2,0-0.3-0.1-0.3-0.3v-1.5
c0-0.2,0.1-0.3,0.3-0.3h1.5c0.2,0,0.3,0.1,0.3,0.3V15.8z M8.6,12.8c0,0.2-0.1,0.3-0.3,0.3H6.8c-0.2,0-0.3-0.1-0.3-0.3v-1.5
c0-0.2,0.1-0.3,0.3-0.3h1.5c0.2,0,0.3,0.1,0.3,0.3V12.8z M8.6,9.8c0,0.2-0.1,0.3-0.3,0.3H6.8c-0.2,0-0.3-0.1-0.3-0.3V8.2
c0-0.2,0.1-0.3,0.3-0.3h1.5c0.2,0,0.3,0.1,0.3,0.3V9.8z M13.6,18.4H9.5c-0.2,0-0.3-0.1-0.3-0.3c0-0.2,0.1-0.3,0.3-0.3h4.1
c0.2,0,0.3,0.1,0.3,0.3C13.9,18.2,13.7,18.4,13.6,18.4z M13.6,15.4H9.5c-0.2,0-0.3-0.1-0.3-0.3s0.1-0.3,0.3-0.3h4.1
c0.2,0,0.3,0.1,0.3,0.3S13.7,15.4,13.6,15.4z M13.6,12.3H9.5c-0.2,0-0.3-0.1-0.3-0.3s0.1-0.3,0.3-0.3h4.1c0.2,0,0.3,0.1,0.3,0.3
S13.7,12.3,13.6,12.3z M13.6,9.3H9.5C9.3,9.3,9.2,9.2,9.2,9c0-0.2,0.1-0.3,0.3-0.3h4.1c0.2,0,0.3,0.1,0.3,0.3
C13.9,9.2,13.7,9.3,13.6,9.3z"/>
<pattern id="SVGID_29_" xlink:href="#SVGID_6_" patternTransform="matrix(1 0 0 1 -585.044 15869.5332)">
</pattern>
<path class="st14" d="M15.2,7.2v12.7H5.2v-0.6h9.5V7.2H15.2z"/>
<pattern id="SVGID_30_" xlink:href="#SVGID_7_" patternTransform="matrix(1 0 0 1 -636.654 15918.918)">
</pattern>
<path class="st15" d="M8.3,8H6.8C6.7,8,6.5,8.1,6.5,8.3v1.5c0,0.2,0.1,0.3,0.3,0.3h1.5c0.2,0,0.3-0.1,0.3-0.3V8.3
C8.6,8.1,8.5,8,8.3,8z M8,9.5H7.1V8.6H8V9.5z"/>
<pattern id="SVGID_31_" xlink:href="#SVGID_8_" patternTransform="matrix(1 0 0 1 -585.044 15869.5332)">
</pattern>
<path class="st16" d="M7.1,8.6H8v0.9H7.1V8.6z"/>
<pattern id="SVGID_32_" xlink:href="#SVGID_9_" patternTransform="matrix(1 0 0 1 -636.654 15918.918)">
</pattern>
<path class="st17" d="M8.3,11H6.8c-0.2,0-0.3,0.1-0.3,0.3v1.5c0,0.2,0.1,0.3,0.3,0.3h1.5c0.2,0,0.3-0.1,0.3-0.3v-1.5
C8.6,11.1,8.5,11,8.3,11z M8,12.5H7.1v-0.9H8V12.5z"/>
<pattern id="SVGID_33_" xlink:href="#SVGID_10_" patternTransform="matrix(1 0 0 1 -585.044 15869.5332)">
</pattern>
<path class="st18" d="M7.1,11.6H8v0.9H7.1V11.6z"/>
<pattern id="SVGID_34_" xlink:href="#SVGID_11_" patternTransform="matrix(1 0 0 1 -636.654 15918.918)">
</pattern>
<path class="st19" d="M8.3,14H6.8c-0.2,0-0.3,0.1-0.3,0.3v1.5c0,0.2,0.1,0.3,0.3,0.3h1.5c0.2,0,0.3-0.1,0.3-0.3v-1.5
C8.6,14.2,8.5,14,8.3,14z M8,15.5H7.1v-0.9H8V15.5z"/>
<pattern id="SVGID_35_" xlink:href="#SVGID_12_" patternTransform="matrix(1 0 0 1 -585.044 15869.5332)">
</pattern>
<path class="st20" d="M7.1,14.6H8v0.9H7.1V14.6z"/>
<pattern id="SVGID_36_" xlink:href="#SVGID_13_" patternTransform="matrix(1 0 0 1 -636.654 15918.918)">
</pattern>
<path class="st21" d="M8.3,17H6.8c-0.2,0-0.3,0.1-0.3,0.3l0,0v1.5c0,0.2,0.1,0.3,0.3,0.3h1.5c0.2,0,0.3-0.1,0.3-0.3v-1.5
C8.6,17.2,8.5,17,8.3,17z M8,18.6H7.1v-0.9H8V18.6z"/>
<pattern id="SVGID_37_" xlink:href="#SVGID_14_" patternTransform="matrix(1 0 0 1 -585.044 15869.5332)">
</pattern>
<path class="st22" d="M7.1,17.7H8v0.9H7.1V17.7z"/>
<pattern id="SVGID_38_" xlink:href="#SVGID_15_" patternTransform="matrix(1 0 0 1 -636.654 15918.918)">
</pattern>
<path class="st23" d="M13.9,9c0,0.2-0.1,0.3-0.3,0.3H9.5C9.3,9.3,9.2,9.2,9.2,9c0-0.2,0.1-0.3,0.3-0.3h4.1C13.7,8.7,13.9,8.9,13.9,9
z"/>
<pattern id="SVGID_39_" xlink:href="#SVGID_16_" patternTransform="matrix(1 0 0 1 -636.654 15918.918)">
</pattern>
<path class="st24" d="M13.9,12.1c0,0.2-0.1,0.3-0.3,0.3H9.5c-0.2,0-0.3-0.1-0.3-0.3s0.1-0.3,0.3-0.3h4.1
C13.7,11.7,13.9,11.9,13.9,12.1z"/>
<pattern id="SVGID_40_" xlink:href="#SVGID_17_" patternTransform="matrix(1 0 0 1 -636.654 15918.918)">
</pattern>
<path class="st25" d="M13.9,15.1c0,0.2-0.1,0.3-0.3,0.3H9.5c-0.2,0-0.3-0.1-0.3-0.3s0.1-0.3,0.3-0.3h4.1
C13.7,14.8,13.9,14.9,13.9,15.1z"/>
<pattern id="SVGID_41_" xlink:href="#SVGID_18_" patternTransform="matrix(1 0 0 1 -636.654 15918.918)">
</pattern>
<path class="st26" d="M13.9,18.1c0,0.2-0.1,0.3-0.3,0.3H9.5c-0.2,0-0.3-0.1-0.3-0.3c0-0.2,0.1-0.3,0.3-0.3h4.1
C13.7,17.8,13.9,17.9,13.9,18.1z"/>
<pattern id="SVGID_42_" xlink:href="#SVGID_19_" patternTransform="matrix(1 0 0 1 -636.654 15918.918)">
</pattern>
<path class="st27" d="M21,19.3C21,19.3,20.9,19.3,21,19.3l0-9.4l0,0v0c0,0,0-0.1,0-0.1l0,0l-1-2.3c-0.1-0.1-0.2-0.2-0.3-0.2
s-0.2,0.1-0.3,0.2l-0.9,2.3l0,0c0,0,0,0,0,0.1s0,0,0,0.1l0,0l0,10.7c0,0.7,0.6,1.3,1.3,1.3l0,0h0.1c0.3,0,0.6-0.1,0.9-0.4
c0.2-0.2,0.4-0.5,0.4-0.9V19.3C20.9,19.3,20.9,19.3,21,19.3z M19.6,8.4l0.5,1.3h-1L19.6,8.4z M20.3,10.2l0,8.8H19l0-8.8
C19,10.3,20.3,10.2,20.3,10.2z M20.2,21.1c-0.1,0.1-0.3,0.2-0.4,0.2h-0.1c-0.2,0-0.3-0.1-0.4-0.2S19,20.8,19,20.7v-1h1.3v1
C20.4,20.8,20.3,21,20.2,21.1z"/>
<pattern id="SVGID_43_" xlink:href="#SVGID_20_" patternTransform="matrix(1 0 0 1 -585.044 15869.5332)">
</pattern>
<path class="st28" d="M20.4,19H19l0-8.8h1.3L20.4,19z"/>
<pattern id="SVGID_44_" xlink:href="#SVGID_21_" patternTransform="matrix(1 0 0 1 -585.044 15869.5332)">
</pattern>
<path class="st29" d="M20.4,19H19v-0.4h1.1l0-8.4h0.3L20.4,19z"/>
<pattern id="SVGID_45_" xlink:href="#SVGID_22_" patternTransform="matrix(1 0 0 1 -585.044 15869.5332)">
</pattern>
<path class="st30" d="M20.2,9.7h-1l0.5-1.3L20.2,9.7z"/>
<pattern id="SVGID_46_" xlink:href="#SVGID_23_" patternTransform="matrix(1 0 0 1 -585.044 15869.5332)">
</pattern>
<path class="st31" d="M20.4,20.6c0,0.2-0.1,0.3-0.2,0.4c-0.1,0.1-0.3,0.2-0.4,0.2h-0.1c-0.2,0-0.3-0.1-0.4-0.2
c-0.1-0.1-0.2-0.3-0.2-0.4v-1h1.3V20.6z"/>
</svg>

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 302 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 355 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 351 KiB

View File

@@ -0,0 +1,55 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.1.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Server" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:#29A1DC;}
.st1{clip-path:url(#SVGID_2_);fill:#7DBCE7;}
.st2{fill:#010101;}
.st3{fill:#F5CCB3;}
.st4{fill:#FFFFFF;}
.st5{fill:#AF5C51;}
.st6{fill:#C4E5D9;}
</style>
<path class="st0" d="M18.6,19.8c0,1.3-2.9,2.3-6.5,2.3s-6.5-1-6.5-2.3c0-1.3,2.9-2.3,6.5-2.3S18.6,18.5,18.6,19.8z"/>
<g>
<defs>
<path id="SVGID_1_" d="M9.3,23.8c0.1,0.7,0.5,1.1,0.8,1.3h3.7c0.5-0.3,0.9-0.9,0.9-2v-2.8c0,0,0.1-0.7,0.7-0.9c0,0,0.4-0.3,0-0.4
c0,0-1.8-0.1-1.8,1.3v2.1c0,0,0.1,0.8-0.3,1.1V21c0,0,0-0.8,0.5-1.2c0,0,0.3-0.5-0.3-0.4c0,0-1.2,0.2-1.3,1.6l0,2.7h-0.3l0-2.7
c-0.1-1.4-1.3-1.6-1.3-1.6c-0.6-0.1-0.3,0.4-0.3,0.4c0.4,0.3,0.5,1.2,0.5,1.2v2.7c-0.4-0.3-0.3-1.1-0.3-1.1v-2.1
c0-1.4-1.8-1.3-1.8-1.3c-0.4,0.1,0,0.4,0,0.4c0.6,0.2,0.7,0.9,0.7,0.9v2L9.3,23.8L9.3,23.8z"/>
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<path class="st1" d="M18.6,19.8c0,1.3-2.9,2.3-6.5,2.3s-6.5-1-6.5-2.3c0-1.3,2.9-2.3,6.5-2.3S18.6,18.5,18.6,19.8z"/>
</g>
<path class="st0" d="M4.7,13.1l-0.2,0.6c0,0,0,0.2,0.2,0.3c0.2,0,0.2-0.2,0.2-0.3L4.7,13.1L4.7,13.1z"/>
<path class="st2" d="M23.5,10.4L23.5,10.4c-1.9-0.5-3.8-0.5-5-0.4c0.2-0.7,0.3-1.5,0.3-2.4c0-1.3-0.5-2.3-1.3-3.1
C17.6,4,17.8,3,17.3,1.8c0,0-0.9-0.3-2.9,1.1c-0.8-0.2-1.6-0.3-2.5-0.3c-0.9,0-1.8,0.1-2.7,0.4c-2.1-1.4-3-1.1-3-1.1
C5.7,3.3,6,4.4,6.1,4.6C5.4,5.4,5,6.4,5,7.6c0,0.9,0.1,1.7,0.4,2.4c-1.2,0-3.1,0-4.9,0.3l0,0.1C2.3,10,4.2,10,5.4,10
c0.1,0.1,0.1,0.3,0.2,0.4c-1.2,0-3.2,0.2-5.1,0.7l0,0.1c1.9-0.5,3.9-0.7,5.1-0.7c0.7,1.3,2.1,2.1,4.5,2.4c-0.4,0.2-0.7,0.6-0.8,1.3
c-0.5,0.2-2,0.8-2.9-0.8c0,0-0.5-0.9-1.5-1c0,0-0.9,0-0.1,0.6c0,0,0.6,0.3,1.1,1.4c0,0,0.6,1.9,3.3,1.3v1.9c0,0-0.1,0.7-0.7,0.9
c0,0-0.4,0.3,0,0.4c0,0,1.8,0.1,1.8-1.3v-2.1c0,0-0.1-0.8,0.3-1.1V18c0,0,0,0.8-0.5,1.2c0,0-0.3,0.5,0.3,0.4c0,0,1.2-0.2,1.3-1.6
l0-3.5h0.3l0,3.5c0.1,1.4,1.3,1.6,1.3,1.6c0.6,0.1,0.3-0.4,0.3-0.4c-0.4-0.3-0.5-1.2-0.5-1.2v-3.5c0.4,0.3,0.3,1.1,0.3,1.1v2.1
c0,1.4,1.8,1.3,1.8,1.3c0.4-0.1,0-0.4,0-0.4c-0.6-0.2-0.7-0.9-0.7-0.9v-2.8c0-1.1-0.5-1.7-0.9-2c2.6-0.3,3.9-1.1,4.4-2.4
c1.1,0,3.2,0.2,5.2,0.7l0-0.1c-2-0.6-4-0.7-5.2-0.7c0.1-0.1,0.1-0.3,0.1-0.4C19.7,10,21.6,10,23.5,10.4L23.5,10.4z"/>
<path class="st3" d="M16.2,7.5c0.6,0.5,0.9,1.1,0.9,1.8c0,3.1-2.3,3.2-5.2,3.2S6.8,12,6.8,9.3c0-0.7,0.3-1.3,0.9-1.8
c0.9-0.8,2.5-0.4,4.3-0.4S15.3,6.6,16.2,7.5L16.2,7.5z"/>
<path class="st4" d="M10.2,9.4c0,0.9-0.5,1.5-1.1,1.5s-1.1-0.7-1.1-1.5c0-0.9,0.5-1.5,1.1-1.5C9.7,7.9,10.2,8.6,10.2,9.4z"/>
<path class="st5" d="M9.9,9.5c0,0.6-0.3,1-0.7,1c-0.4,0-0.7-0.5-0.7-1c0-0.6,0.3-1,0.7-1C9.6,8.4,9.9,8.9,9.9,9.5z"/>
<path class="st4" d="M16,9.4c0,0.9-0.5,1.5-1.1,1.5c-0.6,0-1.1-0.7-1.1-1.5c0-0.9,0.5-1.5,1.1-1.5C15.5,7.9,16,8.6,16,9.4z"/>
<path class="st5" d="M15.6,9.5c0,0.6-0.3,1-0.7,1c-0.4,0-0.7-0.5-0.7-1c0-0.6,0.3-1,0.7-1C15.3,8.4,15.6,8.9,15.6,9.5z M12.2,10.8
c0,0.1-0.1,0.3-0.3,0.3c-0.1,0-0.3-0.1-0.3-0.3c0-0.2,0.1-0.3,0.3-0.3C12.1,10.5,12.2,10.7,12.2,10.8z M11.3,11.5c0,0,0-0.1,0.1-0.1
c0,0,0.1,0,0.1,0.1c0.1,0.2,0.3,0.3,0.5,0.3c0.2,0,0.4-0.1,0.5-0.3c0,0,0.1-0.1,0.1-0.1c0,0,0.1,0.1,0.1,0.1
c-0.1,0.3-0.3,0.4-0.6,0.4C11.7,11.9,11.4,11.8,11.3,11.5L11.3,11.5z"/>
<path class="st6" d="M5.4,12.7c0,0.1-0.1,0.1-0.2,0.1c-0.1,0-0.2-0.1-0.2-0.1s0.1-0.1,0.2-0.1C5.3,12.6,5.4,12.6,5.4,12.7z M5.9,13
c0,0.1-0.1,0.1-0.2,0.1c-0.1,0-0.2-0.1-0.2-0.1s0.1-0.1,0.2-0.1C5.8,12.9,5.9,12.9,5.9,13z M6.2,13.4c0,0.1-0.1,0.1-0.2,0.1
c-0.1,0-0.2-0.1-0.2-0.1c0-0.1,0.1-0.1,0.2-0.1C6.1,13.3,6.2,13.3,6.2,13.4z M6.5,13.8c0,0.1-0.1,0.1-0.2,0.1
c-0.1,0-0.2-0.1-0.2-0.1c0-0.1,0.1-0.1,0.2-0.1C6.4,13.7,6.5,13.7,6.5,13.8z M6.8,14.2c0,0.1-0.1,0.1-0.2,0.1
c-0.1,0-0.2-0.1-0.2-0.1c0-0.1,0.1-0.1,0.2-0.1C6.7,14.1,6.8,14.1,6.8,14.2z M7.2,14.6c0,0.1-0.1,0.1-0.2,0.1
c-0.1,0-0.2-0.1-0.2-0.1c0-0.1,0.1-0.1,0.2-0.1C7.2,14.4,7.2,14.5,7.2,14.6z M7.8,14.8c0,0.1-0.1,0.1-0.2,0.1
c-0.1,0-0.2-0.1-0.2-0.1c0-0.1,0.1-0.1,0.2-0.1C7.8,14.7,7.8,14.7,7.8,14.8z M8.5,14.8c0,0.1-0.1,0.1-0.2,0.1
c-0.1,0-0.2-0.1-0.2-0.1c0-0.1,0.1-0.1,0.2-0.1C8.4,14.7,8.5,14.7,8.5,14.8z M9.1,14.7c0,0.1-0.1,0.1-0.2,0.1
c-0.1,0-0.2-0.1-0.2-0.1c0-0.1,0.1-0.1,0.2-0.1C9,14.6,9.1,14.6,9.1,14.7z"/>
</svg>

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 318 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 460 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View File

@@ -0,0 +1,690 @@
<section class="oe_container custom_style description-odoo-font">
<div id="wrap" class="oe_structure oe_empty">
<section class="s_text_block o_colored_level pb120 pt168 oe_img_bg o_bg_img_center" data-snippet="s_text_block" data-name="Text" style="background-image: url('tower_website.svg'); position: relative;">
<div class="container">
<div class="row">
<div class="col-lg-6">
<h2 style="color: #0D3045; font-weight: 500; font-size: 48px" data-bs-original-title="" title="" aria-describedby="tooltip483440">
<strong style="font-weight: 800; color: #29A1DC; vertical-align: text-bottom;">| </strong> What is Cetmix Tower?
<br/>
</h2>
<p style="font-size: 18px; font-weight:300">
<b>Cetmix Tower</b> is an <b>open-source</b> DevOps framework built on Odoo. <br/><br/>
It empowers you to deploy, manage, and automate applications <b>directly from Odoo</b> whether it's Odoo itself, WordPress, ERPNext or Magento.<br/><br/>
Unlike traditional hosting platforms, Cetmix Tower is <b>not tied to any specific technology</b>. You can use it with Docker, Kubernetes, a bare operating system or whatever your infrastructure requires.<br/><br/>
Fully <b>self-hosted</b> and deeply integrated with the Odoo ecosystem, it gives you complete control over your servers and applications. <br/><br/>
<b>Cetmix Tower</b> is distributed under the <b>AGPL-3 license</b>, ensuring transparency and freedom.
</p>
</div>
<div class="col-lg-6">
<img src="cetmix_tower_server_kanban.png" alt="" class="img img-fluid o_we_custom_image" data-original-id="1256" data-original-src="cetmix_tower_server_kanban.png" data-mimetype="image/png" style="width: 100% !important;" loading="eager"/>
</div>
</div>
</div>
</section>
<section class="s_text_image pb32 o_colored_level o_cc o_cc1" data-snippet="s_image_text" style="color: #343A40;" data-name="Custom Image - Text (2)" data-bs-original-title="" title="" aria-describedby="tooltip882751">
<div class="container">
<div class="row">
<div class="col-lg-6 table-responsive">
<h2 style="color: #0D3045; font-weight: 500; font-size: 48px"> <strong style="font-weight: 800; color: #29A1DC; vertical-align: text-bottom;">| </strong>Key Differences</h2>
<!-- Bootstrap 5 CSS -->
<table class="table table-striped align-middle border">
<thead>
<tr class="align-middle">
<th class="text-center"> </th>
<th class="text-center"><b>Cetmix Tower</b></th>
<th class="text-center">Odoo.sh</th>
<th class="text-center">Other Odoo Hosting</th>
<th class="text-center">Generic DevOps Tools</th>
</tr>
</thead>
<tbody>
<tr>
<td class="text-start">Can Deploy Odoo Enterprise</td>
<td class="text-center"><i class="fa fa-check text-success"></i></td>
<td class="text-center"><i class="fa fa-check text-success"></i></td>
<td class="text-center"><i class="fa fa-check text-success"></i></td>
<td class="text-center"><i class="fa fa-check text-success"></i></td>
</tr>
<tr>
<td class="text-start">Can Deploy Odoo Community</td>
<td class="text-center"><i class="fa fa-check text-success"></i></td>
<td class="text-center"><i class="fa fa-close text-danger"></i></td>
<td class="text-center"><i class="fa fa-check text-success"></i></td>
<td class="text-center"><i class="fa fa-check text-success"></i></td>
</tr>
<tr>
<td class="text-start">Can Deploy Other Software besides Odoo</td>
<td class="text-center"><i class="fa fa-check text-success"></i></td>
<td class="text-center"><i class="fa fa-close text-danger"></i></td>
<td class="text-center"><i class="fa fa-close text-danger"></i></td>
<td class="text-center"><i class="fa fa-check text-success"></i></td>
</tr>
<tr>
<td class="text-start">Runs on Your Own Server</td>
<td class="text-center"><i class="fa fa-check text-success"></i></td>
<td class="text-center"><i class="fa fa-close text-danger"></i></td>
<td class="text-center"><i class="fa fa-close text-danger"></i></td>
<td class="text-center">Some*</td>
</tr>
<tr>
<td class="text-start">Native Odoo App</td>
<td class="text-center"><i class="fa fa-check text-success"></i></td>
<td class="text-center"><i class="fa fa-close text-danger"></i></td>
<td class="text-center"><i class="fa fa-close text-danger"></i></td>
<td class="text-center"><i class="fa fa-close text-danger"></i></td>
</tr>
<tr>
<td class="text-start">Export/Import &amp; Share Configurations</td>
<td class="text-center"><i class="fa fa-check text-success"></i></td>
<td class="text-center"><i class="fa fa-close text-danger"></i></td>
<td class="text-center"><i class="fa fa-close text-danger"></i></td>
<td class="text-center">Some*</td>
</tr>
<tr>
<td class="text-start">Is Open Source</td>
<td class="text-center"><i class="fa fa-check text-success"></i></td>
<td class="text-center"><i class="fa fa-close text-danger"></i></td>
<td class="text-center"><i class="fa fa-close text-danger"></i></td>
<td class="text-center">Some*</td>
</tr>
</tbody>
</table>
<p class="small text-muted">* depends on the tool</p>
</div>
<div class="col-lg-6">
<h2 style="color: #0D3045; font-weight: 500; font-size: 48px"> <strong style="font-weight: 800; color: #29A1DC; vertical-align: text-bottom;">| </strong>Why Cetmix Tower?</h2>
<ul class="card-text text-800" style="font-size: 18px; font-weight:300; color: #3d4856 !important; text-align: left;">
<li><strong>Easy to use for non-technical users:</strong> Deploy a server or run a multi-step scenario with a single click in the UI.</li>
<li><strong>Power and flexibility for technical users:</strong> Leverage powerful features to build complex workflows and automate server and application management tasks.</li>
<li><strong>Not limited to a single technology:</strong> Run any software manageable via shell commands or API, whether you're using Docker, Kubernetes, or direct OS commands.</li>
<li><strong>Odoo Integration:</strong> Take advantage of the Odoo ecosystem for server management tasks. Integrate with Sales, Accounting, Subscriptions, Helpdesk, or any other Odoo module.</li>
<li><strong>Not limited to Odoo:</strong> While optimized for Odoo, Cetmix Tower can manage virtually any software.</li>
<li><strong>Extensibility:</strong> Develop your own Odoo modules based on Cetmix Tower to implement custom features.</li>
<li><strong>Self-Hosting:</strong> Deploy Cetmix Tower on your own infrastructure for complete control over your server and application management.</li>
<li><strong>Open Source:</strong> Cetmix Tower is distributed under the AGPL-3 license, ensuring transparency and freedom.</li>
</ul>
</div>
</div>
<div class="container pt64">
<h2 class="pb32" style="color: #0D3045; font-weight: 500; font-size: 48px"><strong style="font-weight: 800; color: #29A1DC; vertical-align: text-bottom;">| </strong> Core Features</h2>
<div class="container">
<div class="pt32" style="margin-left: 40px; background-color:#0D3045; border-radius: 40px; padding: 24px;">
<p class="card-text text-800" style="font-size: 18px; font-weight:300; color: #d7dcdf !important; text-align: left;"><strong style="font-weight: 800; color: #29A1DC; vertical-align: text-bottom;">| </strong>Note</p>
<p class="card-text text-800 pb32" style="font-size: 18px; font-weight:300; color: #d7dcdf !important; text-align: left;">Cetmix Tower is designed with usability and simplicity in mind, though some features might require a foundational understanding of server management principles</p>
<h4 style="font-size: 24px; color: #ffffff; font-weight: 200;">
For documentation please check <strong style="font-size: 32px; font-weight: 800; color: #29A1DC;"> | </strong> <a href="https://tower.cetmix.com" style="color: #29A1DC;"> tower.cetmix.com</a>
</h4>
</div>
</div>
</div>
<div class="container pt64">
<h3 style="color: #0D3045; font-weight: 500; font-size: 48px"><img src="self-host.svg" style="height: 48px; margin-right: 10px; vertical-align: text-top;"/>Server Management</h3>
<ul class="card-text text-800" style="font-size: 18px; font-weight:300; color: #3d4856 !important; text-align: left;">
<li>Variable-based flexible configuration</li>
<li>Create Servers using pre-defined Server Templates</li>
</ul>
<section
class="s_image_gallery pt24 pb24 o_colored_level o_spc-small o_masonry o_cc o_cc1"
data-vcss="001"
data-columns="2"
data-snippet="s_images_wall"
data-name="Images Wall"
style="overflow: hidden"
>
<div class="container">
<div class="row s_nb_column_fixed">
<div class="o_masonry_col o_snippet_not_selectable col-lg-6">
<img
src="server_1.png"
alt=""
class="img-fluid d-block rounded shadow mb16 o_visible img o_we_custom_image"
data-original-id="1218"
data-original-src="server_1.png"
data-mimetype="image/png"
data-resize-width="1920"
loading="eager"
title="Server Management"
aria-describedby="tooltip65859"
/>
<img
src="server_template_form.png"
alt=""
class="img-fluid d-block rounded shadow mb16 o_visible img o_we_custom_image"
data-original-id="1242"
data-original-src="server_template_form.png"
data-mimetype="image/png"
data-resize-width="1920"
data-bs-original-title=""
title="Server Management"
aria-describedby="tooltip990969"
loading="eager"
/>
</div>
<div class="o_masonry_col o_snippet_not_selectable col-lg-6">
<img
src="server_form_configuration.png"
class="img-fluid d-block rounded shadow mb16 o_visible img o_we_custom_image"
loading="eager"
data-original-id="1225"
data-original-src="server_form_configuration.png"
data-mimetype="image/png"
title="Server Management"
aria-describedby="tooltip997009"
/>
</div>
</div>
</div>
</section>
</div>
<div class="container pt64">
<h3 style="color: #0D3045; font-weight: 500; font-size: 48px"><img src="connectivity.svg" style="height: 48px; margin-right: 10px; vertical-align: text-top;"/>Connectivity</h3>
<ul class="card-text text-800" style="font-size: 18px; font-weight:300; color: #3d4856 !important; text-align: left;">
<li>Password and key-based authentication for outgoing SSH connections</li>
<li>Built-in support of the Python requests library for outgoing API calls</li>
</ul>
</div>
<div class="container pt64">
<h3 style="color: #0D3045; font-weight: 500; font-size: 48px"><img src="development.svg" style="height: 48px; margin-right: 10px; vertical-align: text-top;"/>Commands</h3>
<ul class="card-text text-800" style="font-size: 18px; font-weight:300; color: #3d4856 !important; text-align: left;">
<li>Execute SSH Commands on remote servers</li>
<li>Run Python Commands on the Tower Odoo server</li>
<li>Run Flight Plan from command</li>
<li>Render commands using Variables</li>
<li>Secrets/Keys for private data storage</li>
</ul>
<section
class="s_image_gallery pt24 pb24 o_colored_level o_spc-small o_masonry o_cc o_cc1"
data-vcss="001"
data-columns="2"
data-snippet="s_images_wall"
data-name="Images Wall"
style="overflow: hidden"
>
<div class="container">
<div class="row s_nb_column_fixed">
<div class="o_masonry_col o_snippet_not_selectable col-lg-6">
<img
src="commands_1.png"
alt=""
class="img-fluid d-block rounded shadow mb16 o_visible img o_we_custom_image"
data-original-id="1218"
data-original-src="commands_1.png"
data-mimetype="image/png"
data-resize-width="1920"
loading="eager"
title="Commands"
aria-describedby="tooltip65859"
/>
</div>
<div class="o_masonry_col o_snippet_not_selectable col-lg-6">
<img
src="commands_2.png"
class="img-fluid d-block rounded shadow mb16 o_visible img o_we_custom_image"
loading="eager"
data-original-id="1225"
data-original-src="commands_2.png"
data-mimetype="image/png"
title="Commands"
aria-describedby="tooltip997009"
/>
</div>
</div>
</div>
</section>
</div>
<div class="container pt64">
<h3 style="color: #0D3045; font-weight: 500; font-size: 48px"><img src="flight-plan.svg" style="height: 48px; margin-right: 10px; vertical-align: text-top;"/>Flight Plans</h3>
<ul class="card-text text-800" style="font-size: 18px; font-weight:300; color: #3d4856 !important; text-align: left;">
<li>Execute multiple Commands in a row</li>
<li>Condition-based flow:</li>
<ul>
<li>Based on conditions using Python syntax</li>
<li>Based on the previous command exit code</li>
</ul>
</ul>
<section
class="s_image_gallery pt24 pb24 o_colored_level o_spc-small o_masonry o_cc o_cc1"
data-vcss="001"
data-columns="2"
data-snippet="s_images_wall"
data-name="Images Wall"
style="overflow: hidden"
>
<div class="container">
<div class="row s_nb_column_fixed">
<div class="o_masonry_col o_snippet_not_selectable col-lg-6">
<img
src="flight_plan_1.png"
alt=""
class="img-fluid d-block rounded shadow mb16 o_visible img o_we_custom_image"
data-original-id="1218"
data-original-src="flight_plan_1.png"
data-mimetype="image/png"
data-resize-width="1920"
loading="eager"
title="Flight Plans"
aria-describedby="tooltip65859"
/>
<img
src="flight_plan_3.png"
alt=""
class="img-fluid d-block rounded shadow mb16 o_visible img o_we_custom_image"
data-original-id="1242"
data-original-src="flight_plan_3.png"
data-mimetype="image/png"
data-resize-width="1920"
title="Flight Plans"
aria-describedby="tooltip990969"
loading="eager"
/>
</div>
<div class="o_masonry_col o_snippet_not_selectable col-lg-6">
<img
src="flight_plan_2.png"
class="img-fluid d-block rounded shadow mb16 o_visible img o_we_custom_image"
loading="eager"
data-original-id="1225"
data-original-src="flight_plan_2.png"
data-mimetype="image/png"
title="Flight Plans"
aria-describedby="tooltip997009"
/>
</div>
</div>
</div>
</section>
</div>
<div class="container pt64">
<h3 style="color: #0D3045; font-weight: 500; font-size: 48px"><img src="files.svg" style="height: 48px; margin-right: 10px; vertical-align: text-top;"/>Files</h3>
<ul class="card-text text-800" style="font-size: 18px; font-weight:300; color: #3d4856 !important; text-align: left;">
<li>Download Files from a remote server using SFTP</li>
<li>Upload Files to a remote server using SFTP</li>
<li>Support for <code>text</code> and <code>binary</code> file formats</li>
<li>Manage Files using pre-defined File Templates</li>
</ul>
<section
class="s_image_gallery pt24 pb24 o_colored_level o_spc-small o_masonry o_cc o_cc1"
data-vcss="001"
data-columns="2"
data-snippet="s_images_wall"
data-name="Images Wall"
style="overflow: hidden"
>
<div class="container">
<div class="row s_nb_column_fixed">
<div class="o_masonry_col o_snippet_not_selectable col-lg-6">
<img
src="files_1.png"
alt=""
class="img-fluid d-block rounded shadow mb16 o_visible img o_we_custom_image"
data-original-id="1218"
data-original-src="files_1.png"
data-mimetype="image/png"
data-resize-width="1920"
loading="eager"
title="Files"
aria-describedby="tooltip65859"
/>
<img
src="files_3.png"
alt=""
class="img-fluid d-block rounded shadow mb16 o_visible img o_we_custom_image"
data-original-id="1242"
data-original-src="files_3.png"
data-mimetype="image/png"
data-resize-width="1920"
title="Files"
aria-describedby="tooltip990969"
loading="eager"
/>
</div>
<div class="o_masonry_col o_snippet_not_selectable col-lg-6">
<img
src="files_2.png"
class="img-fluid d-block rounded shadow mb16 o_visible img o_we_custom_image"
loading="eager"
data-original-id="1225"
data-original-src="files_2.png"
data-mimetype="image/png"
title="Files"
aria-describedby="tooltip997009"
/>
</div>
</div>
</div>
</section>
</div>
<div class="container pt64">
<h3 style="color: #0D3045; font-weight: 500; font-size: 48px"><img src="server-logs.svg" style="height: 48px; margin-right: 10px; vertical-align: text-top;"/>Server Logs</h3>
<ul class="card-text text-800" style="font-size: 18px; font-weight:300; color: #3d4856 !important; text-align: left;">
<li>Fetch Logs from a remote server using Commands</li>
<li>Fetch Logs from a remote server using Files</li>
</ul>
<section
class="s_image_gallery pt24 pb24 o_colored_level o_spc-small o_masonry o_cc o_cc1"
data-vcss="001"
data-columns="2"
data-snippet="s_images_wall"
data-name="Images Wall"
style="overflow: hidden"
>
<div class="container">
<div class="row s_nb_column_fixed">
<div class="o_masonry_col o_snippet_not_selectable col-lg-6">
<img
src="logs_1.png"
alt=""
class="img-fluid d-block rounded shadow mb16 o_visible img o_we_custom_image"
data-original-id="1218"
data-original-src="logs_1.png"
data-mimetype="image/png"
data-resize-width="1920"
loading="eager"
title="Server Logs"
aria-describedby="tooltip65859"
/>
</div>
<div class="o_masonry_col o_snippet_not_selectable col-lg-6">
<img
src="logs_2.png"
class="img-fluid d-block rounded shadow mb16 o_visible img o_we_custom_image"
loading="eager"
data-original-id="1225"
data-original-src="logs_2.png"
data-mimetype="image/png"
title="Server Logs"
aria-describedby="tooltip997009"
/>
</div>
</div>
</div>
</section>
</div>
<div class="container pt64 pb64">
<h3 style="color: #0D3045; font-weight: 500; font-size: 48px"><img src="tools.svg" style="height: 48px; margin-right: 10px; vertical-align: text-top;"/>Import/Export Data in YAML Format</h3>
<ul class="card-text text-800" style="font-size: 18px; font-weight:300; color: #3d4856 !important; text-align: left;">
<li>Share and manage data easily using YAML format</li>
</ul>
<section
class="s_image_gallery pt24 pb24 o_colored_level o_spc-small o_masonry o_cc o_cc1"
data-vcss="001"
data-columns="2"
data-snippet="s_images_wall"
data-name="Images Wall"
style="overflow: hidden"
>
<div class="container">
<div class="row s_nb_column_fixed">
<div class="o_masonry_col o_snippet_not_selectable col-lg-6">
<img
src="yaml_1.png"
alt=""
class="img-fluid d-block rounded shadow mb16 o_visible img o_we_custom_image"
data-original-id="1218"
data-original-src="yaml_1.png"
data-mimetype="image/png"
data-resize-width="1920"
loading="eager"
title="Import/Export Data in YAML Format"
aria-describedby="tooltip65859"
/>
<img
src="yaml_4.png"
alt=""
class="img-fluid d-block rounded shadow mb16 o_visible img o_we_custom_image"
data-original-id="1218"
data-original-src="yaml_4.png"
data-mimetype="image/png"
data-resize-width="1920"
loading="eager"
title="Import/Export Data in YAML Format"
aria-describedby="tooltip65859"
/>
</div>
<div class="o_masonry_col o_snippet_not_selectable col-lg-6">
<img
src="yaml_3.png"
class="img-fluid d-block rounded shadow mb16 o_visible img o_we_custom_image"
loading="eager"
data-original-src="yaml_3.png"
data-mimetype="image/png"
title="Import/Export Data in YAML Format"
/>
<img
src="yaml_5.png"
class="img-fluid d-block rounded shadow mb16 o_visible img o_we_custom_image"
loading="eager"
data-original-src="yaml_5.png"
data-mimetype="image/png"
title="Import/Export Data in YAML Format"
/>
<img
src="yaml_2.png"
class="img-fluid d-block rounded shadow mb16 o_visible img o_we_custom_image"
loading="eager"
data-original-src="yaml_2.png"
data-mimetype="image/png"
title="Import/Export Data in YAML Format"
/>
</div>
</div>
</div>
</section>
</div>
<div class="container pt64 pb64">
<h3 style="color: #0D3045; font-weight: 500; font-size: 48px"><img src="git.svg" style="height: 48px; margin-right: 10px; vertical-align: text-top;"/>Manage Git Projects</h3>
<ul class="card-text text-800" style="font-size: 18px; font-weight:300; color: #3d4856 !important; text-align: left;">
<li>
Manage Git projects directly from Odoo
</li>
<li>
User-friendly interface for controlling git repositories linked to your servers
</li>
</ul>
<section
class="s_image_gallery pt24 pb24 o_colored_level o_spc-small o_masonry o_cc o_cc1"
data-vcss="001"
data-columns="2"
data-snippet="s_images_wall"
data-name="Images Wall"
style="overflow: hidden"
>
<div class="container">
<div class="row s_nb_column_fixed">
<div class="o_masonry_col o_snippet_not_selectable col-lg-6">
<img
src="git_1.png"
alt=""
class="img-fluid d-block rounded shadow mb16 o_visible img o_we_custom_image"
data-original-id="1218"
data-original-src="git_1.png"
data-mimetype="image/png"
data-resize-width="1920"
loading="eager"
title="Git Projects"
aria-describedby="tooltip65859"
/>
</div>
<div class="o_masonry_col o_snippet_not_selectable col-lg-6">
<img
src="git_2.png"
class="img-fluid d-block rounded shadow mb16 o_visible img o_we_custom_image"
loading="eager"
data-original-src="git_2.png"
data-mimetype="image/png"
title="Git Projects"
/>
</div>
</div>
</div>
</section>
</div>
</div>
</section>
<section class="s_text_image o_colored_level pt64 pb64 o_cc o_cc5 " data-snippet="s_image_text" style="background-color: #0D3045 !important; background-image: none; position: relative; border-top-right-radius: 40px; border-top-left-radius: 40px;" data-name="Custom Image - Text" data-bs-original-title="" title="" aria-describedby="tooltip522920" data-oe-shape-data="{&quot;shape&quot;:&quot;web_editor/Origins/16&quot;,&quot;colors&quot;:{&quot;c3&quot;:&quot;#0D2945&quot;},&quot;flip&quot;:[]}">
<div class="container" style="padding: 30px;">
<div class="col-lg-6" style="text-align: right; margin-left: auto;">
<img src="cetmix.svg" alt="" class="img img-fluid o_we_custom_image" data-original-id="1256" data-original-src="cetmix.svg" data-mimetype="image/svg+xml" data-bs-original-title="" title="" aria-describedby="tooltip359107" style="width: 50% !important;" loading="eager"/>
</div>
<h3 class="pt64" style="color: #ffffff; font-weight: 500; font-size: 48px"><strong style="font-weight: 800; color: #29A1DC; vertical-align: text-bottom;">| </strong> Warning</h3>
<p class="card-text text-800" style="font-size: 18px; font-weight:300; color: #ffffff !important; text-align: left;">
The software is provided "as is", without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement.
In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the software.
</p>
</div>
</section>
<section class="s_title o_colored_level o_cc o_cc1" style="position: relative; background-color: #0D3045 !important">
<div style="background-color: #3d4856 !important; border-top-right-radius: 40px; border-top-left-radius: 40px; padding: 20px;">
&nbsp;
</div>
</section>
<section class="s_features o_colored_level pb64 o_cc o_cc1" data-snippet="s_features" data-name="Features" style="position: relative; background-color: #3d4856 !important" data-oe-shape-data="">
<div class="container mx-3">
<h2 style="font-size: 48px; font-weight:500; color: #d7dcdf;">License</h2>
<p class="card-text text-800" style="font-size: 18px; font-weight:300; color: #d7dcdf !important; text-align: left;">Cetmix Tower is distributed under the AGPL-3 license. In case you want to use this software in projects that are not compatible with AGPL-3 license, you should contact us directly.</p>
</div>
</section>
<section class="s_title o_colored_level o_cc o_cc1" style="position: relative; background-color: #3d4856">
<div style="background-color: #d7dcdf !important; border-top-right-radius: 40px; border-top-left-radius: 40px; padding: 20px;">
&nbsp;
</div>
</section>
<section class="s_text_block o_colored_level pt32 pb64 o_cc o_cc1" data-snippet="s_text_block" data-name="Text" style="position: relative; background-color: #d7dcdf !important; color: #3d4856;">
<div class="container mx-3">
<h2 style="font-size: 48px; font-weight:500; color: #3d4856;">Copyright</h2>
<p class="card-text text-800" style="font-size: 18px; font-weight:300; color: #3d4856 !important; text-align: left;">Cetmix Tower is a trademark of Cetmix. All rights reserved.</p>
</div>
</section>
<section class="s_title o_colored_level o_cc o_cc1" style="position: relative; background-color: #d7dcdf">
<div style="background-color: #3d4856 !important; border-top-right-radius: 40px; border-top-left-radius: 40px; padding: 20px;">
&nbsp;
</div>
</section>
<section class="s_text_block o_colored_level pt32 pb64 o_cc o_cc1" data-snippet="s_text_block" data-name="Text" style="position: relative; background-color: #3d4856 !important; color: #3d4856;">
<div class="container mx-3">
<h2 style="font-size: 48px; font-weight:500; color: #d7dcdf;">Support</h2>
<ul class="card-text text-800" style="font-size: 18px; font-weight:300; color: #d7dcdf !important; text-align: left;">
<li>This project is open source. All issues and feature requests should be reported in the GitHub repository</li>
<li>Your contribution is welcome. Please refer to the CONTRIBUTING.md file for more details.</li>
<li>Dedicated support is available on request. Contact us for details at cetmix.com</li>
</ul>
</div>
</section>
<section class="s_title o_colored_level o_cc o_cc1" style="position: relative; background-color: #3d4856">
<div style="background-color: #f4f4f4 !important; border-top-right-radius: 40px; border-top-left-radius: 40px; padding: 20px;">
&nbsp;
</div>
</section>
<section id="cetmix" class="s_text_image o_colored_level pt64 pb64 o_cc o_cc5" data-snippet="s_image_text" style="background-color: #f4f4f4 !important; background-image: none; position: relative;" data-name="Custom Image - Text" data-bs-original-title="" title="" aria-describedby="tooltip522920">
<div class="container">
<div class="row align-items-center">
<div class="pt16 pb16 o_colored_level col-lg-4" style="position: relative;">
<img src="cx_logo.svg" alt="" class="img img-fluid mx-auto o_we_custom_image" style="position: relative;" data-original-id="1229" data-original-src="pdf.svg" data-mimetype="image/svg+xml" data-resize-width="undefined" loading="eager"/>
</div>
<div class="pb16 o_colored_level col-lg-8" >
<h1 style="text-align: left; color:#0D3045; font-size: 48px; font-weight:500;">
Cetmix is not just another IT company
</h1>
<h5 class="pt32" style="text-align: left; color:#3d4856; font-size: 22px; font-weight:300">
We know how the business works. Our experts have management
experience in heavy machinery, energy sector, logistics,
accounting, public services and many other industries _
<br/>
<br/>
We are the people of business
</h5>
</div>
</div>
</div>
</section>
<section class="s_title o_colored_level o_cc o_cc1" style="position: relative; background-color: #f4f4f4">
<div style="background-color: #29A1DC !important; border-top-right-radius: 40px; border-top-left-radius: 40px; padding: 20px;">
&nbsp;
</div>
</section>
<section class="s_call_to_action pt48 pb64 o_colored_level o_cc o_cc5" data-snippet="s_call_to_action" data-name="Call to Action" style="background-color: #29A1DC; color: #ffffff;">
<div class="container" style="margin-left: 100px">
<div class="row o_header_white_border_left">
<div class="col-lg-6 pb16 o_colored_level">
<h3 style="text-align: left; color:#ffffff; font-size: 48px; font-weight:500;">Solutions for your business</h3>
<h5 class="pt16" style="text-align: left; color:#3d4856; font-size: 22px; font-weight:300">Choose an existing one or we can develop a custom one for you</h5>
</div>
<div class="col pt32 o_colored_level">
<p style="text-align: center;" data-bs-original-title="" title="" aria-describedby="tooltip742456">
<a class="mb-2 btn btn-lg shadow" href="https://apps.odoo.com/apps/modules/browse?author=Cetmix" data-bs-original-title="" title="" style="color: #ffffff; border-color: #ffffff; border-radius:20px; font-size: 22px; font-weight:300">Check our Apps</a>
</p>
</div>
</div>
</div>
</section>
<section class="s_text_block o_colored_level o_cc o_cc5" data-snippet="s_text_block" data-name="Text" style="position: relative; background-color: #29A1DC; color: #ffffff; ">
<div class="s_allow_columns container-fluid">
<div class="row d-flex mx-3 pb64">
<div class="o_colored_level col-lg-4" >
<h2 style="text-align: center;">
<span style="color: #ffffff; font-size: 36px; font-weight:500;">>11 <br/> years</span>
</h2>
<h5 style="text-align: center; color:#3d4856; font-size: 22px; font-weight:300">of Odoo experience
</h5>
</div>
<div class="o_colored_level col-lg-4" >
<h2 style="text-align: center;">
<span style="color: #ffffff; font-size: 36px; font-weight:500;">> 30 000 <br/> downloads</span>
</h2>
<h5 style="text-align: center; color:#3d4856; font-size: 22px; font-weight:300">of our apps from Odoo App Store
</h5>
</div>
<div class="o_colored_level col-lg-3" >
<h2 style="text-align: center;">
<span style="color: #ffffff; font-size: 36px; font-weight:500;">>400 <br/> clients</span>
</h2>
<h5 style="text-align: center; color:#3d4856; font-size: 22px; font-weight:300">
are happy with our services
</h5>
</div>
</div>
</div>
</section>
<section class="s_title o_colored_level o_cc o_cc1" style="position: relative; background-color: #0D3045">
<div style="background-color: #29A1DC !important; border-bottom-right-radius: 40px; border-bottom-left-radius: 40px; padding: 20px;">
&nbsp;
</div>
</section>
<section class="s_text_block pt64 pb48 o_colored_level" data-snippet="s_text_block" data-name="Text" style="background-color: #0D3045 !important; border-bottom-right-radius: 40px; border-bottom-left-radius: 40px;" data-bs-original-title="" title="" aria-describedby="tooltip180671">
<div class="s_allow_columns container mx-5" data-bs-original-title="" title="" aria-describedby="tooltip154809">
<h2 style="text-align: left; color:#ffffff; font-size: 48px; font-weight:500;">
Need support, customization<br/>or interested in collaboration ?
</h2>
<h5 class="pb32" style="font-size: 24px; left; color: #ffffff;">
<strong style="font-weight: 800; color: #29A1DC; vertical-align: text-bottom;">| </strong>cetmix.com
<br/>
</h5>
<p style="color: #ffffff;">
<span class="fa fa-linkedin-square fa-3x pt16 mr-3" data-bs-original-title="" title="" aria-describedby="tooltip359279" style="color: #29A1DC !important;"></span>
https://www.linkedin.com/company/cetmix/
</p>
<p style="color: #ffffff;">
<span class="fa fa-github-square fa-3x pt16 mr-3" data-bs-original-title="" title="" aria-describedby="tooltip359279" style="color: #29A1DC !important;"></span>
https://github.com/cetmix/
</p>
<p style="color: #ffffff;">
<span class="fa fa-facebook-square fa-3x pt16 mr-3" data-bs-original-title="" title="" aria-describedby="tooltip359279" style="color: #29A1DC !important;"></span>
https://www.facebook.com//cetmixteam
</p>
<p style="color: #ffffff;">
<span class="fa fa-twitter-square fa-3x pt16 mr-3" data-bs-original-title="" title="" aria-describedby="tooltip359279" style="color: #29A1DC !important;"></span>
https://twitter.com/cetmix_team
</p>
</div>
</div>
</section>
</div>
</section>

Binary file not shown.

After

Width:  |  Height:  |  Size: 291 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 716 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" id="Server"><path fill="#303c42" d="M2 7h20v3H2z" class="color303c42 svgShape"></path><path d="M2 7h20v3H2z" opacity=".1" fill="#000000" class="color000000 svgShape"></path><path fill="#303c42" d="M2 14h20v3H2z" class="color303c42 svgShape"></path><path d="M2 14h20v3H2z" opacity=".1" fill="#000000" class="color000000 svgShape"></path><path fill="#303c42" d="M1 3v4a1 1 0 0 0 1 1h20a1 1 0 0 0 1-1V3a1 1 0 0 0-1-1H2a1 1 0 0 0-1 1z" class="color303c42 svgShape"></path><path d="M22 7.75H2a1 1 0 0 1-1-1V7a1 1 0 0 0 1 1h20a1 1 0 0 0 1-1v-.25a1 1 0 0 1-1 1z" opacity=".2" fill="#000000" class="color000000 svgShape"></path><path fill="#ffffff" d="M22 2H2a1 1 0 0 0-1 1v.25a1 1 0 0 1 1-1h20a1 1 0 0 1 1 1V3a1 1 0 0 0-1-1z" opacity=".1" class="colorffffff svgShape"></path><circle cx="19.5" cy="5" r=".5" fill="#428eb3" class="color69b342 svgShape"></circle><circle cx="17.5" cy="5" r=".5" fill="#428eb3" class="color69b342 svgShape"></circle><circle cx="15.5" cy="5" r=".5" fill="#428eb3" class="color69b342 svgShape"></circle><circle cx="5" cy="5" r="1" fill="#29a1dc" class="colorc6cdd1 svgShape"></circle><linearGradient id="a" x1="4.368" x2="5.487" y1="4.368" y2="5.487" gradientUnits="userSpaceOnUse"><stop offset="0" stop-opacity=".1"></stop><stop offset="1" stop-opacity="0"></stop></linearGradient><circle cx="5" cy="5" r="1" fill="url(#a)"></circle><path fill="#303c42" d="M1 10v4a1 1 0 0 0 1 1h20a1 1 0 0 0 1-1v-4a1 1 0 0 0-1-1H2a1 1 0 0 0-1 1z" class="color303c42 svgShape"></path><path d="M22 14.75H2a1 1 0 0 1-1-1V14a1 1 0 0 0 1 1h20a1 1 0 0 0 1-1v-.25a1 1 0 0 1-1 1z" opacity=".2" fill="#000000" class="color000000 svgShape"></path><path fill="#ffffff" d="M22 9H2a1 1 0 0 0-1 1v.25a1 1 0 0 1 1-1h20a1 1 0 0 1 1 1V10a1 1 0 0 0-1-1z" opacity=".1" class="colorffffff svgShape"></path><circle cx="19.5" cy="12" r=".5" fill="#428eb3" class="color69b342 svgShape"></circle><circle cx="17.5" cy="12" r=".5" fill="#428eb3" class="color69b342 svgShape"></circle><circle cx="15.5" cy="12" r=".5" fill="#428eb3" class="color69b342 svgShape"></circle><circle cx="5" cy="12" r="1" fill="#29a1dc" class="colorc6cdd1 svgShape"></circle><linearGradient id="b" x1="4.368" x2="5.487" y1="11.368" y2="12.487" gradientUnits="userSpaceOnUse"><stop offset="0" stop-opacity=".1"></stop><stop offset="1" stop-opacity="0"></stop></linearGradient><circle cx="5" cy="12" r="1" fill="url(#b)"></circle><path fill="#303c42" d="M1 17v4a1 1 0 0 0 1 1h20a1 1 0 0 0 1-1v-4a1 1 0 0 0-1-1H2a1 1 0 0 0-1 1z" class="color303c42 svgShape"></path><path d="M22 21.75H2a1 1 0 0 1-1-1V21a1 1 0 0 0 1 1h20a1 1 0 0 0 1-1v-.25a1 1 0 0 1-1 1z" opacity=".2" fill="#000000" class="color000000 svgShape"></path><path fill="#ffffff" d="M22 16H2a1 1 0 0 0-1 1v.25a1 1 0 0 1 1-1h20a1 1 0 0 1 1 1V17a1 1 0 0 0-1-1z" opacity=".1" class="colorffffff svgShape"></path><circle cx="19.5" cy="19" r=".5" fill="#428eb3" class="color69b342 svgShape"></circle><circle cx="17.5" cy="19" r=".5" fill="#428eb3" class="color69b342 svgShape"></circle><circle cx="15.5" cy="19" r=".5" fill="#428eb3" class="color69b342 svgShape"></circle><circle cx="5" cy="19" r="1" fill="#29a1dc" class="colorc6cdd1 svgShape"></circle><linearGradient id="c" x1="4.368" x2="5.487" y1="18.368" y2="19.487" gradientUnits="userSpaceOnUse"><stop offset="0" stop-opacity=".1"></stop><stop offset="1" stop-opacity="0"></stop></linearGradient><circle cx="5" cy="19" r="1" fill="url(#c)"></circle><linearGradient id="d" x1="-.568" x2="24.568" y1="6.14" y2="17.86" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ffffff" stop-opacity=".2" class="stopColorffffff svgShape"></stop><stop offset="1" stop-color="#ffffff" stop-opacity="0" class="stopColorffffff svgShape"></stop></linearGradient><path fill="url(#d)" d="M23 7V3a1 1 0 0 0-1-1H2a1 1 0 0 0-1 1v4a1 1 0 0 0 1 1v1a1 1 0 0 0-1 1v4a1 1 0 0 0 1 1v1a1 1 0 0 0-1 1v4a1 1 0 0 0 1 1h20a1 1 0 0 0 1-1v-4a1 1 0 0 0-1-1v-1a1 1 0 0 0 1-1v-4a1 1 0 0 0-1-1V8a1 1 0 0 0 1-1z"></path></svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@@ -0,0 +1,93 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.1.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Server" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:#303C42;}
.st1{opacity:0.1;enable-background:new ;}
.st2{opacity:0.1;fill:#FFFFFF;enable-background:new ;}
.st3{opacity:0.2;enable-background:new ;}
.st4{fill:#428EB3;}
.st5{fill:#C6CDD1;}
.st6{fill:url(#SVGID_1_);}
.st7{fill:url(#SVGID_2_);}
.st8{fill:#D8DBDC;}
.st9{fill:#333333;}
.st10{fill:#4D4D4D;}
.st11{fill:url(#SVGID_3_);}
.st12{opacity:0.2;fill:#FFFFFF;enable-background:new ;}
.st13{fill:#29A1DC;}
.st14{fill:url(#SVGID_4_);}
.st15{fill:url(#SVGID_5_);}
.st16{fill:url(#SVGID_6_);}
</style>
<path class="st0" d="M2.8,6h14.7v1.8H2.8V6z"/>
<path class="st1" d="M2.8,6h14.7v1.8H2.8V6z"/>
<path class="st0" d="M17.5,6.5H2.8C2.3,6.5,1.8,6,1.8,5.5V2.8c0-0.5,0.4-0.9,0.9-0.9h14.7c0.5,0,0.9,0.4,0.9,0.9v2.8
C18.4,6,18,6.5,17.5,6.5z"/>
<path class="st2" d="M17.5,1.9H2.8c-0.5,0-0.9,0.4-0.9,0.9V3c0-0.5,0.4-0.9,0.9-0.9h14.7c0.5,0,0.9,0.4,0.9,0.9V2.8
C18.4,2.3,18,1.9,17.5,1.9z"/>
<path class="st3" d="M17.5,6.2H2.8c-0.5,0-0.9-0.4-0.9-0.9v0.2c0,0.5,0.4,0.9,0.9,0.9h14.7c0.5,0,0.9-0.4,0.9-0.9V5.3
C18.4,5.8,18,6.2,17.5,6.2z"/>
<path class="st0" d="M17.5,12H2.8c-0.5,0-0.9-0.4-0.9-0.9V8.3c0-0.5,0.4-0.9,0.9-0.9h14.7c0.5,0,0.9,0.4,0.9,0.9v2.8
C18.4,11.6,18,12,17.5,12z"/>
<circle class="st4" cx="16.1" cy="9.7" r="0.5"/>
<circle class="st4" cx="14.3" cy="9.7" r="0.5"/>
<circle class="st4" cx="12.4" cy="9.7" r="0.5"/>
<circle class="st5" cx="4.1" cy="9.7" r="0.9"/>
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="3.5643" y1="16.9049" x2="4.5946" y2="15.8746" gradientTransform="matrix(1 0 0 -1 0 26)">
<stop offset="0" style="stop-color:#000000;stop-opacity:0.1"/>
<stop offset="1" style="stop-color:#000000;stop-opacity:0"/>
</linearGradient>
<circle class="st6" cx="4.1" cy="9.7" r="0.9"/>
<circle class="st4" cx="16.1" cy="4.2" r="0.5"/>
<circle class="st4" cx="14.3" cy="4.2" r="0.5"/>
<circle class="st4" cx="12.4" cy="4.2" r="0.5"/>
<path class="st2" d="M17.5,7.4H2.8c-0.5,0-0.9,0.4-0.9,0.9v0.2c0-0.5,0.4-0.9,0.9-0.9h14.7c0.5,0,0.9,0.4,0.9,0.9V8.3
C18.4,7.8,18,7.4,17.5,7.4z"/>
<path class="st3" d="M17.5,11.7H2.8c-0.5,0-0.9-0.4-0.9-0.9v0.2c0,0.5,0.4,0.9,0.9,0.9h14.7c0.5,0,0.9-0.4,0.9-0.9v-0.2
C18.4,11.3,18,11.7,17.5,11.7z"/>
<circle class="st5" cx="4.1" cy="4.2" r="0.9"/>
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="3.5643" y1="22.4291" x2="4.5946" y2="21.3988" gradientTransform="matrix(1 0 0 -1 0 26)">
<stop offset="0" style="stop-color:#000000;stop-opacity:0.1"/>
<stop offset="1" style="stop-color:#000000;stop-opacity:0"/>
</linearGradient>
<circle class="st7" cx="4.1" cy="4.2" r="0.9"/>
<path class="st8" d="M17,19.3c0-0.3-0.2-0.5-0.5-0.5c-0.3,0-0.5,0.2-0.5,0.5h-1.8c0-0.3-0.2-0.5-0.5-0.5s-0.5,0.2-0.5,0.5
c0,1-0.5,1.8-0.9,1.8v0.5H18v-0.5C17.5,21.2,17,20.3,17,19.3z"/>
<path class="st9" d="M22.1,10.6c0-0.8-0.6-1.4-1.4-1.4h-11c-0.8,0-1.4,0.6-1.4,1.4V18h13.8V10.6z"/>
<path class="st8" d="M8.3,18v0.5c0,0.8,0.6,1.4,1.4,1.4h11c0.8,0,1.4-0.6,1.4-1.4V18H8.3z"/>
<path class="st1" d="M20.7,19.6h-11c-0.8,0-1.4-0.6-1.4-1.4v0.2c0,0.8,0.6,1.4,1.4,1.4h11c0.8,0,1.4-0.6,1.4-1.4v-0.2
C22.1,19,21.5,19.6,20.7,19.6z"/>
<path class="st2" d="M9.7,9.4h11c0.8,0,1.4,0.6,1.4,1.4v-0.2c0-0.8-0.6-1.4-1.4-1.4h-11c-0.8,0-1.4,0.6-1.4,1.4v0.2
C8.3,10.1,8.9,9.4,9.7,9.4z"/>
<path class="st10" d="M21.2,10.6c0-0.3-0.2-0.5-0.5-0.5h-11c-0.3,0-0.5,0.2-0.5,0.5V17h12V10.6z"/>
<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="9.0616" y1="15.1862" x2="21.4007" y2="9.4328" gradientTransform="matrix(1 0 0 -1 0 26)">
<stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.2"/>
<stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0"/>
</linearGradient>
<path class="st11" d="M21.2,10.6c0-0.3-0.2-0.5-0.5-0.5h-11c-0.3,0-0.5,0.2-0.5,0.5V17h12V10.6z"/>
<path class="st8" d="M18,22.1h-5.5c-0.3,0-0.5-0.2-0.5-0.5c0-0.3,0.2-0.5,0.5-0.5H18c0.3,0,0.5,0.2,0.5,0.5
C18.4,21.9,18.2,22.1,18,22.1z"/>
<path class="st12" d="M12.4,21.4H18c0.2,0,0.4,0.1,0.4,0.3c0,0,0-0.1,0-0.1c0-0.3-0.2-0.5-0.5-0.5h-5.5c-0.3,0-0.5,0.2-0.5,0.5
c0,0,0,0.1,0,0.1C12,21.6,12.2,21.4,12.4,21.4z"/>
<circle class="st13" cx="15.2" cy="18.9" r="0.5"/>
<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="14.7771" y1="7.3105" x2="15.6119" y2="6.9216" gradientTransform="matrix(1 0 0 -1 0 26)">
<stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.2"/>
<stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0"/>
</linearGradient>
<circle class="st14" cx="15.2" cy="18.9" r="0.5"/>
<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="14.4175" y1="6.9761" x2="16.8002" y2="4.5933" gradientTransform="matrix(1 0 0 -1 0 26)">
<stop offset="0" style="stop-color:#000000;stop-opacity:0.1"/>
<stop offset="1" style="stop-color:#000000;stop-opacity:0"/>
</linearGradient>
<path class="st15" d="M17.1,19.8h-3.8l1.4,1.4H18C17.6,21.2,17.2,20.6,17.1,19.8z"/>
<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="0.5921" y1="20.7473" x2="23.4202" y2="10.102" gradientTransform="matrix(1 0 0 -1 0 26)">
<stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.2"/>
<stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0"/>
</linearGradient>
<path class="st16" d="M20.7,9.2h-2.3V8.3c0-0.5-0.4-0.9-0.9-0.9V6.5c0.5,0,0.9-0.4,0.9-0.9V2.8c0-0.5-0.4-0.9-0.9-0.9H2.8
c-0.5,0-0.9,0.4-0.9,0.9v2.8c0,0.5,0.4,0.9,0.9,0.9v0.9c-0.5,0-0.9,0.4-0.9,0.9v2.8c0,0.5,0.4,0.9,0.9,0.9h5.5v6.4
c0,0.8,0.6,1.4,1.4,1.4h3.6c-0.1,0.8-0.5,1.4-0.9,1.4c-0.3,0-0.5,0.2-0.5,0.5c0,0.3,0.2,0.5,0.5,0.5H18c0.3,0,0.5-0.2,0.5-0.5
c0-0.3-0.2-0.5-0.5-0.5c-0.4,0-0.8-0.6-0.9-1.4h3.6c0.8,0,1.4-0.6,1.4-1.4v-7.8C22.1,9.8,21.5,9.2,20.7,9.2z"/>
</svg>

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 272 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

View File

@@ -0,0 +1,159 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 25.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Server" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:#303C42;}
.st1{opacity:0.1;enable-background:new ;}
.st2{opacity:0.2;enable-background:new ;}
.st3{opacity:0.1;fill:#FFFFFF;enable-background:new ;}
.st4{fill:#428EB3;}
.st5{fill:#C6CDD1;}
.st6{fill:url(#SVGID_1_);}
.st7{fill:url(#SVGID_2_);}
.st8{fill:none;}
.st9{fill:url(#SVGID_3_);}
.st10{fill:#29A1DC;}
.st11{fill:#EFF2F4;}
.st12{fill:#ACB5BA;}
.st13{fill:#CEDAE0;}
.st14{fill:#E6EBEE;}
.st15{fill:#3F5C6B;}
.st16{fill:#22353F;}
.st17{fill:#2B424E;}
.st18{fill:#324F5E;}
</style>
<path class="st0" d="M2,7.5h18.2v2.7H2V7.5z"/>
<path class="st1" d="M2,7.5h18.2v2.7H2V7.5z"/>
<path class="st0" d="M1.1,3.8v3.6c0,0.6,0.4,1,0.9,1h18.2c0.5,0,0.9-0.4,0.9-0.9V3.8c0-0.5-0.4-0.9-0.9-0.9H2
C1.5,2.9,1.1,3.3,1.1,3.8z"/>
<path class="st2" d="M20.2,8.1H2c-0.5,0-0.9-0.4-0.9-0.9v0.2c0,0.6,0.4,1,0.9,1h18.2c0.5,0,0.9-0.4,0.9-0.9V7.2
C21.1,7.7,20.7,8.1,20.2,8.1z"/>
<path class="st3" d="M20.2,2.9H2c-0.5,0-0.9,0.4-0.9,0.9V4c0-0.5,0.4-0.9,0.9-0.9h18.2c0.5,0,0.9,0.4,0.9,0.9V3.8
C21.1,3.3,20.7,2.9,20.2,2.9z"/>
<circle class="st4" cx="17.9" cy="5.6" r="0.5"/>
<circle class="st4" cx="16.1" cy="5.6" r="0.5"/>
<circle class="st4" cx="14.3" cy="5.6" r="0.5"/>
<circle class="st5" cx="4.7" cy="5.6" r="0.9"/>
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="4.1668" y1="-1953.0668" x2="5.1828" y2="-1954.0828" gradientTransform="matrix(1 0 0 -1 0 -1948)">
<stop offset="0" style="stop-color:#000000;stop-opacity:0.1"/>
<stop offset="1" style="stop-color:#000000;stop-opacity:0"/>
</linearGradient>
<circle class="st6" cx="4.7" cy="5.6" r="0.9"/>
<path class="st0" d="M1.1,10.2v3.6c0,0.5,0.4,0.9,0.9,0.9h18.2c0.5,0,0.9-0.4,0.9-0.9v-3.6c0-0.5-0.4-0.9-0.9-0.9H2
C1.5,9.3,1.1,9.7,1.1,10.2z"/>
<path class="st2" d="M20.2,14.5H2c-0.5,0-0.9-0.4-0.9-0.9v0.2c0,0.5,0.4,0.9,0.9,0.9h18.2c0.5,0,0.9-0.4,0.9-0.9v-0.2
C21.1,14.1,20.7,14.5,20.2,14.5z"/>
<path class="st3" d="M20.2,9.3H2c-0.5,0-0.9,0.4-0.9,0.9v0.2c0-0.5,0.4-0.9,0.9-0.9h18.2c0.5,0,0.9,0.4,0.9,0.9v-0.2
C21.1,9.7,20.7,9.3,20.2,9.3z"/>
<circle class="st4" cx="17.9" cy="12" r="0.5"/>
<circle class="st4" cx="16.1" cy="12" r="0.5"/>
<circle class="st4" cx="14.3" cy="12" r="0.5"/>
<circle class="st5" cx="4.7" cy="12" r="0.9"/>
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="4.1445" y1="-1959.4445" x2="5.1605" y2="-1960.4604" gradientTransform="matrix(1 0 0 -1 0 -1948)">
<stop offset="0" style="stop-color:#000000;stop-opacity:0.1"/>
<stop offset="1" style="stop-color:#000000;stop-opacity:0"/>
</linearGradient>
<circle class="st7" cx="4.7" cy="12" r="0.9"/>
<path class="st8" d="M19.1,13c0,0.4,0.3,0.7,0.7,0.8l0,0c0.4,0,0.8-0.3,0.8-0.8c0-0.4-0.3-0.7-0.7-0.8c0,0,0,0-0.1,0
C19.5,12.3,19.1,12.6,19.1,13L19.1,13z"/>
<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="0.6335" y1="1978.4908" x2="25.081" y2="1989.8916" gradientTransform="matrix(1 0 0 1 0 -1974)">
<stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.2"/>
<stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0"/>
</linearGradient>
<path class="st9" d="M22.4,13.8H21v-3.6c0-0.5-0.4-0.9-0.9-0.9V8.4C20.6,8.4,21,8,21,7.5V3.8c0-0.5-0.4-0.9-0.9-0.9H2
C1.5,2.9,1,3.3,1,3.8v3.6c0,0.6,0.4,1,0.9,1v0.9C1.5,9.3,1,9.7,1,10.2v3.6c0,0.5,0.4,0.9,0.9,0.9h10.9v5.9c0,0.3,0.2,0.5,0.5,0.5
h9.1c0.3,0,0.5-0.2,0.5-0.5v-6.4C22.9,14,22.7,13.8,22.4,13.8z"/>
<path class="st10" d="M22.4,16.2c0,2.7-2.2,4.8-4.8,4.8c-2.7,0-4.8-2.1-4.8-4.8c0-2.7,2.2-4.8,4.8-4.8
C20.2,11.3,22.4,13.5,22.4,16.2z"/>
<path class="st11" d="M22,12.7l-0.5-0.1c0,0-0.1,0-0.1-0.1c0-0.2-0.1-0.3-0.2-0.5c0,0,0-0.1,0-0.1l0.2-0.4c0,0,0-0.1,0-0.1l-0.3-0.3
c0,0-0.1,0-0.1,0l-0.4,0.2c0,0-0.1,0-0.1,0c-0.1-0.1-0.3-0.1-0.4-0.2c0,0-0.1,0-0.1-0.1L20,10.6c0,0-0.1-0.1-0.1-0.1h-0.4
c0,0-0.1,0-0.1,0.1l-0.1,0.5c0,0,0,0.1-0.1,0.1c0,0-0.1,0-0.1,0c-0.1,0-0.2,0.1-0.2,0.1c0,0-0.1,0-0.1,0.1c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0l-0.4-0.2c0,0-0.1,0-0.1,0l-0.2,0.2h0l-0.1,0.1h0c0,0,0,0,0,0.1c0,0,0,0.1,0,0.1l0.2,0.4
c0,0,0,0,0,0c0,0,0,0.1,0,0.1c-0.1,0.1-0.1,0.3-0.2,0.5c0,0,0,0.1-0.1,0.1l-0.5,0.1c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0.1v0.4
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0l0.5,0.1c0,0,0.1,0,0.1,0.1c0,0.2,0.1,0.3,0.2,0.5c0,0,0,0.1,0,0.1l-0.2,0.4
c0,0,0,0.1,0,0.1c0,0,0,0,0,0.1h0l0.3,0.3c0,0,0.1,0,0.1,0l0.4-0.2c0,0,0,0,0,0c0,0,0.1,0,0.1,0c0,0,0.1,0,0.1,0.1
c0.1,0,0.2,0.1,0.2,0.1c0,0,0.1,0,0.1,0c0,0,0.1,0,0.1,0.1l0.1,0.5c0,0,0.1,0.1,0.1,0.1h0.4c0.1,0,0.1,0,0.1-0.1l0.1-0.5
c0,0,0-0.1,0.1-0.1c0.2,0,0.3-0.1,0.4-0.2c0,0,0.1,0,0.1,0l0.4,0.2c0,0,0.1,0,0.1,0l0.3-0.3c0,0,0-0.1,0-0.1l-0.2-0.4
c0,0,0-0.1,0-0.1c0.1-0.1,0.1-0.3,0.2-0.5c0,0,0,0,0-0.1c0,0,0,0,0,0l0.5-0.1c0,0,0.1-0.1,0.1-0.1v-0.4C22.1,12.8,22.1,12.7,22,12.7
z M19.8,14.1c-0.1,0-0.3,0-0.4,0c-0.2,0-0.4-0.1-0.6-0.3c0,0,0,0,0,0c-0.1-0.2-0.2-0.3-0.2-0.5c0-0.1,0-0.3,0-0.4
c0-0.5,0.4-0.9,0.8-1c0.2,0,0.3-0.1,0.5,0c0,0,0,0,0,0c0.2,0,0.4,0.1,0.6,0.3c0,0,0,0,0,0c0.1,0.1,0.1,0.1,0.1,0.2l0,0
c0.1,0.1,0.1,0.3,0.1,0.4C20.9,13.4,20.4,14,19.8,14.1C19.8,14.1,19.8,14.1,19.8,14.1z"/>
<path class="st8" d="M18.9,13c0,0.4,0.3,0.7,0.7,0.8c0,0,0,0,0,0c0.4,0,0.8-0.3,0.8-0.8c0-0.4-0.3-0.7-0.7-0.8c0,0,0,0-0.1,0
C19.2,12.3,18.9,12.6,18.9,13L18.9,13z"/>
<path class="st12" d="M20.8,13c0-0.6-0.5-1.2-1.1-1.2c0.1,0.1,0.2,0.2,0.1,0.3c0,0.1-0.1,0.1-0.2,0.1c0.4,0,0.7,0.4,0.7,0.8
c0,0.4-0.3,0.8-0.8,0.8c0,0,0,0,0,0c-0.1,0-0.2,0.1-0.2,0.2c0,0.1,0.1,0.2,0.2,0.2c0,0,0,0,0.1,0C20.3,14.2,20.8,13.7,20.8,13z"/>
<path class="st13" d="M18.9,13.3c0-0.1-0.1-0.2-0.1-0.3c0-0.4,0.3-0.8,0.8-0.8c0,0,0,0,0.1,0c0.1,0,0.2-0.2,0.2-0.3
c0-0.1-0.1-0.1-0.1-0.2c0,0-0.1,0-0.1,0c-0.7,0-1.2,0.5-1.2,1.2c0,0.1,0,0.2,0,0.3C18.5,13.3,18.9,13.3,18.9,13.3z"/>
<path class="st13" d="M19.7,13.8C19.7,13.8,19.6,13.8,19.7,13.8c-0.5,0-0.8-0.3-0.8-0.8c0,0,0,0,0-0.1h-0.5c0,0,0,0,0,0.1
c0,0.7,0.5,1.2,1.2,1.2c0,0,0,0,0.1,0c0.1,0,0.2-0.1,0.2-0.2C19.9,13.9,19.8,13.8,19.7,13.8z"/>
<path class="st8" d="M20.5,13c0,0.5-0.4,0.8-0.8,0.9c0,0,0,0,0,0c-0.5,0-0.9-0.4-0.9-0.9c0-0.5,0.3-0.8,0.8-0.8c0,0,0,0,0.1,0
C20.1,12.2,20.5,12.6,20.5,13L20.5,13z"/>
<path class="st14" d="M19.2,14.8c-0.6-0.4-1-1-1-1.8c0-0.8,0.4-1.4,1-1.8v-0.1c-0.2,0-0.3,0.1-0.5,0.2c0,0-0.1,0-0.1,0l-0.4-0.2
c0,0-0.1,0-0.1,0l-0.3,0.3c0,0,0,0.1,0,0.1l0.2,0.4c0,0,0,0.1,0,0.1c-0.1,0.1-0.1,0.3-0.2,0.5c0,0,0,0.1-0.1,0.1l-0.5,0.1
c0,0-0.1,0.1-0.1,0.1v0.4c0,0.1,0,0.1,0.1,0.1l0.5,0.1c0,0,0.1,0,0.1,0.1c0,0.2,0.1,0.3,0.2,0.5c0,0,0,0.1,0,0.1l-0.2,0.4
c0,0,0,0.1,0,0.1l0.3,0.3c0,0,0.1,0,0.1,0l0.4-0.2c0,0,0.1,0,0.1,0C18.8,14.8,19,14.9,19.2,14.8L19.2,14.8L19.2,14.8z"/>
<path class="st15" d="M23,18.3l-0.3-0.1c0,0-0.1,0-0.1-0.1c0-0.1-0.1-0.2-0.1-0.3c0,0,0-0.1,0-0.1l0.2-0.3c0,0,0-0.1,0-0.1l-0.2-0.2
c0,0-0.1,0-0.1,0l-0.3,0.2c0,0-0.1,0-0.1,0c-0.1-0.1-0.2-0.1-0.3-0.1c0,0-0.1,0-0.1-0.1l-0.1-0.3c0,0,0-0.1-0.1-0.1h-0.3
c0,0-0.1,0-0.1,0.1l-0.1,0.3c0,0,0,0-0.1,0.1c0,0,0,0-0.1,0c-0.1,0-0.1,0-0.2,0.1c0,0-0.1,0-0.1,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0l-0.3-0.2c0,0-0.1,0-0.1,0l-0.2,0.2h0l0,0h0c0,0,0,0,0,0c0,0,0,0,0,0.1l0.2,0.3c0,0,0,0,0,0
c0,0,0,0,0,0.1c-0.1,0.1-0.1,0.2-0.1,0.3c0,0,0,0-0.1,0.1l-0.3,0.1c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0v0.3c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0l0.3,0.1c0,0,0.1,0,0.1,0.1c0,0.1,0.1,0.2,0.1,0.3c0,0,0,0.1,0,0.1l-0.2,0.3c0,0,0,0,0,0.1
c0,0,0,0,0,0h0l0.2,0.2c0,0,0.1,0,0.1,0l0.3-0.2c0,0,0,0,0,0c0,0,0,0,0.1,0c0,0,0.1,0,0.1,0c0.1,0,0.1,0.1,0.2,0.1c0,0,0,0,0.1,0
c0,0,0.1,0,0.1,0.1l0.1,0.3c0,0,0,0.1,0.1,0.1h0.3c0,0,0.1,0,0.1-0.1l0.1-0.3c0,0,0-0.1,0.1-0.1c0.1,0,0.2-0.1,0.3-0.1
c0,0,0.1,0,0.1,0l0.3,0.2c0,0,0.1,0,0.1,0l0.2-0.2c0,0,0-0.1,0-0.1l-0.2-0.3c0,0,0-0.1,0-0.1c0.1-0.1,0.1-0.2,0.1-0.3c0,0,0,0,0,0
c0,0,0,0,0,0l0.3-0.1c0,0,0.1,0,0.1-0.1L23,18.3C23.1,18.3,23.1,18.3,23,18.3L23,18.3z M21.4,19.3c-0.1,0-0.2,0-0.3,0
c-0.1,0-0.3-0.1-0.5-0.2c0,0,0,0,0,0c-0.1-0.1-0.2-0.3-0.2-0.4c0-0.1,0-0.2,0-0.3c0-0.4,0.3-0.7,0.6-0.8c0.1,0,0.2,0,0.4,0
c0,0,0,0,0,0c0.1,0,0.3,0.1,0.4,0.2c0,0,0,0,0,0c0,0.1,0.1,0.1,0.1,0.2l0,0c0,0.1,0.1,0.2,0.1,0.3C22.2,18.8,21.9,19.3,21.4,19.3
C21.4,19.3,21.4,19.3,21.4,19.3L21.4,19.3z"/>
<path class="st8" d="M20.7,18.5c0,0.3,0.2,0.5,0.5,0.6c0,0,0,0,0,0c0.3,0,0.6-0.3,0.6-0.6c0-0.3-0.2-0.5-0.5-0.6c0,0,0,0,0,0
C20.9,18,20.7,18.2,20.7,18.5z"/>
<path class="st16" d="M22.2,18.5c0-0.5-0.4-0.9-0.8-0.9c0.1,0,0.1,0.1,0.1,0.2c0,0-0.1,0.1-0.1,0.1c0.3,0,0.5,0.3,0.5,0.6
c0,0.3-0.3,0.6-0.6,0.6c0,0,0,0,0,0c-0.1,0-0.1,0.1-0.1,0.2c0,0.1,0.1,0.1,0.1,0.2c0,0,0,0,0,0C21.8,19.4,22.2,19,22.2,18.5
L22.2,18.5z"/>
<path class="st17" d="M21.3,17.6c-0.1,0-0.2,0-0.2,0V18c0.1,0,0.1,0,0.2,0c0.3,0,0.5,0.2,0.6,0.5c0-0.1,0.1-0.2,0.2-0.1
c0.1,0,0.1,0.1,0.1,0.1c0,0,0,0,0,0C22.1,18,21.7,17.6,21.3,17.6L21.3,17.6z"/>
<path class="st16" d="M20.7,18.7c0-0.1,0-0.1,0-0.2c0-0.3,0.3-0.6,0.6-0.6c0,0,0,0,0,0c0.1,0,0.2-0.1,0.1-0.2c0-0.1-0.1-0.1-0.1-0.1
c0,0,0,0-0.1,0c-0.5,0-0.9,0.4-0.9,0.9c0,0.1,0,0.2,0,0.2C20.4,18.7,20.7,18.7,20.7,18.7z"/>
<path class="st17" d="M21.3,19.1C21.3,19.1,21.3,19.1,21.3,19.1c-0.3,0-0.6-0.2-0.6-0.6c0,0,0,0,0-0.1h-0.3c0,0,0,0,0,0.1
c0,0.5,0.4,0.9,0.9,0.9c0,0,0,0,0,0c0.1,0,0.1-0.1,0.1-0.2C21.4,19.2,21.4,19.1,21.3,19.1L21.3,19.1z"/>
<path class="st8" d="M21.9,18.5c0,0.3-0.3,0.6-0.6,0.6c0,0,0,0,0,0c-0.4,0-0.6-0.3-0.6-0.6c0-0.3,0.3-0.6,0.6-0.6c0,0,0,0,0,0
C21.6,17.9,21.9,18.2,21.9,18.5L21.9,18.5z"/>
<path class="st18" d="M20.9,19.9c-0.4-0.3-0.7-0.8-0.7-1.3c0-0.6,0.3-1.1,0.7-1.3v-0.1c-0.1,0-0.2,0.1-0.4,0.1c0,0-0.1,0-0.1,0
l-0.3-0.2c0,0-0.1,0-0.1,0l-0.2,0.2c0,0,0,0.1,0,0.1l0.2,0.3c0,0,0,0.1,0,0.1c-0.1,0.1-0.1,0.2-0.1,0.3c0,0,0,0.1-0.1,0.1l-0.3,0.1
c0,0-0.1,0-0.1,0.1v0.3c0,0,0,0.1,0.1,0.1l0.3,0.1c0,0,0.1,0,0.1,0.1c0,0.1,0.1,0.2,0.1,0.3c0,0,0,0.1,0,0.1l-0.2,0.3
c0,0,0,0.1,0,0.1l0.2,0.2c0,0,0.1,0,0.1,0l0.3-0.2c0,0,0.1,0,0.1,0C20.7,19.8,20.8,19.9,20.9,19.9C20.9,19.9,20.9,19.9,20.9,19.9z"
/>
<path class="st15" d="M19.3,16.9l-0.9-0.1c0,0-0.1,0-0.1-0.1c0-0.1,0-0.1-0.1-0.2c0,0,0-0.1,0-0.1l0.6-0.6c0,0,0-0.1,0-0.2l-0.4-0.5
c0,0-0.1-0.1-0.2,0l-0.8,0.4c0,0-0.1,0-0.1,0c-0.1,0-0.1-0.1-0.2-0.1c0,0-0.1-0.1-0.1-0.1l0.1-0.9c0-0.1,0-0.1-0.1-0.1L16.7,14
c-0.1,0-0.1,0-0.1,0.1l-0.4,0.8c0,0-0.1,0.1-0.1,0.1c0,0-0.1,0-0.1,0c0,0-0.1,0-0.1,0c0,0-0.1,0-0.1-0.1l-0.1-0.3L15.3,14
c0-0.1-0.1-0.1-0.1-0.1l-0.6,0.2c-0.1,0-0.1,0.1-0.1,0.1l0.1,0.9c0,0,0,0.1-0.1,0.1c-0.1,0-0.1,0.1-0.2,0.1c0,0-0.1,0-0.1,0L13.5,15
c-0.1,0-0.1,0-0.2,0L13,15.6c0,0,0,0.1,0,0.2l0.6,0.6c0,0,0,0.1,0,0.1c0,0.1,0,0.1-0.1,0.2c0,0-0.1,0.1-0.1,0.1l-0.7,0.1
c0,0.3,0.1,0.6,0.2,1l0.5,0.1c0,0,0.1,0,0.1,0.1c0,0.1,0,0.1,0.1,0.2c0,0,0,0.1,0,0.1l-0.3,0.3c0.2,0.3,0.4,0.6,0.6,0.8l0.3-0.2
c0,0,0.1,0,0.1,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0.1,0.1,0.2,0.1c0,0,0.1,0.1,0.1,0.1L14.6,20c0.3,0.2,0.5,0.4,0.8,0.5l0.3-0.6
c0,0,0.1-0.1,0.1-0.1h0.2c0,0,0.1,0,0.1,0.1l0.4,0.8c0,0.1,0.1,0.1,0.1,0.1l0.6-0.2c0.1,0,0.1-0.1,0.1-0.1l-0.1-0.9
c0-0.1,0-0.1,0.1-0.1c0.1,0,0.1-0.1,0.2-0.1c0,0,0.1,0,0.1,0l0.8,0.4c0.1,0,0.1,0,0.2,0l0.4-0.5c0-0.1,0-0.1,0-0.2l-0.6-0.6
c0,0,0-0.1,0-0.1c0-0.1,0.1-0.1,0.1-0.2c0,0,0-0.1,0.1-0.1l0.9-0.1c0.1,0,0.1-0.1,0.1-0.1v-0.6C19.4,17,19.4,17,19.3,16.9z
M15.2,18.3C15.2,18.3,15.2,18.2,15.2,18.3c-0.1-0.1-0.1-0.1-0.2-0.2c0,0-0.1-0.1-0.1-0.1c0-0.1-0.1-0.1-0.1-0.2c0-0.1,0-0.1,0-0.2
c0-0.1,0-0.2,0-0.2v0c0-0.6,0.5-1.2,1.2-1.2c0,0,0.1,0,0.1,0l0.1,0c0,0,0,0,0.1,0c0,0,0.1,0,0.1,0c0,0,0.1,0,0.1,0s0.1,0,0.1,0
l0.1,0c0,0,0,0,0.1,0.1l0.1,0.1c0.1,0.1,0.1,0.1,0.1,0.2c0,0,0,0.1,0.1,0.1c0,0,0,0.1,0,0.1c0,0,0,0.1,0,0.1c0,0,0,0.1,0,0.1
c0,0.1,0,0.2,0,0.2l0,0.2c0,0,0,0.1,0,0.1l-0.2,0.4c0,0,0,0.1-0.1,0.1c0,0,0,0-0.1,0.1c0,0-0.1,0.1-0.1,0.1c0,0-0.1,0-0.1,0.1
c-0.1,0-0.1,0.1-0.2,0.1c0,0-0.1,0-0.1,0C15.9,18.6,15.6,18.5,15.2,18.3C15.3,18.3,15.3,18.3,15.2,18.3z"/>
<path class="st18" d="M15.3,14c0-0.1-0.1-0.1-0.1-0.1l-0.6,0.2c-0.1,0-0.1,0.1-0.1,0.1l0.1,0.9c0,0,0,0.1-0.1,0.1
c-0.1,0-0.1,0.1-0.2,0.1c0,0-0.1,0-0.1,0L13.5,15c-0.1,0-0.1,0-0.2,0L13,15.6c0,0,0,0.1,0,0.2l0.6,0.6c0,0,0,0.1,0,0.1
c0,0.1,0,0.1-0.1,0.2c0,0-0.1,0.1-0.1,0.1l-0.7,0.1c0,0.3,0.1,0.6,0.2,1l0.5,0.1c0,0,0.1,0,0.1,0.1c0,0.1,0,0.1,0.1,0.2
c0,0,0,0.1,0,0.1l-0.3,0.3c0.2,0.3,0.4,0.6,0.6,0.8l0.3-0.2c0,0,0.1,0,0.1,0c0,0,0,0,0,0l0,0v0c-0.1-0.4-0.2-0.9-0.2-1.4
c0,0,0,0,0-0.1c0-0.2,0-0.4,0-0.6c0-0.3,0.1-0.6,0.2-0.9c0,0,0-0.1,0-0.1c0.2-0.7,0.6-1.4,1.1-1.8L15.3,14z"/>
<path class="st17" d="M17.2,16.1c-0.3-0.3-0.8-0.5-1.2-0.5c-0.1,0-0.2,0-0.3,0c-0.5,0.1-0.9,0.4-1.2,0.8c-0.2,0.3-0.3,0.6-0.3,0.9
c0,0.2,0,0.3,0.1,0.5c0.1,0.3,0.2,0.6,0.5,0.8c0.4,0.4,0.9,0.6,1.5,0.5c0.4,0,0.8-0.2,1-0.5c0.2-0.2,0.4-0.6,0.5-0.9v0
c0-0.1,0-0.2,0-0.3C17.7,16.9,17.5,16.4,17.2,16.1z M15.3,18.3C15.3,18.3,15.3,18.3,15.3,18.3c-0.1-0.1-0.1-0.1-0.2-0.1
c0,0-0.1-0.1-0.1-0.1c0,0-0.1-0.1-0.1-0.1c0-0.1-0.1-0.1-0.1-0.2c0-0.1,0-0.1,0-0.2c0-0.1,0-0.2,0-0.2v0c0-0.6,0.5-1.2,1.2-1.2
c0,0,0.1,0,0.1,0l0.1,0c0,0,0,0,0.1,0c0,0,0.1,0,0.1,0c0,0,0.1,0,0.1,0c0,0,0.1,0,0.1,0l0.1,0c0,0,0,0,0.1,0.1l0.1,0.1
c0.1,0.1,0.1,0.1,0.1,0.2c0,0,0,0.1,0.1,0.1s0,0.1,0,0.1c0,0,0,0.1,0,0.1c0,0,0,0.1,0,0.1c0,0.1,0,0.2,0,0.2l0,0.2c0,0,0,0.1,0,0.1
l-0.2,0.4c0,0,0,0.1-0.1,0.1c0,0,0,0-0.1,0.1c0,0-0.1,0.1-0.1,0.1c0,0-0.1,0-0.1,0.1c-0.1,0-0.1,0.1-0.2,0.1c0,0-0.1,0-0.1,0
c-0.1,0-0.2,0-0.2,0C15.7,18.5,15.5,18.5,15.3,18.3z"/>
<path class="st16" d="M14.5,17.4c0.1,0,0.3-0.1,0.3-0.2c0-0.2,0.2-0.4,0.3-0.6c0.2-0.2,0.4-0.3,0.6-0.3c0.1,0,0.2-0.1,0.2-0.3
c0-0.2-0.2-0.3-0.3-0.3c-0.3,0.1-0.7,0.2-0.9,0.5c-0.2,0.2-0.4,0.6-0.5,0.9C14.2,17.2,14.3,17.4,14.5,17.4z M17.4,17.4
c-0.1,0-0.3,0.1-0.3,0.2c0,0.2-0.2,0.4-0.3,0.6c-0.2,0.2-0.4,0.3-0.6,0.3c-0.1,0-0.2,0.1-0.2,0.3c0,0.2,0.2,0.3,0.3,0.3
c0.3-0.1,0.7-0.2,0.9-0.5c0.2-0.2,0.4-0.6,0.5-0.9C17.7,17.6,17.6,17.4,17.4,17.4z"/>
</svg>

After

Width:  |  Height:  |  Size: 14 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 988 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 333 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -0,0 +1,308 @@
================
Cetmix Tower AWS
================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:e427fa4368b78aacbc6faa6232b54496e83fbe4905ddef4cc17f3913e5ee3ee0
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-cetmix%2Fcetmix--tower-lightgray.png?logo=github
:target: https://github.com/cetmix/cetmix-tower/tree/18.0/cetmix_tower_aws
:alt: cetmix/cetmix-tower
|badge1| |badge2| |badge3|
**⚠️ DISCLAIMER: TECHNICAL MODULE**
This module integrates Boto3 library, the Amazon Web Services (AWS)
Software Development Kit (SDK) for Python, into the Cetmix Tower.
**This is a technical module intended for system administrators or
DevOps professionals.** It may involve server configuration,
infrastructure management, or advanced setup outside the standard
Odoo interface. Not intended for direct use by end users.
**Table of contents**
.. contents::
:local:
Use Cases / Context
===================
Although Amazon Web Services (AWS) allows API calls without using an
SDK, we found that integrating the Amazon SDK into Cetmix Tower makes
provisioning, configuring, and maintaining AWS instances more convenient
for the end user. However, not all Cetmix Tower users require this
functionality, so to avoid overloading the system, we have included it
in a separate module.
Configuration
=============
**Prerequisites**
The module has ``boto3`` defined in its external dependencies, which
means, you should install the Python ``boto3`` package manually if you
don't have automatic package installation configured in your Odoo
environment. Run ``pip install boto3`` to install it.
**Setting up AWS Access**
1. **Create AWS Access Keys**
To use the AWS integration with Cetmix Tower, you need to create AWS
access keys:
- Follow the `official AWS
documentation <https://docs.aws.amazon.com/IAM/latest/UserGuide/security-creds.html>`__
(https://docs.aws.amazon.com/IAM/latest/UserGuide/security-creds.html)
for creating IAM access keys
- It's recommended to create a dedicated IAM user with appropriate
permissions for Cetmix Tower
- Store your access key ID and secret access key securely - you'll
need them in the next step
2. **Configure AWS Secrets in Cetmix Tower**
Create two secrets in Cetmix Tower to store your AWS credentials:
- Navigate to ``Cetmix Tower > Settings > Keys and Secrets``
- Create a new Secret with:
- Name: ``AWS Access Key``
- Reference: ``aws_access_key``
- Key Type: ``Secret``
- Enter your AWS access key ID in the Secret Value tab
- Similarly, create another Secret with:
- Name: ``AWS Secret Access Key``
- Reference: ``aws_secret_access_key``
- Key Type: ``Secret``
- Enter your AWS secret access key in the Secret Value tab
..
Note: These secrets will be accessible as
``#!cxtower.secret.aws_access_key!#`` and
``#!cxtower.secret.aws_secret_access_key!#`` in your commands.
3. **Configure AWS Region**
Create a variable to define your AWS region:
- Navigate to ``Cetmix Tower > Settings > Variables``
- Create a new Variable with:
- Name: ``AWS Region Name``
- Reference: ``aws_region_name``
- Type: ``String``
- Set your AWS region (e.g., ``us-east-1``, ``eu-west-1``) as the
value
Usage
=====
Please check the `official Boto3
Documentation <https://boto3.amazonaws.com/v1/documentation/api/latest/index.html>`__
(https://boto3.amazonaws.com/v1/documentation/api/latest/index.html) for
the detailed information about the services and methods provided by the
Boto3 library.
**Disclaimer**: The following example demonstrates one of many
possible commands you can create and run with this module. The boto3
library provides access to the full range of AWS services and methods
- this is just a starting point to help you get familiar with the
integration.
Example of Cetmix Tower Python Command to List EC2 Instances
------------------------------------------------------------
Navigate to Command Creation
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Go to ``Cetmix Tower > Commands > Commands``
- Click the ``Create`` button
Configure Command Settings
~~~~~~~~~~~~~~~~~~~~~~~~~~
- Set a descriptive ``Name`` (e.g., "List AWS EC2 Instances")
- Leave ``Reference`` blank to generate automatically (or set a custom
reference)
- Select ``Action``: "Execute Python code"
- Set ``Access Level``: Choose appropriate level (e.g., "Manager")
- Optional: Set ``Default Path`` if needed
- Optional: Add ``Tags`` (e.g., "aws", "ec2") for better organization
Add Required Variables
~~~~~~~~~~~~~~~~~~~~~~
- In the ``Variables`` tab, add the previously configured variable:
- ``aws_region_name``
Add Required Secrets
~~~~~~~~~~~~~~~~~~~~
- In the ``Secrets`` field, add the previously configured secrets:
- ``aws_access_key``
- ``aws_secret_access_key``
Write Python Code
~~~~~~~~~~~~~~~~~
- Go to the ``Code`` tab
- Enter the following Python code:
.. code:: python
# List EC2 instances using boto3
result = {"exit_code": 0, "message": None}
session = boto3.Session(
aws_access_key_id=#!cxtower.secret.aws_access_key!#,
aws_secret_access_key=#!cxtower.secret.aws_secret_access_key!#,
region_name={{ aws_region_name }}
)
ec2 = session.client('ec2')
instances = ec2.describe_instances()
instance_details = []
for reservation in instances['Reservations']:
for instance in reservation['Instances']:
instance_detail = "Instance ID: " + instance['InstanceId']
instance_detail += ", Type: " + instance.get('InstanceType', 'Unknown')
instance_detail += ", State: " + instance.get('State', {}).get('Name', 'Unknown')
instance_details.append(instance_detail)
if instance_details:
result["message"] = "Found " + str(len(instance_details)) + " EC2 instances:\n" + "\n".join(instance_details)
else:
result["message"] = "No EC2 instances found"
Save the Command
~~~~~~~~~~~~~~~~
- Click the ``Save`` button to create the command
Running the AWS EC2 Command
---------------------------
Navigate to Server
~~~~~~~~~~~~~~~~~~
- Go to ``Cetmix Tower > Servers > Servers``
- Open the server where you want to run the command
Execute Command from Server
~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Click the ``Command`` button at the top of the server form
- In the popup dialog:
- Select your AWS EC2 command from the dropdown
- Verify the variable values (if any need adjustment)
- Click ``Run`` to execute
View Command Results
~~~~~~~~~~~~~~~~~~~~
- After execution, the command log will display showing:
- The command executed
- Execution status
- Output message containing EC2 instance details if successful
Example Output
--------------
For a successful execution with EC2 instances:
.. code:: bash
Found 3 EC2 instances:
Instance ID: i-0abc123def456789, Type: t2.micro, State: running
Instance ID: i-0def456abc789123, Type: t3.medium, State: stopped
Instance ID: i-0789abc123def456, Type: m5.large, State: running
For a successful execution with no EC2 instances:
.. code:: bash
No EC2 instances found
Creating Additional AWS Commands
--------------------------------
The cetmix_tower_aws module provides access to the boto3 Python library
for AWS service integration. Here are some common services you can use:
.. code:: python
# Standard client initialization pattern
client = boto3.client(
'service_name', # Replace with: ec2, s3, rds, cloudwatch, etc.
region_name={{ aws_region_name }},
aws_access_key_id=#!cxtower.secret.aws_access_key!#,
aws_secret_access_key=#!cxtower.secret.aws_secret_access_key!#
)
# Or use resource interface for object-oriented access
resource = boto3.resource(
'service_name', # Replace with: ec2, s3, etc.
region_name={{ aws_region_name }},
aws_access_key_id=#!cxtower.secret.aws_access_key!#,
aws_secret_access_key=#!cxtower.secret.aws_secret_access_key!#
)
Popular AWS services include: EC2 (compute), S3 (storage), RDS
(databases), and CloudWatch (monitoring).
For more details, see the `AWS Boto3
Documentation <https://boto3.amazonaws.com/v1/documentation/api/latest/index.html>`__.
Changelog
=========
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/cetmix/cetmix-tower/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/cetmix/cetmix-tower/issues/new?body=module:%20cetmix_tower_aws%0Aversion:%2018.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
-------
* Cetmix
Maintainers
-----------
This module is part of the `cetmix/cetmix-tower <https://github.com/cetmix/cetmix-tower/tree/18.0/cetmix_tower_aws>`_ project on GitHub.
You are welcome to contribute.

View File

@@ -0,0 +1 @@
from . import models

View File

@@ -0,0 +1,24 @@
# Copyright 2024 Cetmix OÜ
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
{
"name": "Cetmix Tower AWS",
"summary": """Cetmix Tower AWS EC2 API integration""",
"version": "18.0.1.0.1",
"category": "Productivity",
"license": "AGPL-3",
"author": "Cetmix",
"website": "https://tower.cetmix.com",
"live_test_url": "https://tower.cetmix.com/download",
"images": ["static/description/banner.png"],
"installable": True,
"external_dependencies": {
"python": ["boto3"],
},
"depends": [
"cetmix_tower_server",
],
"demo": [
"demo/demo_data.xml",
],
}

View File

@@ -0,0 +1,74 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo noupdate="1">
<!-- ===============================================
Keys
================================================ -->
<record id="aws_access_key" model="cx.tower.key">
<field name="name">AWS Access Key</field>
<field name="reference">aws_access_key</field>
<field name="key_type">s</field>
<field name="secret_value">AKIAIOSFODNN7EXAMPLE</field>
</record>
<record id="aws_secret_access_key" model="cx.tower.key">
<field name="name">AWS Secret Access Key</field>
<field name="reference">aws_secret_access_key</field>
<field name="key_type">s</field>
<field name="secret_value">wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY</field>
</record>
<!-- ===============================================
Variables
================================================ -->
<record id="variable_aws_region_name" model="cx.tower.variable">
<field name="name">AWS Region Name</field>
<field name="reference">aws_region_name</field>
</record>
<!-- ===============================================
Global Variable values
================================================ -->
<record id="global_value_aws_region" model="cx.tower.variable.value">
<field name="variable_id" ref="variable_aws_region_name" />
<field name="value_char">us-east-1</field>
</record>
<!-- ===============================================
Commands
================================================ -->
<record id="command_list_ec2_instances" model="cx.tower.command">
<field name="name">List AWS EC2 Instances</field>
<field name="action">python_code</field>
<field name="code">
# List EC2 instances using boto3
result = {"exit_code": 0, "message": None}
session = boto3.Session(
aws_access_key_id=#!cxtower.secret.aws_access_key!#,
aws_secret_access_key=#!cxtower.secret.aws_secret_access_key!#,
region_name={{ aws_region_name }}
)
ec2 = session.client('ec2')
instances = ec2.describe_instances()
instance_details = []
for reservation in instances['Reservations']:
for instance in reservation['Instances']:
instance_detail = "Instance ID: " + instance['InstanceId']
instance_detail += ", Type: " + instance.get('InstanceType', 'Unknown')
instance_detail += ", State: " + instance.get('State', {}).get('Name', 'Unknown')
instance_details.append(instance_detail)
if instance_details:
result["message"] = "Found " + str(len(instance_details)) + " EC2 instances:\n" + "\n".join(instance_details)
else:
result["message"] = "No EC2 instances found"
</field>
<field name="access_level">1</field>
<field
name="tag_ids"
eval="[(6, 0, [ref('cetmix_tower_server.tag_custom')])]"
/>
<field name="note">List EC2 instances using boto3 AWS SDK</field>
</record>
</odoo>

View File

@@ -0,0 +1,31 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * cetmix_tower_aws
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 18.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: cetmix_tower_aws
#: model:ir.model,name:cetmix_tower_aws.model_cx_tower_command
msgid "Cetmix Tower Command"
msgstr ""
#. module: cetmix_tower_aws
#. odoo-python
#: code:addons/cetmix_tower_aws/models/cx_tower_command.py:0
msgid ""
"Python 'boto3' library for AWS services. Available methods: 'client', "
"'resource', 'Session'<br/>Supports AWS services like EC2, S3, RDS, Lambda, "
"CloudWatch, etc.<br/>Please check the <a "
"href='https://boto3.amazonaws.com/v1/documentation/api/latest/index.html' "
"target='_blank'>Boto3 Documentation</a> for the detailed information about "
"the services and methods."
msgstr ""

View File

@@ -0,0 +1,39 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * cetmix_tower_aws
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 18.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.3\n"
"Language: it\n"
#. module: cetmix_tower_aws
#: model:ir.model,name:cetmix_tower_aws.model_cx_tower_command
msgid "Cetmix Tower Command"
msgstr "Comando Cetmix Tower"
#. module: cetmix_tower_aws
#. odoo-python
#: code:addons/cetmix_tower_aws/models/cx_tower_command.py:0
#, python-format
msgid "Python 'boto3' library for AWS services. Available methods: 'client', 'resource', 'Session'<br/>Supports AWS services like EC2, S3, RDS, Lambda, CloudWatch, etc.<br/>Please check the <a href='https://boto3.amazonaws.com/v1/documentation/api/latest/index.html' target='_blank'>Boto3 Documentation</a> for the detailed information about the services and methods."
msgstr "Libreria Python 'boto3' per servizi AWS. Metodi disponibili: 'client', 'resource', 'Session'<br/>Supporta servizi AWS come EC2, S3, RDS, Lambda, CloudWatch, ecc.<br/>Consultare la <a href='https://boto3.amazonaws.com/v1/documentation/api/latest/index.html' target='_blank'>documentazione Boto3</a> per informazioni dettagliate su servizi e metodi."
#~ msgid ""
#~ "# - boto3: Python 'boto3' library for AWS services. Available methods: "
#~ "'client', 'resource', 'Session'\n"
#~ "# Supports AWS services like EC2, S3, RDS, Lambda, CloudWatch, etc."
#~ msgstr ""
#~ "# - boto3: libreria Python 'boto3' per servizi AWS. Metodi disponibili: "
#~ "'client', 'resource', 'Session'\n"
#~ "# Supporta servizi AWS come EC2, S3, RDS, Lambda, CloudWatch, ecc."

View File

@@ -0,0 +1 @@
from . import cx_tower_command

View File

@@ -0,0 +1,40 @@
# Copyright 2024 Cetmix OÜ
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo import _, models
from odoo.tools.safe_eval import wrap_module
# Wrap boto3 safely
boto3 = wrap_module(__import__("boto3"), ["client", "resource", "Session"])
class CxTowerCommand(models.Model):
"""Extends cx.tower.command to add AWS boto3 functionality."""
_inherit = "cx.tower.command"
def _custom_python_libraries(self):
"""
Add the boto3 library to the available libraries.
"""
custom_python_libraries = super()._custom_python_libraries()
custom_python_libraries.update(
{
"cetmix_tower_aws": {
"boto3": {
"import": boto3,
"help": _(
"Python 'boto3' library for AWS services. "
"Available methods: 'client', 'resource', 'Session'<br/>"
"Supports AWS services like EC2, S3, RDS, Lambda, "
"CloudWatch, etc.<br/>"
"Please check the <a "
"href='https://boto3.amazonaws.com/v1/documentation/api/latest/index.html'"
" target='_blank'>Boto3 Documentation</a> for the detailed "
"information about the services and methods."
),
},
}
}
)
return custom_python_libraries

View File

@@ -0,0 +1,3 @@
[build-system]
requires = ["whool"]
build-backend = "whool.buildapi"

View File

@@ -0,0 +1,42 @@
**Prerequisites**
The module has `boto3` defined in its external dependencies, which means, you should install the Python `boto3` package manually if you don't have automatic package installation configured in your Odoo environment. Run `pip install boto3` to install it.
**Setting up AWS Access**
1. **Create AWS Access Keys**
To use the AWS integration with Cetmix Tower, you need to create AWS access keys:
- Follow the [official AWS documentation](https://docs.aws.amazon.com/IAM/latest/UserGuide/security-creds.html) (https://docs.aws.amazon.com/IAM/latest/UserGuide/security-creds.html) for creating IAM access keys
- It's recommended to create a dedicated IAM user with appropriate permissions for Cetmix Tower
- Store your access key ID and secret access key securely - you'll need them in the next step
2. **Configure AWS Secrets in Cetmix Tower**
Create two secrets in Cetmix Tower to store your AWS credentials:
- Navigate to `Cetmix Tower > Settings > Keys and Secrets`
- Create a new Secret with:
- Name: `AWS Access Key`
- Reference: `aws_access_key`
- Key Type: `Secret`
- Enter your AWS access key ID in the Secret Value tab
- Similarly, create another Secret with:
- Name: `AWS Secret Access Key`
- Reference: `aws_secret_access_key`
- Key Type: `Secret`
- Enter your AWS secret access key in the Secret Value tab
> Note: These secrets will be accessible as `#!cxtower.secret.aws_access_key!#` and `#!cxtower.secret.aws_secret_access_key!#` in your commands.
3. **Configure AWS Region**
Create a variable to define your AWS region:
- Navigate to `Cetmix Tower > Settings > Variables`
- Create a new Variable with:
- Name: `AWS Region Name`
- Reference: `aws_region_name`
- Type: `String`
- Set your AWS region (e.g., `us-east-1`, `eu-west-1`) as the value

View File

@@ -0,0 +1,5 @@
Although Amazon Web Services (AWS) allows API calls without using an SDK, we found that
integrating the Amazon SDK into Cetmix Tower makes provisioning, configuring, and
maintaining AWS instances more convenient for the end user. However, not all Cetmix
Tower users require this functionality, so to avoid overloading the system, we have
included it in a separate module.

View File

@@ -0,0 +1,6 @@
**⚠️ DISCLAIMER: TECHNICAL MODULE**
This module integrates Boto3 library, the Amazon Web Services (AWS) Software Development Kit (SDK) for Python, into the Cetmix Tower.
> **This is a technical module intended for system administrators or DevOps professionals.** It may involve server configuration, infrastructure management, or advanced setup outside the standard Odoo interface. Not intended for direct use by end users.

View File

@@ -0,0 +1,121 @@
Please check the [official Boto3 Documentation](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html) (https://boto3.amazonaws.com/v1/documentation/api/latest/index.html) for the detailed information about the services and methods provided by the Boto3 library.
> **Disclaimer**: The following example demonstrates one of many possible commands you can create and run with this module. The boto3 library provides access to the full range of AWS services and methods - this is just a starting point to help you get familiar with the integration.
## Example of Cetmix Tower Python Command to List EC2 Instances
### Navigate to Command Creation
- Go to `Cetmix Tower > Commands > Commands`
- Click the `Create` button
### Configure Command Settings
- Set a descriptive `Name` (e.g., "List AWS EC2 Instances")
- Leave `Reference` blank to generate automatically (or set a custom reference)
- Select `Action`: "Execute Python code"
- Set `Access Level`: Choose appropriate level (e.g., "Manager")
- Optional: Set `Default Path` if needed
- Optional: Add `Tags` (e.g., "aws", "ec2") for better organization
### Add Required Variables
- In the `Variables` tab, add the previously configured variable:
- `aws_region_name`
### Add Required Secrets
- In the `Secrets` field, add the previously configured secrets:
- `aws_access_key`
- `aws_secret_access_key`
### Write Python Code
- Go to the `Code` tab
- Enter the following Python code:
```python
# List EC2 instances using boto3
result = {"exit_code": 0, "message": None}
session = boto3.Session(
aws_access_key_id=#!cxtower.secret.aws_access_key!#,
aws_secret_access_key=#!cxtower.secret.aws_secret_access_key!#,
region_name={{ aws_region_name }}
)
ec2 = session.client('ec2')
instances = ec2.describe_instances()
instance_details = []
for reservation in instances['Reservations']:
for instance in reservation['Instances']:
instance_detail = "Instance ID: " + instance['InstanceId']
instance_detail += ", Type: " + instance.get('InstanceType', 'Unknown')
instance_detail += ", State: " + instance.get('State', {}).get('Name', 'Unknown')
instance_details.append(instance_detail)
if instance_details:
result["message"] = "Found " + str(len(instance_details)) + " EC2 instances:\n" + "\n".join(instance_details)
else:
result["message"] = "No EC2 instances found"
```
### Save the Command
- Click the `Save` button to create the command
## Running the AWS EC2 Command
### Navigate to Server
- Go to `Cetmix Tower > Servers > Servers`
- Open the server where you want to run the command
### Execute Command from Server
- Click the `Command` button at the top of the server form
- In the popup dialog:
- Select your AWS EC2 command from the dropdown
- Verify the variable values (if any need adjustment)
- Click `Run` to execute
### View Command Results
- After execution, the command log will display showing:
- The command executed
- Execution status
- Output message containing EC2 instance details if successful
## Example Output
For a successful execution with EC2 instances:
```bash
Found 3 EC2 instances:
Instance ID: i-0abc123def456789, Type: t2.micro, State: running
Instance ID: i-0def456abc789123, Type: t3.medium, State: stopped
Instance ID: i-0789abc123def456, Type: m5.large, State: running
```
For a successful execution with no EC2 instances:
```bash
No EC2 instances found
```
## Creating Additional AWS Commands
The cetmix_tower_aws module provides access to the boto3 Python library for AWS service integration. Here are some common services you can use:
```python
# Standard client initialization pattern
client = boto3.client(
'service_name', # Replace with: ec2, s3, rds, cloudwatch, etc.
region_name={{ aws_region_name }},
aws_access_key_id=#!cxtower.secret.aws_access_key!#,
aws_secret_access_key=#!cxtower.secret.aws_secret_access_key!#
)
# Or use resource interface for object-oriented access
resource = boto3.resource(
'service_name', # Replace with: ec2, s3, etc.
region_name={{ aws_region_name }},
aws_access_key_id=#!cxtower.secret.aws_access_key!#,
aws_secret_access_key=#!cxtower.secret.aws_secret_access_key!#
)
```
Popular AWS services include: EC2 (compute), S3 (storage), RDS (databases), and CloudWatch (monitoring).
For more details, see the [AWS Boto3 Documentation](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html).

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View File

@@ -0,0 +1,684 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
<title>Cetmix Tower AWS</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
Despite the name, some widely supported CSS2 features are used.
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: gray; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic, pre.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="cetmix-tower-aws">
<h1 class="title">Cetmix Tower AWS</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:e427fa4368b78aacbc6faa6232b54496e83fbe4905ddef4cc17f3913e5ee3ee0
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/license-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/cetmix/cetmix-tower/tree/18.0/cetmix_tower_aws"><img alt="cetmix/cetmix-tower" src="https://img.shields.io/badge/github-cetmix%2Fcetmix--tower-lightgray.png?logo=github" /></a></p>
<p><strong>⚠️ DISCLAIMER: TECHNICAL MODULE</strong></p>
<p>This module integrates Boto3 library, the Amazon Web Services (AWS)
Software Development Kit (SDK) for Python, into the Cetmix Tower.</p>
<blockquote>
<strong>This is a technical module intended for system administrators or
DevOps professionals.</strong> It may involve server configuration,
infrastructure management, or advanced setup outside the standard
Odoo interface. Not intended for direct use by end users.</blockquote>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#use-cases-context" id="toc-entry-1">Use Cases / Context</a></li>
<li><a class="reference internal" href="#configuration" id="toc-entry-2">Configuration</a></li>
<li><a class="reference internal" href="#usage" id="toc-entry-3">Usage</a><ul>
<li><a class="reference internal" href="#example-of-cetmix-tower-python-command-to-list-ec2-instances" id="toc-entry-4">Example of Cetmix Tower Python Command to List EC2 Instances</a><ul>
<li><a class="reference internal" href="#navigate-to-command-creation" id="toc-entry-5">Navigate to Command Creation</a></li>
<li><a class="reference internal" href="#configure-command-settings" id="toc-entry-6">Configure Command Settings</a></li>
<li><a class="reference internal" href="#add-required-variables" id="toc-entry-7">Add Required Variables</a></li>
<li><a class="reference internal" href="#add-required-secrets" id="toc-entry-8">Add Required Secrets</a></li>
<li><a class="reference internal" href="#write-python-code" id="toc-entry-9">Write Python Code</a></li>
<li><a class="reference internal" href="#save-the-command" id="toc-entry-10">Save the Command</a></li>
</ul>
</li>
<li><a class="reference internal" href="#running-the-aws-ec2-command" id="toc-entry-11">Running the AWS EC2 Command</a><ul>
<li><a class="reference internal" href="#navigate-to-server" id="toc-entry-12">Navigate to Server</a></li>
<li><a class="reference internal" href="#execute-command-from-server" id="toc-entry-13">Execute Command from Server</a></li>
<li><a class="reference internal" href="#view-command-results" id="toc-entry-14">View Command Results</a></li>
</ul>
</li>
<li><a class="reference internal" href="#example-output" id="toc-entry-15">Example Output</a></li>
<li><a class="reference internal" href="#creating-additional-aws-commands" id="toc-entry-16">Creating Additional AWS Commands</a></li>
</ul>
</li>
<li><a class="reference internal" href="#changelog" id="toc-entry-17">Changelog</a></li>
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-18">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-19">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-20">Authors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-21">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="use-cases-context">
<h1><a class="toc-backref" href="#toc-entry-1">Use Cases / Context</a></h1>
<p>Although Amazon Web Services (AWS) allows API calls without using an
SDK, we found that integrating the Amazon SDK into Cetmix Tower makes
provisioning, configuring, and maintaining AWS instances more convenient
for the end user. However, not all Cetmix Tower users require this
functionality, so to avoid overloading the system, we have included it
in a separate module.</p>
</div>
<div class="section" id="configuration">
<h1><a class="toc-backref" href="#toc-entry-2">Configuration</a></h1>
<p><strong>Prerequisites</strong></p>
<p>The module has <tt class="docutils literal">boto3</tt> defined in its external dependencies, which
means, you should install the Python <tt class="docutils literal">boto3</tt> package manually if you
dont have automatic package installation configured in your Odoo
environment. Run <tt class="docutils literal">pip install boto3</tt> to install it.</p>
<p><strong>Setting up AWS Access</strong></p>
<ol class="arabic">
<li><p class="first"><strong>Create AWS Access Keys</strong></p>
<p>To use the AWS integration with Cetmix Tower, you need to create AWS
access keys:</p>
<ul class="simple">
<li>Follow the <a class="reference external" href="https://docs.aws.amazon.com/IAM/latest/UserGuide/security-creds.html">official AWS
documentation</a>
(<a class="reference external" href="https://docs.aws.amazon.com/IAM/latest/UserGuide/security-creds.html">https://docs.aws.amazon.com/IAM/latest/UserGuide/security-creds.html</a>)
for creating IAM access keys</li>
<li>Its recommended to create a dedicated IAM user with appropriate
permissions for Cetmix Tower</li>
<li>Store your access key ID and secret access key securely - youll
need them in the next step</li>
</ul>
</li>
<li><p class="first"><strong>Configure AWS Secrets in Cetmix Tower</strong></p>
<p>Create two secrets in Cetmix Tower to store your AWS credentials:</p>
<ul class="simple">
<li>Navigate to <tt class="docutils literal">Cetmix Tower &gt; Settings &gt; Keys and Secrets</tt></li>
<li>Create a new Secret with:<ul>
<li>Name: <tt class="docutils literal">AWS Access Key</tt></li>
<li>Reference: <tt class="docutils literal">aws_access_key</tt></li>
<li>Key Type: <tt class="docutils literal">Secret</tt></li>
</ul>
</li>
<li>Enter your AWS access key ID in the Secret Value tab</li>
<li>Similarly, create another Secret with:<ul>
<li>Name: <tt class="docutils literal">AWS Secret Access Key</tt></li>
<li>Reference: <tt class="docutils literal">aws_secret_access_key</tt></li>
<li>Key Type: <tt class="docutils literal">Secret</tt></li>
</ul>
</li>
<li>Enter your AWS secret access key in the Secret Value tab</li>
</ul>
<!-- -->
<blockquote>
<p>Note: These secrets will be accessible as
<tt class="docutils literal">#!cxtower.secret.aws_access_key!#</tt> and
<tt class="docutils literal">#!cxtower.secret.aws_secret_access_key!#</tt> in your commands.</p>
</blockquote>
</li>
<li><p class="first"><strong>Configure AWS Region</strong></p>
<p>Create a variable to define your AWS region:</p>
<ul class="simple">
<li>Navigate to <tt class="docutils literal">Cetmix Tower &gt; Settings &gt; Variables</tt></li>
<li>Create a new Variable with:<ul>
<li>Name: <tt class="docutils literal">AWS Region Name</tt></li>
<li>Reference: <tt class="docutils literal">aws_region_name</tt></li>
<li>Type: <tt class="docutils literal">String</tt></li>
</ul>
</li>
<li>Set your AWS region (e.g., <tt class="docutils literal"><span class="pre">us-east-1</span></tt>, <tt class="docutils literal"><span class="pre">eu-west-1</span></tt>) as the
value</li>
</ul>
</li>
</ol>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#toc-entry-3">Usage</a></h1>
<p>Please check the <a class="reference external" href="https://boto3.amazonaws.com/v1/documentation/api/latest/index.html">official Boto3
Documentation</a>
(<a class="reference external" href="https://boto3.amazonaws.com/v1/documentation/api/latest/index.html">https://boto3.amazonaws.com/v1/documentation/api/latest/index.html</a>) for
the detailed information about the services and methods provided by the
Boto3 library.</p>
<blockquote>
<strong>Disclaimer</strong>: The following example demonstrates one of many
possible commands you can create and run with this module. The boto3
library provides access to the full range of AWS services and methods
- this is just a starting point to help you get familiar with the
integration.</blockquote>
<div class="section" id="example-of-cetmix-tower-python-command-to-list-ec2-instances">
<h2><a class="toc-backref" href="#toc-entry-4">Example of Cetmix Tower Python Command to List EC2 Instances</a></h2>
<div class="section" id="navigate-to-command-creation">
<h3><a class="toc-backref" href="#toc-entry-5">Navigate to Command Creation</a></h3>
<ul class="simple">
<li>Go to <tt class="docutils literal">Cetmix Tower &gt; Commands &gt; Commands</tt></li>
<li>Click the <tt class="docutils literal">Create</tt> button</li>
</ul>
</div>
<div class="section" id="configure-command-settings">
<h3><a class="toc-backref" href="#toc-entry-6">Configure Command Settings</a></h3>
<ul class="simple">
<li>Set a descriptive <tt class="docutils literal">Name</tt> (e.g., “List AWS EC2 Instances”)</li>
<li>Leave <tt class="docutils literal">Reference</tt> blank to generate automatically (or set a custom
reference)</li>
<li>Select <tt class="docutils literal">Action</tt>: “Execute Python code”</li>
<li>Set <tt class="docutils literal">Access Level</tt>: Choose appropriate level (e.g., “Manager”)</li>
<li>Optional: Set <tt class="docutils literal">Default Path</tt> if needed</li>
<li>Optional: Add <tt class="docutils literal">Tags</tt> (e.g., “aws”, “ec2”) for better organization</li>
</ul>
</div>
<div class="section" id="add-required-variables">
<h3><a class="toc-backref" href="#toc-entry-7">Add Required Variables</a></h3>
<ul class="simple">
<li>In the <tt class="docutils literal">Variables</tt> tab, add the previously configured variable:<ul>
<li><tt class="docutils literal">aws_region_name</tt></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="add-required-secrets">
<h3><a class="toc-backref" href="#toc-entry-8">Add Required Secrets</a></h3>
<ul class="simple">
<li>In the <tt class="docutils literal">Secrets</tt> field, add the previously configured secrets:<ul>
<li><tt class="docutils literal">aws_access_key</tt></li>
<li><tt class="docutils literal">aws_secret_access_key</tt></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="write-python-code">
<h3><a class="toc-backref" href="#toc-entry-9">Write Python Code</a></h3>
<ul>
<li><p class="first">Go to the <tt class="docutils literal">Code</tt> tab</p>
</li>
<li><p class="first">Enter the following Python code:</p>
<pre class="code python literal-block">
<span class="c1"># List EC2 instances using boto3</span><span class="w">
</span><span class="n">result</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;exit_code&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="s2">&quot;message&quot;</span><span class="p">:</span> <span class="kc">None</span><span class="p">}</span><span class="w">
</span><span class="n">session</span> <span class="o">=</span> <span class="n">boto3</span><span class="o">.</span><span class="n">Session</span><span class="p">(</span><span class="w">
</span> <span class="n">aws_access_key_id</span><span class="o">=</span><span class="c1">#!cxtower.secret.aws_access_key!#,</span><span class="w">
</span> <span class="n">aws_secret_access_key</span><span class="o">=</span><span class="c1">#!cxtower.secret.aws_secret_access_key!#,</span><span class="w">
</span> <span class="n">region_name</span><span class="o">=</span><span class="p">{{</span> <span class="n">aws_region_name</span> <span class="p">}}</span><span class="w">
</span><span class="p">)</span><span class="w">
</span><span class="n">ec2</span> <span class="o">=</span> <span class="n">session</span><span class="o">.</span><span class="n">client</span><span class="p">(</span><span class="s1">'ec2'</span><span class="p">)</span><span class="w">
</span><span class="n">instances</span> <span class="o">=</span> <span class="n">ec2</span><span class="o">.</span><span class="n">describe_instances</span><span class="p">()</span><span class="w">
</span><span class="n">instance_details</span> <span class="o">=</span> <span class="p">[]</span><span class="w">
</span><span class="k">for</span> <span class="n">reservation</span> <span class="ow">in</span> <span class="n">instances</span><span class="p">[</span><span class="s1">'Reservations'</span><span class="p">]:</span><span class="w">
</span> <span class="k">for</span> <span class="n">instance</span> <span class="ow">in</span> <span class="n">reservation</span><span class="p">[</span><span class="s1">'Instances'</span><span class="p">]:</span><span class="w">
</span> <span class="n">instance_detail</span> <span class="o">=</span> <span class="s2">&quot;Instance ID: &quot;</span> <span class="o">+</span> <span class="n">instance</span><span class="p">[</span><span class="s1">'InstanceId'</span><span class="p">]</span><span class="w">
</span> <span class="n">instance_detail</span> <span class="o">+=</span> <span class="s2">&quot;, Type: &quot;</span> <span class="o">+</span> <span class="n">instance</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'InstanceType'</span><span class="p">,</span> <span class="s1">'Unknown'</span><span class="p">)</span><span class="w">
</span> <span class="n">instance_detail</span> <span class="o">+=</span> <span class="s2">&quot;, State: &quot;</span> <span class="o">+</span> <span class="n">instance</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'State'</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'Name'</span><span class="p">,</span> <span class="s1">'Unknown'</span><span class="p">)</span><span class="w">
</span> <span class="n">instance_details</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">instance_detail</span><span class="p">)</span><span class="w">
</span><span class="k">if</span> <span class="n">instance_details</span><span class="p">:</span><span class="w">
</span> <span class="n">result</span><span class="p">[</span><span class="s2">&quot;message&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;Found &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">instance_details</span><span class="p">))</span> <span class="o">+</span> <span class="s2">&quot; EC2 instances:</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">+</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">instance_details</span><span class="p">)</span><span class="w">
</span><span class="k">else</span><span class="p">:</span><span class="w">
</span> <span class="n">result</span><span class="p">[</span><span class="s2">&quot;message&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;No EC2 instances found&quot;</span>
</pre>
</li>
</ul>
</div>
<div class="section" id="save-the-command">
<h3><a class="toc-backref" href="#toc-entry-10">Save the Command</a></h3>
<ul class="simple">
<li>Click the <tt class="docutils literal">Save</tt> button to create the command</li>
</ul>
</div>
</div>
<div class="section" id="running-the-aws-ec2-command">
<h2><a class="toc-backref" href="#toc-entry-11">Running the AWS EC2 Command</a></h2>
<div class="section" id="navigate-to-server">
<h3><a class="toc-backref" href="#toc-entry-12">Navigate to Server</a></h3>
<ul class="simple">
<li>Go to <tt class="docutils literal">Cetmix Tower &gt; Servers &gt; Servers</tt></li>
<li>Open the server where you want to run the command</li>
</ul>
</div>
<div class="section" id="execute-command-from-server">
<h3><a class="toc-backref" href="#toc-entry-13">Execute Command from Server</a></h3>
<ul class="simple">
<li>Click the <tt class="docutils literal">Command</tt> button at the top of the server form</li>
<li>In the popup dialog:<ul>
<li>Select your AWS EC2 command from the dropdown</li>
<li>Verify the variable values (if any need adjustment)</li>
<li>Click <tt class="docutils literal">Run</tt> to execute</li>
</ul>
</li>
</ul>
</div>
<div class="section" id="view-command-results">
<h3><a class="toc-backref" href="#toc-entry-14">View Command Results</a></h3>
<ul class="simple">
<li>After execution, the command log will display showing:<ul>
<li>The command executed</li>
<li>Execution status</li>
<li>Output message containing EC2 instance details if successful</li>
</ul>
</li>
</ul>
</div>
</div>
<div class="section" id="example-output">
<h2><a class="toc-backref" href="#toc-entry-15">Example Output</a></h2>
<p>For a successful execution with EC2 instances:</p>
<pre class="code bash literal-block">
Found<span class="w"> </span><span class="m">3</span><span class="w"> </span>EC2<span class="w"> </span>instances:<span class="w">
</span>Instance<span class="w"> </span>ID:<span class="w"> </span>i-0abc123def456789,<span class="w"> </span>Type:<span class="w"> </span>t2.micro,<span class="w"> </span>State:<span class="w"> </span>running<span class="w">
</span>Instance<span class="w"> </span>ID:<span class="w"> </span>i-0def456abc789123,<span class="w"> </span>Type:<span class="w"> </span>t3.medium,<span class="w"> </span>State:<span class="w"> </span>stopped<span class="w">
</span>Instance<span class="w"> </span>ID:<span class="w"> </span>i-0789abc123def456,<span class="w"> </span>Type:<span class="w"> </span>m5.large,<span class="w"> </span>State:<span class="w"> </span>running
</pre>
<p>For a successful execution with no EC2 instances:</p>
<pre class="code bash literal-block">
No<span class="w"> </span>EC2<span class="w"> </span>instances<span class="w"> </span>found
</pre>
</div>
<div class="section" id="creating-additional-aws-commands">
<h2><a class="toc-backref" href="#toc-entry-16">Creating Additional AWS Commands</a></h2>
<p>The cetmix_tower_aws module provides access to the boto3 Python library
for AWS service integration. Here are some common services you can use:</p>
<pre class="code python literal-block">
<span class="c1"># Standard client initialization pattern</span><span class="w">
</span><span class="n">client</span> <span class="o">=</span> <span class="n">boto3</span><span class="o">.</span><span class="n">client</span><span class="p">(</span><span class="w">
</span> <span class="s1">'service_name'</span><span class="p">,</span> <span class="c1"># Replace with: ec2, s3, rds, cloudwatch, etc.</span><span class="w">
</span> <span class="n">region_name</span><span class="o">=</span><span class="p">{{</span> <span class="n">aws_region_name</span> <span class="p">}},</span><span class="w">
</span> <span class="n">aws_access_key_id</span><span class="o">=</span><span class="c1">#!cxtower.secret.aws_access_key!#,</span><span class="w">
</span> <span class="n">aws_secret_access_key</span><span class="o">=</span><span class="c1">#!cxtower.secret.aws_secret_access_key!#</span><span class="w">
</span><span class="p">)</span><span class="w">
</span><span class="c1"># Or use resource interface for object-oriented access</span><span class="w">
</span><span class="n">resource</span> <span class="o">=</span> <span class="n">boto3</span><span class="o">.</span><span class="n">resource</span><span class="p">(</span><span class="w">
</span> <span class="s1">'service_name'</span><span class="p">,</span> <span class="c1"># Replace with: ec2, s3, etc.</span><span class="w">
</span> <span class="n">region_name</span><span class="o">=</span><span class="p">{{</span> <span class="n">aws_region_name</span> <span class="p">}},</span><span class="w">
</span> <span class="n">aws_access_key_id</span><span class="o">=</span><span class="c1">#!cxtower.secret.aws_access_key!#,</span><span class="w">
</span> <span class="n">aws_secret_access_key</span><span class="o">=</span><span class="c1">#!cxtower.secret.aws_secret_access_key!#</span><span class="w">
</span><span class="p">)</span>
</pre>
<p>Popular AWS services include: EC2 (compute), S3 (storage), RDS
(databases), and CloudWatch (monitoring).</p>
<p>For more details, see the <a class="reference external" href="https://boto3.amazonaws.com/v1/documentation/api/latest/index.html">AWS Boto3
Documentation</a>.</p>
</div>
</div>
<div class="section" id="changelog">
<h1><a class="toc-backref" href="#toc-entry-17">Changelog</a></h1>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#toc-entry-18">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/cetmix/cetmix-tower/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/cetmix/cetmix-tower/issues/new?body=module:%20cetmix_tower_aws%0Aversion:%2018.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#toc-entry-19">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#toc-entry-20">Authors</a></h2>
<ul class="simple">
<li>Cetmix</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#toc-entry-21">Maintainers</a></h2>
<p>This module is part of the <a class="reference external" href="https://github.com/cetmix/cetmix-tower/tree/18.0/cetmix_tower_aws">cetmix/cetmix-tower</a> project on GitHub.</p>
<p>You are welcome to contribute.</p>
</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1 @@
from . import test_boto3_integration

View File

@@ -0,0 +1,64 @@
# Copyright 2024 Cetmix OÜ
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo.tests import common
class TestBoto3Integration(common.TransactionCase):
"""Test boto3 integration with Cetmix Tower commands."""
def setUp(self):
super().setUp()
# Create a test command
self.command = self.env["cx.tower.command"].create(
{
"name": "Test AWS Command",
"action": "python_code",
}
)
self.eval_context = self.env[
"cx.tower.command"
]._get_python_command_eval_context()
def test_boto3_in_evaluation_context(self):
"""Test that boto3 is added to the evaluation context."""
# Get evaluation context
# Check if boto3 is in the evaluation context
self.assertIn("boto3", self.eval_context)
# Check available methods
boto3_obj = self.eval_context["boto3"]
self.assertTrue(hasattr(boto3_obj, "client"))
self.assertTrue(hasattr(boto3_obj, "resource"))
self.assertTrue(hasattr(boto3_obj, "Session"))
def test_boto3_in_evaluation_context_with_server(self):
"""Test that boto3 is added to the evaluation context
when server is provided."""
# Create a test server
test_server = self.env["cx.tower.server"].create(
{
"name": "Test AWS Server",
"reference": "test_aws_server",
"ip_v4_address": "localhost",
"ssh_username": "admin",
"ssh_password": "password",
"ssh_auth_mode": "p",
"host_key": "test_key",
}
)
# Get evaluation context with server
eval_context = self.env["cx.tower.command"]._get_python_command_eval_context(
server=test_server
)
# Check if boto3 is in the evaluation context
self.assertIn("boto3", eval_context)
# Check available methods
boto3_obj = eval_context["boto3"]
self.assertTrue(hasattr(boto3_obj, "client"))
self.assertTrue(hasattr(boto3_obj, "resource"))
self.assertTrue(hasattr(boto3_obj, "Session"))
# Verify server is correctly passed to the context
self.assertEqual(eval_context["server"], test_server)