diff --git a/haiti-bom/pom.xml b/haiti-bom/pom.xml
new file mode 100644
index 0000000..3369f61
--- /dev/null
+++ b/haiti-bom/pom.xml
@@ -0,0 +1,142 @@
+
+
+ 4.0.0
+
+ org.sadtech.haiti
+ haiti-bom
+ 0.0.1-RELEASE
+ pom
+
+ Haiti BOM
+ Fast development to keep time on the beach
+ https://github.com/haiti-projects/haiti-framework
+
+
+ Apache License 2.0
+ https://github.com/haiti-projects/haiti-framework/blob/master/LICENSE
+ repo
+
+
+
+
+ scm:git:https://github.com/haiti-projects/haiti-framework.git
+ https://github.com/haiti-projects/haiti-framework
+ scm:git:https://github.com/haiti-projects/haiti-framework.git
+
+
+
+
+ ossrh
+ https://oss.sonatype.org/content/repositories/snapshots
+
+
+
+
+ 1.8
+ 1.8
+ 1.8
+
+ 0.0.1-RELEASE
+ 0.0.1-RELEASE
+ 0.0.1-RELEASE
+ 0.0.1-RELEASE
+ 0.0.1-RELEASE
+ 0.0.1-RELEASE
+
+ 4.1.0
+ 2.4.0
+ 2.4.0
+
+ 7.9.3
+ 1.18.16
+
+
+
+
+
+ org.sadtech.haiti
+ haiti-context
+ ${sadtech.haiti.context.version}
+
+
+
+ org.sadtech.haiti
+ haiti-core
+ ${sadtech.haiti.core.version}
+
+
+
+ org.sadtech.haiti
+ haiti-filter
+ ${sadtech.haiti.filter.api.version}
+
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+ provided
+
+
+
+ org.elasticsearch
+ elasticsearch
+ ${elasticsearch.version}
+
+
+
+ javax.persistence
+ javax.persistence-api
+ 2.2
+
+
+
+
+ org.springframework.data
+ spring-data-elasticsearch
+ ${spring.data.elasticsearch.version}
+
+
+
+ org.springframework.data
+ spring-data-commons
+ ${spring.data.commons.version}
+
+
+
+ org.springframework.data
+ spring-data-jpa
+ ${spring.data.jpa.version}
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.0
+
+
+ 8
+
+
+
+
+
+
+
+ uPagge
+ Struchkov Mark
+ upagge@ya.ru
+ SADTECH
+ https://upagge.sadtech.org
+
+
+
+
+
\ No newline at end of file
diff --git a/haiti-context/pom.xml b/haiti-context/pom.xml
index 0ca9a26..2998c7d 100644
--- a/haiti-context/pom.xml
+++ b/haiti-context/pom.xml
@@ -6,11 +6,11 @@
org.sadtech.haiti
haiti
- 0.0.1-SNAPSHOT
+ 0.0.1-RELEASE
haiti-context
- 0.0.1-SNAPSHOT
+ 0.0.1-RELEASE
diff --git a/haiti-core/pom.xml b/haiti-core/pom.xml
index 0e58a91..104c0a8 100644
--- a/haiti-core/pom.xml
+++ b/haiti-core/pom.xml
@@ -6,11 +6,11 @@
org.sadtech.haiti
haiti
- 0.0.1-SNAPSHOT
+ 0.0.1-RELEASE
haiti-core
- 0.0.1-SNAPSHOT
+ 0.0.1-RELEASE
@@ -19,8 +19,8 @@
- org.sadtech.haiti.filter
- filter-api
+ org.sadtech.haiti
+ haiti-filter
diff --git a/haiti-database/.gitignore b/haiti-database/.gitignore
deleted file mode 100644
index 58ae9ed..0000000
--- a/haiti-database/.gitignore
+++ /dev/null
@@ -1,51 +0,0 @@
-# Created by .ignore support plugin (hsz.mobi)
-target/
-pom.xml.tag
-pom.xml.releaseBackup
-pom.xml.versionsBackup
-pom.xml.next
-release.properties
-dependency-reduced-pom.xml
-buildNumber.properties
-.mvn/timing.properties
-.mvn/wrapper/maven-wrapper.jar
-*.class
-*.log
-*.ctxt
-.mtj.tmp/
-*.jar
-*.war
-*.nar
-*.ear
-*.zip
-*.tar.gz
-*.rar
-hs_err_pid*
-.idea/**/workspace.xml
-.idea/**/tasks.xml
-.idea/**/usage.statistics.xml
-.idea/**/dictionaries
-.idea/**/shelf
-.idea/**/contentModel.xml
-.idea/**/dataSources/
-.idea/**/dataSources.ids
-.idea/**/dataSources.local.xml
-.idea/**/sqlDataSources.xml
-.idea/**/dynamic.xml
-.idea/**/uiDesigner.xml
-.idea/**/dbnavigator.xml
-.idea/**/gradle.xml
-.idea/**/libraries
-cmake-build-*/
-.idea/**/mongoSettings.xml
-*.iws
-out/
-.idea_modules/
-atlassian-ide-plugin.xml
-.idea/replstate.xml
-com_crashlytics_export_strings.xml
-crashlytics.properties
-crashlytics-build.properties
-fabric.properties
-.idea/httpRequests
-.idea/caches/build_file_checksums.ser
diff --git a/haiti-database/src/main/java/org/sadtech/haiti/database/entity/BasicEntity.java b/haiti-database/src/main/java/org/sadtech/haiti/database/entity/BasicEntity.java
deleted file mode 100644
index 1312634..0000000
--- a/haiti-database/src/main/java/org/sadtech/haiti/database/entity/BasicEntity.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.sadtech.haiti.database.entity;
-
-import lombok.EqualsAndHashCode;
-import lombok.Getter;
-import lombok.Setter;
-
-import javax.persistence.Column;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.MappedSuperclass;
-
-@Getter
-@Setter
-@MappedSuperclass
-@EqualsAndHashCode(of = "id")
-public abstract class BasicEntity {
-
- @Id
- @GeneratedValue(strategy = GenerationType.IDENTITY)
- @Column(name = "id", updatable = false, nullable = false)
- protected Long id;
-
-}
diff --git a/haiti-database/src/main/java/org/sadtech/haiti/database/repository/AbstractCrudOperation.java b/haiti-database/src/main/java/org/sadtech/haiti/database/repository/AbstractCrudOperation.java
deleted file mode 100644
index dffe2de..0000000
--- a/haiti-database/src/main/java/org/sadtech/haiti/database/repository/AbstractCrudOperation.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.sadtech.haiti.database.repository;
-
-import lombok.NonNull;
-import lombok.RequiredArgsConstructor;
-import org.sadtech.haiti.context.repository.simple.CrudOperation;
-import org.springframework.data.jpa.repository.JpaRepository;
-
-import java.util.Optional;
-
-@RequiredArgsConstructor
-public abstract class AbstractCrudOperation implements CrudOperation {
-
- private final JpaRepository jpaRepository;
-
- @Override
- public T save(@NonNull T entity) {
- return OperationJpa.save(jpaRepository, entity);
- }
-
- @Override
- public Optional findById(@NonNull K primaryKey) {
- return OperationJpa.findById(jpaRepository, primaryKey);
- }
-
- @Override
- public boolean existsById(@NonNull K primaryKey) {
- return OperationJpa.existsById(jpaRepository, primaryKey);
- }
-
- @Override
- public void deleteById(@NonNull K primaryKey) {
- OperationJpa.deleteById(jpaRepository, primaryKey);
- }
-
-}
diff --git a/haiti-database/src/main/java/org/sadtech/haiti/database/repository/AbstractFilterOperation.java b/haiti-database/src/main/java/org/sadtech/haiti/database/repository/AbstractFilterOperation.java
deleted file mode 100644
index 08601e7..0000000
--- a/haiti-database/src/main/java/org/sadtech/haiti/database/repository/AbstractFilterOperation.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.sadtech.haiti.database.repository;
-
-import lombok.NonNull;
-import lombok.RequiredArgsConstructor;
-import org.sadtech.haiti.context.page.Pagination;
-import org.sadtech.haiti.context.page.Sheet;
-import org.sadtech.haiti.filter.Filter;
-import org.sadtech.haiti.filter.FilterOperation;
-import org.springframework.data.jpa.repository.support.JpaRepositoryImplementation;
-
-import java.util.Optional;
-
-@RequiredArgsConstructor
-public abstract class AbstractFilterOperation implements FilterOperation {
-
- private final JpaRepositoryImplementation jpaRepository;
-
- @Override
- public Sheet findAll(@NonNull Filter filter, @NonNull Pagination pagination) {
- return OperationJpa.findAll(jpaRepository, filter.build(), pagination);
- }
-
- @Override
- public Optional findFirst(@NonNull Filter filter) {
- return OperationJpa.findFirst(jpaRepository, filter.build());
- }
-
- @Override
- public boolean exists(@NonNull Filter filter) {
- return OperationJpa.exists(jpaRepository, filter.build());
- }
-
- @Override
- public long count(@NonNull Filter filter) {
- return OperationJpa.count(jpaRepository, filter.build());
- }
-
-}
diff --git a/haiti-database/src/main/java/org/sadtech/haiti/database/repository/AbstractMultipleOperation.java b/haiti-database/src/main/java/org/sadtech/haiti/database/repository/AbstractMultipleOperation.java
deleted file mode 100644
index 6dc19eb..0000000
--- a/haiti-database/src/main/java/org/sadtech/haiti/database/repository/AbstractMultipleOperation.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package org.sadtech.haiti.database.repository;
-
-import lombok.NonNull;
-import lombok.RequiredArgsConstructor;
-import org.sadtech.haiti.context.repository.simple.MultipleOperation;
-import org.springframework.data.jpa.repository.JpaRepository;
-
-import java.util.Collection;
-import java.util.List;
-
-@RequiredArgsConstructor
-public abstract class AbstractMultipleOperation implements MultipleOperation {
-
- private final JpaRepository jpaRepository;
-
- @Override
- public List saveAll(@NonNull Collection entities) {
- return OperationJpa.saveAll(jpaRepository, entities);
- }
-
- @Override
- public void deleteAllById(@NonNull Collection primaryKeys) {
- OperationJpa.deleteAllById(jpaRepository, primaryKeys);
- }
-
-}
diff --git a/haiti-database/src/main/java/org/sadtech/haiti/database/repository/AbstractPagingOperation.java b/haiti-database/src/main/java/org/sadtech/haiti/database/repository/AbstractPagingOperation.java
deleted file mode 100644
index 1546170..0000000
--- a/haiti-database/src/main/java/org/sadtech/haiti/database/repository/AbstractPagingOperation.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.sadtech.haiti.database.repository;
-
-import lombok.NonNull;
-import lombok.RequiredArgsConstructor;
-import org.sadtech.haiti.context.page.Pagination;
-import org.sadtech.haiti.context.page.Sheet;
-import org.sadtech.haiti.context.repository.simple.PagingOperation;
-import org.springframework.data.jpa.repository.JpaRepository;
-
-@RequiredArgsConstructor
-public abstract class AbstractPagingOperation implements PagingOperation {
-
- private final JpaRepository jpaRepository;
-
- @Override
- public Sheet findAll(@NonNull Pagination pagination) {
- return OperationJpa.findAll(jpaRepository, pagination);
- }
-
-}
diff --git a/haiti-database/src/main/java/org/sadtech/haiti/database/repository/OperationJpa.java b/haiti-database/src/main/java/org/sadtech/haiti/database/repository/OperationJpa.java
deleted file mode 100644
index d625f6a..0000000
--- a/haiti-database/src/main/java/org/sadtech/haiti/database/repository/OperationJpa.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package org.sadtech.haiti.database.repository;
-
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
-import org.sadtech.haiti.context.page.Pagination;
-import org.sadtech.haiti.context.page.Sheet;
-import org.sadtech.haiti.database.util.Converter;
-import org.springframework.data.jpa.domain.Specification;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.support.JpaRepositoryImplementation;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Optional;
-
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public class OperationJpa {
-
- public static T save(JpaRepository jpaRepository, T entity) {
- return jpaRepository.save(entity);
- }
-
- public static Optional findById(JpaRepository jpaRepository, K primaryKey) {
- return jpaRepository.findById(primaryKey);
- }
-
- public static boolean existsById(JpaRepository jpaRepository, K primaryKey) {
- return jpaRepository.existsById(primaryKey);
- }
-
- public static void deleteById(JpaRepository jpaRepository, K primaryKey) {
- jpaRepository.deleteById(primaryKey);
- }
-
- public static Sheet findAll(JpaRepository jpaRepository, Pagination pagination) {
- return Converter.page(
- jpaRepository.findAll(
- Converter.pagination(pagination)
- )
- );
- }
-
- public static List saveAll(JpaRepository jpaRepository, Collection entities) {
- return jpaRepository.saveAll(entities);
- }
-
- public static void deleteAllById(JpaRepository jpaRepository, Collection primaryKeys) {
- primaryKeys.forEach(jpaRepository::deleteById);
- }
-
- public static Optional findFirst(JpaRepositoryImplementation jpaRepository, Specification specification) {
- return jpaRepository.findOne(specification);
- }
-
- public static boolean exists(JpaRepositoryImplementation jpaRepository, Specification specification) {
- return jpaRepository.count(specification) > 0;
- }
-
- public static List findAll(JpaRepositoryImplementation jpaRepository, Specification specification) {
- return jpaRepository.findAll(specification);
- }
-
- public static Sheet findAll(JpaRepositoryImplementation jpaRepository, Specification specification, Pagination pagination) {
- return Converter.page(
- jpaRepository.findAll(specification, Converter.pagination(pagination))
- );
- }
-
- public static long count(JpaRepositoryImplementation jpaRepository, Specification specification) {
- return jpaRepository.count(specification);
- }
-
-}
diff --git a/haiti-database/src/main/java/org/sadtech/haiti/database/repository/manager/AbstractSimpleManagerRepository.java b/haiti-database/src/main/java/org/sadtech/haiti/database/repository/manager/AbstractSimpleManagerRepository.java
deleted file mode 100644
index 67b083f..0000000
--- a/haiti-database/src/main/java/org/sadtech/haiti/database/repository/manager/AbstractSimpleManagerRepository.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package org.sadtech.haiti.database.repository.manager;
-
-import lombok.NonNull;
-import lombok.RequiredArgsConstructor;
-import org.sadtech.haiti.database.repository.OperationJpa;
-import org.sadtech.haiti.context.page.Pagination;
-import org.sadtech.haiti.context.page.Sheet;
-import org.sadtech.haiti.context.repository.SimpleManagerRepository;
-import org.springframework.data.jpa.repository.JpaRepository;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Optional;
-
-@RequiredArgsConstructor
-public abstract class AbstractSimpleManagerRepository implements SimpleManagerRepository {
-
- private final JpaRepository jpaRepository;
-
- @Override
- public T save(@NonNull T entity) {
- return OperationJpa.save(jpaRepository, entity);
- }
-
- @Override
- public Optional findById(@NonNull K primaryKey) {
- return OperationJpa.findById(jpaRepository, primaryKey);
- }
-
- @Override
- public boolean existsById(@NonNull K primaryKey) {
- return OperationJpa.existsById(jpaRepository, primaryKey);
- }
-
- @Override
- public void deleteById(@NonNull K primaryKey) {
- OperationJpa.deleteById(jpaRepository, primaryKey);
- }
-
- @Override
- public List saveAll(@NonNull Collection entities) {
- return OperationJpa.saveAll(jpaRepository, entities);
- }
-
- @Override
- public void deleteAllById(@NonNull Collection primaryKeys) {
- OperationJpa.deleteAllById(jpaRepository, primaryKeys);
- }
-
- @Override
- public Sheet findAll(@NonNull Pagination pagination) {
- return OperationJpa.findAll(jpaRepository, pagination);
- }
-
-}
diff --git a/haiti-database/src/main/java/org/sadtech/haiti/database/repository/manager/FilterManagerRepository.java b/haiti-database/src/main/java/org/sadtech/haiti/database/repository/manager/FilterManagerRepository.java
deleted file mode 100644
index f71db8c..0000000
--- a/haiti-database/src/main/java/org/sadtech/haiti/database/repository/manager/FilterManagerRepository.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package org.sadtech.haiti.database.repository.manager;
-
-import lombok.NonNull;
-import lombok.extern.slf4j.Slf4j;
-import org.sadtech.haiti.context.page.Pagination;
-import org.sadtech.haiti.context.page.Sheet;
-import org.sadtech.haiti.database.repository.OperationJpa;
-import org.sadtech.haiti.filter.Filter;
-import org.sadtech.haiti.filter.FilterOperation;
-import org.springframework.dao.InvalidDataAccessResourceUsageException;
-import org.springframework.data.jpa.repository.support.JpaRepositoryImplementation;
-
-import java.util.Optional;
-
-@Slf4j
-public abstract class FilterManagerRepository extends AbstractSimpleManagerRepository implements FilterOperation {
-
- private final JpaRepositoryImplementation jpaRepositoryImplementation;
-
- public FilterManagerRepository(JpaRepositoryImplementation jpaRepository) {
- super(jpaRepository);
- this.jpaRepositoryImplementation = jpaRepository;
- }
-
- @Override
- public Sheet findAll(@NonNull Filter filter, @NonNull Pagination pagination) {
- return OperationJpa.findAll(jpaRepositoryImplementation, filter.build(), pagination);
- }
-
- @Override
- public Optional findFirst(@NonNull Filter filter) {
- try {
- return OperationJpa.findFirst(jpaRepositoryImplementation, filter.build());
- } catch (InvalidDataAccessResourceUsageException e) {
- log.error(e.getMessage());
- }
- return Optional.empty();
- }
-
- @Override
- public boolean exists(@NonNull Filter filter) {
- try {
- return OperationJpa.exists(jpaRepositoryImplementation, filter.build());
- } catch (InvalidDataAccessResourceUsageException e) {
- log.error(e.getMessage());
- }
- return false;
- }
-
- @Override
- public long count(@NonNull Filter filter) {
- try {
- return OperationJpa.count(jpaRepositoryImplementation, filter.build());
- } catch (InvalidDataAccessResourceUsageException e) {
- log.error(e.getMessage());
- }
- return 0;
- }
-}
diff --git a/haiti-database/src/main/java/org/sadtech/haiti/database/util/Converter.java b/haiti-database/src/main/java/org/sadtech/haiti/database/util/Converter.java
deleted file mode 100644
index abfbdef..0000000
--- a/haiti-database/src/main/java/org/sadtech/haiti/database/util/Converter.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.sadtech.haiti.database.util;
-
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
-import lombok.NonNull;
-import org.sadtech.haiti.context.enums.TypeSort;
-import org.sadtech.haiti.context.page.Pagination;
-import org.sadtech.haiti.context.page.Sheet;
-import org.sadtech.haiti.core.page.SheetImpl;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.PageRequest;
-import org.springframework.data.domain.Pageable;
-import org.springframework.data.domain.Sort;
-
-
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public class Converter {
-
- public static Pageable pagination(@NonNull Pagination pagination) {
- if (pagination.getTypeSort() != null) {
- return PageRequest.of(
- pagination.getPage(),
- pagination.getSize(),
- TypeSort.ASC.equals(pagination.getTypeSort()) ? Sort.Direction.ASC : Sort.Direction.DESC,
- pagination.getFieldSort()
- );
- }
- return PageRequest.of(pagination.getPage(), pagination.getSize());
- }
-
- public static Sheet page(@NonNull Page page) {
- return SheetImpl.builder()
- .totalPage(page.getTotalPages())
- .totalElement(page.getTotalElements())
- .size(page.getSize())
- .number(page.getNumber())
- .content(page.getContent())
- .build();
- }
-
-}
diff --git a/haiti-database/pom.xml b/haiti-filter/pom.xml
similarity index 59%
rename from haiti-database/pom.xml
rename to haiti-filter/pom.xml
index d9db6a3..190fa80 100644
--- a/haiti-database/pom.xml
+++ b/haiti-filter/pom.xml
@@ -6,11 +6,11 @@
org.sadtech.haiti
haiti
- 0.0.1-SNAPSHOT
+ 0.0.1-RELEASE
- haiti-database
- 0.0.1-SNAPSHOT
+ haiti-filter
+ 0.0.1-RELEASE
@@ -20,18 +20,18 @@
org.sadtech.haiti
- haiti-core
-
-
-
- org.sadtech.haiti.filter
- criteria-filter
-
-
-
- org.springframework.data
- spring-data-jpa
+ haiti-context
+
+
+ uPagge
+ Struchkov Mark
+ upagge@ya.ru
+ SADTECH
+ https://t.me/uPagge
+
+
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 028a73d..5ea34b1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,107 +6,110 @@
org.sadtech.haiti
haiti
- 0.0.1-SNAPSHOT
+ 0.0.1-RELEASE
pom
haiti-context
haiti-core
- haiti-database
+ haiti-filter
+ haiti-bom
-
- 1.8
- 1.8
- 1.8
-
- 0.0.1-SNAPSHOT
- 0.0.1-SNAPSHOT
- 0.0.1-SNAPSHOT
- 0.0.1-SNAPSHOT
-
- 4.1.0
- 2.4.0
- 2.4.0
-
- 7.9.3
- 1.18.16
-
+
+
+ release
+
+
+
+ org.sonatype.plugins
+ nexus-staging-maven-plugin
+ 1.6.7
+ true
+
+ ossrh
+ https://oss.sonatype.org/
+ true
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+ 2.2.1
+
+
+ attach-sources
+
+ jar-no-fork
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+ 2.9.1
+
+
+ attach-javadocs
+
+ jar
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-gpg-plugin
+ 1.5
+
+
+ sign-artifacts
+ verify
+
+ sign
+
+
+
+
+
+
+
+
org.sadtech.haiti
- haiti-context
- ${sadtech.haiti.context.version}
+ haiti-bom
+ 0.0.1-RELEASE
+ pom
+ import
-
-
- org.sadtech.haiti
- haiti-core
- ${sadtech.haiti.core.version}
-
-
-
- org.sadtech.haiti.filter
- criteria-filter
- ${sadtech.haiti.filter.criteria.version}
-
-
-
- org.projectlombok
- lombok
- ${lombok.version}
- provided
-
-
-
- org.sadtech.haiti.filter
- filter-api
- ${sadtech.haiti.filter.api.version}
-
-
-
- org.elasticsearch
- elasticsearch
- ${elasticsearch.version}
-
-
-
- javax.persistence
- javax.persistence-api
- 2.2
-
-
-
-
- org.springframework.data
- spring-data-elasticsearch
- ${spring.data.elasticsearch.version}
-
-
-
- org.springframework.data
- spring-data-commons
- ${spring.data.commons.version}
-
-
-
- org.springframework.data
- spring-data-jpa
- ${spring.data.jpa.version}
-
-
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.0
+
+
+ 8
+
+
+
+
+
uPagge
Struchkov Mark
upagge@ya.ru
SADTECH
- https://t.me/uPagge
+ https://uPagge.sadtech.org