fix: support native executor.json and executor bu API #83
1
.gitignore
vendored
@ -46,6 +46,7 @@ id_rsa
|
||||
!**/resources/**/*.zip
|
||||
!**/resources/**/*.jar
|
||||
allure-server-store/
|
||||
allure-server-store-db/
|
||||
tmp/
|
||||
|
||||
pg-secret.yaml
|
||||
|
@ -24,10 +24,12 @@ services:
|
||||
- postgres
|
||||
|
||||
postgres:
|
||||
image: postgres:latest
|
||||
image: postgres:16.3-alpine
|
||||
environment:
|
||||
POSTGRES_PASSWORD: postgres
|
||||
POSTGRES_USER: postgres
|
||||
POSTGRES_DB: allure
|
||||
ports:
|
||||
- 5432:5432
|
||||
volumes:
|
||||
- ./allure-server-store-db:/var/lib/postgresql/data:rw
|
||||
|
@ -19,9 +19,9 @@ import ru.iopump.qa.allure.properties.TmsProperties;
|
||||
@EnableTransactionManagement
|
||||
@EnableConfigurationProperties({AllureProperties.class, CleanUpProperties.class, BasicProperties.class, TmsProperties.class})
|
||||
@EnableVaadin
|
||||
public class Application { //NOPMD
|
||||
public class Application {
|
||||
|
||||
public static void main(String[] args) { //NOPMD
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(Application.class, args);
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
package ru.iopump.qa.allure.controller; //NOPMD
|
||||
package ru.iopump.qa.allure.controller;
|
||||
|
||||
import com.google.common.base.Preconditions;
|
||||
import io.qameta.allure.entity.ExecutorInfo;
|
||||
@ -182,7 +182,7 @@ public class AllureReportController {
|
||||
}
|
||||
|
||||
@ExceptionHandler(ConstraintViolationException.class)
|
||||
private void constraintViolationException(HttpServletResponse response) throws IOException { //NOPMD
|
||||
private void constraintViolationException(HttpServletResponse response) throws IOException {
|
||||
response.sendError(HttpStatus.BAD_REQUEST.value());
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
package ru.iopump.qa.allure.controller; //NOPMD
|
||||
package ru.iopump.qa.allure.controller;
|
||||
|
||||
import com.google.common.base.Preconditions;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
|
@ -48,20 +48,20 @@ public class ReportEntity {
|
||||
private boolean active;
|
||||
@Builder.Default
|
||||
@PositiveOrZero
|
||||
private long level = 0L; //NOPMD
|
||||
private long level = 0L;
|
||||
@Builder.Default
|
||||
@PositiveOrZero
|
||||
@Access(AccessType.PROPERTY)
|
||||
@Column(columnDefinition = "bigint not null default '0'")
|
||||
private long size = 0L; //NOPMD
|
||||
private long size = 0L;
|
||||
@Builder.Default
|
||||
@PositiveOrZero
|
||||
@Column(columnDefinition = "int not null default '0'")
|
||||
private int version = 1; //NOPMD
|
||||
private int version = 1;
|
||||
@Builder.Default
|
||||
@NotNull
|
||||
@Column(nullable = false, columnDefinition = "varchar(255) not null default ''")
|
||||
private String buildUrl = ""; //NOPMD
|
||||
private String buildUrl = "";
|
||||
|
||||
public static long sizeKB(@Nullable Path path) {
|
||||
if (path == null || Files.notExists(path)) {
|
||||
|
@ -87,7 +87,7 @@ public class ReportGenerateDialog extends Dialog {
|
||||
info.setVisible(true);
|
||||
info.setText("Success: " + res);
|
||||
}
|
||||
} catch (Exception e) { //NOPMD
|
||||
} catch (Exception e) {
|
||||
error.setVisible(true);
|
||||
error.setText("Error: " + e.getLocalizedMessage());
|
||||
log.error("Generation error", e);
|
||||
|
@ -24,7 +24,7 @@ import java.util.function.Function;
|
||||
import static ru.iopump.qa.util.Str.format;
|
||||
|
||||
@Slf4j
|
||||
public class ResultUploadDialog extends Dialog { //NOPMD
|
||||
public class ResultUploadDialog extends Dialog {
|
||||
|
||||
private static final long serialVersionUID = -4958469225519042248L;
|
||||
private final MemoryBuffer buffer;
|
||||
@ -54,7 +54,7 @@ public class ResultUploadDialog extends Dialog { //NOPMD
|
||||
event.getFileName(), event.getContentLength(), uploadResponse
|
||||
)), false
|
||||
);
|
||||
} catch (Exception ex) { //NOPMD
|
||||
} catch (Exception ex) {
|
||||
show(error("Internal error: " + ex.getLocalizedMessage()), true);
|
||||
log.error("Uploading error", ex);
|
||||
}
|
||||
|
@ -1,7 +1,5 @@
|
||||
package ru.iopump.qa.allure.gui.view;
|
||||
|
||||
import static ru.iopump.qa.allure.gui.MainLayout.ALLURE_SERVER;
|
||||
|
||||
import com.vaadin.flow.component.Tag;
|
||||
import com.vaadin.flow.component.html.Anchor;
|
||||
import com.vaadin.flow.component.html.Div;
|
||||
@ -10,8 +8,6 @@ import com.vaadin.flow.component.html.Span;
|
||||
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
|
||||
import com.vaadin.flow.router.PageTitle;
|
||||
import com.vaadin.flow.router.Route;
|
||||
import java.io.InputStream;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import lombok.NonNull;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
@ -19,6 +15,11 @@ import org.apache.commons.lang3.StringUtils;
|
||||
import ru.iopump.qa.allure.gui.MainLayout;
|
||||
import ru.iopump.qa.util.ResourceUtil;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
import static ru.iopump.qa.allure.gui.MainLayout.ALLURE_SERVER;
|
||||
|
||||
@Tag("about-view")
|
||||
@PageTitle("About | " + ALLURE_SERVER)
|
||||
@Route(value = "about", layout = MainLayout.class)
|
||||
@ -63,9 +64,9 @@ public class AboutView extends VerticalLayout {
|
||||
public static String getVersionOrDefault(@NonNull String defaultVersion) {
|
||||
try (final InputStream inputStream = ResourceUtil.getResourceAsStream("version.info")) {
|
||||
var version = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
|
||||
log.info("App version from version.info = " + version); //NOPMD
|
||||
log.info("App version from version.info = " + version);
|
||||
return StringUtils.isBlank(version) ? defaultVersion : version;
|
||||
} catch (Exception e) { //NOPMD
|
||||
} catch (Exception e) {
|
||||
log.error("Version error", e);
|
||||
return defaultVersion;
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
package ru.iopump.qa.allure.gui.view; //NOPMD
|
||||
package ru.iopump.qa.allure.gui.view;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.vaadin.flow.component.Tag;
|
||||
@ -79,7 +79,7 @@ public class ReportsView extends VerticalLayout {
|
||||
try {
|
||||
jpaReportService.internalDeleteByUUID(uuid);
|
||||
Notification.show("Delete success: " + uuid, 2000, Notification.Position.TOP_START);
|
||||
} catch (Exception e) { //NOPMD
|
||||
} catch (Exception e) {
|
||||
Notification.show("Deleting error: " + e.getLocalizedMessage(),
|
||||
5000,
|
||||
Notification.Position.TOP_START);
|
||||
|
@ -1,4 +1,4 @@
|
||||
package ru.iopump.qa.allure.gui.view; //NOPMD
|
||||
package ru.iopump.qa.allure.gui.view;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.vaadin.flow.component.Tag;
|
||||
@ -84,7 +84,7 @@ public class ResultsView extends VerticalLayout {
|
||||
try {
|
||||
allureResultController.deleteResult(uuid);
|
||||
Notification.show("Delete success: " + uuid, 2000, Notification.Position.TOP_START);
|
||||
} catch (Exception e) { //NOPMD
|
||||
} catch (Exception e) {
|
||||
Notification.show("Deleting error: " + e.getLocalizedMessage(),
|
||||
5000,
|
||||
Notification.Position.TOP_START);
|
||||
|
@ -1,7 +1,8 @@
|
||||
package ru.iopump.qa.allure.helper; //NOPMD
|
||||
package ru.iopump.qa.allure.helper;
|
||||
|
||||
import io.qameta.allure.Aggregator2;
|
||||
import io.qameta.allure.ConfigurationBuilder;
|
||||
import io.qameta.allure.Extension;
|
||||
import io.qameta.allure.ReportGenerator;
|
||||
import io.qameta.allure.ReportStorage;
|
||||
import io.qameta.allure.core.Configuration;
|
||||
@ -42,6 +43,7 @@ public final class AllureReportGenerator {
|
||||
private final ReportGenerator delegate;
|
||||
private final BeanFactory beanFactory;
|
||||
private final AggregatorGrabber aggregatorGrabber = new AggregatorGrabber();
|
||||
private final Extension ciExecutor = new ExecutorCiPlugin();
|
||||
|
||||
public AllureReportGenerator(@NonNull Collection<AllureServerPlugin> listeners, AllureProperties allureProperties, TmsProperties tmsProperties, BeanFactory beanFactory) {
|
||||
this.listeners = listeners;
|
||||
@ -55,7 +57,7 @@ public final class AllureReportGenerator {
|
||||
return ConfigurationBuilder
|
||||
.bundled()
|
||||
.withPlugins(loadPlugins())
|
||||
.withExtensions(List.of(aggregatorGrabber))
|
||||
.withExtensions(List.of(aggregatorGrabber, ciExecutor))
|
||||
.build();
|
||||
}
|
||||
|
||||
@ -95,7 +97,7 @@ public final class AllureReportGenerator {
|
||||
}
|
||||
}
|
||||
return to;
|
||||
} catch (Exception exception) { //NOPMD
|
||||
} catch (Exception exception) {
|
||||
throw new IllegalStateException("Error default plugins loading from resources '/plugins/**'", exception);
|
||||
}
|
||||
}
|
||||
|
@ -5,24 +5,36 @@ import io.qameta.allure.core.Configuration;
|
||||
import io.qameta.allure.core.ResultsVisitor;
|
||||
import io.qameta.allure.entity.ExecutorInfo;
|
||||
import io.qameta.allure.executor.ExecutorPlugin;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
|
||||
@Slf4j
|
||||
public class ExecutorCiPlugin extends ExecutorPlugin {
|
||||
public static final String JSON_FILE_NAME = "ci-executor.json";
|
||||
|
||||
@Override
|
||||
public void readResults(Configuration configuration, ResultsVisitor visitor, Path directory) {
|
||||
final JacksonContext context = configuration.requireContext(JacksonContext.class);
|
||||
final Path nativeExecutorFile = directory.resolve("executor.json");
|
||||
|
||||
if (Files.exists(nativeExecutorFile) && Files.isRegularFile(nativeExecutorFile))
|
||||
try {
|
||||
if (Files.readAllBytes(nativeExecutorFile).length > 1) return;
|
||||
} catch (IOException e) {
|
||||
log.error("Could not read existed native executor file {}", nativeExecutorFile, e);
|
||||
}
|
||||
|
||||
final Path executorFile = directory.resolve(JSON_FILE_NAME);
|
||||
if (Files.exists(executorFile) && Files.isRegularFile(executorFile)) {
|
||||
try (InputStream is = Files.newInputStream(executorFile)) {
|
||||
final ExecutorInfo info = context.getValue().readValue(is, ExecutorInfo.class);
|
||||
visitor.visitExtra(EXECUTORS_BLOCK_NAME, info);
|
||||
} catch (IOException e) {
|
||||
visitor.error("Could not read executor file " + executorFile, e); //NOPMD
|
||||
visitor.error("Could not read executor file " + executorFile, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -37,7 +37,7 @@ public class ServeRedirectHelper {
|
||||
}
|
||||
|
||||
log.info("Redirect NOT evaluated: '{}'", from);
|
||||
throw new RuntimeException("Redirect NOT evaluated " + from); //NOPMD
|
||||
throw new RuntimeException("Redirect NOT evaluated " + from);
|
||||
}
|
||||
|
||||
public void mapRequestTo(String urlPath, String staticResourcePath) {
|
||||
@ -62,7 +62,7 @@ public class ServeRedirectHelper {
|
||||
|
||||
// Add base url if not
|
||||
if (!result.startsWith(cfg.reports().path())) {
|
||||
result = cfg.reports().path() + result; //NOPMD
|
||||
result = cfg.reports().path() + result;
|
||||
}
|
||||
|
||||
// Remove '/index.html' if exists
|
||||
@ -82,12 +82,12 @@ public class ServeRedirectHelper {
|
||||
|
||||
// Add first '/' if not
|
||||
if (result.charAt(0) != CHAR) {
|
||||
result = CHAR + result; //NOPMD
|
||||
result = CHAR + result;
|
||||
}
|
||||
|
||||
// Add '/index.html' if not
|
||||
if (!result.endsWith(INDEX_HTML)) {
|
||||
result = result + INDEX_HTML; //NOPMD
|
||||
result = result + INDEX_HTML;
|
||||
}
|
||||
|
||||
// Must be '/allure/123456890/index.html'
|
||||
|
@ -1,9 +1,10 @@
|
||||
package ru.iopump.qa.allure.model;
|
||||
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.UUID;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
|
@ -1,13 +1,14 @@
|
||||
package ru.iopump.qa.allure.repo;
|
||||
|
||||
import lombok.NonNull;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.stereotype.Repository;
|
||||
import ru.iopump.qa.allure.entity.ReportEntity;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.Collection;
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
import lombok.NonNull;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.stereotype.Repository;
|
||||
import ru.iopump.qa.allure.entity.ReportEntity;
|
||||
|
||||
@Repository
|
||||
public interface JpaReportRepository extends JpaRepository<ReportEntity, UUID> {
|
||||
|
@ -1,4 +1,4 @@
|
||||
package ru.iopump.qa.allure.service; //NOPMD
|
||||
package ru.iopump.qa.allure.service;
|
||||
|
||||
import com.fasterxml.jackson.core.util.DefaultPrettyPrinter;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
|
@ -1,10 +1,10 @@
|
||||
package ru.iopump.qa.allure.service;
|
||||
|
||||
import java.nio.file.Path;
|
||||
|
||||
import jakarta.annotation.Nullable;
|
||||
import lombok.experimental.UtilityClass;
|
||||
|
||||
import java.nio.file.Path;
|
||||
|
||||
@SuppressWarnings("RedundantModifiersUtilityClassLombok")
|
||||
@UtilityClass
|
||||
public class PathUtil {
|
||||
|
@ -97,7 +97,7 @@ public class ResultService {
|
||||
Files.createDirectories(resultDirectory);
|
||||
checkAndUnzipTo(io, tmpResultDirectory);
|
||||
move(tmpResultDirectory, resultDirectory);
|
||||
} catch (Exception ex) { //NOPMD
|
||||
} catch (Exception ex) {
|
||||
if (resultDirectory != null) {
|
||||
// Clean on error
|
||||
FileUtils.deleteQuietly(resultDirectory.toFile());
|
||||
@ -123,7 +123,7 @@ public class ResultService {
|
||||
final Path newFile = fromZip(unzipTo, zipEntry);
|
||||
try (final OutputStream fos = Files.newOutputStream(newFile)) {
|
||||
int len;
|
||||
while ((len = zis.read(buffer)) > 0) { //NOPMD
|
||||
while ((len = zis.read(buffer)) > 0) {
|
||||
fos.write(buffer, 0, len);
|
||||
}
|
||||
}
|
||||
@ -147,7 +147,7 @@ public class ResultService {
|
||||
try {
|
||||
Files.walkFileTree(nestedResultDir, new MoveFileVisitor(to));
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException("Walk error " + nestedResultDir, e); //NOPMD
|
||||
throw new RuntimeException("Walk error " + nestedResultDir, e);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
@ -1 +1,5 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M349.9 236.3h-66.1v-59.4h66.1v59.4zm0-204.3h-66.1v60.7h66.1V32zm78.2 144.8H362v59.4h66.1v-59.4zm-156.3-72.1h-66.1v60.1h66.1v-60.1zm78.1 0h-66.1v60.1h66.1v-60.1zm276.8 100c-14.4-9.7-47.6-13.2-73.1-8.4-3.3-24-16.7-44.9-41.1-63.7l-14-9.3-9.3 14c-18.4 27.8-23.4 73.6-3.7 103.8-8.7 4.7-25.8 11.1-48.4 10.7H2.4c-8.7 50.8 5.8 116.8 44 162.1 37.1 43.9 92.7 66.2 165.4 66.2 157.4 0 273.9-72.5 328.4-204.2 21.4 .4 67.6 .1 91.3-45.2 1.5-2.5 6.6-13.2 8.5-17.1l-13.3-8.9zm-511.1-27.9h-66v59.4h66.1v-59.4zm78.1 0h-66.1v59.4h66.1v-59.4zm78.1 0h-66.1v59.4h66.1v-59.4zm-78.1-72.1h-66.1v60.1h66.1v-60.1z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 640 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.-->
|
||||
<path
|
||||
d="M349.9 236.3h-66.1v-59.4h66.1v59.4zm0-204.3h-66.1v60.7h66.1V32zm78.2 144.8H362v59.4h66.1v-59.4zm-156.3-72.1h-66.1v60.1h66.1v-60.1zm78.1 0h-66.1v60.1h66.1v-60.1zm276.8 100c-14.4-9.7-47.6-13.2-73.1-8.4-3.3-24-16.7-44.9-41.1-63.7l-14-9.3-9.3 14c-18.4 27.8-23.4 73.6-3.7 103.8-8.7 4.7-25.8 11.1-48.4 10.7H2.4c-8.7 50.8 5.8 116.8 44 162.1 37.1 43.9 92.7 66.2 165.4 66.2 157.4 0 273.9-72.5 328.4-204.2 21.4 .4 67.6 .1 91.3-45.2 1.5-2.5 6.6-13.2 8.5-17.1l-13.3-8.9zm-511.1-27.9h-66v59.4h66.1v-59.4zm78.1 0h-66.1v59.4h66.1v-59.4zm78.1 0h-66.1v59.4h66.1v-59.4zm-78.1-72.1h-66.1v60.1h66.1v-60.1z"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 816 B After Width: | Height: | Size: 836 B |
@ -1 +1,5 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3 .3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5 .3-6.2 2.3zm44.2-1.7c-2.9 .7-4.9 2.6-4.6 4.9 .3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3 .7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3 .3 2.9 2.3 3.9 1.6 1 3.6 .7 4.3-.7 .7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3 .7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3 .7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 496 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.-->
|
||||
<path
|
||||
d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3 .3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5 .3-6.2 2.3zm44.2-1.7c-2.9 .7-4.9 2.6-4.6 4.9 .3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3 .7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3 .3 2.9 2.3 3.9 1.6 1 3.6 .7 4.3-.7 .7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3 .7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3 .7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
@ -1 +1,5 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.-->
|
||||
<path
|
||||
d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 655 B After Width: | Height: | Size: 675 B |
@ -1 +1,21 @@
|
||||
<?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'><svg enable-background="new 0 0 128 128" version="1.1" viewBox="0 0 128 128" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="Layer_1"><rect fill="#F4F5F5" height="1520" opacity="0" width="727.938" x="-59.984" y="-351"/></g><g id="Layer_2"><g><circle cx="64" cy="64" fill="#6E9583" r="64"/><g><defs><circle cx="64" cy="64" id="SVGID_3_" r="64"/></defs><clipPath id="SVGID_2_"><use overflow="visible" xlink:href="#SVGID_3_"/></clipPath><polygon clip-path="url(#SVGID_2_)" fill="#648778" points="93.572,29.677 128,64 128,128 54.36,128 33.341,106.906 "/></g><path d="M84.044,20H36.018C33.579,20,32,22.11,32,24.549v78.903c0,2.439,1.579,4.549,4.018,4.549h55.989 c2.439,0,4.018-2.11,4.018-4.549V32.143L84.044,20z" fill="#F1F1F1"/><g><defs><path d="M84.044,20H36.018C33.579,20,32,22.11,32,24.549v78.903c0,2.439,1.579,4.549,4.018,4.549h55.989 c2.439,0,4.018-2.11,4.018-4.549V32.143L84.044,20z" id="SVGID_5_"/></defs><clipPath id="SVGID_4_"><use overflow="visible" xlink:href="#SVGID_5_"/></clipPath><g clip-path="url(#SVGID_4_)"><polygon fill="#DDE1F1" points="50.948,67.621 65.539,82.042 42.971,83.087 49.777,90 42.971,91.087 49.277,97.555 42.971,99.087 53.027,109.305 97.684,109.305 97.684,75.707 97.075,54.055 81.059,37.758 70.97,44.918 62.684,35.107 "/></g></g><path d="M88.186,32.138l7.839,0.005L84.044,20v7.96C84.044,30.398,85.769,32.138,88.186,32.138z" fill="#C2DFC9"/><path d="M84,83.5H44c-0.828,0-1.5-0.672-1.5-1.5s0.672-1.5,1.5-1.5h40c0.828,0,1.5,0.672,1.5,1.5 S84.828,83.5,84,83.5z" fill="#495260"/><path d="M84,91.5H44c-0.828,0-1.5-0.672-1.5-1.5s0.672-1.5,1.5-1.5h40c0.828,0,1.5,0.672,1.5,1.5 S84.828,91.5,84,91.5z" fill="#495260"/><path d="M84,99.5H44c-0.828,0-1.5-0.672-1.5-1.5s0.672-1.5,1.5-1.5h40c0.828,0,1.5,0.672,1.5,1.5 S84.828,99.5,84,99.5z" fill="#495260"/><g><path d="M69.568,31.844l-1.319,11.303c2.314,0.88,4.242,2.728,5.132,5.245c0.573,1.619,0.631,3.292,0.274,4.851 l10.257,4.895c0.527,0.252,1.155-0.023,1.329-0.581c1.308-4.188,1.323-8.819-0.253-13.273 c-2.379-6.723-7.827-11.477-14.212-13.254C70.21,30.872,69.636,31.26,69.568,31.844z" fill="#0E9CD9"/><path d="M66.68,59.901c-3.653,0.668-7.398-1.12-9.176-4.38c-1.094-2.006-1.312-4.174-0.858-6.157L46.39,44.469 c-0.527-0.251-1.155,0.023-1.329,0.58c-1.286,4.118-1.322,8.663,0.175,13.049c3.701,10.842,15.624,16.783,26.503,13.191 c4.655-1.537,8.399-4.531,10.911-8.3c0.324-0.486,0.141-1.147-0.385-1.398l-10.257-4.896 C70.751,58.296,68.929,59.49,66.68,59.901z" fill="#E95037"/><path d="M62.239,43.074c0.734-0.26,1.479-0.405,2.22-0.464l1.316-11.275c0.067-0.576-0.389-1.08-0.968-1.071 c-2.218,0.035-4.469,0.421-6.676,1.202c-4.455,1.576-8.045,4.5-10.479,8.151c-0.324,0.486-0.142,1.147,0.385,1.399l10.257,4.895 C59.282,44.654,60.62,43.647,62.239,43.074z" fill="#69B32D"/><g><defs><path d="M69.695,30.76l-1.446,12.387c2.314,0.88,4.242,2.728,5.132,5.245c0.573,1.619,0.631,3.292,0.274,4.851 l10.257,4.895c0.527,0.252,1.155-0.023,1.329-0.581c1.308-4.188,1.323-8.819-0.253-13.273 C82.476,37.185,76.541,32.281,69.695,30.76z M66.68,59.901c-3.653,0.668-7.398-1.12-9.176-4.38 c-1.094-2.006-1.312-4.174-0.858-6.157L46.39,44.469c-0.527-0.251-1.155,0.023-1.329,0.58 c-1.286,4.118-1.322,8.663,0.175,13.049c3.701,10.842,15.624,16.783,26.503,13.191c4.655-1.537,8.399-4.531,10.911-8.3 c0.324-0.486,0.141-1.147-0.385-1.398l-10.257-4.896C70.751,58.296,68.929,59.49,66.68,59.901z M62.239,43.074 c0.734-0.26,1.479-0.405,2.22-0.464l1.316-11.275c0.067-0.576-0.389-1.08-0.968-1.071c-2.218,0.035-4.469,0.421-6.676,1.202 c-4.455,1.576-8.045,4.5-10.479,8.151c-0.324,0.486-0.142,1.147,0.385,1.399l10.257,4.895 C59.282,44.654,60.62,43.647,62.239,43.074z" id="SVGID_7_"/></defs><clipPath id="SVGID_6_"><use overflow="visible" xlink:href="#SVGID_7_"/></clipPath><circle clip-path="url(#SVGID_6_)" cx="65.151" cy="51.304" fill="#FFFFFF" opacity="0.4" r="12.507"/></g></g></g></g></svg>
|
||||
<?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'>
|
||||
<svg enable-background="new 0 0 128 128" version="1.1" viewBox="0 0 128 128" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="Layer_1"><rect fill="#F4F5F5" height="1520" opacity="0" width="727.938" x="-59.984" y="-351"/></g>
|
||||
<g id="Layer_2"><g><circle cx="64" cy="64" fill="#6E9583" r="64"/><g><defs><circle cx="64" cy="64" id="SVGID_3_" r="64"/></defs>
|
||||
<clipPath id="SVGID_2_"><use overflow="visible" xlink:href="#SVGID_3_"/></clipPath>
|
||||
<polygon clip-path="url(#SVGID_2_)" fill="#648778" points="93.572,29.677 128,64 128,128 54.36,128 33.341,106.906 "/></g><path
|
||||
d="M84.044,20H36.018C33.579,20,32,22.11,32,24.549v78.903c0,2.439,1.579,4.549,4.018,4.549h55.989 c2.439,0,4.018-2.11,4.018-4.549V32.143L84.044,20z" fill="#F1F1F1"/><g><defs><path d="M84.044,20H36.018C33.579,20,32,22.11,32,24.549v78.903c0,2.439,1.579,4.549,4.018,4.549h55.989 c2.439,0,4.018-2.11,4.018-4.549V32.143L84.044,20z" id="SVGID_5_"/></defs>
|
||||
<clipPath id="SVGID_4_"><use overflow="visible" xlink:href="#SVGID_5_"/></clipPath>
|
||||
<g clip-path="url(#SVGID_4_)"><polygon fill="#DDE1F1" points="50.948,67.621 65.539,82.042 42.971,83.087 49.777,90 42.971,91.087 49.277,97.555 42.971,99.087 53.027,109.305 97.684,109.305 97.684,75.707 97.075,54.055 81.059,37.758 70.97,44.918 62.684,35.107 "/></g></g><path
|
||||
d="M88.186,32.138l7.839,0.005L84.044,20v7.96C84.044,30.398,85.769,32.138,88.186,32.138z" fill="#C2DFC9"/><path
|
||||
d="M84,83.5H44c-0.828,0-1.5-0.672-1.5-1.5s0.672-1.5,1.5-1.5h40c0.828,0,1.5,0.672,1.5,1.5 S84.828,83.5,84,83.5z" fill="#495260"/><path
|
||||
d="M84,91.5H44c-0.828,0-1.5-0.672-1.5-1.5s0.672-1.5,1.5-1.5h40c0.828,0,1.5,0.672,1.5,1.5 S84.828,91.5,84,91.5z" fill="#495260"/><path
|
||||
d="M84,99.5H44c-0.828,0-1.5-0.672-1.5-1.5s0.672-1.5,1.5-1.5h40c0.828,0,1.5,0.672,1.5,1.5 S84.828,99.5,84,99.5z" fill="#495260"/><g><path d="M69.568,31.844l-1.319,11.303c2.314,0.88,4.242,2.728,5.132,5.245c0.573,1.619,0.631,3.292,0.274,4.851 l10.257,4.895c0.527,0.252,1.155-0.023,1.329-0.581c1.308-4.188,1.323-8.819-0.253-13.273 c-2.379-6.723-7.827-11.477-14.212-13.254C70.21,30.872,69.636,31.26,69.568,31.844z" fill="#0E9CD9"/>
|
||||
<path
|
||||
d="M66.68,59.901c-3.653,0.668-7.398-1.12-9.176-4.38c-1.094-2.006-1.312-4.174-0.858-6.157L46.39,44.469 c-0.527-0.251-1.155,0.023-1.329,0.58c-1.286,4.118-1.322,8.663,0.175,13.049c3.701,10.842,15.624,16.783,26.503,13.191 c4.655-1.537,8.399-4.531,10.911-8.3c0.324-0.486,0.141-1.147-0.385-1.398l-10.257-4.896 C70.751,58.296,68.929,59.49,66.68,59.901z"
|
||||
fill="#E95037"/>
|
||||
<path
|
||||
d="M62.239,43.074c0.734-0.26,1.479-0.405,2.22-0.464l1.316-11.275c0.067-0.576-0.389-1.08-0.968-1.071 c-2.218,0.035-4.469,0.421-6.676,1.202c-4.455,1.576-8.045,4.5-10.479,8.151c-0.324,0.486-0.142,1.147,0.385,1.399l10.257,4.895 C59.282,44.654,60.62,43.647,62.239,43.074z"
|
||||
fill="#69B32D"/>
|
||||
<g><defs><path d="M69.695,30.76l-1.446,12.387c2.314,0.88,4.242,2.728,5.132,5.245c0.573,1.619,0.631,3.292,0.274,4.851 l10.257,4.895c0.527,0.252,1.155-0.023,1.329-0.581c1.308-4.188,1.323-8.819-0.253-13.273 C82.476,37.185,76.541,32.281,69.695,30.76z M66.68,59.901c-3.653,0.668-7.398-1.12-9.176-4.38 c-1.094-2.006-1.312-4.174-0.858-6.157L46.39,44.469c-0.527-0.251-1.155,0.023-1.329,0.58 c-1.286,4.118-1.322,8.663,0.175,13.049c3.701,10.842,15.624,16.783,26.503,13.191c4.655-1.537,8.399-4.531,10.911-8.3 c0.324-0.486,0.141-1.147-0.385-1.398l-10.257-4.896C70.751,58.296,68.929,59.49,66.68,59.901z M62.239,43.074 c0.734-0.26,1.479-0.405,2.22-0.464l1.316-11.275c0.067-0.576-0.389-1.08-0.968-1.071c-2.218,0.035-4.469,0.421-6.676,1.202 c-4.455,1.576-8.045,4.5-10.479,8.151c-0.324,0.486-0.142,1.147,0.385,1.399l10.257,4.895 C59.282,44.654,60.62,43.647,62.239,43.074z" id="SVGID_7_"/></defs>
|
||||
<clipPath id="SVGID_6_"><use overflow="visible" xlink:href="#SVGID_7_"/></clipPath>
|
||||
<circle clip-path="url(#SVGID_6_)" cx="65.151" cy="51.304" fill="#FFFFFF" opacity="0.4" r="12.507"/></g></g></g></g></svg>
|
||||
|
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 4.2 KiB |
@ -460,7 +460,8 @@
|
||||
<div class="Icons_icon__2yUqd">
|
||||
<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg">
|
||||
<g>
|
||||
<path d="M6 12A6 6 0 1 1 6 0a6 6 0 0 1 0 12zm0-1.126A4.881 4.881 0 0 0 10.888 6 4.881 4.881 0 0 0 6 1.126 4.881 4.881 0 0 0 1.112 6 4.881 4.881 0 0 0 6 10.874z"></path>
|
||||
<path
|
||||
d="M6 12A6 6 0 1 1 6 0a6 6 0 0 1 0 12zm0-1.126A4.881 4.881 0 0 0 10.888 6 4.881 4.881 0 0 0 6 1.126 4.881 4.881 0 0 0 1.112 6 4.881 4.881 0 0 0 6 10.874z"></path>
|
||||
<path d="M10.282 10.635a.961.961 0 0 1-.01-1.35.94.94 0 0 1 1.338-.01l4.108 4.09c.372.37.376.975.01 1.35a.94.94 0 0 1-1.338.01l-4.108-4.09z"></path>
|
||||
</g>
|
||||
</svg>
|
||||
|