diff --git a/.docker/.env b/.docker/.env index 16b95b4b46bcd24afcae019c023cf19fb2354ffa..6e598a8d0adf7f76559845e3d88b1bc80f314aff 100644 --- a/.docker/.env +++ b/.docker/.env @@ -1,16 +1,12 @@ -# general -BASE_URL=http://localhost -ADMIN_EMAIL=support@localhost -# password for the identity service admin user -IDENTITY_SERVICE_ADMIN_PASSWORD=admin -# password for the auth service admin user -AUTH_SERVICE_ADMIN_PASSWORD=admin -# passwords for root user of the databases -METADATA_DB_PASSWORD=dbrepo -DATA_DB_PASSWORD=dbrepo -AUTH_DB_PASSWORD=dbrepo -SEARCH_DB_PASSWORD=admin -# storage service -S3_SECRET_ACCESS_KEY=seaweedfsadmin -# internal admin user, requires a change of the value of auth_ldap.dn_lookup_bind.password in dist/rabbitmq.conf -SYSTEM_PASSWORD=admin +# UNCOMMENT THE LINES BELOW TO OVERRIDE +#BASE_URL=http://example.com +#ADMIN_EMAIL=noreply@example.com +#LOG_LEVEL=debug +#IDENTITY_SERVICE_ADMIN_PASSWORD=admin +#AUTH_SERVICE_ADMIN_PASSWORD=admin +#METADATA_DB_PASSWORD=dbrepo +#DATA_DB_PASSWORD=dbrepo +#AUTH_DB_PASSWORD=dbrepo +#S3_ACCESS_KEY_ID=seaweedfsadmin +#S3_SECRET_ACCESS_KEY=seaweedfsadmin +#SYSTEM_PASSWORD=admin diff --git a/.docker/config/.gitkeep b/.docker/config/.gitkeep deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/.docker/config/1_setup-schema.sql b/.docker/config/1_setup-schema.sql new file mode 100644 index 0000000000000000000000000000000000000000..47ee3a95e2b88a62d4a2405f9c0f4d088167d748 --- /dev/null +++ b/.docker/config/1_setup-schema.sql @@ -0,0 +1,564 @@ +BEGIN; + +CREATE TABLE IF NOT EXISTS `mdb_users` +( + id character varying(36) NOT NULL, + username character varying(255) NOT NULL, + firstname character varying(255), + lastname character varying(255), + email character varying(255) NOT NULL, + orcid character varying(255), + affiliation character varying(255), + mariadb_password character varying(255) NOT NULL, + theme character varying(255) NOT NULL default ('light'), + language character varying(3) NOT NULL default ('en'), + PRIMARY KEY (id), + UNIQUE (username), + UNIQUE (email) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_images` +( + id bigint NOT NULL AUTO_INCREMENT, + registry character varying(255) NOT NULL DEFAULT 'docker.io', + name character varying(255) NOT NULL, + version character varying(255) NOT NULL, + default_port integer NOT NULL, + dialect character varying(255) NOT NULL, + driver_class character varying(255) NOT NULL, + jdbc_method character varying(255) NOT NULL, + is_default BOOLEAN NOT NULL DEFAULT FALSE, + created timestamp NOT NULL DEFAULT NOW(), + last_modified timestamp, + PRIMARY KEY (id), + UNIQUE (name, version), + UNIQUE (is_default) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_images_date` +( + id bigint NOT NULL AUTO_INCREMENT, + iid bigint NOT NULL, + database_format character varying(255) NOT NULL, + unix_format character varying(255) NOT NULL, + example character varying(255) NOT NULL, + has_time boolean NOT NULL, + created_at timestamp NOT NULL DEFAULT NOW(), + PRIMARY KEY (id), + FOREIGN KEY (iid) REFERENCES mdb_images (id), + UNIQUE (database_format, unix_format, example) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_containers` +( + id bigint NOT NULL AUTO_INCREMENT, + internal_name character varying(255) NOT NULL, + name character varying(255) NOT NULL, + host character varying(255) NOT NULL, + port integer NOT NULL default 3306, + ui_host character varying(255) NOT NULL default host, + ui_port integer NOT NULL default port, + ui_additional_flags text, + sidecar_host character varying(255), + sidecar_port integer, + image_id bigint NOT NULL, + created timestamp NOT NULL DEFAULT NOW(), + last_modified timestamp, + privileged_username character varying(255) NOT NULL, + privileged_password character varying(255) NOT NULL, + quota integer NOT NULL DEFAULT 50, + PRIMARY KEY (id), + FOREIGN KEY (image_id) REFERENCES mdb_images (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_data` +( + ID bigint NOT NULL AUTO_INCREMENT, + PROVENANCE text, + FileEncoding text, + FileType character varying(100), + Version text, + Seperator text, + PRIMARY KEY (ID) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_licenses` +( + identifier character varying(255) NOT NULL, + uri text NOT NULL, + description text NOT NULL, + PRIMARY KEY (identifier), + UNIQUE (uri(200)) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_databases` +( + id bigint NOT NULL AUTO_INCREMENT, + cid bigint NOT NULL, + name character varying(255) NOT NULL, + internal_name character varying(255) NOT NULL, + exchange_name character varying(255) NOT NULL, + description text, + engine character varying(20), + is_public boolean NOT NULL DEFAULT TRUE, + image longblob, + created_by character varying(36), + owned_by character varying(36), + contact_person character varying(36), + created timestamp NOT NULL DEFAULT NOW(), + last_modified timestamp, + PRIMARY KEY (id), + FOREIGN KEY (cid) REFERENCES mdb_containers (id) /* currently we only support one-to-one */, + FOREIGN KEY (created_by) REFERENCES mdb_users (id), + FOREIGN KEY (owned_by) REFERENCES mdb_users (id), + FOREIGN KEY (contact_person) REFERENCES mdb_users (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_databases_subjects` +( + dbid BIGINT NOT NULL, + subjects character varying(255) NOT NULL, + PRIMARY KEY (dbid, subjects) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_tables` +( + ID bigint NOT NULL AUTO_INCREMENT, + tDBID bigint NOT NULL, + tName VARCHAR(64) NOT NULL, + internal_name VARCHAR(64) NOT NULL, + queue_name VARCHAR(255) NOT NULL, + routing_key VARCHAR(255), + tDescription VARCHAR(2048), + num_rows BIGINT, + data_length BIGINT, + max_data_length BIGINT, + avg_row_length BIGINT, + `separator` CHAR(1), + quote CHAR(1), + element_null VARCHAR(50), + skip_lines BIGINT, + element_true VARCHAR(50), + element_false VARCHAR(50), + Version TEXT, + created timestamp NOT NULL DEFAULT NOW(), + versioned boolean not null default true, + created_by character varying(36) NOT NULL, + owned_by character varying(36) NOT NULL, + last_modified timestamp, + PRIMARY KEY (ID), + UNIQUE (tDBID, internal_name), + FOREIGN KEY (tDBID) REFERENCES mdb_databases (id), + FOREIGN KEY (created_by) REFERENCES mdb_users (id), + FOREIGN KEY (owned_by) REFERENCES mdb_users (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_columns` +( + ID BIGINT NOT NULL AUTO_INCREMENT, + tID BIGINT NOT NULL, + dfID BIGINT, + cName VARCHAR(64), + internal_name VARCHAR(64) NOT NULL, + Datatype ENUM ('CHAR','VARCHAR','BINARY','VARBINARY','TINYBLOB','TINYTEXT','TEXT','BLOB','MEDIUMTEXT','MEDIUMBLOB','LONGTEXT','LONGBLOB','ENUM','SET','BIT','TINYINT','BOOL','SMALLINT','MEDIUMINT','INT','BIGINT','FLOAT','DOUBLE','DECIMAL','DATE','DATETIME','TIMESTAMP','TIME','YEAR'), + length BIGINT NULL, + ordinal_position INTEGER NOT NULL, + index_length BIGINT NULL, + description VARCHAR(2048), + size BIGINT, + d BIGINT, + auto_generated BOOLEAN DEFAULT false, + is_null_allowed BOOLEAN NOT NULL DEFAULT true, + val_min NUMERIC NULL, + val_max NUMERIC NULL, + mean NUMERIC NULL, + median NUMERIC NULL, + std_dev Numeric NULL, + created timestamp NOT NULL DEFAULT NOW(), + last_modified timestamp, + FOREIGN KEY (tID) REFERENCES mdb_tables (ID) ON DELETE CASCADE, + PRIMARY KEY (ID) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_columns_enums` +( + id bigint NOT NULL AUTO_INCREMENT, + column_id bigint NOT NULL, + value CHARACTER VARYING(255) NOT NULL, + FOREIGN KEY (column_id) REFERENCES mdb_columns (ID) ON DELETE CASCADE, + PRIMARY KEY (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_columns_sets` +( + id bigint NOT NULL AUTO_INCREMENT, + column_id bigint NOT NULL, + value CHARACTER VARYING(255) NOT NULL, + FOREIGN KEY (column_id) REFERENCES mdb_columns (ID) ON DELETE CASCADE, + PRIMARY KEY (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_columns_nom` +( + tID bigint, + cID bigint, + maxlength INTEGER, + last_modified timestamp, + created timestamp NOT NULL DEFAULT NOW(), + FOREIGN KEY (tID, cID) REFERENCES mdb_columns (tID, ID), + PRIMARY KEY (tID, cID) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_columns_cat` +( + tID bigint, + cID bigint, + num_cat INTEGER, + -- cat_array TEXT[], + last_modified timestamp, + created timestamp NOT NULL DEFAULT NOW(), + FOREIGN KEY (tID, cID) REFERENCES mdb_columns (tID, ID), + PRIMARY KEY (tID, cID) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_constraints_foreign_key` +( + fkid BIGINT NOT NULL AUTO_INCREMENT, + tid BIGINT NOT NULL, + rtid BIGINT NOT NULL, + name VARCHAR(255) NOT NULL, + on_update VARCHAR(50) NULL, + on_delete VARCHAR(50) NULL, + position INT NULL, + PRIMARY KEY (fkid), + FOREIGN KEY (tid) REFERENCES mdb_tables (id) ON DELETE CASCADE, + FOREIGN KEY (rtid) REFERENCES mdb_tables (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_constraints_primary_key` +( + pkid BIGINT NOT NULL AUTO_INCREMENT, + tID BIGINT NOT NULL, + cid BIGINT NOT NULL, + PRIMARY KEY (pkid), + FOREIGN KEY (tID) REFERENCES mdb_tables (id) ON DELETE CASCADE, + FOREIGN KEY (cid) REFERENCES mdb_columns (id) ON DELETE CASCADE +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_constraints_foreign_key_reference` +( + id BIGINT NOT NULL AUTO_INCREMENT, + fkid BIGINT NOT NULL, + cid BIGINT NOT NULL, + rcid BIGINT NOT NULL, + PRIMARY KEY (id), + UNIQUE (fkid, cid, rcid), + FOREIGN KEY (fkid) REFERENCES mdb_constraints_foreign_key (fkid) ON UPDATE CASCADE, + FOREIGN KEY (cid) REFERENCES mdb_columns (id), + FOREIGN KEY (rcid) REFERENCES mdb_columns (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_constraints_unique` +( + uid BIGINT NOT NULL AUTO_INCREMENT, + name VARCHAR(255) NOT NULL, + tid BIGINT NOT NULL, + position INT NULL, + PRIMARY KEY (uid), + FOREIGN KEY (tid) REFERENCES mdb_tables (id) ON DELETE CASCADE +); + +CREATE TABLE IF NOT EXISTS `mdb_constraints_unique_columns` +( + id BIGINT NOT NULL AUTO_INCREMENT, + uid BIGINT NOT NULL, + cid BIGINT NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY (uid) REFERENCES mdb_constraints_unique (uid), + FOREIGN KEY (cid) REFERENCES mdb_columns (id) ON DELETE CASCADE +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_constraints_checks` +( + id BIGINT NOT NULL AUTO_INCREMENT, + tid BIGINT NOT NULL, + checks VARCHAR(255) NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY (tid) REFERENCES mdb_tables (id) ON DELETE CASCADE +) WITH SYSTEM VERSIONING; + + +CREATE TABLE IF NOT EXISTS `mdb_concepts` +( + id bigint NOT NULL AUTO_INCREMENT, + uri text not null, + name VARCHAR(255) null, + description TEXT null, + created timestamp NOT NULL DEFAULT NOW(), + PRIMARY KEY (id), + UNIQUE (uri(200)) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_units` +( + id bigint NOT NULL AUTO_INCREMENT, + uri text not null, + name VARCHAR(255) null, + description TEXT null, + created timestamp NOT NULL DEFAULT NOW(), + PRIMARY KEY (id), + UNIQUE (uri(200)) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_columns_concepts` +( + id bigint NOT NULL, + cID bigint NOT NULL, + created timestamp NOT NULL DEFAULT NOW(), + PRIMARY KEY (id, cid), + FOREIGN KEY (cID) REFERENCES mdb_columns (ID) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_columns_units` +( + id bigint NOT NULL, + cID bigint NOT NULL, + created timestamp NOT NULL DEFAULT NOW(), + PRIMARY KEY (id, cID), + FOREIGN KEY (cID) REFERENCES mdb_columns (ID) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_view` +( + id bigint NOT NULL AUTO_INCREMENT, + vdbid bigint NOT NULL, + vName VARCHAR(64) NOT NULL, + internal_name VARCHAR(64) NOT NULL, + Query TEXT NOT NULL, + query_hash VARCHAR(255) NOT NULL, + Public BOOLEAN NOT NULL, + InitialView BOOLEAN NOT NULL, + created timestamp NOT NULL DEFAULT NOW(), + last_modified timestamp, + created_by character varying(36) NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY (vdbid) REFERENCES mdb_databases (id), + FOREIGN KEY (created_by) REFERENCES mdb_users (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_banner_messages` +( + id bigint NOT NULL AUTO_INCREMENT, + type ENUM ('ERROR', 'WARNING', 'INFO') NOT NULL default 'INFO', + message TEXT NOT NULL, + link TEXT NULL, + link_text VARCHAR(255) NULL, + display_start timestamp NULL, + display_end timestamp NULL, + PRIMARY KEY (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_ontologies` +( + id bigint NOT NULL AUTO_INCREMENT, + prefix VARCHAR(8) NOT NULL, + uri TEXT NOT NULL, + uri_pattern TEXT, + sparql_endpoint TEXT NULL, + rdf_path TEXT NULL, + last_modified timestamp, + created timestamp NOT NULL DEFAULT NOW(), + UNIQUE (prefix), + UNIQUE (uri(200)), + PRIMARY KEY (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_view_columns` +( + id BIGINT NOT NULL AUTO_INCREMENT, + view_id BIGINT NOT NULL, + dfID BIGINT, + name VARCHAR(64), + internal_name VARCHAR(64) NOT NULL, + column_type ENUM ('CHAR','VARCHAR','BINARY','VARBINARY','TINYBLOB','TINYTEXT','TEXT','BLOB','MEDIUMTEXT','MEDIUMBLOB','LONGTEXT','LONGBLOB','ENUM','SET','BIT','TINYINT','BOOL','SMALLINT','MEDIUMINT','INT','BIGINT','FLOAT','DOUBLE','DECIMAL','DATE','DATETIME','TIMESTAMP','TIME','YEAR'), + ordinal_position INTEGER NOT NULL, + size BIGINT, + d BIGINT, + auto_generated BOOLEAN DEFAULT false, + is_null_allowed BOOLEAN NOT NULL DEFAULT true, + PRIMARY KEY (id), + FOREIGN KEY (view_id) REFERENCES mdb_view (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_identifiers` +( + id BIGINT NOT NULL AUTO_INCREMENT, + dbid BIGINT NOT NULL, + qid BIGINT, + vid BIGINT, + tid BIGINT, + publisher VARCHAR(255) NOT NULL, + language VARCHAR(2), + publication_year INTEGER NOT NULL, + publication_month INTEGER, + publication_day INTEGER, + identifier_type ENUM ('DATABASE', 'SUBSET', 'VIEW', 'TABLE') NOT NULL, + status ENUM ('DRAFT', 'PUBLISHED') NOT NULL DEFAULT ('PUBLISHED'), + query TEXT, + query_normalized TEXT, + query_hash VARCHAR(255), + execution TIMESTAMP, + result_hash VARCHAR(255), + result_number BIGINT, + doi VARCHAR(255), + created TIMESTAMP NOT NULL DEFAULT NOW(), + created_by VARCHAR(36) NOT NULL, + last_modified TIMESTAMP, + PRIMARY KEY (id), /* must be a single id from persistent identifier concept */ + FOREIGN KEY (dbid) REFERENCES mdb_databases (id), + FOREIGN KEY (created_by) REFERENCES mdb_users (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_identifier_licenses` +( + pid bigint NOT NULL, + license_id VARCHAR(255) NOT NULL, + PRIMARY KEY (pid, license_id), + FOREIGN KEY (pid) REFERENCES mdb_identifiers (id), + FOREIGN KEY (license_id) REFERENCES mdb_licenses (identifier) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_identifier_titles` +( + id bigint NOT NULL AUTO_INCREMENT, + pid bigint NOT NULL, + title text NOT NULL, + title_type ENUM ('ALTERNATIVE_TITLE', 'SUBTITLE', 'TRANSLATED_TITLE', 'OTHER'), + language VARCHAR(2), + PRIMARY KEY (id), + FOREIGN KEY (pid) REFERENCES mdb_identifiers (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_identifier_funders` +( + id bigint NOT NULL AUTO_INCREMENT, + pid bigint NOT NULL, + funder_name VARCHAR(255) NOT NULL, + funder_identifier TEXT, + funder_identifier_type ENUM ('CROSSREF_FUNDER_ID', 'GRID', 'ISNI', 'ROR', 'OTHER'), + scheme_uri text, + award_number VARCHAR(255), + award_title text, + language VARCHAR(255), + PRIMARY KEY (id), + FOREIGN KEY (pid) REFERENCES mdb_identifiers (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_identifier_descriptions` +( + id bigint NOT NULL AUTO_INCREMENT, + pid bigint NOT NULL, + description text NOT NULL, + description_type ENUM ('ABSTRACT', 'METHODS', 'SERIES_INFORMATION', 'TABLE_OF_CONTENTS', 'TECHNICAL_INFO', 'OTHER'), + language VARCHAR(2), + PRIMARY KEY (id), + FOREIGN KEY (pid) REFERENCES mdb_identifiers (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_related_identifiers` +( + id bigint NOT NULL AUTO_INCREMENT, + pid bigint NOT NULL, + value varchar(255) NOT NULL, + type varchar(255) NOT NULL, + relation varchar(255) NOT NULL, + PRIMARY KEY (id), /* must be a single id from persistent identifier concept */ + FOREIGN KEY (pid) REFERENCES mdb_identifiers (id), + UNIQUE (pid, value) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_identifier_creators` +( + id bigint NOT NULL AUTO_INCREMENT, + pid bigint NOT NULL, + given_names text, + family_name text, + creator_name VARCHAR(255) NOT NULL, + name_type ENUM ('PERSONAL', 'ORGANIZATIONAL') default 'PERSONAL', + name_identifier text, + name_identifier_scheme ENUM ('ROR', 'GRID', 'ISNI', 'ORCID'), + name_identifier_scheme_uri text, + affiliation VARCHAR(255), + affiliation_identifier text, + affiliation_identifier_scheme ENUM ('ROR', 'GRID', 'ISNI'), + affiliation_identifier_scheme_uri text, + PRIMARY KEY (id), + FOREIGN KEY (pid) REFERENCES mdb_identifiers (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_update` +( + uUserID character varying(255) NOT NULL, + uDBID bigint NOT NULL, + created timestamp NOT NULL DEFAULT NOW(), + PRIMARY KEY (uUserID, uDBID), + FOREIGN KEY (uDBID) REFERENCES mdb_databases (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_access` +( + aUserID character varying(255) NOT NULL, + aDBID bigint REFERENCES mdb_databases (id), + attime TIMESTAMP, + download BOOLEAN, + created timestamp NOT NULL DEFAULT NOW(), + PRIMARY KEY (aUserID, aDBID) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_have_access` +( + user_id character varying(36) NOT NULL, + database_id bigint REFERENCES mdb_databases (id), + access_type ENUM ('READ', 'WRITE_OWN', 'WRITE_ALL') NOT NULL, + created timestamp NOT NULL DEFAULT NOW(), + PRIMARY KEY (user_id, database_id), + FOREIGN KEY (user_id) REFERENCES mdb_users (id) +) WITH SYSTEM VERSIONING; + +COMMIT; +BEGIN; + +INSERT INTO `mdb_licenses` (identifier, uri, description) +VALUES ('CC0-1.0', 'https://creativecommons.org/publicdomain/zero/1.0/legalcode', + 'CC0 waives copyright interest in a work you''ve created and dedicates it to the world-wide public domain. Use CC0 to opt out of copyright entirely and ensure your work has the widest reach.'), + ('CC-BY-4.0', 'https://creativecommons.org/licenses/by/4.0/legalcode', + 'The Creative Commons Attribution license allows re-distribution and re-use of a licensed work on the condition that the creator is appropriately credited.'); + +INSERT INTO `mdb_images` (name, registry, version, default_port, dialect, driver_class, jdbc_method) +VALUES ('mariadb', 'docker.io', '11.1.3', 3306, 'org.hibernate.dialect.MariaDBDialect', 'org.mariadb.jdbc.Driver', + 'mariadb'); + +INSERT INTO `mdb_images_date` (iid, database_format, unix_format, example, has_time) +VALUES (1, '%Y-%c-%d %H:%i:%S.%f', 'yyyy-MM-dd HH:mm:ss.SSSSSS', '2022-01-30 13:44:25.499', true), + (1, '%Y-%c-%d %H:%i:%S', 'yyyy-MM-dd HH:mm:ss', '2022-01-30 13:44:25', true), + (1, '%Y-%c-%d', 'yyyy-MM-dd', '2022-01-30', false), + (1, '%H:%i:%S', 'HH:mm:ss', '13:44:25', true), + (1, '%d.%c.%Y', 'dd.MM.yyyy', '30.01.2022', false); + +INSERT INTO `mdb_ontologies` (prefix, uri, uri_pattern, sparql_endpoint, rdf_path) +VALUES ('om', 'http://www.ontology-of-units-of-measure.org/resource/om-2/', + 'http://www.ontology-of-units-of-measure.org/resource/om-2/.*', null, 'rdf/om-2.0.rdf'), + ('wd', 'http://www.wikidata.org/', 'http://www.wikidata.org/entity/.*', 'https://query.wikidata.org/sparql', + null), + ('mo', 'http://purl.org/ontology/mo/', 'http://purl.org/ontology/mo/.*', null, null), + ('dc', 'http://purl.org/dc/elements/1.1/', null, null, null), + ('xsd', 'http://www.w3.org/2001/XMLSchema#', null, null, null), + ('tl', 'http://purl.org/NET/c4dm/timeline.owl#', null, null, null), + ('foaf', 'http://xmlns.com/foaf/0.1/', null, null, null), + ('schema', 'http://schema.org/', null, null, null), + ('rdf', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', null, null, null), + ('rdfs', 'http://www.w3.org/2000/01/rdf-schema#', null, null, null), + ('owl', 'http://www.w3.org/2002/07/owl#', null, null, null), + ('prov', 'http://www.w3.org/ns/prov#', null, null, null), + ('db', 'http://dbpedia.org', 'http://dbpedia.org/ontology/.*', 'http://dbpedia.org/sparql', null); +COMMIT; diff --git a/.docker/config/2_setup-data.sql b/.docker/config/2_setup-data.sql new file mode 100644 index 0000000000000000000000000000000000000000..e806e1e181dbdcc3f0e4e29f837bffac7123317c --- /dev/null +++ b/.docker/config/2_setup-data.sql @@ -0,0 +1,8 @@ +BEGIN; + +INSERT INTO `mdb_containers` (name, internal_name, image_id, host, port, ui_host, ui_port, sidecar_host, sidecar_port, + privileged_username, privileged_password) +VALUES ('mariadb:11.1.3-debian-11-r6', 'mariadb_11_1_3', 1, 'data-db', 3306, 'localhost', 3306, 'data-db-sidecar', 8080, + 'root', 'dbrepo'); + +COMMIT; diff --git a/.docker/config/advanced.config b/.docker/config/advanced.config new file mode 100644 index 0000000000000000000000000000000000000000..4445ea601954e5c93c32edeba1638135c5af5e59 --- /dev/null +++ b/.docker/config/advanced.config @@ -0,0 +1,17 @@ +[ + { + rabbitmq_auth_backend_ldap, + [ + { + tag_queries, [ + { + administrator, {in_group_nested, "cn=system,ou=users,dc=dbrepo,dc=at", "member"} + }, + { + management, {constant, true} + } + ] + } + ] + } +]. \ No newline at end of file diff --git a/.docker/config/dbrepo.conf b/.docker/config/dbrepo.conf new file mode 100644 index 0000000000000000000000000000000000000000..8ac239d464398ec381b98d71c91192ea6ba061ab --- /dev/null +++ b/.docker/config/dbrepo.conf @@ -0,0 +1,167 @@ +client_max_body_size 20G; + +resolver 127.0.0.11 valid=30s; # docker dns + +upstream auth { + server auth-service:8080; +} + +upstream broker { + server broker-service:15672; +} + +upstream analyse { + server analyse-service:8080; +} + +upstream data { + server data-service:8080; +} + +upstream metadata { + server metadata-service:8080; +} + +upstream search { + server search-service:8080; +} + +upstream ui { + server ui:3000; +} + +upstream upload { + server upload-service:8080; +} + +server { + listen 80 default_server; + server_name _; + + location /admin/broker { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://broker; + proxy_read_timeout 90; + } + + location /api/search { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://search; + proxy_read_timeout 90; + } + + location /api/broker { + rewrite /api/broker/(.*) /admin/broker/api/$1 break; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://broker; + proxy_read_timeout 90; + } + + location /api/upload { +# allow 128.130.0.0/16; +# deny all; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Host $host; + proxy_pass http://upload; + proxy_read_timeout 90; + # Disable request and response buffering + proxy_request_buffering off; + proxy_buffering off; + proxy_http_version 1.1; + } + + location /api/analyse { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://analyse; + proxy_read_timeout 90; + } + + location /api/auth { + rewrite /api/auth/(.*) /$1 break; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://auth; + proxy_read_timeout 90; + } + + location ~ /api/database/([0-9]+)/table/([0-9]+)/(data|history|export|statistic) { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://data; + proxy_read_timeout 90; + } + + location ~ /api/database/([0-9]+)/view/([0-9]+)/data { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://data; + proxy_read_timeout 90; + } + + location ~ /api/database/([0-9]+)/view { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://metadata; + proxy_read_timeout 90; + } + + location ~ /api/database/([0-9]+)/subset { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://data; + proxy_read_timeout 600; + } + + location ~ /api/(database|concept|container|identifier|image|message|license|oai|ontology|unit|user) { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://metadata; + proxy_read_timeout 90; + } + + location ~ /pid/([0-9]+) { + rewrite /pid/(.*) /api/identifier/$1 break; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://metadata; + proxy_read_timeout 90; + } + + location / { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://ui; + proxy_read_timeout 90; + } +} diff --git a/.docker/config/definitions.json b/.docker/config/definitions.json new file mode 100644 index 0000000000000000000000000000000000000000..a3b70c989de5cb287e37588860e664afb6b7d6ec --- /dev/null +++ b/.docker/config/definitions.json @@ -0,0 +1,52 @@ +{ + "bindings": [ + { + "arguments": {}, + "destination": "dbrepo", + "destination_type": "queue", + "routing_key": "dbrepo.#", + "source": "dbrepo", + "vhost": "dbrepo" + } + ], + "exchanges": [ + { + "arguments": {}, + "auto_delete": false, + "durable": true, + "name": "dbrepo", + "type": "topic", + "vhost": "dbrepo" + } + ], + "global_parameters": [], + "parameters": [], + "permissions": [], + "policies": [], + "queues": [ + { + "arguments": { + "x-queue-type": "quorum" + }, + "auto_delete": false, + "durable": true, + "name": "dbrepo", + "type": "quorum", + "vhost": "dbrepo" + } + ], + "rabbit_version": "3.10.25", + "rabbitmq_version": "3.10.25", + "topic_permissions": [], + "users": [], + "vhosts": [ + { + "limits": [], + "metadata": { + "description": "Default virtual host", + "tags": [] + }, + "name": "dbrepo" + } + ] +} \ No newline at end of file diff --git a/.docker/config/enabled_plugins b/.docker/config/enabled_plugins new file mode 100644 index 0000000000000000000000000000000000000000..95f1c0014dd4ee232580adea29176756a25274ed --- /dev/null +++ b/.docker/config/enabled_plugins @@ -0,0 +1 @@ +[rabbitmq_prometheus,rabbitmq_auth_backend_ldap,rabbitmq_auth_mechanism_ssl,rabbitmq_management]. \ No newline at end of file diff --git a/.docker/config/rabbitmq.conf b/.docker/config/rabbitmq.conf new file mode 100644 index 0000000000000000000000000000000000000000..ff592bb3ecd4b003d180dbb44d8bd9acc5a70394 --- /dev/null +++ b/.docker/config/rabbitmq.conf @@ -0,0 +1,30 @@ +# user +default_vhost = dbrepo +default_user_tags.administrator = false + +# enable http outside localhost +listeners.tcp.1 = 0.0.0.0:5672 + +# management prefix (https://www.rabbitmq.com/management.html#path-prefix) +management.path_prefix = /admin/broker +management.load_definitions = /app/definitions.json + +# logging +log.console = true +log.console.level = warning +auth_ldap.log = true + +# Obviously your authentication server cannot vouch for itself, so you'll need another backend with at least one user in +# it. You should probably use the internal database +auth_backends.1.authn = ldap +auth_backends.1.authz = ldap +auth_backends.2 = internal + +# LDAP +auth_ldap.servers.1 = identity-service +auth_ldap.port = 1389 +auth_ldap.user_dn_pattern = ${username} +auth_ldap.dn_lookup_base = dc=dbrepo,dc=at +auth_ldap.dn_lookup_attribute = uid +auth_ldap.dn_lookup_bind.user_dn = cn=admin,dc=dbrepo,dc=at +auth_ldap.dn_lookup_bind.password = admin diff --git a/.docker/config/s3_config.json b/.docker/config/s3_config.json new file mode 100644 index 0000000000000000000000000000000000000000..f270753cdc96278a039e483966ea864a16781cfe --- /dev/null +++ b/.docker/config/s3_config.json @@ -0,0 +1,20 @@ +{ + "identities": [ + { + "name": "admin", + "credentials": [ + { + "accessKey": "seaweedfsadmin", + "secretKey": "seaweedfsadmin" + } + ], + "actions": [ + "Read", + "Write", + "List", + "Tagging", + "Admin" + ] + } + ] +} \ No newline at end of file diff --git a/.docker/dist.tar.gz b/.docker/dist.tar.gz index 13ab9159e781ba44af31da5ca522d76e0b5edcd8..1cfc5411b1b8082ebb9fa45c9f8af3bc1504671d 100644 Binary files a/.docker/dist.tar.gz and b/.docker/dist.tar.gz differ diff --git a/.docker/docker-compose.yml b/.docker/docker-compose.yml index 54b7b8edbbe0652379fc74c5a81a58ada8a57e3a..8c01cf618d18d247c66875257579e9088413ac16 100644 --- a/.docker/docker-compose.yml +++ b/.docker/docker-compose.yml @@ -75,7 +75,7 @@ services: restart: "no" container_name: dbrepo-auth-service hostname: auth-service - image: registry.datalab.tuwien.ac.at/dbrepo/auth-service:1.4.5 + image: registry.datalab.tuwien.ac.at/dbrepo/auth-service:1.4.6 healthcheck: test: curl -sSL 'http://0.0.0.0:8080/realms/dbrepo' | grep "dbrepo" || exit 1 interval: 15s @@ -99,7 +99,7 @@ services: restart: "no" container_name: dbrepo-metadata-service hostname: metadata-service - image: registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.4.5 + image: registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.4.6 volumes: - "${SHARED_VOLUME:-/tmp}:/tmp" environment: @@ -162,7 +162,7 @@ services: restart: "no" container_name: dbrepo-analyse-service hostname: analyse-service - image: registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.4.5 + image: registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.4.6 environment: AUTH_SERVICE_CLIENT: ${AUTH_SERVICE_CLIENT:-dbrepo-client} AUTH_SERVICE_CLIENT_SECRET: ${AUTH_SERVICE_CLIENT:-MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG} @@ -212,7 +212,7 @@ services: restart: "no" container_name: dbrepo-search-db hostname: search-db - image: registry.datalab.tuwien.ac.at/dbrepo/search-db:1.4.5 + image: registry.datalab.tuwien.ac.at/dbrepo/search-db:1.4.6 healthcheck: test: curl -sSL localhost:9200/_plugins/_security/health | jq .status | grep UP interval: 10s @@ -236,7 +236,7 @@ services: restart: "no" container_name: dbrepo-search-service hostname: search-service - image: registry.datalab.tuwien.ac.at/dbrepo/search-service:1.4.5 + image: registry.datalab.tuwien.ac.at/dbrepo/search-service:1.4.6 environment: AUTH_SERVICE_CLIENT: ${AUTH_SERVICE_CLIENT:-dbrepo-client} AUTH_SERVICE_CLIENT_SECRET: ${AUTH_SERVICE_CLIENT_SECRET:-MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG} @@ -253,7 +253,7 @@ services: restart: "no" container_name: dbrepo-data-db-sidecar hostname: data-db-sidecar - image: registry.datalab.tuwien.ac.at/dbrepo/data-db-sidecar:1.4.5 + image: registry.datalab.tuwien.ac.at/dbrepo/data-db-sidecar:1.4.6 environment: S3_ACCESS_KEY_ID: "${S3_ACCESS_KEY_ID:-seaweedfsadmin}" S3_BUCKET: "${S3_BUCKET:-dbrepo}" @@ -274,7 +274,7 @@ services: restart: "no" container_name: dbrepo-ui hostname: ui - image: registry.datalab.tuwien.ac.at/dbrepo/ui:1.4.5 + image: registry.datalab.tuwien.ac.at/dbrepo/ui:1.4.6 environment: NUXT_PUBLIC_API_CLIENT: "${BASE_URL:-http://localhost}" NUXT_PUBLIC_API_SERVER: "${BASE_URL:-http://localhost}" @@ -343,7 +343,7 @@ services: restart: "no" container_name: dbrepo-search-service-init hostname: search-service-init - image: registry.datalab.tuwien.ac.at/dbrepo/search-service-init:1.4.5 + image: registry.datalab.tuwien.ac.at/dbrepo/search-service-init:1.4.6 environment: METADATA_SERVICE_ENDPOINT: ${METADATA_SERVICE_ENDPOINT:-http://metadata-service:8080} OPENSEARCH_HOST: ${OPENSEARCH_HOST:-search-db} @@ -353,6 +353,8 @@ services: depends_on: dbrepo-search-db: condition: service_healthy + dbrepo-metadata-service: + condition: service_healthy logging: driver: json-file @@ -379,7 +381,7 @@ services: restart: "no" container_name: dbrepo-storage-service-init hostname: storage-service-init - image: registry.datalab.tuwien.ac.at/dbrepo/storage-service-init:1.4.5 + image: registry.datalab.tuwien.ac.at/dbrepo/storage-service-init:1.4.6 environment: WEED_CLUSTER_SW_MASTER: "${STORAGE_SERVICE_MASTER_ENDPOINT:-storage-service:9333}" S3_BUCKET: "${S3_BUCKET:-dbrepo}" @@ -419,7 +421,7 @@ services: restart: "no" container_name: dbrepo-data-service hostname: data-service - image: registry.datalab.tuwien.ac.at/dbrepo/data-service:1.4.5 + image: registry.datalab.tuwien.ac.at/dbrepo/data-service:1.4.6 volumes: - "${SHARED_VOLUME:-/tmp}:/tmp" environment: diff --git a/.docs/.swagger/api.yaml b/.docs/.swagger/api.yaml index c5c2b5ee8dccd425d7fb5bf570c7f3379b52e210..1495e398e358d0a78bc7306b71726bd2e092efe4 100644 --- a/.docs/.swagger/api.yaml +++ b/.docs/.swagger/api.yaml @@ -1021,7 +1021,7 @@ paths: summary: Create subset description: >- Creates a subset in the query store of the data database. Requires role - `execute-query` + `execute-query` for private databases. operationId: create parameters: - name: databaseId @@ -1223,7 +1223,7 @@ paths: Gets data from table with id as downloadable file. For tables in private databases, the user needs to have at least *READ* access to the associated database. - operationId: exportData + operationId: exportDataset parameters: - name: databaseId in: path @@ -1431,6 +1431,12 @@ paths: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' + '423': + description: Database quota exceeded + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' '502': description: Connection to search service failed content: @@ -3030,6 +3036,12 @@ paths: summary: List users description: Lists users known to the metadata database. operationId: findAll + parameters: + - name: username + in: query + required: false + schema: + type: string responses: '200': description: List users @@ -5952,12 +5964,14 @@ components: $ref: '#/components/schemas/PrimaryKeyDto' ContainerDto: required: + - count - created - host - id - image - internal_name - name + - quota - sidecar_host - sidecar_port type: object @@ -5975,6 +5989,14 @@ components: format: int32 image: $ref: '#/components/schemas/ImageDto' + quota: + type: integer + format: int64 + example: 50 + count: + type: integer + format: int64 + example: 10 created: type: string format: date-time @@ -6169,6 +6191,7 @@ components: example: '2021-03-12T15:26:21.000Z' ImageDto: required: + - default - default_port - dialect - driver_class @@ -6204,6 +6227,9 @@ components: jdbc_method: type: string example: mariadb + default: + type: boolean + example: false default_port: type: integer format: int32 @@ -7742,6 +7768,7 @@ components: - default_port - dialect - driver_class + - is_default - jdbc_method - name - registry @@ -7758,6 +7785,9 @@ components: type: string dialect: type: string + is_default: + type: boolean + example: false driver_class: type: string jdbc_method: @@ -8284,6 +8314,7 @@ components: - name - privileged_password - privileged_username + - quota - sidecar_host - sidecar_port type: object @@ -8298,6 +8329,10 @@ components: type: integer description: Port of container format: int32 + quota: + type: integer + format: int64 + example: 50 image_id: type: integer description: Image ID @@ -8374,10 +8409,10 @@ components: type: string resumptionToken: type: string - untilDate: + fromDate: type: string format: date-time - fromDate: + untilDate: type: string format: date-time parametersString: @@ -8417,6 +8452,7 @@ components: example: '2021-03-12T15:26:21.000Z' ImageBriefDto: required: + - default - id - jdbc_method - name @@ -8435,6 +8471,9 @@ components: jdbc_method: type: string example: mariadb + default: + type: boolean + example: false LdCreatorDto: required: - '@type' @@ -8528,13 +8567,14 @@ components: example: 1 ContainerBriefDto: required: + - count - created - hash - id - image - internal_name - name - - running + - quota type: object properties: id: @@ -8548,9 +8588,14 @@ components: example: Air Quality image: $ref: '#/components/schemas/ImageBriefDto' - running: - type: boolean - example: true + quota: + type: integer + format: int32 + example: 50 + count: + type: integer + format: int32 + example: 10 created: type: string format: date-time @@ -8603,6 +8648,9 @@ components: uiPort: type: integer format: int32 + quota: + type: integer + format: int32 uiAdditionalFlags: type: string databases: @@ -8642,6 +8690,8 @@ components: defaultPort: type: integer format: int32 + isDefault: + type: boolean dateFormats: type: array items: diff --git a/.docs/api/ui.md b/.docs/api/ui.md index 4ac5c7bad871284cc322bf7be0c8585942f63ea5..3e53ab2c376d6cde6c582e352171ad0836882864 100644 --- a/.docs/api/ui.md +++ b/.docs/api/ui.md @@ -6,7 +6,7 @@ author: Martin Weise !!! debug "Debug Information" - Image: [`registry.datalab.tuwien.ac.at/dbrepo/ui:1.4.5`](https://hub.docker.com/r/dbrepo/ui) + Image: [`registry.datalab.tuwien.ac.at/dbrepo/ui:1.4.6`](https://hub.docker.com/r/dbrepo/ui) * Ports: 3000/tcp @@ -20,26 +20,67 @@ image as well, in this example we want to mount a custom logo `my_logo.png` into <figcaption>Figure 1: Architecture of the UI microservice</figcaption> </figure> -Text values like the version :material-numeric-2-circle-outline: and title :material-numeric-3-circle-outline: can be -configured as well via the Nuxt runtime configuration through single environment variables or `.env` files - -```yaml title=".env" -NUXT_PUBLIC_TITLE="My overriden title" -NUXT_PUBLIC_LOGO="/app/.output/public/my_logo.png" -... -``` - -To work, you need to mount the `my_logo.png` file into the `dbrepo-ui` container via the `docker-compose.yml` file (or -if you use a Kubernetes deployment via ConfigMap and Volumes). - -```yaml title="docker-compose.yml" -services: - dbrepo-ui: - image: registry.datalab.tuwien.ac.at/dbrepo/ui:1.4.5 - volumes: - - ./my_logo.png:/app/.output/public/my_logo.png - ... -``` +=== "Docker Compose" + + Text values like the version :material-numeric-2-circle-outline: and title :material-numeric-3-circle-outline: can be + configured as well via the Nuxt runtime configuration through single environment variables or `.env` files. + + ```yaml title=".env" + NUXT_PUBLIC_TITLE="My overriden title" + NUXT_PUBLIC_LOGO="/my_logo.png" + NUXT_PUBLIC_ICON="/favicon.ico" + ... + ``` + + To work, you need to mount the `my_logo.png` file into the `dbrepo-ui` container via the `docker-compose.yml` file. + + ```yaml title="docker-compose.yml" + services: + dbrepo-ui: + image: registry.datalab.tuwien.ac.at/dbrepo/ui:1.4.6 + volumes: + - ./my_logo.png:/app/.output/public/my_logo.png + - ./favicon.ico:/app/.output/public/favicon.ico + environment: + ... + ... + ``` + + If you want to override more environment variables, extend the dictionary in `environment:` + +=== "Kubernetes" + + Text values like the version :material-numeric-2-circle-outline: and title :material-numeric-3-circle-outline: can be + configured as well via the Nuxt runtime configuration through setting the variables in the `values.yaml` file. + + ```yaml title="values.yaml" + ui: + public: + logo: "/my_logo.png" + icon: "/favicon.ico" + extraVolumes: + - name: images-map + configMap: + name: ui-config + extraVolumeMounts: + - name: images-map + mountPath: /static/ + ``` + + To work, you need to mount the `my_logo.png` file into the dbrepo-ui deployment via a ConfigMap and Volumes. For this, + encode the files in base64 with `cat my_logo.png | base64`. + + ```yaml title="dbrepo-ui-custom.yaml" + apiVersion: v1 + kind: ConfigMap + metadata: + name: ui-config + binaryData: + my_logo.png: | + <base64> + favicon.ico: | + <base64> + ``` ### Architecture diff --git a/.docs/images/architecture-docker-compose.svg b/.docs/images/architecture-docker-compose.svg index f1f69f41015048f35566e4e30feecd15d40cecf0..090ac2def7a18149a6f58cfde600bc153c5b2e2e 100644 --- a/.docs/images/architecture-docker-compose.svg +++ b/.docs/images/architecture-docker-compose.svg @@ -1,3 +1,3 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="890px" height="559px" viewBox="-0.5 -0.5 890 559" style="background-color: rgb(255, 255, 255);"><defs/><rect fill="#ffffff" width="100%" height="100%" x="0" y="0"/><g><g data-cell-id="0"><g data-cell-id="1"><g data-cell-id="45LT9Xtm5jvL1Omwo4Uv-6"><g><path d="M 418.14 90.37 L 418.53 108.53 L 417.78 125.64" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 418.02 85.12 L 421.67 92.04 L 418.14 90.37 L 414.68 92.19 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 417.55 130.88 L 414.36 123.74 L 417.78 125.64 L 421.35 124.04 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/></g></g><g data-cell-id="S3Av5TdVFqS_SrXukbwN-2"><g><ellipse cx="418.5" cy="7.5" rx="7.5" ry="7.5" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><path d="M 418.5 15 L 418.5 40 M 418.5 20 L 403.5 20 M 418.5 20 L 433.5 20 M 418.5 40 L 403.5 60 M 418.5 40 L 433.5 60" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 67px; margin-left: 419px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">Researcher</div></div></div></foreignObject><image x="388" y="67.5" width="62" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="V1Wl26Vbpgnno5Lb-wtg-39"><g><path d="M 346.13 152 L 316.37 152" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 351.38 152 L 344.38 155.5 L 346.13 152 L 344.38 148.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 311.12 152 L 318.12 148.5 L 316.37 152 L 318.12 155.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 152px; margin-left: 331px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 9px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">HTTP</div></div></div></foreignObject><image x="319" y="147" width="24" height="13.25" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAAA1CAYAAAC+2+58AAAAAXNSR0IArs4c6QAAA2NJREFUeF7tm81LMlEUxo8pVAs1KltI4KYWSRlBELg1WwRCENUf0Dpo3d6WQdSynRCBQgXtRJdu2hSulFYtRESxMBT7wLiXt3n7mGbm3rnqC+/jTuec507Pb849d+5Mjk6n0yF8+uaAAwD65j0fGAD66z8A9Nl/AACAfjvQ5/G1HvD09ERut1s7nfPzc1pbWxM6vaurK4rFYlpOvV6nkZER/v3m5oYWFhaE9MyC8/k8vb6+dkV3dnaWD//dF6Nzcjqd/O/1+/20tLTE/VtdXSWHw/FrGgDoWMPAygDQc3lubo4SiQTNz8/rQugZgEKhQOvr64YX9f39PTUaDR7j9XppcnLSMP7i4oLe3t66ojs1NaVbATMzMzQ6Oqp7Xq1Wi8rlMpVKpS/Hh4aGKJPJUDgc/pHXMwBm0wk7zkr28vKSh25tbdHZ2ZmVNNMYO7oyUzO7kI6Pj+ng4IBfIOwzMTFBd3d3X6Z59jsAmOCTAfAhmUwmaXNzUxshHo/T3t7elxEBoIsAmPTKygql02k+yuLiIl1fXwOAyNRmpwKY02wq2tnZ4aazVdLz8zMNDAxoEFABXa6A70vzarVKY2NjAGDauf8E2K0Atqj4fD/1+PhIHo8HAHoF4PDwkHZ3d/lww8PD1Gw20QN62QMikQhls1lu+vLystaQPyj82gPYLfXg4KDVC4XHtdttenh40HI+b0VYEbKzXjfSt6NrZwpKpVK0sbGhndrJyQltb29bqwArhpnF/K8AarUaHR0d0f7+Pr28vHCbgsEg3d7eksvlAgA7U1AoFCKfz6d77bElZqVSoWKxSJ+f9I6Pj1Mul6Pp6ekfeViGCi5Dzar++3G2/3N6ekqBQEA3FQAUAmDbzmwTkW1HM+PZNkQ0GjUcAQAEAcg8JzEaAgAA4K8DdpaL/+Iy1Eq/QAWgAlAB/NVEO3d8HxYaPZS3Uo6Ygrr4VgQA6DuAHoAegB6AHmBQBSp6o6UbMStzNGLUO4DX09V7KqQIAEJ2qQ8GAPWeCikCgJBd6oMBQL2nQooAIGSX+mAAUO+pkCIACNmlPhgA1HsqpAgAQnapDwYA9Z4KKf7+73tCMgiWdQAAZJ1TlAcAioyUlQEAWecU5QGAIiNlZQBA1jlFeQCgyEhZGQCQdU5RHgAoMlJW5h0DqhjC399QigAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="V1Wl26Vbpgnno5Lb-wtg-40"><g><path d="M 385 172 L 385 200.06 L 243 200.06 L 243 221.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 243 226.88 L 239.5 219.88 L 243 221.63 L 246.5 219.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g></g><g data-cell-id="V1Wl26Vbpgnno5Lb-wtg-41"><g><path d="M 450 172 L 450.06 200.06 L 595 200.06 L 595 221.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 595 226.88 L 591.5 219.88 L 595 221.63 L 598.5 219.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g></g><g data-cell-id="V1Wl26Vbpgnno5Lb-wtg-42"><g><path d="M 417.5 178.37 L 417.5 221.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 417.5 173.12 L 421 180.12 L 417.5 178.37 L 414 180.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 417.5 226.88 L 414 219.88 L 417.5 221.63 L 421 219.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 200px; margin-left: 418px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 9px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">HTTP</div></div></div></foreignObject><image x="406" y="195" width="24" height="13.25" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAAA1CAYAAAC+2+58AAAAAXNSR0IArs4c6QAAA2NJREFUeF7tm81LMlEUxo8pVAs1KltI4KYWSRlBELg1WwRCENUf0Dpo3d6WQdSynRCBQgXtRJdu2hSulFYtRESxMBT7wLiXt3n7mGbm3rnqC+/jTuec507Pb849d+5Mjk6n0yF8+uaAAwD65j0fGAD66z8A9Nl/AACAfjvQ5/G1HvD09ERut1s7nfPzc1pbWxM6vaurK4rFYlpOvV6nkZER/v3m5oYWFhaE9MyC8/k8vb6+dkV3dnaWD//dF6Nzcjqd/O/1+/20tLTE/VtdXSWHw/FrGgDoWMPAygDQc3lubo4SiQTNz8/rQugZgEKhQOvr64YX9f39PTUaDR7j9XppcnLSMP7i4oLe3t66ojs1NaVbATMzMzQ6Oqp7Xq1Wi8rlMpVKpS/Hh4aGKJPJUDgc/pHXMwBm0wk7zkr28vKSh25tbdHZ2ZmVNNMYO7oyUzO7kI6Pj+ng4IBfIOwzMTFBd3d3X6Z59jsAmOCTAfAhmUwmaXNzUxshHo/T3t7elxEBoIsAmPTKygql02k+yuLiIl1fXwOAyNRmpwKY02wq2tnZ4aazVdLz8zMNDAxoEFABXa6A70vzarVKY2NjAGDauf8E2K0Atqj4fD/1+PhIHo8HAHoF4PDwkHZ3d/lww8PD1Gw20QN62QMikQhls1lu+vLystaQPyj82gPYLfXg4KDVC4XHtdttenh40HI+b0VYEbKzXjfSt6NrZwpKpVK0sbGhndrJyQltb29bqwArhpnF/K8AarUaHR0d0f7+Pr28vHCbgsEg3d7eksvlAgA7U1AoFCKfz6d77bElZqVSoWKxSJ+f9I6Pj1Mul6Pp6ekfeViGCi5Dzar++3G2/3N6ekqBQEA3FQAUAmDbzmwTkW1HM+PZNkQ0GjUcAQAEAcg8JzEaAgAA4K8DdpaL/+Iy1Eq/QAWgAlAB/NVEO3d8HxYaPZS3Uo6Ygrr4VgQA6DuAHoAegB6AHmBQBSp6o6UbMStzNGLUO4DX09V7KqQIAEJ2qQ8GAPWeCikCgJBd6oMBQL2nQooAIGSX+mAAUO+pkCIACNmlPhgA1HsqpAgAQnapDwYA9Z4KKf7+73tCMgiWdQAAZJ1TlAcAioyUlQEAWecU5QGAIiNlZQBA1jlFeQCgyEhZGQCQdU5RHgAoMlJW5h0DqhjC399QigAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="V1Wl26Vbpgnno5Lb-wtg-43"><g><path d="M 385 178.37 L 385 200.06 L 332.06 200.06 L 332.06 294.06 L 245 294.06 L 245 317.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 385 173.12 L 388.5 180.12 L 385 178.37 L 381.5 180.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 245 322.88 L 241.5 315.88 L 245 317.63 L 248.5 315.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g data-cell-id="YJRAzF6yD4Hh-bAvO1PB-19"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 201px; margin-left: 361px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 9px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">HTTP</div></div></div></foreignObject><image x="349" y="196" width="24" height="13.25" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAAA1CAYAAAC+2+58AAAAAXNSR0IArs4c6QAAA2NJREFUeF7tm81LMlEUxo8pVAs1KltI4KYWSRlBELg1WwRCENUf0Dpo3d6WQdSynRCBQgXtRJdu2hSulFYtRESxMBT7wLiXt3n7mGbm3rnqC+/jTuec507Pb849d+5Mjk6n0yF8+uaAAwD65j0fGAD66z8A9Nl/AACAfjvQ5/G1HvD09ERut1s7nfPzc1pbWxM6vaurK4rFYlpOvV6nkZER/v3m5oYWFhaE9MyC8/k8vb6+dkV3dnaWD//dF6Nzcjqd/O/1+/20tLTE/VtdXSWHw/FrGgDoWMPAygDQc3lubo4SiQTNz8/rQugZgEKhQOvr64YX9f39PTUaDR7j9XppcnLSMP7i4oLe3t66ojs1NaVbATMzMzQ6Oqp7Xq1Wi8rlMpVKpS/Hh4aGKJPJUDgc/pHXMwBm0wk7zkr28vKSh25tbdHZ2ZmVNNMYO7oyUzO7kI6Pj+ng4IBfIOwzMTFBd3d3X6Z59jsAmOCTAfAhmUwmaXNzUxshHo/T3t7elxEBoIsAmPTKygql02k+yuLiIl1fXwOAyNRmpwKY02wq2tnZ4aazVdLz8zMNDAxoEFABXa6A70vzarVKY2NjAGDauf8E2K0Atqj4fD/1+PhIHo8HAHoF4PDwkHZ3d/lww8PD1Gw20QN62QMikQhls1lu+vLystaQPyj82gPYLfXg4KDVC4XHtdttenh40HI+b0VYEbKzXjfSt6NrZwpKpVK0sbGhndrJyQltb29bqwArhpnF/K8AarUaHR0d0f7+Pr28vHCbgsEg3d7eksvlAgA7U1AoFCKfz6d77bElZqVSoWKxSJ+f9I6Pj1Mul6Pp6ekfeViGCi5Dzar++3G2/3N6ekqBQEA3FQAUAmDbzmwTkW1HM+PZNkQ0GjUcAQAEAcg8JzEaAgAA4K8DdpaL/+Iy1Eq/QAWgAlAB/NVEO3d8HxYaPZS3Uo6Ygrr4VgQA6DuAHoAegB6AHmBQBSp6o6UbMStzNGLUO4DX09V7KqQIAEJ2qQ8GAPWeCikCgJBd6oMBQL2nQooAIGSX+mAAUO+pkCIACNmlPhgA1HsqpAgAQnapDwYA9Z4KKf7+73tCMgiWdQAAZJ1TlAcAioyUlQEAWecU5QGAIiNlZQBA1jlFeQCgyEhZGQCQdU5RHgAoMlJW5h0DqhjC399QigAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="V1Wl26Vbpgnno5Lb-wtg-44"><g><path d="M 488.87 152 L 523.63 152" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 483.62 152 L 490.62 148.5 L 488.87 152 L 490.62 155.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 528.88 152 L 521.88 155.5 L 523.63 152 L 521.88 148.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 152px; margin-left: 506px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 9px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">S3</div></div></div></foreignObject><image x="500.5" y="147" width="11" height="13.25" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="V1Wl26Vbpgnno5Lb-wtg-45"><g><path d="M 450.01 178.37 L 450.06 200.06 L 508.06 200.06 L 508.06 294.06 L 595 294.06 L 595 317.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 450 173.12 L 453.52 180.11 L 450.01 178.37 L 446.52 180.13 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 595 322.88 L 591.5 315.88 L 595 317.63 L 598.5 315.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g data-cell-id="YJRAzF6yD4Hh-bAvO1PB-18"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 200px; margin-left: 461px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 9px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">HTTP</div></div></div></foreignObject><image x="449" y="195" width="24" height="13.25" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAAA1CAYAAAC+2+58AAAAAXNSR0IArs4c6QAAA2NJREFUeF7tm81LMlEUxo8pVAs1KltI4KYWSRlBELg1WwRCENUf0Dpo3d6WQdSynRCBQgXtRJdu2hSulFYtRESxMBT7wLiXt3n7mGbm3rnqC+/jTuec507Pb849d+5Mjk6n0yF8+uaAAwD65j0fGAD66z8A9Nl/AACAfjvQ5/G1HvD09ERut1s7nfPzc1pbWxM6vaurK4rFYlpOvV6nkZER/v3m5oYWFhaE9MyC8/k8vb6+dkV3dnaWD//dF6Nzcjqd/O/1+/20tLTE/VtdXSWHw/FrGgDoWMPAygDQc3lubo4SiQTNz8/rQugZgEKhQOvr64YX9f39PTUaDR7j9XppcnLSMP7i4oLe3t66ojs1NaVbATMzMzQ6Oqp7Xq1Wi8rlMpVKpS/Hh4aGKJPJUDgc/pHXMwBm0wk7zkr28vKSh25tbdHZ2ZmVNNMYO7oyUzO7kI6Pj+ng4IBfIOwzMTFBd3d3X6Z59jsAmOCTAfAhmUwmaXNzUxshHo/T3t7elxEBoIsAmPTKygql02k+yuLiIl1fXwOAyNRmpwKY02wq2tnZ4aazVdLz8zMNDAxoEFABXa6A70vzarVKY2NjAGDauf8E2K0Atqj4fD/1+PhIHo8HAHoF4PDwkHZ3d/lww8PD1Gw20QN62QMikQhls1lu+vLystaQPyj82gPYLfXg4KDVC4XHtdttenh40HI+b0VYEbKzXjfSt6NrZwpKpVK0sbGhndrJyQltb29bqwArhpnF/K8AarUaHR0d0f7+Pr28vHCbgsEg3d7eksvlAgA7U1AoFCKfz6d77bElZqVSoWKxSJ+f9I6Pj1Mul6Pp6ekfeViGCi5Dzar++3G2/3N6ekqBQEA3FQAUAmDbzmwTkW1HM+PZNkQ0GjUcAQAEAcg8JzEaAgAA4K8DdpaL/+Iy1Eq/QAWgAlAB/NVEO3d8HxYaPZS3Uo6Ygrr4VgQA6DuAHoAegB6AHmBQBSp6o6UbMStzNGLUO4DX09V7KqQIAEJ2qQ8GAPWeCikCgJBd6oMBQL2nQooAIGSX+mAAUO+pkCIACNmlPhgA1HsqpAgAQnapDwYA9Z4KKf7+73tCMgiWdQAAZJ1TlAcAioyUlQEAWecU5QGAIiNlZQBA1jlFeQCgyEhZGQCQdU5RHgAoMlJW5h0DqhjC399QigAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="CohMdi7D_fRk0dSxzjYi-1"><g><rect x="352.5" y="132" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 152px; margin-left: 354px;"><div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Gateway Service<br />(NGINX)</div></div></div></foreignObject><image x="354" y="138" width="128" height="32" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAACACAYAAAB9V9ELAAAAAXNSR0IArs4c6QAAIABJREFUeF7tnQW4PV1VxheCgqCASCvSKChdSitpEBIqgoB0IwoS0q10SflJGKQC0iUh3d0lqYgi3eL8dC9cLCf2njPn3Ln3vOt5/g9898zseGdm73flPpZJhIAQEAJCQAgIgb1D4Fh7N2NNWAgIASEgBISAEDARAL0EQkAICAEhIAT2EAERgD186JqyEBACQkAICAERAL0DQkAICAEhIAT2EAERgD186JqyEBACQkAICAERAL0DQkAICAEhIAT2EAERgD186JqyEBACQkAICAERAL0DQkAICAEhIAT2EAERgD186JqyEBACe4nA683sgmHmtzazh+wlEpr0/yAgArD9F+GHzexsZnZGMzu1mZ3AzPjb18zsq2b2WTP7kJl9xMy+tf3hqAchsCoEjm1mZy7fyE+a2Y+b2fHN7Jvl+/j38m180My+tKqRH77BiAAcvme21RGLAGwH3p8ws2ua2ZXM7MJmdtyKbr5uZv9kZs81sydqsatATJccVgTY4H/bzK5mZr9S+X38l5m9xcyeY2aPMbPPHdbJH+C4RQAOEPw1di0CsOxTObGZ3cnMblK0mLmtf8XMHmpm9yya0Nx2tn3fxc3sl0snz+oIz9u33aHaP/QI/L6Z3atYw+ZO5hsdabhvZ0m7t5l9d24je3ifCMAePvSxKYsALPdCXMrMntRpJ6darkl7f6f1XL6zJnx4wTaXbOppRYujTRb2JyzZuNo6Ughg6v9zM7vhyKy+Y2aQXzb4Hy3ugB8auf55xcrGfZJpBH6sI1/HCZdhdcTVItlTBEQAlnnw1zezR3caO4tclv8ws380s1eY2afN7N+KbxMzKGThLGaGJn2JAVPov3SugUua2XuXGeqirXzSzH66tCgCsCi0R64xNPbbp1lh1sdy9Hdm9kYz+1jS6H/EzM5Uvo9rpwA2b4rvDoubRAgIgUYERAAaAeu5/He7ReqvewIqP9H97e7Fn19jpjxpRw5uZma3K9pP7IogwfOtLC6AjR8C4CICsPm7dFRbOIeZvTURZKxaVzWzdzRMmriBvzAzNFmX75nZhcwM87ZECAiBBgREABrA6rn0583szWZ2vPQbpnE0FkyZrfKzJRAQzSfK483suq2NbfH63zKzp4oAbBHho9M0qWa3CtPBzH9OM/vojClexsxemAg3//2rM9rSLUJgrxEQAZj/+MEOreMCqYlHFU0ezWSu/FQxiZI26IK59DyNGtPc/mvue7CZ/YEIQA1Ue38N7quzBhQe26W/3mgDVMiSuVb6Nn6muNg2aFa3CoH9QkAEYP7zxnz59HQ7Zs5fNLNvz2/2+3fi939psSK8qvN/vsDMnmFmn2pom5oDaEaX7e79hc4dcfoSWIVvlZxq4hMwwb6my8X+m4rUqleXtMbaIZAO+Z8TFzMmAh0vXfLBT1bGyNg+b2bvNLMXFasIOeFDAjkiTcyFOgtkZdQ8CzB6fmr4bsWFUzNXxodm6kJMyDEDNxInctEy53OVOZ+o1IegLgR4EfyJT/zJFbEfzyyBcN4dmRjnrhl0zzVo0rwrLktp1l9OZns2f0jAXDlv91z/pHMhvLsLQn1P+d8PdBk4tcGAvBe/UebKM+CdO4mZMU7eOWpyvKS8c7jfagVrIGNz4Tl4Zszluu/tlmZ2/tIXwY38jsvvd8I9kCUsi3OEvrCsuGChi21vkgVA7RLmwLfyS2Z2CjOjbgNWTuKa+Pb4Dp5SapzMGT/KFO2TGoqLkefCWkX7pH2+rvTxYgUvzoH3/98jAjAfx7wZovGfvSxI81v9wTvxbfJRs5m1CIvLH3YfyR3KYlNzL0WIHtkVI7rjiOtiSQKAdeMeZnadgeDJPGYW5/t3G8kDukWT6OUsvMv/WhYN/w38WDSmhHZvky56eVmIpu4lqvoLaYM7zQBRY9Ohr5+bajT8DjEhcp4A0j759bJRxd/ixlPbFYs5AacxShyfO+6sTQUSFtu9abeBYCnbteCq47v4YzODdE0JVre/KmRjCP/YRv4+qAHy2rLJ36+nM54TGx21DaJAAFqDfgkmhgRF4X0jU8JlLgG4Qnlv6WNK+BYI9nycmdVaQSFFfxpSiqf6+Hh5Jn87daF+H0dABGDeG3K6ErEc72ahZjE+aIExoxX+2syBvKFsfH2kYykCgLYOXmgRrcIixtxYaLKwIFw9/JGFiIVlStBeGFMUNBs0xak0KbQhFnkXNFKsLVmoD0FdhzmCVnqRngWetrAosCB6NgZ/e1jyudf0CcmgwI4L+JKlMjX/mrY/k9JjMeFD/HYpEByKbGGhaxW0Tyw8UwGLWA1IB3bh/2Np453tS2eEAPC+UA2U8bnctZDjlnHeOd2D1gzJjlaROQQASxjjaRWIE4HBUwHQxEoR2BkJYm1fZIAQOA1Rk8xAQARgBmjlpXtEujWz7Xktb34XudY5LYoFGNMcLgoWMxYFFhw2vd9LmwcjIKuBv2fBTArBQKhaGAMViQeIQYFcg0aetQCsJGyYMZKba3FxoG2+r5hi6YvMh2uU/41jeVtZyHPpZDYVgiVdakgZmzyuBV+gIT6kaCIXK/MceypYTChI4/Kgbvx/lG7IAZP8jBWD+UKqyKaAcJyw+Mq5PpqSuR6zNJph34YMsYBguDAfFv+W0tKkqnpRJ9rhPWJxXUKym4L3D0ID2dyF4ArDpUJJ7ii4l6jdwTjADPyxzlDB84op0BDXDJrqWE0OCEZUAnBt3Ty5VSAEPBfeO9rDwoc15MZhYLg2+E5ahHui66CPBLYSANwsFG2Kgmvu2WUtATNKN0NksBbh8ovy8OL2GJoHBOEv049gwzPh24XYYj2CiPK+XK+zLBAfFQWrJRhLZiAgAjADtGIWpNSvCywXkyI+3IMUFi80iqhtYAJkQxlyI1BwhQ3/ymHgbNqQg7HKfvipyVhwqUkDhDy8ycxIC3NhQWR8+A+HhMWRxSRqCaRYop1EYdOLptovFhfImIbAYs8GhWACh1x4RDlaVV4A8xjxRxK/4IKmiCbogu8UP/Jpw9+IfifGgwVuSDBTZ+sFJIsKkVmwSNFm/J6JUSG/vkawxEAS43uDP5ZntYT0xcuQCXCLkiZbayqeOxY0xRh0SH+4x3DHDL0bmO//viNCJw+dUssD//TQeNkYMZe70Af1DxA2KtxX/sz5FmiHDY7NDUIdhW85m/SH5s/GDwGIArkgJiFKCwFgU4cY8f66QFj5FvusbxAa4oiy5RFSCW5ZUB5YXyBnLrg9wA+y2ye4cFC8IAJReCa47CSNCIgANAJWLscUGDexTQKv5o2g/y42DDYOFwgJ0dGw9jFB4/3n7uOiFoELbeXCLbGNOQSA08fQkF0gThRAQgueEny3DwwXoSmwqbJpR8maEESGTX1I0JTYiJB/KIvSXcp/vyyZdHMbLI4shr6IodVjuYjpn30BhgTaQRymBPIWF1QW5CETdjY/cy9WqRpBg4JguQy5MWraGrqGQFaCH7PQF1Yb/OAc+LO05OBQ2sdq4xvzWH+QIN7NuAlepRCDvvsgDL8ZfmA++M2xCMX3Pt/LOkwRpEgSa8int0MsDde7YEXL1g5+ayEAbKh8my5s4hDdsUBLNmi+tRjjwnsZA2S9vUyWIO4EZOLumpJ877vSejx1v34vCIgAzHsVMAfGIKIhk/m81uffhSmajxathX+YdeOCNNZydh2wWODfHpJWAsC7xoIY3QYtvmruZ2GLVgfIDlpcFBZaiIbLkNbsv7N4uM+ejYH/9qCsqUwCtMRIXnBjZA0I0yguGZ4HUc3Mg/+t0Xqz6wDChJm6z5pDP7h5XLiWYET8y1OSYzsIiIxka+r+mt+ZP9kmub5FvJfiWWw8jAc3Ec+7Bqex/snGiPUzIOu4V2r9xsRFxPLFY24lsnQgCFGYMxr+lORKiSgZbIg1gqUgBugNEZxaAsDpjJmM9VkU+saGZRT/vws48+xjBg9EB4tVtDhhgXRL3NScea+5P1oEl7RYTfV/ZH4XAWh/lGgD2bc65etq72WZO3i+tQtoDgJjMY4aSR5RKwFA+0MLjEIK4JgZPPfJZk79AZc+5k+qEhuxC1pZXpT9NzZi4hT8O6AkM/Piby4s3izifZJ9pFNkgzZanklfZPcZegJQaReTMmb8GExGitmfTbxKBA/yrB0DNDz+FjFY5m38Xx8x6X+4BGoEyxVEAPM4z5Tn3SKcwomFBjeXC3EiBCHWCptwtCBBrPBJE2SXpY8A1G5skNA8P57/VBpiHh/fOy4hnmmWWgKAe82tYLQBwajNXMECRvoyG77/oxBUnEcOWGQzhxjWrlWMiRLSxGm4rHUNrn3PDuQ6EYB22NH8c247Jrg5kbLtvW/vjuynJe0ObXNIWgkAm1FMhZqT70wxmZgexYLBGPEnu7DYs+j7Ecws1NGPG+cTtWZIHc8W8z3aD1oQwiZ/nwEQstm9xW9b8yRxyeSNBu2VYM4+ycWZeEaxAE/fPdm1gvUj+rFrxtl6DaSKTQCTcssaxKYGocMPPOQnjmO5YCoRzPtyyop6F7ENxocVJWasEOiX60ZwTyYABGxCyGpjgwhKjMF/Na6KbDnAVB+DOeNcaglArmuxZEAo44HMQdRd5rSPVY37XIhXyUXZWt/Lvbu+5ePbO3AGJtxHAOak7cCSCQRrlaGgmtZ28vUxGI7fWLRypH68p5UAZP8oAUMxkLJm/LyvmL9j6eU+DT1jiz8Uc3KWGByG2dl91KQleaARvvpYHMfbQOOGaHjGAJYMLBpLCoFVOeBqzBTbFwyGG2esTj7R8bTpMubjXnJutIWmiobMhoo7xUnbVD+YlTEXo6WO5ctTeCcGTeJnjumSU/3473lDJOMiZn74dZkAYDnI6aVjfWaSXHM/RAirkAvujpgJE/urJQD44aMliTLOuOuWEiwDWApcblBSAVvaz+m3EHcyEmqLQbX0dWSvFQFof7TkXeeXjEUmlsWtaXUXBIA0OnKR0SrQaNGW+Uj6Flo2NH5zWZoAsJhFnyZVFCODr8GMa/AvxkW8b/HIEfRELsccd+8ravos6J5KR26yH20MDmzE+ZnnyG3aj6lcQ/PBrUJwHkGkEBPM4uAOkcjfI/8dF0ranPLF5kV+rOwuhCXW42fhJ82qJX2w9rlNXYflBg0OIkABJ4Id4ybUdz/jZHOCyPVJtohghh47jnhojATxxYDKIfKaCQDvOHEctULALkQyvgeYxoesHbwLEDgXglCxcJBZ0yc1BIA1guyZKJjaCZBdQvoUKKxssZZGTT+8G+AdhTVurUen18xp59eIAMyDHJNzTF8hb5VNo0W2SQAw57Oh1VTuGhrz0gSAKGc0vqXltiW9Krab/aIUCKKeQBQ2ulhWOabv5Y2xT4vOfswpXy9jIkCRIM1NvrspAkAZYqqwubAZsCn0VU8kyyNGw7cEZS79HHN7YIRLBaKFBQZ3wZBLaqj0MprwNgoODWVYZAJQSwrj3HO2xFgxK9IKY80JgkBjIayMaQ0BgISQERRlyTQ7CHBL3E/Lezb1bbS0tRfXbrIQ7QVAA5PMaYBTEfN9zbDY1visyMf14ju0M+YCIKoW8zU5+ZvK0gSAgK5cKGTTMXI/RXBiwBJ/y35bNnoih6NwmIwHg6Hdo+VHXy3+Zr+nbxEmRZCFEfHCSkOaF1YKrB1zqp1ljKYWOdw2+Kyj+wZXC1prlmyVmVNCeIlnWNMGFhKO3sbdls34kBu0v1yuN7udavqpuYagRIpEZckEAAsEMRYtghUplkkmlz+6aLwt3nE26vheD8Um+D01BABrIbEIUbDGLFW0CcvXVEXFFrzitbhUyXySVCIgAlAJVLoMpk0AmYtX9urTsub18H93wZZjNP4YASDIDj9iFDYnNGByZ8mRJ28eP3o2aW87BoAKhETdLy1DiyypmVHrz9HzUTvsI3BsmGw4SD4UB0JGIKhHl6O1kUHQJ6QFEliXS8GyUDFGAvogKARdZtN7awyA9x9jGPhbXz0D0imJ43BZSy2LqfcDYsNGm+MyyHbI7z6Fa6421eCM34d885kAkEqZz5iY6g6XD99orD3Qly2DmyRmp5C1ATEa84HPJQB+psHU2Gt+x+1F7YdtyJKuim2Mb3VtigDMeyT4HUltiYKvnYV2aaklAGhAfFhx4UCLJdq2LwAuj3PbBAD/a8wBnxM42YJt1PC5L1cqjLhCnKjaFoXKce5bZnPGeuF1zdH+XhkuHsoUQOMH+zhvIsMx09bkPM8lAGhs8RAkot/ZHEgTdMFqQrqXS00KYwv+27wWawB+cVwbLn3lc3GF4B5wqT3gae7YlyAA9I2/nTLCLn1uLuKOCHJ0YT2K9S/65lBDAPpcALhfcFkuIdn1RpuQ55wivERfamMCARGAea9IX352a8BPbc+1BCDXgydSmtzims2fseRCMku7AEjTISjRpa9mfi0mNdexOcQiOGj8XhDmjClYiGp9aPlRsqZCSpkHXOXNcyg1z490ju22HIVL6lmudDjlAvC+YoEj/oYpOtZQgCx6tTjK0VJGuaYKWw32u7gmV71kDtFVxhjyKY9YW/IZC0uOdSkCwBG+HAXtkitAYk3CakQ9Apex9FC/poYA9AXpQVhjkalNMCN2Kqbt0hZpp/lExE360L2VCIgAVALVcxmLSTx3He0QTW/pAJdaAkAUbazchxYRC2VMzTSnIC1NAPJJfWMFeqbGWvt7zKtGY3RNPAbKYTJFu8+LEn1Et0WsOhgPzuEayEZfERPqB0TLAjn9aOK1UfY5j50x1RKAXDQJ8kJ7SPbzYo2IZ0HU4tt6HXUNliIZuXAVY2FziVUS8zWkn8Vy163jn7p+KQKAhQOTfozjwA3oxX3QmGN9/dqaGjUEgDnmNL2lrXX5dEgsGbEU9RTO+n0hBEQA5gOZT56jJXLGMbm3VLSaGkEtAYhBa7SJltpy/GzOSliaAORzAAhg2kZWQMQzR0ljfmTxiWRkrL5+DCLzyG9SKPH/ey2CsTLQZIfEUxUhDi21H/qOEK4lAKRJERQXUz6xfJD2l2NFtqWBkfmADx7tlH/ETGDVqC2MM/Zt5AJGxN94TQa/D4Keiya1Vp+c+j7j70sRANrM7w7nNXCgEEIhpHhSIyQzFtkaGnMtAcgHXFF1r7akOH3z7kVXJC60+MxzLf+DOB665bke2WtFAOY/WsyNaJixNj2t1ZRfre2Vj4iNPfo6h4IAKRiDz9gF7Semg431SbU4fKgxUG1pAtCnzdaYLWux6ruO1L54yiBuDgLDcA04pmOHHkUt2k8WpFhQ1L7Y4CEBfZKPwe1LRxyaH8+enGZ8slFqCQD3cDxzzENno2C+8eCZmuCxuc+A3Pls2l1K2+Okw2i16CtXSwwG2SexvsXUwTxz58p9SxKAXNLaCShrNsdH+7G4uPqwDsSU1k0JQD5cCOsYlpO+o6j7+uKditU3Ccbl3XfJ1sY5x1dv8px0b0FABGCzV4E0sBz4h/ZPCc8aRj7WOx84G0s8kYvrhwhAthTUEhEWSQLaiCqOgpl6rDJbrgRI5bx8tneeH/EIsaZ46yFKREiz+RL9jJaCRp2LlsQ+0dIhRq6tE3dAhHysHtfn//c28kly5yzBWX5E8FRpWYoJxfoQfYcFDb0DRLUT/JWlJSKb4K146iCR/mzAMeBqTqR67VfD+4PFJRYzwnpC+utUjfuxPvqOqh2aRz4KGFcQFRNrNzPG8dyiwYIl/9iA+2RJAkDBMbDzjRTXBjhiVYmVHVusSrUWgJwhwlyHimllHHi2OWUwZ+CwtmEBZI4uQ7Ucht4DyD0uNp4HJB8XKHEgkgYERAAawBq4NLNlvwzGyyZcw8xj02grmPfIPY8nDnIN/lM0wL44A4LYYmrU0DGcsS+eP/UIMC8SbBYtDVxH/0O57TnIbKxgifeZS7Py91rzM9YJNNp4kAxa4NTBMtGcSf42wUxuSh3z/zM2+oRAeAEacIIwkG+NTAWV5UI7kBWC7fpO84vPBa2dcXI95CWWPm5JdeL5suHFEsW8FxADF+IB8lnym38V/9dCjkXgF6xaPDcCQ1uFzR8Tcsx/J/4GctaXXsbfIT5RWkgPR0XHMrhYj9C4+zabJQkA48UvzjvnwnNDAUDBcMnZLWN41hIA2sgFiVgfsNjFTJLcF+8b3xsZUS5DNRNyjQasALSfixD1zQcixFz8vA6u4TnhGpE0ICAC0ADWwKVgiObbV3GM+tRonPjQ+BCGgr9gxHzYfDjUYu+rwc9CzsaDqbNPyDfOR+OS2sdi2Sf46fAzkqfOYsbGllN9xgqLYDWIxVCopc9/j8U/4DYhGI1F2QWMYP99hWr8GsZKVbV4qh+bN2QoL+55rhEX3BqYpImyRsb8/95OPLgEAoIP3wPJ0EBIARwSsh7yJjdWHAaz/91K4CDvFRkDxE5EqwnPmIDEWskVC+N9Q0VmatuuuY458a7ko6V5fjxznivPYex4XrBg48etxYaXo/2xyDDPIaGwTi7TTHwI9/D+9QnjhsBD8OM6GX3x+b6lCUBO54S4QAIopoNAJCHt+NhrpIUA8G2RShq1dAgW5LTv/AVIMtaWXIkQV0Z0w/k4iUfh241rHYoNMSO8l0NCZhMZEn6EN9dBKHFjThHrGoz26hoRgOUeN4sQzHwIUzYfArCIBHetko2EoCi0wjFho2bhGfvQYcWw5/hBsciivZCiiCUCTZIURjZ7TNPuG3W/KGOLUdKQDhZO/pdFN5KPnIfM+CE5ZB8wV3zXbPY5350Pl4Ulkxw2SvzzWBbQBhgrmiukAt999OPS19gpfRHLXHmMYDEv4DPm//c28Jv7aYAsMDHQrCZ/OWdn0C6kjE0JNwrvC1jRFmmKHhgJjhA4nl0kPoyfk9AgXFhohk4G9PGTdcDCGhdy/w1L05zzGFq/GggcGqWnHeb7cQsQT8N7htWDOeI+YFPBfMw7M3SiIyQC8j1WAIdnxvuV+2fjwFLHM8JvjcWHbxEzNiQxH4c9FeS7NAEAJ+JA2CwRtO+4VrTElHB/CwHg+j7rJsoCpJjnSQYMmRdo7ryjudLnVCnkvkBqiCAknX+sl6x5fPuQYMgEcSUxVonx4A6IcTmt7+feXi8CsOyjx1/P4SvRNLVJD3yw+IFZ7GskHmJTcz3XxAIi2Wcd28j1z/uC+nKfaFjuL4+/4VunvexyqB1zX+GesXtz2pFfO+b/92vwuffhj2uEjW3q9DE2HYhQPDtiap4QKawvLH59i6TfPxWo6deBNZaeKPjAySPPpw1OjW3u7xA+XC8UaFpCIAmcdwE5q8m64VmxqWRLRO1YsI5ByMYyGLZBAHJ9jzjemvc3Xt9KALi3r7poDWaQE561F88auodrsJLGrIGa9rkGQk6AIRZWyQwERABmgDZxCy8yZjB8n7FOQG1PaEBof5jTWk/Iog/MpGj9U0er0g+mZAiLC8TlLT3aNr/3HYDSZwWI8xwiAFzD5oO5G623tkY+1gHGnIv2TGGbU6q4fsr/723msr/+95bUKEy5xCtMWXoYExo5sQNeVpr+0V7d7BvnWksASOHC5xoFa0ssZz2F4VK/o11jVYHgzFn0ierHKgKxbI2vwarEd8k7VHsuBVouJAN//JibAny2QQDQfPuKeWGxwHU4tcHG5zaHAHA/2j3WMrdEjL0LPB8soX2nbw7dhwUBohFjB6beN6wQPEtO9JTMREAEYCZwlbdhwkbzwheMJkjgkh/9igZGeg3aKaZP/GFEt6Nt1haKGRoGGw2me/zVmPxJD8RUxqKBqZUNFNNpX4AfQWGUiMX0jgkWczxBYscMVAPD6sBhN2xQLLAQCwKGmA+LwJT1AvM3Zj18myx2uCBYnMEH7ZRocTZACAhmxxptL+OClpBT9Wr8/94OJWRzNkZtVLS3gdsB/zVzJQYClw2mTBZMXAFEc3PUcV+AJ9orz4SASff5Yh4FE0jUlECw2MjipteqPU710fo77xamW7JPiDqHfPKeYimAvEJu+D54B8CHdxBCDE6bRnvTNwSEd47NhzMqwJh3i2+CNEkOrMF3DcZDcQJ5ztsgAPQBKcdqFmXOQUNzCQD9QtZ4Z/iHFQWXDJjxneI6ZIzghX9+ri+eZ0H7xEPhfuG5eHEn3l/eA9ZI3IrxHIvWd0/XFwREAPQqCIGjjwCLKZuaf++ksRFrMKXRHn1kNEMhsMcIiADs8cPX1PcGgezHXbq0694AqYkKgaOEgAjAUXqamosQ+P8IYPbHXeBVIjHZYhHAHSQRAkJgjxEQAdjjh6+p7wUCuZgMEdfEbEiEgBDYcwREAPb8BdD0jzQCnClPzQH/zgkuJSi0ptrakQZGkxMCQmC4aI2wEQJC4HAjQMU26jp40SNm01o/4XAjoNELASEwioAsAHpBhMDhR4C0QlKoSGGjvgKn5OW0RdI/Kd5Um9J2+FHRDISAEBAB0DsgBI44ApSJxtc/JJ82MyoayvR/xF8ETU8ItCAgC0ALWrpWCKwTgTECQBliDlih7r1ECAgBIfB9BEQA9DIIgcOPACZ/TorjYCmq/qHxUznvceUsexX8OfzPWDMQAosjIAKwOKRqUAgIASEgBITA+hEQAVj/M9IIhYAQEAJCQAgsjoAIwOKQqkEhIASEgBAQAutHQARg/c9IIxQCQkAICAEhsDgCIgCLQ6oGhYAQEAJCQAisHwERgPU/I41QCAgBISAEhMDiCIgALA6pGhQCQkAICAEhsH4ERADW/4w0QiEgBISAEBACiyMgArA4pGpQCAgBISAEhMD6ERABWP8z0giFgBAQAkJACCyOgAjA4pCqQSEgBISAEBAC60dABGD9z0gj7EfguGb2snLKHVdQ7/6Kpfa9MBMC20LgN83s78zM185Xmdmlzexb2+pQ7QqBbSEgArAtZNXuthH4azO7RujkjmZ23213uoP2f9jMzmZmZzSzU5vZCcyMv33NzL5qZp/t5v0hM/uINp0dPI3+Lu7SEYC7h58swzAxAAAS/0lEQVSe0B21/PsHNhp1LARmIiACMBM43XagCNw+bfbPKEfe5kGd2My+0DPS25rZAzacweXM7AWhjVea2SVmtvkTZnZNM7tSsWhg3ZiSr5vZPxWLxxPN7EtTNwz8/pAOo1uF3/7VzE450dbbzeyc6ZrnmtnlZ47BbzuemTGvKENr1KPM7Mbp2t/uyNPTNhzDxczs5Wb2Q6GdZ5kZmr8LY3pmsTj535Z4pzYcum4XAm0IiAC04aWrDx6B85nZa4tWzGjQiH/BzP6jZ2hDBABt+ufN7OMbTGcJAsD47mRmNzGz428wlq+Y2UPN7J5m9s3GdpYiAHS76QbcQgC49o2dOf7sYb6QPYjJJxsx8Mt/3MzeaWanC/dztPI5et6vk3ak8z1mdvJy7bfN7BfN7K0z+9ZtQmDnCIgA7BxydbgBAmySbzOzs4Q2ft3Mnj/Q5hAB4PIXmtmvbjCWTQnApczsSWZ2qg3GkG99f9HCP9zQ5pIE4F/M7Kxm9p8N/cdLWwgA9+EqeVMiT6/oLCOXLDEhrcP4y2TKJ66E54RFoE+IOcE64AL+5y3umta+db0Q2DkCIgA7h1wdboAAPn7M/y6Ye9E6h2SMAHDP75rZk2eOZxMCcP3OzP7oTmM/dk/fWDL+sXMnsJGhff5b8f1DfiALkJ+LF3dDn6uATZgN8L2V81qSANDlYzurzI0q+86XtRIA7r9B6TO2xTvyp41juIKZPTvdw/tGbMmY/H1yD9y7WHUau9flQmD3CIgA7B5z9TgPgdN3m/37Ot+/b3pEXaNtfnQDAvA5M/u5gTiBqVHOJQCQDgIY87f3iRJYhj//u1Odmxkm6Jt1PvPbdZvdj6brCRLEVVITF7A0Afhel51x0S4y/jUVc1iCANAGRPBqobFWc/zJzOzdwZxPU7gXLtxt5t+ZmAeEDFfAccp13yjv1D/PmL9uEQI7RUAEYKdwq7MNEMiLPBvXrSfayxYANqWfMbPThPuOMTM08laZQwCIO3izmaHpRmFu1+6sG2werfKzJRDwTOnGx5vZdSsa25QAEHOACyYGyWF9OPeMLIU5FgCmeKIugJLAxOi7bzHHE9BHAKbLl8v4ybSokUea2U3DhViVIHoSIbBqBEQAVv14NLiCAJvbB0JkNhoyFoGpYK9MAF5Xsgf+ISCLxvrL3T+i+FuklQDwrb2+2ywvkDohmh1NnnHMlZ8qGitpgy74r8/TbczvmGh0UwJA82coG/AJQ1937Z7XPRonNJcA0A0BeGRFuCbO3x7TkymQh3QdM4MsRblWl4b5Vw1j510k7sIzB3g/z9yRuo81tKFLhcDOERAB2Dnk6nAGAlnDGkr7y01nAvCuEtHN/VcJF0MuiB5viaBvJQBX7TIPnp4GSMQ4Gxcm600Fv/9LixWB4jSkKDLPT+2AAPxk0XgfHvoCS6LnP9gwsU0IAN3k9FD+hm//OQNjOG2J+o/E5W9TfYna4RMMSFCgy8NSemVtO7pOCOwMARGAnUGtjmYiQPAbvnoK4rj8ykhkduwmEwA2I0zmaMrEE8SFH20VrbVWWgnAq0PVQvpA4yeFDf/xUnKhoomT5lgrS1gAwJP6AaRnXjB0TCAj1pVa2ZQAsJ69uETue58EUUJECI6MwrUEW8baDWjs56qMnchzuoyZvSj8ETcCKYJz3Dq1eOk6IbARAiIAG8Gnm3eAAMFdsbgLCzrR8DWBcpkAEJjlfmJ8tlgWXAgqZPGHGNRICwGgz2wOxm9OCuNByxIEABM4NRWwohDjEM3w1+viLkivq5FNCQB9UMQIt4fn5/M3Uj5/LblZ/tDMHhgGRbAfwYu4aeYIc4YEnSTcfOVSMGhOe7pHCGwdARGArUOsDjZE4KldSttvhTb+oqR+1TSbCQBaoOfd468lKBATvAs+ZFLsavzxLQQAH/8j0oB/w8yeVzOJLV+zBAEgkwI3CkL63R+HMZPWSLYGVpwpWYIA0AfPBoIV1zeqHWKWR/qCMe/cEZd7TQ1w4ndKAhPM6TLXnbDhMHS7EKhDQASgDidddTAI8H7+e1fljlK5Li1aVSYAn++0flK+XDDB44ePGusNzexxFdNtIQAElFHq1wXrBZHr1PY/aFmCAFCJ0V0ZuGxIqcMq0LoRLkUA6JdSz38UxoApntRI3EBvKFH+/jMBoLiVCJzcRCCqEFYX3l3SNSVCYJUIiACs8rFoUAUBNMdc0AZ/M+V/ayQTgL4FORcXoood/Wafce6vhQBgksYP7ULKGmlya5AlCABEik3f5bLF7B7nB17RR9439yUJAAcoEZPApu9CmV9iBG4T/rZp+eA4D1JMc/4/dQKoyyARAqtDQARgdY9EAwoIcMJa9B+T9sciWys1BIAiOmxepLK5TFUY5LoWAgCpQON3oRDQ79VOYsvXbYMAMGTM31cPYycGAkvBWIDikgSArjlRkdLR1PgfErIzON53KflMKu+MS4CSzxIhsDoERABW90g0oIDAg1KxH/L3Y6rVFFg1BIA2cgQ3fxs7Y6CFAKCJ5rPiSZe75dTgd/T7tgjAKUpAZXTf3D/FB+QpLk0AaJ+CPH8zgCWuHlw+SwqxB/GMCQINo8Vhyb7UlhDYCAERgI3g081bRiDXWW/Nra4lAEyDTSJWb8OUS7DYkJ++1gKA5p8Px2lNOdwmzNsiAIw51+kn0v78JVWxb07bIAD0k2Mw+BtBicQptKRM1jyHPy+nO/q1WBewMkiEwOoQEAFY3SPRgAICBOhFXzmpWw9uQKiFAJA2RgpgTOPCAhEDyWLXmxCAOVXyKPJDsZ9WIQ+ffPwh2SYBYH0hwI70OhdO7yPzoi/gbhsE4EfMjAqQVEXMsrT5n/bJgIgHEb0lxSG0Pj9dLwS2hoAIwNagVcMLIJD9qa3nzbcQAIZLzjpphi5E61O6t++M91oCwIl/+UCZh3ZWgT9oxOcwEgCmSEAlQY9sxC7MHQyybIMAZIIT+yRFkeBMTl1cSq5RDnvy9mj7p5dqXO0IgSUREAFYEk21tTQCX0zV+i5fDr6p7aeVAPA9oC1fLHTA5g8JyIWHagkATX0lVTIkKCzmi9fM57ASAOaGy4M8exfwOFvPWQ5LEwBqLcQywDxDMkjihgyuxIDU1H6oeU4cioTrygX3T4yDqGlD1wiBnSAgArATmNXJTASokR9z9DGBU761VloJAO1S1Ia0vaix4gbAHRClhQDkNECqzf1S7STKdcQ/5IOE+prAZRLHfpAuAB8fRziTgkdKnAsbM3X6oyxJADggCdw5p8DlnuWMBAo+YZlxIUgvVgVsfDQ/cHlOgSQA1I+w3qRd3SsEFkdABGBxSNXgQgjwbmY/Meezk9tdK3MIAG3fLZ0LQCAgAYExx7uFADyliy/AfeHCpsDYvl47kYbrKMnLITcuayAAjIVxZPJGmWcOLHJZigBQ5fFlqc7/G8tZDLhj7tMd/HSH9DwgV1MnJ9Y8BqxH+WRJxrOUhaFmDLpGCFQhIAJQBZMuOiAEsgWg9hAgH+5cAoDGxmbAwUEuuXZ/1vRY9OPBMhEyytDii45yqbJJLQ3tWgkA8+TYXY7fdcEcT4wArh4E3PPhOXPWKIIsIXEuEDgsI16QBwsJhICzC1woOHXeBQ7vySmlvMPRIrP081Z7QmA2AnM+rtmd6UYh0IhAjgForZ8/lwAwTM4EeHmqJ/87odTrpUtVOZ/SGAHA9O218v16jgaOZxw0QjN4+ZoJAOb496fyuI8OaXN9NRNa1ygyDnhu0cR/o+4EyMcmxKheyMFFcXPmvIZbbPggcgwA7zDvoUQIrA6B1o9rdRPQgI40ArvOAshgHmNm1w1/pDwwGiuBXdnUO0YAaCKnNBKQdqZyit6SD3HNBIB5UgExVsbDNH6R4NoBF0zmLi1rFCmcZBycJtzfF2vgP9/OzO6XwOfUwBds8EByFgDvMPEIEiGwOgRaPq7VDV4DOvII7LIOQB+YbChorPEAIa8eR415ctpdpggApm9M4FGoS08swZL+4bUTAOb/EjPDBeLCQUKY6DGX54yJljXqWalSJMV+0PSHTiKEaLyqxAb4WDjSl3s4dnqO5DoAvMO4FiRCYHUItHxcqxu8BnTkEdhlJcAhMLNGx2aN9s/BQvGgoikCgKmZSPgYV0CfaKF/ttCTxIT+CTM7ZWhvLUGAcYpYPt7Vad8E/bncyczu3bkD2IApyuRSu0Zhuvfjfv3emrRRzgsg3uMEoc/nmhn3zpFcCZB3+CpzGtI9QmDbCNR+XNseh9oXAn0IkJpF9T+XbZ0FMIU+p9gR3OVCxUDOCvho+NsUAeBSghiJTo8Cobhjjyl6akz5d8zMHDKUAxHXSAAYO3Nmw3ch+I+iPARbQhBcataoc3WWFFIrY7rdY7oTHW9cCSIxAsQiRLlJz99qmnteF2CIG8FFZwHUoKZrDgSBmo/rQAamToVAiRiPZnO025jiNgXSJkGAsW1OCuTEQE4OdOG8+XjISw0B4N5cFMfb4/Q8rAGfmppU+p2T7m7WRa/fPp04yGWfL7X3cQsMyTZLAY9NBWsFJ/WRXulC8B5nJ8SyvVNrFJo75XajZeWDxaXQUuc/H+LDvZjucQG1CJX/OLLahRMtn9DSgK4VArtCYOrj2tU41I8Q6EOART0vwKfqNDuC8WpkKQJAX2yw9w2dkssfI8hrCQDfHEccx3Q4bxYtmFLE+LIpVpNPEfTr0PbR7PGjY17+sR4wPlKsFDn7IF96UASAcVyom8OrU6ZFxnVqjWJzjVUVyfOn3RifUfOusGnjlohnQeC/59wCYhNqhKOqY60I7qGw1NQzqGlb1wiBxRGY+rgW71ANCoEGBHg/0WLjokyaFRtkjSxJANBY0TQJEOuTWgLg996rmMGHvkFy13ExEIz2hVIS+aRmxjG7UcPsGwtR9jfvDjL6cgVIB0kAGN6jJkz1Y2tUjs+gPUoOg+0cIc3zyelGDvaB/NUIaZ1PDRdy1kCsRFjThq4RAjtDQARgZ1Cro5kIsCCzMLu0nOG+JAGgf7TB16Q0NR9XKwHgPvz15KefeSY2+Tb84LctWnVtkwdNADD5E1OBZadPhtYo4gTQ0HGBuFAlkgDNfG5DLRZcl6s2Uo2SEtRjJyp6+9kawbsbj5huGYeuFQJbR0AEYOsQq4MNEbhyp3VzproLKV1sFn3HyeauliYAtP/ILq3spj1zmkMAaAbLwtXL6YDx6ONa2Cg0Q3AkQWwtZZK9/YMmAIyDksBPayAAuF6Ya0yvw9pBMGAMzKzFMF6HtQlXQLSyfLIEKFL/YUg4s4IMhmit4t195pxB6B4hsAsERAB2gbL62AQBAu/Y9KOfeyqy3fvbBgE4YdFYsxl+LgGI2Jy+RJBTY4DT8ihog4Z7/K52/TdLjjyFZfDvU/AGawQ+9KFYgRrc10AAGCepd2RWZOlboziY6dbpQgo25ToLNfPvuyaf88A1mPajJSrfl0sAU8+AdMZtnPcwd166Twj8AAIiAHohDgMC5HfHEq1oi/FwncMwB43xaCOQixA93MxuebSnrNkddgREAA77E9yP8ZOGx0EuXiKWSO/TmRkpVxIhcNAIkJqK68HfT2IQiOv42EEPTP0LgTEERAD0fhwWBHJw1oNTkaDDMg+N8+ghgLZP1oWLgv+O3jM+kjMSATiSj/VITgqNn5oAXu0Nvzc51tKyjuTjPjSTQtPnLAOCORFqOfBe5noAh2ZCGuj+ICACsD/P+ijM9D5dMNwdwkSmArOOwpw1h3UjQIYK0f4u1CCgFoFECKweARGA1T8iDTAgQDQ85WPPEv5G5DhlXCVCYNcIXKErOfzs0CkWKlITW0oQ73rM6k8IfB8BEQC9DIcNAVLkyAF3k+tnSz15quVJhMCuEKAqI+dDUJkRoVwwhaIoTiQRAocCARGAQ/GYNMiEAIfm3C/87end0byUYZUIgV0gwLrJMb9XCp1RgZEDoiRC4NAgIAJwaB6VBpoQ4OhbasG7cLxsPKxHgAmBbSFwl+4Ao7uHxp84cLjTtvpXu0JgEQREABaBUY0cAAJkA7zMzC5c+qY08BVLRbkDGI663BME0PrR/n3t5NRGTmXcpBrjnkCnaa4NARGAtT0RjUcICAEhIASEwA4QEAHYAcjqQggIASEgBITA2hAQAVjbE9F4hIAQEAJCQAjsAAERgB2ArC6EgBAQAkJACKwNARGAtT0RjUcICAEhIASEwA4QEAHYAcjqQggIASEgBITA2hAQAVjbE9F4hIAQEAJCQAjsAAERgB2ArC6EgBAQAkJACKwNARGAtT0RjUcICAEhIASEwA4QEAHYAcjqQggIASEgBITA2hAQAVjbE9F4hIAQEAJCQAjsAAERgB2ArC6EgBAQAkJACKwNARGAtT0RjUcICAEhIASEwA4QEAHYAcjqQggIASEgBITA2hAQAVjbE9F4hIAQEAJCQAjsAAERgB2ArC6EgBAQAkJACKwNARGAtT0RjUcICAEhIASEwA4QEAHYAcjqQggIASEgBITA2hD4b0ol4QjN+S7gAAAAAElFTkSuQmCC"/></switch></g></g></g><g data-cell-id="iy0HhJzZLXsiPmpU2ukH-9"><g><path d="M 482.5 248 L 496.06 248.06 L 496.06 203.06 C 499.96 203.06 499.96 197.06 496.06 197.06 L 496.06 197.06 L 496.06 189 L 595 189 L 595 178.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 595 173.12 L 598.5 180.12 L 595 178.37 L 591.5 180.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g data-cell-id="iy0HhJzZLXsiPmpU2ukH-10"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 190px; margin-left: 524px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">S3</div></div></div></foreignObject><image x="517.5" y="184" width="13" height="15.75" xlink:href="data:image/png;base64,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"/></switch></g></g></g></g><g data-cell-id="13tBXMPt0xomx7MP2VuM-1"><g><rect x="352.5" y="228" width="130" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 248px; margin-left: 354px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Analyse Service</div></div></div></foreignObject><image x="354" y="241.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="V1Wl26Vbpgnno5Lb-wtg-46"><g><path d="M 245 370.37 L 245 397.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 245 365.12 L 248.5 372.12 L 245 370.37 L 241.5 372.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 245 402.88 L 241.5 395.88 L 245 397.63 L 248.5 395.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g></g><g data-cell-id="O_ELZSFbvl3Butg3bv_j-1"><g><rect x="180" y="324" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 344px; margin-left: 181px;"><div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Authentication Service<br />(Keycloak)</div></div></div></foreignObject><image x="181" y="330" width="128" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="V1Wl26Vbpgnno5Lb-wtg-48"><g><path d="M 666.37 344.13 L 685.47 344.53 L 703.63 344.14" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 661.12 344.02 L 668.19 340.67 L 666.37 344.13 L 668.04 347.67 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 708.88 344.02 L 701.96 347.67 L 703.63 344.14 L 701.81 340.68 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g data-cell-id="YJRAzF6yD4Hh-bAvO1PB-16"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 345px; margin-left: 684px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 9px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">JDBC</div></div></div></foreignObject><image x="672" y="340" width="24" height="13.25" xlink:href="data:image/png;base64,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"/></switch></g></g></g></g><g data-cell-id="iy0HhJzZLXsiPmpU2ukH-6"><g><path d="M 595 364 L 595 410.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 595 415.88 L 591.5 408.88 L 595 410.63 L 598.5 408.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g></g><g data-cell-id="hBEam5F8n4ZBPeoiEcWH-1"><g><rect x="530" y="324" width="130" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 344px; margin-left: 531px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Metadata Service</div></div></div></foreignObject><image x="531" y="337.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="YJRAzF6yD4Hh-bAvO1PB-15"><g><path d="M 308 248 L 329.06 248.04 C 329.07 244.14 335.07 244.15 335.06 248.05 L 335.06 248.05 L 340.06 248.06 L 340.06 294.06 L 420.06 294.06 L 420.01 317.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="1 1" pointer-events="stroke"/><path d="M 420 322.88 L 416.52 315.88 L 420.01 317.63 L 423.52 315.89 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 294px; margin-left: 407px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 9px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">Spring AMQP</div></div></div></foreignObject><image x="379.5" y="289" width="55" height="13.25" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANwAAAA1CAYAAAAqEYXLAAAAAXNSR0IArs4c6QAAEzZJREFUeF7tnQOQLEkQhvOdbZtxtv3Otm3btm3btm3btm3jXXx1kR05tdVdPdM78/rmVUZc3O1ud3VVVv2JP7P7+vTr16+fJEkaSBroiAb6JMB1RM/pIUkDTgMJcOkgJA10UAMJcB1UdnpU0kACXDoDSQMd1MAAA7jNNttMTj/9dKfaLbfcUk466aQOqjk9KmngPw3kAu7333+XW265xf3zwgsvyPvvvy8//PCD/PHHHzL00EPLyCOPLJNMMonMMcccstxyy8kMM8xQa50OyID7/vvvZcwxx5Rff/0126Nnn31Wpp9++tJ79tNPP8mwww7bcP3OO+8sRxxxROkx7IXHHHOM7Ljjjg33Mr8hhhii1Hi//PKL3HnnnXLXXXfJ448/Ll988YV8+eWX8tdff8lwww0nE044oVvfEkssIYsttljpcUPrzJvQwAMPLCOMMIKMNdZYMttsszkc8Lw+ffrkriEIuPPOO0923313+eyzz0otnosWXnhhOeecc2ScccYpfU8nLxyQAXfqqafKFlts0aDurbfeWk444YTSWxA6iBy0Dz/8UAYaaKDS4+iFM844owB6K2UA99tvvwnrOeywwxzIyshoo43mwL399tvLoIMOWnhLM4ALDTTNNNPIhRdeKNNNN13wOT0Ax6SOO+64houxjlNNNZXzaoMMMohgMV9//XV58803e1z32GOPyXjjjVdGDx295rvvvhOUiQwzzDDOMg0oMtNMM8kzzzzTsNyRRhpJPvnkExl88MFLqSHvIN5xxx3O2DYjr776qkw55ZQ9bokB7qOPPpJlllmmB1AZiHWMOuqozrsARCI0X/B41113nYw//vi50/XXOcUUUwi6CgnzxSmhRyt46bvvvlvmnHPOHrc1AO6KK66QVVddNbtogQUWkEMPPVRmnXXW4APfeecdOeCAA+T888/P/j7PPPPIAw880Iz+07Vt1MBzzz2XhfsYGf5577333BMvv/xyWWWVVUo93R7E0Ucf3R1qeibWWmstZ9GbkT322MOdKzwjRpxQECkC3Ntvvy2crU8//TR7FMDZdtttZfHFF5fJJ5+8YQqvvfaa3HTTTXLsscc2AAKv/NBDD7mQMyQ+4K699loXKhbJBx984DgBwuS///7bXYpXfeutt3qE4Q2As25+0UUXlZtvvlmIU2Oy9957y0EHHZRdduutt7q4OUn/1wChoxJEgIODwMFA2OPbbrut1CTtQZx00kllxBFHlCeeeMLl81h5ooYyAkg57HACeN5vvvlG3n333ULA4a3wFtZL77TTTu7MxTw0uR7h5GmnnZZNj7CPuYfyxVYApwNfeeWVDQbs4IMPFoyLlQxwLBxro4KXwqKUERJVNkEtJ/nCySefXObWdE0bNUC+g0X/9ttv3VMIpwi75pprLvczHoaDXybvtgeRlGHjjTcWDC1ChLPOOuuUWgnnar755nPX7rXXXi7v15Asz8Ptueeecsghh2Tj899wDM0IBM9RRx2V3UJkpvO341QBHOMsssgijsxBZp55ZnnyySfDgHvppZcE5KtgtQgdysqDDz7oGKJpp522Abh6P9b14osvdj8CRkCJ9bngggvkkksuEUKGr776ylnOqaee2oW2G2ywQa6HtSTImWeeKRtttJG8+OKLzqKwyM8//1z09zwzRppss802cuKJJ7r5YQ033XRTFzJdf/317lAwNuEMVnHiiSd2bBThzCijjBJVEaE6a3/66afdGrmH3GCTTTaRFVZYwa3x3HPPdetFVl55ZeGeqoJe11xzTTcMoSQ6gTSYYIIJhDAIwUtwoGNiDyIgvv3227PzsuCCCzq2sIyg1zPOOMNdSr6PHjH2SAhwMOMAHN4AIV/k2UVMYGgehHoYGhhNBMb1448/7hHyVQUc0QRRBcK+wupbUinzcMSbeCkVDi0I7S3BIp511lnZJnO4llpqqR7JvH0eIQchT+hQW3IHtm2hhRaSWWaZRX7++edsiGYAh8WE+UKOPvpoZxBWWmklF1bnCWQSBy1EAHAPc1l++eUzixcaB4t41VVXuUNImISst956DoBVhRz83nvvdcNgkNAHYj0GxgPyK3aA7UHES5LDcV44NxwoADz22GMXTpnDN8YYYziPO+644zrvysHXPQsBjr3FsKmQk+YxgDF94RTmnXfe7DI1rPa+qoAjb1x66aWzITGwNnLMAPfnn3+6g41FQZZddlm55pprWqJ8QwvffPPNszh6l112cdaN8AKPNv/887sN4NmwO2p9GWf22WeXhx9+uMc8LEAOP/xwQZks1kozgLN56IEHHigk3Xgl5gcosOrMj7nwNxXyXjxXSGDUbrzx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"/></switch></g></g></g><g data-cell-id="AQz-Vj6r_5Wor37pQVs6-1"><g><rect x="178" y="228" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 248px; margin-left: 179px;"><div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Broker Service<br />(RabbitMQ)</div></div></div></foreignObject><image x="179" y="234" width="128" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="V1Wl26Vbpgnno5Lb-wtg-49"><g><path d="M 666.37 248 L 703.63 248" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 661.12 248 L 668.12 244.5 L 666.37 248 L 668.12 251.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 708.88 248 L 701.88 251.5 L 703.63 248 L 701.88 244.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 248px; margin-left: 685px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 9px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">HTTP</div></div></div></foreignObject><image x="673" y="243" width="24" height="13.25" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAAA1CAYAAAC+2+58AAAAAXNSR0IArs4c6QAAA2NJREFUeF7tm81LMlEUxo8pVAs1KltI4KYWSRlBELg1WwRCENUf0Dpo3d6WQdSynRCBQgXtRJdu2hSulFYtRESxMBT7wLiXt3n7mGbm3rnqC+/jTuec507Pb849d+5Mjk6n0yF8+uaAAwD65j0fGAD66z8A9Nl/AACAfjvQ5/G1HvD09ERut1s7nfPzc1pbWxM6vaurK4rFYlpOvV6nkZER/v3m5oYWFhaE9MyC8/k8vb6+dkV3dnaWD//dF6Nzcjqd/O/1+/20tLTE/VtdXSWHw/FrGgDoWMPAygDQc3lubo4SiQTNz8/rQugZgEKhQOvr64YX9f39PTUaDR7j9XppcnLSMP7i4oLe3t66ojs1NaVbATMzMzQ6Oqp7Xq1Wi8rlMpVKpS/Hh4aGKJPJUDgc/pHXMwBm0wk7zkr28vKSh25tbdHZ2ZmVNNMYO7oyUzO7kI6Pj+ng4IBfIOwzMTFBd3d3X6Z59jsAmOCTAfAhmUwmaXNzUxshHo/T3t7elxEBoIsAmPTKygql02k+yuLiIl1fXwOAyNRmpwKY02wq2tnZ4aazVdLz8zMNDAxoEFABXa6A70vzarVKY2NjAGDauf8E2K0Atqj4fD/1+PhIHo8HAHoF4PDwkHZ3d/lww8PD1Gw20QN62QMikQhls1lu+vLystaQPyj82gPYLfXg4KDVC4XHtdttenh40HI+b0VYEbKzXjfSt6NrZwpKpVK0sbGhndrJyQltb29bqwArhpnF/K8AarUaHR0d0f7+Pr28vHCbgsEg3d7eksvlAgA7U1AoFCKfz6d77bElZqVSoWKxSJ+f9I6Pj1Mul6Pp6ekfeViGCi5Dzar++3G2/3N6ekqBQEA3FQAUAmDbzmwTkW1HM+PZNkQ0GjUcAQAEAcg8JzEaAgAA4K8DdpaL/+Iy1Eq/QAWgAlAB/NVEO3d8HxYaPZS3Uo6Ygrr4VgQA6DuAHoAegB6AHmBQBSp6o6UbMStzNGLUO4DX09V7KqQIAEJ2qQ8GAPWeCikCgJBd6oMBQL2nQooAIGSX+mAAUO+pkCIACNmlPhgA1HsqpAgAQnapDwYA9Z4KKf7+73tCMgiWdQAAZJ1TlAcAioyUlQEAWecU5QGAIiNlZQBA1jlFeQCgyEhZGQCQdU5RHgAoMlJW5h0DqhjC399QigAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="SsHHCok0RUWS7ODwTELy-4"><g><rect x="530" y="228" width="130" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 248px; margin-left: 531px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Search Service</div></div></div></foreignObject><image x="531" y="241.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="S3Av5TdVFqS_SrXukbwN-1"><g><rect x="180" y="132" width="130" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 152px; margin-left: 181px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">UI</div></div></div></foreignObject><image x="181" y="145.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="V1Wl26Vbpgnno5Lb-wtg-26"><g><path d="M 710 224.6 C 710 219.85 721.19 216 735 216 C 741.63 216 747.99 216.91 752.68 218.52 C 757.37 220.13 760 222.32 760 224.6 L 760 271.4 C 760 276.15 748.81 280 735 280 C 721.19 280 710 276.15 710 271.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 760 224.6 C 760 229.35 748.81 233.2 735 233.2 C 721.19 233.2 710 229.35 710 224.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/></g></g><g data-cell-id="A18w2Y2_AVEIFkgUy5Lv-4"><g><path d="M 766.37 344.01 L 790.06 344.06 L 820 344" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 761.12 344 L 768.12 340.52 L 766.37 344.01 L 768.11 347.52 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g></g><g data-cell-id="V1Wl26Vbpgnno5Lb-wtg-32"><g><path d="M 710 320.6 C 710 315.85 721.19 312 735 312 C 741.63 312 747.99 312.91 752.68 314.52 C 757.37 316.13 760 318.32 760 320.6 L 760 367.4 C 760 372.15 748.81 376 735 376 C 721.19 376 710 372.15 710 367.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 760 320.6 C 760 325.35 748.81 329.2 735 329.2 C 721.19 329.2 710 325.35 710 320.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/></g></g><g data-cell-id="V1Wl26Vbpgnno5Lb-wtg-33"><g><rect x="692.5" y="376" width="85" height="20" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 89px; height: 1px; padding-top: 386px; margin-left: 691px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">metadata-db</div></div></div></foreignObject><image x="691" y="379.5" width="89" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="V1Wl26Vbpgnno5Lb-wtg-34"><g><path d="M 393.5 413.6 C 393.5 408.85 404.69 405 418.5 405 C 425.13 405 431.49 405.91 436.18 407.52 C 440.87 409.13 443.5 411.32 443.5 413.6 L 443.5 460.4 C 443.5 465.15 432.31 469 418.5 469 C 404.69 469 393.5 465.15 393.5 460.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 443.5 413.6 C 443.5 418.35 432.31 422.2 418.5 422.2 C 404.69 422.2 393.5 418.35 393.5 413.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/></g></g><g data-cell-id="V1Wl26Vbpgnno5Lb-wtg-35"><g><rect x="377.5" y="467" width="85" height="20" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 89px; height: 1px; padding-top: 477px; margin-left: 376px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">data-db</div></div></div></foreignObject><image x="376" y="470.5" width="89" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="V1Wl26Vbpgnno5Lb-wtg-36"><g><path d="M 220 412.6 C 220 407.85 231.19 404 245 404 C 251.63 404 257.99 404.91 262.68 406.52 C 267.37 408.13 270 410.32 270 412.6 L 270 459.4 C 270 464.15 258.81 468 245 468 C 231.19 468 220 464.15 220 459.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 270 412.6 C 270 417.35 258.81 421.2 245 421.2 C 231.19 421.2 220 417.35 220 412.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/></g></g><g data-cell-id="V1Wl26Vbpgnno5Lb-wtg-37"><g><rect x="202.5" y="468" width="85" height="20" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 89px; height: 1px; padding-top: 478px; margin-left: 201px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">auth-db</div></div></div></foreignObject><image x="201" y="471.5" width="89" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="V1Wl26Vbpgnno5Lb-wtg-38"><g><rect x="530" y="132" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 152px; margin-left: 531px;"><div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Storage Service<br />(SeaweedFS)</div></div></div></foreignObject><image x="531" y="138" width="128" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="A18w2Y2_AVEIFkgUy5Lv-3"><g><rect x="780.5" y="358" width="108" height="20" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 112px; height: 1px; padding-top: 368px; margin-left: 779px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">metadata-db-data</div></div></div></foreignObject><image x="779" y="361.5" width="112" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="A18w2Y2_AVEIFkgUy5Lv-6"><g><ellipse cx="834.5" cy="344" rx="14" ry="14" fill="#e1d5e7" stroke="#000000" pointer-events="all"/></g></g><g data-cell-id="A18w2Y2_AVEIFkgUy5Lv-7"><g><rect x="780.5" y="262" width="108" height="20" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 112px; height: 1px; padding-top: 272px; margin-left: 779px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">search-db-data</div></div></div></foreignObject><image x="779" y="265.5" width="112" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="A18w2Y2_AVEIFkgUy5Lv-9"><g><path d="M 820.5 248 L 766.37 248" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 761.12 248 L 768.12 244.5 L 766.37 248 L 768.12 251.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g></g><g data-cell-id="A18w2Y2_AVEIFkgUy5Lv-8"><g><ellipse cx="834.5" cy="248" rx="14" ry="14" fill="#e1d5e7" stroke="#000000" pointer-events="all"/></g></g><g data-cell-id="A18w2Y2_AVEIFkgUy5Lv-10"><g><rect x="364.5" y="538" width="108" height="20" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 112px; height: 1px; padding-top: 548px; margin-left: 363px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">data-db-data</div></div></div></foreignObject><image x="363" y="541.5" width="112" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="A18w2Y2_AVEIFkgUy5Lv-35"><g><path d="M 419 509 L 419 489 L 419 493.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 419 488.12 L 422.5 495.12 L 419 493.37 L 415.5 495.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g></g><g data-cell-id="A18w2Y2_AVEIFkgUy5Lv-11"><g><ellipse cx="419" cy="523" rx="14" ry="14" fill="#e1d5e7" stroke="#000000" pointer-events="all"/></g></g><g data-cell-id="A18w2Y2_AVEIFkgUy5Lv-34"><g><path d="M 245 510 L 245 494.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 245 489.12 L 248.5 496.12 L 245 494.37 L 241.5 496.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g></g><g data-cell-id="A18w2Y2_AVEIFkgUy5Lv-15"><g><ellipse cx="245" cy="524" rx="14" ry="14" fill="#e1d5e7" stroke="#000000" pointer-events="all"/></g></g><g data-cell-id="A18w2Y2_AVEIFkgUy5Lv-16"><g><rect x="191" y="538" width="108" height="20" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 112px; height: 1px; padding-top: 548px; margin-left: 189px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">auth-db-data</div></div></div></foreignObject><image x="189" y="541.5" width="112" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="YJRAzF6yD4Hh-bAvO1PB-2"><g><path d="M 420.06 364 L 420.06 384.53 L 418.53 384.53 L 418.51 398.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 418.5 403.88 L 415.01 396.88 L 418.51 398.63 L 422.01 396.89 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 385px; margin-left: 419px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 9px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">JDBC</div></div></div></foreignObject><image x="407" y="380" width="24" height="13.25" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="YJRAzF6yD4Hh-bAvO1PB-1"><g><rect x="355" y="324" width="130" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 344px; margin-left: 356px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Data Service</div></div></div></foreignObject><image x="356" y="337.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="V1Wl26Vbpgnno5Lb-wtg-27"><g><rect x="692.5" y="291" width="85" height="17" fill="rgb(255, 255, 255)" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 89px; height: 1px; padding-top: 299px; margin-left: 691px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">search-db</div></div></div></foreignObject><image x="691" y="292.5" width="89" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="OiuNRKl362wFz-YGv0-T-6"><g><path d="M 130 248.06 L 154.06 248.06 L 171.63 248.02" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 176.88 248 L 169.89 251.52 L 171.63 248.02 L 169.87 244.52 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g></g><g data-cell-id="OiuNRKl362wFz-YGv0-T-7"><g><ellipse cx="116" cy="248" rx="14" ry="14" fill="#e1d5e7" stroke="#000000" pointer-events="all"/></g></g><g data-cell-id="OiuNRKl362wFz-YGv0-T-8"><g><rect x="63" y="262" width="108" height="20" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 112px; height: 1px; padding-top: 272px; margin-left: 61px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">broker-service-data</div></div></div></foreignObject><image x="61" y="265.5" width="112" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="iy0HhJzZLXsiPmpU2ukH-7"><g><path d="M 530 437 L 449.87 437" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 444.62 437 L 451.62 433.5 L 449.87 437 L 451.62 440.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g></g><g data-cell-id="iy0HhJzZLXsiPmpU2ukH-4"><g><rect x="530" y="417" width="130" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 437px; margin-left: 531px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Data DB Sidecar</div></div></div></foreignObject><image x="531" y="430.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="ZFea1dL5_0zV0EoV6Noq-2"><g><ellipse cx="332" cy="414.5" rx="7.5" ry="7.5" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><path d="M 332 422 L 332 447 M 332 427 L 317 427 M 332 427 L 347 427 M 332 447 L 317 467 M 332 447 L 347 467" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 474px; margin-left: 332px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">Researcher</div></div></div></foreignObject><image x="301" y="474.5" width="62" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="ZFea1dL5_0zV0EoV6Noq-3"><g><path d="M 353.37 437 L 387.13 437" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 348.12 437 L 355.12 433.5 L 353.37 437 L 355.12 440.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 392.38 437 L 385.38 440.5 L 387.13 437 L 385.38 433.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/></g></g><g data-cell-id="iy0HhJzZLXsiPmpU2ukH-8"><g><path d="M 666.37 152 L 780.06 152.06 L 780.06 245 C 783.96 245 783.96 251 780.06 251 L 780.06 251 L 780.06 341 C 783.96 341 783.96 347 780.06 347 L 780.06 347 L 780.06 437 L 666.37 437" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 661.12 152 L 668.12 148.5 L 666.37 152 L 668.12 155.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 661.12 437 L 668.12 433.5 L 666.37 437 L 668.12 440.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 174px; margin-left: 780px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">S3</div></div></div></foreignObject><image x="773.5" y="168" width="13" height="15.75" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="ZFea1dL5_0zV0EoV6Noq-4"><g><rect x="701" y="492" width="30" height="16" fill="#e1d5e7" stroke="rgb(0, 0, 0)" pointer-events="all"/></g></g><g data-cell-id="ZFea1dL5_0zV0EoV6Noq-5"><g><rect x="738.5" y="492" width="92.5" height="16" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 91px; height: 1px; padding-top: 500px; margin-left: 740px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Docker volumes</div></div></div></foreignObject><image x="740" y="493.5" width="91" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="ZFea1dL5_0zV0EoV6Noq-6"><g><rect x="701" y="512" width="30" height="16" fill="#e6e6e6" stroke="rgb(0, 0, 0)" pointer-events="all"/></g></g><g data-cell-id="ZFea1dL5_0zV0EoV6Noq-7"><g><rect x="738.5" y="512" width="132.5" height="16" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 131px; height: 1px; padding-top: 520px; margin-left: 740px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Ext. maintained images</div></div></div></foreignObject><image x="740" y="513.5" width="131" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="f61RwCrreTIYbJ5Vt7fi-7"><g><path d="M 65 317.63 L 65 294.06 L 250 294" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 65 322.88 L 61.5 315.88 L 65 317.63 L 68.5 315.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g></g><g data-cell-id="f61RwCrreTIYbJ5Vt7fi-3"><g><rect x="0" y="324" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 344px; margin-left: 1px;"><div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Identity Service<div>(OpenLDAP)</div></div></div></div></foreignObject><image x="1" y="330" width="128" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="f61RwCrreTIYbJ5Vt7fi-9"><g><path d="M 64 386 L 64 370.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 64 365.12 L 67.5 372.12 L 64 370.37 L 60.5 372.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g></g><g data-cell-id="f61RwCrreTIYbJ5Vt7fi-10"><g><ellipse cx="64" cy="400" rx="14" ry="14" fill="#e1d5e7" stroke="#000000" pointer-events="all"/></g></g><g data-cell-id="f61RwCrreTIYbJ5Vt7fi-11"><g><rect x="10" y="415" width="108" height="20" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 112px; height: 1px; padding-top: 425px; margin-left: 8px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">identity-service-data</div></div></div></foreignObject><image x="8" y="418.5" width="112" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="f61RwCrreTIYbJ5Vt7fi-12"><g><rect x="701" y="532" width="30" height="16" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g></g><g data-cell-id="f61RwCrreTIYbJ5Vt7fi-13"><g><rect x="739.5" y="532" width="111.5" height="16" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 109px; height: 1px; padding-top: 540px; margin-left: 742px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Maintained images</div></div></div></foreignObject><image x="742" y="533.5" width="109" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g></g></g></g></svg> \ No newline at end of file +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="532px" height="614px" viewBox="-0.5 -0.5 532 614" style="background-color: rgb(255, 255, 255);"><defs/><rect fill="#ffffff" width="100%" height="100%" x="0" y="0"/><g><g data-cell-id="0"><g data-cell-id="1"><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-76"><g><rect x="0" y="91" width="530" height="397" rx="7.94" ry="7.94" fill="none" stroke="rgb(0, 0, 0)" stroke-dasharray="3 3" pointer-events="all"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-77"><g><path d="M 336.37 137 L 348 137 L 348 331 L 455 331 L 455 346.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 331.12 137 L 338.12 133.5 L 336.37 137 L 338.12 140.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 455 351.88 L 451.5 344.88 L 455 346.63 L 458.5 344.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-78"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 296px; margin-left: 411px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">HTTP</div></div></div></foreignObject><image x="396.5" y="290" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-79"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 238px; margin-left: 347px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">HTTP</div></div></div></foreignObject><image x="332.5" y="232" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-80"><g><rect x="220" y="488" width="310" height="123" rx="7.38" ry="7.38" fill="none" stroke="rgb(0, 0, 0)" stroke-dasharray="3 3" pointer-events="all"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-81"><g><path d="M 265 399.37 L 265 428.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 265 394.12 L 268.5 401.12 L 265 399.37 L 261.5 401.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 265 433.88 L 261.5 426.88 L 265 428.63 L 268.5 426.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 409px; margin-left: 265px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">LDAP</div></div></div></foreignObject><image x="250.5" y="403" width="29" height="15.75" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-82"><g><rect x="32.5" y="589" width="85" height="20" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 89px; height: 1px; padding-top: 599px; margin-left: 31px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">data-db</div></div></div></foreignObject><image x="31" y="592.5" width="89" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-83"><g><path d="M 42.5 428.63 L 42.5 393" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 42.5 433.88 L 39 426.88 L 42.5 428.63 L 46 426.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-84"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 412px; margin-left: 43px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">AMQP</div></div></div></foreignObject><image x="27" y="406" width="32" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAAA/CAYAAAAoosBrAAAAAXNSR0IArs4c6QAADUhJREFUeF7tnHeQFEUUxh+ISDKAKEEBQTIUKskIAorIkXMSYwkKJhRFECQYMICgIjkntQo9wJKoYI6FoIgKCIogJgwlBlDgrF9X9VRvb5ievbkT7ub9dbfb3dP9+usXvtezBbKysrIkknyrgQIRAPLt3quFRwDI3/sfASCf738EgAgAURCYrzEQxQD5evujIDCfb38EgAgAQXmAJk2ayFtvvRWjuOXLl0u7du3SUuaXX34p1apVi+s7ceJEuf3229Ma0+y0detWqVmzZtw4L730krRt2zat8T/++GNZuXKlfPDBB7J9+3b59ttv5c8//xTCqRNPPFFKly6tnnnuuedK69atpXHjxlKwYMHAz0qmm1QDFShQQE466SQpWbKkVK1aVc4//3y1zgsuuCBht0AxwOeffy61a9eOG4jNBwTpSLJForyNGzemM2RMn2HDhsnYsWOzDYDDhw/LvHnz5IknnpAtW7YEmlfFihUVmPv37y/Fixd37psOAJINXr9+fXnyySflkksuiWkSCACDBg0STqYtxx13nHzzzTdSvnx558XphqkWuWnTJjnnnHMCj6k7cCLPOussNTdbgliAzZs3y1VXXSWffPJJ2nOhY6VKlWTatGnSqlUrp3HCBAAPxAqNGTNG7rvvPu/5zgA4ePCgnHHGGfLzzz+rzmz23r17vYEefPDBmIGdVigi9iKZ5JEjR1T3O+64QyZMmOA6VFy7devWyWWXXaY+N8flf1cALFu2THr16iV///133PiY+ubNmyuQnXbaaXL88cfLjz/+qPTy+uuvy9dffx3XBxP92GOPyeDBg33XZeuG8RcvXpyy3z///CO//fabYK1Z/2effRbX/qmnnpJbb71Vfe4MgEWLFqlToGX69OmCed23b5/6qEqVKmozWWAQsRfZqFEj+fDDD9UQKBX/ysLTkWuvvVaZbaRevXoxJ9gFAOvXr5eWLVsK5t8UNn306NFy8cUXp/TtKJ+D8dxzz6n4wBRAcPfdd6dclq2bE044QQ4cOBBIFWvXrpUbb7xRdu3a5fUrUqSIEBvhmpwBcOmll8obb7yhBilUqJB8//33cu+998rMmTO9gV955RXvxLnO0l4koHr44Ye97kuXLpUOHTq4Due1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"/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-85"><g><rect x="10" y="435" width="130" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 455px; margin-left: 11px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;">Data Service</div></div></div></foreignObject><image x="11" y="448.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-86"><g><path d="M 75 481.37 L 75 500 L 74.63 518.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 75 476.12 L 78.5 483.12 L 75 481.37 L 71.5 483.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 74.52 523.88 L 71.16 516.81 L 74.63 518.63 L 78.16 516.95 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-87"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 498px; margin-left: 75px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">JDBC</div></div></div></foreignObject><image x="60.5" y="492" width="29" height="15.75" xlink:href="data:image/png;base64,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"/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-88"><g><path d="M 146.37 373 L 193.63 373" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 141.12 373 L 148.12 369.5 L 146.37 373 L 148.12 376.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 198.88 373 L 191.88 376.5 L 193.63 373 L 191.88 369.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-89"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 374px; margin-left: 171px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">LDAP</div></div></div></foreignObject><image x="156.5" y="368" width="29" height="15.75" xlink:href="data:image/png;base64,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"/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-90"><g><path d="M 75 346.63 L 75 331 L 180 331 L 180 137 L 193.63 137" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 75 351.88 L 71.5 344.88 L 75 346.63 L 78.5 344.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 198.88 137 L 191.88 140.5 L 193.63 137 L 191.88 133.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-91"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 242px; margin-left: 181px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">HTTP,<div>AMQP</div></div></div></div></foreignObject><image x="165" y="229.5" width="32" height="28.75" xlink:href="data:image/png;base64,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G9VXoOnyyy8X1OuYMWPUf1GsCYZ9b62yB7n88ssnWawIlfWVgVdDu+yyi0qKhKisYX7BLgDghC01DFH/JjHpJ554oqyyyiq5azvC58O45ZZbuhV5crnX35YNN4X99ddfXqJ46KGH1Mngzz77LHmub9++gm3E0uQMgIEDB6pqVRDFCr/99luVcMj5QU0UYtRfnCuX9iABFVW0NN11112yySabuHaXtOM+4llnnVUdjID23ntvGT58ePJ7EQD4ilk3v/vuu+QZJuCaa65RGsGHMJo33XTTioKZaDqqo+UtByEAAJ9MPoYo2kkT8hg2bJgbAGxLGssW5keNGlUxgK233lqh3YfsQaKeKIDA+g8huI6ODp8uVdsbbrhBdtxxR/VvEM/k77rrrs4AWGeddYSvRxOTP3LkSOFDqIaQ4eqrr64+HE0sHWiJySefPLXLUACg84suuqjieBh3FHzxxRduADj00EMF61cTwt1+++2VaqQjPSiEhMqeccYZnWVkD5J7c/l6qYgJof75GllvfcicwA022ECVU+OiBE15GuCFF17o5jaFcEu547etra1iOchbCkICAE02++yzV7wbzVC4BGBUYPzptX6qqaZSanGKKaZQssSYOeeccxLBAhS8BVeyB4n65xzb4osvnnThK3xAyPqmjb6rrrpK2SbcsO0CgM0220xYejThS3ONi699kyYD0y7hdzwDrrzHk7IpJADoG5tKzyN/E8coBADHizhmpIkaNea6jwrjFKom4gQ+frI9yBNOOEGGDBmiAimoTcg3JnDGGWco+wTicAQaiqqae+65ZyEAqNBJwQXT8GNZY3kLQWml3h5//PHUpSU0AOaff375+OOPk2Fw3XwhALB4YVAT15VzV61JRJlQm5oobzpgwAAnedmD1JcZ4K8CBE0+MQG0hwYh5VO4LgX/e/DgwYUAwLZhydBERA2NV60nkiYEZPP8888nPx155JFy+umn97gGYGn+8ccfK2SaCwDCnNxIrevU8u933323G6O4hES5NGFsmZWs8pBgA0DfZ8P6NO+88ybvdo0JvPzyyxVFE/TR6EsvvVR5ApqybAAmw7x6nTX7vvvucwKzayP7HRiW5kem+wmpAVgWsdc0sZxRXiYXANxDj1GmCdV6xBFHdBsnahMDQ5eCIdz5zTffqLh4EWUBgOdaW1uT265cYwKEXPEkIPMZ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"/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-92"><g><rect x="10" y="353" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 373px; margin-left: 11px;"><div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Broker Service</b><div><i>rabbitmq</i></div></div></div></div></foreignObject><image x="11" y="359" width="128" height="32" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAACACAYAAAB9V9ELAAAAAXNSR0IArs4c6QAAIABJREFUeF7tnQXUdU9Vxrd0gwLSKColKCldAoogqSChIIq0dIqESkiogAFIS4igoKS0IiggIN3doTQCkt4f6wxru90zZ86955z3fu/77LW+9Yf3zpl4Zs6ZZ3bND5hECAgBISAEhIAQOHII/MCRG7EGLASEgBAQAkJACJgIgBaBEBACQkAICIEjiIAIwBGcdA1ZCAgBISAEhIAIgNaAEBACQkAICIEjiIAIwBGcdA1ZCAgBISAEhIAIgNaAEBACQkAICIEjiIAIwBGcdA1ZCAgBISAEhIAIgNaAEBACQkAICIEjiIAIwBGc9GN8yL9lZo+pjOECZvamY3x86r4QyBD42Gbdnyn54dmbNX9NQSYEtkFABGAb1PTMQSIgArA++icws3OY2bnM7AfN7ORmdhIz+x8z+28z+5KZfcDM3mdmn1m/e0eiRRGAIzHN6w5SBGAdvH/BzP5xh6b40H7FzL48fGjfZWb/bmbPN7P/2qHeY/FREYB1Zo3T5vXM7Jc36+xnzOx4nc1+cFjrTzKz13Y+o2LjCIgAjGOkEhMREAGYCNiWxXclALVmvz18bO9tZm/csm/H2mMiAMvO2CnM7J5mdhszO9GOTb3EzJivj+xYjx43EwHQKpgdARGA2SFNK1yKAJTGvmtmvz/8W2dEB9eKCMBy2J/VzF5gZueZsQk0VFcxs9fNWOdRrAr8zpAM/IUDyTqKmGjMOyIgArAjgJ2PL00ASjceuLHL/k5nn47VYiIAy8zcyczszWb2YwtU/3Ezu7CZfWqBulWlEBACWyIgArAlcBMfW4sAfMfMLmlmr5nYv2OpuAjAMrP152Z260bVXzezf9n4BLx1cPTDLwVHwB81s0uY2XlHuvV4M7vJMl1XrUJACGyDgAjANqhNf6ZFAAjjweZaE+bopGZ2lmFzv6GZ/VCjPM5Xvz69i8fMEyIA808V6wvvfTb0TB5hZvcys881mr64mbHJEymQybfM7MflDzD/5KlGIbAtAiIA2yI37bkWAfgrM7vxhOoIw8L7nw9uJnzITzehvmOtqAjA/DP2S2b2zEq1TzOzG3Q2eerB1n+2Svnbbcjrn3bWpWJCQAgsjIAIwMIAD9XPSQCoEnUrqtia4L2NijaTPzGzOyQ//NNGxXt593e0CDczs580s1MNfycc7PUjkB3HzC5tZj9rZpcZkpecZogdJ178s2aGTfhVmzKvGP5xOuyVXQjAxcyMcWbe7W8Z+k0fW8Ip9spmdgUzO6eZMTbw+eJwin7HQNCeO4y1Z1xXNzM0QVGI8ji+meHkiWDeuauZMQ7aBeu7mNkf9TTSKEMdD678fsUNLi+bUP91NmvmGaE8/f/ERgPw5Ik+Kozz58zschvtAg6KjBktBY6FEF1CYZ+3MUG8uLHeY9d3Xf+3N7NfreBxDTN7zgSsHr7Rqty2Up41wRoqMlcUwIk37x5zCq7g+8NmdtphLX3ezD48hG+CK/Ne1t6EYX2/6BLvyjb90DMVBEQA1lkacxMAeo06Fm1AJvz9C5Xffm/zUt8n+Y0wwgsOf3/0ZpO+aVKmRQCOO5wUf3fYGHuRJW78QYP6+JsdD21LANhA2DAy7QgfVz6GEJOanH3zA9gRG8/GOybkbbi/mT20Y3Nig4OYZHLKIdEOpp8nJm3PQQDY/KknkwuZ2X+MDdb9TtIgxs1GQnIg/jHHNUKaVQ0RvV9DyxWf+dAmT8adG1oMX37X9c+GiQYuk8dN9MgHI9ZlFEgyHv/+fdiVADAvvNOYG0/fOZ/vHXCdQmqoesl3pbPrKtaDgAhAD0q7l1mCAHACgrlH+drgM1Bj7rXTHlnceHF/Y9iMs1HXCACqX059XoMwFbV/G5LOjHmKb0MA8HD/VzP76aRTnNzRWLQ0KqRafcqA6zbjQmPQ0iyAK+QkkzNvTvj0Hw0FH/EocxCA2qZIW2waj5066C3L8z2672bjg0RuIzgycqJunVp3Xf+kmv7koI2Iffz0sHH3nJpbc47PRXTI3IUAoDlBw4Sz5jbyhEEb2KOpW/pd2ab/eqaCgAjAOktjbgLAqYHTQyao7VDx1YQEL5kdlo8Xjoac2Nh0MskIAGVR5c8RPoaaGN+GVuKYqQSA0/o/mNnVkgFxwmJuXt7A69fMDD+NnlN/rRo2d8whtVPwTw0bfPb8uTd/ZIO+bqXyOQgAPih85DP56ECQauttzjeopnma0gZrG1+DJdf/IzchjbeoNMD67YnCeUDDHMJG/epQ/7YEAI0F5PcnpoCYlH2WmV17hFyt8a7sOAw97hEQAVhnPcxJAFC1/+0mZvtala6zUUQbrC96840K8FHJs+R0Z3PF6asmkQBwIiU07KKNZ9hAsPdjt8U0wWn7Rxrl2Swp841KmakEAPv4nSp13WiwS9e6w+aLz0PmHU9YHDiS4pmx8aHFbkv/sNtHQS1ei/bAl4D0zpkwz3+3ORkz75nMQQBw2oP41YTxkWgKksA6WUKYC4hWJpy4sZejJfrqEE1A+V+slMe+/dLKb3Osf8gcpDeTP9ys3Xt0APTOSsTE+yub9TYEgO875go0UJmgqYAcvG0zv5TlMq2LNPqOmeWPK7+v9a50QKsivQiIAPQitVu5XQkAGxAnbU4Xvz0kVcl6hDMUbbVUkDj2/WXyMDkE/tmp8fno8xHF1IAdmvAunkUVXaR1isEH4Zab5/4maev6Qx+4VCYTQs6wAWcyhQAQd15TX6Nmpv8tgdxARqJgNsDckdnGLzU4peFs5QVtAxn2sKtG4aKdd1c6QjpdNjQEDQJzgk0dR0a0LhC2OVT0tNPSHNE+my/aEv6BDYmDetTCIzB/z4kSrU+2HlC543CZhSBC7DIHSDZRSBVOlFHmWP98N9GIoDGLwmaKRqclbJY4i2byBxUfnW0IQGv9Ux/3PETT02UHjVlx/PV9xLwIef/PpONrvStja0m/T0BABGACWDsUXSMREB9l7G9cGNSS1gZansOWCttvOW6Ri4CPIPbpKGwKfEg4sdWEDZTNLFuDfGD40PDBidJLAGifTS07jXOdMBtBS8hcV0tfi/o3I1Glvpqd+SGDF39sF/VsRgx8OU6chONhJllC2LTQdmR+BrX2mB+eQV3NSfKVG/U7nuRTpYYXpJR+1TZL2uGES6rhKGgHSGs8Zf2Usj3rn7nkHckEYgZJqwkaAjRCmUAGs7UwlQDwXoFblpcBYoTW7g2VPvyKmT298huaIExSXtZ8V6auLZVvICACsM7yWJIAoDpGLYcHco/z0RgB+OtGmJNHq/URy5yYMqSf2ogxxxkRr/cpH3BUmJwY2VC5iS5LmMSmgKo+Ox36tiAJYBUFgoW6HxNATSBFaFBOGAqgyubUGNseIwBoBzC/jJG7XVcz+QDQKEwhAb5NNmy0IoSQsYHUzBqxn2x4mY0agli0H7Wx8TuaryiYydjIpqwfyvaufyJmahsooYKYLGoCsWTTjMJpvGZOm0oAarjQJnNDNEtLanOCBvB84cE135Vd17iedwiIAKyzHJYgAHxscW7jg8VJdyx+vYy0RQA48WMPZqMaE057qLszwdu+5VVfnml9pIgZx84bZUwDQEgYTliogKPwwUYz0GPHfs8QFRHrQNOCSnpMaipRNo54c+MYAWBj/vuxBmf6nf6R0S9+5Lepno2ZE2NLE0S4W02rwS2XRAW0BFMIaz9qejDT4HMSSfFc658+QXCyddZaIxDAmpMrEQx/VhnsVALQCu3sWU/kOsiSjfHdwfTiQxTXfFe2WYd6poKACMA6S2MJAuB7jsMcGwTx/TVbcinf+gBycsu85SNK2Lex8WcnRWLpa1EEsR6eZzPO7ppnI88yyrX6zykZJ6zMlk19fNDGwgzpI2FTmZ2T3/BpwLdhTP6iot3ALssG66VFAFCpo3GYw9Y+1ufyO98FPL7xN8EHYpfvBBswyXe4pCrL80A7nNYzoX20RGOCL0IWT08imujcOMf6L/3hfYvqcH5jrgjRzXJx1KJweOZMg89NNt6pBACTTC3sj76hoZpD1n5X5uiz6hgQ2OXFFoj9CCxNAEpPIALED7ecwlofwF6PclTtteQwnPqu1A9N9RRFFVlGw1b/OXXjoZ0Jcfwk0+kRkgLFMKye53rKcMKL2d9aBAAb91V7Kl6oDGSO9YvWA+1JdiVtT9Ns5ISJRbn7QNp66phaBic3wte8zLH+S30t500cXTMHWLQDZMmMgmmqFtVA2akEAK1I5lQJKaklEJuKL+XXfle26aOeqSAgArDO0mgRAD5QdxvpBjHoXNjCKYfMbIT68fGpCR/a2smp9QGM6Udr9XPCxuyQydRb32qqcuo+Y2KOGPNhqPWZkyinWU5GY0LYVOZANvZcz++E9JEu10uLAHB6roUx9rQ3dxkc3NCkoG3hhAkZzDQ4Wbs4XmIv9kIWSNIbLyFoENDEeJlj/fv6cILknYyS3aGATwr5NjK8cPBsheBOIQDUX8uqiW2/9e2YOg9rvytT+6fyDQREANZZHruGAcZeEhPOpvDAinqWNLSozzM1X+sDiE2/Z4OEgGSnG/o5logljqXmxU057jx4+4QP+NhsoirmYz3mAMjpDd+KJSTTkLQIALkDah7jS/Rvap0QUzQDnLaxG0fHR18ftn6uD/abE9EUYxEZU/tUyuOoikmolwD0rn9fXy0UkZM2qnZvuuF+jcyxlfeVFNWEWdZkCgGgXcJ3M+EdOP+2gCbPrf2uzNh1VSUCsM4amJsAlF6jTuaUk0ktlr5FADIHtazuVpjQVAJAIh3wyYSLiEiY0vsB75nNMQ9t6miNr6eNVhmiE1CbemkRgDsO9wns2u4az6OxYUNvmSxQf5NvoggRIz0+Fdv0H+0CJobe9dO7/n192O1x6ssyRWI28VkmcdrlwqAoPVd4TyEALcdKnHOzlNjb4HsQ78q2/dRzCQIiAOssi6UIQCuDHNn3siQ2Y170hNGNyZwmgFY0AaeieJLpMQGQUpYwq3K5kR8PtlFio1uRDj+/UXO/qALCVIIzhiW/twgANzc+rKeSPSnDRvjCRvhe9OxvJZPq8VafOuw51n9sE0KDFiQK81Zu3iy3GMYEUTzDequZ1EqdUwgAvjNZDg3qqmUanIpjKb/2u7JtP/WcCMCBrYGlCAAEDse/zKaIt3vmsDXHBxAVYgxlK+BOdQIkYQpq4SjY7IkSiN7vrf5zixq/c9JCnQu5yGQs1rt1UQvpcH9z5pW0jwQAVf6UG/w8JK3bDbHJe61V6ypiVOacjueUOdZ/7E8tvbC3t5OkKwvlrOWGiG1MIQA8CwHIrr0m6iZL3rUtxmu/K9v2U8+JABzYGliKAOALAAHI1I/YE7HPRpnjA8iHBRtnZu/FzotatEf4EHEizzRR2P7xAZjS/2jDJeFJlgyGOslE2LqCl/C7rF9k5GODm1MOkgDg5Y+phfS0/Cv/m9juS245yFasOxEq/qppHE+5qS6TLOvcll36/mNzrP/YB5z7INxZ1skSiohzLMmtovQ6eU4lANj6a6p+5rx19fUUjEkTvua7MqVvKjuCgEwA6yyRpQgALzgveiak6c1O1nN9AFve+6RvJSf6mOANX7u4KJ4US11T+k86YZK1ZCch0qSiyah5S9cuayHBDE5WtefGxpz9flAEAM0RXulZxkT6ia8CPgtTBeKACSoTEvtgBihCjgP6kAn+IVma36n98eWnrJ8p7ZBDIwvju9VwaRQnfUxaUXr9DqYSgJZvBc6aY06upLsmJXImnPq9BnDNd2XKnKjsCAIiAOsskaUIQOtaUtTfWUz8XB9AQheJQsgki3XPypHqtZZVjw8/G0CUqf1nw6ndwscYyJiWScs7vSdckit2UcOSUAg/Bv4RlUEmtSgHRQDoBzfwZRkX+Y0PO5v51Pz+kLoY6ljGnKn1SV6Vhaah3cKxENNOTbi0hrS2BePy3ywJD3VMXT+9Xwg2VXJNREG7wRokXDAKJJQLonpkKgFoJVjqSfhFv1nnUdDYQYD9bZ1rvis9WKlMJwIiAJ1A7VhsbgLAvOHNzh0AtTnE+xkv6ChzfQBbN7jxcSBGvJYrnT61rn/FU5lUtNndBlP7jxmEDSYzS2APxSGQj2uU1gUnaF24NrV2ZXHtBMzmz6k6XjJ0kARgLJELdmxU9rXrbz1urAnWXC2sD63J6ZOb/bhUh8t1MoHkcoquCbc6ZjdHQgTQgEVnuKnrp/fVZ53RZrw6mg0TNX+WMTALU6y1N5UAYI4g+yUEKgrvFWYstHiZsPbR/GSmRQgj5NbLmu9K73yoXAcCIgAdIM1QpEUAYNq1E6pvmg8L6lISr2DXzuzjpTzOW0QIYAaIMucHkA8vH+BM+BiyyUdvevwWyITHRpHZTKmL0yMJczLZpv9kAKw5k2WJeUq7rXSqOBryIcQk4AU7Oo6QWTrkmlbmIAkAfX/m5ppnPO5bwiUwePdj2kGdjY8JTprYgEkOBJFAa9NyMMuS49Ammek+WvFZ4XdMBuRCiNoTcg+gys5SUteu1d1m/fR+AsiNQY6MKGgwTh3+yCZMro7sHc3am0oAqIMES9khgN94P8EvmmpI8sQ7kREH8mdAzGNuDupb613pnQuV60BABKADpBmKrJUKuHS1lTxmzg8gH15OhjGu3UPGxsEtZyQ7ISoBlT/5w2sSncRiuW36zzontW/tpjVSF2c3yuHLQN8zHwL6xYcdIvC+YeOjPHZgSE4UtAXYe7OP50ETAIglJ77MZ2SG5f+9KjB/oO6uJahBy0D4Zk3A+LmDsx39JcQVLUwmaC3YqHa5TnqbcbccGmN9nL6z0MFau9sQAAg2pLO27svGjUaLzZ312XL8xFxWy1q61ruyzbzomQoCIgDrLI01CQCe76QCrl0es80G2kKJky4fs+zinqno4pVPatFW+Nm2/YekcCtdtubZMPiAZe2izsbGuYtw2iN0MMsCR70HTQDoA5szJ/zei5ym4AFR4pKpsfsVOM2TWW4XwfaPervmHLvt+unpE4SYaICeXPtZWuRWG9sQAOrjvWTdY3rZRdBu4OeQ+bCUetd4V3YZg54NCIgArLMk1iAAbPgPHTKftV7SJT6AqDdRG+4SHofXMn4NY971u/QfJy0+YpnUMidSlmcI48pUzWMr6OtDprva5r8vBIB+4NyFjRcSNpegWcDxb+yWStrD5kzyHG7M20YwI6DWjj4Wvq5d1k9Pn9BgceNjSyCabMg1R8Xs2W0JAHVxhwgpt1tmw1Z/yX3B5t5zI+XS70rPHKhMJwIiAJ1A7VhsSQKAapmXGztpT+jdUh9A1N7Y/PEJIPa5V8iihr22FpMf69ml/zgCEt8eHbVoA3UxMfA4TmWChgCfh8wzujZWohiww47Nyz5oAPwYUE1zfS/mmt6LfvzzEFBOnWRNrF3121ofaAvwnEeN3yO8A2y8vAOtiAHq2mX99PSF/BIvGynIBWAQlSmyCwGgHZwUIdjcXdCjoeAZohRI2tT7bpbxLPmuTMFMZUcQEAFYZ4nMQQCw0X15cDrjpIOKk9Ci5yRe1a1RLf0BZMMg/JB0wdhpcSZCQ8CmSzgZH2jsuWz8pD/F43+K7Np/NgkSzGSCjXlsg4ck4OzGhx6igz8DjnA4xX1u+Giy+aERIQdBj+wbASh9xqsf/whs7URLnH0YK45+Jd0svh14upPREf8GfD4gPrXY/h48KMO3iXVEqln+C3kDa1Lp0iaqdtYOufbZUGu+BbG9XdfPWP/RYrBZt65N3ibF8a4EoPT7FMPdG7yfxPOj9eH9hMDzfpIq+DWDvwXvaBaJM4ZB+X2Jd6W3bZXrQEAEoAMkFRECQkAICAEhcNgQEAE4bDOq8QgBISAEhIAQ6EBABKADJBURAkJACAgBIXDYEBABOGwzqvEIASEgBISAEOhAQASgAyQVEQJCQAgIASFw2BAQAThsM6rxCAEhIASEgBDoQEAEoAMkFRECQkAICAEhcNgQEAE4bDOq8QgBISAEhIAQ6EBABKADJBURAkJACAgBIXDYEBABOGwzqvEIASEgBISAEOhAQASgAyQVEQJCQAgIASFw2BAQAThsM6rxCAEhIASEgBDoQEAEoAMkFRECQkAICAEhcNgQEAE4bDOq8QgBISAEhIAQ6EBABKADJBURAkJACAgBIXDYEBABOGwzqvEIASEgBISAEOhAQASgAyQVEQJCQAgIASFw2BAQAThsM6rxCAEhIASEgBDoQEAEoAMkFRECQkAICAEhcNgQEAE4bDOq8QgBISAEhIAQ6EBABKADJBURAkJACAgBIXDYEBABOGwzqvEcNAI/Z2Yvdp34kpmdysy+u0DH7m9m93D1PtfMrr5AO1T5FjP7KVf3zc3s0Qu1pWqFgBBYAQERgBVAVhNHCoG7mdkD3YhfYWaXWwiBfzSzX3B1//7mf//eAm2dyMy+bGbHc3X/jJm9foG2VKUQEAIrISACsBLQaubIIPA3ZnZdN9qHmtkdFxr9p8zsdK7ua5jZcxZo6yJm9lpX7zfN7ORm9j8LtKUqhYAQWAkBEYCVgFYzRwaB95jZ2d1ob2hmT1lg9Gc0s4+Hes9iZh9boK1bbIjGI129bzaz8zfa+VEzu/Hw+xvN7NkL9ElVCgEhsCMCIgA7AqjHhYBD4GSb0z42f/9e/eRGI/DOBVD6RTN7nqv3M0EbMGeTmAD4VwQNwH83GoAsQBqQ3wkmkTn7pbqEgBDYAQERgB3A06NCICBwaTP7F/c3NslTmNl3FkDqXmb2B67eF27U9FdeoJ2pVZ7azD5qZiceHsQp8qVTK1F5ISAElkdABGB5jNXC0UHgtmb2cDfcfzOzSy40/GeZ2bVc3Q8ws99dqK0p1UZi8kNm9vkpFaisEBAC6yAgArAOzmrlaCDwRDP7dTfUPzez2yw09A+Z2Y+4uq+9CdN75kJt9VZ7QjP7sDNFfMDMfrz3YZUTAkJgXQREANbFW60dbgRwjvtpN8TfMDNIwdzyg2b2uVDp2TaOd5CCg5SbmNljXQeeESIiDrJvalsICIGAgAiAlsQ+I8D6xI5e7MnY0k8yhJ8d18xuaWa/aWbnHpzUesLTzmVmV9sk67mEmZ1zOK3ivEeini+YGV78rx489986ARxOv8TKH989c74hgQ5/urCZ/ZqZ4SfwY2ZGm18ZvPb/2cwe48qONXuFYFdHxY6qHTnOJj7/qmaGRoBY/TMP2FDmvUOSokdtsPv0WCPD70/dYHIDVzZqNaIpYqxaMAfjIjGXAX1//vAjGo5bm9nPD5oEMIb4vMnM/noTbUHfvl1pkNwLrA1MMERMsHY+YWavMrNHmNnrxjqa/I4/x6+aGfhf0MxOM6zNL5rZu8wMPwzm0WNLwiTwLvLy4fktmtcjQmBeBEQA5sVTtc2LABuAP9XyvznpsnmS9S4m2CHkjA9zJpCEPwmJc8Z6y+bGBkS8/ZiwwftN5WuDA+Aphw2ADbklEBA2ptub2bdGyt7ZzB7iyuBkh7MdhAONQytEj8e+ama/vTEhPGFsUGb2djMjkqEIp/zHu/8fTRGtKiFI4OGzIr4vmAnOY2bvGHD/YzNj068JRI1oCO9jgHaE/l1zZGxTfCYgm2B+z2HttaqG1N1qM6YnD4X+zsx+2T2Aj8T9OnBXESGwOAIiAItDrAZ2QOBKw6mqVPGSzemcv5HshpNiFE5fN0v+zmbAaRHtwVTBjn3Zjvh62v1LVzkZADmBsjlDWnqFky2nzJZQ5vquABkAIR+o3KeMkT6DWU3QvLBpswEWgWBBtBC0Dp/tHdgQIQGWRdjc0fCU+jmln3TYbO/bWe/LNqf6Kw5lOZFzwvYpi1vV9KQzBs9/GAhWZ5e+VwxtD2uOiAi0MEXQHtBHiRA4cAREAA58CtSBBgJ32py4/sj9zgn5bcNJmT//1/AxZRPiI0sWPjZHLxfbaApQsceTJBsH6mfU0WxyhK+hmmfTxkzghed/dmSmfOw7RVH7XmVzGj3r8Bwn6b8fnOSI2ac90vheJ+QNoDibO2OpCXkFfB9J/8udACcYTtdsMBAPEgWRlwBNCtkJMXt4+fpgPqn5DmQZANG+fGOohNTAbLrIL5nZX7jKcQYEey9oRVCXF8FfAr+JIjxzl4HI8DdMMMwn6nVU/WzsmH38hko5SOE/DWvhUoMGheRDzO8nB00M88fc+nTGaHZIWlTLaIg55QVD/X4c7x/uQSDKg7mEJKB9IflR0UqBO+YePz4IDvdCsN4kQuDAERABOPApUAcaCPyVmd3I/U7cO6F22GI5If7hSDpaPvacVs/r6kD9zWb1okq7fPQ5UaPu9cLJ1cf4x8dJlcuGWYR22BjYhNkYarHwaDI4YfpTNhfvsKFkwgmZzYV+xrbYkMCLDSoT7ijgrgIvf7pRod+uUj5qNVoZAB+0MS3c1dUD2QHnlpAl8UmuABv96Qc1+x0GQhEvUfrhIbFS8XngcS4lAhPU9O/eEIbrDX4CsW0iNKJTJhs22ppM7j6ssYgXxLRmpvGhoG/YmKou5B7GtIGJQyIE9gIBEYC9mAZ1ooIAm7e3Z/Nxx4ms17ueOHns+F68k1kNeDZXTtnncAXYPMlqlwmbN6e64qxYynDq5+T5nyMzzAZ201CGkykn4iic4v81+TvqZohGy3+AfqJB8dqD4leRdTFqNdg8wT4TbkDED6HIvQeS1ho6Phls9F44JeMvAYGoCUQQW3oRTuFoInByvMxwKq89CzlC01OEDfvPksI4DuKf4OcUu74npLU2Im6lXO/zLcz0mxCYDQERgNmgVEUzI8DpHYeqqLqfcrkOtmGux2XDgziw2XkbdKvL2PO9P0HLNo+GIUYMcCLFMZBNaUxQW78yFMI0gANZFJz34oYFUYIYoNIfEzQb0b7OqTojKTjZeTU+mgI0BpmwCZ/W/UCkhU9VnD2D2j46cuIg5zf37DnMGdFEwtjRwIxFbuA86v1H7hMyKpb2MGfgzFcEMxN3PPQkNTqJhjNgAAAOqUlEQVTTxtzwkaCloR7IzsPGJki/C4G1EBABWAtptTMVgWgf5nk2cDzSsSUvLfF02iIAUZVN31BH48XeI6j1ITteiD7A5yHK4wZbtv/7lKt58UsoYXaljuJ57+tEC4JWwzsVcrqORIVnsMnj7OaFv8XLiuJYCOnDa78ImyZal7FbBjEtxKRH+IrgPzAmMWyRZ7yfCc8zH/gOcONhkRpRqLWHGSc6I46Zkcb6rt+FwKwIiADMCqcqmxGBzF7b47U9VxdQQftQMk7dqIszQStB+F4RTos43rUuzIn14DPg1c3ZxsQz0SyCLwPOhL0SHft4LiMQaE38JUbY4nFgQ7MRhdO+v4a452IiTBwfDBXV1PGxPTQR/iRN/gdO3WOmFuqJvhqsM++HQBnU/PifFMEsAaGBFPQKTohon4q08OutU+WEwKwIiADMCqcqmxEBPvDeOY2N53Sdau45uhHj00npSxKcTIgS8KaFKWaKUh+e9T6JEKp+71VPObz8OZXz3yLXCJvv2NhJjEMyHC+YMPBX8EIkgo+owHb+E5XKY/7/HlIS/TPwXcDu3rOJRxs7an2/2bYwIAoBJ9IimGlw1vMSY/fxucBMM0Wevsln8CvuAdaTvyZ6Sl0qKwQWQUAEYBFYVekMCMRNlVOaz7M/pQlO1sRf45HNyZb89Kh3CWlDxe098Eu9JKzxcvkh1Cy2yzuEXdiXr5Wt9ZlnyULoBYc+fwrlN2Lw/WaF3ZtwQrQHvQJhIOrAS+ZwGL362RTxS8gkqtVbDpPleSItcBQs8u+bsL2Ldg4i+iZkZCmrKiaW4mTPGvAmJdYC4aVoO4psk7yHnBUlPwH1/G0gBJ1DVTEhsBwCIgDLYauad0OADdFvqqhlS3a13ppx/CNGntPhlAQ5Wf21W+0gE5zuiqCpYFMey+bn24h18Ft2jW7MtU+MOpnwpkisA9X0iVxsf6krevVz0yDZ8zJBlQ+JKIKTHkmJWoLJANNBkVY4oq8H3wQwxk5fxCcnarUZyQ8mDp/lkGcJvyTVsBdSEbOhT5FoqiFPA2GrEiGwNwiIAOzNVKgjDgHCtGIsO+rnWnx7Bh6nS05uPvHLtiCzwfnQMV8Pp2K/2eHZjgZgirDZs+F6wRkuRhBEz/SpjmnUf/8haVBpi/z42M+jkM+e6IAiOA+SWCcKJ+XoGZ/1PT4XM+T1EjxSOhNPXwSHQbQ5+AGMSdQ6EDpJxj4vJAvC0bIIBAlC1+P9X56BpODU6X06rhyyWo71Vb8LgcUREAFYHGI1sAUC5E73IXD+spue6rL4cp4jXS7hYziCsalTL2r0mGzmKSEdb0v9zanY5wfAdyHGto/1mdMhG3MRVNJsavGiGxL9XNyVw0kRZ7MpEk/2nGw54XqBEHws/A37fOYER54Dn9o2y/cf+8eGiprdCx7z5CgYE9IkMz9FMIlgx++RGAKYRWrEtQMJ8/kgetqJDpQ8g/8KzpESIbA3CIgA7M1UqCMOAeLUfSa+KTeoYXeN6lo2LvwHetW4pAf2Dlst9S03wJGKtsg2kQox4uA1YaOn7kz1HW/W61lEMfQus9djVvAx/GgDyNCXyR1DuCNhgoQLtiTOUY3wZHUQWkmbRbh+OCZRqrVNWCJEpkiWl5/wQp/BMCNIYzjHCJaalmWsHv0uBBZFQARgUXhV+ZYIsPl42zYffU5rPRJPyZzwcf7zauNWPcSlE8bn3w3C7Gqpg6OqHO1FzD441m9O214Nn403qr6pk5M0G3qvQGr8Vbw8lyXswd7vb6yD5KDCzgS/DK9G77HlE+L4YFcZGpl4b0BtTJBBfy8DyXqIChgTzBnxCuTMryM6GD4tXIc81g6/4/Dnb38k70J2eVVPXSojBBZDQARgMWhV8Q4IxJMaat94yU9WPZsotmW/rqeQB+qM5gf+VsuUl6nKp0YAoPomaYwXTshcVuQlqr75DY91PNl7hVBGn8kP+zkkIuYriGFwOK+hBckEtb3Pb9+TpjneZsjFSVzy0yOYbbyHPiYRNCZjAonzPgy1FMhxPK38D1mbhGhi3vBJhHqyG471X78LgdkREAGYHVJVuCMCpJONtlI8tX1SmloTWZY74rez3Pm1OjjxcZlMEQhFudEvPsOpDruyl5a2IGsTZ0Wc04qwwaFuLzfulb+TrY5LaLzgvT+WNc+Xj6fnWhRBzIFQ8+qnfZzdfBgldzf4G/CyMaONQaNRZOxa4lIuOofiI0FMf08YZPSzqF1WFMeOT0DEvbXEfyu5YnkbrdCOr5EeFwLjCIgAjGOkEusigEOaV7fzcec01XPS5fT5+NBdTunYYHuEkywhYD5ygJh5ktZkEjdvynCS5UTbI2ycHwgEA09/4tqjxM2b39lEuUGvR3Bko6x/57P7BthQCcH05Wpe/WQQJH6/CJ74hOe1PPIJxySMz5OG3lTGqNVRrxeZcrte1GrULiuKGoAp+ScYExdWEdbp5WxDGuueeVIZIbAaAiIAq0GthjoR4LpaHNOKYJON99jXqiJ5zhPCj70EgCx8qN25w91LK9QuOu/xXIswxH7jMOjJAtEIxKFnF9pE5z3qIv3wwztxjZoNzCycqKOmgfH7a49bXv3R2Q2C4U/2Wdew9TOnRSALELweTUYMYczC+GpwxFsAa7dCRqLFXHAvRY9E51WegUz5+w566lEZIbAKAiIAq8CsRiYgQJgeKucitRNxVmUMSaMMp/eY+S4+y3tAaBnpb9kQ/Q2EnDrjxTPleezIZJfzgloap8MxNTiJc14/2ODL8zWHsyxvPs/QPj4E8SKhOD4c/QgX9O97LVrB32dPPaQNjqSo1B81ID1k7RbBaQ+c/JXPraWCDd/fe9B74RIJpTCt+PHXiGHMgEh/IGXRTyP2EzU/2on4Td0mL8SE10VFhcD2CIgAbI+dnlwGAVSoPu6azHVRrV9rmY2bXPLeAYs4cTQI8aRb6uCSF7QGON7hmY7939v8azZ97p/3eesxVeC7wGaNWp/QQJ8h0PeZOHEy4flQQ06KbDTciBclJhvipE0IIO8vmyI552skgCyInJRJeVsEr3t8I7JshWCNKaUI9x/gPJjJQ0J0BnhAiFq3NcZrlp8Y2mutqk8N8fSlTK/DZSSGrcuKcCokksQL+SNYH9lFSCT7IWoCHwPmg3Xgs05O9SFY5q1SrUIgQUAEQMtinxDAfsxHlpj3Ir1pXkt5PK75IHvhFMbJtiSawVObC3AwGaDGxu5NghxCD3H68zHvkAOc1NgseV9K0iDC4nCiK8LpF+92vMYRNgJi1NmgqRMTAyp3VM949PsLffBvQNOASSGTeCrFKx+SxKkTQZ3P1cHE4OOBzmaPZgBNSkzygymBxDnxJr7Sbkxh2yJg0bGOOnC45CIccCJ7I6TK+2DgM4DNv0jvDYDE78frhWvpmSOGMVfB2GVFr0hyGZBLgvlEE8B8oUHANAA5KymrmXvWkM8ayVXRPnFRZYr1ZyGwPgIiAOtjrhbrCHBS9x77nNo5zddO71lNeKaz4Wdx5ZxQ2cjZ4P3ax+5LnnhO0Wyi8eY37OCEyrHJYudFovobWzze4hCJKamA6Q/pZ1v3HES7NGYNNlJMCGeYsKAYP2mHa+YJSAoYeHLSImBc3tMKwYMEQOqKRgAnObD0KXJ7ozRixEUtjC+DI2Z2bIU18jxaHDRHEIxeefSQvCpGsOBY2puDorctlRMCsyAgAjALjKpkJgRuHa7c5TTKBjRVOJHhvT12RSwOaOQJwNGvkAxOzfghZOJv6CO5C2GHRW6wUctjw4ewoNb22eRq/SfigCx2bOQ1QRuCecCbNUpaXrQA+CegzRgTyoFvTIbjn8MWD+ZFwAdtQouAxZh+X18MoWQz9Ol+OUkzV2M+DNQZCRfJlooGZGzsMewQk4mPJsiex0yDRob/tgRCg+MqyYiiVmhKhsOxMeh3ITA7AiIAs0OqCndAABUrKuciXMpCXPW2QqpX7NmXHGzHnEBRgZNT4KUDSYg572mLEznhfOQf4DSMAxm+CfyNDYz3BlW7PyHGK3WxO3PBDTblswz1sJGzKXJqJizN59CvjTHeThdPvoQs4ryICeECwzg5eTNO8tjjxId2oSdcMEZR9Djo0f5dB3MKGLDpcQoGJ0wkj3EDI2Og13SA6dgGWx6PERe9V/RmYYf4XtT8M/w8MDbMNWhccOzE7wMyhDmAqAJIFf++ODxE+uqiIeJPUzIcbrvG9ZwQ2BoBEYCtodODQkAICIH/g0C8R2BKhkNBKQRWR0AEYHXI1aAQEAKHFIGYa6A3w+EhhUPD2ncERAD2fYbUPyEgBI4FBLIMir0ZDo+F8amPhxABEYBDOKkakhAQAqsjEDMoEt2B4ya3UUqEwF4iIAKwl9OiTgkBIXCMIRBvWpySQvgYG6q6e1gQEAE4LDOpcQgBIXCQCBCxQvRIkSmXCB1kv9X2EUZABOAIT76GLgSEwGwIkDjI56yYclHTbJ1QRUJgCgIiAFPQUlkhIASEwP9HgHwBJDPyl0hdNtyqKNyEwN4hIAKwd1OiDgkBIXCMIcC9C/62QBIxnapyedAxNjR19zAjIAJwmGdXYxMCQmANBGKGQ/IBcBGSRAjsNQIiAHs9PeqcEBACQkAICIFlEBABWAZX1SoEhIAQEAJCYK8REAHY6+lR54SAEBACQkAILIOACMAyuKpWISAEhIAQEAJ7jYAIwF5PjzonBISAEBACQmAZBEQAlsFVtQoBISAEhIAQ2GsERAD2enrUOSEgBISAEBACyyAgArAMrqpVCAgBISAEhMBeIyACsNfTo84JASEgBISAEFgGARGAZXBVrUJACAgBISAE9hoBEYC9nh51TggIASEgBITAMgiIACyDq2oVAkJACAgBIbDXCIgA7PX0qHNCQAgIASEgBJZBQARgGVxVqxAQAkJACAiBvUZABGCvp0edEwJCQAgIASGwDAIiAMvgqlqFgBAQAkJACOw1AiIAez096pwQEAJCQAgIgWUQEAFYBlfVKgSEgBAQAkJgrxH4X1RG5/mv+sEgAAAAAElFTkSuQmCC"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-93"><g><path d="M 336.37 373 L 383.63 373" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 331.12 373 L 338.12 369.5 L 336.37 373 L 338.12 376.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 388.88 373 L 381.88 376.5 L 383.63 373 L 381.88 369.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 373px; margin-left: 360px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">LDAP</div></div></div></foreignObject><image x="345.5" y="367" width="29" height="15.75" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-94"><g><path d="M 265 346.63 L 265 153.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 265 351.88 L 261.5 344.88 L 265 346.63 L 268.5 344.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 265 148.12 L 268.5 155.12 L 265 153.37 L 261.5 155.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-95"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 238px; margin-left: 266px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">HTTP</div></div></div></foreignObject><image x="251.5" y="232" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-96"><g><rect x="200" y="353" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 373px; margin-left: 201px;"><div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Identity Service *</b><div><i>openldap</i></div></div></div></div></foreignObject><image x="201" y="359" width="128" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-97"><g><path d="M 455 428.63 L 455 411 L 342 411 L 342 376 C 345.9 376 345.9 370 342 370 L 342 370 L 342 341 L 297.5 341 L 297.5 153.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 455 433.88 L 451.5 426.88 L 455 428.63 L 458.5 426.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 297.5 148.12 L 301 155.12 L 297.5 153.37 L 294 155.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-98"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 216px; margin-left: 298px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">HTTP</div></div></div></foreignObject><image x="283.5" y="210" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-99"><g><path d="M 422.5 435 L 422.5 421 L 268 421 C 268 417.1 262 417.1 262 421 L 262 421 L 107.5 421 L 107.5 428.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 107.5 433.88 L 104 426.88 L 107.5 428.63 L 111 426.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-100"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 422px; margin-left: 206px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">HTTP</div></div></div></foreignObject><image x="191.5" y="416" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-101"><g><rect x="390" y="435" width="130" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 455px; margin-left: 391px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;">Metadata Service</div></div></div></foreignObject><image x="391" y="448.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-102"><g><path d="M 336.37 465 L 383.63 465" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 331.12 465 L 338.12 461.5 L 336.37 465 L 338.12 468.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 388.88 465 L 381.88 468.5 L 383.63 465 L 381.88 461.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-103"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 466px; margin-left: 361px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">HTTP</div></div></div></foreignObject><image x="346.5" y="460" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-104"><g><rect x="200" y="435" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 455px; margin-left: 201px;"><div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Auth Service</b><br /><i>keycloak</i></div></div></div></foreignObject><image x="201" y="441" width="128" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-105"><g><rect x="390" y="107" width="130" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 127px; margin-left: 391px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;">Search Service</div></div></div></foreignObject><image x="391" y="120.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-106"><g><path d="M 430 195.6 C 430 190.85 441.19 187 455 187 C 461.63 187 467.99 187.91 472.68 189.52 C 477.37 191.13 480 193.32 480 195.6 L 480 242.4 C 480 247.15 468.81 251 455 251 C 441.19 251 430 247.15 430 242.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 480 195.6 C 480 200.35 468.81 204.2 455 204.2 C 441.19 204.2 430 200.35 430 195.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-107"><g><rect x="412.5" y="251.5" width="85" height="17" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 89px; height: 1px; padding-top: 260px; margin-left: 411px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">search-db</div></div></div></foreignObject><image x="411" y="253.5" width="89" height="17" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAWQAAABECAYAAAC2wE+iAAAAAXNSR0IArs4c6QAAEkhJREFUeF7tnQOwPjkWxc+sbdu2bduote2dWdu7s7Zt27Zt27a3fzVJ1d1MI3nf973X7/W5Vf+aqfd1J+mT9MnNyc3tfWQzAkbACBiBWSCwzyxa4UYYASNgBIyATMgeBEbACBiBmSBgQp5JR7gZRsAIGAETsseAETACRmAmCJiQZ9IRboYRMAJGwITsMWAEjIARmAkCJuSZdISbYQSMgBEwIXsMGAEjYARmgoAJeSYd4WbsGAK/knTUUPvlJb1px1qzuYrvL+l+ofi3S7rUQHUfknTe8Nu+kvbfXNNcckbAhOyxsHQETMgHHgEm5B16K0zIOwS8q50NAiZkE/JsBqMJeTZd4YbsEAImZBPyDg29A1drQp5NV7ghO4SACdmEvENDz4Q8G+DdkNkgYEI2Ic9mMNpDnk1XuCE7hIAJ2YS8Q0PPHvJsgHdDZoOACdmEPJvBaA95Nl3hhuwQAiZkE/IODT17yOsC/rCSLifpEpJOL+kEkg4v6ZCS/iyJl/wbkj4q6fWSPr/Fio+U6rmkpDNJOrqko0j6Y6rj210A/zvTQYZvbrEObuN5Lt21l3pOJ+nE6XkOIekPkn6TnuHDkl4s6ReVdR0utTVf/ntJPBN2UEm3lHQ9SadJ9cXfh6o4eDrQQHvPLemY6WDH3yT9UtKnu79z6OFlkv5S0c6SkCn3bem+g0i6iqSrSTqrpGNLApPfSfqhJOJ1ny/pMxX1rPuSU0i6duq346ex8Q9JP07tea2k10j6V6p4lYMhd+3659GpHPC/ajcertyN7TNLOq4k/gb2P0rj8eXdNV9c9wMvoTx7yG29zAt6J0n3kXTEhlvf05HYrbsX6OuV9xyqI8I7d4SyX2U9/5H0Qkn3Si9kZTXieajnHonoa+7jpX+ypHtKggTHDNLNhMB1/0yExt9flyabeP8UIV+hmzweJQkymrLfdu27e0cYz+xOqP135OKSkC8qif46bVfPSzpSO8NURQn7W0j6a8W1q17CpP+AbqK7i6SDTRT2NUnXTZMUp/Qg5WwtJ/UYI4+VdM70rCefqJfx+PQ0fv+06gMv6X4Tcn1vM/jxuvAOtmIMzMtI+uDEzRzj5ejuubZQCZ4rXnuNR46nhxdFm7ZiH5d0kQovFBKOxMH/33HgKO4YIZceXm2bmahu1E2i/x64oSTk8yVifXfw5mvqAku86U0aE+grG+thxXax9O9BWyTk2ydSZzV2mIYHZGJjfP294Z5FX2pCru9+vK2HFZfj8bI8gwAhQ8gHzxkPjqUvuQJ4ibL9WtIpJfHfPkM6+ERawsffvyDpBV2ZkCD3HqGbHE4l6UqSrth5TLEfWU6fvfOMvjXxaE+RdKvimp+kSYclOM+Dd8sEcZYkLRyvuP5F6e9jVTER8VzZjiXpy0X+CEgRnHgOJJnS8PwfXPwRGQU5iLaCCZIRS+hrSjpyce0TO9kFUumzkpAv3klQz5GEDIBn/dYkgSBRsDQ/TiIZSK58f+iLN9QPqeYrH5hWZ/FG+ptVwDsk/TRhjeRETg6wYAKkX5FWWAlla/GQ8cbxkpEnsE+l5/yOJPoXTMCNOkuv/Uld/9yu+UkXeoMJua7jeREhqKx/ctcTknzB8mzI0B3xnHi5sz28eDHivU/rXiqWvtkgBF4ilulD9ZAEBq3wGOG+9yXvdWipDplDinGyeLOka4x4vIeWBAFHL5DyIevPjWCA18sEko2JDQzQd5E9ntfhyDUYxI1HFw2SZSKiD7K9IunPyBKl0Ufo3KXnf2FJ4FJaScjvlcS13+swunoin77HQ0PFW0V+yfYWSZcdwWKVn5gM2ZegH7J9Jen+aLd9htzCaovxB1Zxomoh5O+mfQX2Lm7c7TO8aqA+HIE3Jl0/X8KkjvxD220TCJiQ64bIBbqX9P3h0p9J4gUZWgbHUiHlTwZvihcdD6Y0iI0NqWgQVumV97X4HGmDKZIW0gpE3WePSPpe/g0SZGMSr3PMWK5+X9LRwkWUBckOGWVGIuDFPFFHjhdKm55TPQBBcm02SBVvLGrTZRlo8J9Nq4j8G8tt5JzSSkLmdyZf+oMNsjErVxngyOQzNklPPe/Q70zKbK5lYzUG0U1t5rJhChZIVNFaCJn7mHzZ9AXHMUPyKWU5nJc7bPXBl3SfCbmut9kYQYvM9q5ECnV3Syw1McgYQoNkypf22cn7yGXidULmtS83myg3Dw0a89YekkgOr5p/aH14fDVWktDHUrTD0L19hPfQtAE5VR+bR6VnhRfGknnKyj4DR561lIv62odnPOQFxnrZ5OL5o7H6qN28nXqG+DsRNScJf0DCukFlAY/vkWxaCZn9E6I6aoyxh2SXDbmHCd82gYAJuW6IXKvTfl8aLoUk0ILXZeycs6SMy9EbJt2vtg7C4vCEsuG9E6ZFONKUMQ7GIhHi/ZA+5J/tB5JOOFJBSXgt7SKa4L6hbIgOwqsxtGgmTgg4/3tcj0dZto/l+ckqJ0JWDKXEcsFOLvpATQMbrjl1JychT0Rj/wANvcbKscE9rYR8/rQKq6mPsfvc4kKegagP2wgCJuS64YFXxmZbNIiJzZR1WOlpQY5sftXG+9IG+pJNHeJys6Fn4q2s04jJRTvNhq4YNeKyrpLwiN3l5a4xSCPKDHjnt6m5seGasn2tdfD8xFtnIzQPHXWdhrbP5nE0Jpw+DX2oXsYGYypbCyFTDzHwNRId5SNJMbFFG5PQ1onVri7LhFzXfeCEhxK9M0iTZSMB86sGwRMBwLIyG9plGdFQ09KSwO7dbYYhT6zT8MzYqMyGhxgJqayrJDziWdmxr7HyXnRI9Mh1WllH60TLpAlZZauVO1qeoQz5w+OPOn5NWYTxEaaYrYWQ2T+JOv5UfWwWE5MddetNjMWpduy6303I9V3GYOYEV9w4y3cT/kN4FEtkBm+L50IZkBSxudnYqIl6cG0rCU/iBGE2og3QUqfsbClOlVOH6LZ4vPnkYXkvLxm/ZWslZDxcvNApow05+iJfu4mwspKQWQG8eqpx4Xc2eOOqZBOE/KzuZOBNQp2E+rG/0GKs5m4abmghZOq/WUtlKezypOGesdDDxqL37uUm5La+ZTlKPGcMfytLYPMILZcBj8ZXSh19NaK3obut2whliwRdlg/54EHXnHwbalsrIbMxxAbRlLEJxAZoNCZFNkTXaavmsqgh5LulGN3adrPBGrV/5Apki2ytHiv3PSaFaeYyWgiZSB8iflqMdwDtOhtjnJA52wgCJuT24QFREDUBsZShRH2lsTuOHEGMMaFKfUZ4Wm2UQ0uLCT8iZK80lpR4PZxgW9VaCbnWy8Vb50BMNE4vEpO8TtsOQi493Kn2EzccY4uZWGNcNSu1GMUwVR6/c0oP2SBbCyGTKqA8mDNVJ3lPzhMuYt8hTipT9y/ydxPy1rudE2x4mGiq7KzHCIm+UokQ4FBFuVvOtRx0YKm7bsNLIZ62NA5m4LVFI66X3A149V/qDl7g+XF4o4z3XVVDrv2qcx8hcwjmI2sGaTcQMnJY/EL0GJkOwVPGnrcQMmPlkY24lx9KxcsnWsk2goAJeT3Dg4MIkAXHaUlOg74XT8HlWtCWiagog/lLfY9ledyAWU8rDygFjZhTelELJ3SNF/6rFRVtFyH3SRYcCEGnX6ftBkImJjrmUCGsDiegxTjCHCNUWgiZ8MOYmKimXnRuTllm24oOXVPPnrrGhLyZ7mQHnBeIaIJSn+17mcpTWFvZtKl9knLpiuZNys0aMqYO8iNEDbhVsqj1kMkJQp6GaLX6cy0WXLcdhNzSnr5rOV4eD4EMrXzG6il16BZCbomMyW3A6SCeOxsx4GRKtI0gYELe7PDACyWiIO5uUyM5BmKoXHnYYithTbVPwpKfPMLZSIaDrltrLF+RPLJtipApHxxisiFSSOZTj7XtnbpuNxByKTdwHB3JrMU4+XnGcEMLISNjsTKqNXiFsDcOPGWLOZVry1ncdSbkzXc52a/Qj+OxV3IjPzVUzdKuTHJOvguOWq/bkCdisiNOwsW0jFP1IRkgy2wHIZPBDJkiGzmUWzY/Ia0ozXCIozxZtxsIue/kG6uwoayBZR9yohASjwTZQshkDpzKgRzr7JOb2JREC7eNIGBCbhse6MJEVkwlZi9LJZ1jjGgoSRDS5oWJ8b3EFBOqtG5Dx45hey0HITj+yoZf1Mc36SGX6SZJ9QgR1ebX/XmRBe86aeMyYrobCLnvpGjLyTdkojItaAshgxcxxcTb1xhfgeHQVLQycqSmnMVdY0Ke7nJyVpDPlWgFlnxIEPtO3/Z/VxC9EBOzUB6bLNHK1JuEy5HNq5Z8KItUixAkniX/SOpSGl53zD1Ru4POpEH8awxlomy+IBI9r7K+VQgP7Mv8B3z2KebSGOoKMuCVIXKsUsojvau0j7pr4pAbh8uBLifFJ5NLlClakv2UKw0qaCVkVlExr8jYM7GSiTIY4YtRLlkVjz17vwl5umvL5ReEx+CCMGuMHL94FjFfcd8BB8os8wpzLDumXByrD5KPx4rJXQDxlrHPxLCSRjHbUFrKWBfjhLJvmwgo5kTgOjbg+PZen61KeGyCxtwXECBRLCRdHzLaCwkR9ZJtKCZ71fZtByHzDOUqi7wS4DD1dZgy90jGo5WQkXsIRSwP65R9gPxGGtnILZvQ/mvevV13jQm5rsvKOFC8TJa/UzGxEBVpO1kyZoMoWb71JWpBV8YDjLZ/+krEkEyCRoqXy/I+9ifkybfvSoPgieqINpY5DK+M5ScaIOTOgYQy9GwsidGqhMdynY/FxkTwhO1xyKAvppsj16w2ylSRhPVBQqWt2r7tImROvbHPEPsYcmRsDeVSQTp4RrcJS1gmDkQ8yjxGyOXGb05uz14Ip1WHks2zAmFsxHzfEDnRFi2Jsureyj14lQm5rlNJ8k2S+fJ7YgxcPDFCxthggbDwiPGqWTJzEKQ8Zk3YGAdB+ozyqYf6orERh+xBfSxd0XD5bA51EGxfpr+kTRBQX0pNohZ4kWNCIA5/4AFzmooTYrzA+TNUhFtlbTvr2hzrjclteNmZSPgvGnvMB7wq4YFD36eLwJqJEg+alx3c8RjRVstPOCFxlBNdxnfV9m0XIdPeMvyNvyEZkeyJ5EGMDfoVAmTzMx9dpl8IXYsy2djKiAkwftORCR+ZLuv35EghiyDjiGgKPu3EeCPfRZloqlYSq3sT9/hVJuT6DsYTIZZz6kTeUImQI4Oz9E7L6/FISd8YQ9PqW3mAh4LHW0YTxDIgWV7uFotxpH3EkMsq82esSni53L7ThTXtZyK7fsNHTmvjpHPd20nITDr0b8sHcPFQydRGpkKINNvY4SOcAhJOZWO1waQHCY/tF5T9wSe/wL4213ZNf+7pa0zIbd3LAQo8jahN1pSANswhkdrEOHioZH/br8fbG6qPF4YvcZBVq+YrI0RX4BVPvWBkXKMdLH2zEQKFThijQjZNyJSP90tMblx6D+FB1AoJcaY2AFedMLaTkHlWVlyMwZpkVKxUIFMOkpSRFqy2OF3aZ2zCoRdnI0EVEy1aPhLc2AcJuAevnX5iZTP2qa2ad2dR15iQt9bdSAoMUjwVIgHY5MJ7IRKB0CzIgOgAND92nGs+OdTXEvRQ9FlicVmOk3cXDxqPg000IgbY1EEP5IVpDcdD9mApT1wxEgUvO1IAS19eSjYA8ar6Nux4YTlSS/Ii2olkQ0gcn6KKJ/lWJbwSFzRzdGz+sYpgsxRMiEZBSmGiAA++8EIujilbtX3bTcj5eYj6Qf6i75AMkBMgQjY7wQAZgzSimRCJjiHhTzZ0Zw4o9Rmb0FEHjjlEmMCRydCSkUT4Kg3jHuyR1vCiWZXUbnpP9c+ifjchL6q7/bBGwAjMGQET8px7x20zAkZgUQiYkBfV3X5YI2AE5oyACXnOveO2GQEjsCgETMiL6m4/rBEwAnNGwIQ8595x24yAEVgUAibkRXW3H9YIGIE5I2BCnnPvuG1GwAgsCgET8qK62w9rBIzAnBEwIc+5d9w2I2AEFoWACXlR3e2HNQJGYM4ImJDn3DtumxEwAotCwIS8qO72wxoBIzBnBEzIc+4dt80IGIFFIWBCXlR3+2GNgBGYMwIm5Dn3jttmBIzAohAwIS+qu/2wRsAIzBkBE/Kce8dtMwJGYFEImJAX1d1+WCNgBOaMgAl5zr3jthkBI7AoBEzIi+puP6wRMAJzRsCEPOfecduMgBFYFAIm5EV1tx/WCBiBOSNgQp5z77htRsAILAqB/wGPuaxyzBK0+wAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-108"><g><rect x="390" y="353" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 373px; margin-left: 391px;"><div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Dashboard Service</b><div><i>grafana</i></div></div></div></div></foreignObject><image x="391" y="359" width="128" height="32" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAACACAYAAAB9V9ELAAAAAXNSR0IArs4c6QAAIABJREFUeF7tnQW09LiRhSu0YWZmZmZmZmbmZDJhZoYJMzPTZMLMzJxsmJkZ1l9iZbXaKlnu5/br1751zn8yeS3L0pUsXRXpQCYRAkJACAgBISAEFofAgRbXY3VYCAgBISAEhIAQMBEATQIhIASEgBAQAgtEQARggYOuLgsBISAEhIAQEAHQHBACQkAICAEhsEAERAAWOOjqshAQAkJACAgBEQDNASEgBISAEBACC0RABGCBg64uCwEhIASEgBAQAdAcEAJCQAgIASGwQAREABY46E6XT2JmXwuguIOZPXZNML2we++1nbp/3b3zCGt6p6qdD4FnmtmNndf92cwOMV8z9KYNQOB7ZnZspx2vM7MrbED7FtkEEYBFDvv/67QIgObBOhDYFALwX2Z2MjM7hZkd0cwOa2aHMjOIyO/N7Ddm9g0z+7qZ/WQdQKhOEwHYwEmwVwjAJczsTSPx4+P+Y/9BM/k+b2afMLO3m9kPRta17cVFALZ9hHenf7tJADhtXsPMrmxmZzWzgzZC8M1+rXm+mX2k8RkVG0ZABGAYo9lLbDMBqIH5YTNjcXqBmf1ldtQ374UiAJs3JtvQot0gAIczs3uZ2W0nMDO8zcxuYmbf2YbB2OU+iADs8gB4r18qAUhY8GHf2cxevoFjM2eTRADmRHs575qbABzPzN5oZqeeEOKfmdmlzOxjE9a5xKrA75hOx9/ck6wlYrLrfV46AUgD8NLeWekPuz4iu9MAEYDdwX3b3zonATiMmX3GzE60BlC/b2ZnMbMfraFuVSkEdg0BEYD/hf6jZnbR3iFo1wZkl14sArBLwG/5a+ckAE80s1tX8PyTmb238wn4XO8XhI8QjoAnMLNzmdlpBsbi2UFEw5YPobq3zQhsAwH4oJk9pxikA/dhZEfu1YHnMbPDNwzke8zsIp0N8W8NZbepiAjANo3m5vRlLgJw6H5TZ0P35Mlmdm8z+0UFmnOaGZs8kQKesCacWP4AmzO51JKdI7ANBOB5ZnaDASggBNjx7mlm5xgo+9DOMfAeO4d2T9UgArCnhmvPNHYuAnAlM3tVgMpLzOxajYhxYMBWfcKg/O3N7PGNdamYENh4BJZCAPKBuFPnHfwwMztIMDp/NbPTdSFEXx4xemczs8ub2RnN7JS99gGbJGGIv+yT7Hyo00a8wsw+O6LesihaDN5z3m7BO213YsHpiZjmQ/bxzL8ys690iTU+bWavNzO0I/9oeF+NAJSLHipTPKPRlBBbTT95Lw6VhFhyivpqwzspEiUCoj7itZPQx+t1i/Ol+34ftdfSEM6J3Rcnztd2BI+xW1WO1eF1MTO7YD/+RzEzNoR/9ifHn/djh5YI7/CdeoZjq2bjOnuvfqZP9PPv/ZzBa5poFcJf39K3o6VvjzEzkjeV8q5OBX6h7I/X78Jhb9Zhd6os6RLhch+vvCSF1l223ySP3o/Dd/u2vrjHJlXxjMDBa+pEQDjyPiJoN/P0HS3A9WWu6jgFMweYa0QN3X1EXWgMLmlmFzazk5sZc4oEVyS6It/AF7sQxQPMbP8uaoH51SI7Hd99guRbvJu1hXWjVR7XfRu3Cwpfru9X+nmqKADWOsYUcy2HuaOZGd8OhzzW2m/34Ztv6MedsVtV1jF+q7ZlLc8tkQAAJPHBnAwieVGXFOQ6DYijVXh4g/0wr4rF6OZm9t8N9aciR+o28vt0Tki3MLODj3gOEkNIVHQ6SlXVCABtfXr/gdEGFkASq0SCqnQ/M7tbA/mICACe13zUCKe3J3QnLzCoCcQKTdCnRuBDUTZiND4QjIM1Pssm/bKu/IP7RbzxsX8VY8NlzlxmxENkacS+DfEYkvt1ZOG+TiFwOVP/d8bzpk6ZiABAlvc1s/v3ZLPWBuzsYMlC/LSeZJTlpyYAbP6QAE/ObGafHAIt+525zbjSfpID8Y/cALS5VU7aFWQcWGfYmIbkd/07+W6G3rPT8WXDhHR48qyRHvlgxCGkFMgMHv85Id8pAWBcmLOsZ8cYArT/ne+GA98YUsOj6xy/xqbPU2ypBAB0SW/L6dYTJi4nQjYiT8CNRTxadIZGjw+e9JctJxNCmgiVOc5QpZXfOZWzkUe+DTUCwGLORk1ilBZSlJrBaYlnaxIRAE5bnDb5eB85ot/gyim3NWTrmmbGosepYhUhh8RturZy0m0RTpeYrFZ5HycZiAraq5pEp2Gy3LGw3bDX0nh1eASAuf7chrHM62P88LuhLbd0XjQ1AYg2RV7NpoEpYi7hu2Ze45cwVtDYoTEgM2EkOx1ftIM/7LUR5Tt+3G/cLadm5gqO057gc1E6ZO6EAKA5IWUwzpqrCD5iaLtafLvWPX6rtH9tzyyZAKBihsGidvWEHOZsnJ5wwmLR2YnwkaPC+lKlEib+F3o1107exbOcxtAgeFIjAFfpnZ8gPGPluv1iGD0XEYBv9Qv3W7tT59g5+tPe8ZP/rQmbKSe9KeRBvZNZrS6ICf2JTE+t7RjClAQ4np2axf24/Yk2IpMeAQCjVXxiMCVAxOYgAGh+SkfghCfmCUxmfOvrFggyBK/l1B+1hU31fBVNwBTj+5TKWoAzJKanIXlIxRzCRo3JM5dVCQAaiw906whr1E7k1V02WNayGrmZY/x20ofJnx27uE7egMYKa6mAW5wAo9fUbFhsTiy2peAfgDrV+8iTahg1KBsQWgTqwEfAE+y7mBEiiZyoKI9a833dRkmMMicqbPHY5LGTQxw8wRb5TueHGgG4Va/SH2N6SK9AfUrd0UdXIwD4T+BPgaCJeX/va3D8fkGvpXZlgaPdkWDrfE2FXHBSYAwx0zCm9OH8AyaCK/Z+CN47wY66vMtQKE/f8A9hLCGkjCGLlSfYjrFNou3wBE3PU50fyHmP70bN9FUSAMwVnBgj0wjjStuZi2BGKB322URyIB34CZQytQYApz3mWiTMH8wXkARwWIcwVyE9XiQCIYiMCd87bWFTw0bOeHjYQrpQda9rfCEY+LJ40uoEzcHFi5hgnnub9SoEgP0JcwVaEU+Yf5AD0rxTFh+saK3leTSKjw7qmmv81jH3Vq5z6QSAzTeyh+FM503waNNiEPigUSnnwmKIQwokxhPewbtKQU3MYs/GXgq2RWzQnqB6ZHPDSaYUnPS8v9cIAPbP5BWN7fhJvYMkCx1Oc2gGcAyMhJMvDmie1LCkPA6M+B1g483tiZxg8dNgIfOETRvbpHfnA74F2AajsFBUjWhKyqQv2DTpf2S7xwEJcvJbp0HMi8hMEJlKahoK2odGxxNUnd5vYPnuzBGQjYj5wBwDC+Yhz+ZOqviO4KjoCZs7efZZgHPB2Y3TFuQhkqkJAO/BPwLyURMSfUGA+QfBw4G0RS08UO2/fqY+NA2l4PDHN+D5IWAmQStUmoSY65j+vBs6pxhf1n00ImiESmEzxcG4JmyWODB68oDAB2UVAoAWNjLfUB/zrzRDQNRxCPZuE+VQwTfqaQfnGr+WuTRbmaUTABY+Fm4PBxYpPsz89MpmjoOLt3mwYXipLhnMmr0sCi06Q+DQxgJ9+oEZwuTHzpdfucqmiDqUj5cTSS41ApDKRbZUtBwsbt5Jj2cxl7AoeDJEADgFRWp6cr7zXk7DnuDtjIanlJrqEqKGDRCsPEHrgD8GmhRPsM8+yvmBejnVe8J4eBEnOD0xp/JoiPQ8BC/amGtkIz1P0hxOQzWHM97L+yOHT8gXGihPIF9oDry2U34dBIBNixN4zUG1bCsbAs+grobI0B/Wg7FClsDI76RG1nhPZNPH9+UuTkOmGl/qZw54gmMsxD+SGjlFC+kRl7EEgDUZkuEdwvg+iZ7hcjdPrlY5IKEJKs23c47f2Lm11vJLJwCAS8hZdBpEVZezRTadKKaYzTXSJmAuQPXo3YHOqRK1bSmcrgn/KoUPsyXdKSdVxpdTMP84sUUhgUMEYCgqglAgb7Ol7bXNqkYAUOlymqyd0Gq2X1ScFyjAg9BBjLzxhhSxeDGONaFNLEyeCYhTlacNwbboaXJYyGoOhJwOPY0NYZa0w5OhDYJQvWs3rCqECeL85wn59iNCk8rXNol1EADeCynCxDGGBOT94/uAVELY0LC1hgJH4Y5og1hDSsKdv5N5gTamNLExTzmhl2R0qvElIiTaQCPynNoN2WHTLIXTOBuzJ2MJAPOe+e8JY4MWtCaQEM8U4R2g5hy/hk9vviIiAP+2HUaJP/g7DmlTSPQBoC5FlVXKuXv7qvdu1OI4nrV467a0fYgA8HstbJHTf5QnHRuxpxqlXTUCUDv9pz5ByNDIeP4AqF5LNSAnd9TenkTj4JXltBh5JKORqNmjW8YjlYnwIaMdOQo8qW0QbLzMaTaXIcHUE/lRQLzwvakJ/g7MeU/WRQB4FxsbzrtDWrKh/vM7GxAnRrzzawIhI8KiFEwNkbYoLxupn+lLGdY61fjyfgiORyRr7YaURDkwOAgQsuvJWAJQC+2E6HGwqAkkF4fGUiB5dyxMinOOX8u8m62MCMC/vewje+XQxjdmoCAS2J9K4ZTv+QdwSuVkEDm7sSG/src9cm95ayIRr801AsApwWP7ZT3RB07udRwnPakRAN4ZnVDyulDhEuvtCXjni9UDK85VY8LF2BQgYZ60bI6t84YTOCfxUmobaG2D4GRLEp8WgbhBQj1pJTloSpIjZ17POgkA72Fdw4mSEE3I507WOUg2yXfIf+ElmsLhNoo44ZIxLwqixBSy5WkWvUikqcaXNkTRTGjd8JVBO1pKFIXAM5A+fEo8GUsAaiSbtkUh2i1zOy8z9/iNbd9ay+/kw1hrw4rK1xUFwGvwvMaO7QkJJ1CdRwLrv3rveYrTDjZPTqVjQr0iAsA7a05YZZuI8yZ8B4c7/tVseOWzNQIw5FGf6sKO6qVZjpwpeS4iACy6qEZbbmdkkWUMPMHJKndSw8EP72tPvNClaNxriaSI069li+PkTnvZXDmloiKG7I1RW69KACIfBa+f0XfBJogpJfKTyOuCoHrarXUTgLwNOIyyfnASx0Es8tMZWs8iMxhzvgx5G6qr9XdO02WmvRoBGDO+tAGTl+eAzG/kyODbKgXtANkySxkyC40lAIRJeyHaZZbQViyjcnOP307bO+nzIgD/3mSixCx4uuMoVAp2Xlh7LYSvdaBqBIATLIvLKosWYTqElhGVMJS2tkYAuEQFc8OQRF7YqxAATlRsjC3CIslJzxPCh3DaS1I71eK4NmT/T/Xg1R0lcYp8OojOAEfU6mM2e69fqxKAMj1rDV/s157fQs3ZtawvuqFvTgJQtgn/GVTDOOZC+ggdq4WU5s/jgV/6bDDH2PzWIRAokkflUiMAY8Y31Rlp0Lw7FMjGyYHIwwsNRi3EdAwBoP4orTe2fYjLVDL3+E3V7knqWToB4AQf5a3HTuppBmCM2AajBEJjB6ZGAKiL2GpSWUZ+CkPvI1sdYWF4FEfOSFNcBsRGe3GnMasQgFZHR17HifuuAQictLknIEkUu8zvLG6tHuC1qA5v0UZlSQheLTRuaBzz31clAKVGJHonDo6odL31Af+GKPKirC8am90kAGUbIWZoBtBUYDeu5bvAmRbyn29OnJRxrFyHsM6U31SNALSOb95W7OFe5Aon7XTnRiofOYaSkwI/oJrGbgwB4L2RKYHQTSKkppK5x2+qdk9Sz9IJAKlqI2cmzxGGSc4mEoU3oRYljpbJjtd/7qSH7dVLEjJEABhonuMmQ06PXnxry2TAno4aFOe4UjaNAETJRLx+1pyFsAPn9yBENumxBABP5yhbGoQjN0nwjaF5qKUxZVPlZMNCmkc98B4vqmBVAuA5lXmYQgAiFf+YsWFjYYMpZZMIQN42CD9kuXZPA+pvyFySWshZy3dZK4NvT2lWqxGA1vHN34ndHg2hF9VSJg4jvp4kWqWQJtzzVcnLjSEAaDy9HB7UV/MpWgXvucdvlTau7ZmlE4BafLaXjauWQhNPXrL+Rer2sU6A3qBjqiA8kBAsFqKx6TH5gMlYt+kEADVj64UfNW91sMov0JnKBFCLJih9JiADni2VMWBR5ARCuzyZ2gkQdTfx+S0CgfUIa6QZ8+ok+50X4rqpBIA+sBGizfLCL/kd50+cSZNE4br8Tkrm6L6RljHwytQIwJjxzeuG0KAFKYX7UtLNkswFHO88c2n5nXntHkMACJf2TK/UO4aAtmA89/i1tGm2MksmANgCOXVFebvLnNg49mGb9k7/OKxgr/e8ZtNgol72Tu8tGoBoQsCUOSGQ/jL98+y2+fPe7WibpgHg9MmCg/liSAgHInmPJ2DDKSpJdILh9zFOgLUY+fJeAMw3ked9LUsibYr6tqoGYMwGwUbvkbAxToCkvvUiXOYgAKjyh27Wi+YW+SOi7JUQztznpGYOIvXwjYYm8Mjf10EAovTRub2db8wLvYvyFZTdGkMAeBYC4OVNgZgOrXFjIJ17/Ma0be1ll0wAaqd/bNBsinninCgzH4OEsx2qpEjY+CP78k4IQPk+nMs4uZCEJVI5e17qm0YA6Behg6j7hgSTCxEYnpThQrXwPc/BK3p3LYsaTlv4ASSJEk1h44yyJ6ZnOa178exzEABMHFFSl9YwQJwqvYuHpiQA1I9vBeGG/Ev/jW9PFMY4NKdqse6kps2vUq5lE/WSUQ29e+j3dRAA/F9w7vTuJUhjTW4FbpIshRBJz8xTlhtLALD1R+HDjDlRKlPI3OM3RZsnq2OpBKCWuQ5wUXuh/sql5i2aq8q8wamdGKckAOndaCvwTEa9VQrqaNTOuWwiAWBRYXGpCRs85gJvHqcrhfPna977+ApEF/CUbYhyR+Dzwaae4sJrqkw2d07kkWD7xzcgSlPtnY6oa6oNIsqOxjs41Ua376X+4LwaEbipCADe4ow/G5gnpQZoYDr95+daEi7U/2UOiMi5FH8b5mjk0d7anrzcVONbvjs6EOF3hCmHk75HWFv9DsYSAK4UjnIo4Kw55HhJCmaiUDzh1J8nWJpz/FYZ87U9s0QCwObOjVBR35mo5J8ubw0j+1TuUJYPSs0Jhs2YUJvIcxUbtbdRUz+qLjZnohX4hx/B0MRP7SIsh9jlUvZ3YuE3kQCwyZLfvZbtsEbkPH8HNk0WMs8UQ4QEp53I+SjhSGIZ/D08KVOhsjFFCZrwFfESQ6V6a+GNbChRKOFUGwQLKP4MntTmbCpf882YigDwLpx4ceb1hIWdzbw1uiPVgSNnGX6XfoPM873nguMgGiRPWkLzSB6FyhviiGaIf9jbvdTdU41v2VY2VfJylELuDEgPa1gpONVG2rey7FgCABlHs+pJS0KrKOcH5lpIWW5enHP8gi7tzp+XRABQpeKVPHRjWJRmsmYXJNQN1aP3wWITxoM/Ei/THhsy6sMyDJHNCSLQkiAHouOdoGHzJbPeRAIAXrfu8gFwEvCEhDrk9Y6SOEWJTGrZACF4LPwR6SD0E4e9SDVZRh3gX8Jm7fmZMFc45Xu5Bwj9QoNTu1eetnhXAk+1QeBfwqIdtQFTU5RWGT8T0udGJGVKAjCUyAU7Nir76PrbfG5BDLndMtrMGUv8IkjFnEvtMhlU2fjnRP4skbaB+UHfykuGphrf8psiHBLiUTp+smGyjpQX6PA8pkauD26RsQQAcwQHHu/75vtkPY6IOOOB7483d73r4+ccvxasZiuzDQSATG/elZEMPkwPexGbvnerVAl06eCT/16LTaUcaTXZXNLmQXk2/7SY8HcPb5g/SW/KxTy6zIKc9Zx4aveaw8o5pXkJhLyrhDeVALBoQgLK8WVMOR14mQcZC1SvLBweUSL1J1kTowugON2R7pSFLxfmD175kV0cdTdanpIE1lJNc5JhPNJY4rjGfIGops0zmjfMaS8Z0ZQbRJT1DVw4oeL3UjrLoSHhspZa8qopCQBtacmYCVnEux+fEbRAzA0wZh7gEMxcIrFXzcHMS46T5kgtdS3aKE75ZQguPgvE+nt+EtxM6F13PeX4lutflFUTLVZ59wTzktwkXIDVImMJAHWSuwRC5glkhdwNZQQNztv44HjEAediDoJ8k6XMNX4tWM1WZhsIwFRg4a3NhKrdPsdpHZtXJFyuwUaArQw7Ux4yw+U2aAK8MBoW2mSvIvMfDjmEFJaqxvReTiD4DqDi5L85maDeZtLzXtixx35xnGGzH3MdsOcP4fV/lURAmDNKfwTqxnGOuZk2aTZs2D7Z6VDTYzKpZdMb8h9ALcuiHM1/yBgEisWNExH2bBaWqDzt4pTn3R6HuWnfypxhrDmtMH7MLYhjEtoAofASLNE2sjQy/mgR2OCQKTcINqChkzPOgumue3wa8gtYWGg9FTELcWv2vZbvGwINhl7OhJbnW8pAeOhLlKAGcxUmoMg3g02UOcdchmRQnnBeL204xJe54G1UU45v2W++C1TnLcL36IUORs+uQgDQAkCEItLNu9i40bIwp8Cs5vhJzpAoadhc49eC7WxlRAD+DTXpW3F2GcpvXssBXxs0Jilx+2z0ZOuqSUo0wtiwYES568dOEvrGxkkbStktDQCneM/xjkUSG3h0xXCt7zjXsRkPOV7Vrqsdgy1kipMwvhWeYOfHI31s+l82HFTpqK8hjzXJ7zifeoOISNoQRhBqbMR3CwpCUKe6zZJXsDlDQr3T9FBbh35n8yaUcyjnP9ob7Mk7ETDByTK6innq8c3byhyFkEaJzvKyY6JmeG4VAsBzaBkwJ7XmBYmwR7uBn0N0JTrPzTF+O5kbkz+7dAKAKhAV89DVkjnwqAGH7qLOy3Myw17KyaHmWJWeyTONcfrEIWno7vWhiYE6m4Q0eV78/JndIgCRow4eurD5moOX12eShECwoquJy2dYEDAvRKe2IVxZ1PAZKe205XMt454/gwaE+HlOtaiJOQnWvtV1EgA0VpgavKtVI3xoL9oD4ssfEhSK7tkYwrz2O9oT5gwRO1MJY4DjX3RpjjenCJkbS/ioBzKJf060+VNmnQSA+vkeuIWwJphw2JBreU/K51clANTDPR0H9Jq4VcaViBU295p2N9XLmrDO8Vul/Wt7ZqkEAOcSQveY7DVbugc8aqn9eo1BDT+YPB8ymcBQESM8O6QFKFON8g5OgZykxt4HwIeKGQH/hNod8LtFAHAi8+5LT2mYOSWi5ua0PrSgYvcjQUvt9kZvPOk77+DDb73FkYWPLG/Mg9ZFkEUVrUZ08VRqG6cd7MX4gCSp3XdAmXUSAOrnhkv62pLUBq0OhAfTBPMW7ZonqO2ja3R3uuChmuZGRubWKqYGTomMA2MceaLX2og6Gf+fMdo7kiZh88ZHoSbrJgC1UNnULvyQvFsea+3eCQGgXpwU9+lzDrRoKHgGDRRrQpTUKWrvOsdvp3N70ue3nQCgBmbzZaFhMnCyxLu65Z75IaCxC7PAsdig5k1e2aivmXBs/p4Nj5MPHzre5jgfpQyD+A5g84WUePn6KUdyH9T4OLKwcbGI8mFALCAy9BXbMHXhHIMatnRmizbBfMPJy6zTB4CTMx64pZRXr3ICYOFDk3LyHmtCu4iKII0p6r0oN//QOKbfSf6CrZ1NA3Uyp0nC+LDHogKGWGDjhZxAXBKpa62fcowXJxH6wcker3Pqx4ZP+9Eu4RTmCadQnmVxYg4xRziV0n9OLMw7ZJ0bBGOFbwqbBP4mEANw4N3MN8LIkj8AbUFzhaOjJ8z9MVdWj8E5lQVfxhSTEE6cRNDgV4INPuVowN+Db4S28L2isWMzHkskvfYRGYRjIXjhu4IDKu/HARGCxJoE0YC8ev4jXp3rHF/eB+lms645cUaRUrUx2ikBSHUz59CO4QSLvxPfKQ6KrI+sCWgB+ZYwyfFt7MTMtI7xW2Uer+2ZvUIA1gaAKhYCQkAICAEhsEQERACWOOrqsxAQAkJACCweARGAxU8BASAEhIAQEAJLREAEYImjrj4LASEgBITA4hEQAVj8FBAAQkAICAEhsEQERACWOOrqsxAQAkJACCweARGAxU8BASAEhIAQEAJLREAEYImjrj4LASEgBITA4hEQAVj8FBAAQkAICAEhsEQERACWOOrqsxAQAkJACCweARGAxU8BASAEhIAQEAJLREAEYImjrj4LASEgBITA4hEQAVj8FBAAQkAICAEhsEQERACWOOrqsxAQAkJACCweARGAxU8BASAEhIAQEAJLREAEYImjrj4LASEgBITA4hEQAVj8FBAAQkAICAEhsEQERACWOOrqsxAQAkJACCweARGAxU8BASAEhIAQEAJLREAEYImjrj4LASEgBITA4hEQAVj8FBAAQkAICAEhsEQERACWOOrqsxAwO6WZ3cjMLmJmxzazI5rZX8zsJ2a2r5m9RiAJASGw3QiIAGz3+Kp3QsBD4G5m9gAzO1gAz4XM7F2CTggIge1GQARgu8dXvRMCJQK3MrMnDcByJDP7paATAkJguxEQAdju8VXvhECOwBHM7Ltmdpjsj783s2eZ2efN7I9mdvgGgiBUhYAQ2AIERAC2YBDVBSHQiMAtzOwpWdm/mtmZzexzjc+rmBAQAluEgAjAFg2muiIEBhB4g5ldOivzYjO7tlATAkJgmQiIACxz3NXrZSLwi97bP/X+6mb28mVCoV4LASEgAqA5IASWgcCJzezrRVcJ//vBMrqvXgoBIVAiIAKgOSEEloHA1czsZVlXv9c5/x13GV1XL4WAEPAQEAHQvNhmBPB6v5aZXcLMTtM5wB3dzP7LzFCF4/WOTfzZZvbrDIRbm9kTs///CjNj8yzlHGb2oeyPHzCz8/T/nzA6Yu2vZGbHN7ODmtl7u9j681fA5lvk+UuZ2ZnM7KRmRj2HNrM/923GWe89ZvZ8M/vRwMAdc4XT/QvM7HpBvVO3L3/NXc3sYdkfHmVmd87+/9k77cV1enxO2Ecx/NbMvt3j+tRujL644kQ+mpldpquH3Aen6ObD8fr6yZHAvCBq4mPd/HmIPGOzAAAQb0lEQVSlmb3NzP654nv0mBDYOAREADZuSNSgCRA4iJndxczu2W+gtSp/1m2UN8sy37HQXzl7YJ/Obv44p4Lrm9lzs7/z3zfsNxE2iuMUz+zXZ9jz2sIGxAZ46sa+473/iD6ZD9n7ojr3b6wvFbuDmT3WeWYd7ctf88xuo71x9gdI2JO7f2zOTzezyw/04x/9WOckYqjrkMOH9mN28KHC/e+f7bMnfqKxvIoJgY1GQARgo4dHjVsBgUOZ2au70/nFRzzLqe663an7Rf2pmdNzEk76H3HqYvPglJ8EsvE0M/tkf4osH8HbHq/7Uh7SnfDvPqKtedEDei2DRwLuY2b3H1nv+czsfcUz62pf/pr3d6frc2d/uFinifhGd+J/e0eyTjCiDzcws+c1lEe7AklDOzNWyJVwWTN7x9gHVV4IbBoCIgCbNiJqz04QYD5z6s1D3ajvW/1JElUutu9DdCf+0/enOTY95Hfd5nfhYrPnpH3YXgVftov3cDJOgpngKpm54Cud6eHDfX59Nhy0DF8rKuHE/Zjib3/qCQwmA1TcqP+P1WsHqOPIRXk2+fs5oB2u0xJAhhDU2iWJwSTy8+K5n5rZ37O/rbN9+avL6ARI10u6zRx1P/LuflwhBX/riNTJujFlsz9t0X4cGiEMjFsk3HnwKWfz/0KPO2YWcDlkX+YKZnbRojJ+x1yA9kgiBPYsAiIAe3bo1HAHgTt1Kv9HFn8ny90tK5tCvslBEM6aPY+q9ywB0mzObKxJ7tiRhUeb2a/6zR7fgZqwUWG3ZqNJgpc+p99vBg+Swe9VfZlUhEx+R+2z+EXvYxPLL/fBfyDXcnjPzdU+HBG/kzUAAoJvBf4QECbMKvhXlIJfBSQB0pWLp8XIfycREgmRcrlX5xuCpiOy70MowS+/O+G+vQlmYJj1sxDYXAREADZ3bNSycQiwobFh4DSXhBh3Yt2HpLRBp/Ko9MvNgt9Il8tGnwsn/mOYGRsQtuIhwa/gdlmh33Re+tzQNxSWx4YJ+ci/XZwc31J5IVoCTAJJ3txpBC450MC52nc5M3ud0xY0FjhEoh2IBD8LyEOOBZg+IXgAnwI0QPlGXjocRu96RvfsTbIf0e6cc2iQ9bsQ2GQERAA2eXTUtjEIoErnNJ8E9SwbaouaFlswp+7ye2DzhwSUct7e+7z8O85qr29s9E3NDO/2k/fqZE6m+SZdqwaygRo8CaYBNqhI2GDZaJPgLDfkdzBX+zhJlyYMNmk0Lz9uwJJxy/0EaidzMOMKZNT34I7mBPNMy8VH1yx8OCBq5FGQCIE9i4AIwJ4dOjU8QwA1Ompt7N5J7t2F3z1oBErYgE9VlGeD/qhTB6fMMjKgVdswoklhURwNzziCAJTminVnABzTPlTrmChyIXwyN1nUMMOMAtFLQvRHaQaaAvNSUyECMAWqqmNXERAB2FX49fKJELhGbw9O1REWhn3++yPq5+SOd3cSbNE4AOL1Xcpzeie0/H2E8H15xPt2UrR0miNskcgHT8glUDr7cfr96k4aMPDsmPbhoJl74+OHcbYRbWMjzv0ZWiMBRrziX0VvX4RI4ix4urGVqLwQ2CQERAA2aTTUllUReGlh61/FPotDGUQiCRoBPOU9+XQfRZB+e+vIsMNV+8lz2L1JTpML3vAkNvKEBDd5yBrRDvgwQJLWIWPah0d+aePHzo7jZoug+aE/B84KR1qblvpqZUo/EZwxSwfEnb5DzwuBWREQAZgVbr1sDQgwh7Hzc9JNEoXG1V5f2snJCUD2uVLIJMimkzuSYVdGK7CKYIcmZwGbOCdzTsM4MuLxzwZXfqMkOeK3JITFUT5KCER0Ao5uST5YxNwPtXmd7btg5zT5zqwBeOGTrZFwxBbBDIK5IQnPYwZifGoCYSDUkNwD+APgG5CyLoJlPrapHv5O5EGSB3RRA/gbSITAnkVABGDPDp0a3iNwEie+nlA6Er2METbG3KubkELC+kopNx1+x9xQnsqH3k1sOcmDcCjMT7BDz5W/f8bMzlB5iPS+OZEhwx6Z9oZkjvbtW2Bc07p47SVEkFTOSYgCyZ0jy2fQOJC8iSyOEI2dyBU73F+7kwr0rBDYbQREAHZ7BPT+nSJwVedKWxb3n4ys+Id9GF96jKRA+ek0/Z3Tfq6iHnupDifJFzqObyOb+5/iaB5oUyTYqnNTBt79qLMjmbN9JTlJ6ZRbsXh8599w26wwlx3lZpy8HpI2kSUw1xS1vscrh6Ymz1+wk7r0rBDYFQREAHYFdr10QgQe3Km/75HVh/qYeO8x4l2cQ8Y9LwadGPPbZJVzCuQ02CLknH+XEz+OGp/YfDzfyVIHqSAvAGr9MjkNv+XhZ7TlScHLeR/q8Fx1TaKjj1fKz9m+kpzgaMem3iplCmFO9w93HsZJEj+RHAeKER1BemYuWMIpkrlDJkbGIxf8EvIwS0xOmEYkQmBPIyACsKeHT43vr7jNb+sjl31K79sKUKlF4GQX5Ymn/nTrH/UTu//AxhcRlojaPxdMD3iul2mCvSo9onKu4lbC/Dli6fGqT8LGRmQDm5wnc7aPdMzc6JdvyphD2NRbBLMJt/Xl/hCe6Qcy+KXi5E+qYEw8EKc89XH0Xi4kQnOSZE6nzxYsVEYIrISACMBKsOmhDUIAW/9FsvYQDpff5tfSVK7X5TKgJDgElrHp/Mb3wqbDJpqE0EGuFR4SnNMwS+Q3zxHDjtf6kNNaqrtM6cvmRb1/CF5enlyJFCjz56dH524fmog8xwKaDqITIAUtgsNkGXbJqbxM/ORdZjTWabOM+mhJpNTSB5URAruKgAjArsKvl0+AAPn6z5TVg1NYfrXs0Cs4QRJLnm/qZKbzbtIja1wZP486fih9L224Vn/bYN6eVvKQninND0NOc5xwb5W9EN+DnOjkbZm7fWQvzLMsgiubequUmflwwszvZkj1UC/jlqR2v4P3bjQI+IfkjppojLg2WiIE9jQCIgB7evjU+F69SyhXEmy1bC6tghNZaXeOUvpiasDRLAkn+lZv8keY2Z2zZzm1cyd97ea6vA9sQJgmcvs/TnTXq3SUS3QwESQhJLC8fTD9Nnf7iEbgkqYkNQc+r4tk+0ONn8TT2hBGWWpHuPgHv5FWuXnnHPrUovCJ++uKW+tQOSGwkQiIAGzksKhRIxDg5jhiupPgSEcq2Rbh1M8NfKXTYBTWV6qTWy7VSe3AAz3frIdC1sr2exvRPk5K4vQc3zaOhLmNPIps4Jm521eO212764shIa3y9v765lTe09pwnTBXCOdy7SKnf+19+ClgpknXElOWewOmiiRo7avKCYG1ICACsBZYVemMCJRZACNVsNekctOjDJ7/RAB48iYz4+a9JA8tIhBq3SbEjfjzJGMIAKd+4v3Ldp0/uJSIdxAPz6VBuUSRDZSZs31oM7D1Hypr3NjcDaQ3zjdicvXvX/SXS4LKq5XHEADGl8iCXIiSILuiRAjseQREAPb8EC6+A6iRUSfnQhIbTog1YWFngS+FtLm5U2H+OxcO5Sr/Mbbg8kpeHPioq8zTX7aHTe69ZobamRNpLkepPF+aK2qRDdQ5Z/sw2eCZ39qXEhMiNLhDIBeuSSZEMhfwwmmT7I1JuMQJzcmQJI0LERM57k8scg8M1aPfhcDGIiACsLFDo4Y1IsAmSDx3fppErU9IGRt2KdiFsR+TDY9TKBtRfvlMdD+8F4I3xhaMLR6bfC449XGzYCQ8Q4TCifpNh82n3OD+HDxcnl657Ajfhtq75mpfqwNf1FbyLuSXH9VyPxCyByFMglnk9A6BSL+z2YMdOQkwU0A0cJBMogiAxg9TxTYfARGAzR8jtXAYgTIZEE/goLefmb27PwVy2r5A7yCYbo/jlMzJN79ONlIRX7IjCm/MmsLJktSyZaKeWmvLHAKUxVOfPAI/7h8kEx/khUgGNjpy/5NzHie5MuwtvziHbzlvS2muaMldP1f7SofDKOwywhK8cOZLUovLR5tTpoWGMN6ic5DkOS5FwiSBVoEsgjiQYjpAm4BvCYQwzy742X4e4QtQYj48U1VCCGwQAiIAGzQYasrKCJBMhkWeDb5V8IjHu5sTIZtsEq71xfGrFLIN5t7jEAsusxkjaAw+4tjy2bgJJUQ7UTqYoa3gjnvU2Hi0523l3RAdLq8hRwCmgiRlauOW3PVzta88lUdhlxG25F24dPbj0Kn8sf2JvqwPDRBEDnKYXwCEuYQLmiBcJdmgDrQuaB3QHuG7IBECexIBEYA9OWxqtIMAqlviymthcTzGws3pDxUyJzzUvEn+2OcD8LLDvaK4/hXtApfZjJVTdcl4uEo2D1306sA3ADU0txImeUrfdq88p1ZOtggbWmn+wJO9tJt79czRPkhLnkrXc+Cr4QpZSlocyl3duQ8if54TPiSDLIxDFy+hjWB+JPzAjQRKuYkp1T327oKxc0XlhcBaERABWCu8qnwXEMCej/ocD3m85znZ4dmPFz0nRxbt3/ftIo8+dvgktTTC+BVwQk5CQh0S66witIkb+rhPniRGeOeTppdNBxXzAX2oWmpnegcaAlTfOB+iskZzAKEhpz5JhRJxIVIBE0CSX/Xmita2rrN9x3FuTvQc+KK2euSGRD+Mz5CQaIjESHjxgx+bOhogIjLwf4BskSioFFI/gztzi4yJaA4gU5gyXjL0Uv0uBDYVARGATR0ZtWsOBLCr5/cIoO4lt79ECAgBIbD1CIgAbP0Qq4MBAtjUsZPnNndOhsR5S4SAEBACW4+ACMDWD7E6GCBAtkBs8UmwK5MBsOV2OIEqBISAENjzCIgA7PkhXGwHuFWPOHnCvPiHo1brJUA4gn2yjwdPAOLhn4eWLRZYdVwICIFlICACsIxx3sZeEoL3zqxjhMjhpOcl/yn7X4Z24QiGg1jLs9uIpfokBITAAhEQAVjgoG9Jl4n9J+ztWFl/8IYnLjvayPH6flAX+32HAoPaLXlbApe6IQSEgBD4vwiIAGhG7GUEbtoRgKcXHSB3O+FcxPeTzY1QOULHztl7/JcX6pAPgLA6MsJJhIAQEAKLQUAEYDFDvbUdfZaZ3WjF3rH5k+c9yqe/YrV6TAgIASGw+QiIAGz+GKmFwwig0idf/uGHi/6rBElcuAOApEASISAEhMAiERABWOSwb2Wnj9BlxLty7wNwmt434DBm9pcupS4Xt3zXzD7cXxNMljyp/LdyGqhTQkAItCIgAtCKlMoJASEgBISAENgiBEQAtmgw1RUhIASEgBAQAq0IiAC0IqVyQkAICAEhIAS2CAERgC0aTHVFCAgBISAEhEArAiIArUipnBAQAkJACAiBLUJABGCLBlNdEQJCQAgIASHQioAIQCtSKicEhIAQEAJCYIsQEAHYosFUV4SAEBACQkAItCIgAtCKlMoJASEgBISAENgiBEQAtmgw1RUhIASEgBAQAq0IiAC0IqVyQkAICAEhIAS2CAERgC0aTHVFCAgBISAEhEArAiIArUipnBAQAkJACAiBLUJABGCLBlNdEQJCQAgIASHQioAIQCtSKicEhIAQEAJCYIsQEAHYosFUV4SAEBACQkAItCIgAtCKlMoJASEgBISAENgiBEQAtmgw1RUhIASEgBAQAq0I/A/Vnw4Xqv/e1wAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-109"><g><path d="M 75 147 L 75 168 L 74.65 182.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 74.53 187.88 L 71.19 180.8 L 74.65 182.63 L 78.19 180.97 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-110"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 166px; margin-left: 75px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">S3</div></div></div></foreignObject><image x="68.5" y="160" width="13" height="15.75" xlink:href="data:image/png;base64,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"/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-111"><g><path d="M 240 523.6 C 240 518.85 251.19 515 265 515 C 271.63 515 277.99 515.91 282.68 517.52 C 287.37 519.13 290 521.32 290 523.6 L 290 570.4 C 290 575.15 278.81 579 265 579 C 251.19 579 240 575.15 240 570.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 290 523.6 C 290 528.35 278.81 532.2 265 532.2 C 251.19 532.2 240 528.35 240 523.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-112"><g><rect x="222.5" y="579" width="85" height="20" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 89px; height: 1px; padding-top: 589px; margin-left: 221px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">auth-db</div></div></div></foreignObject><image x="221" y="582.5" width="89" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-113"><g><path d="M 430 523.6 C 430 518.85 441.19 515 455 515 C 461.63 515 467.99 515.91 472.68 517.52 C 477.37 519.13 480 521.32 480 523.6 L 480 570.4 C 480 575.15 468.81 579 455 579 C 441.19 579 430 575.15 430 570.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 480 523.6 C 480 528.35 468.81 532.2 455 532.2 C 441.19 532.2 430 528.35 430 523.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-114"><g><rect x="412.5" y="580" width="85" height="17" fill="rgb(255, 255, 255)" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 89px; height: 1px; padding-top: 589px; margin-left: 411px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">metadata-db</div></div></div></foreignObject><image x="411" y="582.5" width="89" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-115"><g><path d="M 336.37 117 L 383.63 117" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 331.12 117 L 338.12 113.5 L 336.37 117 L 338.12 120.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 388.88 117 L 381.88 120.5 L 383.63 117 L 381.88 113.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 117px; margin-left: 360px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">HTTP</div></div></div></foreignObject><image x="345.5" y="111" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-116"><g><path d="M 200 117 L 170 117 L 146.37 117" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 141.12 117 L 148.12 113.5 L 146.37 117 L 148.12 120.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 117px; margin-left: 170px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">HTTP</div></div></div></foreignObject><image x="155.5" y="111" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-117"><g><path d="M 193.63 127 L 160 127 L 160 291 L 146.37 291" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 198.88 127 L 191.88 130.5 L 193.63 127 L 191.88 123.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 141.12 291 L 148.12 287.5 L 146.37 291 L 148.12 294.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-118"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 198px; margin-left: 161px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">HTTP</div></div></div></foreignObject><image x="146.5" y="192" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-119"><g><rect x="200" y="107" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 127px; margin-left: 201px;"><div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Gateway Service</b><div><i>nginx</i></div></div></div></div></foreignObject><image x="201" y="113" width="128" height="32" xlink:href="data:image/png;base64,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AtuOgAjAto+w+jc3BDAZENaGetsLWdyi3+eGkforBITAgJOSABICQmDzECC+vxT2iXMoGfUkQkAICIGql7LgEQJCYO8igPYuT0iEBzj51EvnP+BIR0a91siKvdtztUwICIGVICATwEpgVCVCYHIE2Onj9U3YJJEDRFbU3mc8tMnOJhECQkAI/AsBEQBNBCGwmQgMHSKU94qYf+LfJUJACAiBfyMgAqDJIAQ2E4FWAkDsNUdbE/8vEQJCQAiIAGgOCIENR6CFAJBxkhS2pM6VCAEhIAR2ICANgCaEENhMBMjsSJZGnP/IoMdR0KRWJasih9+QMZBDgSRCQAgIgRABEQBNDCEgBISAEBACM0RABGCGg64uCwEhIASEgBAQAdAcEAJCQAgIASEwQwREAGY46OqyEBACQkAICAERAM0BISAEhIAQEAIzREAEYIaDri4LASEgBISAEBAB0BwQAkJACAgBITBDBEQAZjjo6rIQEAJCQAgIAREAzQEhIASEgBAQAjNEQARghoOuLgsBISAEhIAQEAHQHBACQkAICAEhMEMERABmOOjqshAoIPAEM9svu/YSM7uu0BICQmA7ERAB2M5xVa+EwCIIvN/MzpfdeDcze9QiFekeISAE9j4CIgB7f4zUQiEwBQIH704X/HW34B8he9jFzOydUzxczxACQmB6BEQApsdcTxQCexGB05jZl1zDjmpmv9qLjVWbhIAQWB4BEYDlMVQNQmAbEDik2/3/s9cIbEPf1AchIAQCBEQANC2EgBAQAkJACMwQARGAGQ66uiwEhIAQEAJCQARAc0AICAEhIASEwAwREAGY4aCry0JACAgBISAERAA0B4TAOATeZGaXzm65vJm9of//IczsSmZ2NTM7u5kd38wO03vSf9nM3mJmTzOzn4175L9Kn9zMrmdmFzGzU5vZ0fo6fmJmnzSzl5rZy8zs71nd/P/q2f9va2ZPDp59czN7evb7583sDIU2rrv/fJM+a2anz57/JDO73QjM6DN9z+WeZvbwEXWoqBDYegREALZ+iNXBFSPw9X4xTtWezsy+aGZnNbPnuYUrevQvzew6PRloaRoL/WPM7AZmRqx+TT5nZtfu20M5iMYxshvObGafCSpggb1N9vsLzOyGhQdN0X/6QBbCJH8wsxOa2S8aADujmX3QzA6flYV03arhXhURArNCQARgVsOt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aBsH3mDPj4SdP1oCnP2S/KOPGIhy+u9+L9UCISAE9hQCIgB7ajjUmBkjQErf67r+E/L37P7oW9LiclDOifskPhx8c2hXfmyWwhnDra4LASEgAqA5IAT2BgIkwnmvmZ15geaQH+A+HUF42AL36hYhIARmioAIwEwHXt3ekwgc3swe0x1wc1MzIw1vi5D7nlS++ZHFLfepjBAQAjNHQARg5hNA3d+TCJy0PxaYdLb7mtkxei9/8v6Txhevfxb813bHAHNcrkQICAEhMBoBEYDRkOkGISAEhIAQEAKbj4AIwOaPoXogBISAEBACQmA0AiIAoyHTDUJACAgBISAENh8BEYDNH0P1QAgIASEgBITAaAREAEZDphuEgBAQAkJACGw+AiIAmz+G6oEQEAJCQAgIgdEIiACMhkw3CAEhIASEgBDYfAREADZ/DNUDISAEhIAQEAKjERABGA2ZbhACQkAICAEhsPkIiABs/hiqB0JACAgBISAERiMgAjAaMt0gBISAEBACQmDzERAB2PwxVA+EgBAQAkJACIxGQARgNGS6QQgIASEgBITA5iMgArD5Y6geCAEhIASEgBAYjYAIwGjIdIMQEAJCQAgIgc1HQARg88dQPRACQkAICAEhMBoBEYDRkOkGISAEhIAQEAKbj4AIwOaPoXogBISAEBACQmA0Av8LQdNQ+dOiFboAAAAASUVORK5CYII="/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-120"><g><rect x="9.5" y="189" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 209px; margin-left: 11px;"><div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Storage Service</b><div><i>seaweedfs</i></div></div></div></div></foreignObject><image x="11" y="195" width="128" height="32" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAACACAYAAAB9V9ELAAAAAXNSR0IArs4c6QAAIABJREFUeF7t3QW4dU1VB/Bld3cnNhZ2K9iBXdjdKKIYYCuKYic2dmEHKjYWWGCLYisqFnafn+zxGeeb2XHuuefe9+61nud94Ltn8j+zZ1bP40RSIpAIJAKJQCKQCOwOgcfZ3YxzwolAIpAIJAKJQCIQyQDkJkgEEoFEIBFIBHaIQDIAO1z0nHIikAgkAolAIpAMQO6BRCARSAQSgURghwgkA7DDRc8pJwKJQCKQCCQCyQDkHkgEEoFEIBFIBHaIQDIAO1z0nHIikAgkAolAIpAMQO6BRCARSAQSgURghwgkA7DDRc8pJwKJwI1H4I8j4tk6s/zOiHjTGz/7nOAqBJIBWAXT5kJPGBEvEBEvFBFPExFPERFPGhH/GhH/GBF/HxG/FxGPiIi/2Nx6VkgErjcCuf+vfn2SAbj6Nbj2I0gG4HRLhNt+24h4i4h42Yh4/JVNPzIivj8i7h8RP7eyThZLBK4bArn/r9eKJANwvdbjWo4mGYCLL8tTRsQ9I+IDI+KJL9jcD0XEe0TEH25o514R8QlV+V+JiJfcUD+LJgIXQeCq9/9Fxn6T6yYDcJNX90RzSwbgYkA+Z0R8X0S86MWa+X+1/yoi3iAiHrKyzV9t+k8GYCVwWezCCFyH/X/hSdzQBpwfz9KZ2w9MQsYNnXZOawsCyQBsQev/l33yiHDZPu/xTQxr/klEvExE/PlC2y92MDk8vCmTDMAlLEg2eRsErsP+z2VJBBKBCyCQDMDx4H1+RLz/TPV/iYifmC5ojn4cADkCPndEvFJEuLzn6Csi4t0XynxyRHxUMgDHL2LWPBqB67D/jx58VkwEEoHI1wCP3ARPNnnvu9B79IURwTb/1zPtv2JEuORFCvToPyLi+Rb8AUQRKFNTagCOXNSsthqB67L/Vw84CyYCicBtEUgNwHG74s0j4tsGVb8hIt5+ZbNPN9n6n2dQ/q4R8bmD35gIen4CyQCsBD+LHY3Addj/Rw8+KyYCicBjEUgG4Lid8GEHdf59BlXvFBEP2tDsW0XENzfl/zsi/vQg3X/NwXTwkdVvfAKeaUPbpehXR8S7rKjHrnvHg+nitQ6hiS8fEc8YEU8fEU80aTNoNGgdmDZ+JCJ+aUWbdZFfjIiX6tT52CqS4Uki4h4RARfmEloWuROMbY74YriYjJt55Rmm/Av/GRF/c3B84hX9s1PI5QMjAsbHkJwO+vHvhSdHqyc4mIP+8vC3hx3mJ9GKdfvnqnF5H9Rr6W06az83pleIiNeOiNc4aI844Fkb+HAcZWb6+YPvyPccTEw/OJmcjpnfmjpXtf+XxkYb9vrTHn7BCZ+njoi/m/D59UOI7vdGxHcfonYevdTY9PtnHup/SKfsj07fSfnpnQ/f7Hsd1vNFIkKfSDjwB0fEXQZ93TkivmvlOBT7nMN3+EGD8m8yzav8fKooAN+jM82+s/+cCb6tx52+qz+YwpftO+fesd+VcV/G+m2Ad39FkwE4bs1d/g7BHt0hIlx0a0nSFLZ8H5LkQP7JDcBnoKXLYgCEcjlYHHRPu3bgh4Php6ax8yxeQz8WEa/eKfhZh+RId5su+R8/HIov3ZSZYwAcuJ8WEW+0ZgBTmd+Z/DeEXW4hl/7nRcSzLlTCvLkQfnia02NWHtqjZjFknxQRzEZr6Pcj4u4zWqo1bcyVuar9PxrT7Q4/fNyUh8PFtET/MO1b+673ndX1tYtBbQnzW/bp/SLiPTtlMAAuTExHj758o0e+MwLj1xJmhsf/v1c/XJQBcC6ZkxDnZ14CdPrdd2XfbWFqVL3M9Vs59H0WSwbguHUfHQpa89F82XHNLta6DAbgJSap9bkWex8XcADKg/BvC204CIU4tgQvuNFUvFPn9xEDQEugDillK5FUOFB+6sqKGCQS2FpyGEsKxSTj4O7RkrbI9/mJh4P9o9d22pTjqGfcF5HKel1f1f7vjUVa26+NCH4JW+mnJ40BDc2IRtoOmjAX17tOvjy9+hiAX46IP5u0EW2ZR00X95r10RYNT4/4HLUOyRdhAGiWaLI4Kx9DXzlpQ/gxLdFlr99S/7v+PRmA45afOt0m79EfHVRhrzpz6B/X42NrnZoBcAH50EfOjFvGSiX6uo0U0tbnN0GKbumbJhOAnAa9PdljAEjFVN2Pt2WQnbLvOF0gc81Q1X77ESYzqmfZIWV67BFtCHPKiEaS5ZYp8yHhS3JKuqr9387hHSYGcI3UP5q/S/XVZjQBGNueH47L+zkmjd2zDxp3aT/0YLb7osO3+z6DMrQ6TFNL9CmNObAu76L+maaBYxkAGosHH76J518a0MLvD4iIt1xgPs+xfhecxs2ungzAcevLaY+qfkRssh8/MQkur1MRe2Kxhft42DlbwiR8QfNHUii7Z03s67+woPKn5mTXpsKm9nbpFvtmb06fPbCXlrIcJF2ILdEMOLDeewBUywDwSfjdwWMnmmCa+JaDVkE+Bbb3N5wOo17zbOdsj9TCPaJd+M2B6rWU1wbzBl8DuMKJXwDC1IxCPl9lOmx7/dKE0G70iERJG0GC/adp/MqbZ4/Yb5kjTkVXtf/r8fO/cLn2mFchuF88MV6+RZcaG7ksm2Vd6raY4Ki6e2RPaqsle1J79vSICgOAwWDa6tG9O6G8vXK/MYgY8h30LutjGAD3gW+RH0WPaCowB4VR58/zcjPzZw647+D3c63fqfb8jWwnGYDjl5X9mAQ9Rw5nznL+kfRcxGvUYmtGxemmd+CvjQLwIY9UfL82OQ06YGty8X7MwoFF++EC7tHXR8TbdX7wBoIDgS8C+u3pcnMpczhyqXJAKuTg/dJBHxzwemYE6n4HfY9IZ18y+A3TxVY8Iip6qZjrdZUX38UAizkaSX+YLOmge46DVMocNXshph96YBA/o9OhSwKzyCHyVHTV+9/31MOX1gUD1vPDwXDRGrUmI+Ya2TzZsFvi2NfbG/81MX36QhgNTBZm8Kmmy1pdDLRzlhmIxqAll+ntFxbFt8GBsUf2Xs9H4RgGQN6RkflSe0xarRmCFus7BoIBR1imRQ6yLZ1r/U61329kO8kAHL+sPloXJGeZteSDUIe6zgX8k5PUuLZ+Xe4iDMDrHBzKeML3yEGFq597pZB2AyPQIxLEyCGPrXbkEa0tPgQkrq9aAGQ0d9UcliT2lqwT7YjXGVui3u+ZJpSjJWmdEkt9NnYq4h65vB2WozwP6owYgJHd2aVj340uA22O/Cwwi9JWn4qucv+PQmDNbY6Z8/sI208/aFM+vAPOHLNZ7wPS7pxDofaV6ZEIFo6/I5pjXr062mNctjIA7gL7qrdfMY6ia3wLPXrrw3fHjNcjZwWfkZrOuX6n2u83sp1kAC62rC4Nkt4WJqDu0YFOUnGh+YB6F9dohBdhAEhB1MKjj5n6fI7M97cmybwtR01IJdkzkSwxACSmkWRf98P80QsLdFDN1R/Nm8ahZ06ZU3XTTvDIpvYf0RsveESPGAAHek+tS8IcrVsZg9/NsyVr6qA+JV3V/rfGLuaWmKqo+5kARmTfkNZps2piViGht1qSJQaAVmuOqS19YCJHFygt05yDqXwfLs2WMJgu5h5tZQBG+0bbzqae6a7ud7RnaUA4Gtd0zvU75X6/cW0lA3DxJfVhy+jXbvJjWnZw45jZdpfoWAaA+vNvB0wLVZ1wojWq4l4a4jJmqkSYtDTHADBdsCmu8Yhewmb0+6h/6nRJmVqak2zkbhDHP0e+L06hTAI96jEA8BdG2CNaFyaHOfIiJa/21tZNNU77cWp8r2L/Y9h44LfE1MY8skQj9bO5tLkt5hgAEj8mEfOwhjD4PUZzbtyYktHroCI8hKX2aCsDMBfaidGjJZsjTFAvTJWQwzRVhyiec/3WrMtuyyQDcJqlhyOP1w+Y7JIXwdUBLfmIBED1R9OO9FgGwAE5cgj7ukOiH9L1GnrNybehV5YKX3hUS3MMwJzD0JrxrCljXOLzW3KQ955yFns/CsF734FzWNu2WO93GwyuxwDYRyMNjP1ljZYIM9WLF+fsOOe8utTu6Pdz7n8haj2bsrF9Y0RYlyXiJNvL1tljXOcYAN8gLc9aYqtv1eHq8h/h64Ixb2kUhaAOxnJkqtvKAMz5BBkbrckp6Nzrd4ox39g2LnJR3VhQLjgxIUGvN0kiHGR6T3Ku6WLpMj6WAZDsB4PRI7ZGXslrSHKQkeQjrKknDcwxAMVjek3fdRmSO0n8lSctDBUwJ6wtZpkRAzA3XowUyW2J5vDuMQAfsWENlvpuf+fEJTzrMumy9z9n0Dbk7VTzIU23mfbmGAD+BD2ny9F42OuZznrEORYD05I9htluiT/HKOpD2a0MwChbJaak5zdzLObnXr9jx7mLeskAXP4yc/Bx0LvgeN1Tcz/+ym7nbOLHMgBzUi3veV70a0js9chUMLKpz12oIgBGGfN645H4xVzeb+Nl32trxAAInRw5NI6cDdv2e6meS5keAyCrYc8Zbc2aLJWhQWhDRJfqXPT3U+9/IWqndGas5/etUwrq+m9zDECbfncNVpyAZQttqfeGiKyc8g30zgsajLkQxC0MgPZH2ka2fYzLqejc63eqcd/IdpIBOP+yurhoBkhj7GatM1I9IrZgIXC9j/NYBmAuKckaW189PrHQvThs6kJqw5ZGDAB1Zi8+e7Q62hZ3Lw3wKWjEAIxSF+uTip19f4nmDrweAyDkDON3GbRFw3MZ/WvzovufpMzx7jKID45kVjXNMQBzeRxG4xuFapK07es6nJS5qhcRwwHVmyDCjEe0hQHQ78iUsDaseO16nHv91o5rl+WSAbjaZZdcx4E/l8ee+s9F1NKxDIC0oSM76VYGQFhjz3buMOk9WjRiAKgfqe3XkD0rz8BcmlJ2bpKLg7I+UHlMY6haGjEAI2cx9TlnOWSXyNq2SZhKnR4DMLc+S30t/U67wMRwXeiY/T/nmHnReclHUeeb0N4cA9BzGlwaA7s9p75e9sLWrCS+XhbKlu4/8GWpy21hAOYcTx9+MBu9+NKkNvx+7vXbMLT9FU0G4OrX3EHgMZ1ReNfI8/tYBuBUJgApeEdJjWQt60nnIwaAh/pchsF6ldj7e7ZSZRx6JIxRIqKtToCjmHp98eZm6liiufH2GIC5lK9bGbSlsV2H37fu/7kcFpeR9niOAWDOk5hpK400S3UmzfLKY++dCxgsPWS1hQHAxNevV9bzGWUa3DrnUv7c63fsOHdRLxmA0y0zVf7Sy2Kj3jzvKpd+j9hs2W5bOpYBmMtst0VFLMOXV+d65ALuZWk7BQPgpbGR57WsbCMcjVMok8dHWhppADAao1A/6V0lcloi9nySd496DMDcU7tUwqS/60jn2v9zj+J4n2MUcXEsZpfBAIzSC9f2dvu0F3o3ylfQzm8LA6DuSJu35inuLdiee/22jG13ZZMB2L7kvJxJt5zA/Cv/nzTIE/0Ymov1LS/lte0eywDMhe+tTWpiLDyQjaFHI6blFAwAW2nPXDAyO9TjI6318jWMGIC57G1rX30cvXBoXD0GgGOZB5p61Muqdsx+u0idq97/1l7ypd7ZJd8+ZvqUdBkMAOc+WSl7fi8lVFMejV4orQgefgRLtJUBYOsfqfqtuXc1TkHnXr9TjPnGtpEMwLal5S3LK9cH3CP2Q3bErYRxGKmtJX7ppd09lgGg7nOJ9pwPxVcL75O8Y4lc8jzwe8TznUd1SxdlAOZUlS53KtkRsf3zDejt+REDMPcgj7l4SXCO9EVi6/lDqNdjAIQx2mM98qpg7znlpbU61e/XZf+PHsZhSuLQNpc/YysWl8EAGMPo+/VNeXxotG/W+h1sZQDmfE84Ky85XkrBLDV2j0j9dYKlc67f1vXeVflkALYv95xEZ2O7zOfSw/Z6lFXOpdmjkdp3dID48HuPjtRtu0jkKujRmlhxXDzbYC97njSsHJ16j9VclAHAeD16MG6OVcwSIxLj3TOlKO/C6OUN8IofJ6geYaL0N/eWPJu9J5BHNEoFLFa8F3rlrQSOcyMM9MOXQtpWGpH6Xy/JzPbd/9gXCnuPLWnrXPt/LlJiTWie54ypvDG8BSORKz3G97IYAJeq76El2h9Mf/sQl3Jy9Xu0aA1tZQDmElCtSXhk3LBvyfeBKbN3C51z/dZgtdsyyQBsX/qlRBbseNTDo+c/6x4d1uzDo7AvFxOJvHeZjmzhYvNJkb06pe+5bICPmB4DmmNi5rLbzT2Qc1EGgMMYTHoe1A5vUn4vNE9ol9jxuXfjPd7TexJ4lOMclnPqWEySQ3zuXfURAyArIvNDj4RxjjQvystcyNGzJRcdfEbOXmu/hOuw/+cek6HK9phVfeHUcxtp2+wfc5N3v6bLYgCEQ1qTNozWhWlf9TIGbvHR2coAMEfw6cFgtiQ7KdOKqJgeWQ+az973hWHEcNV0zvVbu693WS4ZgOOWnVQ3ej2utOgRDN79nvukzhOzS8p0MUiO4rChzu09alPa6CUHKb/JFNhLZ+p36nkpROfyvjM5jHwWHIIklPaVMRnBHE7tB13GZI78Ika5yy/KAOjHU8Wj+H+SCumX4xJi5sBcydZWJHyY9Pa9p50f1NkOnlu918w2cVDz3K/VzvLDU5m2IWVtMyMGAM4YGZdEj5iEvMXQSqy0N/rtaTNGz8Ye8wVch/0/l7pW+Jw9yiRQk70p1p9NuyUOnRw7W7osBkA/IydTGp5Wu2bf2lde61xDWxkAbc45rGJW7K/WVGkPM/f1GAfCCJ8b32xL51q/NVjttkwyAMctPQkbx9uLKT+uxdvWopKk7hsl6KAmvOdMZ1TXXh9jNzfe9pEUY/f7yJ/Bx0uLQa3r8MG08LLvxf2XYXhHYC5X/SkYgPse1O53m5k35yprY5zspXVCIqFTLs022YvmHKwuepoTly8GDjmIMUJz6VCpkl0gpDeHtAQxwiSRB2BGTwKPGAD1aJHuNzNPmhr5BczX+oq6IPn2yPgdxBeV/kvb12H/e47Ya3ij/egSxQjACZOtPMfVsi41TrQF9krvorpMBmDO4bNdR9K3BGJr6RgGgBbAPh69MKhvFzcti/MBZnOOzx4YusdgwOdav7V47bJcMgDHL7vLmYTfkyaOb/WxNR1eQt3mcp7PhQ62/XMqY0poidTLdtfL5rd1DqTg0cM5pa1TMADs7iIutuT61z+GSgpWF+sc46Rs621P5X5MCl3MG6mql81NP3MMgN9J8/IaXITY/u0Vh/Yp6ar3v7nQ7rAnX4Qwt0IHR2t0mQyAPYyBW5Nrf+1T2QWLYxgAdTGwXiPtnRdbcKbdoEWccyg+x/ptGfPuyiYDcLElJ12ycUn3eioivXL8Gz0aUvej7Ejqq8uNGABleM5jApYcB0fz40Evs6AY7CU6BQOgDx7HbOFrySXI6RFe1MAkvbm93wu3k2SGWWUtMUPYFw73UVjfEgPApio5zJZ+6/HRZFDbtnbttXNYKnfV+9/4XDJC5rYyhOpyWLV3R5e/MpfJAGhfmK9XCOfIN+ZC3uLIeSwDYBzSXEuCxQn2GHIWuNxHicLqNi97/Y4Z/27qJANwmqWmmvN8LzX72od+6p5xybhul8zoKdjeSKnxqbXnHM3Um2MA/M4Z0at1d92QktfHTd3PFt36CoxQPRUDoH2HJs/+Xqa0un+4sgfXY/zUGdWkuj0GwLfC9MD0stQnvw+e8kKfRgld9LM2bJQ2SL+9HAY9rKm0XSx8BeYiBk6z+x+rmr6K/V/GT53M8bHnhT6ao0gY2hlrNUeXzQAwq/V8T+oxecERI7eFLsIA6If/iaRhcg6s0VCoI0pBpM1cMq7eHC5z/bZgtruyyQCcdsldpOzLpHJ239tNFyobZIlh52nOVvzISRJla3YYjWK/l0bIe52K+s0m6ZY6n/MTL36HgKd5pR594FJDBwc/L/JJSYyRMQe2XjZwkqiLxD/j9YFrb2tykFMyAKZjfCQNYybZw9/lR/I1b06UnL56RMuirsOnYEbrAisSJdtxj2hK+Dq4lDFgpGASmj5J2hzk2OaL6nPuNUB9L11AZQy+VU5qUqn6X6GW3lbHjNhTVMn8Pjwf68IY+Y6s2AZHF7mK/V8PlnMox1qXqoQ68OF0yzmVb4cLCkPIaY1vxhq6bAbAt+U7nXs2/JgU0BdlAAo2zgTaM+ZC8fz2uzOBL4UzRjiwb82e9+3MOR4v4X0Z67fU565/TwZg18ufkz8DAnN2Toe+izspEUgEEoGzI5AMwNkhzw53hsAoakHYIDXrKbPW7QzanG4ikAhcBIFkAC6CXtbdEwJUtVL6MgH45/9zRFxSeVLL95ypRg8m7QnTnGsikAhcIQLJAFwh+Nn1LYEA5zZqfDb39vEWceUyDI6I7ZR/R48kEOJsmJQIJAKJwJUgkAzAlcCend5CCHgOWExzjzjacUAsSYPqMnIOYA44KrYkIY/ESmn/v4U2Qg41EbhpCCQDcNNWNOdzagSEdfIeF9HRIxnRxPnLSicjoMyKsvK90czbA8IQaRaSEoFEIBG4MgSSAbgy6LPjWwgB6U7FaveeUN46DWGJTAdrkqRsbTvLJwKJQCKwGoFkAFZDlQV3joD4comPxLofS559Flf+mGMbyHqJQCKQCJwKgWQAToVktrMHBKRIlZFP+tLeozIjDCT7ufeU238POOUcE4FE4BZAIBmAW2CRcojXDgEhgHeeMvJ5FEeEgIyM/AVKFkaZBGVIYzpon1C9dhPKASUCicD+EEgGYH9rnjNOBBKBRCARSARmX0RLeBKBRCARSAQSgUTghiKQGoAburA5rUQgEUgEEoFEYA6BZAByfyQCiUAikAgkAjtEIBmAHS56TjkRSAQSgUQgEUgGIPdAIpAIJAKJQCKwQwSSAdjhoueUE4FEIBFIBBKBZAByDyQCiUAikAgkAjtEIBmAHS56TjkRSAQSgUQgEUgGIPdAIpAIJAKJQCKwQwSSAdjhoueUE4FEIBFIBBKBZAByDyQCiUAisIzA/SLiPatiXxkR77ZQzdsQ7xARbxoRLxkRTx8RTxgR/xARv3h4I+JOy91miUTg8hBIBuDysM2WE4FE4OYg8NCIuEM1nQ+KiM+bmd5zR8R3RcTtB2V+IiJe/ebAkzO5FRFIBuBWXLUccyKQCJwTgSeIiMccnnR+oqrTV4mIBw8G8VQR8QsR8Xwzg/yciPjgc04i+0oEWgSSAcg9kQgkAonAPALU979UFfmviHDJU+X36JMi4qObH37mYAb4joj4s4mR+JWIeEgCnwhcJQLJAFwl+tl3IpAI3AoIsPV/eTXQ34qIFxoM/HEj4o8j4lmq378xIt7uVphojnFfCCQDsK/1ztkmAonAdgQ+PyLef+WF/jIdyf4FIuJ3tnebNRKBy0UgGYDLxTdbTwQSgVsfgZ+OiFespvHhEfHpg2ndNSI+u/rtNyLiRW59CHIGNxGBZABu4qrmnBKBROBUCFDp//3hwn+yqsHXjogfHnTwNVPoX/n5SyPivU41mGwnETglAskAnBLNbCsRSARuGgKk919rJiWe/9GDif56RLxw9dt7NP4DNw2fnM8tjEAyALfw4l3joYuXvvOU/MRh+LQR8eQR8d+T5/QfRsSvRsQPTLHSI2/qpSk+b0S8/UEaE5L1ooe47KeLCHv6byZHrJ87qG4fGBHfFxE8t4+lJ4mI153+vVhE6PcpI8Lfjf0vpsQu338Yx7dExD8tdPSwJj78bQ5q4m9eMTjhaI+MiGeryrItszGvIY5oX18V/KmIeNWZiufC1xBe4XDRvtWkahc+9zQR8S/TWj7igD0v+m+fwuvWzLVXRmKeN4mIN4qIl4+IZ57W0XrBVWz+l0WE9Sl0l4j42uq/7d3nqv67TRC0Zmzm93tNwaeexvWa015+zoh4immPGd9fHxwJOR/a0w84JBf65TUdZZlEYA6BZAByf5wSAZfkpx0O6pfY0ChJ6mMj4gs21HGAssHKsLZmDztsP2RiNjZ0E9S/6t3jML5nWFnxrw6XFjtwfdG2VamP71j9UYY5F88SySpHxVwT5uOZlipOv/98RLxsVdZF+L2duufCV9evdbjo7jsxi2um4ZJ+34ggaW+hNz5k4uPM52KdI4zi50bEh0XEf0TEfab/X+oI5XuzqoE2QdDSmP52Ym5KOYzOPScnwzrPwFI7GNv3jog/WCqYvycCIwTWHJ6JXiKwBoFPiIh7rSk4KPOFjaf1qCkhWZiFJz6iL0wDB6419KQTw1Bf1GvqlTLiwD9lUOEbIuJtq9/udogr/6wVjUsf+1JNuX9dicUrH1LPkvgLPfwgSb54p89z4UubYc61d/0KCP63yD9HxDsetCjftrJCLy5/qSqGDGNGe/T6VWHMqr2OegmCltr9kYr5o7nR/lzCoLn2MJuvFhEcDZMSgc0IJAOwGbKs0EHg3TsS7G9HxFdNqltqU2pM0g616+tMB3itytYsFbWY6RF9/EGV/zHNjySq+x8OQgerfv5tisGWZpXz1TM25T/0oPb9zBWrSNJjxqjpUZOqXgKXP59MGtTBrzTNx4VQE3Xuj3X6ImF+YPX3jztoMsxtjkjKD5oKwBKDUggzhBGYI5flm1cFqLZbLcW58CXpfvchkx5nupqYM75uyrAHXyr755ku4HdqMvGZL0x46M8RRgwDUNPfHcwonPN+KCL+6HCh0/S4hN/iEK4Hl8ebCr/etK+fvapMk/A903+rV+8v68qMUcj+/8imb8yL/q0fhu4Fq9///eA/8E2TVoaGg3ZMH74Z5Zi7aNn8rZByGLn/XMAhf04EboNAMgC5KS6KgEP6TzoHIal27lDiVe2yp4YuNBcy9QGd3OuSs+iHl3aPZGtjk68vGnbl55/GPJo7m3zLiMjrjkEZ2fddID96cPh6jqpR/+2SaommpEiRfqMCv/vCQrh03nAqQzrlXFaICYApYEQuUZdrudjYu2/XrM858f3W6bIt48W0UbnT7Iz2DF9+nF++AAAQ5ElEQVQSPha1/V02PRoRviU9ovX48Wreyvjvt4wI0nOP+ERgTuwd2f9ajQtmwH7vEbt8bf56nwMz+iWDst4SkA64EIbHPuUbM0cYAMxprQFb60Oy0HT+vDcEkgHY24qffr6kXNJ3od+dnNLWON05ZJXnvFeo5yDlUGW/9pJaIZqAT1wxHc56DtX6Yl4yBbQHOQc0GgUS2hy1DmMuM3P8x6YS2+0XV39bChWTdY6k53vVJjs+6bGQy5yj3IjEpfNLKETtzuRS6Jz4st/Xfbv8MTajsLp6Ti89JdmpJWB1qdFbgpV8/PUFjsF8uZkUvqWNHgPotzl/i/LKX60F4tjIaa9HGBHq+0LvPGmyZpbx/35qtRr8QmhIkhKBTQgkA7AJrizcQaBNk0q6q9WgS6BRS/N2ZjLg5czbuaWfnby2y995zDuk1xLpuk7cIqyLN3+PqGZJo1Su/rHTcjYs6ve5PqV//dOmQC8LnDnX9mtq39onoO2j9jQnnXIGpEYuJPucy65HGCCpaWGMXGKkaJqQQufClyMlh0wRIYXe7+DE+EVrF3JSvxdNiGq0BrQXLdmDbWQFJo4T4RI5FzELtXpeHY53zAI9wmjUTBkGGOYjjRFzVc2U2o9tuOFonBjmd5m+F98MjQ6HxaREYBMCyQBsgisLdxBwEHkbvRDpuVWbXgQ4dngqz0LC7mgJ5lTebX/tYy5+F8JXX4IXGWOp67KtL2Z/7zEA1Mz1RUSCrS+1eiwuTZdFUflSAZMe67FzVKy1MHV9JhImhkIfdbCl37v673Piy+mvfgGPdCzD3kiF31sT9WuHScxLnaWv1IEH7VShkTlmtO6tn4ZycINfj971EGHwFdUPSxkAf78xZ2Ayv/MUmzDbSATWIpAMwFqkstwIASrVVs25NqxtDaok79qO7mCu1dlr2iAxtTZf0hfJ+JREld7GZ+u71WpQ6dee23Px+LzOOQkideQ7QLWJhUZBjHxLbP5MA96mR3wlhMHVTMq58KVZ8RIeJqnQaNxza8JRj5apEBMSn46aaDhIxfX5RsNC07KWhH+2zqJvPfmU9NpoGQaRHpz2RtRGFzBTMQnIYZGUCJwFgWQAzgLzje+EsxQpuybSEIlpzja9BIzLiqRU71P9cP7aQj3JnHqX2eGU1Mbp8+KWNa4liZHqTHLm0+KnDm950n/xNK+dymgAStw46ZPHeUuc3ThBFpKj4SOq/z4nvj1sOC9u9V6XyKeWlDEVz9pMvHVoFDFgHbYknGp9FXSB0cBw9IhGp06qNPdegPok/pZps9bWh3mIb0RSInCpCCQDcKnw7qZxYUgPbmy7ZfLCtEhe1PgOuC0kjK/2oibBtqF5a9pz+NcXoTrs9Tyv54j6/k5TalcMg3As0Qv+uXzb78ffau9slwK7c0vqOeBFUCDSqqx7LfH05yCIaBFoLYpN+S8r5oJGhATaUv2IjUuQJqCe8znxFXJYP4kLG9qNrWQ9OMEV6j3Ny0+iji6h5VBvC7WOdrQmwlh75grrKRy11m4IdRVmOEeYNs5/LWEOMQH+MV0sOZ9umVeWTQT+D4FkAHIznAoBjmgu2aJu7rXLk1+ct9SqPWe/tk57aZxqrNoZ+QC4lF28wrTqnO7H9C3Mq7Z51224iEsGv56mwLdJLVxekmuld850wvtQLyJCqlv28UIYKRqEms6JL+dITNepqecDYG+5rAtJyFQzDWvG0Por8Lt4jUFFPimtpovWBpM2RyIGOKfOmbSYBGgKMAs/uWbgWSYRWItAMgBrkcpyaxAgAVF9CjOT23xEpFiSrTC+0aMq6spWN/LWXzOeURnpU3uMChWveP+LXvyl37nQrnputAFtGtg3qNL08vB22dc+C8wGJZNfL4+APAYlUoKanQajVV+fC9/W5HGRtWvrfvXkEV/+TpPSzlPq3tqRdE3/PP5J8YWEUvIL6FHrlyBPQJ08aKk/jIW8EHPvMmiDqU0OiV765qU+8vdE4DYIJAOQm+IyEKAi5zAlXSsVeB23XffnoHRJMR+0ZG+Knyepn5qoiNmSaxJLT8Jq8+pT/dJseLhImBbJ3bhatSzmQbKdmuZCu1ov9TabX/1egMu8Vp/rw1g9goRK2trSN1MBDUExMfTqnxNf8fByKVwGtZkdWx8Bfco42YZnLo2l1tAoK86+fYehtNGmGnZB1yaIpb7K75xIhdX6dpibRiQslIZqKfvj2n6z3E4RSAZgpwt/xmm7UElgnMBkZmuJNsBFRrqpSQx1m+FPeOFlvILmO6DibSUwmQZdMG1oXw8+Ht/MG4WkfDWHkZNbLaGrI9yvRCq00QS9hDK1F3mbF4G5oH7zoIfbOfGVPpdmpRA85zREF9meUizX/hA97cpS+6IIOJ/WdPuZLH11lkZ1Pnl64Gepn9HvGGZ7US4DjB8NSktLUQbH9p31doRAMgA7WuxrMFUhbELaeKfXRLJ2wNYOVr2kOsdIcmumTdVL5VuT9wV6Dlqj9tpse6P49FL/85oENnUGRH3TnqBROzUDUSeooX2R377YwGku6sdsSv/nxLd9hnjLE8Zr1q8uI/KkjnToRQkstcmE5eXAQiIuJC8aMXNMM/W7Fvb32oeKlsbCNCTXhncaWu1UpgBeQi9/n0UgGYDcIFeBQC/vfPtwTu+CIjWukca3zql9053UKLRszj+h7aO1p48y1JV6HPfqB4CKlK5fUQEl7fEofp0PRXkPoGYS2strlP3unPi2DMCpk0XVa+Hirl8YHL16OLdHME0SLhXivMqpskciTFpnv7lwwa17s5SnIRI5IYdEoTnHxGP7yXo7QiAZgB0t9jWbavs2PZsmqbgQyafN1Df3EMtFpteOhf29falurn0Odr/ZFPBCYp0Zrq3fxplLAsOuz2O9vCBHsuT810vzKklNcUorWed8z8YhfBGxu3upsEfnxNdl6lItxGOez8VlEH8I2BeSnvcOGzqCHTxrvxXvNlivHtknP1j9wGyFUd2S3XDt8GrHUHVEO9TvaKxtJ8slAv+LQDIAuRGuCgHpg6k2CwnTcvnVVMe6+7uMgOKitxBnqqV4f1EBkuIUWnqcp+2fPbbN5b+UsKj1HJdjnkRHfV+SB93j8GzsfQaTZUopcfTqGD/HMw6OheRMqG3vbVPnwpfpp37ljobFI0lbUjG7kF12S6F1rQZA7on6BcGlvdPuS+U93kRL1CO+FnwuCmHi6kd+lvrb8nvrm3CMf8OW/rLsDUcgGYAbvsCXOD0XDs9oHsvU91vU5YYlSUqdnKWXza59w15sttz2a0l4FWmex726pNCeZNbmZd/CALi4PVNbE+9sTnZzCVxcEi78QhwlXYolox/nSBqPUWpYzomfMVUukmAdOdDzq2hxOxe+zhlvN9RZEZeYk3asTCby8HO05G9Btd+j1rRivanP1+xP0rw90kateH3xoYP+2lwKtFi0WT0SlWG/2OtedxTSt4U40UobXWgUzrqlzSy7YwSSAdjx4l9g6hLKsHGXg5LUJHxpLVH/OgBLmJp6vSdtMRjivAs9Zop9bz20e/2SOqlm6zSxo6dj26dZR6l5234kP8JcSOhSZwAk7XJqnCO5BmBQSBSBpEHeVkCezK1t2W1bdRY/krRLqr4U58LWSlvnwld/zCEuvkJeL/SIz5osd5zqOD162wAJwxTv33sQisNj+zxwa17qrQvVv3DUNnUz8wtmbqStsIZ13gjfQf04VunLHuH8WLQRokQ8b9yajub2jG+hfvYXMyS6JikROAqBZACOgm33lTg5ObjKgQwQNmne10sHusNSUpZip1Z35MzUHprKOnDFeo9ystvTDkVPzPKIL0TabaMPym8kS6FbNVHRP2BmpdmZSaKkfRn/JHIptBQBoFzrPObC9zQuIrVy9pp7q4DJgekBuaRoDopTIMnQGi09EXsufI3RfGglaukaviItRjn65YDgKOl55pqE+tVe+vVvHh3iO1FnAqQh4QxZmyFKHfuFN71MiRJZYTLL08nKPOyQiU9YZo+MT/n6O3CptyGtpW6b+pd5giZkKbQVo2yP1k6j2mwdZ2e2a/6UCNwWgWQAclcciwDbdHsw814npZCkSOnU2CRjKlgSOScmj6DUB6YyPOBHlx21LBV7XYft0/sCzAj6IU25UEnkLsbyYl6ZmwOZyn100bAtYyio4Atp8+6TNOf/I32IaSd9i83H7JiTED6OYoXMye8jNbVyvj31y7zUcXmhueeBSx+0GeLP6/GWpElzF2S73ufAt/SJSWrV3nIfCHuk2hay55VDpg+5IWhF2tA3tng2+TlyUTIF1ESCL+l07QO+IZgkJqwildu3GEyvWRZqMw3Wbbbplq2ncMHRQz60Udqv95nQQql++WpgUJgqYIAJ4QBKSwKH9q2INvnTAiT5cyJwWwSSAchdcSwCpBJSdZtRb0t7Dn8Xap2zvlefZEuir00Ga/vxEAxpfil80NO0npltvwmHOSdCTEKtUXCh3GXSEtxx8jWox+QQd6E5yCVy6cWQP6p66a+u61Jmz5+j1oeglOUk50IrTMsanM6Br3HAVnKl2hSwZnylDJ8HTndLHvZCKIXMjUL3en2KmGA+kPWxjgBpMw3WdTEiNeO3xnTEL0WmwMLsbZl/KYuRwaQsaXiOaTvr7AiBZAB2tNiXMFXqXFoAYWu1VLPUlcvTRUBSW/LqLm3JjMbvYMm2XspLMyxFK9Xu0oVR6tBOOFyX5kJSc4kVxzCqdP+/5Oav509DUR7taXHRTqutWOM/oB1RBj1VMwnbvLfSOfAtY3Jx0gaUZ46XxiqUjzZmSwQIdb5HpzCYc4RRY07AWDDn0ETVIYqYgjqEsW7L5V9rI+a0BXU9ZjB1t0YL2BuiZeYiO5awzN8Tgf9DIBmA3AynQICUy4udJCz/PQmUKpTETt3KTso84AATJkV17W9byX4VU079zSOaSpV07RAn4ct/71JkMnBoL/kj9PrXHidHfbBbYwZI0+y1D5m0HiQ4fdYk/z4/Ahi42FwmmBDq3TozXV3Hhda+MEeyo95dot4LdDCF/ShyYKnNc+BbxsA0xPYuEoQDIzMRrOHGZu8iphkS1rikIZqbl9BRWRXtF8mPmFxodPgJWEde/MIoC7UvCfacU0tZ46q1DPIy8AtZS/IT0KBR8/OJoWWiGaB1spY0ZEwGNAtwWPIVWNtvlksE/heBZAByIyQCiUAikAgkAjtEIBmAHS56TjkRSAQSgUQgEUgGIPdAIpAIJAKJQCKwQwSSAdjhoueUE4FEIBFIBBKBZAByDyQCiUAikAgkAjtEIBmAHS56TjkRSAQSgUQgEUgGIPdAIpAIJAKJQCKwQwSSAdjhoueUE4FEIBFIBBKBZAByDyQCiUAikAgkAjtEIBmAHS56TjkRSAQSgUQgEUgGIPdAIpAIJAKJQCKwQwSSAdjhoueUE4FEIBFIBBKBZAByDyQCiUAikAgkAjtEIBmAHS56TjkRSAQSgUQgEUgGIPdAIpAIJAKJQCKwQwSSAdjhoueUE4FEIBFIBBKBZAByDyQCiUAikAgkAjtEIBmAHS56TjkRSAQSgUQgEUgGIPdAIpAIJAKJQCKwQwSSAdjhoueUE4FEIBFIBBKBZAByDyQCiUAikAgkAjtEIBmAHS56TjkRSAQSgUQgEUgGIPdAIpAIJAKJQCKwQwSSAdjhoueUE4FEIBFIBBKBZAByDyQCiUAikAgkAjtEIBmAHS56TjkRSAQSgUQgEUgGIPdAIpAIJAKJQCKwQwSSAdjhoueUE4FEIBFIBBKB/wHLg9oIGlwOqgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-121"><g><path d="M 75 264.63 L 75 250 L 74.65 235.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 75 269.88 L 71.5 262.88 L 75 264.63 L 78.5 262.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 74.53 230.12 L 78.19 237.03 L 74.65 235.37 L 71.19 237.2 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-122"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 251px; margin-left: 75px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">S3</div></div></div></foreignObject><image x="68.5" y="245" width="13" height="15.75" xlink:href="data:image/png;base64,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"/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-123"><g><rect x="10" y="271" width="130" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 291px; margin-left: 11px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;">Analyse Service</div></div></div></foreignObject><image x="11" y="284.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-124"><g><rect x="10" y="107" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 127px; margin-left: 11px;"><div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Upload Service</b><div><i>tusd</i></div></div></div></div></foreignObject><image x="11" y="113" width="128" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-125"><g><path d="M 455 153.37 L 455 180.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 455 148.12 L 458.5 155.12 L 455 153.37 L 451.5 155.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 455 185.88 L 451.5 178.88 L 455 180.63 L 458.5 178.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-126"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 167px; margin-left: 457px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">HTTP</div></div></div></foreignObject><image x="442.5" y="161" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-127"><g><path d="M 236.37 41 L 265 41 L 265 100.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 231.12 41 L 238.12 37.5 L 236.37 41 L 238.12 44.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 265 105.88 L 261.5 98.88 L 265 100.63 L 268.5 98.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-128"><g><ellipse cx="215" cy="7.5" rx="7.5" ry="7.5" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><path d="M 215 15 L 215 40 M 215 20 L 200 20 M 215 20 L 230 20 M 215 40 L 200 60 M 215 40 L 230 60" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 67px; margin-left: 215px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">Researcher</div></div></div></foreignObject><image x="184" y="67.5" width="62" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-129"><g><ellipse cx="185" cy="524.5" rx="7.5" ry="7.5" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><path d="M 185 532 L 185 557 M 185 537 L 170 537 M 185 537 L 200 537 M 185 557 L 170 577 M 185 557 L 200 577" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 584px; margin-left: 185px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">Database<div>Engineer</div></div></div></div></foreignObject><image x="159.5" y="584.5" width="51" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-130"><g><rect x="220" y="481" width="310" height="14" fill="rgb(255, 255, 255)" stroke="none" pointer-events="all"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-131"><g><path d="M 455 481.37 L 455 508.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 455 476.12 L 458.5 483.12 L 455 481.37 L 451.5 483.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 455 513.88 L 451.5 506.88 L 455 508.63 L 458.5 506.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-132"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 496px; margin-left: 456px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">HTTP</div></div></div></foreignObject><image x="441.5" y="490" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-133"><g><path d="M 265 481.37 L 265 508.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 265 476.12 L 268.5 483.12 L 265 481.37 L 261.5 483.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 265 513.88 L 261.5 506.88 L 265 508.63 L 268.5 506.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 495px; margin-left: 265px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">JDBC</div></div></div></foreignObject><image x="250.5" y="489" width="29" height="15.75" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-134"><g><ellipse cx="357" cy="509.5" rx="7.5" ry="7.5" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><path d="M 357 517 L 357 542 M 357 522 L 342 522 M 357 522 L 372 522 M 357 542 L 342 562 M 357 542 L 372 562" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 569px; margin-left: 357px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">System<div>Engineer</div></div></div></div></foreignObject><image x="333" y="569.5" width="48" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-135"><g><path d="M 19.5 523.6 C 19.5 518.85 30.69 515 44.5 515 C 51.13 515 57.49 515.91 62.18 517.52 C 66.87 519.13 69.5 521.32 69.5 523.6 L 69.5 570.4 C 69.5 575.15 58.31 579 44.5 579 C 30.69 579 19.5 575.15 19.5 570.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 69.5 523.6 C 69.5 528.35 58.31 532.2 44.5 532.2 C 30.69 532.2 19.5 528.35 19.5 523.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-136"><g><path d="M 79.5 523.6 C 79.5 518.85 90.69 515 104.5 515 C 111.13 515 117.49 515.91 122.18 517.52 C 126.87 519.13 129.5 521.32 129.5 523.6 L 129.5 570.4 C 129.5 575.15 118.31 579 104.5 579 C 90.69 579 79.5 575.15 79.5 570.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 129.5 523.6 C 129.5 528.35 118.31 532.2 104.5 532.2 C 90.69 532.2 79.5 528.35 79.5 523.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-137"><g><path d="M 49.5 533.6 C 49.5 528.85 60.69 525 74.5 525 C 81.13 525 87.49 525.91 92.18 527.52 C 96.87 529.13 99.5 531.32 99.5 533.6 L 99.5 580.4 C 99.5 585.15 88.31 589 74.5 589 C 60.69 589 49.5 585.15 49.5 580.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 99.5 533.6 C 99.5 538.35 88.31 542.2 74.5 542.2 C 60.69 542.2 49.5 538.35 49.5 533.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-138"><g><rect x="0" y="506" width="150" height="105" rx="6.3" ry="6.3" fill="none" stroke="rgb(0, 0, 0)" stroke-dasharray="3 3" pointer-events="all"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-139"><g><path d="M 170 547 L 156.37 547" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 151.12 547 L 158.12 543.5 L 156.37 547 L 158.12 550.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-140"><g><rect x="390" y="271" width="130" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 291px; margin-left: 391px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;">User Interface</div></div></div></foreignObject><image x="391" y="284.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-141"><g><path d="M 293.63 41 L 265 41 L 265 100.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 298.88 41 L 291.88 44.5 L 293.63 41 L 291.88 37.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 265 105.88 L 261.5 98.88 L 265 100.63 L 268.5 98.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-142"><g><ellipse cx="315" cy="7.5" rx="7.5" ry="7.5" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><path d="M 315 15 L 315 40 M 315 20 L 300 20 M 315 20 L 330 20 M 315 40 L 300 60 M 315 40 L 330 60" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 67px; margin-left: 315px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">Machine</div></div></div></foreignObject><image x="292.5" y="67.5" width="45" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-143"><g><path d="M 75 428.63 L 75 411 L 186 411 L 186 376 C 189.9 376 189.9 370 186 370 L 186 370 L 186 341 L 232.5 341 L 232.5 153.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 75 433.88 L 71.5 426.88 L 75 428.63 L 78.5 426.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 232.5 148.12 L 236 155.12 L 232.5 153.37 L 229 155.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-144"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 221px; margin-left: 232px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">HTTP</div></div></div></foreignObject><image x="217.5" y="215" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-145"><g><path d="M 530 497.35 L 530 478.47" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-146"><g><path d="M 220 502.88 L 220 488" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-147"><g><path d="M 336.37 127 L 363 127 L 363 291 L 383.63 291" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 331.12 127 L 338.12 123.5 L 336.37 127 L 338.12 130.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 388.88 291 L 381.88 294.5 L 383.63 291 L 381.88 287.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-148"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 217px; margin-left: 364px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">HTTP</div></div></div></foreignObject><image x="349.5" y="211" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-149"><g><path d="M 383.63 137 L 377 137 L 377 288 C 380.9 288 380.9 294 377 294 L 377 294 L 377 328 C 380.9 328 380.9 334 377 334 L 377 334 L 377 370 C 380.9 370 380.9 376 377 376 L 377 376 L 377 408 C 380.9 408 380.9 414 377 414 L 377 414 L 377 418 C 380.9 418 380.9 424 377 424 L 377 424 L 377 445 L 390 445" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 388.88 137 L 381.88 140.5 L 383.63 137 L 381.88 133.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-150"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 238px; margin-left: 381px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">HTTP</div></div></div></foreignObject><image x="366.5" y="232" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g></g></g></g></svg> \ No newline at end of file diff --git a/.docs/images/architecture.drawio b/.docs/images/architecture.drawio index 8433da025fa2c2ecf2221a4794a2e2f693df6042..a6512707b1b695126832f16c8fa1f271ad81cead 100644 --- a/.docs/images/architecture.drawio +++ b/.docs/images/architecture.drawio @@ -1,303 +1,345 @@ -<mxfile host="Electron" modified="2024-07-18T03:24:43.687Z" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/24.6.4 Chrome/124.0.6367.207 Electron/30.0.6 Safari/537.36" etag="yfnnaSFCfO3oi8Cn43Ov" version="24.6.4" type="device" pages="8"> +<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/24.7.8 Chrome/128.0.6613.36 Electron/32.0.1 Safari/537.36" version="24.7.8" pages="8"> <diagram id="mvBsv1rP8O80Qe3yGnn_" name="docker-compose"> - <mxGraphModel dx="683" dy="391" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" math="0" shadow="0"> + <mxGraphModel dx="2390" dy="1370" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" math="0" shadow="0"> <root> <mxCell id="0" /> <mxCell id="1" parent="0" /> - <mxCell id="45LT9Xtm5jvL1Omwo4Uv-6" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#000000;startArrow=classic;startFill=1;dashed=1;" parent="1" target="CohMdi7D_fRk0dSxzjYi-1" edge="1"> - <mxGeometry x="-0.028" relative="1" as="geometry"> - <mxPoint x="448" y="230" as="sourcePoint" /> - <mxPoint as="offset" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-76" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=none;dashed=1;arcSize=2;" vertex="1" parent="1"> + <mxGeometry x="320" y="160" width="530" height="397" as="geometry" /> + </mxCell> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-77" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.75;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;startArrow=classic;startFill=1;endArrow=classic;endFill=1;" edge="1" parent="1" source="FWEJ_FGA9GBXbfwohBE8-119" target="FWEJ_FGA9GBXbfwohBE8-108"> + <mxGeometry relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="668" y="206" /> + <mxPoint x="668" y="400" /> + <mxPoint x="775" y="400" /> + </Array> </mxGeometry> </mxCell> - <mxCell id="S3Av5TdVFqS_SrXukbwN-2" value="Researcher" style="shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;outlineConnect=0;" parent="1" vertex="1"> - <mxGeometry x="433.5" y="146" width="30" height="60" as="geometry" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-78" value="HTTP" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="FWEJ_FGA9GBXbfwohBE8-77"> + <mxGeometry x="-0.2051" y="1" relative="1" as="geometry"> + <mxPoint x="61" y="40" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-79" value="HTTP" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="FWEJ_FGA9GBXbfwohBE8-77"> + <mxGeometry x="-0.3724" relative="1" as="geometry"> + <mxPoint x="-2" y="11" as="offset" /> + </mxGeometry> </mxCell> - <mxCell id="V1Wl26Vbpgnno5Lb-wtg-39" value="HTTP" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;startArrow=classic;startFill=1;fontSize=9;" parent="1" source="CohMdi7D_fRk0dSxzjYi-1" target="S3Av5TdVFqS_SrXukbwN-1" edge="1"> - <mxGeometry x="0.0013" relative="1" as="geometry"> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-80" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=none;dashed=1;arcSize=6;" vertex="1" parent="1"> + <mxGeometry x="540" y="557" width="310" height="123" as="geometry" /> + </mxCell> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-81" value="LDAP" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;startArrow=classic;startFill=1;" edge="1" parent="1" source="FWEJ_FGA9GBXbfwohBE8-96" target="FWEJ_FGA9GBXbfwohBE8-104"> + <mxGeometry x="-0.2381" relative="1" as="geometry"> <mxPoint as="offset" /> </mxGeometry> </mxCell> - <mxCell id="V1Wl26Vbpgnno5Lb-wtg-40" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;" parent="1" source="CohMdi7D_fRk0dSxzjYi-1" target="AQz-Vj6r_5Wor37pQVs6-1" edge="1"> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-82" value="data-db" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;spacing=-1;" vertex="1" parent="1"> + <mxGeometry x="352.5" y="658" width="85" height="20" as="geometry" /> + </mxCell> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-83" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=0;exitDx=0;exitDy=0;startArrow=classic;startFill=1;endArrow=none;endFill=0;entryX=0.25;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="FWEJ_FGA9GBXbfwohBE8-85" target="FWEJ_FGA9GBXbfwohBE8-92"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="V1Wl26Vbpgnno5Lb-wtg-41" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="CohMdi7D_fRk0dSxzjYi-1" target="SsHHCok0RUWS7ODwTELy-4" edge="1"> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-84" value="AMQP" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="FWEJ_FGA9GBXbfwohBE8-83"> + <mxGeometry x="-0.0476" y="-1" relative="1" as="geometry"> + <mxPoint x="-1" y="-4" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-85" value="Data Service" style="rounded=1;whiteSpace=wrap;html=1;fontStyle=1" vertex="1" parent="1"> + <mxGeometry x="330" y="504" width="130" height="40" as="geometry" /> + </mxCell> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-86" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;startArrow=classic;startFill=1;" edge="1" parent="1" source="FWEJ_FGA9GBXbfwohBE8-85" target="FWEJ_FGA9GBXbfwohBE8-137"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="V1Wl26Vbpgnno5Lb-wtg-42" value="HTTP" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;startArrow=classic;startFill=1;fontSize=9;" parent="1" source="CohMdi7D_fRk0dSxzjYi-1" target="13tBXMPt0xomx7MP2VuM-1" edge="1"> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-87" value="JDBC" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="FWEJ_FGA9GBXbfwohBE8-86"> + <mxGeometry x="0.3566" relative="1" as="geometry"> + <mxPoint y="-11" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-88" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;startArrow=classic;startFill=1;" edge="1" parent="1" source="FWEJ_FGA9GBXbfwohBE8-92" target="FWEJ_FGA9GBXbfwohBE8-96"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="V1Wl26Vbpgnno5Lb-wtg-43" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;startArrow=classic;startFill=1;" parent="1" source="CohMdi7D_fRk0dSxzjYi-1" target="O_ELZSFbvl3Butg3bv_j-1" edge="1"> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-89" value="LDAP" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="FWEJ_FGA9GBXbfwohBE8-88"> + <mxGeometry x="-0.1051" y="-1" relative="1" as="geometry"> + <mxPoint x="3" y="-1" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-90" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0;entryY=0.75;entryDx=0;entryDy=0;startArrow=classic;startFill=1;" edge="1" parent="1" source="FWEJ_FGA9GBXbfwohBE8-92" target="FWEJ_FGA9GBXbfwohBE8-119"> <mxGeometry relative="1" as="geometry"> <Array as="points"> - <mxPoint x="415" y="346" /> - <mxPoint x="362" y="346" /> - <mxPoint x="362" y="440" /> - <mxPoint x="275" y="440" /> + <mxPoint x="395" y="400" /> + <mxPoint x="500" y="400" /> + <mxPoint x="500" y="206" /> </Array> </mxGeometry> </mxCell> - <mxCell id="YJRAzF6yD4Hh-bAvO1PB-19" value="HTTP" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=9;" parent="V1Wl26Vbpgnno5Lb-wtg-43" vertex="1" connectable="0"> - <mxGeometry x="-0.6602" relative="1" as="geometry"> - <mxPoint x="-3" as="offset" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-91" value="HTTP,<div>AMQP</div>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="FWEJ_FGA9GBXbfwohBE8-90"> + <mxGeometry x="-0.1797" y="2" relative="1" as="geometry"> + <mxPoint x="2" y="-77" as="offset" /> </mxGeometry> </mxCell> - <mxCell id="V1Wl26Vbpgnno5Lb-wtg-44" value="S3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;startArrow=classic;startFill=1;fontSize=9;" parent="1" source="CohMdi7D_fRk0dSxzjYi-1" target="V1Wl26Vbpgnno5Lb-wtg-38" edge="1"> - <mxGeometry x="0.0034" relative="1" as="geometry"> - <mxPoint as="offset" /> - </mxGeometry> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-92" value="<b>Broker Service</b><div><i>rabbitmq</i></div>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E6E6E6;fontColor=#000000;strokeColor=#000000;" vertex="1" parent="1"> + <mxGeometry x="330" y="422" width="130" height="40" as="geometry" /> </mxCell> - <mxCell id="V1Wl26Vbpgnno5Lb-wtg-45" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;startArrow=classic;startFill=1;" parent="1" source="CohMdi7D_fRk0dSxzjYi-1" target="hBEam5F8n4ZBPeoiEcWH-1" edge="1"> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-93" value="LDAP" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;startArrow=classic;startFill=1;" edge="1" parent="1" source="FWEJ_FGA9GBXbfwohBE8-96" target="FWEJ_FGA9GBXbfwohBE8-108"> <mxGeometry relative="1" as="geometry"> - <Array as="points"> - <mxPoint x="480" y="346" /> - <mxPoint x="538" y="346" /> - <mxPoint x="538" y="430" /> - <mxPoint x="625" y="430" /> - </Array> + <mxPoint as="offset" /> </mxGeometry> </mxCell> - <mxCell id="YJRAzF6yD4Hh-bAvO1PB-18" value="HTTP" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=9;" parent="V1Wl26Vbpgnno5Lb-wtg-45" vertex="1" connectable="0"> - <mxGeometry x="-0.7352" y="1" relative="1" as="geometry"> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-94" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;startArrow=classic;startFill=1;" edge="1" parent="1" source="FWEJ_FGA9GBXbfwohBE8-96" target="FWEJ_FGA9GBXbfwohBE8-119"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-95" value="HTTP" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="FWEJ_FGA9GBXbfwohBE8-94"> + <mxGeometry x="0.125" relative="1" as="geometry"> <mxPoint as="offset" /> </mxGeometry> </mxCell> - <mxCell id="CohMdi7D_fRk0dSxzjYi-1" value="Gateway Service<br>(NGINX)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E6E6E6;fontColor=#000000;strokeColor=#000000;" parent="1" vertex="1"> - <mxGeometry x="382.5" y="278" width="130" height="40" as="geometry" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-96" value="<b>Identity Service *</b><div><i>openldap</i></div>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E6E6E6;fontColor=#000000;strokeColor=#000000;" vertex="1" parent="1"> + <mxGeometry x="520" y="422" width="130" height="40" as="geometry" /> </mxCell> - <mxCell id="iy0HhJzZLXsiPmpU2ukH-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;jumpStyle=arc;" parent="1" source="13tBXMPt0xomx7MP2VuM-1" target="V1Wl26Vbpgnno5Lb-wtg-38" edge="1"> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-97" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.75;entryY=1;entryDx=0;entryDy=0;jumpStyle=arc;startArrow=classic;startFill=1;" edge="1" parent="1" source="FWEJ_FGA9GBXbfwohBE8-101" target="FWEJ_FGA9GBXbfwohBE8-119"> <mxGeometry relative="1" as="geometry"> <Array as="points"> - <mxPoint x="526" y="394" /> - <mxPoint x="526" y="335" /> - <mxPoint x="625" y="335" /> + <mxPoint x="775" y="480" /> + <mxPoint x="662" y="480" /> + <mxPoint x="662" y="410" /> + <mxPoint x="617" y="410" /> </Array> </mxGeometry> </mxCell> - <mxCell id="iy0HhJzZLXsiPmpU2ukH-10" value="S3" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="iy0HhJzZLXsiPmpU2ukH-9" vertex="1" connectable="0"> - <mxGeometry x="0.0562" y="3" relative="1" as="geometry"> - <mxPoint y="3" as="offset" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-98" value="HTTP" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="FWEJ_FGA9GBXbfwohBE8-97"> + <mxGeometry x="0.7012" y="1" relative="1" as="geometry"> + <mxPoint x="1" y="2" as="offset" /> </mxGeometry> </mxCell> - <mxCell id="f61RwCrreTIYbJ5Vt7fi-16" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;startArrow=classic;startFill=1;endArrow=none;endFill=0;" edge="1" parent="1" source="13tBXMPt0xomx7MP2VuM-1" target="hBEam5F8n4ZBPeoiEcWH-1"> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-99" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=0;exitDx=0;exitDy=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;jumpStyle=arc;" edge="1" parent="1" source="FWEJ_FGA9GBXbfwohBE8-101" target="FWEJ_FGA9GBXbfwohBE8-85"> <mxGeometry relative="1" as="geometry"> <Array as="points"> - <mxPoint x="480" y="450" /> - <mxPoint x="593" y="450" /> + <mxPoint x="743" y="490" /> + <mxPoint x="427" y="490" /> </Array> </mxGeometry> </mxCell> - <mxCell id="13tBXMPt0xomx7MP2VuM-1" value="Analyse Service" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> - <mxGeometry x="382.5" y="374" width="130" height="40" as="geometry" /> - </mxCell> - <mxCell id="V1Wl26Vbpgnno5Lb-wtg-46" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;startArrow=classic;startFill=1;" parent="1" source="O_ELZSFbvl3Butg3bv_j-1" target="V1Wl26Vbpgnno5Lb-wtg-36" edge="1"> - <mxGeometry relative="1" as="geometry" /> - </mxCell> - <mxCell id="O_ELZSFbvl3Butg3bv_j-1" value="Authentication Service<br>(Keycloak)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E6E6E6;fontColor=#000000;strokeColor=#000000;" parent="1" vertex="1"> - <mxGeometry x="210" y="470" width="130" height="40" as="geometry" /> - </mxCell> - <mxCell id="V1Wl26Vbpgnno5Lb-wtg-48" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;startArrow=classic;startFill=1;" parent="1" target="V1Wl26Vbpgnno5Lb-wtg-32" edge="1"> - <mxGeometry relative="1" as="geometry"> - <mxPoint x="689.9999999999998" y="490" as="sourcePoint" /> - </mxGeometry> - </mxCell> - <mxCell id="YJRAzF6yD4Hh-bAvO1PB-16" value="JDBC" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=9;" parent="V1Wl26Vbpgnno5Lb-wtg-48" vertex="1" connectable="0"> - <mxGeometry x="-0.2851" y="-2" relative="1" as="geometry"> - <mxPoint x="6" y="-2" as="offset" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-100" value="HTTP" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="FWEJ_FGA9GBXbfwohBE8-99"> + <mxGeometry x="0.3494" relative="1" as="geometry"> + <mxPoint as="offset" /> </mxGeometry> </mxCell> - <mxCell id="iy0HhJzZLXsiPmpU2ukH-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="hBEam5F8n4ZBPeoiEcWH-1" target="iy0HhJzZLXsiPmpU2ukH-4" edge="1"> - <mxGeometry relative="1" as="geometry" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-101" value="Metadata Service" style="rounded=1;whiteSpace=wrap;html=1;fontStyle=1" vertex="1" parent="1"> + <mxGeometry x="710" y="504" width="130" height="40" as="geometry" /> </mxCell> - <mxCell id="f61RwCrreTIYbJ5Vt7fi-15" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=0;exitDx=0;exitDy=0;entryX=0.75;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="hBEam5F8n4ZBPeoiEcWH-1" target="SsHHCok0RUWS7ODwTELy-4"> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-102" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.75;exitDx=0;exitDy=0;entryX=0;entryY=0.75;entryDx=0;entryDy=0;startArrow=classic;startFill=1;" edge="1" parent="1" source="FWEJ_FGA9GBXbfwohBE8-104" target="FWEJ_FGA9GBXbfwohBE8-101"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="hBEam5F8n4ZBPeoiEcWH-1" value="Metadata Service" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> - <mxGeometry x="560" y="470" width="130" height="40" as="geometry" /> - </mxCell> - <mxCell id="YJRAzF6yD4Hh-bAvO1PB-15" value="Spring AMQP" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;jumpStyle=arc;dashed=1;strokeWidth=1;dashPattern=1 1;fontSize=9;" parent="1" source="AQz-Vj6r_5Wor37pQVs6-1" target="YJRAzF6yD4Hh-bAvO1PB-1" edge="1"> - <mxGeometry x="0.54" relative="1" as="geometry"> - <Array as="points"> - <mxPoint x="370" y="394" /> - <mxPoint x="370" y="440" /> - <mxPoint x="450" y="440" /> - </Array> - <mxPoint as="offset" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-103" value="HTTP" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="FWEJ_FGA9GBXbfwohBE8-102"> + <mxGeometry x="-0.1111" relative="1" as="geometry"> + <mxPoint x="3" as="offset" /> </mxGeometry> </mxCell> - <mxCell id="AQz-Vj6r_5Wor37pQVs6-1" value="Broker Service<br>(RabbitMQ)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E6E6E6;fontColor=#000000;strokeColor=#000000;" parent="1" vertex="1"> - <mxGeometry x="208" y="374" width="130" height="40" as="geometry" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-104" value="<b>Auth Service</b><br><i>keycloak</i>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E6E6E6;fontColor=#000000;strokeColor=#000000;" vertex="1" parent="1"> + <mxGeometry x="520" y="504" width="130" height="40" as="geometry" /> </mxCell> - <mxCell id="V1Wl26Vbpgnno5Lb-wtg-49" value="HTTP" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;startArrow=classic;startFill=1;fontSize=9;" parent="1" source="SsHHCok0RUWS7ODwTELy-4" target="V1Wl26Vbpgnno5Lb-wtg-26" edge="1"> - <mxGeometry relative="1" as="geometry" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-105" value="Search Service" style="rounded=1;whiteSpace=wrap;html=1;fontStyle=1" vertex="1" parent="1"> + <mxGeometry x="710" y="176" width="130" height="40" as="geometry" /> </mxCell> - <mxCell id="SsHHCok0RUWS7ODwTELy-4" value="Search Service" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> - <mxGeometry x="560" y="374" width="130" height="40" as="geometry" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-106" value="" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=8.600000000000023;fillColor=#E6E6E6;strokeColor=#000000;" vertex="1" parent="1"> + <mxGeometry x="750" y="256" width="50" height="64" as="geometry" /> </mxCell> - <mxCell id="S3Av5TdVFqS_SrXukbwN-1" value="UI" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> - <mxGeometry x="210" y="278" width="130" height="40" as="geometry" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-107" value="search-db" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;spacing=-1;" vertex="1" parent="1"> + <mxGeometry x="732.5" y="320.5" width="85" height="17" as="geometry" /> </mxCell> - <mxCell id="V1Wl26Vbpgnno5Lb-wtg-26" value="" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=8.600000000000023;fillColor=#E6E6E6;strokeColor=#000000;" parent="1" vertex="1"> - <mxGeometry x="740" y="362" width="50" height="64" as="geometry" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-108" value="<b>Dashboard Service</b><div><i>grafana</i></div>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E6E6E6;fontColor=#000000;strokeColor=#000000;" vertex="1" parent="1"> + <mxGeometry x="710" y="422" width="130" height="40" as="geometry" /> </mxCell> - <mxCell id="A18w2Y2_AVEIFkgUy5Lv-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;startArrow=classic;startFill=1;endArrow=none;endFill=0;" parent="1" source="V1Wl26Vbpgnno5Lb-wtg-32" edge="1"> - <mxGeometry relative="1" as="geometry"> - <mxPoint x="850" y="490" as="targetPoint" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-109" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="FWEJ_FGA9GBXbfwohBE8-124" target="FWEJ_FGA9GBXbfwohBE8-120"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-110" value="S3" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="FWEJ_FGA9GBXbfwohBE8-109"> + <mxGeometry x="0.2961" y="-3" relative="1" as="geometry"> + <mxPoint x="3" y="-9" as="offset" /> </mxGeometry> </mxCell> - <mxCell id="V1Wl26Vbpgnno5Lb-wtg-32" value="" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=8.600000000000023;fillColor=#E6E6E6;strokeColor=#000000;" parent="1" vertex="1"> - <mxGeometry x="740" y="458" width="50" height="64" as="geometry" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-111" value="" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=8.600000000000023;fillColor=#E6E6E6;strokeColor=#000000;" vertex="1" parent="1"> + <mxGeometry x="560" y="584" width="50" height="64" as="geometry" /> </mxCell> - <mxCell id="V1Wl26Vbpgnno5Lb-wtg-33" value="metadata-db" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;spacing=-1;" parent="1" vertex="1"> - <mxGeometry x="722.5" y="522" width="85" height="20" as="geometry" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-112" value="auth-db" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;spacing=-1;" vertex="1" parent="1"> + <mxGeometry x="542.5" y="648" width="85" height="20" as="geometry" /> </mxCell> - <mxCell id="V1Wl26Vbpgnno5Lb-wtg-34" value="" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=8.600000000000023;fillColor=#E6E6E6;strokeColor=#000000;" parent="1" vertex="1"> - <mxGeometry x="423.5" y="551" width="50" height="64" as="geometry" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-113" value="" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=8.600000000000023;fillColor=#E6E6E6;strokeColor=#000000;" vertex="1" parent="1"> + <mxGeometry x="750" y="584" width="50" height="64" as="geometry" /> </mxCell> - <mxCell id="V1Wl26Vbpgnno5Lb-wtg-35" value="data-db" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;spacing=-1;" parent="1" vertex="1"> - <mxGeometry x="407.5" y="613" width="85" height="20" as="geometry" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-114" value="metadata-db" style="text;html=1;strokeColor=none;fillColor=default;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;spacing=-1;" vertex="1" parent="1"> + <mxGeometry x="732.5" y="649" width="85" height="17" as="geometry" /> </mxCell> - <mxCell id="V1Wl26Vbpgnno5Lb-wtg-36" value="" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=8.600000000000023;fillColor=#E6E6E6;strokeColor=#000000;" parent="1" vertex="1"> - <mxGeometry x="250" y="550" width="50" height="64" as="geometry" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-115" value="HTTP" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;entryX=0;entryY=0.25;entryDx=0;entryDy=0;startArrow=classic;startFill=1;" edge="1" parent="1" source="FWEJ_FGA9GBXbfwohBE8-119" target="FWEJ_FGA9GBXbfwohBE8-105"> + <mxGeometry relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> </mxCell> - <mxCell id="V1Wl26Vbpgnno5Lb-wtg-37" value="auth-db" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;spacing=-1;" parent="1" vertex="1"> - <mxGeometry x="232.5" y="614" width="85" height="20" as="geometry" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-116" value="HTTP" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.25;exitDx=0;exitDy=0;entryX=1;entryY=0.25;entryDx=0;entryDy=0;" edge="1" parent="1" source="FWEJ_FGA9GBXbfwohBE8-119" target="FWEJ_FGA9GBXbfwohBE8-124"> + <mxGeometry relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="490" y="186" /> + <mxPoint x="490" y="186" /> + </Array> + <mxPoint as="offset" /> + </mxGeometry> </mxCell> - <mxCell id="V1Wl26Vbpgnno5Lb-wtg-38" value="Storage Service<br>(SeaweedFS)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E6E6E6;fontColor=#000000;strokeColor=#000000;" parent="1" vertex="1"> - <mxGeometry x="560" y="278" width="130" height="40" as="geometry" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-117" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;startArrow=classic;startFill=1;" edge="1" parent="1" source="FWEJ_FGA9GBXbfwohBE8-119" target="FWEJ_FGA9GBXbfwohBE8-123"> + <mxGeometry relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="480" y="196" /> + <mxPoint x="480" y="360" /> + </Array> + </mxGeometry> </mxCell> - <mxCell id="A18w2Y2_AVEIFkgUy5Lv-3" value="metadata-db-data" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;spacing=-1;" parent="1" vertex="1"> - <mxGeometry x="810.5" y="504" width="108" height="20" as="geometry" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-118" value="HTTP" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="FWEJ_FGA9GBXbfwohBE8-117"> + <mxGeometry x="0.5551" y="-1" relative="1" as="geometry"> + <mxPoint x="1" y="-64" as="offset" /> + </mxGeometry> </mxCell> - <mxCell id="A18w2Y2_AVEIFkgUy5Lv-6" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#e1d5e7;strokeColor=#000000;" parent="1" vertex="1"> - <mxGeometry x="850.5" y="476" width="28" height="28" as="geometry" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-119" value="<b>Gateway Service</b><div><i>nginx</i></div>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E6E6E6;fontColor=#000000;strokeColor=#000000;" vertex="1" parent="1"> + <mxGeometry x="520" y="176" width="130" height="40" as="geometry" /> </mxCell> - <mxCell id="A18w2Y2_AVEIFkgUy5Lv-7" value="search-db-data" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;spacing=-1;" parent="1" vertex="1"> - <mxGeometry x="810.5" y="408" width="108" height="20" as="geometry" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-120" value="<b>Storage Service</b><div><i>seaweedfs</i></div>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E6E6E6;fontColor=#000000;strokeColor=#000000;" vertex="1" parent="1"> + <mxGeometry x="329.5" y="258" width="130" height="40" as="geometry" /> </mxCell> - <mxCell id="A18w2Y2_AVEIFkgUy5Lv-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="A18w2Y2_AVEIFkgUy5Lv-8" target="V1Wl26Vbpgnno5Lb-wtg-26" edge="1"> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-121" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;startArrow=classic;startFill=1;" edge="1" parent="1" source="FWEJ_FGA9GBXbfwohBE8-123" target="FWEJ_FGA9GBXbfwohBE8-120"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="A18w2Y2_AVEIFkgUy5Lv-8" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#e1d5e7;strokeColor=#000000;" parent="1" vertex="1"> - <mxGeometry x="850.5" y="380" width="28" height="28" as="geometry" /> - </mxCell> - <mxCell id="A18w2Y2_AVEIFkgUy5Lv-10" value="data-db-data" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;spacing=-1;" parent="1" vertex="1"> - <mxGeometry x="394.5" y="684" width="108" height="20" as="geometry" /> - </mxCell> - <mxCell id="A18w2Y2_AVEIFkgUy5Lv-35" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="A18w2Y2_AVEIFkgUy5Lv-11" edge="1"> - <mxGeometry relative="1" as="geometry"> - <mxPoint x="449" y="633" as="targetPoint" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-122" value="S3" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="FWEJ_FGA9GBXbfwohBE8-121"> + <mxGeometry x="0.0536" relative="1" as="geometry"> + <mxPoint y="1" as="offset" /> </mxGeometry> </mxCell> - <mxCell id="A18w2Y2_AVEIFkgUy5Lv-11" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#e1d5e7;strokeColor=#000000;" parent="1" vertex="1"> - <mxGeometry x="435" y="655" width="28" height="28" as="geometry" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-123" value="Analyse Service" style="rounded=1;whiteSpace=wrap;html=1;fontStyle=1" vertex="1" parent="1"> + <mxGeometry x="330" y="340" width="130" height="40" as="geometry" /> </mxCell> - <mxCell id="A18w2Y2_AVEIFkgUy5Lv-34" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" parent="1" source="A18w2Y2_AVEIFkgUy5Lv-15" target="V1Wl26Vbpgnno5Lb-wtg-37" edge="1"> - <mxGeometry relative="1" as="geometry" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-124" value="<b>Upload Service</b><div><i>tusd</i></div>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E6E6E6;fontColor=#000000;strokeColor=#000000;" vertex="1" parent="1"> + <mxGeometry x="330" y="176" width="130" height="40" as="geometry" /> </mxCell> - <mxCell id="A18w2Y2_AVEIFkgUy5Lv-15" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#e1d5e7;strokeColor=#000000;" parent="1" vertex="1"> - <mxGeometry x="261" y="656" width="28" height="28" as="geometry" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-125" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;startArrow=classic;startFill=1;" edge="1" parent="1" source="FWEJ_FGA9GBXbfwohBE8-105" target="FWEJ_FGA9GBXbfwohBE8-106"> + <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="A18w2Y2_AVEIFkgUy5Lv-16" value="auth-db-data" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;spacing=-1;" parent="1" vertex="1"> - <mxGeometry x="221" y="684" width="108" height="20" as="geometry" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-126" value="HTTP" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="FWEJ_FGA9GBXbfwohBE8-125"> + <mxGeometry x="-0.0782" y="-1" relative="1" as="geometry"> + <mxPoint x="2" y="1" as="offset" /> + </mxGeometry> </mxCell> - <mxCell id="YJRAzF6yD4Hh-bAvO1PB-2" value="JDBC" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;fontSize=9;" parent="1" source="YJRAzF6yD4Hh-bAvO1PB-1" target="V1Wl26Vbpgnno5Lb-wtg-34" edge="1"> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-127" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;startArrow=classic;startFill=1;" edge="1" parent="1" source="FWEJ_FGA9GBXbfwohBE8-128" target="FWEJ_FGA9GBXbfwohBE8-119"> <mxGeometry relative="1" as="geometry"> - <Array as="points" /> + <Array as="points"> + <mxPoint x="585" y="110" /> + </Array> </mxGeometry> </mxCell> - <mxCell id="f61RwCrreTIYbJ5Vt7fi-14" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;startArrow=classic;startFill=1;" edge="1" parent="1" source="YJRAzF6yD4Hh-bAvO1PB-1" target="hBEam5F8n4ZBPeoiEcWH-1"> - <mxGeometry relative="1" as="geometry" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-128" value="Researcher" style="shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;outlineConnect=0;" vertex="1" parent="1"> + <mxGeometry x="520" y="69" width="30" height="60" as="geometry" /> </mxCell> - <mxCell id="YJRAzF6yD4Hh-bAvO1PB-1" value="Data Service" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> - <mxGeometry x="385" y="470" width="130" height="40" as="geometry" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-129" value="Database<div>Engineer</div>" style="shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;outlineConnect=0;" vertex="1" parent="1"> + <mxGeometry x="490" y="586" width="30" height="60" as="geometry" /> </mxCell> - <mxCell id="V1Wl26Vbpgnno5Lb-wtg-27" value="search-db" style="text;html=1;strokeColor=none;fillColor=default;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;spacing=-1;" parent="1" vertex="1"> - <mxGeometry x="722.5" y="437" width="85" height="17" as="geometry" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-130" value="" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=none;" vertex="1" parent="1"> + <mxGeometry x="540" y="550" width="310" height="14" as="geometry" /> </mxCell> - <mxCell id="OiuNRKl362wFz-YGv0-T-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="OiuNRKl362wFz-YGv0-T-7" edge="1"> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-131" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;startArrow=classic;startFill=1;" edge="1" parent="1" source="FWEJ_FGA9GBXbfwohBE8-101" target="FWEJ_FGA9GBXbfwohBE8-113"> <mxGeometry relative="1" as="geometry"> - <mxPoint x="208" y="394" as="targetPoint" /> + <mxPoint x="840" y="524" as="sourcePoint" /> </mxGeometry> </mxCell> - <mxCell id="OiuNRKl362wFz-YGv0-T-7" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#e1d5e7;strokeColor=#000000;" parent="1" vertex="1"> - <mxGeometry x="132" y="380" width="28" height="28" as="geometry" /> - </mxCell> - <mxCell id="OiuNRKl362wFz-YGv0-T-8" value="broker-service-data" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;spacing=-1;" parent="1" vertex="1"> - <mxGeometry x="93" y="408" width="108" height="20" as="geometry" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-132" value="HTTP" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="FWEJ_FGA9GBXbfwohBE8-131"> + <mxGeometry x="-0.0169" y="-1" relative="1" as="geometry"> + <mxPoint x="1" as="offset" /> + </mxGeometry> </mxCell> - <mxCell id="iy0HhJzZLXsiPmpU2ukH-7" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="iy0HhJzZLXsiPmpU2ukH-4" target="V1Wl26Vbpgnno5Lb-wtg-34" edge="1"> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-133" value="JDBC" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;startArrow=classic;startFill=1;" edge="1" parent="1" source="FWEJ_FGA9GBXbfwohBE8-104" target="FWEJ_FGA9GBXbfwohBE8-111"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="iy0HhJzZLXsiPmpU2ukH-4" value="Data DB Sidecar" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> - <mxGeometry x="560" y="563" width="130" height="40" as="geometry" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-134" value="System<div>Engineer</div>" style="shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;outlineConnect=0;" vertex="1" parent="1"> + <mxGeometry x="662" y="571" width="30" height="60" as="geometry" /> </mxCell> - <mxCell id="ZFea1dL5_0zV0EoV6Noq-2" value="Researcher" style="shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;outlineConnect=0;" parent="1" vertex="1"> - <mxGeometry x="347" y="553" width="30" height="60" as="geometry" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-135" value="" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=8.600000000000023;fillColor=#E6E6E6;strokeColor=#000000;" vertex="1" parent="1"> + <mxGeometry x="339.5" y="584" width="50" height="64" as="geometry" /> </mxCell> - <mxCell id="ZFea1dL5_0zV0EoV6Noq-3" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeColor=#000000;startArrow=classic;startFill=1;dashed=1;entryPerimeter=0;" parent="1" source="ZFea1dL5_0zV0EoV6Noq-2" target="V1Wl26Vbpgnno5Lb-wtg-34" edge="1"> - <mxGeometry x="-0.028" relative="1" as="geometry"> - <mxPoint x="458" y="240" as="sourcePoint" /> - <mxPoint as="offset" /> - <mxPoint x="458" y="288" as="targetPoint" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-136" value="" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=8.600000000000023;fillColor=#E6E6E6;strokeColor=#000000;" vertex="1" parent="1"> + <mxGeometry x="399.5" y="584" width="50" height="64" as="geometry" /> + </mxCell> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-137" value="" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=8.600000000000023;fillColor=#E6E6E6;strokeColor=#000000;" vertex="1" parent="1"> + <mxGeometry x="369.5" y="594" width="50" height="64" as="geometry" /> + </mxCell> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-138" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=none;dashed=1;arcSize=6;" vertex="1" parent="1"> + <mxGeometry x="320" y="575" width="150" height="105" as="geometry" /> + </mxCell> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-139" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;entryX=1.004;entryY=0.397;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="FWEJ_FGA9GBXbfwohBE8-129" target="FWEJ_FGA9GBXbfwohBE8-138"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="460" y="616" as="targetPoint" /> </mxGeometry> </mxCell> - <mxCell id="iy0HhJzZLXsiPmpU2ukH-8" value="S3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;startArrow=classic;startFill=1;jumpStyle=arc;" parent="1" source="V1Wl26Vbpgnno5Lb-wtg-38" target="iy0HhJzZLXsiPmpU2ukH-4" edge="1"> - <mxGeometry x="-0.4591" relative="1" as="geometry"> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-140" value="User Interface" style="rounded=1;whiteSpace=wrap;html=1;fontStyle=1" vertex="1" parent="1"> + <mxGeometry x="710" y="340" width="130" height="40" as="geometry" /> + </mxCell> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-141" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;startArrow=classic;startFill=1;" edge="1" parent="1" source="FWEJ_FGA9GBXbfwohBE8-142" target="FWEJ_FGA9GBXbfwohBE8-119"> + <mxGeometry relative="1" as="geometry"> <Array as="points"> - <mxPoint x="810" y="298" /> - <mxPoint x="810" y="583" /> + <mxPoint x="585" y="110" /> </Array> - <mxPoint as="offset" /> </mxGeometry> </mxCell> - <mxCell id="ZFea1dL5_0zV0EoV6Noq-4" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#E1D5E7;" parent="1" vertex="1"> - <mxGeometry x="731" y="638" width="30" height="16" as="geometry" /> - </mxCell> - <mxCell id="ZFea1dL5_0zV0EoV6Noq-5" value="Docker volumes" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> - <mxGeometry x="768.5" y="638" width="92.5" height="16" as="geometry" /> - </mxCell> - <mxCell id="ZFea1dL5_0zV0EoV6Noq-6" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#E6E6E6;" parent="1" vertex="1"> - <mxGeometry x="731" y="658" width="30" height="16" as="geometry" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-142" value="Machine" style="shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;outlineConnect=0;" vertex="1" parent="1"> + <mxGeometry x="620" y="69" width="30" height="60" as="geometry" /> </mxCell> - <mxCell id="ZFea1dL5_0zV0EoV6Noq-7" value="Ext. maintained images" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> - <mxGeometry x="768.5" y="658" width="132.5" height="16" as="geometry" /> - </mxCell> - <mxCell id="f61RwCrreTIYbJ5Vt7fi-7" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;endArrow=none;endFill=0;startArrow=classic;startFill=1;" edge="1" parent="1" source="f61RwCrreTIYbJ5Vt7fi-3"> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-143" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.25;entryY=1;entryDx=0;entryDy=0;jumpStyle=arc;startArrow=classic;startFill=1;" edge="1" parent="1" source="FWEJ_FGA9GBXbfwohBE8-85" target="FWEJ_FGA9GBXbfwohBE8-119"> <mxGeometry relative="1" as="geometry"> - <mxPoint x="280" y="440" as="targetPoint" /> <Array as="points"> - <mxPoint x="95" y="440" /> + <mxPoint x="395" y="480" /> + <mxPoint x="506" y="480" /> + <mxPoint x="506" y="410" /> + <mxPoint x="553" y="410" /> </Array> </mxGeometry> </mxCell> - <mxCell id="f61RwCrreTIYbJ5Vt7fi-17" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;startArrow=classic;startFill=1;" edge="1" parent="1" source="f61RwCrreTIYbJ5Vt7fi-3" target="O_ELZSFbvl3Butg3bv_j-1"> - <mxGeometry relative="1" as="geometry" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-144" value="HTTP" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="FWEJ_FGA9GBXbfwohBE8-143"> + <mxGeometry x="0.6707" relative="1" as="geometry"> + <mxPoint x="-1" as="offset" /> + </mxGeometry> </mxCell> - <mxCell id="f61RwCrreTIYbJ5Vt7fi-18" value="idp" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="f61RwCrreTIYbJ5Vt7fi-17"> - <mxGeometry x="-0.1676" y="1" relative="1" as="geometry"> - <mxPoint x="4" as="offset" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-145" value="" style="endArrow=none;dashed=1;html=1;rounded=0;entryX=1;entryY=0.976;entryDx=0;entryDy=0;entryPerimeter=0;exitX=1;exitY=0.076;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1" source="FWEJ_FGA9GBXbfwohBE8-80" target="FWEJ_FGA9GBXbfwohBE8-76"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="810" y="570" as="sourcePoint" /> + <mxPoint x="860" y="520" as="targetPoint" /> </mxGeometry> </mxCell> - <mxCell id="f61RwCrreTIYbJ5Vt7fi-3" value="Identity Service<div>(OpenLDAP)</div>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E6E6E6;fontColor=#000000;strokeColor=#000000;" vertex="1" parent="1"> - <mxGeometry x="30" y="470" width="130" height="40" as="geometry" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-146" value="" style="endArrow=none;dashed=1;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0.121;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1" source="FWEJ_FGA9GBXbfwohBE8-80" target="FWEJ_FGA9GBXbfwohBE8-130"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="540" y="590" as="sourcePoint" /> + <mxPoint x="590" y="540" as="targetPoint" /> + </mxGeometry> </mxCell> - <mxCell id="f61RwCrreTIYbJ5Vt7fi-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="f61RwCrreTIYbJ5Vt7fi-10"> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-147" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;startArrow=classic;startFill=1;" edge="1" parent="1" source="FWEJ_FGA9GBXbfwohBE8-119" target="FWEJ_FGA9GBXbfwohBE8-140"> <mxGeometry relative="1" as="geometry"> - <mxPoint x="94" y="510" as="targetPoint" /> + <Array as="points"> + <mxPoint x="683" y="196" /> + <mxPoint x="683" y="360" /> + </Array> </mxGeometry> </mxCell> - <mxCell id="f61RwCrreTIYbJ5Vt7fi-10" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#e1d5e7;strokeColor=#000000;" vertex="1" parent="1"> - <mxGeometry x="80" y="532" width="28" height="28" as="geometry" /> - </mxCell> - <mxCell id="f61RwCrreTIYbJ5Vt7fi-11" value="identity-service-data" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;spacing=-1;" vertex="1" parent="1"> - <mxGeometry x="40" y="561" width="108" height="20" as="geometry" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-148" value="HTTP" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="FWEJ_FGA9GBXbfwohBE8-147"> + <mxGeometry x="0.0179" relative="1" as="geometry"> + <mxPoint y="8" as="offset" /> + </mxGeometry> </mxCell> - <mxCell id="f61RwCrreTIYbJ5Vt7fi-12" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> - <mxGeometry x="731" y="678" width="30" height="16" as="geometry" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-149" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.75;exitDx=0;exitDy=0;entryX=0;entryY=0.25;entryDx=0;entryDy=0;jumpStyle=arc;startArrow=classic;startFill=1;endArrow=none;endFill=0;" edge="1" parent="1" source="FWEJ_FGA9GBXbfwohBE8-105" target="FWEJ_FGA9GBXbfwohBE8-101"> + <mxGeometry relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="697" y="206" /> + <mxPoint x="697" y="514" /> + </Array> + </mxGeometry> </mxCell> - <mxCell id="f61RwCrreTIYbJ5Vt7fi-13" value="Maintained images" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1"> - <mxGeometry x="769.5" y="678" width="111.5" height="16" as="geometry" /> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-150" value="HTTP" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="FWEJ_FGA9GBXbfwohBE8-149"> + <mxGeometry x="-0.5289" y="-1" relative="1" as="geometry"> + <mxPoint x="4" y="34" as="offset" /> + </mxGeometry> </mxCell> </root> </mxGraphModel> diff --git a/.docs/index.md b/.docs/index.md index d47bf06b2861569060235cf86bb13b58dd3eb046..aea045c43c69da1013fc7884ccaa967ea743a95a 100644 --- a/.docs/index.md +++ b/.docs/index.md @@ -8,7 +8,7 @@ author: Martin Weise [](https://hub.docker.com/u/dbrepo){ tabindex=-1 } [](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services){ tabindex=-1 } -Documentation for version: [v1.4.5](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/releases). +Documentation for version: [v1.4.6](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/releases). DBRepo is a repository for data in databases that are used from the beginning until the end of a research project supporting data evolution, -citation and -versioning. It implements the query store of the @@ -30,7 +30,12 @@ Installing DBRepo is very easy or ## Who is using DBRepo? - +- [TU Wien](https://dbrepo1.ec.tuwien.ac.at) +- TU Darmstadt +- [Universität Hamburg](https://dbrepo.fdm.uni-hamburg.de/) +- [Universiti Teknikal Malaysia Melaka](https://dbrepo.utem.edu.my/) +- University of the Philippines +- [Universiti Sains Malaysia](https://dbrepo.wrfexpress.com/) ## How can I try DBRepo diff --git a/.docs/installation.md b/.docs/installation.md index 9c864ead4686a1b4c417147ad564740aeb5b8c8e..5f9a45199a50b579c1255b8362bf0e40ca0b995d 100644 --- a/.docs/installation.md +++ b/.docs/installation.md @@ -11,7 +11,7 @@ author: Martin Weise If you have [Docker](https://docs.docker.com/engine/install/) already installed on your system, you can install DBRepo with: ```shell -curl -sSL https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/release-1.4.5/install.sh | bash +curl -sSL https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/release-1.4.6/install.sh | bash ``` !!! bug "Default installation security disclaimer" @@ -39,7 +39,7 @@ SSL/TLS certificate is recommended. Follow the [secure install](#secure-install) Execute the install script to download only the environment and save it to `dist`. ```shell -curl -sSL https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/release-1.4.5/install.sh | DOWNLOAD_ONLY=1 bash +curl -sSL https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/release-1.4.6/install.sh | DOWNLOAD_ONLY=1 bash ``` ### Static Configuration @@ -81,7 +81,7 @@ the variable `IDENTITY_SERVICE_ADMIN_PASSWORD` in `.env`. Update the client secret of the `dbrepo-client`: ```bash -curl -sSL "https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/release-1.4.5/.scripts/reg-client-secret.sh" | bash +curl -sSL "https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/release-1.4.6/.scripts/reg-client-secret.sh" | bash ``` Also, update the JWT key according to the diff --git a/.docs/kubernetes.md b/.docs/kubernetes.md index 04799b4edf3425f5ba46a7b0a1f140e092414ae0..d6689058d6896b2e8449ff482a60a35a7d99b9cf 100644 --- a/.docs/kubernetes.md +++ b/.docs/kubernetes.md @@ -7,7 +7,7 @@ author: Martin Weise ## TL;DR To install DBRepo in your existing cluster, download the -sample [`values.yaml`](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/blob/release-1.4.5/helm/dbrepo/values.yaml) +sample [`values.yaml`](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/blob/release-1.4.6/helm/dbrepo/values.yaml) for your deployment and update the variables, especially `hostname`. ```shell @@ -15,7 +15,7 @@ helm upgrade --install dbrepo \ -n dbrepo \ "oci://registry.datalab.tuwien.ac.at/dbrepo/helm/dbrepo" \ --values ./values.yaml \ - --version "1.4.5" \ + --version "1.4.6" \ --create-namespace \ --cleanup-on-fail ``` @@ -36,7 +36,7 @@ brokerservice: The `brokerservice.auth.passwordHash` field is the RabbitMQ SHA512-hash of the `brokerservice.auth.password` field and can be obtained with -the [`generate-rabbitmq-pw.sh`](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/blob/release-1.4.5/helm/dbrepo/hack/generate-rabbitmq-pw.sh) +the [`generate-rabbitmq-pw.sh`](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/blob/release-1.4.6/helm/dbrepo/hack/generate-rabbitmq-pw.sh) script: ```console diff --git a/.docs/redirect.html b/.docs/redirect.html index 4e513b2170628796d31b592b0e5b3190cfb0fe09..035de3cbfe860773c99ac3f7ebd072f4cca66c40 100644 --- a/.docs/redirect.html +++ b/.docs/redirect.html @@ -5,16 +5,16 @@ <head> <meta charset="UTF-8"> <title>Redirect Notice</title> - <meta http-equiv="Refresh" content="0; url='/infrastructures/dbrepo/1.4.5/'" /> + <meta http-equiv="Refresh" content="0; url='/infrastructures/dbrepo/1.4.6/'" /> </head> <body> <h1>Redirect Notice</h1> <p> - This page should automatically open the documentation for version <code>1.4.5</code>. In case this page does not load the site is + This page should automatically open the documentation for version <code>1.4.6</code>. In case this page does not load the site is available at: </p> <p> - <a href="/infrastructures/dbrepo/1.4.5/">/infrastructures/dbrepo/1.4.5/</a> + <a href="/infrastructures/dbrepo/1.4.6/">/infrastructures/dbrepo/1.4.6/</a> </p> </body> </html> \ No newline at end of file diff --git a/.env.unix.example b/.env.unix.example deleted file mode 100644 index cc42c2445172e19016c48e55a5a599df5961de38..0000000000000000000000000000000000000000 --- a/.env.unix.example +++ /dev/null @@ -1 +0,0 @@ -LOG_LEVEL=trace # error, warning, info, debug, trace \ No newline at end of file diff --git a/.gitignore b/.gitignore index b8d8c0348731b553074acdf3d0bae56665095d35..4d7b82f6e6aac7adad8b9865fc2482f7c065e8f2 100644 --- a/.gitignore +++ b/.gitignore @@ -13,7 +13,6 @@ build/ tmp.yaml .docs/.swagger/api-* .scannerwork/ -.docker/config/* # docs .docs/.swagger/dist/ @@ -22,6 +21,7 @@ site/ final/ .$* +dbrepo-somapper/ # Notebooks .pytest_cache/ diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0bf1bc925538e7a74c85f2b6f12e290eaf8d10a0..5d4d611ea76255f0cc7613dcdb0174c81b534ede 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -3,8 +3,8 @@ variables: DOCKER_HOST: "unix:///var/run/dind/docker.sock" TESTCONTAINERS_RYUK_DISABLED: "false" PYTHON_VERSION: "3.11" - APP_VERSION: "1.4.5" - CHART_VERSION: "1.4.5" + APP_VERSION: "1.4.6" + CHART_VERSION: "1.4.6" CACHE_FALLBACK_KEY: ${CI_DEFAULT_BRANCH} # This will supress any download for dependencies and plugins or upload messages which would clutter the console log. # `showDateTime` will show the passed time in milliseconds. You need to specify `--batch-mode` to make this work. @@ -139,7 +139,6 @@ build-docker: before_script: - echo "$CI_REGISTRY_PASSWORD" | docker login --username "$CI_REGISTRY_USER" --password-stdin $CI_REGISTRY_URL script: - - "cp .env.unix.example .env" - "docker build -t dbrepo-metadata-service:build --target build dbrepo-metadata-service" - "docker build -t dbrepo-data-service:build --target build dbrepo-data-service" - "docker compose build --parallel" diff --git a/.scripts/check-helm.sh b/.scripts/check-helm.sh new file mode 100755 index 0000000000000000000000000000000000000000..2233434029da0f89a672b9796317ac261bfa476a --- /dev/null +++ b/.scripts/check-helm.sh @@ -0,0 +1,6 @@ +#!/bin/bash +helm schema > /dev/null +if [ $? -ne 0 ]; then + echo "!!! Please install the Helm values schema plugin first\n" + echo " https://github.com/losisin/helm-values-schema-json" +fi diff --git a/Makefile b/Makefile index b279097f827becd26e3e39da0bbf866fd513516f..027fac1b00fb33b0d94f4e3b3b90f241d792dba9 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ .PHONY: all -APP_VERSION ?= 1.4.5 -CHART_VERSION ?= 1.4.5 +APP_VERSION ?= 1.4.6 +CHART_VERSION ?= 1.4.6 REPOSITORY_URL ?= registry.datalab.tuwien.ac.at/dbrepo .PHONY: all diff --git a/README.md b/README.md index e4f843507c43232f4817dbd562b49594d75d9385..1c51793eb99fd9eae99ad98f4ba8686e9ad506a5 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ If you have [Docker](https://docs.docker.com/engine/install/) already installed with: ```bash -curl -sSL https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/release-1.4.5/install.sh | bash +curl -sSL https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/release-1.4.6/install.sh | bash ``` ## Documentation diff --git a/dbrepo-analyse-service/.gitignore b/dbrepo-analyse-service/.gitignore index eb269965160b9ad33871630e06d6f423b83263fd..87d11b3c3ba1917c6a68966b821852cdbb56419d 100644 --- a/dbrepo-analyse-service/.gitignore +++ b/dbrepo-analyse-service/.gitignore @@ -14,6 +14,9 @@ venv/ .venv/ env* +# LLM +*.bin + # Test report.xml coverage.html @@ -36,4 +39,4 @@ docs/_build/ htmlcov/ .coverage .coverage.* -*,cover \ No newline at end of file +*,cover diff --git a/dbrepo-analyse-service/Pipfile b/dbrepo-analyse-service/Pipfile index a0fb0bfd7be1fdb83dfacbcf42dc1bc557f83d82..158a03e2d175cc9d8a421adb0441b4c832f20622 100644 --- a/dbrepo-analyse-service/Pipfile +++ b/dbrepo-analyse-service/Pipfile @@ -21,7 +21,7 @@ numpy = "*" pandas = "*" minio = "*" pydantic = "*" -dbrepo = {path = "./lib/dbrepo-1.4.5.tar.gz"} +dbrepo = {path = "./lib/dbrepo-1.4.6.tar.gz"} opensearch-py = "*" [dev-packages] diff --git a/dbrepo-analyse-service/Pipfile.lock b/dbrepo-analyse-service/Pipfile.lock index a47ad241be71bb73dd72e470f0d84c8ecf528c97..8dd1014dd04aa0ce09ec9cec6d6cd0cceb3c4e7a 100644 --- a/dbrepo-analyse-service/Pipfile.lock +++ b/dbrepo-analyse-service/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "a445bc066f06e174431552d155daabfdb4271e7f6ba781b61611e816ad8bf48c" + "sha256": "77d9a73a8fbe7ffd566a4207e762dfacf0c4d8c474c937d481811567482fb708" }, "pipfile-spec": 6, "requires": { @@ -16,87 +16,110 @@ ] }, "default": { + "aiohappyeyeballs": { + "hashes": [ + "sha256:55a1714f084e63d49639800f95716da97a1f173d46a16dfcfda0016abb93b6b2", + "sha256:7ce92076e249169a13c2f49320d1967425eaf1f407522d707d59cac7628d62bd" + ], + "markers": "python_version >= '3.8'", + "version": "==2.4.0" + }, "aiohttp": { "hashes": [ - "sha256:0605cc2c0088fcaae79f01c913a38611ad09ba68ff482402d3410bf59039bfb8", - "sha256:0a158704edf0abcac8ac371fbb54044f3270bdbc93e254a82b6c82be1ef08f3c", - "sha256:0cbf56238f4bbf49dab8c2dc2e6b1b68502b1e88d335bea59b3f5b9f4c001475", - "sha256:1732102949ff6087589408d76cd6dea656b93c896b011ecafff418c9661dc4ed", - "sha256:18f634d540dd099c262e9f887c8bbacc959847cfe5da7a0e2e1cf3f14dbf2daf", - "sha256:239f975589a944eeb1bad26b8b140a59a3a320067fb3cd10b75c3092405a1372", - "sha256:2faa61a904b83142747fc6a6d7ad8fccff898c849123030f8e75d5d967fd4a81", - "sha256:320e8618eda64e19d11bdb3bd04ccc0a816c17eaecb7e4945d01deee2a22f95f", - "sha256:38d80498e2e169bc61418ff36170e0aad0cd268da8b38a17c4cf29d254a8b3f1", - "sha256:3916c8692dbd9d55c523374a3b8213e628424d19116ac4308e434dbf6d95bbdd", - "sha256:393c7aba2b55559ef7ab791c94b44f7482a07bf7640d17b341b79081f5e5cd1a", - "sha256:3b7b30258348082826d274504fbc7c849959f1989d86c29bc355107accec6cfb", - "sha256:3fcb4046d2904378e3aeea1df51f697b0467f2aac55d232c87ba162709478c46", - "sha256:4109adee842b90671f1b689901b948f347325045c15f46b39797ae1bf17019de", - "sha256:4558e5012ee03d2638c681e156461d37b7a113fe13970d438d95d10173d25f78", - "sha256:45731330e754f5811c314901cebdf19dd776a44b31927fa4b4dbecab9e457b0c", - "sha256:4715a9b778f4293b9f8ae7a0a7cef9829f02ff8d6277a39d7f40565c737d3771", - "sha256:471f0ef53ccedec9995287f02caf0c068732f026455f07db3f01a46e49d76bbb", - "sha256:4d3ebb9e1316ec74277d19c5f482f98cc65a73ccd5430540d6d11682cd857430", - "sha256:4ff550491f5492ab5ed3533e76b8567f4b37bd2995e780a1f46bca2024223233", - "sha256:52c27110f3862a1afbcb2af4281fc9fdc40327fa286c4625dfee247c3ba90156", - "sha256:55b39c8684a46e56ef8c8d24faf02de4a2b2ac60d26cee93bc595651ff545de9", - "sha256:5a7ee16aab26e76add4afc45e8f8206c95d1d75540f1039b84a03c3b3800dd59", - "sha256:5ca51eadbd67045396bc92a4345d1790b7301c14d1848feaac1d6a6c9289e888", - "sha256:5d6b3f1fabe465e819aed2c421a6743d8debbde79b6a8600739300630a01bf2c", - "sha256:60cdbd56f4cad9f69c35eaac0fbbdf1f77b0ff9456cebd4902f3dd1cf096464c", - "sha256:6380c039ec52866c06d69b5c7aad5478b24ed11696f0e72f6b807cfb261453da", - "sha256:639d0042b7670222f33b0028de6b4e2fad6451462ce7df2af8aee37dcac55424", - "sha256:66331d00fb28dc90aa606d9a54304af76b335ae204d1836f65797d6fe27f1ca2", - "sha256:67c3119f5ddc7261d47163ed86d760ddf0e625cd6246b4ed852e82159617b5fb", - "sha256:694d828b5c41255e54bc2dddb51a9f5150b4eefa9886e38b52605a05d96566e8", - "sha256:6ae79c1bc12c34082d92bf9422764f799aee4746fd7a392db46b7fd357d4a17a", - "sha256:702e2c7c187c1a498a4e2b03155d52658fdd6fda882d3d7fbb891a5cf108bb10", - "sha256:714d4e5231fed4ba2762ed489b4aec07b2b9953cf4ee31e9871caac895a839c0", - "sha256:7b179eea70833c8dee51ec42f3b4097bd6370892fa93f510f76762105568cf09", - "sha256:7f64cbd44443e80094309875d4f9c71d0401e966d191c3d469cde4642bc2e031", - "sha256:82a6a97d9771cb48ae16979c3a3a9a18b600a8505b1115cfe354dfb2054468b4", - "sha256:84dabd95154f43a2ea80deffec9cb44d2e301e38a0c9d331cc4aa0166fe28ae3", - "sha256:8676e8fd73141ded15ea586de0b7cda1542960a7b9ad89b2b06428e97125d4fa", - "sha256:88e311d98cc0bf45b62fc46c66753a83445f5ab20038bcc1b8a1cc05666f428a", - "sha256:8b4f72fbb66279624bfe83fd5eb6aea0022dad8eec62b71e7bf63ee1caadeafe", - "sha256:8c64a6dc3fe5db7b1b4d2b5cb84c4f677768bdc340611eca673afb7cf416ef5a", - "sha256:8cf142aa6c1a751fcb364158fd710b8a9be874b81889c2bd13aa8893197455e2", - "sha256:8d1964eb7617907c792ca00b341b5ec3e01ae8c280825deadbbd678447b127e1", - "sha256:93e22add827447d2e26d67c9ac0161756007f152fdc5210277d00a85f6c92323", - "sha256:9c69e77370cce2d6df5d12b4e12bdcca60c47ba13d1cbbc8645dd005a20b738b", - "sha256:9dbc053ac75ccc63dc3a3cc547b98c7258ec35a215a92bd9f983e0aac95d3d5b", - "sha256:9e3a1ae66e3d0c17cf65c08968a5ee3180c5a95920ec2731f53343fac9bad106", - "sha256:a6ea1a5b409a85477fd8e5ee6ad8f0e40bf2844c270955e09360418cfd09abac", - "sha256:a81b1143d42b66ffc40a441379387076243ef7b51019204fd3ec36b9f69e77d6", - "sha256:ad7f2919d7dac062f24d6f5fe95d401597fbb015a25771f85e692d043c9d7832", - "sha256:afc52b8d969eff14e069a710057d15ab9ac17cd4b6753042c407dcea0e40bf75", - "sha256:b3df71da99c98534be076196791adca8819761f0bf6e08e07fd7da25127150d6", - "sha256:c088c4d70d21f8ca5c0b8b5403fe84a7bc8e024161febdd4ef04575ef35d474d", - "sha256:c26959ca7b75ff768e2776d8055bf9582a6267e24556bb7f7bd29e677932be72", - "sha256:c413016880e03e69d166efb5a1a95d40f83d5a3a648d16486592c49ffb76d0db", - "sha256:c6021d296318cb6f9414b48e6a439a7f5d1f665464da507e8ff640848ee2a58a", - "sha256:c671dc117c2c21a1ca10c116cfcd6e3e44da7fcde37bf83b2be485ab377b25da", - "sha256:c7a4b7a6cf5b6eb11e109a9755fd4fda7d57395f8c575e166d363b9fc3ec4678", - "sha256:c8a02fbeca6f63cb1f0475c799679057fc9268b77075ab7cf3f1c600e81dd46b", - "sha256:cd2adf5c87ff6d8b277814a28a535b59e20bfea40a101db6b3bdca7e9926bc24", - "sha256:d1469f228cd9ffddd396d9948b8c9cd8022b6d1bf1e40c6f25b0fb90b4f893ed", - "sha256:d153f652a687a8e95ad367a86a61e8d53d528b0530ef382ec5aaf533140ed00f", - "sha256:d5ab8e1f6bee051a4bf6195e38a5c13e5e161cb7bad83d8854524798bd9fcd6e", - "sha256:da00da442a0e31f1c69d26d224e1efd3a1ca5bcbf210978a2ca7426dfcae9f58", - "sha256:da22dab31d7180f8c3ac7c7635f3bcd53808f374f6aa333fe0b0b9e14b01f91a", - "sha256:e0ae53e33ee7476dd3d1132f932eeb39bf6125083820049d06edcdca4381f342", - "sha256:e7a6a8354f1b62e15d48e04350f13e726fa08b62c3d7b8401c0a1314f02e3558", - "sha256:e9a3d838441bebcf5cf442700e3963f58b5c33f015341f9ea86dcd7d503c07e2", - "sha256:edea7d15772ceeb29db4aff55e482d4bcfb6ae160ce144f2682de02f6d693551", - "sha256:f22eb3a6c1080d862befa0a89c380b4dafce29dc6cd56083f630073d102eb595", - "sha256:f26383adb94da5e7fb388d441bf09c61e5e35f455a3217bfd790c6b6bc64b2ee", - "sha256:f3c2890ca8c59ee683fd09adf32321a40fe1cf164e3387799efb2acebf090c11", - "sha256:f64fd07515dad67f24b6ea4a66ae2876c01031de91c93075b8093f07c0a2d93d", - "sha256:fcde4c397f673fdec23e6b05ebf8d4751314fa7c24f93334bf1f1364c1c69ac7", - "sha256:ff84aeb864e0fac81f676be9f4685f0527b660f1efdc40dcede3c251ef1e867f" + "sha256:02594361128f780eecc2a29939d9dfc870e17b45178a867bf61a11b2a4367277", + "sha256:03f2645adbe17f274444953bdea69f8327e9d278d961d85657cb0d06864814c1", + "sha256:074d1bff0163e107e97bd48cad9f928fa5a3eb4b9d33366137ffce08a63e37fe", + "sha256:0912b8a8fadeb32ff67a3ed44249448c20148397c1ed905d5dac185b4ca547bb", + "sha256:0d277cfb304118079e7044aad0b76685d30ecb86f83a0711fc5fb257ffe832ca", + "sha256:0d93400c18596b7dc4794d48a63fb361b01a0d8eb39f28800dc900c8fbdaca91", + "sha256:123dd5b16b75b2962d0fff566effb7a065e33cd4538c1692fb31c3bda2bfb972", + "sha256:17e997105bd1a260850272bfb50e2a328e029c941c2708170d9d978d5a30ad9a", + "sha256:18a01eba2574fb9edd5f6e5fb25f66e6ce061da5dab5db75e13fe1558142e0a3", + "sha256:1923a5c44061bffd5eebeef58cecf68096e35003907d8201a4d0d6f6e387ccaa", + "sha256:1942244f00baaacaa8155eca94dbd9e8cc7017deb69b75ef67c78e89fdad3c77", + "sha256:1b2c16a919d936ca87a3c5f0e43af12a89a3ce7ccbce59a2d6784caba945b68b", + "sha256:1c19de68896747a2aa6257ae4cf6ef59d73917a36a35ee9d0a6f48cff0f94db8", + "sha256:1e72589da4c90337837fdfe2026ae1952c0f4a6e793adbbfbdd40efed7c63599", + "sha256:22c0a23a3b3138a6bf76fc553789cb1a703836da86b0f306b6f0dc1617398abc", + "sha256:2c634a3207a5445be65536d38c13791904fda0748b9eabf908d3fe86a52941cf", + "sha256:2d21ac12dc943c68135ff858c3a989f2194a709e6e10b4c8977d7fcd67dfd511", + "sha256:2f1f1c75c395991ce9c94d3e4aa96e5c59c8356a15b1c9231e783865e2772699", + "sha256:305be5ff2081fa1d283a76113b8df7a14c10d75602a38d9f012935df20731487", + "sha256:33e6bc4bab477c772a541f76cd91e11ccb6d2efa2b8d7d7883591dfb523e5987", + "sha256:349ef8a73a7c5665cca65c88ab24abe75447e28aa3bc4c93ea5093474dfdf0ff", + "sha256:380f926b51b92d02a34119d072f178d80bbda334d1a7e10fa22d467a66e494db", + "sha256:38172a70005252b6893088c0f5e8a47d173df7cc2b2bd88650957eb84fcf5022", + "sha256:391cc3a9c1527e424c6865e087897e766a917f15dddb360174a70467572ac6ce", + "sha256:3a1c32a19ee6bbde02f1cb189e13a71b321256cc1d431196a9f824050b160d5a", + "sha256:4120d7fefa1e2d8fb6f650b11489710091788de554e2b6f8347c7a20ceb003f5", + "sha256:424ae21498790e12eb759040bbb504e5e280cab64693d14775c54269fd1d2bb7", + "sha256:44b324a6b8376a23e6ba25d368726ee3bc281e6ab306db80b5819999c737d820", + "sha256:4790f0e15f00058f7599dab2b206d3049d7ac464dc2e5eae0e93fa18aee9e7bf", + "sha256:4aff049b5e629ef9b3e9e617fa6e2dfeda1bf87e01bcfecaf3949af9e210105e", + "sha256:4b38b1570242fbab8d86a84128fb5b5234a2f70c2e32f3070143a6d94bc854cf", + "sha256:4d46c7b4173415d8e583045fbc4daa48b40e31b19ce595b8d92cf639396c15d5", + "sha256:4f1c9866ccf48a6df2b06823e6ae80573529f2af3a0992ec4fe75b1a510df8a6", + "sha256:4f7acae3cf1a2a2361ec4c8e787eaaa86a94171d2417aae53c0cca6ca3118ff6", + "sha256:54d9ddea424cd19d3ff6128601a4a4d23d54a421f9b4c0fff740505813739a91", + "sha256:58718e181c56a3c02d25b09d4115eb02aafe1a732ce5714ab70326d9776457c3", + "sha256:5ede29d91a40ba22ac1b922ef510aab871652f6c88ef60b9dcdf773c6d32ad7a", + "sha256:61645818edd40cc6f455b851277a21bf420ce347baa0b86eaa41d51ef58ba23d", + "sha256:66bf9234e08fe561dccd62083bf67400bdbf1c67ba9efdc3dac03650e97c6088", + "sha256:673f988370f5954df96cc31fd99c7312a3af0a97f09e407399f61583f30da9bc", + "sha256:676f94c5480d8eefd97c0c7e3953315e4d8c2b71f3b49539beb2aa676c58272f", + "sha256:6c225286f2b13bab5987425558baa5cbdb2bc925b2998038fa028245ef421e75", + "sha256:7384d0b87d4635ec38db9263e6a3f1eb609e2e06087f0aa7f63b76833737b471", + "sha256:7e2fe37ac654032db1f3499fe56e77190282534810e2a8e833141a021faaab0e", + "sha256:7f2bfc0032a00405d4af2ba27f3c429e851d04fad1e5ceee4080a1c570476697", + "sha256:7f6b639c36734eaa80a6c152a238242bedcee9b953f23bb887e9102976343092", + "sha256:814375093edae5f1cb31e3407997cf3eacefb9010f96df10d64829362ae2df69", + "sha256:8224f98be68a84b19f48e0bdc14224b5a71339aff3a27df69989fa47d01296f3", + "sha256:898715cf566ec2869d5cb4d5fb4be408964704c46c96b4be267442d265390f32", + "sha256:8989f46f3d7ef79585e98fa991e6ded55d2f48ae56d2c9fa5e491a6e4effb589", + "sha256:8ba01ebc6175e1e6b7275c907a3a36be48a2d487549b656aa90c8a910d9f3178", + "sha256:8c5c6fa16412b35999320f5c9690c0f554392dc222c04e559217e0f9ae244b92", + "sha256:8c6a4e5e40156d72a40241a25cc226051c0a8d816610097a8e8f517aeacd59a2", + "sha256:8eaf44ccbc4e35762683078b72bf293f476561d8b68ec8a64f98cf32811c323e", + "sha256:8fb4fc029e135859f533025bc82047334e24b0d489e75513144f25408ecaf058", + "sha256:9093a81e18c45227eebe4c16124ebf3e0d893830c6aca7cc310bfca8fe59d857", + "sha256:94c4381ffba9cc508b37d2e536b418d5ea9cfdc2848b9a7fea6aebad4ec6aac1", + "sha256:94fac7c6e77ccb1ca91e9eb4cb0ac0270b9fb9b289738654120ba8cebb1189c6", + "sha256:95c4dc6f61d610bc0ee1edc6f29d993f10febfe5b76bb470b486d90bbece6b22", + "sha256:975218eee0e6d24eb336d0328c768ebc5d617609affaca5dbbd6dd1984f16ed0", + "sha256:ad146dae5977c4dd435eb31373b3fe9b0b1bf26858c6fc452bf6af394067e10b", + "sha256:afe16a84498441d05e9189a15900640a2d2b5e76cf4efe8cbb088ab4f112ee57", + "sha256:b1c43eb1ab7cbf411b8e387dc169acb31f0ca0d8c09ba63f9eac67829585b44f", + "sha256:b90078989ef3fc45cf9221d3859acd1108af7560c52397ff4ace8ad7052a132e", + "sha256:b98e698dc34966e5976e10bbca6d26d6724e6bdea853c7c10162a3235aba6e16", + "sha256:ba5a8b74c2a8af7d862399cdedce1533642fa727def0b8c3e3e02fcb52dca1b1", + "sha256:c31ad0c0c507894e3eaa843415841995bf8de4d6b2d24c6e33099f4bc9fc0d4f", + "sha256:c3b9162bab7e42f21243effc822652dc5bb5e8ff42a4eb62fe7782bcbcdfacf6", + "sha256:c58c6837a2c2a7cf3133983e64173aec11f9c2cd8e87ec2fdc16ce727bcf1a04", + "sha256:c83f7a107abb89a227d6c454c613e7606c12a42b9a4ca9c5d7dad25d47c776ae", + "sha256:cde98f323d6bf161041e7627a5fd763f9fd829bcfcd089804a5fdce7bb6e1b7d", + "sha256:ce91db90dbf37bb6fa0997f26574107e1b9d5ff939315247b7e615baa8ec313b", + "sha256:d00f3c5e0d764a5c9aa5a62d99728c56d455310bcc288a79cab10157b3af426f", + "sha256:d17920f18e6ee090bdd3d0bfffd769d9f2cb4c8ffde3eb203777a3895c128862", + "sha256:d55f011da0a843c3d3df2c2cf4e537b8070a419f891c930245f05d329c4b0689", + "sha256:d742c36ed44f2798c8d3f4bc511f479b9ceef2b93f348671184139e7d708042c", + "sha256:d9a487ef090aea982d748b1b0d74fe7c3950b109df967630a20584f9a99c0683", + "sha256:d9ef084e3dc690ad50137cc05831c52b6ca428096e6deb3c43e95827f531d5ef", + "sha256:da452c2c322e9ce0cfef392e469a26d63d42860f829026a63374fde6b5c5876f", + "sha256:dc4826823121783dccc0871e3f405417ac116055bf184ac04c36f98b75aacd12", + "sha256:de7a5299827253023c55ea549444e058c0eb496931fa05d693b95140a947cb73", + "sha256:e04a1f2a65ad2f93aa20f9ff9f1b672bf912413e5547f60749fa2ef8a644e061", + "sha256:e1ca1ef5ba129718a8fc827b0867f6aa4e893c56eb00003b7367f8a733a9b072", + "sha256:ee40b40aa753d844162dcc80d0fe256b87cba48ca0054f64e68000453caead11", + "sha256:f071854b47d39591ce9a17981c46790acb30518e2f83dfca8db2dfa091178691", + "sha256:f29930bc2921cef955ba39a3ff87d2c4398a0394ae217f41cb02d5c26c8b1b77", + "sha256:f489a2c9e6455d87eabf907ac0b7d230a9786be43fbe884ad184ddf9e9c1e385", + "sha256:f5bf3ead3cb66ab990ee2561373b009db5bc0e857549b6c9ba84b20bc462e172", + "sha256:f6f18898ace4bcd2d41a122916475344a87f1dfdec626ecde9ee802a711bc569", + "sha256:f8112fb501b1e0567a1251a2fd0747baae60a4ab325a871e975b7bb67e59221f", + "sha256:fd31f176429cecbc1ba499d4aba31aaccfea488f418d60376b911269d3b883c5" ], "markers": "python_version >= '3.8'", - "version": "==3.9.5" + "version": "==3.10.5" }, "aiosignal": { "hashes": [ @@ -151,11 +174,11 @@ }, "attrs": { "hashes": [ - "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", - "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1" + "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346", + "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2" ], "markers": "python_version >= '3.7'", - "version": "==23.2.0" + "version": "==24.2.0" }, "blinker": { "hashes": [ @@ -167,95 +190,101 @@ }, "boto3": { "hashes": [ - "sha256:11edeeacdd517bda3b7615b754d8440820cdc9ddd66794cc995a9693ddeaa3be", - "sha256:f4e6489ba9dc7fb37d53e0e82dbc97f2cb0a4969ef3970e2c88b8f94023ae81a" + "sha256:71e237d3997cf93425947854d7b121c577944f391ba633afb0659e1015364704", + "sha256:fd130308f1f49d748a5fc63de92de79a995b51c79af3947ddde8815fcf0684fe" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==1.34.149" + "version": "==1.35.18" }, "botocore": { "hashes": [ - "sha256:2e1eb5ef40102a3d796bb3dd05f2ac5e8fb43fe1ff114b4f6d33153437f5a372", - "sha256:ae6c4be52eeee96f68c116b27d252bab069cd046d61a17cfe8e9da411cf22906" + "sha256:1027083aeb1fe74057273410fd768e018e22f85adfbd717b5a69f578f7812b80", + "sha256:e59da8b91ab06683d2725b6cbbb0383b30c68a241c3c63363f4c5bff59b3c0c0" ], "markers": "python_version >= '3.8'", - "version": "==1.34.149" + "version": "==1.35.18" }, "certifi": { "hashes": [ - "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b", - "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90" + "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", + "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9" ], "markers": "python_version >= '3.6'", - "version": "==2024.7.4" + "version": "==2024.8.30" }, "cffi": { "hashes": [ - "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc", - "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a", - "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417", - "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab", - "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520", - "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36", - "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743", - "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8", - "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed", - "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684", - "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56", - "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324", - "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d", - "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235", - "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e", - "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088", - "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000", - "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7", - "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e", - "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673", - "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c", - "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe", - "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2", - "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098", - "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8", - "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a", - "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0", - "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b", - "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896", - "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e", - "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9", - "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2", - "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b", - "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6", - "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404", - "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f", - "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0", - "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4", - "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc", - "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936", - "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba", - "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872", - "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb", - "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614", - "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1", - "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d", - "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969", - "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b", - "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4", - "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627", - "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956", - "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357" + "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", + "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", + "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1", + "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", + "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", + "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", + "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8", + "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36", + "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17", + "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", + "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc", + "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", + "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", + "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", + "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", + "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", + "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", + "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6", + "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", + "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b", + "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", + "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", + "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c", + "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", + "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", + "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", + "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8", + "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1", + "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", + "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", + "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", + "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595", + "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0", + "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", + "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", + "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", + "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", + "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", + "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", + "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16", + "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", + "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e", + "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", + "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964", + "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", + "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576", + "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", + "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3", + "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662", + "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", + "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", + "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", + "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", + "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", + "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", + "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", + "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", + "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9", + "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7", + "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", + "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a", + "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", + "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", + "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", + "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", + "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87", + "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b" ], "markers": "platform_python_implementation != 'PyPy'", - "version": "==1.16.0" - }, - "chardet": { - "hashes": [ - "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7", - "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970" - ], - "index": "pypi", - "markers": "python_version >= '3.7'", - "version": "==5.2.0" + "version": "==1.17.1" }, "charset-normalizer": { "hashes": [ @@ -363,44 +392,43 @@ }, "cryptography": { "hashes": [ - "sha256:0663585d02f76929792470451a5ba64424acc3cd5227b03921dab0e2f27b1709", - "sha256:08a24a7070b2b6804c1940ff0f910ff728932a9d0e80e7814234269f9d46d069", - "sha256:232ce02943a579095a339ac4b390fbbe97f5b5d5d107f8a08260ea2768be8cc2", - "sha256:2905ccf93a8a2a416f3ec01b1a7911c3fe4073ef35640e7ee5296754e30b762b", - "sha256:299d3da8e00b7e2b54bb02ef58d73cd5f55fb31f33ebbf33bd00d9aa6807df7e", - "sha256:2c6d112bf61c5ef44042c253e4859b3cbbb50df2f78fa8fae6747a7814484a70", - "sha256:31e44a986ceccec3d0498e16f3d27b2ee5fdf69ce2ab89b52eaad1d2f33d8778", - "sha256:3d9a1eca329405219b605fac09ecfc09ac09e595d6def650a437523fcd08dd22", - "sha256:3dcdedae5c7710b9f97ac6bba7e1052b95c7083c9d0e9df96e02a1932e777895", - "sha256:47ca71115e545954e6c1d207dd13461ab81f4eccfcb1345eac874828b5e3eaaf", - "sha256:4a997df8c1c2aae1e1e5ac49c2e4f610ad037fc5a3aadc7b64e39dea42249431", - "sha256:51956cf8730665e2bdf8ddb8da0056f699c1a5715648c1b0144670c1ba00b48f", - "sha256:5bcb8a5620008a8034d39bce21dc3e23735dfdb6a33a06974739bfa04f853947", - "sha256:64c3f16e2a4fc51c0d06af28441881f98c5d91009b8caaff40cf3548089e9c74", - "sha256:6e2b11c55d260d03a8cf29ac9b5e0608d35f08077d8c087be96287f43af3ccdc", - "sha256:7b3f5fe74a5ca32d4d0f302ffe6680fcc5c28f8ef0dc0ae8f40c0f3a1b4fca66", - "sha256:844b6d608374e7d08f4f6e6f9f7b951f9256db41421917dfb2d003dde4cd6b66", - "sha256:9a8d6802e0825767476f62aafed40532bd435e8a5f7d23bd8b4f5fd04cc80ecf", - "sha256:aae4d918f6b180a8ab8bf6511a419473d107df4dbb4225c7b48c5c9602c38c7f", - "sha256:ac1955ce000cb29ab40def14fd1bbfa7af2017cca696ee696925615cafd0dce5", - "sha256:b88075ada2d51aa9f18283532c9f60e72170041bba88d7f37e49cbb10275299e", - "sha256:cb013933d4c127349b3948aa8aaf2f12c0353ad0eccd715ca789c8a0f671646f", - "sha256:cc70b4b581f28d0a254d006f26949245e3657d40d8857066c2ae22a61222ef55", - "sha256:e9c5266c432a1e23738d178e51c2c7a5e2ddf790f248be939448c0ba2021f9d1", - "sha256:ea9e57f8ea880eeea38ab5abf9fbe39f923544d7884228ec67d666abd60f5a47", - "sha256:ee0c405832ade84d4de74b9029bedb7b31200600fa524d218fc29bfa371e97f5", - "sha256:fdcb265de28585de5b859ae13e3846a8e805268a823a12a4da2597f1f5afc9f0" + "sha256:014f58110f53237ace6a408b5beb6c427b64e084eb451ef25a28308270086494", + "sha256:1bbcce1a551e262dfbafb6e6252f1ae36a248e615ca44ba302df077a846a8806", + "sha256:203e92a75716d8cfb491dc47c79e17d0d9207ccffcbcb35f598fbe463ae3444d", + "sha256:27e613d7077ac613e399270253259d9d53872aaf657471473ebfc9a52935c062", + "sha256:2bd51274dcd59f09dd952afb696bf9c61a7a49dfc764c04dd33ef7a6b502a1e2", + "sha256:38926c50cff6f533f8a2dae3d7f19541432610d114a70808f0926d5aaa7121e4", + "sha256:511f4273808ab590912a93ddb4e3914dfd8a388fed883361b02dea3791f292e1", + "sha256:58d4e9129985185a06d849aa6df265bdd5a74ca6e1b736a77959b498e0505b85", + "sha256:5b43d1ea6b378b54a1dc99dd8a2b5be47658fe9a7ce0a58ff0b55f4b43ef2b84", + "sha256:61ec41068b7b74268fa86e3e9e12b9f0c21fcf65434571dbb13d954bceb08042", + "sha256:666ae11966643886c2987b3b721899d250855718d6d9ce41b521252a17985f4d", + "sha256:68aaecc4178e90719e95298515979814bda0cbada1256a4485414860bd7ab962", + "sha256:7c05650fe8023c5ed0d46793d4b7d7e6cd9c04e68eabe5b0aeea836e37bdcec2", + "sha256:80eda8b3e173f0f247f711eef62be51b599b5d425c429b5d4ca6a05e9e856baa", + "sha256:8385d98f6a3bf8bb2d65a73e17ed87a3ba84f6991c155691c51112075f9ffc5d", + "sha256:88cce104c36870d70c49c7c8fd22885875d950d9ee6ab54df2745f83ba0dc365", + "sha256:9d3cdb25fa98afdd3d0892d132b8d7139e2c087da1712041f6b762e4f807cc96", + "sha256:a575913fb06e05e6b4b814d7f7468c2c660e8bb16d8d5a1faf9b33ccc569dd47", + "sha256:ac119bb76b9faa00f48128b7f5679e1d8d437365c5d26f1c2c3f0da4ce1b553d", + "sha256:c1332724be35d23a854994ff0b66530119500b6053d0bd3363265f7e5e77288d", + "sha256:d03a475165f3134f773d1388aeb19c2d25ba88b6a9733c5c590b9ff7bbfa2e0c", + "sha256:d75601ad10b059ec832e78823b348bfa1a59f6b8d545db3a24fd44362a1564cb", + "sha256:de41fd81a41e53267cb020bb3a7212861da53a7d39f863585d13ea11049cf277", + "sha256:e710bf40870f4db63c3d7d929aa9e09e4e7ee219e703f949ec4073b4294f6172", + "sha256:ea25acb556320250756e53f9e20a4177515f012c9eaea17eb7587a8c4d8ae034", + "sha256:f98bf604c82c416bc829e490c700ca1553eafdf2912a91e23a79d97d9801372a", + "sha256:fba1007b3ef89946dbbb515aeeb41e30203b004f0b4b00e5e16078b518563289" ], "markers": "python_version >= '3.7'", - "version": "==43.0.0" + "version": "==43.0.1" }, "dbrepo": { "hashes": [ - "sha256:0a04b67204de6dc969ec68fb21aaead898156077e8a5b6f1e03bb5ab0e124a61", - "sha256:454a182b772cb777d27a22bb334bf059ce68d4e6b5fecae802678fabfdf3f934" + "sha256:d5e248e25fb3787d085e3d27c81108408f963ca662d7778bc98288ca0d747940" ], "markers": "python_version >= '3.11'", - "path": "./lib/dbrepo-1.4.5.tar.gz" + "path": "./lib/dbrepo-1.4.6.tar.gz" }, "events": { "hashes": [ @@ -435,11 +463,11 @@ }, "flask-cors": { "hashes": [ - "sha256:eeb69b342142fdbf4766ad99357a7f3876a2ceb77689dc10ff912aac06c389e4", - "sha256:f2a704e4458665580c074b714c4627dd5a306b333deb9074d0b1794dfa2fb677" + "sha256:5aadb4b950c4e93745034594d9f3ea6591f734bb3662e16e255ffbf5e89c88ef", + "sha256:b9e307d082a9261c100d8fb0ba909eec6a228ed1b60a8315fd85f783d61910bc" ], "index": "pypi", - "version": "==4.0.1" + "version": "==5.0.0" }, "flask-httpauth": { "hashes": [ @@ -591,85 +619,93 @@ }, "greenlet": { "hashes": [ - "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67", - "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6", - "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257", - "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4", - "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676", - "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61", - "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc", - "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca", - "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7", - "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728", - "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305", - "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6", - "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379", - "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414", - "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04", - "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a", - "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf", - "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491", - "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559", - "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e", - "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274", - "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb", - "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b", - "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9", - "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b", - "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be", - "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506", - "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405", - "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113", - "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f", - "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5", - "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230", - "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d", - "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f", - "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a", - "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e", - "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61", - "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6", - "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d", - "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71", - "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22", - "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2", - "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3", - "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067", - "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc", - "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881", - "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3", - "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e", - "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac", - "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53", - "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0", - "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b", - "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83", - "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41", - "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c", - "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf", - "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da", - "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33" + "sha256:01059afb9b178606b4b6e92c3e710ea1635597c3537e44da69f4531e111dd5e9", + "sha256:037d9ac99540ace9424cb9ea89f0accfaff4316f149520b4ae293eebc5bded17", + "sha256:0e49a65d25d7350cca2da15aac31b6f67a43d867448babf997fe83c7505f57bc", + "sha256:13ff8c8e54a10472ce3b2a2da007f915175192f18e6495bad50486e87c7f6637", + "sha256:1544b8dd090b494c55e60c4ff46e238be44fdc472d2589e943c241e0169bcea2", + "sha256:184258372ae9e1e9bddce6f187967f2e08ecd16906557c4320e3ba88a93438c3", + "sha256:1ddc7bcedeb47187be74208bc652d63d6b20cb24f4e596bd356092d8000da6d6", + "sha256:221169d31cada333a0c7fd087b957c8f431c1dba202c3a58cf5a3583ed973e9b", + "sha256:243a223c96a4246f8a30ea470c440fe9db1f5e444941ee3c3cd79df119b8eebf", + "sha256:24fc216ec7c8be9becba8b64a98a78f9cd057fd2dc75ae952ca94ed8a893bf27", + "sha256:2651dfb006f391bcb240635079a68a261b227a10a08af6349cba834a2141efa1", + "sha256:26811df4dc81271033a7836bc20d12cd30938e6bd2e9437f56fa03da81b0f8fc", + "sha256:26d9c1c4f1748ccac0bae1dbb465fb1a795a75aba8af8ca871503019f4285e2a", + "sha256:28fe80a3eb673b2d5cc3b12eea468a5e5f4603c26aa34d88bf61bba82ceb2f9b", + "sha256:2cd8518eade968bc52262d8c46727cfc0826ff4d552cf0430b8d65aaf50bb91d", + "sha256:2d004db911ed7b6218ec5c5bfe4cf70ae8aa2223dffbb5b3c69e342bb253cb28", + "sha256:3d07c28b85b350564bdff9f51c1c5007dfb2f389385d1bc23288de51134ca303", + "sha256:3e7e6ef1737a819819b1163116ad4b48d06cfdd40352d813bb14436024fcda99", + "sha256:44151d7b81b9391ed759a2f2865bbe623ef00d648fed59363be2bbbd5154656f", + "sha256:44cd313629ded43bb3b98737bba2f3e2c2c8679b55ea29ed73daea6b755fe8e7", + "sha256:4a3dae7492d16e85ea6045fd11cb8e782b63eac8c8d520c3a92c02ac4573b0a6", + "sha256:4b5ea3664eed571779403858d7cd0a9b0ebf50d57d2cdeafc7748e09ef8cd81a", + "sha256:4c3446937be153718250fe421da548f973124189f18fe4575a0510b5c928f0cc", + "sha256:5415b9494ff6240b09af06b91a375731febe0090218e2898d2b85f9b92abcda0", + "sha256:5fd6e94593f6f9714dbad1aaba734b5ec04593374fa6638df61592055868f8b8", + "sha256:619935a44f414274a2c08c9e74611965650b730eb4efe4b2270f91df5e4adf9a", + "sha256:655b21ffd37a96b1e78cc48bf254f5ea4b5b85efaf9e9e2a526b3c9309d660ca", + "sha256:665b21e95bc0fce5cab03b2e1d90ba9c66c510f1bb5fdc864f3a377d0f553f6b", + "sha256:6a4bf607f690f7987ab3291406e012cd8591a4f77aa54f29b890f9c331e84989", + "sha256:6cea1cca3be76c9483282dc7760ea1cc08a6ecec1f0b6ca0a94ea0d17432da19", + "sha256:713d450cf8e61854de9420fb7eea8ad228df4e27e7d4ed465de98c955d2b3fa6", + "sha256:726377bd60081172685c0ff46afbc600d064f01053190e4450857483c4d44484", + "sha256:76b3e3976d2a452cba7aa9e453498ac72240d43030fdc6d538a72b87eaff52fd", + "sha256:76dc19e660baea5c38e949455c1181bc018893f25372d10ffe24b3ed7341fb25", + "sha256:76e5064fd8e94c3f74d9fd69b02d99e3cdb8fc286ed49a1f10b256e59d0d3a0b", + "sha256:7f346d24d74c00b6730440f5eb8ec3fe5774ca8d1c9574e8e57c8671bb51b910", + "sha256:81eeec4403a7d7684b5812a8aaa626fa23b7d0848edb3a28d2eb3220daddcbd0", + "sha256:90b5bbf05fe3d3ef697103850c2ce3374558f6fe40fd57c9fac1bf14903f50a5", + "sha256:9730929375021ec90f6447bff4f7f5508faef1c02f399a1953870cdb78e0c345", + "sha256:9eb4a1d7399b9f3c7ac68ae6baa6be5f9195d1d08c9ddc45ad559aa6b556bce6", + "sha256:a0409bc18a9f85321399c29baf93545152d74a49d92f2f55302f122007cfda00", + "sha256:a22f4e26400f7f48faef2d69c20dc055a1f3043d330923f9abe08ea0aecc44df", + "sha256:a53dfe8f82b715319e9953330fa5c8708b610d48b5c59f1316337302af5c0811", + "sha256:a771dc64fa44ebe58d65768d869fcfb9060169d203446c1d446e844b62bdfdca", + "sha256:a814dc3100e8a046ff48faeaa909e80cdb358411a3d6dd5293158425c684eda8", + "sha256:a8870983af660798dc1b529e1fd6f1cefd94e45135a32e58bd70edd694540f33", + "sha256:ac0adfdb3a21dc2a24ed728b61e72440d297d0fd3a577389df566651fcd08f97", + "sha256:b395121e9bbe8d02a750886f108d540abe66075e61e22f7353d9acb0b81be0f0", + "sha256:b9505a0c8579899057cbefd4ec34d865ab99852baf1ff33a9481eb3924e2da0b", + "sha256:c0a5b1c22c82831f56f2f7ad9bbe4948879762fe0d59833a4a71f16e5fa0f682", + "sha256:c3967dcc1cd2ea61b08b0b276659242cbce5caca39e7cbc02408222fb9e6ff39", + "sha256:c6f4c2027689093775fd58ca2388d58789009116844432d920e9147f91acbe64", + "sha256:c9d86401550b09a55410f32ceb5fe7efcd998bd2dad9e82521713cb148a4a15f", + "sha256:cd468ec62257bb4544989402b19d795d2305eccb06cde5da0eb739b63dc04665", + "sha256:cfcfb73aed40f550a57ea904629bdaf2e562c68fa1164fa4588e752af6efdc3f", + "sha256:d0dd943282231480aad5f50f89bdf26690c995e8ff555f26d8a5b9887b559bcc", + "sha256:d3c59a06c2c28a81a026ff11fbf012081ea34fb9b7052f2ed0366e14896f0a1d", + "sha256:d45b75b0f3fd8d99f62eb7908cfa6d727b7ed190737dec7fe46d993da550b81a", + "sha256:d46d5069e2eeda111d6f71970e341f4bd9aeeee92074e649ae263b834286ecc0", + "sha256:d58ec349e0c2c0bc6669bf2cd4982d2f93bf067860d23a0ea1fe677b0f0b1e09", + "sha256:db1b3ccb93488328c74e97ff888604a8b95ae4f35f4f56677ca57a4fc3a4220b", + "sha256:dd65695a8df1233309b701dec2539cc4b11e97d4fcc0f4185b4a12ce54db0491", + "sha256:f9482c2ed414781c0af0b35d9d575226da6b728bd1a720668fa05837184965b7", + "sha256:f9671e7282d8c6fcabc32c0fb8d7c0ea8894ae85cee89c9aadc2d7129e1a9954", + "sha256:fad7a051e07f64e297e6e8399b4d6a3bdcad3d7297409e9a06ef8cbccff4f501", + "sha256:ffb08f2a1e59d38c7b8b9ac8083c9c8b9875f0955b1e9b9b9a965607a51f8e54" ], "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==3.0.3" + "version": "==3.1.0" }, "gunicorn": { "hashes": [ - "sha256:350679f91b24062c86e386e198a15438d53a7a8207235a78ba1b53df4c4378d9", - "sha256:4a0b436239ff76fb33f11c07a16482c521a7e09c1ce3cc293c2330afe01bec63" + "sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d", + "sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec" ], "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==22.0.0" + "version": "==23.0.0" }, "idna": { "hashes": [ - "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", - "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0" + "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac", + "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603" ], - "markers": "python_version >= '3.5'", - "version": "==3.7" + "markers": "python_version >= '3.6'", + "version": "==3.8" }, "itsdangerous": { "hashes": [ @@ -787,11 +823,12 @@ }, "minio": { "hashes": [ - "sha256:473d5d53d79f340f3cd632054d0c82d2f93177ce1af2eac34a235bea55708d98", - "sha256:59d1f255d852fe7104018db75b3bebbd987e538690e680f7c5de835e422de837" + "sha256:aa3b485788b63b12406a5798465d12a57e4be2ac2a58a8380959b6b748e64ddd", + "sha256:f8af2dafc22ebe1aef3ac181b8e217037011c430aa6da276ed627e55aaf7c815" ], "index": "pypi", - "version": "==7.2.7" + "markers": "python_version >= '3.9'", + "version": "==7.2.8" }, "mistune": { "hashes": [ @@ -803,160 +840,170 @@ }, "multidict": { "hashes": [ - "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556", - "sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c", - "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29", - "sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b", - "sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8", - "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7", - "sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd", - "sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40", - "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6", - "sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3", - "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c", - "sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9", - "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5", - "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae", - "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442", - "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9", - "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc", - "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c", - "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea", - "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5", - "sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50", - "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182", - "sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453", - "sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e", - "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600", - "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733", - "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda", - "sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241", - "sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461", - "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e", - "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e", - "sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b", - "sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e", - "sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7", - "sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386", - "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd", - "sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9", - "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf", - "sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee", - "sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5", - "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a", - "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271", - "sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54", - "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4", - "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496", - "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb", - "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319", - "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3", - "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f", - "sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527", - "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed", - "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604", - "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef", - "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8", - "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5", - "sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5", - "sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626", - "sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c", - "sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d", - "sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c", - "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc", - "sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc", - "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b", - "sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38", - "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450", - "sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1", - "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f", - "sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3", - "sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755", - "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226", - "sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a", - "sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046", - "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf", - "sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479", - "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e", - "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1", - "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a", - "sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83", - "sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929", - "sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93", - "sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a", - "sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c", - "sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44", - "sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89", - "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba", - "sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e", - "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da", - "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24", - "sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423", - "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef" + "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f", + "sha256:06809f4f0f7ab7ea2cabf9caca7d79c22c0758b58a71f9d32943ae13c7ace056", + "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761", + "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3", + "sha256:0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b", + "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6", + "sha256:10524ebd769727ac77ef2278390fb0068d83f3acb7773792a5080f2b0abf7748", + "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966", + "sha256:16e5f4bf4e603eb1fdd5d8180f1a25f30056f22e55ce51fb3d6ad4ab29f7d96f", + "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1", + "sha256:189f652a87e876098bbc67b4da1049afb5f5dfbaa310dd67c594b01c10388db6", + "sha256:1ca0083e80e791cffc6efce7660ad24af66c8d4079d2a750b29001b53ff59ada", + "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305", + "sha256:2090f6a85cafc5b2db085124d752757c9d251548cedabe9bd31afe6363e0aff2", + "sha256:20b9b5fbe0b88d0bdef2012ef7dee867f874b72528cf1d08f1d59b0e3850129d", + "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a", + "sha256:22f3105d4fb15c8f57ff3959a58fcab6ce36814486500cd7485651230ad4d4ef", + "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c", + "sha256:27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb", + "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60", + "sha256:3702ea6872c5a2a4eeefa6ffd36b042e9773f05b1f37ae3ef7264b1163c2dcf6", + "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4", + "sha256:3914f5aaa0f36d5d60e8ece6a308ee1c9784cd75ec8151062614657a114c4478", + "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81", + "sha256:3c8b88a2ccf5493b6c8da9076fb151ba106960a2df90c2633f342f120751a9e7", + "sha256:3e97b5e938051226dc025ec80980c285b053ffb1e25a3db2a3aa3bc046bf7f56", + "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3", + "sha256:3efe2c2cb5763f2f1b275ad2bf7a287d3f7ebbef35648a9726e3b69284a4f3d6", + "sha256:483a6aea59cb89904e1ceabd2b47368b5600fb7de78a6e4a2c2987b2d256cf30", + "sha256:4867cafcbc6585e4b678876c489b9273b13e9fff9f6d6d66add5e15d11d926cb", + "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506", + "sha256:4a9cb68166a34117d6646c0023c7b759bf197bee5ad4272f420a0141d7eb03a0", + "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925", + "sha256:4e18b656c5e844539d506a0a06432274d7bd52a7487e6828c63a63d69185626c", + "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6", + "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e", + "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95", + "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2", + "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133", + "sha256:5845c1fd4866bb5dd3125d89b90e57ed3138241540897de748cdf19de8a2fca2", + "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa", + "sha256:5b48204e8d955c47c55b72779802b219a39acc3ee3d0116d5080c388970b76e3", + "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3", + "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436", + "sha256:682b987361e5fd7a139ed565e30d81fd81e9629acc7d925a205366877d8c8657", + "sha256:6b5d83030255983181005e6cfbac1617ce9746b219bc2aad52201ad121226581", + "sha256:6bb5992037f7a9eff7991ebe4273ea7f51f1c1c511e6a2ce511d0e7bdb754492", + "sha256:73eae06aa53af2ea5270cc066dcaf02cc60d2994bbb2c4ef5764949257d10f43", + "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2", + "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2", + "sha256:82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926", + "sha256:87701f25a2352e5bf7454caa64757642734da9f6b11384c1f9d1a8e699758057", + "sha256:9079dfc6a70abe341f521f78405b8949f96db48da98aeb43f9907f342f627cdc", + "sha256:90f8717cb649eea3504091e640a1b8568faad18bd4b9fcd692853a04475a4b80", + "sha256:957cf8e4b6e123a9eea554fa7ebc85674674b713551de587eb318a2df3e00255", + "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1", + "sha256:9f636b730f7e8cb19feb87094949ba54ee5357440b9658b2a32a5ce4bce53972", + "sha256:a114d03b938376557927ab23f1e950827c3b893ccb94b62fd95d430fd0e5cf53", + "sha256:a185f876e69897a6f3325c3f19f26a297fa058c5e456bfcff8015e9a27e83ae1", + "sha256:a7a9541cd308eed5e30318430a9c74d2132e9a8cb46b901326272d780bf2d423", + "sha256:aa466da5b15ccea564bdab9c89175c762bc12825f4659c11227f515cee76fa4a", + "sha256:aaed8b0562be4a0876ee3b6946f6869b7bcdb571a5d1496683505944e268b160", + "sha256:ab7c4ceb38d91570a650dba194e1ca87c2b543488fe9309b4212694174fd539c", + "sha256:ac10f4c2b9e770c4e393876e35a7046879d195cd123b4f116d299d442b335bcd", + "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa", + "sha256:b1c416351ee6271b2f49b56ad7f308072f6f44b37118d69c2cad94f3fa8a40d5", + "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b", + "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa", + "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef", + "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44", + "sha256:c08be4f460903e5a9d0f76818db3250f12e9c344e79314d1d570fc69d7f4eae4", + "sha256:c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156", + "sha256:c943a53e9186688b45b323602298ab727d8865d8c9ee0b17f8d62d14b56f0753", + "sha256:ce2186a7df133a9c895dea3331ddc5ddad42cdd0d1ea2f0a51e5d161e4762f28", + "sha256:d093be959277cb7dee84b801eb1af388b6ad3ca6a6b6bf1ed7585895789d027d", + "sha256:d094ddec350a2fb899fec68d8353c78233debde9b7d8b4beeafa70825f1c281a", + "sha256:d1a9dd711d0877a1ece3d2e4fea11a8e75741ca21954c919406b44e7cf971304", + "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008", + "sha256:d618649d4e70ac6efcbba75be98b26ef5078faad23592f9b51ca492953012429", + "sha256:d83a047959d38a7ff552ff94be767b7fd79b831ad1cd9920662db05fec24fe72", + "sha256:d8fff389528cad1618fb4b26b95550327495462cd745d879a8c7c2115248e399", + "sha256:da1758c76f50c39a2efd5e9859ce7d776317eb1dd34317c8152ac9251fc574a3", + "sha256:db7457bac39421addd0c8449933ac32d8042aae84a14911a757ae6ca3eef1392", + "sha256:e27bbb6d14416713a8bd7aaa1313c0fc8d44ee48d74497a0ff4c3a1b6ccb5167", + "sha256:e617fb6b0b6953fffd762669610c1c4ffd05632c138d61ac7e14ad187870669c", + "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774", + "sha256:ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351", + "sha256:f179dee3b863ab1c59580ff60f9d99f632f34ccb38bf67a33ec6b3ecadd0fd76", + "sha256:f4c035da3f544b1882bac24115f3e2e8760f10a0107614fc9839fd232200b875", + "sha256:f67f217af4b1ff66c68a87318012de788dd95fcfeb24cc889011f4e1c7454dfd", + "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28", + "sha256:ff3827aef427c89a25cc96ded1759271a93603aba9fb977a6d264648ebf989db" ], - "markers": "python_version >= '3.7'", - "version": "==6.0.5" + "markers": "python_version >= '3.8'", + "version": "==6.1.0" }, "numpy": { "hashes": [ - "sha256:08458fbf403bff5e2b45f08eda195d4b0c9b35682311da5a5a0a0925b11b9bd8", - "sha256:0fbb536eac80e27a2793ffd787895242b7f18ef792563d742c2d673bfcb75134", - "sha256:12f5d865d60fb9734e60a60f1d5afa6d962d8d4467c120a1c0cda6eb2964437d", - "sha256:15eb4eca47d36ec3f78cde0a3a2ee24cf05ca7396ef808dda2c0ddad7c2bde67", - "sha256:173a00b9995f73b79eb0191129f2455f1e34c203f559dd118636858cc452a1bf", - "sha256:1b902ce0e0a5bb7704556a217c4f63a7974f8f43e090aff03fcf262e0b135e02", - "sha256:1f682ea61a88479d9498bf2091fdcd722b090724b08b31d63e022adc063bad59", - "sha256:1f87fec1f9bc1efd23f4227becff04bd0e979e23ca50cc92ec88b38489db3b55", - "sha256:24a0e1befbfa14615b49ba9659d3d8818a0f4d8a1c5822af8696706fbda7310c", - "sha256:2c3a346ae20cfd80b6cfd3e60dc179963ef2ea58da5ec074fd3d9e7a1e7ba97f", - "sha256:36d3a9405fd7c511804dc56fc32974fa5533bdeb3cd1604d6b8ff1d292b819c4", - "sha256:3fdabe3e2a52bc4eff8dc7a5044342f8bd9f11ef0934fcd3289a788c0eb10018", - "sha256:4127d4303b9ac9f94ca0441138acead39928938660ca58329fe156f84b9f3015", - "sha256:4658c398d65d1b25e1760de3157011a80375da861709abd7cef3bad65d6543f9", - "sha256:485b87235796410c3519a699cfe1faab097e509e90ebb05dcd098db2ae87e7b3", - "sha256:529af13c5f4b7a932fb0e1911d3a75da204eff023ee5e0e79c1751564221a5c8", - "sha256:5a3d94942c331dd4e0e1147f7a8699a4aa47dffc11bf8a1523c12af8b2e91bbe", - "sha256:5daab361be6ddeb299a918a7c0864fa8618af66019138263247af405018b04e1", - "sha256:61728fba1e464f789b11deb78a57805c70b2ed02343560456190d0501ba37b0f", - "sha256:6790654cb13eab303d8402354fabd47472b24635700f631f041bd0b65e37298a", - "sha256:69ff563d43c69b1baba77af455dd0a839df8d25e8590e79c90fcbe1499ebde42", - "sha256:6bf4e6f4a2a2e26655717a1983ef6324f2664d7011f6ef7482e8c0b3d51e82ac", - "sha256:6e4eeb6eb2fced786e32e6d8df9e755ce5be920d17f7ce00bc38fcde8ccdbf9e", - "sha256:72dc22e9ec8f6eaa206deb1b1355eb2e253899d7347f5e2fae5f0af613741d06", - "sha256:75b4e316c5902d8163ef9d423b1c3f2f6252226d1aa5cd8a0a03a7d01ffc6268", - "sha256:7b9853803278db3bdcc6cd5beca37815b133e9e77ff3d4733c247414e78eb8d1", - "sha256:7d6fddc5fe258d3328cd8e3d7d3e02234c5d70e01ebe377a6ab92adb14039cb4", - "sha256:81b0893a39bc5b865b8bf89e9ad7807e16717f19868e9d234bdaf9b1f1393868", - "sha256:8efc84f01c1cd7e34b3fb310183e72fcdf55293ee736d679b6d35b35d80bba26", - "sha256:8fae4ebbf95a179c1156fab0b142b74e4ba4204c87bde8d3d8b6f9c34c5825ef", - "sha256:99d0d92a5e3613c33a5f01db206a33f8fdf3d71f2912b0de1739894668b7a93b", - "sha256:9adbd9bb520c866e1bfd7e10e1880a1f7749f1f6e5017686a5fbb9b72cf69f82", - "sha256:a1e01dcaab205fbece13c1410253a9eea1b1c9b61d237b6fa59bcc46e8e89343", - "sha256:a8fc2de81ad835d999113ddf87d1ea2b0f4704cbd947c948d2f5513deafe5a7b", - "sha256:b83e16a5511d1b1f8a88cbabb1a6f6a499f82c062a4251892d9ad5d609863fb7", - "sha256:bb2124fdc6e62baae159ebcfa368708867eb56806804d005860b6007388df171", - "sha256:bfc085b28d62ff4009364e7ca34b80a9a080cbd97c2c0630bb5f7f770dae9414", - "sha256:cbab9fc9c391700e3e1287666dfd82d8666d10e69a6c4a09ab97574c0b7ee0a7", - "sha256:e5eeca8067ad04bc8a2a8731183d51d7cbaac66d86085d5f4766ee6bf19c7f87", - "sha256:e9e81fa9017eaa416c056e5d9e71be93d05e2c3c2ab308d23307a8bc4443c368", - "sha256:ea2326a4dca88e4a274ba3a4405eb6c6467d3ffbd8c7d38632502eaae3820587", - "sha256:eacf3291e263d5a67d8c1a581a8ebbcfd6447204ef58828caf69a5e3e8c75990", - "sha256:ec87f5f8aca726117a1c9b7083e7656a9d0d606eec7299cc067bb83d26f16e0c", - "sha256:f1659887361a7151f89e79b276ed8dff3d75877df906328f14d8bb40bb4f5101", - "sha256:f9cf5ea551aec449206954b075db819f52adc1638d46a6738253a712d553c7b4" + "sha256:046356b19d7ad1890c751b99acad5e82dc4a02232013bd9a9a712fddf8eb60f5", + "sha256:0b8cc2715a84b7c3b161f9ebbd942740aaed913584cae9cdc7f8ad5ad41943d0", + "sha256:0d07841fd284718feffe7dd17a63a2e6c78679b2d386d3e82f44f0108c905550", + "sha256:13cc11c00000848702322af4de0147ced365c81d66053a67c2e962a485b3717c", + "sha256:13ce49a34c44b6de5241f0b38b07e44c1b2dcacd9e36c30f9c2fcb1bb5135db7", + "sha256:24c2ad697bd8593887b019817ddd9974a7f429c14a5469d7fad413f28340a6d2", + "sha256:251105b7c42abe40e3a689881e1793370cc9724ad50d64b30b358bbb3a97553b", + "sha256:2ca4b53e1e0b279142113b8c5eb7d7a877e967c306edc34f3b58e9be12fda8df", + "sha256:3269c9eb8745e8d975980b3a7411a98976824e1fdef11f0aacf76147f662b15f", + "sha256:397bc5ce62d3fb73f304bec332171535c187e0643e176a6e9421a6e3eacef06d", + "sha256:3fc5eabfc720db95d68e6646e88f8b399bfedd235994016351b1d9e062c4b270", + "sha256:50a95ca3560a6058d6ea91d4629a83a897ee27c00630aed9d933dff191f170cd", + "sha256:52ac2e48f5ad847cd43c4755520a2317f3380213493b9d8a4c5e37f3b87df504", + "sha256:53e27293b3a2b661c03f79aa51c3987492bd4641ef933e366e0f9f6c9bf257ec", + "sha256:57eb525e7c2a8fdee02d731f647146ff54ea8c973364f3b850069ffb42799647", + "sha256:5889dd24f03ca5a5b1e8a90a33b5a0846d8977565e4ae003a63d22ecddf6782f", + "sha256:59ca673ad11d4b84ceb385290ed0ebe60266e356641428c845b39cd9df6713ab", + "sha256:6435c48250c12f001920f0751fe50c0348f5f240852cfddc5e2f97e007544cbe", + "sha256:6e5a9cb2be39350ae6c8f79410744e80154df658d5bea06e06e0ac5bb75480d5", + "sha256:7be6a07520b88214ea85d8ac8b7d6d8a1839b0b5cb87412ac9f49fa934eb15d5", + "sha256:7c803b7934a7f59563db459292e6aa078bb38b7ab1446ca38dd138646a38203e", + "sha256:7dd86dfaf7c900c0bbdcb8b16e2f6ddf1eb1fe39c6c8cca6e94844ed3152a8fd", + "sha256:8661c94e3aad18e1ea17a11f60f843a4933ccaf1a25a7c6a9182af70610b2313", + "sha256:8ae0fd135e0b157365ac7cc31fff27f07a5572bdfc38f9c2d43b2aff416cc8b0", + "sha256:910b47a6d0635ec1bd53b88f86120a52bf56dcc27b51f18c7b4a2e2224c29f0f", + "sha256:913cc1d311060b1d409e609947fa1b9753701dac96e6581b58afc36b7ee35af6", + "sha256:920b0911bb2e4414c50e55bd658baeb78281a47feeb064ab40c2b66ecba85553", + "sha256:950802d17a33c07cba7fd7c3dcfa7d64705509206be1606f196d179e539111ed", + "sha256:981707f6b31b59c0c24bcda52e5605f9701cb46da4b86c2e8023656ad3e833cb", + "sha256:98ce7fb5b8063cfdd86596b9c762bf2b5e35a2cdd7e967494ab78a1fa7f8b86e", + "sha256:99f4a9ee60eed1385a86e82288971a51e71df052ed0b2900ed30bc840c0f2e39", + "sha256:9a8e06c7a980869ea67bbf551283bbed2856915f0a792dc32dd0f9dd2fb56728", + "sha256:ae8ce252404cdd4de56dcfce8b11eac3c594a9c16c231d081fb705cf23bd4d9e", + "sha256:afd9c680df4de71cd58582b51e88a61feed4abcc7530bcd3d48483f20fc76f2a", + "sha256:b49742cdb85f1f81e4dc1b39dcf328244f4d8d1ded95dea725b316bd2cf18c95", + "sha256:b5613cfeb1adfe791e8e681128f5f49f22f3fcaa942255a6124d58ca59d9528f", + "sha256:bab7c09454460a487e631ffc0c42057e3d8f2a9ddccd1e60c7bb8ed774992480", + "sha256:c8a0e34993b510fc19b9a2ce7f31cb8e94ecf6e924a40c0c9dd4f62d0aac47d9", + "sha256:caf5d284ddea7462c32b8d4a6b8af030b6c9fd5332afb70e7414d7fdded4bfd0", + "sha256:cea427d1350f3fd0d2818ce7350095c1a2ee33e30961d2f0fef48576ddbbe90f", + "sha256:d0cf7d55b1051387807405b3898efafa862997b4cba8aa5dbe657be794afeafd", + "sha256:d10c39947a2d351d6d466b4ae83dad4c37cd6c3cdd6d5d0fa797da56f710a6ae", + "sha256:d2b9cd92c8f8e7b313b80e93cedc12c0112088541dcedd9197b5dee3738c1201", + "sha256:d4c57b68c8ef5e1ebf47238e99bf27657511ec3f071c465f6b1bccbef12d4136", + "sha256:d51fc141ddbe3f919e91a096ec739f49d686df8af254b2053ba21a910ae518bf", + "sha256:e097507396c0be4e547ff15b13dc3866f45f3680f789c1a1301b07dadd3fbc78", + "sha256:e30356d530528a42eeba51420ae8bf6c6c09559051887196599d96ee5f536468", + "sha256:e8d5f8a8e3bc87334f025194c6193e408903d21ebaeb10952264943a985066ca", + "sha256:e8dfa9e94fc127c40979c3eacbae1e61fda4fe71d84869cc129e2721973231ef", + "sha256:f212d4f46b67ff604d11fff7cc62d36b3e8714edf68e44e9760e19be38c03eb0", + "sha256:f7506387e191fe8cdb267f912469a3cccc538ab108471291636a96a54e599556", + "sha256:fac6e277a41163d27dfab5f4ec1f7a83fac94e170665a4a50191b545721c6521", + "sha256:fcd8f556cdc8cfe35e70efb92463082b7f43dd7e547eb071ffc36abc0ca4699b" ], "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==2.0.1" + "markers": "python_version >= '3.10'", + "version": "==2.1.1" }, "opensearch-py": { "hashes": [ - "sha256:0b7c27e8ed84c03c99558406927b6161f186a72502ca6d0325413d8e5523ba96", - "sha256:b6e78b685dd4e9c016d7a4299cf1de69e299c88322e3f81c716e6e23fe5683c1" + "sha256:5417650eba98a1c7648e502207cebf3a12beab623ffe0ebbf55f9b1b4b6e44e9", + "sha256:67ab76e9373669bc71da417096df59827c08369ac3795d5438c9a8be21cbd759" ], "index": "pypi", "markers": "python_version >= '3.8' and python_version < '4'", - "version": "==2.6.0" + "version": "==2.7.1" }, "packaging": { "hashes": [ @@ -1074,115 +1121,115 @@ }, "pydantic": { "hashes": [ - "sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a", - "sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8" + "sha256:1363c7d975c7036df0db2b4a61f2e062fbc0aa5ab5f2772e0ffc7191a4f4bce2", + "sha256:7aff4db5fdf3cf573d4b3c30926a510a10e19a0774d38fc4967f78beb6deb612" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==2.8.2" + "version": "==2.9.1" }, "pydantic-core": { "hashes": [ - "sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d", - "sha256:04024d270cf63f586ad41fff13fde4311c4fc13ea74676962c876d9577bcc78f", - "sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686", - "sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482", - "sha256:10d4204d8ca33146e761c79f83cc861df20e7ae9f6487ca290a97702daf56006", - "sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83", - "sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6", - "sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88", - "sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86", - "sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a", - "sha256:1eedfeb6089ed3fad42e81a67755846ad4dcc14d73698c120a82e4ccf0f1f9f6", - "sha256:225b67a1f6d602de0ce7f6c1c3ae89a4aa25d3de9be857999e9124f15dab486a", - "sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6", - "sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6", - "sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43", - "sha256:26ab812fa0c845df815e506be30337e2df27e88399b985d0bb4e3ecfe72df31c", - "sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4", - "sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e", - "sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203", - "sha256:2aafc5a503855ea5885559eae883978c9b6d8c8993d67766ee73d82e841300dd", - "sha256:2d036c7187b9422ae5b262badb87a20a49eb6c5238b2004e96d4da1231badef1", - "sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24", - "sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc", - "sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc", - "sha256:3acae97ffd19bf091c72df4d726d552c473f3576409b2a7ca36b2f535ffff4a3", - "sha256:3c5ebac750d9d5f2706654c638c041635c385596caf68f81342011ddfa1e5598", - "sha256:3d482efec8b7dc6bfaedc0f166b2ce349df0011f5d2f1f25537ced4cfc34fd98", - "sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331", - "sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2", - "sha256:41e81317dd6a0127cabce83c0c9c3fbecceae981c8391e6f1dec88a77c8a569a", - "sha256:41f4c96227a67a013e7de5ff8f20fb496ce573893b7f4f2707d065907bffdbd6", - "sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688", - "sha256:4745f4ac52cc6686390c40eaa01d48b18997cb130833154801a442323cc78f91", - "sha256:4868f6bd7c9d98904b748a2653031fc9c2f85b6237009d475b1008bfaeb0a5aa", - "sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b", - "sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0", - "sha256:4f2790949cf385d985a31984907fecb3896999329103df4e4983a4a41e13e840", - "sha256:512ecfbefef6dac7bc5eaaf46177b2de58cdf7acac8793fe033b24ece0b9566c", - "sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd", - "sha256:53e431da3fc53360db73eedf6f7124d1076e1b4ee4276b36fb25514544ceb4a3", - "sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231", - "sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1", - "sha256:5d41e6daee2813ecceea8eda38062d69e280b39df793f5a942fa515b8ed67953", - "sha256:5e999ba8dd90e93d57410c5e67ebb67ffcaadcea0ad973240fdfd3a135506250", - "sha256:5f239eb799a2081495ea659d8d4a43a8f42cd1fe9ff2e7e436295c38a10c286a", - "sha256:635fee4e041ab9c479e31edda27fcf966ea9614fff1317e280d99eb3e5ab6fe2", - "sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20", - "sha256:6b507132dcfc0dea440cce23ee2182c0ce7aba7054576efc65634f080dbe9434", - "sha256:6b9d9bb600328a1ce523ab4f454859e9d439150abb0906c5a1983c146580ebab", - "sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703", - "sha256:77bf3ac639c1ff567ae3b47f8d4cc3dc20f9966a2a6dd2311dcc055d3d04fb8a", - "sha256:784c1214cb6dd1e3b15dd8b91b9a53852aed16671cc3fbe4786f4f1db07089e2", - "sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac", - "sha256:7ed1b0132f24beeec5a78b67d9388656d03e6a7c837394f99257e2d55b461611", - "sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121", - "sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e", - "sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b", - "sha256:9ebfef07dbe1d93efb94b4700f2d278494e9162565a54f124c404a5656d7ff09", - "sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906", - "sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9", - "sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7", - "sha256:a8ad4c766d3f33ba8fd692f9aa297c9058970530a32c728a2c4bfd2616d3358b", - "sha256:aa2f457b4af386254372dfa78a2eda2563680d982422641a85f271c859df1987", - "sha256:b03f7941783b4c4a26051846dea594628b38f6940a2fdc0df00b221aed39314c", - "sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b", - "sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e", - "sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237", - "sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1", - "sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19", - "sha256:c6514f963b023aeee506678a1cf821fe31159b925c4b76fe2afa94cc70b3222b", - "sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad", - "sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0", - "sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94", - "sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312", - "sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f", - "sha256:d2fe69c5434391727efa54b47a1e7986bb0186e72a41b203df8f5b0a19a4f669", - "sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1", - "sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe", - "sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99", - "sha256:e7c4ea22b6739b162c9ecaaa41d718dfad48a244909fe7ef4b54c0b530effc5a", - "sha256:e93e1a4b4b33daed65d781a57a522ff153dcf748dee70b40c7258c5861e1768a", - "sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52", - "sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c", - "sha256:eaad4ff2de1c3823fddf82f41121bdf453d922e9a238642b1dedb33c4e4f98ad", - "sha256:f1f62b2413c3a0e846c3b838b2ecd6c7a19ec6793b2a522745b0869e37ab5bc1", - "sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a", - "sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f", - "sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a", - "sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27" + "sha256:01491d8b4d8db9f3391d93b0df60701e644ff0894352947f31fff3e52bd5c801", + "sha256:03667cec5daf43ac4995cefa8aaf58f99de036204a37b889c24a80927b629cec", + "sha256:03795b9e8a5d7fda05f3873efc3f59105e2dcff14231680296b87b80bb327295", + "sha256:047531242f8e9c2db733599f1c612925de095e93c9cc0e599e96cf536aaf56ba", + "sha256:04b07490bc2f6f2717b10c3969e1b830f5720b632f8ae2f3b8b1542394c47a8e", + "sha256:09e926397f392059ce0afdcac920df29d9c833256354d0c55f1584b0b70cf07e", + "sha256:0a0137ddf462575d9bce863c4c95bac3493ba8e22f8c28ca94634b4a1d3e2bb4", + "sha256:0dda0290a6f608504882d9f7650975b4651ff91c85673341789a476b1159f211", + "sha256:13dd45ba2561603681a2676ca56006d6dee94493f03d5cadc055d2055615c3ea", + "sha256:1c3980f2843de5184656aab58698011b42763ccba11c4a8c35936c8dd6c7068c", + "sha256:1eba2f7ce3e30ee2170410e2171867ea73dbd692433b81a93758ab2de6c64835", + "sha256:203171e48946c3164fe7691fc349c79241ff8f28306abd4cad5f4f75ed80bc8d", + "sha256:255ec6dcb899c115f1e2a64bc9ebc24cc0e3ab097775755244f77360d1f3c06c", + "sha256:2718443bc671c7ac331de4eef9b673063b10af32a0bb385019ad61dcf2cc8f6c", + "sha256:2b2b55b0448e9da68f56b696f313949cda1039e8ec7b5d294285335b53104b61", + "sha256:2b603cde285322758a0279995b5796d64b63060bfbe214b50a3ca23b5cee3e83", + "sha256:2b676583fc459c64146debea14ba3af54e540b61762dfc0613dc4e98c3f66eeb", + "sha256:37ba321ac2a46100c578a92e9a6aa33afe9ec99ffa084424291d84e456f490c1", + "sha256:3c09a7885dd33ee8c65266e5aa7fb7e2f23d49d8043f089989726391dd7350c5", + "sha256:3cb0f65d8b4121c1b015c60104a685feb929a29d7cf204387c7f2688c7974690", + "sha256:40b8441be16c1e940abebed83cd006ddb9e3737a279e339dbd6d31578b802f7b", + "sha256:40d9bd259538dba2f40963286009bf7caf18b5112b19d2b55b09c14dde6db6a7", + "sha256:4b259fd8409ab84b4041b7b3f24dcc41e4696f180b775961ca8142b5b21d0e70", + "sha256:4f62c1c953d7ee375df5eb2e44ad50ce2f5aff931723b398b8bc6f0ac159791a", + "sha256:50e4661f3337977740fdbfbae084ae5693e505ca2b3130a6d4eb0f2281dc43b8", + "sha256:510b7fb0a86dc8f10a8bb43bd2f97beb63cffad1203071dc434dac26453955cd", + "sha256:5499798317fff7f25dbef9347f4451b91ac2a4330c6669821c8202fd354c7bee", + "sha256:560e32f0df04ac69b3dd818f71339983f6d1f70eb99d4d1f8e9705fb6c34a5c1", + "sha256:59d52cf01854cb26c46958552a21acb10dd78a52aa34c86f284e66b209db8cab", + "sha256:5a8cd3074a98ee70173a8633ad3c10e00dcb991ecec57263aacb4095c5efb958", + "sha256:5b01a078dd4f9a52494370af21aa52964e0a96d4862ac64ff7cea06e0f12d2c5", + "sha256:6470b5a1ec4d1c2e9afe928c6cb37eb33381cab99292a708b8cb9aa89e62429b", + "sha256:65b6e5da855e9c55a0c67f4db8a492bf13d8d3316a59999cfbaf98cc6e401961", + "sha256:67a5def279309f2e23014b608c4150b0c2d323bd7bccd27ff07b001c12c2415c", + "sha256:68f4cf373f0de6abfe599a38307f4417c1c867ca381c03df27c873a9069cda25", + "sha256:6b5547d098c76e1694ba85f05b595720d7c60d342f24d5aad32c3049131fa5c4", + "sha256:6cb968da9a0746a0cf521b2b5ef25fc5a0bee9b9a1a8214e0a1cfaea5be7e8a4", + "sha256:6daaf5b1ba1369a22c8b050b643250e3e5efc6a78366d323294aee54953a4d5f", + "sha256:7200fd561fb3be06827340da066df4311d0b6b8eb0c2116a110be5245dceb326", + "sha256:748bdf985014c6dd3e1e4cc3db90f1c3ecc7246ff5a3cd4ddab20c768b2f1dab", + "sha256:76bdab0de4acb3f119c2a4bff740e0c7dc2e6de7692774620f7452ce11ca76c8", + "sha256:7e6f33503c5495059148cc486867e1d24ca35df5fc064686e631e314d959ad5b", + "sha256:7f10a5d1b9281392f1bf507d16ac720e78285dfd635b05737c3911637601bae6", + "sha256:82da2f4703894134a9f000e24965df73cc103e31e8c31906cc1ee89fde72cbd8", + "sha256:86fc6c762ca7ac8fbbdff80d61b2c59fb6b7d144aa46e2d54d9e1b7b0e780e01", + "sha256:87cfa0ed6b8c5bd6ae8b66de941cece179281239d482f363814d2b986b79cedc", + "sha256:89b731f25c80830c76fdb13705c68fef6a2b6dc494402987c7ea9584fe189f5d", + "sha256:8b2682038e255e94baf2c473dca914a7460069171ff5cdd4080be18ab8a7fd6e", + "sha256:8b5b3ed73abb147704a6e9f556d8c5cb078f8c095be4588e669d315e0d11893b", + "sha256:8e22b477bf90db71c156f89a55bfe4d25177b81fce4aa09294d9e805eec13855", + "sha256:9172d2088e27d9a185ea0a6c8cebe227a9139fd90295221d7d495944d2367700", + "sha256:94f85614f2cba13f62c3c6481716e4adeae48e1eaa7e8bac379b9d177d93947a", + "sha256:98ccd69edcf49f0875d86942f4418a4e83eb3047f20eb897bffa62a5d419c8fa", + "sha256:a0d90e08b2727c5d01af1b5ef4121d2f0c99fbee692c762f4d9d0409c9da6541", + "sha256:a3fc572d9b5b5cfe13f8e8a6e26271d5d13f80173724b738557a8c7f3a8a3791", + "sha256:a678c1ac5c5ec5685af0133262103defb427114e62eafeda12f1357a12140162", + "sha256:a7f7f72f721223f33d3dc98a791666ebc6a91fa023ce63733709f4894a7dc611", + "sha256:bb68b41c3fa64587412b104294b9cbb027509dc2f6958446c502638d481525ef", + "sha256:bbb5e45eab7624440516ee3722a3044b83fff4c0372efe183fd6ba678ff681fe", + "sha256:c24574c7e92e2c56379706b9a3f07c1e0c7f2f87a41b6ee86653100c4ce343e5", + "sha256:c483dab0f14b8d3f0df0c6c18d70b21b086f74c87ab03c59250dbf6d3c89baba", + "sha256:c6de1ec30c4bb94f3a69c9f5f2182baeda5b809f806676675e9ef6b8dc936f28", + "sha256:c744fa100fdea0d000d8bcddee95213d2de2e95b9c12be083370b2072333a0fa", + "sha256:c889fd87e1f1bbeb877c2ee56b63bb297de4636661cc9bbfcf4b34e5e925bc27", + "sha256:cbaaf2ef20d282659093913da9d402108203f7cb5955020bd8d1ae5a2325d1c4", + "sha256:ce3317d155628301d649fe5e16a99528d5680af4ec7aa70b90b8dacd2d725c9b", + "sha256:d015e63b985a78a3d4ccffd3bdf22b7c20b3bbd4b8227809b3e8e75bc37f9cb2", + "sha256:d063c6b9fed7d992bcbebfc9133f4c24b7a7f215d6b102f3e082b1117cddb72c", + "sha256:d965e8b325f443ed3196db890d85dfebbb09f7384486a77461347f4adb1fa7f8", + "sha256:db6e6afcb95edbe6b357786684b71008499836e91f2a4a1e55b840955b341dbb", + "sha256:dc1636770a809dee2bd44dd74b89cc80eb41172bcad8af75dd0bc182c2666d4c", + "sha256:dd9be0a42de08f4b58a3cc73a123f124f65c24698b95a54c1543065baca8cf0e", + "sha256:e0ec50663feedf64d21bad0809f5857bac1ce91deded203efc4a84b31b2e4305", + "sha256:e2c409ce1c219c091e47cb03feb3c4ed8c2b8e004efc940da0166aaee8f9d6c8", + "sha256:e61328920154b6a44d98cabcb709f10e8b74276bc709c9a513a8c37a18786cc4", + "sha256:e89513f014c6be0d17b00a9a7c81b1c426f4eb9224b15433f3d98c1a071f8433", + "sha256:ea85bda3189fb27503af4c45273735bcde3dd31c1ab17d11f37b04877859ef45", + "sha256:edbefe079a520c5984e30e1f1f29325054b59534729c25b874a16a5048028d16", + "sha256:f0cb80fd5c2df4898693aa841425ea1727b1b6d2167448253077d2a49003e0ed", + "sha256:f2b05e6ccbee333a8f4b8f4d7c244fdb7a979e90977ad9c51ea31261e2085ce0", + "sha256:f399e8657c67313476a121a6944311fab377085ca7f490648c9af97fc732732d", + "sha256:f4a57db8966b3a1d1a350012839c6a0099f0898c56512dfade8a1fe5fb278710", + "sha256:f56af3a420fb1ffaf43ece3ea09c2d27c444e7c40dcb7c6e7cf57aae764f2b48", + "sha256:f6bd91345b5163ee7448bee201ed7dd601ca24f43f439109b0212e296eb5b423", + "sha256:fb539d7e5dc4aac345846f290cf504d2fd3c1be26ac4e8b5e4c2b688069ff4cf", + "sha256:fbdce4b47592f9e296e19ac31667daed8753c8367ebb34b9a9bd89dacaa299c9", + "sha256:fc379c73fd66606628b866f661e8785088afe2adaba78e6bbe80796baf708a63", + "sha256:fc3cf31edf405a161a0adad83246568647c54404739b614b1ff43dad2b02e6d5", + "sha256:fcf31facf2796a2d3b7fe338fe8640aa0166e4e55b4cb108dbfd1058049bf4cb" ], "markers": "python_version >= '3.8'", - "version": "==2.20.1" + "version": "==2.23.3" }, "pyjwt": { "hashes": [ - "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de", - "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320" + "sha256:3b02fb0f44517787776cf48f2ae25d8e14f300e6d7545a4315cee571a415e850", + "sha256:7e1e5b56cc735432a7369cbfa0efe50fa113ebecdc04ae6922deba8b84582d0c" ], - "markers": "python_version >= '3.7'", - "version": "==2.8.0" + "markers": "python_version >= '3.8'", + "version": "==2.9.0" }, "python-dateutil": { "hashes": [ @@ -1194,67 +1241,69 @@ }, "pytz": { "hashes": [ - "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812", - "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319" + "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a", + "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725" ], - "version": "==2024.1" + "version": "==2024.2" }, "pyyaml": { "hashes": [ - "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5", - "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc", - "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df", - "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741", - "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206", - "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27", - "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595", - "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62", - "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98", - "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696", - "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290", - "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9", - "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d", - "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6", - "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867", - "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47", - "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486", - "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6", - "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3", - "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007", - "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938", - "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0", - "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c", - "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735", - "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d", - "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28", - "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4", - "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba", - "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8", - "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef", - "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5", - "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd", - "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3", - "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0", - "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515", - "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c", - "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c", - "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924", - "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34", - "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43", - "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859", - "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673", - "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54", - "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a", - "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b", - "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab", - "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa", - "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c", - "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585", - "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d", - "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f" + "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff", + "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", + "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", + "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e", + "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", + "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", + "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", + "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", + "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", + "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", + "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a", + "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", + "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", + "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8", + "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", + "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19", + "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", + "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a", + "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", + "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", + "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", + "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631", + "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d", + "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", + "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", + "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", + "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", + "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", + "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", + "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706", + "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", + "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", + "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", + "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083", + "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", + "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", + "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", + "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f", + "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725", + "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", + "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", + "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", + "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", + "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", + "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5", + "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d", + "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290", + "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", + "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", + "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", + "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", + "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12", + "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4" ], - "markers": "python_version >= '3.6'", - "version": "==6.0.1" + "markers": "python_version >= '3.8'", + "version": "==6.0.2" }, "referencing": { "hashes": [ @@ -1275,112 +1324,112 @@ }, "rpds-py": { "hashes": [ - "sha256:01227f8b3e6c8961490d869aa65c99653df80d2f0a7fde8c64ebddab2b9b02fd", - "sha256:08ce9c95a0b093b7aec75676b356a27879901488abc27e9d029273d280438505", - "sha256:0b02dd77a2de6e49078c8937aadabe933ceac04b41c5dde5eca13a69f3cf144e", - "sha256:0d4b52811dcbc1aba08fd88d475f75b4f6db0984ba12275d9bed1a04b2cae9b5", - "sha256:13e6d4840897d4e4e6b2aa1443e3a8eca92b0402182aafc5f4ca1f5e24f9270a", - "sha256:1a129c02b42d46758c87faeea21a9f574e1c858b9f358b6dd0bbd71d17713175", - "sha256:1a8dfa125b60ec00c7c9baef945bb04abf8ac772d8ebefd79dae2a5f316d7850", - "sha256:1c32e41de995f39b6b315d66c27dea3ef7f7c937c06caab4c6a79a5e09e2c415", - "sha256:1d494887d40dc4dd0d5a71e9d07324e5c09c4383d93942d391727e7a40ff810b", - "sha256:1d4af2eb520d759f48f1073ad3caef997d1bfd910dc34e41261a595d3f038a94", - "sha256:1fb93d3486f793d54a094e2bfd9cd97031f63fcb5bc18faeb3dd4b49a1c06523", - "sha256:24f8ae92c7fae7c28d0fae9b52829235df83f34847aa8160a47eb229d9666c7b", - "sha256:24fc5a84777cb61692d17988989690d6f34f7f95968ac81398d67c0d0994a897", - "sha256:26ab43b6d65d25b1a333c8d1b1c2f8399385ff683a35ab5e274ba7b8bb7dc61c", - "sha256:271accf41b02687cef26367c775ab220372ee0f4925591c6796e7c148c50cab5", - "sha256:2ddd50f18ebc05ec29a0d9271e9dbe93997536da3546677f8ca00b76d477680c", - "sha256:31dd5794837f00b46f4096aa8ccaa5972f73a938982e32ed817bb520c465e520", - "sha256:31e450840f2f27699d014cfc8865cc747184286b26d945bcea6042bb6aa4d26e", - "sha256:32e0db3d6e4f45601b58e4ac75c6f24afbf99818c647cc2066f3e4b192dabb1f", - "sha256:346557f5b1d8fd9966059b7a748fd79ac59f5752cd0e9498d6a40e3ac1c1875f", - "sha256:34bca66e2e3eabc8a19e9afe0d3e77789733c702c7c43cd008e953d5d1463fde", - "sha256:3511f6baf8438326e351097cecd137eb45c5f019944fe0fd0ae2fea2fd26be39", - "sha256:35af5e4d5448fa179fd7fff0bba0fba51f876cd55212f96c8bbcecc5c684ae5c", - "sha256:3837c63dd6918a24de6c526277910e3766d8c2b1627c500b155f3eecad8fad65", - "sha256:39d67896f7235b2c886fb1ee77b1491b77049dcef6fbf0f401e7b4cbed86bbd4", - "sha256:3b823be829407393d84ee56dc849dbe3b31b6a326f388e171555b262e8456cc1", - "sha256:3c73254c256081704dba0a333457e2fb815364018788f9b501efe7c5e0ada401", - "sha256:3ddab996807c6b4227967fe1587febade4e48ac47bb0e2d3e7858bc621b1cace", - "sha256:3e1dc59a5e7bc7f44bd0c048681f5e05356e479c50be4f2c1a7089103f1621d5", - "sha256:4383beb4a29935b8fa28aca8fa84c956bf545cb0c46307b091b8d312a9150e6a", - "sha256:4cc4bc73e53af8e7a42c8fd7923bbe35babacfa7394ae9240b3430b5dcf16b2a", - "sha256:4dd02e29c8cbed21a1875330b07246b71121a1c08e29f0ee3db5b4cfe16980c4", - "sha256:4f580ae79d0b861dfd912494ab9d477bea535bfb4756a2269130b6607a21802e", - "sha256:53dbc35808c6faa2ce3e48571f8f74ef70802218554884787b86a30947842a14", - "sha256:56313be667a837ff1ea3508cebb1ef6681d418fa2913a0635386cf29cff35165", - "sha256:57863d16187995c10fe9cf911b897ed443ac68189179541734502353af33e693", - "sha256:5953391af1405f968eb5701ebbb577ebc5ced8d0041406f9052638bafe52209d", - "sha256:5beffdbe766cfe4fb04f30644d822a1080b5359df7db3a63d30fa928375b2720", - "sha256:5e360188b72f8080fefa3adfdcf3618604cc8173651c9754f189fece068d2a45", - "sha256:5e58b61dcbb483a442c6239c3836696b79f2cd8e7eec11e12155d3f6f2d886d1", - "sha256:69084fd29bfeff14816666c93a466e85414fe6b7d236cfc108a9c11afa6f7301", - "sha256:6d1d7539043b2b31307f2c6c72957a97c839a88b2629a348ebabe5aa8b626d6b", - "sha256:6d8b735c4d162dc7d86a9cf3d717f14b6c73637a1f9cd57fe7e61002d9cb1972", - "sha256:6ea961a674172ed2235d990d7edf85d15d8dfa23ab8575e48306371c070cda67", - "sha256:71157f9db7f6bc6599a852852f3389343bea34315b4e6f109e5cbc97c1fb2963", - "sha256:720f3108fb1bfa32e51db58b832898372eb5891e8472a8093008010911e324c5", - "sha256:74129d5ffc4cde992d89d345f7f7d6758320e5d44a369d74d83493429dad2de5", - "sha256:747251e428406b05fc86fee3904ee19550c4d2d19258cef274e2151f31ae9d38", - "sha256:75130df05aae7a7ac171b3b5b24714cffeabd054ad2ebc18870b3aa4526eba23", - "sha256:7b3661e6d4ba63a094138032c1356d557de5b3ea6fd3cca62a195f623e381c76", - "sha256:7d5c7e32f3ee42f77d8ff1a10384b5cdcc2d37035e2e3320ded909aa192d32c3", - "sha256:8124101e92c56827bebef084ff106e8ea11c743256149a95b9fd860d3a4f331f", - "sha256:81db2e7282cc0487f500d4db203edc57da81acde9e35f061d69ed983228ffe3b", - "sha256:840e18c38098221ea6201f091fc5d4de6128961d2930fbbc96806fb43f69aec1", - "sha256:89cc8921a4a5028d6dd388c399fcd2eef232e7040345af3d5b16c04b91cf3c7e", - "sha256:8b32cd4ab6db50c875001ba4f5a6b30c0f42151aa1fbf9c2e7e3674893fb1dc4", - "sha256:8df1c283e57c9cb4d271fdc1875f4a58a143a2d1698eb0d6b7c0d7d5f49c53a1", - "sha256:902cf4739458852fe917104365ec0efbea7d29a15e4276c96a8d33e6ed8ec137", - "sha256:97fbb77eaeb97591efdc654b8b5f3ccc066406ccfb3175b41382f221ecc216e8", - "sha256:9c7042488165f7251dc7894cd533a875d2875af6d3b0e09eda9c4b334627ad1c", - "sha256:9e318e6786b1e750a62f90c6f7fa8b542102bdcf97c7c4de2a48b50b61bd36ec", - "sha256:a9421b23c85f361a133aa7c5e8ec757668f70343f4ed8fdb5a4a14abd5437244", - "sha256:aaf71f95b21f9dc708123335df22e5a2fef6307e3e6f9ed773b2e0938cc4d491", - "sha256:afedc35fe4b9e30ab240b208bb9dc8938cb4afe9187589e8d8d085e1aacb8309", - "sha256:b5e28e56143750808c1c79c70a16519e9bc0a68b623197b96292b21b62d6055c", - "sha256:b82c9514c6d74b89a370c4060bdb80d2299bc6857e462e4a215b4ef7aa7b090e", - "sha256:b8f78398e67a7227aefa95f876481485403eb974b29e9dc38b307bb6eb2315ea", - "sha256:bbda75f245caecff8faa7e32ee94dfaa8312a3367397975527f29654cd17a6ed", - "sha256:bca34e913d27401bda2a6f390d0614049f5a95b3b11cd8eff80fe4ec340a1208", - "sha256:bd04d8cab16cab5b0a9ffc7d10f0779cf1120ab16c3925404428f74a0a43205a", - "sha256:c149a652aeac4902ecff2dd93c3b2681c608bd5208c793c4a99404b3e1afc87c", - "sha256:c2087dbb76a87ec2c619253e021e4fb20d1a72580feeaa6892b0b3d955175a71", - "sha256:c34f751bf67cab69638564eee34023909380ba3e0d8ee7f6fe473079bf93f09b", - "sha256:c6d20c8896c00775e6f62d8373aba32956aa0b850d02b5ec493f486c88e12859", - "sha256:c7af6f7b80f687b33a4cdb0a785a5d4de1fb027a44c9a049d8eb67d5bfe8a687", - "sha256:c7b07959866a6afb019abb9564d8a55046feb7a84506c74a6f197cbcdf8a208e", - "sha256:ca0dda0c5715efe2ab35bb83f813f681ebcd2840d8b1b92bfc6fe3ab382fae4a", - "sha256:cdb7eb3cf3deb3dd9e7b8749323b5d970052711f9e1e9f36364163627f96da58", - "sha256:ce757c7c90d35719b38fa3d4ca55654a76a40716ee299b0865f2de21c146801c", - "sha256:d1fa67ef839bad3815124f5f57e48cd50ff392f4911a9f3cf449d66fa3df62a5", - "sha256:d2dbd8f4990d4788cb122f63bf000357533f34860d269c1a8e90ae362090ff3a", - "sha256:d4ec0046facab83012d821b33cead742a35b54575c4edfb7ed7445f63441835f", - "sha256:dbceedcf4a9329cc665452db1aaf0845b85c666e4885b92ee0cddb1dbf7e052a", - "sha256:dc733d35f861f8d78abfaf54035461e10423422999b360966bf1c443cbc42705", - "sha256:dd635c2c4043222d80d80ca1ac4530a633102a9f2ad12252183bcf338c1b9474", - "sha256:de1f7cd5b6b351e1afd7568bdab94934d656abe273d66cda0ceea43bbc02a0c2", - "sha256:df7c841813f6265e636fe548a49664c77af31ddfa0085515326342a751a6ba51", - "sha256:e0f9d268b19e8f61bf42a1da48276bcd05f7ab5560311f541d22557f8227b866", - "sha256:e2d66eb41ffca6cc3c91d8387509d27ba73ad28371ef90255c50cb51f8953301", - "sha256:e429fc517a1c5e2a70d576077231538a98d59a45dfc552d1ac45a132844e6dfb", - "sha256:e4d2b88efe65544a7d5121b0c3b003ebba92bfede2ea3577ce548b69c5235185", - "sha256:e76c902d229a3aa9d5ceb813e1cbcc69bf5bda44c80d574ff1ac1fa3136dea71", - "sha256:ef07a0a1d254eeb16455d839cef6e8c2ed127f47f014bbda64a58b5482b6c836", - "sha256:f09529d2332264a902688031a83c19de8fda5eb5881e44233286b9c9ec91856d", - "sha256:f0a6d4a93d2a05daec7cb885157c97bbb0be4da739d6f9dfb02e101eb40921cd", - "sha256:f0cf2a0dbb5987da4bd92a7ca727eadb225581dd9681365beba9accbe5308f7d", - "sha256:f2671cb47e50a97f419a02cd1e0c339b31de017b033186358db92f4d8e2e17d8", - "sha256:f35b34a5184d5e0cc360b61664c1c06e866aab077b5a7c538a3e20c8fcdbf90b", - "sha256:f3d73022990ab0c8b172cce57c69fd9a89c24fd473a5e79cbce92df87e3d9c48", - "sha256:f5b8353ea1a4d7dfb59a7f45c04df66ecfd363bb5b35f33b11ea579111d4655f", - "sha256:f809a17cc78bd331e137caa25262b507225854073fd319e987bd216bed911b7c", - "sha256:f9bc4161bd3b970cd6a6fcda70583ad4afd10f2750609fb1f3ca9505050d4ef3", - "sha256:fdf4890cda3b59170009d012fca3294c00140e7f2abe1910e6a730809d0f3f9b" + "sha256:06db23d43f26478303e954c34c75182356ca9aa7797d22c5345b16871ab9c45c", + "sha256:0e13e6952ef264c40587d510ad676a988df19adea20444c2b295e536457bc585", + "sha256:11ef6ce74616342888b69878d45e9f779b95d4bd48b382a229fe624a409b72c5", + "sha256:1259c7b3705ac0a0bd38197565a5d603218591d3f6cee6e614e380b6ba61c6f6", + "sha256:18d7585c463087bddcfa74c2ba267339f14f2515158ac4db30b1f9cbdb62c8ef", + "sha256:1e0f80b739e5a8f54837be5d5c924483996b603d5502bfff79bf33da06164ee2", + "sha256:1e5f3cd7397c8f86c8cc72d5a791071431c108edd79872cdd96e00abd8497d29", + "sha256:220002c1b846db9afd83371d08d239fdc865e8f8c5795bbaec20916a76db3318", + "sha256:22e6c9976e38f4d8c4a63bd8a8edac5307dffd3ee7e6026d97f3cc3a2dc02a0b", + "sha256:238a2d5b1cad28cdc6ed15faf93a998336eb041c4e440dd7f902528b8891b399", + "sha256:2580b0c34583b85efec8c5c5ec9edf2dfe817330cc882ee972ae650e7b5ef739", + "sha256:28527c685f237c05445efec62426d285e47a58fb05ba0090a4340b73ecda6dee", + "sha256:2cf126d33a91ee6eedc7f3197b53e87a2acdac63602c0f03a02dd69e4b138174", + "sha256:338ca4539aad4ce70a656e5187a3a31c5204f261aef9f6ab50e50bcdffaf050a", + "sha256:39ed0d010457a78f54090fafb5d108501b5aa5604cc22408fc1c0c77eac14344", + "sha256:3ad0fda1635f8439cde85c700f964b23ed5fc2d28016b32b9ee5fe30da5c84e2", + "sha256:3d2b1ad682a3dfda2a4e8ad8572f3100f95fad98cb99faf37ff0ddfe9cbf9d03", + "sha256:3d61339e9f84a3f0767b1995adfb171a0d00a1185192718a17af6e124728e0f5", + "sha256:3fde368e9140312b6e8b6c09fb9f8c8c2f00999d1823403ae90cc00480221b22", + "sha256:40ce74fc86ee4645d0a225498d091d8bc61f39b709ebef8204cb8b5a464d3c0e", + "sha256:49a8063ea4296b3a7e81a5dfb8f7b2d73f0b1c20c2af401fb0cdf22e14711a96", + "sha256:4a1f1d51eccb7e6c32ae89243cb352389228ea62f89cd80823ea7dd1b98e0b91", + "sha256:4b16aa0107ecb512b568244ef461f27697164d9a68d8b35090e9b0c1c8b27752", + "sha256:4f1ed4749a08379555cebf4650453f14452eaa9c43d0a95c49db50c18b7da075", + "sha256:4fe84294c7019456e56d93e8ababdad5a329cd25975be749c3f5f558abb48253", + "sha256:50eccbf054e62a7b2209b28dc7a22d6254860209d6753e6b78cfaeb0075d7bee", + "sha256:514b3293b64187172bc77c8fb0cdae26981618021053b30d8371c3a902d4d5ad", + "sha256:54b43a2b07db18314669092bb2de584524d1ef414588780261e31e85846c26a5", + "sha256:55fea87029cded5df854ca7e192ec7bdb7ecd1d9a3f63d5c4eb09148acf4a7ce", + "sha256:569b3ea770c2717b730b61998b6c54996adee3cef69fc28d444f3e7920313cf7", + "sha256:56e27147a5a4c2c21633ff8475d185734c0e4befd1c989b5b95a5d0db699b21b", + "sha256:57eb94a8c16ab08fef6404301c38318e2c5a32216bf5de453e2714c964c125c8", + "sha256:5a35df9f5548fd79cb2f52d27182108c3e6641a4feb0f39067911bf2adaa3e57", + "sha256:5a8c94dad2e45324fc74dce25e1645d4d14df9a4e54a30fa0ae8bad9a63928e3", + "sha256:5b4f105deeffa28bbcdff6c49b34e74903139afa690e35d2d9e3c2c2fba18cec", + "sha256:5c1dc0f53856b9cc9a0ccca0a7cc61d3d20a7088201c0937f3f4048c1718a209", + "sha256:614fdafe9f5f19c63ea02817fa4861c606a59a604a77c8cdef5aa01d28b97921", + "sha256:617c7357272c67696fd052811e352ac54ed1d9b49ab370261a80d3b6ce385045", + "sha256:65794e4048ee837494aea3c21a28ad5fc080994dfba5b036cf84de37f7ad5074", + "sha256:6632f2d04f15d1bd6fe0eedd3b86d9061b836ddca4c03d5cf5c7e9e6b7c14580", + "sha256:6c8ef2ebf76df43f5750b46851ed1cdf8f109d7787ca40035fe19fbdc1acc5a7", + "sha256:758406267907b3781beee0f0edfe4a179fbd97c0be2e9b1154d7f0a1279cf8e5", + "sha256:7e60cb630f674a31f0368ed32b2a6b4331b8350d67de53c0359992444b116dd3", + "sha256:89c19a494bf3ad08c1da49445cc5d13d8fefc265f48ee7e7556839acdacf69d0", + "sha256:8a86a9b96070674fc88b6f9f71a97d2c1d3e5165574615d1f9168ecba4cecb24", + "sha256:8bc7690f7caee50b04a79bf017a8d020c1f48c2a1077ffe172abec59870f1139", + "sha256:8d7919548df3f25374a1f5d01fbcd38dacab338ef5f33e044744b5c36729c8db", + "sha256:9426133526f69fcaba6e42146b4e12d6bc6c839b8b555097020e2b78ce908dcc", + "sha256:9824fb430c9cf9af743cf7aaf6707bf14323fb51ee74425c380f4c846ea70789", + "sha256:9bb4a0d90fdb03437c109a17eade42dfbf6190408f29b2744114d11586611d6f", + "sha256:9bc2d153989e3216b0559251b0c260cfd168ec78b1fac33dd485750a228db5a2", + "sha256:9d35cef91e59ebbeaa45214861874bc6f19eb35de96db73e467a8358d701a96c", + "sha256:a1862d2d7ce1674cffa6d186d53ca95c6e17ed2b06b3f4c476173565c862d232", + "sha256:a84ab91cbe7aab97f7446652d0ed37d35b68a465aeef8fc41932a9d7eee2c1a6", + "sha256:aa7f429242aae2947246587d2964fad750b79e8c233a2367f71b554e9447949c", + "sha256:aa9a0521aeca7d4941499a73ad7d4f8ffa3d1affc50b9ea11d992cd7eff18a29", + "sha256:ac2f4f7a98934c2ed6505aead07b979e6f999389f16b714448fb39bbaa86a489", + "sha256:ae94bd0b2f02c28e199e9bc51485d0c5601f58780636185660f86bf80c89af94", + "sha256:af0fc424a5842a11e28956e69395fbbeab2c97c42253169d87e90aac2886d751", + "sha256:b2a5db5397d82fa847e4c624b0c98fe59d2d9b7cf0ce6de09e4d2e80f8f5b3f2", + "sha256:b4c29cbbba378759ac5786730d1c3cb4ec6f8ababf5c42a9ce303dc4b3d08cda", + "sha256:b74b25f024b421d5859d156750ea9a65651793d51b76a2e9238c05c9d5f203a9", + "sha256:b7f19250ceef892adf27f0399b9e5afad019288e9be756d6919cb58892129f51", + "sha256:b80d4a7900cf6b66bb9cee5c352b2d708e29e5a37fe9bf784fa97fc11504bf6c", + "sha256:b8c00a3b1e70c1d3891f0db1b05292747f0dbcfb49c43f9244d04c70fbc40eb8", + "sha256:bb273176be34a746bdac0b0d7e4e2c467323d13640b736c4c477881a3220a989", + "sha256:c3c20f0ddeb6e29126d45f89206b8291352b8c5b44384e78a6499d68b52ae511", + "sha256:c3e130fd0ec56cb76eb49ef52faead8ff09d13f4527e9b0c400307ff72b408e1", + "sha256:c52d3f2f82b763a24ef52f5d24358553e8403ce05f893b5347098014f2d9eff2", + "sha256:c6377e647bbfd0a0b159fe557f2c6c602c159fc752fa316572f012fc0bf67150", + "sha256:c638144ce971df84650d3ed0096e2ae7af8e62ecbbb7b201c8935c370df00a2c", + "sha256:ce9845054c13696f7af7f2b353e6b4f676dab1b4b215d7fe5e05c6f8bb06f965", + "sha256:cf258ede5bc22a45c8e726b29835b9303c285ab46fc7c3a4cc770736b5304c9f", + "sha256:d0a26ffe9d4dd35e4dfdd1e71f46401cff0181c75ac174711ccff0459135fa58", + "sha256:d0b67d87bb45ed1cd020e8fbf2307d449b68abc45402fe1a4ac9e46c3c8b192b", + "sha256:d20277fd62e1b992a50c43f13fbe13277a31f8c9f70d59759c88f644d66c619f", + "sha256:d454b8749b4bd70dd0a79f428731ee263fa6995f83ccb8bada706e8d1d3ff89d", + "sha256:d4c7d1a051eeb39f5c9547e82ea27cbcc28338482242e3e0b7768033cb083821", + "sha256:d72278a30111e5b5525c1dd96120d9e958464316f55adb030433ea905866f4de", + "sha256:d72a210824facfdaf8768cf2d7ca25a042c30320b3020de2fa04640920d4e121", + "sha256:d807dc2051abe041b6649681dce568f8e10668e3c1c6543ebae58f2d7e617855", + "sha256:dbe982f38565bb50cb7fb061ebf762c2f254ca3d8c20d4006878766e84266272", + "sha256:dcedf0b42bcb4cfff4101d7771a10532415a6106062f005ab97d1d0ab5681c60", + "sha256:deb62214c42a261cb3eb04d474f7155279c1a8a8c30ac89b7dcb1721d92c3c02", + "sha256:def7400461c3a3f26e49078302e1c1b38f6752342c77e3cf72ce91ca69fb1bc1", + "sha256:df3de6b7726b52966edf29663e57306b23ef775faf0ac01a3e9f4012a24a4140", + "sha256:e1940dae14e715e2e02dfd5b0f64a52e8374a517a1e531ad9412319dc3ac7879", + "sha256:e4df1e3b3bec320790f699890d41c59d250f6beda159ea3c44c3f5bac1976940", + "sha256:e6900ecdd50ce0facf703f7a00df12374b74bbc8ad9fe0f6559947fb20f82364", + "sha256:ea438162a9fcbee3ecf36c23e6c68237479f89f962f82dae83dc15feeceb37e4", + "sha256:eb851b7df9dda52dc1415ebee12362047ce771fc36914586b2e9fcbd7d293b3e", + "sha256:ec31a99ca63bf3cd7f1a5ac9fe95c5e2d060d3c768a09bc1d16e235840861420", + "sha256:f0475242f447cc6cb8a9dd486d68b2ef7fbee84427124c232bff5f63b1fe11e5", + "sha256:f2fbf7db2012d4876fb0d66b5b9ba6591197b0f165db8d99371d976546472a24", + "sha256:f60012a73aa396be721558caa3a6fd49b3dd0033d1675c6d59c4502e870fcf0c", + "sha256:f8e604fe73ba048c06085beaf51147eaec7df856824bfe7b98657cf436623daf", + "sha256:f90a4cd061914a60bd51c68bcb4357086991bd0bb93d8aa66a6da7701370708f", + "sha256:f918a1a130a6dfe1d7fe0f105064141342e7dd1611f2e6a21cd2f5c8cb1cfb3e", + "sha256:fa518bcd7600c584bf42e6617ee8132869e877db2f76bcdc281ec6a4113a53ab", + "sha256:faefcc78f53a88f3076b7f8be0a8f8d35133a3ecf7f3770895c25f8813460f08", + "sha256:fcaeb7b57f1a1e071ebd748984359fef83ecb026325b9d4ca847c95bc7311c92", + "sha256:fd2d84f40633bc475ef2d5490b9c19543fbf18596dcb1b291e3a12ea5d722f7a", + "sha256:fdfc3a892927458d98f3d55428ae46b921d1f7543b89382fdb483f5640daaec8" ], "markers": "python_version >= '3.8'", - "version": "==0.19.1" + "version": "==0.20.0" }, "s3transfer": { "hashes": [ @@ -1392,11 +1441,11 @@ }, "setuptools": { "hashes": [ - "sha256:5a0d9c6a2f332881a0153f629d8000118efd33255cfa802757924c53312c76da", - "sha256:98b4d786a12fadd34eabf69e8d014b84e5fc655981e4ff419994700434ace132" + "sha256:5f4c08aa4d3ebcb57a50c33b1b07e94315d7fc7230f7115e47fc99776c8ce308", + "sha256:95b40ed940a1c67eb70fc099094bd6e99c6ee7c23aa2306f4d2697ba7916f9c6" ], "markers": "python_version >= '3.8'", - "version": "==72.0.0" + "version": "==74.1.2" }, "six": { "hashes": [ @@ -1427,7 +1476,7 @@ "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" ], - "markers": "python_version >= '3.8'", + "markers": "python_version < '3.13'", "version": "==4.12.2" }, "tzdata": { @@ -1440,115 +1489,117 @@ }, "urllib3": { "hashes": [ - "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472", - "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168" + "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", + "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9" ], - "markers": "python_version >= '3.8'", - "version": "==2.2.2" + "markers": "python_version >= '3.10'", + "version": "==2.2.3" }, "werkzeug": { "hashes": [ - "sha256:097e5bfda9f0aba8da6b8545146def481d06aa7d3266e7448e2cccf67dd8bd18", - "sha256:fc9645dc43e03e4d630d23143a04a7f947a9a3b5727cd535fdfe155a17cc48c8" + "sha256:02c9eb92b7d6c06f31a782811505d2157837cea66aaede3e217c7c27c039476c", + "sha256:34f2371506b250df4d4f84bfe7b0921e4762525762bbd936614909fe25cd7306" ], "markers": "python_version >= '3.8'", - "version": "==3.0.3" + "version": "==3.0.4" }, "yarl": { "hashes": [ - "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51", - "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce", - "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559", - "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0", - "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81", - "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc", - "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4", - "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c", - "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130", - "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136", - "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e", - "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec", - "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7", - "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1", - "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455", - "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099", - "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129", - "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10", - "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142", - "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98", - "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa", - "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7", - "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525", - "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c", - "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9", - "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c", - "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8", - "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b", - "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf", - "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23", - "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd", - "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27", - "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f", - "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece", - "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434", - "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec", - "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff", - "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78", - "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d", - "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863", - "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53", - "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31", - "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15", - "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5", - "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b", - "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57", - "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3", - "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1", - "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f", - "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad", - "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c", - "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7", - "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2", - "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b", - "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2", - "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b", - "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9", - "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be", - "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e", - "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984", - "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4", - "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074", - "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2", - "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392", - "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91", - "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541", - "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf", - "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572", - "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66", - "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575", - "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14", - "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5", - "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1", - "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e", - "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551", - "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17", - "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead", - "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0", - "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe", - "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234", - "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0", - "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7", - "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34", - "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42", - "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385", - "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78", - "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be", - "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958", - "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749", - "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec" + "sha256:01a8697ec24f17c349c4f655763c4db70eebc56a5f82995e5e26e837c6eb0e49", + "sha256:02da8759b47d964f9173c8675710720b468aa1c1693be0c9c64abb9d8d9a4867", + "sha256:04293941646647b3bfb1719d1d11ff1028e9c30199509a844da3c0f5919dc520", + "sha256:067b961853c8e62725ff2893226fef3d0da060656a9827f3f520fb1d19b2b68a", + "sha256:077da604852be488c9a05a524068cdae1e972b7dc02438161c32420fb4ec5e14", + "sha256:09696438cb43ea6f9492ef237761b043f9179f455f405279e609f2bc9100212a", + "sha256:0b8486f322d8f6a38539136a22c55f94d269addb24db5cb6f61adc61eabc9d93", + "sha256:0ea9682124fc062e3d931c6911934a678cb28453f957ddccf51f568c2f2b5e05", + "sha256:0f351fa31234699d6084ff98283cb1e852270fe9e250a3b3bf7804eb493bd937", + "sha256:14438dfc5015661f75f85bc5adad0743678eefee266ff0c9a8e32969d5d69f74", + "sha256:15061ce6584ece023457fb8b7a7a69ec40bf7114d781a8c4f5dcd68e28b5c53b", + "sha256:15439f3c5c72686b6c3ff235279630d08936ace67d0fe5c8d5bbc3ef06f5a420", + "sha256:17b5a386d0d36fb828e2fb3ef08c8829c1ebf977eef88e5367d1c8c94b454639", + "sha256:18ac56c9dd70941ecad42b5a906820824ca72ff84ad6fa18db33c2537ae2e089", + "sha256:1bb2d9e212fb7449b8fb73bc461b51eaa17cc8430b4a87d87be7b25052d92f53", + "sha256:1e969fa4c1e0b1a391f3fcbcb9ec31e84440253325b534519be0d28f4b6b533e", + "sha256:1fa2e7a406fbd45b61b4433e3aa254a2c3e14c4b3186f6e952d08a730807fa0c", + "sha256:2164cd9725092761fed26f299e3f276bb4b537ca58e6ff6b252eae9631b5c96e", + "sha256:21a7c12321436b066c11ec19c7e3cb9aec18884fe0d5b25d03d756a9e654edfe", + "sha256:238a21849dd7554cb4d25a14ffbfa0ef380bb7ba201f45b144a14454a72ffa5a", + "sha256:250e888fa62d73e721f3041e3a9abf427788a1934b426b45e1b92f62c1f68366", + "sha256:25861303e0be76b60fddc1250ec5986c42f0a5c0c50ff57cc30b1be199c00e63", + "sha256:267b24f891e74eccbdff42241c5fb4f974de2d6271dcc7d7e0c9ae1079a560d9", + "sha256:27fcb271a41b746bd0e2a92182df507e1c204759f460ff784ca614e12dd85145", + "sha256:2909fa3a7d249ef64eeb2faa04b7957e34fefb6ec9966506312349ed8a7e77bf", + "sha256:3257978c870728a52dcce8c2902bf01f6c53b65094b457bf87b2644ee6238ddc", + "sha256:327c724b01b8641a1bf1ab3b232fb638706e50f76c0b5bf16051ab65c868fac5", + "sha256:3de5292f9f0ee285e6bd168b2a77b2a00d74cbcfa420ed078456d3023d2f6dff", + "sha256:3fce4da3703ee6048ad4138fe74619c50874afe98b1ad87b2698ef95bf92c96d", + "sha256:3ff6b1617aa39279fe18a76c8d165469c48b159931d9b48239065767ee455b2b", + "sha256:400cd42185f92de559d29eeb529e71d80dfbd2f45c36844914a4a34297ca6f00", + "sha256:4179522dc0305c3fc9782549175c8e8849252fefeb077c92a73889ccbcd508ad", + "sha256:4307d9a3417eea87715c9736d050c83e8c1904e9b7aada6ce61b46361b733d92", + "sha256:476e20c433b356e16e9a141449f25161e6b69984fb4cdbd7cd4bd54c17844998", + "sha256:489fa8bde4f1244ad6c5f6d11bb33e09cf0d1d0367edb197619c3e3fc06f3d91", + "sha256:48a28bed68ab8fb7e380775f0029a079f08a17799cb3387a65d14ace16c12e2b", + "sha256:48dfd117ab93f0129084577a07287376cc69c08138694396f305636e229caa1a", + "sha256:4973eac1e2ff63cf187073cd4e1f1148dcd119314ab79b88e1b3fad74a18c9d5", + "sha256:498442e3af2a860a663baa14fbf23fb04b0dd758039c0e7c8f91cb9279799bff", + "sha256:501c503eed2bb306638ccb60c174f856cc3246c861829ff40eaa80e2f0330367", + "sha256:504cf0d4c5e4579a51261d6091267f9fd997ef58558c4ffa7a3e1460bd2336fa", + "sha256:61a5f2c14d0a1adfdd82258f756b23a550c13ba4c86c84106be4c111a3a4e413", + "sha256:637c7ddb585a62d4469f843dac221f23eec3cbad31693b23abbc2c366ad41ff4", + "sha256:66b63c504d2ca43bf7221a1f72fbe981ff56ecb39004c70a94485d13e37ebf45", + "sha256:67459cf8cf31da0e2cbdb4b040507e535d25cfbb1604ca76396a3a66b8ba37a6", + "sha256:688654f8507464745ab563b041d1fb7dab5d9912ca6b06e61d1c4708366832f5", + "sha256:6907daa4b9d7a688063ed098c472f96e8181733c525e03e866fb5db480a424df", + "sha256:69721b8effdb588cb055cc22f7c5105ca6fdaa5aeb3ea09021d517882c4a904c", + "sha256:6d23754b9939cbab02c63434776df1170e43b09c6a517585c7ce2b3d449b7318", + "sha256:7175a87ab8f7fbde37160a15e58e138ba3b2b0e05492d7351314a250d61b1591", + "sha256:72bf26f66456baa0584eff63e44545c9f0eaed9b73cb6601b647c91f14c11f38", + "sha256:74db2ef03b442276d25951749a803ddb6e270d02dda1d1c556f6ae595a0d76a8", + "sha256:750f656832d7d3cb0c76be137ee79405cc17e792f31e0a01eee390e383b2936e", + "sha256:75e0ae31fb5ccab6eda09ba1494e87eb226dcbd2372dae96b87800e1dcc98804", + "sha256:768ecc550096b028754ea28bf90fde071c379c62c43afa574edc6f33ee5daaec", + "sha256:7d51324a04fc4b0e097ff8a153e9276c2593106a811704025bbc1d6916f45ca6", + "sha256:7e975a2211952a8a083d1b9d9ba26472981ae338e720b419eb50535de3c02870", + "sha256:8215f6f21394d1f46e222abeb06316e77ef328d628f593502d8fc2a9117bde83", + "sha256:8258c86f47e080a258993eed877d579c71da7bda26af86ce6c2d2d072c11320d", + "sha256:8418c053aeb236b20b0ab8fa6bacfc2feaaf7d4683dd96528610989c99723d5f", + "sha256:87f020d010ba80a247c4abc335fc13421037800ca20b42af5ae40e5fd75e7909", + "sha256:884eab2ce97cbaf89f264372eae58388862c33c4f551c15680dd80f53c89a269", + "sha256:8a336eaa7ee7e87cdece3cedb395c9657d227bfceb6781295cf56abcd3386a26", + "sha256:8aef1b64da41d18026632d99a06b3fefe1d08e85dd81d849fa7c96301ed22f1b", + "sha256:8aef97ba1dd2138112890ef848e17d8526fe80b21f743b4ee65947ea184f07a2", + "sha256:8ed653638ef669e0efc6fe2acb792275cb419bf9cb5c5049399f3556995f23c7", + "sha256:9361628f28f48dcf8b2f528420d4d68102f593f9c2e592bfc842f5fb337e44fd", + "sha256:946eedc12895873891aaceb39bceb484b4977f70373e0122da483f6c38faaa68", + "sha256:94d0caaa912bfcdc702a4204cd5e2bb01eb917fc4f5ea2315aa23962549561b0", + "sha256:964a428132227edff96d6f3cf261573cb0f1a60c9a764ce28cda9525f18f7786", + "sha256:999bfee0a5b7385a0af5ffb606393509cfde70ecca4f01c36985be6d33e336da", + "sha256:a08ea567c16f140af8ddc7cb58e27e9138a1386e3e6e53982abaa6f2377b38cc", + "sha256:a28b70c9e2213de425d9cba5ab2e7f7a1c8ca23a99c4b5159bf77b9c31251447", + "sha256:a34e1e30f1774fa35d37202bbeae62423e9a79d78d0874e5556a593479fdf239", + "sha256:a4264515f9117be204935cd230fb2a052dd3792789cc94c101c535d349b3dab0", + "sha256:a7915ea49b0c113641dc4d9338efa9bd66b6a9a485ffe75b9907e8573ca94b84", + "sha256:aac44097d838dda26526cffb63bdd8737a2dbdf5f2c68efb72ad83aec6673c7e", + "sha256:b91044952da03b6f95fdba398d7993dd983b64d3c31c358a4c89e3c19b6f7aef", + "sha256:ba444bdd4caa2a94456ef67a2f383710928820dd0117aae6650a4d17029fa25e", + "sha256:c2dc4250fe94d8cd864d66018f8344d4af50e3758e9d725e94fecfa27588ff82", + "sha256:c35f493b867912f6fda721a59cc7c4766d382040bdf1ddaeeaa7fa4d072f4675", + "sha256:c92261eb2ad367629dc437536463dc934030c9e7caca861cc51990fe6c565f26", + "sha256:ce928c9c6409c79e10f39604a7e214b3cb69552952fbda8d836c052832e6a979", + "sha256:d95b52fbef190ca87d8c42f49e314eace4fc52070f3dfa5f87a6594b0c1c6e46", + "sha256:dae7bd0daeb33aa3e79e72877d3d51052e8b19c9025ecf0374f542ea8ec120e4", + "sha256:e286580b6511aac7c3268a78cdb861ec739d3e5a2a53b4809faef6b49778eaff", + "sha256:e4b53f73077e839b3f89c992223f15b1d2ab314bdbdf502afdc7bb18e95eae27", + "sha256:e8f63904df26d1a66aabc141bfd258bf738b9bc7bc6bdef22713b4f5ef789a4c", + "sha256:f3a6d90cab0bdf07df8f176eae3a07127daafcf7457b997b2bf46776da2c7eb7", + "sha256:f41fa79114a1d2eddb5eea7b912d6160508f57440bd302ce96eaa384914cd265", + "sha256:f46f81501160c28d0c0b7333b4f7be8983dbbc161983b6fb814024d1b4952f79", + "sha256:f61db3b7e870914dbd9434b560075e0366771eecbe6d2b5561f5bc7485f39efd" ], - "markers": "python_version >= '3.7'", - "version": "==1.9.4" + "markers": "python_version >= '3.8'", + "version": "==1.11.1" }, "zope.event": { "hashes": [ @@ -1560,45 +1611,43 @@ }, "zope.interface": { "hashes": [ - "sha256:00b5c3e9744dcdc9e84c24ed6646d5cf0cf66551347b310b3ffd70f056535854", - "sha256:0e4fa5d34d7973e6b0efa46fe4405090f3b406f64b6290facbb19dcbf642ad6b", - "sha256:136cacdde1a2c5e5bc3d0b2a1beed733f97e2dad8c2ad3c2e17116f6590a3827", - "sha256:1730c93a38b5a18d24549bc81613223962a19d457cfda9bdc66e542f475a36f4", - "sha256:1a62fd6cd518693568e23e02f41816adedfca637f26716837681c90b36af3671", - "sha256:1c207e6f6dfd5749a26f5a5fd966602d6b824ec00d2df84a7e9a924e8933654e", - "sha256:2eccd5bef45883802848f821d940367c1d0ad588de71e5cabe3813175444202c", - "sha256:33ee982237cffaf946db365c3a6ebaa37855d8e3ca5800f6f48890209c1cfefc", - "sha256:3d136e5b8821073e1a09dde3eb076ea9988e7010c54ffe4d39701adf0c303438", - "sha256:47654177e675bafdf4e4738ce58cdc5c6d6ee2157ac0a78a3fa460942b9d64a8", - "sha256:47937cf2e7ed4e0e37f7851c76edeb8543ec9b0eae149b36ecd26176ff1ca874", - "sha256:4ac46298e0143d91e4644a27a769d1388d5d89e82ee0cf37bf2b0b001b9712a4", - "sha256:4c0b208a5d6c81434bdfa0f06d9b667e5de15af84d8cae5723c3a33ba6611b82", - "sha256:551db2fe892fcbefb38f6f81ffa62de11090c8119fd4e66a60f3adff70751ec7", - "sha256:599f3b07bde2627e163ce484d5497a54a0a8437779362395c6b25e68c6590ede", - "sha256:5ef8356f16b1a83609f7a992a6e33d792bb5eff2370712c9eaae0d02e1924341", - "sha256:5fe919027f29b12f7a2562ba0daf3e045cb388f844e022552a5674fcdf5d21f1", - "sha256:6f0a6be264afb094975b5ef55c911379d6989caa87c4e558814ec4f5125cfa2e", - "sha256:706efc19f9679a1b425d6fa2b4bc770d976d0984335eaea0869bd32f627591d2", - "sha256:73f9752cf3596771c7726f7eea5b9e634ad47c6d863043589a1c3bb31325c7eb", - "sha256:762e616199f6319bb98e7f4f27d254c84c5fb1c25c908c2a9d0f92b92fb27530", - "sha256:866a0f583be79f0def667a5d2c60b7b4cc68f0c0a470f227e1122691b443c934", - "sha256:86a94af4a88110ed4bb8961f5ac72edf782958e665d5bfceaab6bf388420a78b", - "sha256:8e0343a6e06d94f6b6ac52fbc75269b41dd3c57066541a6c76517f69fe67cb43", - "sha256:97e615eab34bd8477c3f34197a17ce08c648d38467489359cb9eb7394f1083f7", - "sha256:a96e6d4074db29b152222c34d7eec2e2db2f92638d2b2b2c704f9e8db3ae0edc", - "sha256:b912750b13d76af8aac45ddf4679535def304b2a48a07989ec736508d0bbfbde", - "sha256:bc2676312cc3468a25aac001ec727168994ea3b69b48914944a44c6a0b251e79", - "sha256:cebff2fe5dc82cb22122e4e1225e00a4a506b1a16fafa911142ee124febf2c9e", - "sha256:d22fce0b0f5715cdac082e35a9e735a1752dc8585f005d045abb1a7c20e197f9", - "sha256:d3f7e001328bd6466b3414215f66dde3c7c13d8025a9c160a75d7b2687090d15", - "sha256:d3fe667935e9562407c2511570dca14604a654988a13d8725667e95161d92e9b", - "sha256:dabb70a6e3d9c22df50e08dc55b14ca2a99da95a2d941954255ac76fd6982bc5", - "sha256:e2fb8e8158306567a3a9a41670c1ff99d0567d7fc96fa93b7abf8b519a46b250", - "sha256:e96ac6b3169940a8cd57b4f2b8edcad8f5213b60efcd197d59fbe52f0accd66e", - "sha256:fbf649bc77510ef2521cf797700b96167bb77838c40780da7ea3edd8b78044d1" + "sha256:01e6e58078ad2799130c14a1d34ec89044ada0e1495329d72ee0407b9ae5100d", + "sha256:064ade95cb54c840647205987c7b557f75d2b2f7d1a84bfab4cf81822ef6e7d1", + "sha256:11fa1382c3efb34abf16becff8cb214b0b2e3144057c90611621f2d186b7e1b7", + "sha256:1bee1b722077d08721005e8da493ef3adf0b7908e0cd85cc7dc836ac117d6f32", + "sha256:1eeeb92cb7d95c45e726e3c1afe7707919370addae7ed14f614e22217a536958", + "sha256:21a207c6b2c58def5011768140861a73f5240f4f39800625072ba84e76c9da0b", + "sha256:2545d6d7aac425d528cd9bf0d9e55fcd47ab7fd15f41a64b1c4bf4c6b24946dc", + "sha256:2c4316a30e216f51acbd9fb318aa5af2e362b716596d82cbb92f9101c8f8d2e7", + "sha256:35062d93bc49bd9b191331c897a96155ffdad10744ab812485b6bad5b588d7e4", + "sha256:382d31d1e68877061daaa6499468e9eb38eb7625d4369b1615ac08d3860fe896", + "sha256:3aa8fcbb0d3c2be1bfd013a0f0acd636f6ed570c287743ae2bbd467ee967154d", + "sha256:3d4b91821305c8d8f6e6207639abcbdaf186db682e521af7855d0bea3047c8ca", + "sha256:3de1d553ce72868b77a7e9d598c9bff6d3816ad2b4cc81c04f9d8914603814f3", + "sha256:3fcdc76d0cde1c09c37b7c6b0f8beba2d857d8417b055d4f47df9c34ec518bdd", + "sha256:5112c530fa8aa2108a3196b9c2f078f5738c1c37cfc716970edc0df0414acda8", + "sha256:53d678bb1c3b784edbfb0adeebfeea6bf479f54da082854406a8f295d36f8386", + "sha256:6195c3c03fef9f87c0dbee0b3b6451df6e056322463cf35bca9a088e564a3c58", + "sha256:6d04b11ea47c9c369d66340dbe51e9031df2a0de97d68f442305ed7625ad6493", + "sha256:6dd647fcd765030638577fe6984284e0ebba1a1008244c8a38824be096e37fe3", + "sha256:799ef7a444aebbad5a145c3b34bff012b54453cddbde3332d47ca07225792ea4", + "sha256:7d92920416f31786bc1b2f34cc4fc4263a35a407425319572cbf96b51e835cd3", + "sha256:7e0c151a6c204f3830237c59ee4770cc346868a7a1af6925e5e38650141a7f05", + "sha256:84f8794bd59ca7d09d8fce43ae1b571be22f52748169d01a13d3ece8394d8b5b", + "sha256:95e5913ec718010dc0e7c215d79a9683b4990e7026828eedfda5268e74e73e11", + "sha256:9b9369671a20b8d039b8e5a1a33abd12e089e319a3383b4cc0bf5c67bd05fe7b", + "sha256:ab985c566a99cc5f73bc2741d93f1ed24a2cc9da3890144d37b9582965aff996", + "sha256:af94e429f9d57b36e71ef4e6865182090648aada0cb2d397ae2b3f7fc478493a", + "sha256:c96b3e6b0d4f6ddfec4e947130ec30bd2c7b19db6aa633777e46c8eecf1d6afd", + "sha256:cd2690d4b08ec9eaf47a85914fe513062b20da78d10d6d789a792c0b20307fb1", + "sha256:d3b7ce6d46fb0e60897d62d1ff370790ce50a57d40a651db91a3dde74f73b738", + "sha256:d976fa7b5faf5396eb18ce6c132c98e05504b52b60784e3401f4ef0b2e66709b", + "sha256:db6237e8fa91ea4f34d7e2d16d74741187e9105a63bbb5686c61fea04cdbacca", + "sha256:ecd32f30f40bfd8511b17666895831a51b532e93fc106bfa97f366589d3e4e0e", + "sha256:f418c88f09c3ba159b95a9d1cfcdbe58f208443abb1f3109f4b9b12fd60b187c" ], - "markers": "python_version >= '3.7'", - "version": "==6.4.post2" + "markers": "python_version >= '3.8'", + "version": "==7.0.3" } }, "develop": { @@ -1639,69 +1688,84 @@ }, "certifi": { "hashes": [ - "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b", - "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90" + "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", + "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9" ], "markers": "python_version >= '3.6'", - "version": "==2024.7.4" + "version": "==2024.8.30" }, "cffi": { "hashes": [ - "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc", - "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a", - "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417", - "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab", - "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520", - "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36", - "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743", - "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8", - "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed", - "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684", - "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56", - "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324", - "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d", - "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235", - "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e", - "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088", - "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000", - "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7", - "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e", - "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673", - "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c", - "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe", - "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2", - "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098", - "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8", - "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a", - "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0", - "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b", - "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896", - "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e", - "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9", - "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2", - "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b", - "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6", - "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404", - "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f", - "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0", - "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4", - "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc", - "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936", - "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba", - "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872", - "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb", - "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614", - "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1", - "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d", - "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969", - "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b", - "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4", - "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627", - "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956", - "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357" + "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", + "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", + "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1", + "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", + "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", + "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", + "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8", + "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36", + "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17", + "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", + "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc", + "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", + "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", + "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", + "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", + "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", + "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", + "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6", + "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", + "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b", + "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", + "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", + "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c", + "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", + "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", + "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", + "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8", + "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1", + "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", + "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", + "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", + "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595", + "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0", + "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", + "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", + "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", + "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", + "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", + "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", + "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16", + "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", + "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e", + "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", + "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964", + "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", + "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576", + "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", + "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3", + "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662", + "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", + "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", + "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", + "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", + "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", + "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", + "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", + "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", + "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9", + "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7", + "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", + "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a", + "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", + "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", + "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", + "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", + "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87", + "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b" ], "markers": "platform_python_implementation != 'PyPy'", - "version": "==1.16.0" + "version": "==1.17.1" }, "charset-normalizer": { "hashes": [ @@ -1801,62 +1865,82 @@ }, "coverage": { "hashes": [ - "sha256:0086cd4fc71b7d485ac93ca4239c8f75732c2ae3ba83f6be1c9be59d9e2c6382", - "sha256:01c322ef2bbe15057bc4bf132b525b7e3f7206f071799eb8aa6ad1940bcf5fb1", - "sha256:03cafe82c1b32b770a29fd6de923625ccac3185a54a5e66606da26d105f37dac", - "sha256:044a0985a4f25b335882b0966625270a8d9db3d3409ddc49a4eb00b0ef5e8cee", - "sha256:07ed352205574aad067482e53dd606926afebcb5590653121063fbf4e2175166", - "sha256:0d1b923fc4a40c5832be4f35a5dab0e5ff89cddf83bb4174499e02ea089daf57", - "sha256:0e7b27d04131c46e6894f23a4ae186a6a2207209a05df5b6ad4caee6d54a222c", - "sha256:1fad32ee9b27350687035cb5fdf9145bc9cf0a094a9577d43e909948ebcfa27b", - "sha256:289cc803fa1dc901f84701ac10c9ee873619320f2f9aff38794db4a4a0268d51", - "sha256:3c59105f8d58ce500f348c5b56163a4113a440dad6daa2294b5052a10db866da", - "sha256:46c3d091059ad0b9c59d1034de74a7f36dcfa7f6d3bde782c49deb42438f2450", - "sha256:482855914928c8175735a2a59c8dc5806cf7d8f032e4820d52e845d1f731dca2", - "sha256:49c76cdfa13015c4560702574bad67f0e15ca5a2872c6a125f6327ead2b731dd", - "sha256:4b03741e70fb811d1a9a1d75355cf391f274ed85847f4b78e35459899f57af4d", - "sha256:4bea27c4269234e06f621f3fac3925f56ff34bc14521484b8f66a580aacc2e7d", - "sha256:4d5fae0a22dc86259dee66f2cc6c1d3e490c4a1214d7daa2a93d07491c5c04b6", - "sha256:543ef9179bc55edfd895154a51792b01c017c87af0ebaae092720152e19e42ca", - "sha256:54dece71673b3187c86226c3ca793c5f891f9fc3d8aa183f2e3653da18566169", - "sha256:6379688fb4cfa921ae349c76eb1a9ab26b65f32b03d46bb0eed841fd4cb6afb1", - "sha256:65fa405b837060db569a61ec368b74688f429b32fa47a8929a7a2f9b47183713", - "sha256:6616d1c9bf1e3faea78711ee42a8b972367d82ceae233ec0ac61cc7fec09fa6b", - "sha256:6fe885135c8a479d3e37a7aae61cbd3a0fb2deccb4dda3c25f92a49189f766d6", - "sha256:7221f9ac9dad9492cecab6f676b3eaf9185141539d5c9689d13fd6b0d7de840c", - "sha256:76d5f82213aa78098b9b964ea89de4617e70e0d43e97900c2778a50856dac605", - "sha256:7792f0ab20df8071d669d929c75c97fecfa6bcab82c10ee4adb91c7a54055463", - "sha256:831b476d79408ab6ccfadaaf199906c833f02fdb32c9ab907b1d4aa0713cfa3b", - "sha256:9146579352d7b5f6412735d0f203bbd8d00113a680b66565e205bc605ef81bc6", - "sha256:9cc44bf0315268e253bf563f3560e6c004efe38f76db03a1558274a6e04bf5d5", - "sha256:a73d18625f6a8a1cbb11eadc1d03929f9510f4131879288e3f7922097a429f63", - "sha256:a8659fd33ee9e6ca03950cfdcdf271d645cf681609153f218826dd9805ab585c", - "sha256:a94925102c89247530ae1dab7dc02c690942566f22e189cbd53579b0693c0783", - "sha256:ad4567d6c334c46046d1c4c20024de2a1c3abc626817ae21ae3da600f5779b44", - "sha256:b2e16f4cd2bc4d88ba30ca2d3bbf2f21f00f382cf4e1ce3b1ddc96c634bc48ca", - "sha256:bbdf9a72403110a3bdae77948b8011f644571311c2fb35ee15f0f10a8fc082e8", - "sha256:beb08e8508e53a568811016e59f3234d29c2583f6b6e28572f0954a6b4f7e03d", - "sha256:c4cbe651f3904e28f3a55d6f371203049034b4ddbce65a54527a3f189ca3b390", - "sha256:c7b525ab52ce18c57ae232ba6f7010297a87ced82a2383b1afd238849c1ff933", - "sha256:ca5d79cfdae420a1d52bf177de4bc2289c321d6c961ae321503b2ca59c17ae67", - "sha256:cdab02a0a941af190df8782aafc591ef3ad08824f97850b015c8c6a8b3877b0b", - "sha256:d17c6a415d68cfe1091d3296ba5749d3d8696e42c37fca5d4860c5bf7b729f03", - "sha256:d39bd10f0ae453554798b125d2f39884290c480f56e8a02ba7a6ed552005243b", - "sha256:d4b3cd1ca7cd73d229487fa5caca9e4bc1f0bca96526b922d61053ea751fe791", - "sha256:d50a252b23b9b4dfeefc1f663c568a221092cbaded20a05a11665d0dbec9b8fb", - "sha256:da8549d17489cd52f85a9829d0e1d91059359b3c54a26f28bec2c5d369524807", - "sha256:dcd070b5b585b50e6617e8972f3fbbee786afca71b1936ac06257f7e178f00f6", - "sha256:ddaaa91bfc4477d2871442bbf30a125e8fe6b05da8a0015507bfbf4718228ab2", - "sha256:df423f351b162a702c053d5dddc0fc0ef9a9e27ea3f449781ace5f906b664428", - "sha256:dff044f661f59dace805eedb4a7404c573b6ff0cdba4a524141bc63d7be5c7fd", - "sha256:e7e128f85c0b419907d1f38e616c4f1e9f1d1b37a7949f44df9a73d5da5cd53c", - "sha256:ed8d1d1821ba5fc88d4a4f45387b65de52382fa3ef1f0115a4f7a20cdfab0e94", - "sha256:f2501d60d7497fd55e391f423f965bbe9e650e9ffc3c627d5f0ac516026000b8", - "sha256:f7db0b6ae1f96ae41afe626095149ecd1b212b424626175a6633c2999eaad45b" + "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca", + "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d", + "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6", + "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989", + "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c", + "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b", + "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223", + "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f", + "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56", + "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3", + "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8", + "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb", + "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388", + "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0", + "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a", + "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8", + "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f", + "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a", + "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962", + "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8", + "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391", + "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc", + "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2", + "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155", + "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb", + "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0", + "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c", + "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a", + "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004", + "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060", + "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232", + "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93", + "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129", + "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163", + "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de", + "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6", + "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23", + "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569", + "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d", + "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778", + "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d", + "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36", + "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a", + "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6", + "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34", + "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704", + "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106", + "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9", + "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862", + "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b", + "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255", + "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16", + "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3", + "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133", + "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb", + "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657", + "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d", + "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca", + "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36", + "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c", + "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e", + "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff", + "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7", + "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5", + "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02", + "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c", + "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df", + "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3", + "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a", + "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959", + "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234", + "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==7.6.0" + "version": "==7.6.1" }, "docker": { "hashes": [ @@ -1874,11 +1958,11 @@ }, "idna": { "hashes": [ - "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", - "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0" + "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac", + "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603" ], - "markers": "python_version >= '3.5'", - "version": "==3.7" + "markers": "python_version >= '3.6'", + "version": "==3.8" }, "iniconfig": { "hashes": [ @@ -1890,20 +1974,21 @@ }, "minio": { "hashes": [ - "sha256:473d5d53d79f340f3cd632054d0c82d2f93177ce1af2eac34a235bea55708d98", - "sha256:59d1f255d852fe7104018db75b3bebbd987e538690e680f7c5de835e422de837" + "sha256:aa3b485788b63b12406a5798465d12a57e4be2ac2a58a8380959b6b748e64ddd", + "sha256:f8af2dafc22ebe1aef3ac181b8e217037011c430aa6da276ed627e55aaf7c815" ], "index": "pypi", - "version": "==7.2.7" + "markers": "python_version >= '3.9'", + "version": "==7.2.8" }, "opensearch-py": { "hashes": [ - "sha256:0b7c27e8ed84c03c99558406927b6161f186a72502ca6d0325413d8e5523ba96", - "sha256:b6e78b685dd4e9c016d7a4299cf1de69e299c88322e3f81c716e6e23fe5683c1" + "sha256:5417650eba98a1c7648e502207cebf3a12beab623ffe0ebbf55f9b1b4b6e44e9", + "sha256:67ab76e9373669bc71da417096df59827c08369ac3795d5438c9a8be21cbd759" ], "index": "pypi", "markers": "python_version >= '3.8' and python_version < '4'", - "version": "==2.6.0" + "version": "==2.7.1" }, "packaging": { "hashes": [ @@ -1969,12 +2054,12 @@ }, "pytest": { "hashes": [ - "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5", - "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce" + "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181", + "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==8.3.2" + "version": "==8.3.3" }, "python-dateutil": { "hashes": [ @@ -2038,16 +2123,16 @@ "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" ], - "markers": "python_version >= '3.8'", + "markers": "python_version < '3.13'", "version": "==4.12.2" }, "urllib3": { "hashes": [ - "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472", - "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168" + "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", + "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9" ], - "markers": "python_version >= '3.8'", - "version": "==2.2.2" + "markers": "python_version >= '3.10'", + "version": "==2.2.3" }, "wrapt": { "hashes": [ diff --git a/dbrepo-analyse-service/app.py b/dbrepo-analyse-service/app.py index def401c0e28e5c16c264d5fd280e5435fc44c45e..651826558103cf1f9f0829663c24935995c4a6d1 100644 --- a/dbrepo-analyse-service/app.py +++ b/dbrepo-analyse-service/app.py @@ -188,7 +188,7 @@ template = { "info": { "title": "Database Repository Analyse Service API", "description": "Service that analyses data structures", - "version": "1.4.5", + "version": "1.4.6", "contact": { "name": "Prof. Andreas Rauber", "email": "andreas.rauber@tuwien.ac.at" @@ -200,7 +200,7 @@ template = { }, "externalDocs": { "description": "Sourcecode Documentation", - "url": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.4.5/" + "url": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.4.6/" }, "servers": [ { diff --git a/dbrepo-analyse-service/lib/dbrepo-1.4.6.tar.gz b/dbrepo-analyse-service/lib/dbrepo-1.4.6.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..958287917e7f2b38a0286c3e91c2d471462bceee Binary files /dev/null and b/dbrepo-analyse-service/lib/dbrepo-1.4.6.tar.gz differ diff --git a/dbrepo-analyse-service/lib/dbrepo-1.4.6rc1-py3-none-any.whl b/dbrepo-analyse-service/lib/dbrepo-1.4.6rc1-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..83944ce88d8aec5a3b767aa09caf9a8700323104 Binary files /dev/null and b/dbrepo-analyse-service/lib/dbrepo-1.4.6rc1-py3-none-any.whl differ diff --git a/dbrepo-analyse-service/lib/dbrepo-1.4.6rc1.tar.gz b/dbrepo-analyse-service/lib/dbrepo-1.4.6rc1.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..a0c8432134f3c21359cd7fb8ee1a341812a6c034 Binary files /dev/null and b/dbrepo-analyse-service/lib/dbrepo-1.4.6rc1.tar.gz differ diff --git a/dbrepo-auth-service/dbrepo-realm.json b/dbrepo-auth-service/dbrepo-realm.json index a39f7de1b0ab0611057af4890ee281bb202609ca..e057f778d4796aa1fd90c94c920a4abcec720de2 100644 --- a/dbrepo-auth-service/dbrepo-realm.json +++ b/dbrepo-auth-service/dbrepo-realm.json @@ -530,7 +530,7 @@ "description" : "${default-container-handling}", "composite" : true, "composites" : { - "realm" : [ "find-container", "list-containers" ] + "realm" : [ "find-container" ] }, "clientRole" : false, "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", @@ -2143,7 +2143,7 @@ "subType" : "anonymous", "subComponents" : { }, "config" : { - "allowed-protocol-mapper-types" : [ "oidc-full-name-mapper", "saml-user-attribute-mapper", "saml-user-property-mapper", "saml-role-list-mapper", "oidc-usermodel-attribute-mapper", "oidc-usermodel-property-mapper", "oidc-address-mapper", "oidc-sha256-pairwise-sub-mapper" ] + "allowed-protocol-mapper-types" : [ "saml-user-attribute-mapper", "oidc-full-name-mapper", "oidc-sha256-pairwise-sub-mapper", "oidc-address-mapper", "saml-user-property-mapper", "oidc-usermodel-property-mapper", "oidc-usermodel-attribute-mapper", "saml-role-list-mapper" ] } }, { "id" : "1849e52a-b8c9-44a8-af3d-ee19376a1ed1", @@ -2169,7 +2169,7 @@ "subType" : "authenticated", "subComponents" : { }, "config" : { - "allowed-protocol-mapper-types" : [ "saml-user-property-mapper", "oidc-usermodel-property-mapper", "saml-role-list-mapper", "oidc-address-mapper", "saml-user-attribute-mapper", "oidc-full-name-mapper", "oidc-sha256-pairwise-sub-mapper", "oidc-usermodel-attribute-mapper" ] + "allowed-protocol-mapper-types" : [ "saml-role-list-mapper", "oidc-sha256-pairwise-sub-mapper", "oidc-full-name-mapper", "oidc-usermodel-property-mapper", "oidc-usermodel-attribute-mapper", "saml-user-property-mapper", "saml-user-attribute-mapper", "oidc-address-mapper" ] } } ], "org.keycloak.storage.UserStorageProvider" : [ { @@ -2185,8 +2185,8 @@ "config" : { "ldap.attribute" : [ "createTimestamp" ], "is.mandatory.in.ldap" : [ "false" ], - "always.read.value.from.ldap" : [ "true" ], "read.only" : [ "true" ], + "always.read.value.from.ldap" : [ "true" ], "user.model.attribute" : [ "createTimestamp" ] } }, { @@ -2209,8 +2209,8 @@ "config" : { "ldap.attribute" : [ "cn" ], "is.mandatory.in.ldap" : [ "true" ], - "read.only" : [ "false" ], "always.read.value.from.ldap" : [ "true" ], + "read.only" : [ "false" ], "user.model.attribute" : [ "firstName" ] } }, { @@ -2221,8 +2221,8 @@ "config" : { "ldap.attribute" : [ "mail" ], "is.mandatory.in.ldap" : [ "false" ], - "read.only" : [ "false" ], "always.read.value.from.ldap" : [ "false" ], + "read.only" : [ "false" ], "user.model.attribute" : [ "email" ] } }, { @@ -2238,10 +2238,10 @@ "groups.dn" : [ "ou=users,dc=dbrepo,dc=at" ], "mode" : [ "LDAP_ONLY" ], "user.roles.retrieve.strategy" : [ "LOAD_GROUPS_BY_MEMBER_ATTRIBUTE" ], - "membership.ldap.attribute" : [ "member" ], "ignore.missing.groups" : [ "false" ], - "group.object.classes" : [ "groupOfNames" ], + "membership.ldap.attribute" : [ "member" ], "memberof.ldap.attribute" : [ "memberOf" ], + "group.object.classes" : [ "groupOfNames" ], "groups.path" : [ "/" ], "drop.non.existing.groups.during.sync" : [ "false" ] } @@ -2253,8 +2253,8 @@ "config" : { "ldap.attribute" : [ "modifyTimestamp" ], "is.mandatory.in.ldap" : [ "false" ], - "always.read.value.from.ldap" : [ "true" ], "read.only" : [ "true" ], + "always.read.value.from.ldap" : [ "true" ], "user.model.attribute" : [ "modifyTimestamp" ] } }, { @@ -2267,15 +2267,15 @@ "is.mandatory.in.ldap" : [ "true" ], "attribute.force.default" : [ "false" ], "is.binary.attribute" : [ "false" ], - "always.read.value.from.ldap" : [ "false" ], "read.only" : [ "false" ], + "always.read.value.from.ldap" : [ "false" ], "user.model.attribute" : [ "username" ] } } ] }, "config" : { - "pagination" : [ "false" ], "fullSyncPeriod" : [ "-1" ], + "pagination" : [ "false" ], "startTls" : [ "false" ], "usersDn" : [ "ou=users,dc=dbrepo,dc=at" ], "connectionPooling" : [ "true" ], @@ -2283,9 +2283,9 @@ "useKerberosForPasswordAuthentication" : [ "false" ], "importEnabled" : [ "true" ], "enabled" : [ "true" ], - "usernameLDAPAttribute" : [ "uid" ], - "bindCredential" : [ "admin" ], "bindDn" : [ "cn=admin,dc=dbrepo,dc=at" ], + "bindCredential" : [ "admin" ], + "usernameLDAPAttribute" : [ "uid" ], "changedSyncPeriod" : [ "-1" ], "lastSync" : [ "1719252666" ], "vendor" : [ "other" ], diff --git a/dbrepo-data-service/pom.xml b/dbrepo-data-service/pom.xml index fa6f32a02f94b182dbbe3b50ed6385521bcd03cb..4495ec2f073ef2a92c014604d3bfee90de6707fb 100644 --- a/dbrepo-data-service/pom.xml +++ b/dbrepo-data-service/pom.xml @@ -11,7 +11,7 @@ <groupId>at.tuwien</groupId> <artifactId>dbrepo-data-service</artifactId> <name>dbrepo-data-service</name> - <version>1.4.5</version> + <version>1.4.6</version> <description>Service that manages the data</description> diff --git a/dbrepo-data-service/querystore/pom.xml b/dbrepo-data-service/querystore/pom.xml index 57bb5dd76ca4f08668eab02c0391ef54a7ea5fa5..3d301be50f460d547e635cf27d9bbd64e17c3261 100644 --- a/dbrepo-data-service/querystore/pom.xml +++ b/dbrepo-data-service/querystore/pom.xml @@ -6,12 +6,12 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-data-service</artifactId> - <version>1.4.5</version> + <version>1.4.6</version> </parent> <artifactId>dbrepo-data-service-querystore</artifactId> <name>dbrepo-data-service-querystore</name> - <version>1.4.5</version> + <version>1.4.6</version> <dependencies/> diff --git a/dbrepo-data-service/report/pom.xml b/dbrepo-data-service/report/pom.xml index 10663ef86dfa470e69a0254308d00761af5f7a44..76bce1e9290ecf4a74283c0f1f95d9575617f67e 100644 --- a/dbrepo-data-service/report/pom.xml +++ b/dbrepo-data-service/report/pom.xml @@ -6,12 +6,12 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-data-service</artifactId> - <version>1.4.5</version> + <version>1.4.6</version> </parent> <artifactId>report</artifactId> <name>dbrepo-data-service-report</name> - <version>1.4.5</version> + <version>1.4.6</version> <description> This module is only intended for the pipeline coverage report. See the detailed report in the respective modules diff --git a/dbrepo-data-service/rest-service/pom.xml b/dbrepo-data-service/rest-service/pom.xml index 9eb7ec933b8a66a8984d900f2382b838e2c6b2d5..214912d816594f01618f0d631b224e1246be29bf 100644 --- a/dbrepo-data-service/rest-service/pom.xml +++ b/dbrepo-data-service/rest-service/pom.xml @@ -6,18 +6,18 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-data-service</artifactId> - <version>1.4.5</version> + <version>1.4.6</version> </parent> <artifactId>rest-service</artifactId> <name>dbrepo-data-service-rest-service</name> - <version>1.4.5</version> + <version>1.4.6</version> <dependencies> <dependency> <groupId>at.tuwien</groupId> <artifactId>services</artifactId> - <version>1.4.5</version> + <version>1.4.6</version> </dependency> </dependencies> diff --git a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/SubsetEndpoint.java b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/SubsetEndpoint.java index a7c74946923a36f639ae692e6d153881bcc2401f..507d9f33bd4ad66dba9094b2f6bf4311a761f0b0 100644 --- a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/SubsetEndpoint.java +++ b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/SubsetEndpoint.java @@ -1,7 +1,6 @@ package at.tuwien.endpoints; import at.tuwien.ExportResourceDto; -import at.tuwien.api.database.DatabaseDto; import at.tuwien.api.database.internal.PrivilegedDatabaseDto; import at.tuwien.api.database.query.ExecuteStatementDto; import at.tuwien.api.database.query.QueryDto; @@ -39,6 +38,7 @@ import java.security.Principal; import java.sql.SQLException; import java.time.Instant; import java.util.List; +import java.util.UUID; @Log4j2 @RestController @@ -194,9 +194,8 @@ public class SubsetEndpoint { @PostMapping @Observed(name = "dbrepo_subset_create") - @PreAuthorize("hasAuthority('execute-query')") @Operation(summary = "Create subset", - description = "Creates a subset in the query store of the data database. Requires role `execute-query`", + description = "Creates a subset in the query store of the data database. Requires role `execute-query` for private databases.", security = {@SecurityRequirement(name = "basicAuth"), @SecurityRequirement(name = "bearerAuth")}) @ApiResponses(value = { @ApiResponse(responseCode = "201", @@ -237,7 +236,7 @@ public class SubsetEndpoint { }) public ResponseEntity<QueryResultDto> create(@NotNull @PathVariable("databaseId") Long databaseId, @Valid @RequestBody ExecuteStatementDto data, - @NotNull Principal principal, + Principal principal, @RequestParam(required = false) Long page, @RequestParam(required = false) Long size, @RequestParam(required = false) Instant timestamp) @@ -245,13 +244,19 @@ public class SubsetEndpoint { QueryNotFoundException, StorageUnavailableException, QueryMalformedException, SidecarExportException, StorageNotFoundException, QueryStoreInsertException, TableMalformedException, PaginationException, QueryNotSupportedException, NotAllowedException, UserNotFoundException, MetadataServiceException { - log.debug("endpoint create subset in database, databaseId={}, data.statement={}, principal.name={}, " + - "page={}, size={}, timestamp={}", databaseId, data.getStatement(), principal.getName(), page, size, + log.debug("endpoint create subset in database, databaseId={}, data.statement={}, page={}, size={}, " + + "timestamp={}", databaseId, data.getStatement(), page, size, timestamp); /* check */ endpointValidator.validateDataParams(page, size); endpointValidator.validateForbiddenStatements(data.getStatement()); /* parameters */ + final UUID userId; + if (principal == null) { + userId = metadataServiceGateway.getSystemUserId(); + } else { + userId = UserUtil.getId(principal); + } if (page == null) { page = 0L; log.debug("page not set: default to {}", page); @@ -268,8 +273,8 @@ public class SubsetEndpoint { final PrivilegedDatabaseDto database = metadataServiceGateway.getDatabaseById(databaseId); final QueryResultDto queryResult; try { - queryResult = subsetService.execute(database, data.getStatement(), timestamp, UserUtil.getId(principal), - page, size, null, null); + queryResult = subsetService.execute(database, data.getStatement(), timestamp, userId, page, size, null, + null); } catch (SQLException e) { log.error("Failed to establish connection to database: {}", e.getMessage()); throw new DatabaseUnavailableException("Failed to establish connection to database: " + e.getMessage(), e); @@ -344,9 +349,9 @@ public class SubsetEndpoint { } try { final QueryDto query = subsetService.findById(database, subsetId); - final HttpHeaders headers = new HttpHeaders(); - headers.set("Access-Control-Expose-Headers", "X-Count"); if (request.getMethod().equals("HEAD")) { + final HttpHeaders headers = new HttpHeaders(); + headers.set("Access-Control-Expose-Headers", "X-Count"); final Long count = subsetService.reExecuteCount(database, query); headers.set("X-Count", "" + count); return ResponseEntity.ok() @@ -357,7 +362,6 @@ public class SubsetEndpoint { result.setId(subsetId); log.trace("re-execute query resulted in result {}", result); return ResponseEntity.ok() - .headers(headers) .body(result); } catch (SQLException e) { log.error("Failed to establish connection to database: {}", e.getMessage()); @@ -411,8 +415,8 @@ public class SubsetEndpoint { DatabaseUnavailableException, QueryNotFoundException, UserNotFoundException, MetadataServiceException { log.debug("endpoint persist query, databaseId={}, queryId={}, data.persist={}, principal.name={}", databaseId, queryId, data.getPersist(), principal.getName()); - metadataServiceGateway.getAccess(databaseId, UserUtil.getId(principal)); final PrivilegedDatabaseDto database = metadataServiceGateway.getDatabaseById(databaseId); + metadataServiceGateway.getAccess(databaseId, UserUtil.getId(principal)); try { subsetService.persist(database, queryId, data.getPersist()); final QueryDto dto = subsetService.findById(database, queryId); diff --git a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java index e26a37b43aaa1b5307cf87d294e1dedc5cef87c4..4af577bed5771e66502ab48e78509c096666d151 100644 --- a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java +++ b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java @@ -99,6 +99,12 @@ public class TableEndpoint { RemoteUnavailableException, TableMalformedException, DatabaseUnavailableException, TableExistsException, TableNotFoundException, QueryMalformedException, MetadataServiceException { log.debug("endpoint create table, databaseId={}, data.name={}", databaseId, data.getName()); + /* check */ + if (data.getConstraints().getPrimaryKey().isEmpty()) { + log.error("Table must have a primary key"); + throw new TableMalformedException("Table must have a primary key"); + } + /* create */ final PrivilegedDatabaseDto database = metadataServiceGateway.getDatabaseById(databaseId); try { return ResponseEntity.status(HttpStatus.CREATED) @@ -218,13 +224,12 @@ public class TableEndpoint { log.error("Failed find table data: authentication required"); throw new NotAllowedException("Failed to find table data: authentication required"); } - final DatabaseAccessDto access = metadataServiceGateway.getAccess(databaseId, UserUtil.getId(principal)); - endpointValidator.validateOnlyWriteOwnOrWriteAllAccess(access.getType(), table.getOwner().getId(), UserUtil.getId(principal)); + metadataServiceGateway.getAccess(databaseId, UserUtil.getId(principal)); } - final HttpHeaders headers = new HttpHeaders(); - headers.set("Access-Control-Expose-Headers", "X-Count"); try { if (request.getMethod().equals("HEAD")) { + final HttpHeaders headers = new HttpHeaders(); + headers.set("Access-Control-Expose-Headers", "X-Count"); headers.set("X-Count", "" + tableService.getCount(table, timestamp)); return ResponseEntity.ok() .headers(headers) @@ -232,7 +237,6 @@ public class TableEndpoint { } final QueryResultDto dto = tableService.getData(table, timestamp, page, size); return ResponseEntity.ok() - .headers(headers) .body(dto); } catch (SQLException e) { log.error("Failed to establish connection to database: {}", e.getMessage()); @@ -542,10 +546,10 @@ public class TableEndpoint { mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), }) - public ResponseEntity<InputStreamResource> exportData(@NotBlank @PathVariable("databaseId") Long databaseId, - @NotBlank @PathVariable("tableId") Long tableId, - @RequestParam(required = false) Instant timestamp, - Principal principal) + public ResponseEntity<InputStreamResource> exportDataset(@NotBlank @PathVariable("databaseId") Long databaseId, + @NotBlank @PathVariable("tableId") Long tableId, + @RequestParam(required = false) Instant timestamp, + Principal principal) throws DatabaseUnavailableException, RemoteUnavailableException, TableNotFoundException, NotAllowedException, StorageUnavailableException, QueryMalformedException, SidecarExportException, StorageNotFoundException, MetadataServiceException { @@ -672,8 +676,7 @@ public class TableEndpoint { final PrivilegedTableDto table = metadataServiceGateway.getTableById(databaseId, tableId); table.setDatabase(metadataServiceGateway.getDatabaseById(databaseId)); try { - final TableStatisticDto dto = tableService.getStatistics(table); - return ResponseEntity.ok(dto); + return ResponseEntity.ok(tableService.getStatistics(table)); } catch (SQLException e) { log.error("Failed to establish connection to database: {}", e.getMessage()); throw new DatabaseUnavailableException("Failed to establish connection to database", e); diff --git a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java index e4ddab603685103027dcb6dfad936b882c987294..a4c07c3f55ff5ea2fab84b6293c7cc6a424c278c 100644 --- a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java +++ b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java @@ -264,9 +264,9 @@ public class ViewEndpoint { metadataServiceGateway.getAccess(databaseId, UserUtil.getId(principal)); } try { - final HttpHeaders headers = new HttpHeaders(); - headers.set("Access-Control-Expose-Headers", "X-Count"); if (request.getMethod().equals("HEAD")) { + final HttpHeaders headers = new HttpHeaders(); + headers.set("Access-Control-Expose-Headers", "X-Count"); headers.set("X-Count", "" + viewService.count(view, timestamp)); return ResponseEntity.ok() .headers(headers) @@ -275,7 +275,6 @@ public class ViewEndpoint { final QueryResultDto result = viewService.data(view, timestamp, page, size); log.trace("get view data resulted in result {}", result); return ResponseEntity.ok() - .headers(headers) .body(result); } catch (SQLException e) { log.error("Failed to establish connection to database: {}", e.getMessage()); diff --git a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/handlers/ApiExceptionHandler.java b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/handlers/ApiExceptionHandler.java index cbbb4c76b0c12e7846151746093728212a4d3b8d..6aa48b157082afe6686fccca36b375723cc3b44b 100644 --- a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/handlers/ApiExceptionHandler.java +++ b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/handlers/ApiExceptionHandler.java @@ -21,7 +21,14 @@ public class ApiExceptionHandler extends ResponseEntityExceptionHandler { @ResponseStatus(code = HttpStatus.UNAUTHORIZED) @ExceptionHandler(AccessDeniedException.class) public ResponseEntity<ApiErrorDto> handle(AccessDeniedException e) { - return generic_handle(e.getClass(), e.getLocalizedMessage()); + final HttpHeaders headers = new HttpHeaders(); + headers.set("Content-Type", "application/problem+json"); + final ApiErrorDto response = ApiErrorDto.builder() + .code("error.access.denied") + .message(e.getLocalizedMessage()) + .status(HttpStatus.UNAUTHORIZED) + .build(); + return new ResponseEntity<>(response, headers, HttpStatus.UNAUTHORIZED); } @Hidden @@ -87,6 +94,13 @@ public class ApiExceptionHandler extends ResponseEntityExceptionHandler { return generic_handle(e.getClass(), e.getLocalizedMessage()); } + @Hidden + @ResponseStatus(code = HttpStatus.LOCKED) + @ExceptionHandler(ContainerQuotaException.class) + public ResponseEntity<ApiErrorDto> handle(ContainerQuotaException e) { + return generic_handle(e.getClass(), e.getLocalizedMessage()); + } + @Hidden @ResponseStatus(code = HttpStatus.FORBIDDEN) @ExceptionHandler(CredentialsInvalidException.class) @@ -472,7 +486,7 @@ public class ApiExceptionHandler extends ResponseEntityExceptionHandler { return generic_handle(e.getClass(), e.getLocalizedMessage()); } - private ResponseEntity<ApiErrorDto> generic_handle(Class<?> exceptionClass, String message) { + public ResponseEntity<ApiErrorDto> generic_handle(Class<?> exceptionClass, String message) { final HttpHeaders headers = new HttpHeaders(); headers.set("Content-Type", "application/problem+json"); final ResponseStatus annotation = exceptionClass.getAnnotation(ResponseStatus.class); diff --git a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/validation/EndpointValidator.java b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/validation/EndpointValidator.java index cf868742400bc407c18d57c58984bcae7a7883ca..3cbb865293553e91a6730cfd731c62bbfc79c915 100644 --- a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/validation/EndpointValidator.java +++ b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/validation/EndpointValidator.java @@ -73,7 +73,7 @@ public class EndpointValidator { log.error("Failed to create table data: insufficient table write access"); throw new NotAllowedException("Failed to create table data: insufficient table write access"); } - log.trace("sufficient write access {}", access); + log.trace("sufficient write access {} for user {} and owner {}", access, user, owner); } diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/config/MariaDbConfig.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/config/MariaDbConfig.java index 8f73fa1b53b41be7d8cbfbe71f25a27c94ccbb01..b0c332a63b5b87e786ca928daa7bc8bfa8a7ed3c 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/config/MariaDbConfig.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/config/MariaDbConfig.java @@ -320,6 +320,27 @@ public class MariaDbConfig { return rows; } + public static List<Map<String, byte[]>> selectQueryByteArr(PrivilegedDatabaseDto database, String query, Set<String> columns) + throws SQLException { + final String jdbc = "jdbc:mariadb://" + database.getContainer().getHost() + ":" + database.getContainer().getPort() + "/" + database.getInternalName(); + log.trace("connect to database {}", jdbc); + final List<Map<String, byte[]>> rows = new LinkedList<>(); + try (Connection connection = DriverManager.getConnection(jdbc, database.getContainer().getUsername(), database.getContainer().getPassword())) { + final Statement statement = connection.createStatement(); + log.trace("execute query: {}", query); + final ResultSet result = statement.executeQuery(query); + log.trace("map result set to columns: {}", columns); + while (result.next()) { + final Map<String, byte[]> row = new HashMap<>(); + for (String column : columns) { + row.put(column, result.getBytes(column)); + } + rows.add(row); + } + } + return rows; + } + public static void execute(PrivilegedDatabaseDto database, String query) throws SQLException { final String jdbc = "jdbc:mariadb://" + database.getContainer().getHost() + ":" + database.getContainer().getPort() + "/" + database.getInternalName(); diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/config/MariaDbContainerConfig.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/config/MariaDbContainerConfig.java index 62f095c82e79df65bd5a9407f735a432dedd502c..74da5a9eb13c6e541f67f660e09e98ea8986a2d0 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/config/MariaDbContainerConfig.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/config/MariaDbContainerConfig.java @@ -1,11 +1,15 @@ package at.tuwien.config; import at.tuwien.test.BaseTest; +import org.codehaus.plexus.util.FileUtils; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.testcontainers.containers.MariaDBContainer; import org.testcontainers.images.PullPolicy; +import java.io.File; +import java.io.IOException; + /** * This class configures the MariaDB container for the integration tests. */ diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/AccessEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/AccessEndpointUnitTest.java index 1dc008dbebffdd0a02ef0ffb12a12b9f6e8e6f08..3beb5626b3b8a2a001ac365a376cffea68b7b3ee 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/AccessEndpointUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/AccessEndpointUnitTest.java @@ -1,5 +1,6 @@ package at.tuwien.endpoint; +import at.tuwien.api.database.AccessTypeDto; import at.tuwien.api.database.internal.PrivilegedDatabaseDto; import at.tuwien.api.user.UserDto; import at.tuwien.endpoints.AccessEndpoint; @@ -73,6 +74,26 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { }); } + @Test + @WithMockUser(username = USER_LOCAL_ADMIN_USERNAME, authorities = {"system"}) + public void create_unavailable_fails() throws UserNotFoundException, DatabaseNotFoundException, + RemoteUnavailableException, MetadataServiceException, SQLException, DatabaseMalformedException { + + /* mock */ + when(metadataServiceGateway.getDatabaseById(DATABASE_1_ID)) + .thenReturn(DATABASE_1_PRIVILEGED_DTO); + when(metadataServiceGateway.getPrivilegedUserById(USER_4_ID)) + .thenReturn(USER_4_PRIVILEGED_DTO); + doThrow(SQLException.class) + .when(accessService) + .create(DATABASE_1_PRIVILEGED_DTO, USER_4_PRIVILEGED_DTO, AccessTypeDto.READ); + + /* test */ + assertThrows(DatabaseUnavailableException.class, () -> { + accessEndpoint.create(DATABASE_1_ID, USER_4_ID, UPDATE_DATABASE_ACCESS_READ_DTO); + }); + } + @Test @WithMockUser(username = USER_LOCAL_ADMIN_USERNAME, authorities = {"system"}) public void create_databaseNotFound_fails() throws DatabaseNotFoundException, RemoteUnavailableException, @@ -125,13 +146,50 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { /* mock */ when(metadataServiceGateway.getDatabaseById(DATABASE_1_ID)) .thenReturn(DATABASE_1_PRIVILEGED_DTO); - when(metadataServiceGateway.getPrivilegedUserById(USER_1_ID)) - .thenReturn(USER_1_PRIVILEGED_DTO); + when(metadataServiceGateway.getUserById(USER_1_ID)) + .thenReturn(USER_1_DTO); /* test */ accessEndpoint.update(DATABASE_1_ID, USER_1_ID, UPDATE_DATABASE_ACCESS_READ_DTO); } + @Test + @WithMockUser(username = USER_LOCAL_ADMIN_USERNAME, authorities = {"system"}) + public void update_unavailable_fails() throws DatabaseNotFoundException, RemoteUnavailableException, SQLException, + UserNotFoundException, DatabaseMalformedException, MetadataServiceException { + + /* mock */ + when(metadataServiceGateway.getDatabaseById(DATABASE_1_ID)) + .thenReturn(DATABASE_1_PRIVILEGED_DTO); + when(metadataServiceGateway.getUserById(USER_1_ID)) + .thenReturn(USER_1_DTO); + doThrow(SQLException.class) + .when(accessService) + .update(DATABASE_1_PRIVILEGED_DTO, USER_1_DTO, AccessTypeDto.READ); + + /* test */ + assertThrows(DatabaseUnavailableException.class, () -> { + accessEndpoint.update(DATABASE_1_ID, USER_1_ID, UPDATE_DATABASE_ACCESS_READ_DTO); + }); + } + + @Test + @WithMockUser(username = USER_LOCAL_ADMIN_USERNAME, authorities = {"system"}) + public void update_noAccess_fails() throws DatabaseNotFoundException, RemoteUnavailableException, + UserNotFoundException, MetadataServiceException { + + /* mock */ + when(metadataServiceGateway.getDatabaseById(DATABASE_1_ID)) + .thenReturn(DATABASE_1_PRIVILEGED_DTO); + when(metadataServiceGateway.getUserById(USER_4_ID)) + .thenReturn(USER_4_DTO); + + /* test */ + assertThrows(NotAllowedException.class, () -> { + accessEndpoint.update(DATABASE_1_ID, USER_4_ID, UPDATE_DATABASE_ACCESS_READ_DTO); + }); + } + @Test @WithMockUser(username = USER_LOCAL_ADMIN_USERNAME) public void update_noRole_fails() { @@ -195,6 +253,23 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { accessEndpoint.revoke(DATABASE_1_ID, USER_1_ID); } + @Test + @WithMockUser(username = USER_LOCAL_ADMIN_USERNAME, authorities = {"system"}) + public void revoke_noAccess_fails() throws UserNotFoundException, DatabaseNotFoundException, + RemoteUnavailableException, MetadataServiceException { + + /* mock */ + when(metadataServiceGateway.getDatabaseById(DATABASE_1_ID)) + .thenReturn(DATABASE_1_PRIVILEGED_DTO); + when(metadataServiceGateway.getPrivilegedUserById(USER_4_ID)) + .thenReturn(USER_4_PRIVILEGED_DTO); + + /* test */ + assertThrows(NotAllowedException.class, () -> { + accessEndpoint.revoke(DATABASE_1_ID, USER_4_ID); + }); + } + @Test @WithMockUser(username = USER_LOCAL_ADMIN_USERNAME) public void revoke_noRole_fails() { @@ -239,4 +314,24 @@ public class AccessEndpointUnitTest extends AbstractUnitTest { }); } + @Test + @WithMockUser(username = USER_LOCAL_ADMIN_USERNAME, authorities = {"system"}) + public void revoke_unavailable_fails() throws DatabaseNotFoundException, RemoteUnavailableException, + UserNotFoundException, MetadataServiceException, SQLException, DatabaseMalformedException { + + /* mock */ + when(metadataServiceGateway.getDatabaseById(DATABASE_1_ID)) + .thenReturn(DATABASE_1_PRIVILEGED_DTO); + when(metadataServiceGateway.getUserById(USER_1_ID)) + .thenReturn(USER_1_DTO); + doThrow(SQLException.class) + .when(accessService) + .delete(DATABASE_1_PRIVILEGED_DTO, USER_1_DTO); + + /* test */ + assertThrows(DatabaseUnavailableException.class, () -> { + accessEndpoint.revoke(DATABASE_1_ID, USER_1_ID); + }); + } + } diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/DatabaseEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/DatabaseEndpointUnitTest.java index c2b04d5aa914b86ef3edde0ebdf5d82f130c1e40..067687c2ed3762481d800c1d1126c074d99c2fe4 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/DatabaseEndpointUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/DatabaseEndpointUnitTest.java @@ -1,6 +1,7 @@ package at.tuwien.endpoint; import at.tuwien.api.database.AccessTypeDto; +import at.tuwien.api.database.DatabaseDto; import at.tuwien.api.user.PrivilegedUserDto; import at.tuwien.endpoints.DatabaseEndpoint; import at.tuwien.exception.*; @@ -16,11 +17,14 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.junit.jupiter.SpringExtension; import java.sql.SQLException; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; @@ -54,10 +58,24 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_LOCAL_ADMIN_USERNAME, authorities = {"system"}) public void create_succeeds() throws DatabaseUnavailableException, RemoteUnavailableException, - QueryStoreCreateException, ContainerNotFoundException, DatabaseMalformedException, MetadataServiceException { + QueryStoreCreateException, ContainerNotFoundException, DatabaseMalformedException, + MetadataServiceException, SQLException { + + /* mock */ + when(metadataServiceGateway.getContainerById(CONTAINER_1_ID)) + .thenReturn(CONTAINER_1_PRIVILEGED_DTO); + when(databaseService.create(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_CREATE_INTERNAL)) + .thenReturn(DATABASE_1_PRIVILEGED_DTO); + doNothing() + .when(queryService) + .createQueryStore(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_INTERNALNAME); + doNothing() + .when(accessService) + .create(eq(DATABASE_1_PRIVILEGED_DTO), any(PrivilegedUserDto.class), any(AccessTypeDto.class)); /* test */ - databaseEndpoint.create(DATABASE_1_CREATE_INTERNAL); + final ResponseEntity<DatabaseDto> response = databaseEndpoint.create(DATABASE_1_CREATE_INTERNAL); + assertEquals(HttpStatus.CREATED, response.getStatusCode()); } @Test @@ -83,6 +101,24 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { }); } + @Test + @WithMockUser(username = USER_LOCAL_ADMIN_USERNAME, authorities = {"system"}) + public void create_unavailable_fails() throws RemoteUnavailableException, ContainerNotFoundException, + SQLException, DatabaseMalformedException, MetadataServiceException { + + /* mock */ + when(metadataServiceGateway.getContainerById(CONTAINER_1_ID)) + .thenReturn(CONTAINER_1_PRIVILEGED_DTO); + doThrow(SQLException.class) + .when(databaseService) + .create(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_CREATE_INTERNAL); + + /* test */ + assertThrows(DatabaseUnavailableException.class, () -> { + databaseEndpoint.create(DATABASE_1_CREATE_INTERNAL); + }); + } + @Test @WithMockUser(username = USER_LOCAL_ADMIN_USERNAME, authorities = {"system"}) public void create_containerNotFound_fails() throws RemoteUnavailableException, ContainerNotFoundException, @@ -125,10 +161,32 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { public void update_succeeds() throws DatabaseUnavailableException, RemoteUnavailableException, DatabaseMalformedException, DatabaseNotFoundException, MetadataServiceException { + /* mock */ + when(metadataServiceGateway.getDatabaseById(DATABASE_1_ID)) + .thenReturn(DATABASE_1_PRIVILEGED_DTO); + /* test */ databaseEndpoint.update(DATABASE_1_ID, USER_1_UPDATE_PASSWORD_DTO); } + @Test + @WithMockUser(username = USER_LOCAL_ADMIN_USERNAME, authorities = {"system"}) + public void update_unavailable_fails() throws RemoteUnavailableException, DatabaseMalformedException, + DatabaseNotFoundException, MetadataServiceException, SQLException { + + /* mock */ + when(metadataServiceGateway.getDatabaseById(DATABASE_1_ID)) + .thenReturn(DATABASE_1_PRIVILEGED_DTO); + doThrow(SQLException.class) + .when(databaseService) + .update(DATABASE_1_PRIVILEGED_DTO, USER_1_UPDATE_PASSWORD_DTO); + + /* test */ + assertThrows(DatabaseUnavailableException.class, () -> { + databaseEndpoint.update(DATABASE_1_ID, USER_1_UPDATE_PASSWORD_DTO); + }); + } + @Test @WithMockUser(username = USER_LOCAL_ADMIN_USERNAME) public void update_noRole_fails() throws RemoteUnavailableException, DatabaseNotFoundException, MetadataServiceException { diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/SubsetEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/SubsetEndpointUnitTest.java index 6a0015b6f61e567fbf65f2e8f97f6c568fe142fa..1c54280a222f294be84bdf5c24b5b8ee4e0e6caf 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/SubsetEndpointUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/SubsetEndpointUnitTest.java @@ -46,7 +46,7 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { private SubsetEndpoint subsetEndpoint; @MockBean - private SubsetService queryService; + private SubsetService subsetService; @MockBean private HttpServletRequest httpServletRequest; @@ -64,21 +64,43 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { @Test @WithAnonymousUser - public void findAllById_succeeds() throws DatabaseUnavailableException, NotAllowedException, QueryNotFoundException, + public void list_succeeds() throws DatabaseUnavailableException, NotAllowedException, QueryNotFoundException, DatabaseNotFoundException, RemoteUnavailableException, SQLException, MetadataServiceException { + /* mock */ + when(subsetService.findAll(DATABASE_3_PRIVILEGED_DTO, null)) + .thenReturn(List.of(QUERY_1_DTO, QUERY_2_DTO, QUERY_3_DTO, QUERY_4_DTO, QUERY_5_DTO, QUERY_6_DTO)); + /* test */ - final List<QueryDto> response = generic_findAllById(DATABASE_3_ID, DATABASE_3_PRIVILEGED_DTO); + final List<QueryDto> response = generic_list(DATABASE_3_ID, DATABASE_3_PRIVILEGED_DTO); assertEquals(6, response.size()); } @Test @WithAnonymousUser - public void findAllById_databaseNotFound_fails() { + public void list_databaseNotFound_fails() { /* test */ assertThrows(DatabaseNotFoundException.class, () -> { - generic_findAllById(null, null); + generic_list(null, null); + }); + } + + @Test + @WithAnonymousUser + public void list_unavailable_fails() throws NotAllowedException, SQLException, QueryNotFoundException, + DatabaseNotFoundException, RemoteUnavailableException, MetadataServiceException { + + /* mock */ + when(metadataServiceGateway.getDatabaseById(DATABASE_3_ID)) + .thenReturn(DATABASE_3_PRIVILEGED_DTO); + doThrow(SQLException.class) + .when(subsetService) + .findAll(DATABASE_3_PRIVILEGED_DTO, null); + + /* test */ + assertThrows(DatabaseUnavailableException.class, () -> { + generic_list(DATABASE_3_ID, DATABASE_3_PRIVILEGED_DTO); }); } @@ -92,9 +114,28 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { /* mock */ when(metadataServiceGateway.getDatabaseById(DATABASE_3_ID)) .thenReturn(DATABASE_3_PRIVILEGED_DTO); + when(subsetService.findById(DATABASE_3_PRIVILEGED_DTO, QUERY_5_ID)) + .thenReturn(QUERY_5_DTO); /* test */ - generic_findById(QUERY_5_ID, QUERY_5_DTO, MediaType.APPLICATION_JSON, null); + generic_findById(QUERY_5_ID, MediaType.APPLICATION_JSON, null); + } + + @Test + @WithAnonymousUser + public void findById_format_fails() throws DatabaseNotFoundException, RemoteUnavailableException, SQLException, + UserNotFoundException, NotAllowedException, QueryNotFoundException, MetadataServiceException { + + /* mock */ + when(metadataServiceGateway.getDatabaseById(DATABASE_3_ID)) + .thenReturn(DATABASE_3_PRIVILEGED_DTO); + when(subsetService.findById(DATABASE_3_PRIVILEGED_DTO, QUERY_5_ID)) + .thenReturn(QUERY_5_DTO); + + /* test */ + assertThrows(FormatNotAvailableException.class, () -> { + generic_findById(QUERY_5_ID, MediaType.APPLICATION_PDF, null); + }); } @Test @@ -111,11 +152,13 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { /* mock */ when(metadataServiceGateway.getDatabaseById(DATABASE_3_ID)) .thenReturn(DATABASE_3_PRIVILEGED_DTO); - when(queryService.export(any(PrivilegedDatabaseDto.class), any(QueryDto.class), any(Instant.class), anyString())) + when(subsetService.findById(DATABASE_3_PRIVILEGED_DTO, QUERY_5_ID)) + .thenReturn(QUERY_5_DTO); + when(subsetService.export(any(PrivilegedDatabaseDto.class), any(QueryDto.class), any(Instant.class), anyString())) .thenReturn(mock); /* test */ - generic_findById(QUERY_5_ID, QUERY_5_DTO, MediaType.parseMediaType("text/csv"), null); + generic_findById(QUERY_5_ID, MediaType.parseMediaType("text/csv"), null); } @Test @@ -132,16 +175,18 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { /* mock */ when(metadataServiceGateway.getDatabaseById(DATABASE_3_ID)) .thenReturn(DATABASE_3_PRIVILEGED_DTO); - when(queryService.export(any(PrivilegedDatabaseDto.class), any(QueryDto.class), any(Instant.class), anyString())) + when(subsetService.findById(DATABASE_3_PRIVILEGED_DTO, QUERY_5_ID)) + .thenReturn(QUERY_5_DTO); + when(subsetService.export(any(PrivilegedDatabaseDto.class), any(QueryDto.class), any(Instant.class), anyString())) .thenReturn(mock); /* test */ - generic_findById(QUERY_5_ID, QUERY_5_DTO, MediaType.parseMediaType("text/csv"), Instant.now()); + generic_findById(QUERY_5_ID, MediaType.parseMediaType("text/csv"), Instant.now()); } @Test @WithAnonymousUser - public void findById_fails() throws DatabaseNotFoundException, RemoteUnavailableException, MetadataServiceException { + public void findById_notFound_fails() throws DatabaseNotFoundException, RemoteUnavailableException, MetadataServiceException { /* mock */ doThrow(DatabaseNotFoundException.class) @@ -150,7 +195,53 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { /* test */ assertThrows(DatabaseNotFoundException.class, () -> { - generic_findById(QUERY_5_ID, QUERY_5_DTO, MediaType.APPLICATION_JSON, null); + generic_findById(QUERY_5_ID, MediaType.APPLICATION_JSON, null); + }); + } + + @Test + @WithAnonymousUser + public void findById_unavailable_fails() throws DatabaseNotFoundException, RemoteUnavailableException, + MetadataServiceException, SQLException, UserNotFoundException, NotAllowedException, QueryNotFoundException { + + /* mock */ + when(metadataServiceGateway.getDatabaseById(DATABASE_3_ID)) + .thenReturn(DATABASE_3_PRIVILEGED_DTO); + doThrow(SQLException.class) + .when(subsetService) + .findById(DATABASE_3_PRIVILEGED_DTO, QUERY_5_ID); + + /* test */ + assertThrows(DatabaseUnavailableException.class, () -> { + generic_findById(QUERY_5_ID, MediaType.APPLICATION_JSON, null); + }); + } + + @Test + @WithAnonymousUser + public void findById_unavailableExport_fails() throws DatabaseNotFoundException, RemoteUnavailableException, + MetadataServiceException, SQLException, StorageUnavailableException, QueryMalformedException, + SidecarExportException, StorageNotFoundException, UserNotFoundException, NotAllowedException, + QueryNotFoundException { + final ExportResourceDto mock = ExportResourceDto.builder() + .filename("deadbeef") + .resource(new InputStreamResource(InputStream.nullInputStream())) + .build(); + + /* mock */ + when(metadataServiceGateway.getDatabaseById(DATABASE_3_ID)) + .thenReturn(DATABASE_3_PRIVILEGED_DTO); + when(subsetService.findById(DATABASE_3_PRIVILEGED_DTO, QUERY_5_ID)) + .thenReturn(QUERY_5_DTO); + when(subsetService.export(any(PrivilegedDatabaseDto.class), any(QueryDto.class), any(Instant.class), anyString())) + .thenReturn(mock); + doThrow(SQLException.class) + .when(subsetService) + .export(eq(DATABASE_3_PRIVILEGED_DTO), eq(QUERY_5_DTO), any(Instant.class), anyString()); + + /* test */ + assertThrows(DatabaseUnavailableException.class, () -> { + generic_findById(QUERY_5_ID, MediaType.parseMediaType("text/csv"), null); }); } @@ -168,7 +259,7 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { /* mock */ when(metadataServiceGateway.getDatabaseById(DATABASE_3_ID)) .thenReturn(DATABASE_3_PRIVILEGED_DTO); - when(queryService.execute(eq(DATABASE_3_PRIVILEGED_DTO), anyString(), any(Instant.class), eq(USER_1_ID), eq(0L), eq(10L), eq(null), eq(null))) + when(subsetService.execute(eq(DATABASE_3_PRIVILEGED_DTO), anyString(), any(Instant.class), eq(USER_1_ID), eq(0L), eq(10L), eq(null), eq(null))) .thenReturn(QUERY_5_RESULT_DTO); /* test */ @@ -202,13 +293,35 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { /* mock */ when(metadataServiceGateway.getDatabaseById(DATABASE_3_ID)) .thenReturn(DATABASE_3_PRIVILEGED_DTO); - when(queryService.execute(eq(DATABASE_3_PRIVILEGED_DTO), anyString(), any(Instant.class), eq(USER_1_ID), eq(0L), eq(10L), eq(null), eq(null))) + when(subsetService.execute(eq(DATABASE_3_PRIVILEGED_DTO), anyString(), any(Instant.class), eq(USER_1_ID), eq(0L), eq(10L), eq(null), eq(null))) .thenReturn(QUERY_5_RESULT_DTO); /* test */ subsetEndpoint.create(DATABASE_3_ID, request, USER_1_PRINCIPAL, null, null, null); } + @Test + @WithMockUser(username = USER_1_USERNAME, authorities = {"execute-query"}) + public void create_unavailable_succeeds() throws UserNotFoundException, QueryStoreInsertException, + TableMalformedException, NotAllowedException, QueryNotFoundException, DatabaseNotFoundException, + RemoteUnavailableException, SQLException, MetadataServiceException { + final ExecuteStatementDto request = ExecuteStatementDto.builder() + .statement(QUERY_5_STATEMENT) + .build(); + + /* mock */ + when(metadataServiceGateway.getDatabaseById(DATABASE_3_ID)) + .thenReturn(DATABASE_3_PRIVILEGED_DTO); + doThrow(SQLException.class) + .when(subsetService) + .execute(eq(DATABASE_3_PRIVILEGED_DTO), anyString(), any(Instant.class), eq(USER_1_ID), eq(0L), eq(10L), eq(null), eq(null)); + + /* test */ + assertThrows(DatabaseUnavailableException.class, () -> { + subsetEndpoint.create(DATABASE_3_ID, request, USER_1_PRINCIPAL, null, null, null); + }); + } + @Test @WithMockUser(username = USER_1_USERNAME, authorities = {"execute-query"}) public void create_databaseNotFound_fails() throws RemoteUnavailableException, @@ -230,15 +343,38 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_4_USERNAME) - public void create_noRole_fails() { + public void create_noRole_fails() throws DatabaseNotFoundException, RemoteUnavailableException, MetadataServiceException, UserNotFoundException, QueryStoreInsertException, TableMalformedException, NotAllowedException, SQLException, QueryNotFoundException, DatabaseUnavailableException, StorageUnavailableException, QueryMalformedException, SidecarExportException, QueryNotSupportedException, PaginationException, StorageNotFoundException { final ExecuteStatementDto request = ExecuteStatementDto.builder() .statement(QUERY_5_STATEMENT) .build(); + /* mock */ + when(metadataServiceGateway.getDatabaseById(DATABASE_3_ID)) + .thenReturn(DATABASE_3_PRIVILEGED_DTO); + when(subsetService.execute(eq(DATABASE_3_PRIVILEGED_DTO), anyString(), any(Instant.class), eq(USER_4_ID), eq(0L), eq(10L), eq(null), eq(null))) + .thenReturn(QUERY_5_RESULT_DTO); + /* test */ - assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { - subsetEndpoint.create(DATABASE_3_ID, request, USER_4_PRINCIPAL, null, null, null); - }); + subsetEndpoint.create(DATABASE_3_ID, request, USER_4_PRINCIPAL, null, null, null); + } + + @Test + @WithAnonymousUser + public void create_anonymous_succeeds() throws DatabaseNotFoundException, RemoteUnavailableException, MetadataServiceException, UserNotFoundException, QueryStoreInsertException, TableMalformedException, NotAllowedException, SQLException, QueryNotFoundException, DatabaseUnavailableException, StorageUnavailableException, QueryMalformedException, SidecarExportException, QueryNotSupportedException, PaginationException, StorageNotFoundException { + final ExecuteStatementDto request = ExecuteStatementDto.builder() + .statement(QUERY_5_STATEMENT) + .build(); + + /* mock */ + when(metadataServiceGateway.getDatabaseById(DATABASE_3_ID)) + .thenReturn(DATABASE_3_PRIVILEGED_DTO); + when(metadataServiceGateway.getSystemUserId()) + .thenReturn(USER_LOCAL_ADMIN_ID); + when(subsetService.execute(eq(DATABASE_3_PRIVILEGED_DTO), anyString(), any(Instant.class), eq(USER_LOCAL_ADMIN_ID), eq(0L), eq(10L), eq(null), eq(null))) + .thenReturn(QUERY_5_RESULT_DTO); + + /* test */ + subsetEndpoint.create(DATABASE_3_ID, request, null, null, null, null); } @Test @@ -249,11 +385,11 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { /* mock */ when(metadataServiceGateway.getDatabaseById(DATABASE_3_ID)) .thenReturn(DATABASE_3_PRIVILEGED_DTO); - when(queryService.findById(DATABASE_3_PRIVILEGED_DTO, QUERY_5_ID)) + when(subsetService.findById(DATABASE_3_PRIVILEGED_DTO, QUERY_5_ID)) .thenReturn(QUERY_5_DTO); - when(queryService.reExecuteCount(DATABASE_3_PRIVILEGED_DTO, QUERY_5_DTO)) + when(subsetService.reExecuteCount(DATABASE_3_PRIVILEGED_DTO, QUERY_5_DTO)) .thenReturn(QUERY_5_RESULT_NUMBER); - when(queryService.reExecute(DATABASE_3_PRIVILEGED_DTO, QUERY_5_DTO, 0L, 10L, null, null)) + when(subsetService.reExecute(DATABASE_3_PRIVILEGED_DTO, QUERY_5_DTO, 0L, 10L, null, null)) .thenReturn(QUERY_5_RESULT_DTO); when(httpServletRequest.getMethod()) .thenReturn("GET"); @@ -261,23 +397,20 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { /* test */ final ResponseEntity<QueryResultDto> response = subsetEndpoint.getData(DATABASE_3_ID, QUERY_5_ID, null, httpServletRequest, null, null); assertEquals(HttpStatus.OK, response.getStatusCode()); - assertNotNull(response.getHeaders().get("Access-Control-Expose-Headers")); - assertEquals(1, response.getHeaders().get("Access-Control-Expose-Headers").size()); - assertEquals("X-Count", response.getHeaders().get("Access-Control-Expose-Headers").get(0)); assertNotNull(response.getBody()); } @Test - public void getData_onlyHead_succeeds() throws DatabaseNotFoundException, RemoteUnavailableException, UserNotFoundException, + public void getData_head_succeeds() throws DatabaseNotFoundException, RemoteUnavailableException, UserNotFoundException, NotAllowedException, SQLException, QueryNotFoundException, TableMalformedException, QueryMalformedException, DatabaseUnavailableException, PaginationException, MetadataServiceException { /* mock */ when(metadataServiceGateway.getDatabaseById(DATABASE_3_ID)) .thenReturn(DATABASE_3_PRIVILEGED_DTO); - when(queryService.findById(DATABASE_3_PRIVILEGED_DTO, QUERY_5_ID)) + when(subsetService.findById(DATABASE_3_PRIVILEGED_DTO, QUERY_5_ID)) .thenReturn(QUERY_5_DTO); - when(queryService.reExecuteCount(DATABASE_3_PRIVILEGED_DTO, QUERY_5_DTO)) + when(subsetService.reExecuteCount(DATABASE_3_PRIVILEGED_DTO, QUERY_5_DTO)) .thenReturn(QUERY_5_RESULT_NUMBER); when(httpServletRequest.getMethod()) .thenReturn("HEAD"); @@ -301,11 +434,11 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { .thenReturn(DATABASE_1_PRIVILEGED_DTO); when(httpServletRequest.getMethod()) .thenReturn("GET"); - when(queryService.findById(DATABASE_1_PRIVILEGED_DTO, QUERY_1_ID)) + when(subsetService.findById(DATABASE_1_PRIVILEGED_DTO, QUERY_1_ID)) .thenReturn(QUERY_1_DTO); - when(queryService.reExecuteCount(DATABASE_1_PRIVILEGED_DTO, QUERY_1_DTO)) + when(subsetService.reExecuteCount(DATABASE_1_PRIVILEGED_DTO, QUERY_1_DTO)) .thenReturn(QUERY_1_RESULT_NUMBER); - when(queryService.reExecute(DATABASE_1_PRIVILEGED_DTO, QUERY_1_DTO, 0L, 10L, null, null)) + when(subsetService.reExecute(DATABASE_1_PRIVILEGED_DTO, QUERY_1_DTO, 0L, 10L, null, null)) .thenReturn(QUERY_1_RESULT_DTO); /* test */ @@ -349,16 +482,16 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_1_USERNAME) - public void getData_privateOnlyHead_succeeds() throws DatabaseNotFoundException, RemoteUnavailableException, + public void getData_privateHead_succeeds() throws DatabaseNotFoundException, RemoteUnavailableException, UserNotFoundException, DatabaseUnavailableException, NotAllowedException, TableMalformedException, QueryMalformedException, QueryNotFoundException, PaginationException, SQLException, MetadataServiceException { /* mock */ when(metadataServiceGateway.getDatabaseById(DATABASE_1_ID)) .thenReturn(DATABASE_1_PRIVILEGED_DTO); - when(queryService.findById(DATABASE_1_PRIVILEGED_DTO, QUERY_1_ID)) + when(subsetService.findById(DATABASE_1_PRIVILEGED_DTO, QUERY_1_ID)) .thenReturn(QUERY_1_DTO); - when(queryService.reExecuteCount(DATABASE_1_PRIVILEGED_DTO, QUERY_1_DTO)) + when(subsetService.reExecuteCount(DATABASE_1_PRIVILEGED_DTO, QUERY_1_DTO)) .thenReturn(QUERY_1_RESULT_NUMBER); when(httpServletRequest.getMethod()) .thenReturn("HEAD"); @@ -371,6 +504,29 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { assertEquals(QUERY_1_RESULT_NUMBER, Long.parseLong(response.getHeaders().get("X-Count").get(0))); } + @Test + @WithMockUser(username = USER_1_USERNAME) + public void getData_unavailable_fails() throws DatabaseNotFoundException, RemoteUnavailableException, SQLException, + UserNotFoundException, NotAllowedException, TableMalformedException, QueryNotFoundException, + MetadataServiceException { + + /* mock */ + when(metadataServiceGateway.getDatabaseById(DATABASE_1_ID)) + .thenReturn(DATABASE_1_PRIVILEGED_DTO); + when(subsetService.findById(DATABASE_1_PRIVILEGED_DTO, QUERY_1_ID)) + .thenReturn(QUERY_1_DTO); + when(httpServletRequest.getMethod()) + .thenReturn("GET"); + doThrow(SQLException.class) + .when(subsetService) + .reExecute(DATABASE_1_PRIVILEGED_DTO, QUERY_1_DTO, 0L, 10L, null, null); + + /* test */ + assertThrows(DatabaseUnavailableException.class, () -> { + subsetEndpoint.getData(DATABASE_1_ID, QUERY_1_ID, USER_1_PRINCIPAL, httpServletRequest, null, null); + }); + } + @Test @WithMockUser(username = USER_3_USERNAME, authorities = {"persist-query"}) public void persist_succeeds() throws NotAllowedException, RemoteUnavailableException, DatabaseNotFoundException, @@ -386,9 +542,9 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { when(metadataServiceGateway.getDatabaseById(DATABASE_3_ID)) .thenReturn(DATABASE_3_PRIVILEGED_DTO); doNothing() - .when(queryService) + .when(subsetService) .persist(DATABASE_3_PRIVILEGED_DTO, QUERY_5_ID, true); - when(queryService.findById(DATABASE_3_PRIVILEGED_DTO, QUERY_5_ID)) + when(subsetService.findById(DATABASE_3_PRIVILEGED_DTO, QUERY_5_ID)) .thenReturn(QUERY_5_DTO); /* test */ @@ -447,16 +603,37 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { }); } - protected List<QueryDto> generic_findAllById(Long databaseId, PrivilegedDatabaseDto database) - throws DatabaseUnavailableException, NotAllowedException, QueryNotFoundException, DatabaseNotFoundException, - RemoteUnavailableException, SQLException, MetadataServiceException { + @Test + @WithMockUser(username = USER_3_USERNAME, authorities = {"persist-query"}) + public void persist_unavailable_fails() throws NotAllowedException, RemoteUnavailableException, + MetadataServiceException, QueryStorePersistException, SQLException, DatabaseNotFoundException { + final QueryPersistDto request = QueryPersistDto.builder() + .persist(true) + .build(); + + /* mock */ + when(metadataServiceGateway.getDatabaseById(DATABASE_3_ID)) + .thenReturn(DATABASE_3_PRIVILEGED_DTO); + when(metadataServiceGateway.getAccess(DATABASE_3_ID, USER_3_ID)) + .thenReturn(DATABASE_3_USER_3_READ_ACCESS_DTO); + doThrow(SQLException.class) + .when(subsetService) + .persist(DATABASE_3_PRIVILEGED_DTO, QUERY_5_ID, true); + + /* test */ + assertThrows(DatabaseUnavailableException.class, () -> { + subsetEndpoint.persist(DATABASE_3_ID, QUERY_5_ID, request, USER_3_PRINCIPAL); + }); + } + + protected List<QueryDto> generic_list(Long databaseId, PrivilegedDatabaseDto database) throws NotAllowedException, + DatabaseUnavailableException, QueryNotFoundException, DatabaseNotFoundException, RemoteUnavailableException, + MetadataServiceException { /* mock */ if (database != null) { when(metadataServiceGateway.getDatabaseById(databaseId)) .thenReturn(database); - when(queryService.findAll(database, null)) - .thenReturn(List.of(QUERY_1_DTO, QUERY_2_DTO, QUERY_3_DTO, QUERY_4_DTO, QUERY_5_DTO, QUERY_6_DTO)); } else { doThrow(DatabaseNotFoundException.class) .when(metadataServiceGateway) @@ -469,15 +646,12 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { return response.getBody(); } - protected void generic_findById(Long subsetId, QueryDto subset, MediaType accept, Instant timestamp) - throws UserNotFoundException, DatabaseUnavailableException, StorageUnavailableException, - NotAllowedException, QueryMalformedException, QueryNotFoundException, DatabaseNotFoundException, - SidecarExportException, RemoteUnavailableException, FormatNotAvailableException, StorageNotFoundException, - SQLException, MetadataServiceException { + protected void generic_findById(Long subsetId, MediaType accept, Instant timestamp) throws UserNotFoundException, + DatabaseUnavailableException, StorageUnavailableException, NotAllowedException, QueryMalformedException, + QueryNotFoundException, DatabaseNotFoundException, SidecarExportException, RemoteUnavailableException, + FormatNotAvailableException, StorageNotFoundException, MetadataServiceException { /* mock */ - when(queryService.findById(DATABASE_3_PRIVILEGED_DTO, subsetId)) - .thenReturn(subset); when(mockHttpServletRequest.getHeader("Accept")) .thenReturn(accept.toString()); diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/TableEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/TableEndpointUnitTest.java index 76c34ef47cd2d13f698f3d552b9aebbbb4175492..f03f4c3f189c98013e6fa5d4bb01a5cfd4fe211f 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/TableEndpointUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/TableEndpointUnitTest.java @@ -1,9 +1,11 @@ package at.tuwien.endpoint; import at.tuwien.ExportResourceDto; +import at.tuwien.api.database.DatabaseAccessDto; import at.tuwien.api.database.query.ImportCsvDto; import at.tuwien.api.database.query.QueryResultDto; import at.tuwien.api.database.table.*; +import at.tuwien.api.database.table.internal.PrivilegedTableDto; import at.tuwien.endpoints.TableEndpoint; import at.tuwien.exception.*; import at.tuwien.gateway.MetadataServiceGateway; @@ -14,12 +16,16 @@ import lombok.extern.log4j.Log4j2; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.core.io.InputStreamResource; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.security.access.AccessDeniedException; import org.springframework.security.test.context.support.WithAnonymousUser; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.junit.jupiter.SpringExtension; @@ -29,6 +35,7 @@ import java.sql.SQLException; import java.time.Instant; import java.util.HashMap; import java.util.List; +import java.util.stream.Stream; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; @@ -50,6 +57,22 @@ public class TableEndpointUnitTest extends AbstractUnitTest { @MockBean private MetadataServiceGateway metadataServiceGateway; + public static Stream<Arguments> size_arguments() { + return Stream.of( + Arguments.arguments("zero", 0L), + Arguments.arguments("neg zero", -0L), + Arguments.arguments("negative", -1L) + ); + } + + public static Stream<Arguments> anyAccess_parameters() { + return Stream.of( + Arguments.arguments("read", DATABASE_1_USER_2_READ_ACCESS_DTO), + Arguments.arguments("write_own", DATABASE_1_USER_2_WRITE_OWN_ACCESS_DTO), + Arguments.arguments("write_all", DATABASE_1_USER_2_WRITE_ALL_ACCESS_DTO) + ); + } + @BeforeEach public void beforeEach() { genesis(); @@ -98,6 +121,85 @@ public class TableEndpointUnitTest extends AbstractUnitTest { }); } + @Test + @WithMockUser(username = USER_LOCAL_ADMIN_USERNAME, authorities = {"system"}) + public void create_unavailable_fails() throws TableMalformedException, DatabaseNotFoundException, SQLException, + TableExistsException, RemoteUnavailableException, TableNotFoundException, MetadataServiceException { + + /* mock */ + when(metadataServiceGateway.getDatabaseById(DATABASE_1_ID)) + .thenReturn(DATABASE_1_PRIVILEGED_DTO); + doThrow(SQLException.class) + .when(tableService) + .createTable(DATABASE_1_PRIVILEGED_DTO, TABLE_4_CREATE_INTERNAL_DTO); + + /* test */ + assertThrows(DatabaseUnavailableException.class, () -> { + tableEndpoint.create(DATABASE_1_ID, TABLE_4_CREATE_INTERNAL_DTO); + }); + } + + @Test + @WithMockUser(username = USER_LOCAL_ADMIN_USERNAME, authorities = {"system"}) + public void create_missingPrimaryKey_fails() { + + /* test */ + assertThrows(TableMalformedException.class, () -> { + tableEndpoint.create(DATABASE_1_ID, TABLE_1_CREATE_INTERNAL_INVALID_DTO); + }); + } + + @Test + @WithAnonymousUser + public void statistic_succeeds() throws DatabaseUnavailableException, TableNotFoundException, + TableMalformedException, DatabaseNotFoundException, RemoteUnavailableException, MetadataServiceException, + SQLException { + + /* mock */ + when(metadataServiceGateway.getTableById(DATABASE_3_ID, TABLE_8_ID)) + .thenReturn(TABLE_8_PRIVILEGED_DTO); + when(tableService.getStatistics(any(PrivilegedTableDto.class))) + .thenReturn(TABLE_8_STATISTIC_DTO); + + /* test */ + final ResponseEntity<TableStatisticDto> response = tableEndpoint.statistic(DATABASE_3_ID, TABLE_8_ID); + assertEquals(HttpStatus.OK, response.getStatusCode()); + } + + @Test + @WithAnonymousUser + public void statistic_unavailable_fails() throws TableNotFoundException, TableMalformedException, + RemoteUnavailableException, MetadataServiceException, SQLException { + + /* mock */ + when(metadataServiceGateway.getTableById(DATABASE_3_ID, TABLE_8_ID)) + .thenReturn(TABLE_8_PRIVILEGED_DTO); + doThrow(SQLException.class) + .when(tableService) + .getStatistics(any(PrivilegedTableDto.class)); + + /* test */ + assertThrows(DatabaseUnavailableException.class, () -> { + tableEndpoint.statistic(DATABASE_3_ID, TABLE_8_ID); + }); + } + + @Test + @WithAnonymousUser + public void statistic_notFound_fails() throws TableNotFoundException, RemoteUnavailableException, + MetadataServiceException { + + /* mock */ + doThrow(TableNotFoundException.class) + .when(metadataServiceGateway) + .getTableById(DATABASE_1_ID, TABLE_1_ID); + + /* test */ + assertThrows(TableNotFoundException.class, () -> { + tableEndpoint.statistic(DATABASE_1_ID, TABLE_1_ID); + }); + } + @Test @WithMockUser(username = USER_LOCAL_ADMIN_USERNAME, authorities = {"system"}) public void delete_succeeds() throws RemoteUnavailableException, DatabaseUnavailableException, @@ -141,6 +243,24 @@ public class TableEndpointUnitTest extends AbstractUnitTest { }); } + @Test + @WithMockUser(username = USER_LOCAL_ADMIN_USERNAME, authorities = {"system"}) + public void delete_unavailable_fails() throws RemoteUnavailableException, TableNotFoundException, SQLException, + MetadataServiceException, QueryMalformedException { + + /* mock */ + when(metadataServiceGateway.getTableById(DATABASE_1_ID, TABLE_1_ID)) + .thenReturn(TABLE_1_PRIVILEGED_DTO); + doThrow(SQLException.class) + .when(tableService) + .delete(TABLE_1_PRIVILEGED_DTO); + + /* test */ + assertThrows(DatabaseUnavailableException.class, () -> { + tableEndpoint.delete(DATABASE_1_ID, TABLE_1_ID); + }); + } + @Test @WithAnonymousUser public void getData_succeeds() throws DatabaseUnavailableException, TableNotFoundException, TableMalformedException, @@ -150,18 +270,129 @@ public class TableEndpointUnitTest extends AbstractUnitTest { /* mock */ when(metadataServiceGateway.getTableById(DATABASE_3_ID, TABLE_8_ID)) .thenReturn(TABLE_8_PRIVILEGED_DTO); - when(tableService.getCount(eq(TABLE_8_PRIVILEGED_DTO), any(Instant.class))) - .thenReturn(TABLE_8_DATA_COUNT); when(tableService.getData(eq(TABLE_8_PRIVILEGED_DTO), any(Instant.class), eq(0L), eq(10L))) .thenReturn(TABLE_8_DATA_DTO); /* test */ final ResponseEntity<QueryResultDto> response = tableEndpoint.getData(DATABASE_3_ID, TABLE_8_ID, null, null, null, httpServletRequest, null); assertEquals(HttpStatus.OK, response.getStatusCode()); + + } + + @Test + @WithAnonymousUser + public void getData_head_succeeds() throws DatabaseUnavailableException, TableNotFoundException, TableMalformedException, + SQLException, QueryMalformedException, RemoteUnavailableException, PaginationException, MetadataServiceException, + NotAllowedException { + final HttpServletRequest mock = mock(HttpServletRequest.class); + + /* mock */ + when(metadataServiceGateway.getTableById(DATABASE_3_ID, TABLE_8_ID)) + .thenReturn(TABLE_8_PRIVILEGED_DTO); + when(mock.getMethod()) + .thenReturn("HEAD"); + when(tableService.getCount(eq(TABLE_8_PRIVILEGED_DTO), any(Instant.class))) + .thenReturn(3L); + when(tableService.getData(eq(TABLE_8_PRIVILEGED_DTO), any(Instant.class), eq(0L), eq(10L))) + .thenReturn(TABLE_8_DATA_DTO); + + /* test */ + final ResponseEntity<QueryResultDto> response = tableEndpoint.getData(DATABASE_3_ID, TABLE_8_ID, null, null, null, mock, null); + assertEquals(HttpStatus.OK, response.getStatusCode()); assertNotNull(response.getHeaders().get("Access-Control-Expose-Headers")); - assertEquals(1, response.getHeaders().get("Access-Control-Expose-Headers").size()); assertEquals("X-Count", response.getHeaders().get("Access-Control-Expose-Headers").get(0)); + assertNotNull(response.getHeaders().get("X-Count")); + assertEquals("3", response.getHeaders().get("X-Count").get(0)); + + } + + @Test + @WithAnonymousUser + public void getData_privateAnonymous_fails() throws TableNotFoundException, RemoteUnavailableException, + MetadataServiceException { + + /* mock */ + when(metadataServiceGateway.getTableById(DATABASE_1_ID, TABLE_1_ID)) + .thenReturn(TABLE_1_PRIVILEGED_DTO); + /* test */ + assertThrows(NotAllowedException.class, () -> { + tableEndpoint.getData(DATABASE_1_ID, TABLE_1_ID, null, null, null, httpServletRequest, null); + }); + } + + @Test + @WithMockUser(username = USER_2_USERNAME) + public void getData_privateNoAccess_fails() throws TableNotFoundException, RemoteUnavailableException, + MetadataServiceException, NotAllowedException { + + /* mock */ + when(metadataServiceGateway.getTableById(DATABASE_1_ID, TABLE_1_ID)) + .thenReturn(TABLE_1_PRIVILEGED_DTO); + doThrow(NotAllowedException.class) + .when(metadataServiceGateway) + .getAccess(DATABASE_1_ID, USER_2_ID); + + /* test */ + assertThrows(NotAllowedException.class, () -> { + tableEndpoint.getData(DATABASE_1_ID, TABLE_1_ID, null, null, null, httpServletRequest, USER_2_PRINCIPAL); + }); + } + + @Test + @WithAnonymousUser + public void getData_unavailable_fails() throws TableNotFoundException, RemoteUnavailableException, + MetadataServiceException, TableMalformedException, SQLException { + + /* mock */ + when(metadataServiceGateway.getTableById(DATABASE_3_ID, TABLE_8_ID)) + .thenReturn(TABLE_8_PRIVILEGED_DTO); + doThrow(SQLException.class) + .when(tableService) + .getData(eq(TABLE_8_PRIVILEGED_DTO), any(Instant.class), eq(0L), eq(10L)); + + /* test */ + assertThrows(DatabaseUnavailableException.class, () -> { + tableEndpoint.getData(DATABASE_3_ID, TABLE_8_ID, null, null, null, httpServletRequest, null); + }); + } + + @Test + @WithMockUser(username = USER_2_USERNAME) + public void getData_privateAccessUnavailable_fails() throws TableNotFoundException, RemoteUnavailableException, + MetadataServiceException, NotAllowedException { + + /* mock */ + when(metadataServiceGateway.getTableById(DATABASE_1_ID, TABLE_1_ID)) + .thenReturn(TABLE_1_PRIVILEGED_DTO); + doThrow(RemoteUnavailableException.class) + .when(metadataServiceGateway) + .getAccess(DATABASE_1_ID, USER_2_ID); + + /* test */ + assertThrows(RemoteUnavailableException.class, () -> { + tableEndpoint.getData(DATABASE_1_ID, TABLE_1_ID, null, null, null, httpServletRequest, USER_2_PRINCIPAL); + }); + } + + @ParameterizedTest + @WithMockUser(username = USER_2_USERNAME) + @MethodSource("anyAccess_parameters") + public void getData_private_succeeds(String name, DatabaseAccessDto access) throws DatabaseUnavailableException, + TableNotFoundException, TableMalformedException, SQLException, QueryMalformedException, + RemoteUnavailableException, PaginationException, MetadataServiceException, NotAllowedException { + + /* mock */ + when(metadataServiceGateway.getTableById(DATABASE_1_ID, TABLE_1_ID)) + .thenReturn(TABLE_1_PRIVILEGED_DTO); + when(metadataServiceGateway.getAccess(DATABASE_1_ID, USER_2_ID)) + .thenReturn(access); + when(tableService.getData(eq(TABLE_1_PRIVILEGED_DTO), any(Instant.class), eq(0L), eq(10L))) + .thenReturn(TABLE_1_DATA_DTO); + + /* test */ + final ResponseEntity<QueryResultDto> response = tableEndpoint.getData(DATABASE_1_ID, TABLE_1_ID, null, null, null, httpServletRequest, USER_2_PRINCIPAL); + assertEquals(HttpStatus.OK, response.getStatusCode()); } @Test @@ -182,7 +413,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_1_USERNAME, authorities = {"insert-table-data"}) - public void createTuple_succeeds() throws DatabaseUnavailableException, TableNotFoundException, + public void insertRawTuple_succeeds() throws DatabaseUnavailableException, TableNotFoundException, TableMalformedException, NotAllowedException, QueryMalformedException, RemoteUnavailableException, SQLException, StorageUnavailableException, StorageNotFoundException, MetadataServiceException { final TupleDto request = TupleDto.builder() @@ -211,7 +442,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_3_USERNAME) - public void createTuple_noRole_fails() { + public void insertRawTuple_noRole_fails() { final TupleDto request = TupleDto.builder() .data(new HashMap<>() {{ put(COLUMN_8_1_INTERNAL_NAME, 7L); @@ -227,7 +458,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_3_USERNAME, authorities = {"insert-table-data"}) - public void createTuple_tableNotFound_fails() throws TableNotFoundException, RemoteUnavailableException, + public void insertRawTuple_tableNotFound_fails() throws TableNotFoundException, RemoteUnavailableException, MetadataServiceException { final TupleDto request = TupleDto.builder() .data(new HashMap<>() {{ @@ -249,7 +480,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_3_USERNAME, authorities = {"insert-table-data"}) - public void createTuple_readAccess_fails() throws TableNotFoundException, RemoteUnavailableException, + public void insertRawTuple_readAccess_fails() throws TableNotFoundException, RemoteUnavailableException, NotAllowedException, MetadataServiceException { final TupleDto request = TupleDto.builder() .data(new HashMap<>() {{ @@ -270,9 +501,36 @@ public class TableEndpointUnitTest extends AbstractUnitTest { }); } + @Test + @WithMockUser(username = USER_3_USERNAME, authorities = {"insert-table-data"}) + public void insertRawTuple_unavailable_fails() throws TableNotFoundException, RemoteUnavailableException, + NotAllowedException, MetadataServiceException, TableMalformedException, StorageUnavailableException, + SQLException, QueryMalformedException, StorageNotFoundException { + final TupleDto request = TupleDto.builder() + .data(new HashMap<>() {{ + put(COLUMN_8_1_INTERNAL_NAME, 7L); + put(COLUMN_8_2_INTERNAL_NAME, 23.0); + }}) + .build(); + + /* mock */ + when(metadataServiceGateway.getTableById(DATABASE_3_ID, TABLE_8_ID)) + .thenReturn(TABLE_8_PRIVILEGED_DTO); + when(metadataServiceGateway.getAccess(DATABASE_3_ID, USER_1_ID)) + .thenReturn(DATABASE_3_USER_1_WRITE_OWN_ACCESS_DTO); + doThrow(SQLException.class) + .when(tableService) + .createTuple(TABLE_8_PRIVILEGED_DTO, request); + + /* test */ + assertThrows(DatabaseUnavailableException.class, () -> { + tableEndpoint.insertRawTuple(DATABASE_3_ID, TABLE_8_ID, request, USER_1_PRINCIPAL); + }); + } + @Test @WithMockUser(username = USER_1_USERNAME, authorities = {"insert-table-data"}) - public void createTuple_writeOwnAccess_succeeds() throws TableNotFoundException, RemoteUnavailableException, + public void insertRawTuple_writeOwnAccess_succeeds() throws TableNotFoundException, RemoteUnavailableException, NotAllowedException, DatabaseUnavailableException, TableMalformedException, QueryMalformedException, StorageUnavailableException, StorageNotFoundException, MetadataServiceException { final TupleDto request = TupleDto.builder() @@ -294,7 +552,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_3_USERNAME, authorities = {"insert-table-data"}) - public void createTuple_writeOwnAccessForeign_fails() throws TableNotFoundException, RemoteUnavailableException, + public void insertRawTuple_writeOwnAccessForeign_fails() throws TableNotFoundException, RemoteUnavailableException, NotAllowedException, MetadataServiceException { final TupleDto request = TupleDto.builder() .data(new HashMap<>() {{ @@ -317,7 +575,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_3_USERNAME, authorities = {"insert-table-data"}) - public void createTuple_writeAllAccessForeign_succeeds() throws TableNotFoundException, RemoteUnavailableException, + public void insertRawTuple_writeAllAccessForeign_succeeds() throws TableNotFoundException, RemoteUnavailableException, NotAllowedException, DatabaseUnavailableException, TableMalformedException, QueryMalformedException, StorageUnavailableException, StorageNotFoundException, MetadataServiceException { final TupleDto request = TupleDto.builder() @@ -439,6 +697,35 @@ public class TableEndpointUnitTest extends AbstractUnitTest { }); } + @Test + @WithMockUser(username = USER_3_USERNAME, authorities = {"insert-table-data"}) + public void updateTuple_unavailable_fails() throws TableNotFoundException, RemoteUnavailableException, SQLException, + NotAllowedException, MetadataServiceException, TableMalformedException, QueryMalformedException { + final TupleUpdateDto request = TupleUpdateDto.builder() + .keys(new HashMap<>() {{ + put(COLUMN_8_1_INTERNAL_NAME, 6L); + }}) + .data(new HashMap<>() {{ + put(COLUMN_8_1_INTERNAL_NAME, 6L); + put(COLUMN_8_2_INTERNAL_NAME, 23.0); + }}) + .build(); + + /* mock */ + when(metadataServiceGateway.getTableById(DATABASE_3_ID, TABLE_8_ID)) + .thenReturn(TABLE_8_PRIVILEGED_DTO); + when(metadataServiceGateway.getAccess(DATABASE_3_ID, USER_3_ID)) + .thenReturn(DATABASE_3_USER_3_WRITE_ALL_ACCESS_DTO); + doThrow(SQLException.class) + .when(tableService) + .updateTuple(TABLE_8_PRIVILEGED_DTO, request); + + /* test */ + assertThrows(DatabaseUnavailableException.class, () -> { + tableEndpoint.updateRawTuple(DATABASE_3_ID, TABLE_8_ID, request, USER_3_PRINCIPAL); + }); + } + @Test @WithMockUser(username = USER_1_USERNAME, authorities = {"insert-table-data"}) public void updateTuple_writeOwnAccess_succeeds() throws DatabaseUnavailableException, TableNotFoundException, @@ -615,6 +902,31 @@ public class TableEndpointUnitTest extends AbstractUnitTest { }); } + @Test + @WithMockUser(username = USER_1_USERNAME, authorities = {"delete-table-data"}) + public void deleteTuple_unavailable_fails() throws TableNotFoundException, RemoteUnavailableException, SQLException, + NotAllowedException, MetadataServiceException, TableMalformedException, QueryMalformedException { + final TupleDeleteDto request = TupleDeleteDto.builder() + .keys(new HashMap<>() {{ + put(COLUMN_8_1_INTERNAL_NAME, 6L); + }}) + .build(); + + /* mock */ + when(metadataServiceGateway.getTableById(DATABASE_3_ID, TABLE_8_ID)) + .thenReturn(TABLE_8_PRIVILEGED_DTO); + when(metadataServiceGateway.getAccess(DATABASE_3_ID, USER_1_ID)) + .thenReturn(DATABASE_3_USER_3_WRITE_OWN_ACCESS_DTO); + doThrow(SQLException.class) + .when(tableService) + .deleteTuple(TABLE_8_PRIVILEGED_DTO, request); + + /* test */ + assertThrows(DatabaseUnavailableException.class, () -> { + tableEndpoint.deleteRawTuple(DATABASE_3_ID, TABLE_8_ID, request, USER_1_PRINCIPAL); + }); + } + @Test @WithMockUser(username = USER_1_USERNAME, authorities = {"delete-table-data"}) public void deleteTuple_writeOwnAccess_succeeds() throws TableNotFoundException, RemoteUnavailableException, @@ -724,6 +1036,17 @@ public class TableEndpointUnitTest extends AbstractUnitTest { }); } + @ParameterizedTest + @MethodSource("size_arguments") + @WithAnonymousUser + public void getHistory_invalidSize_fails(String name, Long size) { + + /* test */ + assertThrows(PaginationException.class, () -> { + tableEndpoint.getHistory(DATABASE_1_ID, TABLE_1_ID, size, null); + }); + } + @Test @WithMockUser(username = USER_4_USERNAME) public void getHistory_privateNoAccess_fails() throws NotAllowedException, RemoteUnavailableException, @@ -742,6 +1065,42 @@ public class TableEndpointUnitTest extends AbstractUnitTest { }); } + @Test + @WithMockUser(username = USER_2_USERNAME) + public void getHistory_private_succeeds() throws NotAllowedException, RemoteUnavailableException, SQLException, + TableNotFoundException, MetadataServiceException, DatabaseUnavailableException, PaginationException { + + /* mock */ + when(metadataServiceGateway.getTableById(DATABASE_1_ID, TABLE_1_ID)) + .thenReturn(TABLE_1_PRIVILEGED_DTO); + when(metadataServiceGateway.getAccess(DATABASE_1_ID, USER_2_ID)) + .thenReturn(DATABASE_1_USER_2_READ_ACCESS_DTO); + when(tableService.history(TABLE_1_PRIVILEGED_DTO, 10L)) + .thenReturn(List.of()); + + /* test */ + final ResponseEntity<List<TableHistoryDto>> response = tableEndpoint.getHistory(DATABASE_1_ID, TABLE_1_ID, null, USER_2_PRINCIPAL); + assertEquals(HttpStatus.OK, response.getStatusCode()); + } + + @Test + @WithAnonymousUser + public void getHistory_unavailable_succeeds() throws RemoteUnavailableException, SQLException, + TableNotFoundException, MetadataServiceException { + + /* mock */ + when(metadataServiceGateway.getTableById(DATABASE_3_ID, TABLE_8_ID)) + .thenReturn(TABLE_8_PRIVILEGED_DTO); + doThrow(SQLException.class) + .when(tableService) + .history(TABLE_8_PRIVILEGED_DTO, 100L); + + /* test */ + assertThrows(DatabaseUnavailableException.class, () -> { + tableEndpoint.getHistory(DATABASE_3_ID, TABLE_8_ID, null, null); + }); + } + @Test @WithAnonymousUser public void getHistory_tableNotFound_fails() throws TableNotFoundException, RemoteUnavailableException, @@ -775,7 +1134,32 @@ public class TableEndpointUnitTest extends AbstractUnitTest { .thenReturn(mock); /* test */ - final ResponseEntity<InputStreamResource> response = tableEndpoint.exportData(DATABASE_3_ID, TABLE_8_ID, null, null); + final ResponseEntity<InputStreamResource> response = tableEndpoint.exportDataset(DATABASE_3_ID, TABLE_8_ID, null, null); + assertEquals(HttpStatus.OK, response.getStatusCode()); + + } + + @ParameterizedTest + @WithMockUser(username = USER_2_USERNAME) + @MethodSource("anyAccess_parameters") + public void exportData_private_succeeds(String name, DatabaseAccessDto access) throws DatabaseUnavailableException, TableNotFoundException, NotAllowedException, + StorageUnavailableException, QueryMalformedException, SidecarExportException, RemoteUnavailableException, + StorageNotFoundException, SQLException, MetadataServiceException { + final ExportResourceDto mock = ExportResourceDto.builder() + .filename("deadbeef") + .resource(new InputStreamResource(InputStream.nullInputStream())) + .build(); + + /* mock */ + when(metadataServiceGateway.getTableById(DATABASE_1_ID, TABLE_1_ID)) + .thenReturn(TABLE_1_PRIVILEGED_DTO); + when(metadataServiceGateway.getAccess(DATABASE_1_ID, USER_2_ID)) + .thenReturn(access); + when(tableService.exportDataset(eq(TABLE_1_PRIVILEGED_DTO), any(Instant.class))) + .thenReturn(mock); + + /* test */ + final ResponseEntity<InputStreamResource> response = tableEndpoint.exportDataset(DATABASE_1_ID, TABLE_1_ID, null, USER_2_PRINCIPAL); assertEquals(HttpStatus.OK, response.getStatusCode()); } @@ -794,19 +1178,92 @@ public class TableEndpointUnitTest extends AbstractUnitTest { /* test */ assertThrows(NotAllowedException.class, () -> { - tableEndpoint.exportData(DATABASE_1_ID, TABLE_1_ID, null, null); + tableEndpoint.exportDataset(DATABASE_1_ID, TABLE_1_ID, null, null); + }); + } + + @Test + @WithMockUser(username = USER_1_USERNAME) + public void exportData_unavailable_fails() throws TableNotFoundException, RemoteUnavailableException, + MetadataServiceException, StorageUnavailableException, SQLException, QueryMalformedException, + SidecarExportException, StorageNotFoundException { + + /* mock */ + when(metadataServiceGateway.getTableById(DATABASE_1_ID, TABLE_1_ID)) + .thenReturn(TABLE_1_PRIVILEGED_DTO); + doThrow(SQLException.class) + .when(tableService) + .exportDataset(eq(TABLE_1_PRIVILEGED_DTO), any(Instant.class)); + + /* test */ + assertThrows(DatabaseUnavailableException.class, () -> { + tableEndpoint.exportDataset(DATABASE_1_ID, TABLE_1_ID, null, USER_1_PRINCIPAL); }); + } + @Test + @WithMockUser(username = USER_1_USERNAME, authorities = {"system"}) + public void getSchema_succeeds() throws DatabaseUnavailableException, TableNotFoundException, + RemoteUnavailableException, SQLException, MetadataServiceException, DatabaseNotFoundException, + DatabaseMalformedException { + + /* mock */ + when(metadataServiceGateway.getDatabaseById(DATABASE_3_ID)) + .thenReturn(DATABASE_3_PRIVILEGED_DTO); + when(tableService.getSchemas(DATABASE_3_PRIVILEGED_DTO)) + .thenReturn(List.of(TABLE_8_DTO)); + + /* test */ + final ResponseEntity<List<TableDto>> response = tableEndpoint.getSchema(DATABASE_3_ID); + assertEquals(HttpStatus.OK, response.getStatusCode()); + } + + @Test + @WithAnonymousUser + public void getSchema_anonymous_succeeds() { + + /* test */ + assertThrows(AccessDeniedException.class, () -> { + tableEndpoint.getSchema(DATABASE_3_ID); + }); + } + + @Test + @WithMockUser(username = USER_4_USERNAME) + public void getSchema_noRole_succeeds() { + + /* test */ + assertThrows(AccessDeniedException.class, () -> { + tableEndpoint.getSchema(DATABASE_3_ID); + }); + } + + @Test + @WithMockUser(username = USER_1_USERNAME, authorities = {"system"}) + public void getSchema_unavailable_fails() throws TableNotFoundException, RemoteUnavailableException, SQLException, + MetadataServiceException, DatabaseNotFoundException, DatabaseMalformedException { + + /* mock */ + when(metadataServiceGateway.getDatabaseById(DATABASE_3_ID)) + .thenReturn(DATABASE_3_PRIVILEGED_DTO); + doThrow(SQLException.class) + .when(tableService) + .getSchemas(DATABASE_3_PRIVILEGED_DTO); + + /* test */ + assertThrows(DatabaseUnavailableException.class, () -> { + tableEndpoint.getSchema(DATABASE_3_ID); + }); } @Test @WithMockUser(username = USER_1_USERNAME, authorities = {"insert-table-data"}) - public void importData_succeeds() throws DatabaseUnavailableException, TableNotFoundException, + public void importDataset_succeeds() throws DatabaseUnavailableException, TableNotFoundException, SidecarImportException, NotAllowedException, QueryMalformedException, RemoteUnavailableException, StorageNotFoundException, SQLException, MetadataServiceException { final ImportCsvDto request = ImportCsvDto.builder() .skipLines(1L) - .lineTermination("\\n") + .lineTermination(null) .location("deadbeef") .build(); @@ -829,7 +1286,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_4_USERNAME) - public void importData_noRole_fails() { + public void importDataset_noRole_fails() { final ImportCsvDto request = ImportCsvDto.builder() .skipLines(1L) .lineTermination("\\n") @@ -844,7 +1301,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_3_USERNAME, authorities = {"insert-table-data"}) - public void importData_tableNotFound_fails() throws TableNotFoundException, RemoteUnavailableException, + public void importDataset_tableNotFound_fails() throws TableNotFoundException, RemoteUnavailableException, MetadataServiceException { final ImportCsvDto request = ImportCsvDto.builder() .skipLines(1L) @@ -865,7 +1322,59 @@ public class TableEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_3_USERNAME, authorities = {"insert-table-data"}) - public void importData_readAccess_fails() throws TableNotFoundException, RemoteUnavailableException, + public void importDataset_unavailable_fails() throws RemoteUnavailableException, SidecarImportException, + SQLException, QueryMalformedException, StorageNotFoundException, TableNotFoundException, + MetadataServiceException, NotAllowedException { + final ImportCsvDto request = ImportCsvDto.builder() + .skipLines(1L) + .lineTermination("\\n") + .location("deadbeef") + .build(); + + /* mock */ + when(metadataServiceGateway.getTableById(DATABASE_3_ID, TABLE_8_ID)) + .thenReturn(TABLE_8_PRIVILEGED_DTO); + when(metadataServiceGateway.getAccess(DATABASE_3_ID, USER_3_ID)) + .thenReturn(DATABASE_3_USER_3_WRITE_ALL_ACCESS_DTO); + doThrow(SQLException.class) + .when(tableService) + .importDataset(any(PrivilegedTableDto.class), eq(request)); + + /* test */ + assertThrows(DatabaseUnavailableException.class, () -> { + tableEndpoint.importDataset(DATABASE_3_ID, TABLE_8_ID, request, USER_3_PRINCIPAL); + }); + } + + @Test + @WithMockUser(username = USER_3_USERNAME, authorities = {"insert-table-data"}) + public void importDataset_writeOwnAccess_fails() throws RemoteUnavailableException, SidecarImportException, + SQLException, QueryMalformedException, StorageNotFoundException, TableNotFoundException, + MetadataServiceException, NotAllowedException { + final ImportCsvDto request = ImportCsvDto.builder() + .skipLines(1L) + .lineTermination("\\n") + .location("deadbeef") + .build(); + + /* mock */ + when(metadataServiceGateway.getTableById(DATABASE_3_ID, TABLE_8_ID)) + .thenReturn(TABLE_8_PRIVILEGED_DTO); + when(metadataServiceGateway.getAccess(DATABASE_3_ID, USER_3_ID)) + .thenReturn(DATABASE_3_USER_3_WRITE_OWN_ACCESS_DTO); + doThrow(SQLException.class) + .when(tableService) + .importDataset(any(PrivilegedTableDto.class), eq(request)); + + /* test */ + assertThrows(NotAllowedException.class, () -> { + tableEndpoint.importDataset(DATABASE_3_ID, TABLE_8_ID, request, USER_3_PRINCIPAL); + }); + } + + @Test + @WithMockUser(username = USER_3_USERNAME, authorities = {"insert-table-data"}) + public void importDataset_readAccess_fails() throws TableNotFoundException, RemoteUnavailableException, NotAllowedException, MetadataServiceException { final ImportCsvDto request = ImportCsvDto.builder() .skipLines(1L) @@ -887,7 +1396,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_1_USERNAME, authorities = {"insert-table-data"}) - public void importData_writeOwnAccess_succeeds() throws TableNotFoundException, RemoteUnavailableException, + public void importDataset_writeOwnAccess_succeeds() throws TableNotFoundException, RemoteUnavailableException, NotAllowedException, DatabaseUnavailableException, SidecarImportException, QueryMalformedException, StorageNotFoundException, MetadataServiceException { final ImportCsvDto request = ImportCsvDto.builder() @@ -908,7 +1417,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_3_USERNAME, authorities = {"insert-table-data"}) - public void importData_writeOwnAccessForeign_fails() throws TableNotFoundException, RemoteUnavailableException, + public void importDataset_writeOwnAccessForeign_fails() throws TableNotFoundException, RemoteUnavailableException, NotAllowedException, MetadataServiceException { final ImportCsvDto request = ImportCsvDto.builder() .skipLines(1L) @@ -930,7 +1439,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_3_USERNAME, authorities = {"insert-table-data"}) - public void importData_writeAllAccessForeign_succeeds() throws TableNotFoundException, RemoteUnavailableException, + public void importDataset_writeAllAccessForeign_succeeds() throws TableNotFoundException, RemoteUnavailableException, NotAllowedException, DatabaseUnavailableException, SidecarImportException, QueryMalformedException, StorageNotFoundException, MetadataServiceException { final ImportCsvDto request = ImportCsvDto.builder() @@ -949,4 +1458,90 @@ public class TableEndpointUnitTest extends AbstractUnitTest { tableEndpoint.importDataset(DATABASE_3_ID, TABLE_8_ID, request, USER_1_PRINCIPAL); } + @Test + @WithMockUser(username = USER_2_USERNAME, authorities = {"insert-table-data"}) + public void importDataset_privateForeign_succeeds() throws TableNotFoundException, RemoteUnavailableException, + NotAllowedException, DatabaseUnavailableException, SidecarImportException, QueryMalformedException, + StorageNotFoundException, MetadataServiceException { + final ImportCsvDto request = ImportCsvDto.builder() + .skipLines(1L) + .lineTermination("\\n") + .location("deadbeef") + .build(); + + /* mock */ + when(metadataServiceGateway.getTableById(DATABASE_1_ID, TABLE_1_ID)) + .thenReturn(TABLE_1_PRIVILEGED_DTO); + when(metadataServiceGateway.getAccess(DATABASE_1_ID, USER_2_ID)) + .thenReturn(DATABASE_1_USER_2_WRITE_ALL_ACCESS_DTO); + + /* test */ + tableEndpoint.importDataset(DATABASE_1_ID, TABLE_1_ID, request, USER_2_PRINCIPAL); + } + + @Test + @WithMockUser(username = USER_2_USERNAME, authorities = {"insert-table-data"}) + public void importDataset_private_succeeds() throws TableNotFoundException, RemoteUnavailableException, + NotAllowedException, DatabaseUnavailableException, SidecarImportException, QueryMalformedException, + StorageNotFoundException, MetadataServiceException { + final ImportCsvDto request = ImportCsvDto.builder() + .skipLines(1L) + .lineTermination("\\n") + .location("deadbeef") + .build(); + + /* mock */ + when(metadataServiceGateway.getTableById(DATABASE_1_ID, TABLE_2_ID)) + .thenReturn(TABLE_2_PRIVILEGED_DTO); + when(metadataServiceGateway.getAccess(DATABASE_1_ID, USER_2_ID)) + .thenReturn(DATABASE_1_USER_2_WRITE_OWN_ACCESS_DTO); + + /* test */ + tableEndpoint.importDataset(DATABASE_1_ID, TABLE_2_ID, request, USER_2_PRINCIPAL); + } + + @Test + @WithMockUser(username = USER_2_USERNAME, authorities = {"insert-table-data"}) + public void importDataset_privateForeign_fails() throws TableNotFoundException, RemoteUnavailableException, + NotAllowedException, MetadataServiceException { + final ImportCsvDto request = ImportCsvDto.builder() + .skipLines(1L) + .lineTermination("\\n") + .location("deadbeef") + .build(); + + /* mock */ + when(metadataServiceGateway.getTableById(DATABASE_1_ID, TABLE_1_ID)) + .thenReturn(TABLE_1_PRIVILEGED_DTO); + when(metadataServiceGateway.getAccess(DATABASE_1_ID, USER_2_ID)) + .thenReturn(DATABASE_1_USER_2_WRITE_OWN_ACCESS_DTO); + + /* test */ + assertThrows(NotAllowedException.class, () -> { + tableEndpoint.importDataset(DATABASE_1_ID, TABLE_1_ID, request, USER_2_PRINCIPAL); + }); + } + + @Test + @WithMockUser(username = USER_2_USERNAME, authorities = {"insert-table-data"}) + public void importDataset_privateReadAccess_fails() throws TableNotFoundException, RemoteUnavailableException, + NotAllowedException, MetadataServiceException { + final ImportCsvDto request = ImportCsvDto.builder() + .skipLines(1L) + .lineTermination("\\n") + .location("deadbeef") + .build(); + + /* mock */ + when(metadataServiceGateway.getTableById(DATABASE_1_ID, TABLE_2_ID)) + .thenReturn(TABLE_2_PRIVILEGED_DTO); + when(metadataServiceGateway.getAccess(DATABASE_1_ID, USER_2_ID)) + .thenReturn(DATABASE_1_USER_2_READ_ACCESS_DTO); + + /* test */ + assertThrows(NotAllowedException.class, () -> { + tableEndpoint.importDataset(DATABASE_1_ID, TABLE_2_ID, request, USER_2_PRINCIPAL); + }); + } + } diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/ViewEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/ViewEndpointUnitTest.java index 543b4a5cf299d48a8a4594f95e8586752d4278cc..fd1030c17bee1f169c01d33da8af86f339feecbe 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/ViewEndpointUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/ViewEndpointUnitTest.java @@ -17,11 +17,14 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.test.context.support.WithAnonymousUser; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.junit.jupiter.SpringExtension; import java.sql.SQLException; import java.time.Instant; +import java.util.List; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; @@ -64,6 +67,24 @@ public class ViewEndpointUnitTest extends AbstractUnitTest { assertEquals(HttpStatus.CREATED, response.getStatusCode()); } + @Test + @WithMockUser(username = USER_LOCAL_ADMIN_USERNAME, authorities = {"system"}) + public void create_unavailable_fails() throws DatabaseNotFoundException, RemoteUnavailableException, SQLException, + ViewMalformedException, MetadataServiceException { + + /* mock */ + when(metadataServiceGateway.getDatabaseById(DATABASE_1_ID)) + .thenReturn(DATABASE_1_PRIVILEGED_DTO); + doThrow(SQLException.class) + .when(viewService) + .create(DATABASE_1_PRIVILEGED_DTO, VIEW_1_CREATE_DTO); + + /* test */ + assertThrows(DatabaseUnavailableException.class, () -> { + viewEndpoint.create(DATABASE_1_ID, VIEW_1_CREATE_DTO); + }); + } + @Test @WithMockUser(username = USER_LOCAL_ADMIN_USERNAME) public void create_noRole_fails() throws DatabaseNotFoundException, RemoteUnavailableException, ViewMalformedException, @@ -97,6 +118,76 @@ public class ViewEndpointUnitTest extends AbstractUnitTest { }); } + @Test + @WithMockUser(username = USER_LOCAL_ADMIN_USERNAME, authorities = {"system"}) + public void getSchema_succeeds() throws DatabaseNotFoundException, RemoteUnavailableException, SQLException, + DatabaseMalformedException, DatabaseUnavailableException, ViewNotFoundException, MetadataServiceException { + + /* mock */ + when(metadataServiceGateway.getDatabaseById(DATABASE_1_ID)) + .thenReturn(DATABASE_1_PRIVILEGED_DTO); + when(viewService.getSchemas(DATABASE_1_PRIVILEGED_DTO)) + .thenReturn(List.of(VIEW_1_DTO, VIEW_2_DTO, VIEW_3_DTO)); + + /* test */ + final ResponseEntity<List<ViewDto>> response = viewEndpoint.getSchema(DATABASE_1_ID); + assertEquals(HttpStatus.OK, response.getStatusCode()); + } + + @Test + @WithAnonymousUser + public void getSchema_anonymous_fails() { + + /* test */ + assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { + viewEndpoint.getSchema(DATABASE_1_ID); + }); + } + + @Test + @WithMockUser(username = USER_LOCAL_ADMIN_USERNAME, authorities = {"system"}) + public void getSchema_databaseNotFound_fails() throws DatabaseNotFoundException, RemoteUnavailableException, + MetadataServiceException { + + /* mock */ + doThrow(DatabaseNotFoundException.class) + .when(metadataServiceGateway) + .getDatabaseById(DATABASE_1_ID); + + /* test */ + assertThrows(DatabaseNotFoundException.class, () -> { + viewEndpoint.getSchema(DATABASE_1_ID); + }); + } + + @Test + @WithMockUser(username = USER_LOCAL_ADMIN_USERNAME, authorities = {"system"}) + public void getSchema_unavailable_fails() throws DatabaseNotFoundException, RemoteUnavailableException, + SQLException, DatabaseMalformedException, ViewNotFoundException, MetadataServiceException { + + /* mock */ + when(metadataServiceGateway.getDatabaseById(DATABASE_1_ID)) + .thenReturn(DATABASE_1_PRIVILEGED_DTO); + doThrow(SQLException.class) + .when(viewService) + .getSchemas(DATABASE_1_PRIVILEGED_DTO); + + /* test */ + assertThrows(DatabaseUnavailableException.class, () -> { + viewEndpoint.getSchema(DATABASE_1_ID); + }); + } + + @Test + @WithAnonymousUser + public void delete_anonymous_fails() { + + /* test */ + assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { + viewEndpoint.delete(DATABASE_1_ID, VIEW_1_ID); + }); + } + @Test @WithMockUser(username = USER_LOCAL_ADMIN_USERNAME, authorities = {"system"}) public void delete_succeeds() throws DatabaseNotFoundException, RemoteUnavailableException, ViewMalformedException, @@ -114,6 +205,24 @@ public class ViewEndpointUnitTest extends AbstractUnitTest { assertEquals(HttpStatus.ACCEPTED, response.getStatusCode()); } + @Test + @WithMockUser(username = USER_LOCAL_ADMIN_USERNAME, authorities = {"system"}) + public void delete_unavailable_fails() throws RemoteUnavailableException, ViewMalformedException, SQLException, + MetadataServiceException, ViewNotFoundException { + + /* mock */ + when(metadataServiceGateway.getViewById(DATABASE_1_ID, VIEW_1_ID)) + .thenReturn(VIEW_1_PRIVILEGED_DTO); + doThrow(SQLException.class) + .when(viewService) + .delete(VIEW_1_PRIVILEGED_DTO); + + /* test */ + assertThrows(DatabaseUnavailableException.class, () -> { + viewEndpoint.delete(DATABASE_1_ID, VIEW_1_ID); + }); + } + @Test @WithMockUser(username = USER_LOCAL_ADMIN_USERNAME) public void delete_noRole_fails() throws DatabaseNotFoundException, RemoteUnavailableException, ViewMalformedException, @@ -150,7 +259,7 @@ public class ViewEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_1_USERNAME, authorities = {"view-database-view-data"}) - public void getData_succeeds() throws RemoteUnavailableException, ViewNotFoundException, ViewMalformedException, + public void getData_private_succeeds() throws RemoteUnavailableException, ViewNotFoundException, ViewMalformedException, SQLException, DatabaseUnavailableException, QueryMalformedException, PaginationException, NotAllowedException, MetadataServiceException { @@ -167,40 +276,79 @@ public class ViewEndpointUnitTest extends AbstractUnitTest { /* test */ final ResponseEntity<QueryResultDto> response = viewEndpoint.getData(DATABASE_1_ID, VIEW_1_ID, null, null, null, httpServletRequest, USER_1_PRINCIPAL); assertEquals(HttpStatus.OK, response.getStatusCode()); - assertNotNull(response.getHeaders().get("Access-Control-Expose-Headers")); - assertEquals(1, response.getHeaders().get("Access-Control-Expose-Headers").size()); - assertEquals("X-Count", response.getHeaders().get("Access-Control-Expose-Headers").get(0)); assertNotNull(response.getBody()); } @Test @WithMockUser(username = USER_1_USERNAME, authorities = {"view-database-view-data"}) - public void getData_onlyHead_succeeds() throws RemoteUnavailableException, ViewNotFoundException, + public void getData_privateHead_succeeds() throws RemoteUnavailableException, ViewNotFoundException, ViewMalformedException, SQLException, DatabaseUnavailableException, QueryMalformedException, PaginationException, NotAllowedException, MetadataServiceException { /* mock */ - when(metadataServiceGateway.getViewById(DATABASE_1_ID, VIEW_1_ID)) - .thenReturn(VIEW_1_PRIVILEGED_DTO); + when(metadataServiceGateway.getViewById(DATABASE_1_ID, VIEW_3_ID)) + .thenReturn(VIEW_3_PRIVILEGED_DTO); when(metadataServiceGateway.getAccess(DATABASE_1_ID, USER_1_ID)) .thenReturn(DATABASE_1_USER_1_READ_ACCESS_DTO); when(httpServletRequest.getMethod()) .thenReturn("HEAD"); - when(viewService.count(eq(VIEW_1_PRIVILEGED_DTO), any(Instant.class))) - .thenReturn(VIEW_1_DATA_COUNT); + when(viewService.count(eq(VIEW_3_PRIVILEGED_DTO), any(Instant.class))) + .thenReturn(VIEW_3_DATA_COUNT); /* test */ - final ResponseEntity<QueryResultDto> response = viewEndpoint.getData(DATABASE_1_ID, VIEW_1_ID, null, null, null, httpServletRequest, USER_1_PRINCIPAL); + final ResponseEntity<QueryResultDto> response = viewEndpoint.getData(DATABASE_1_ID, VIEW_3_ID, null, null, null, httpServletRequest, USER_1_PRINCIPAL); assertEquals(HttpStatus.OK, response.getStatusCode()); assertNotNull(response.getHeaders().get("X-Count")); assertEquals(1, response.getHeaders().get("X-Count").size()); - assertEquals(VIEW_1_DATA_COUNT, Long.parseLong(response.getHeaders().get("X-Count").get(0))); + assertEquals(VIEW_3_DATA_COUNT, Long.parseLong(response.getHeaders().get("X-Count").get(0))); assertNotNull(response.getHeaders().get("Access-Control-Expose-Headers")); assertEquals(1, response.getHeaders().get("Access-Control-Expose-Headers").size()); assertEquals("X-Count", response.getHeaders().get("Access-Control-Expose-Headers").get(0)); assertNull(response.getBody()); } + @Test + @WithMockUser(username = USER_1_USERNAME, authorities = {"view-database-view-data"}) + public void getData_unavailable_fails() throws RemoteUnavailableException, ViewNotFoundException, SQLException, + ViewMalformedException, NotAllowedException, MetadataServiceException { + + /* mock */ + when(metadataServiceGateway.getViewById(DATABASE_1_ID, VIEW_1_ID)) + .thenReturn(VIEW_1_PRIVILEGED_DTO); + when(metadataServiceGateway.getAccess(DATABASE_1_ID, USER_1_ID)) + .thenReturn(DATABASE_1_USER_1_READ_ACCESS_DTO); + when(httpServletRequest.getMethod()) + .thenReturn("GET"); + doThrow(SQLException.class) + .when(viewService) + .data(eq(VIEW_1_PRIVILEGED_DTO), any(Instant.class), eq(0L), eq(10L)); + + /* test */ + assertThrows(DatabaseUnavailableException.class, () -> { + viewEndpoint.getData(DATABASE_1_ID, VIEW_1_ID, null, null, null, httpServletRequest, USER_1_PRINCIPAL); + }); + } + + @Test + @WithMockUser(username = USER_1_USERNAME, authorities = {"view-database-view-data"}) + public void getData_privateNoAccess_succeeds() throws RemoteUnavailableException, ViewNotFoundException, + NotAllowedException, MetadataServiceException { + + /* mock */ + when(metadataServiceGateway.getViewById(DATABASE_1_ID, VIEW_3_ID)) + .thenReturn(VIEW_3_PRIVILEGED_DTO); + when(httpServletRequest.getMethod()) + .thenReturn("GET"); + doThrow(NotAllowedException.class) + .when(metadataServiceGateway) + .getAccess(DATABASE_1_ID, USER_1_ID); + + /* test */ + assertThrows(NotAllowedException.class, () -> { + viewEndpoint.getData(DATABASE_1_ID, VIEW_3_ID, null, null, null, httpServletRequest, USER_1_PRINCIPAL); + }); + } + @Test @WithMockUser(username = USER_1_USERNAME, authorities = {"view-database-view-data"}) public void getData_viewNotFound_fails() throws RemoteUnavailableException, ViewNotFoundException, diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/handlers/ApiExceptionHandlerTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/handlers/ApiExceptionHandlerTest.java new file mode 100644 index 0000000000000000000000000000000000000000..ce56ce82da975f8f41d7233b0a017143044457ed --- /dev/null +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/handlers/ApiExceptionHandlerTest.java @@ -0,0 +1,1232 @@ +package at.tuwien.handlers; + +import at.tuwien.api.error.ApiErrorDto; +import at.tuwien.exception.*; +import at.tuwien.test.AbstractUnitTest; +import lombok.extern.log4j.Log4j2; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.web.bind.annotation.ResponseStatus; + +import java.io.IOException; +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.List; +import java.util.Optional; + +import static at.tuwien.test.utils.EndpointUtils.getErrorCodes; +import static at.tuwien.test.utils.EndpointUtils.getExceptions; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +@Log4j2 +@ExtendWith(SpringExtension.class) +@SpringBootTest +public class ApiExceptionHandlerTest extends AbstractUnitTest { + + @Autowired + private ApiExceptionHandler apiExceptionHandler; + + @Test + public void handle_succeeds() throws ClassNotFoundException, IOException { + final List<Method> handlers = Arrays.asList(ApiExceptionHandler.class.getMethods()); + final List<String> errorCodes = getErrorCodes(); + + /* test */ + for (Class<?> exception : getExceptions()) { + final Optional<Method> optional = handlers.stream().filter(h -> Arrays.asList(h.getParameterTypes()).contains(exception)).findFirst(); + if (optional.isEmpty()) { + Assertions.fail("Exception " + exception.getName() + " does not have a corresponding handle method in the endpoint"); + } + final Method method = optional.get(); + /* exception */ + assertNotNull(exception.getDeclaredAnnotation(ResponseStatus.class).code()); + Assertions.assertNotEquals(exception.getDeclaredAnnotation(ResponseStatus.class).code(), HttpStatus.INTERNAL_SERVER_ERROR); + assertNotNull(exception.getDeclaredAnnotation(ResponseStatus.class).reason(), "Exception " + exception.getName() + " does not provide a reason code"); + Assertions.assertTrue(errorCodes.contains(exception.getDeclaredAnnotation(ResponseStatus.class).reason()), "Exception code " + exception.getDeclaredAnnotation(ResponseStatus.class).reason() + " does have a reason code mapped in localized ui error messages"); + /* handler method */ + Assertions.assertEquals(method.getDeclaredAnnotation(ResponseStatus.class).code(), exception.getDeclaredAnnotation(ResponseStatus.class).code()); + } + } + + @Test + public void generic_handle_succeeds() { + + /* test */ + apiExceptionHandler.generic_handle(DatabaseNotFoundException.class, "msg"); + } + + @Test + public void handle_AccessDeniedException_succeeds() { + final AccessDeniedException request = new AccessDeniedException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + Assertions.assertNotEquals(response.getStatusCode(), HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(HttpStatus.UNAUTHORIZED, response.getStatusCode()); + assertNotNull(response.getBody()); + assertEquals("error.access.denied", response.getBody().getCode()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_AccessNotFoundException_succeeds() { + final AccessNotFoundException request = new AccessNotFoundException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_AccountNotSetupException_succeeds() { + final AccountNotSetupException request = new AccountNotSetupException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_AuthServiceConnectionException_succeeds() { + final AuthServiceConnectionException request = new AuthServiceConnectionException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_AuthServiceException_succeeds() { + final AuthServiceException request = new AuthServiceException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_BrokerServiceConnectionException_succeeds() { + final BrokerServiceConnectionException request = new BrokerServiceConnectionException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_BrokerServiceException_succeeds() { + final BrokerServiceException request = new BrokerServiceException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_ConceptNotFoundException_succeeds() { + final ConceptNotFoundException request = new ConceptNotFoundException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_ContainerAlreadyExistsException_succeeds() { + final ContainerAlreadyExistsException request = new ContainerAlreadyExistsException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_ContainerNotFoundException_succeeds() { + final ContainerNotFoundException request = new ContainerNotFoundException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_CredentialsInvalidException_succeeds() { + final CredentialsInvalidException request = new CredentialsInvalidException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_DatabaseMalformedException_succeeds() { + final DatabaseMalformedException request = new DatabaseMalformedException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_DatabaseNotFoundException_succeeds() { + final DatabaseNotFoundException request = new DatabaseNotFoundException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_DatabaseUnavailableException_succeeds() { + final DatabaseUnavailableException request = new DatabaseUnavailableException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_DoiNotFoundException_succeeds() { + final DoiNotFoundException request = new DoiNotFoundException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_EmailExistsException_succeeds() { + final EmailExistsException request = new EmailExistsException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_ExchangeNotFoundException_succeeds() { + final ExchangeNotFoundException request = new ExchangeNotFoundException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_ExternalServiceException_succeeds() { + final ExternalServiceException request = new ExternalServiceException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_FilterBadRequestException_succeeds() { + final FilterBadRequestException request = new FilterBadRequestException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_FormatNotAvailableException_succeeds() { + final FormatNotAvailableException request = new FormatNotAvailableException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_IdentifierNotFoundException_succeeds() { + final IdentifierNotFoundException request = new IdentifierNotFoundException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_IdentifierNotSupportedException_succeeds() { + final IdentifierNotSupportedException request = new IdentifierNotSupportedException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_ImageAlreadyExistsException_succeeds() { + final ImageAlreadyExistsException request = new ImageAlreadyExistsException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_ImageInvalidException_succeeds() { + final ImageInvalidException request = new ImageInvalidException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_ImageNotFoundException_succeeds() { + final ImageNotFoundException request = new ImageNotFoundException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_LicenseNotFoundException_succeeds() { + final LicenseNotFoundException request = new LicenseNotFoundException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_MalformedException_succeeds() { + final MalformedException request = new MalformedException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_MessageNotFoundException_succeeds() { + final MessageNotFoundException request = new MessageNotFoundException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_MetadataServiceConnectionException_succeeds() { + final MetadataServiceConnectionException request = new MetadataServiceConnectionException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_MetadataServiceException_succeeds() { + final MetadataServiceException request = new MetadataServiceException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_NotAllowedException_succeeds() { + final NotAllowedException request = new NotAllowedException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_OntologyNotFoundException_succeeds() { + final OntologyNotFoundException request = new OntologyNotFoundException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_OrcidNotFoundException_succeeds() { + final OrcidNotFoundException request = new OrcidNotFoundException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_PaginationException_succeeds() { + final PaginationException request = new PaginationException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_QueryMalformedException_succeeds() { + final QueryMalformedException request = new QueryMalformedException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_QueryNotFoundException_succeeds() { + final QueryNotFoundException request = new QueryNotFoundException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_QueryNotSupportedException_succeeds() { + final QueryNotSupportedException request = new QueryNotSupportedException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_QueueNotFoundException_succeeds() { + final QueueNotFoundException request = new QueueNotFoundException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_QueryStoreCreateException_succeeds() { + final QueryStoreCreateException request = new QueryStoreCreateException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_QueryStoreGCException_succeeds() { + final QueryStoreGCException request = new QueryStoreGCException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_QueryStoreInsertException_succeeds() { + final QueryStoreInsertException request = new QueryStoreInsertException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_QueryStorePersistException_succeeds() { + final QueryStorePersistException request = new QueryStorePersistException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_RemoteUnavailableException_succeeds() { + final RemoteUnavailableException request = new RemoteUnavailableException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_RorNotFoundException_succeeds() { + final RorNotFoundException request = new RorNotFoundException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_SearchServiceConnectionException_succeeds() { + final SearchServiceConnectionException request = new SearchServiceConnectionException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_SearchServiceException_succeeds() { + final SearchServiceException request = new SearchServiceException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_SemanticEntityNotFoundException_succeeds() { + final SemanticEntityNotFoundException request = new SemanticEntityNotFoundException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_DataServiceConnectionException_succeeds() { + final DataServiceConnectionException request = new DataServiceConnectionException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_DataServiceException_succeeds() { + final DataServiceException request = new DataServiceException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_SidecarExportException_succeeds() { + final SidecarExportException request = new SidecarExportException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_SidecarImportException_succeeds() { + final SidecarImportException request = new SidecarImportException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_SortException_succeeds() { + final SortException request = new SortException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_StorageNotFoundException_succeeds() { + final StorageNotFoundException request = new StorageNotFoundException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_StorageUnavailableException_succeeds() { + final StorageUnavailableException request = new StorageUnavailableException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_TableExistsException_succeeds() { + final TableExistsException request = new TableExistsException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_TableMalformedException_succeeds() { + final TableMalformedException request = new TableMalformedException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_TableSchemaException_succeeds() { + final TableSchemaException request = new TableSchemaException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_TableNotFoundException_succeeds() { + final TableNotFoundException request = new TableNotFoundException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_UnitNotFoundException_succeeds() { + final UnitNotFoundException request = new UnitNotFoundException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_UriMalformedException_succeeds() { + final UriMalformedException request = new UriMalformedException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_UserExistsException_succeeds() { + final UserExistsException request = new UserExistsException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_UserNotFoundException_succeeds() { + final UserNotFoundException request = new UserNotFoundException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_ViewMalformedException_succeeds() { + final ViewMalformedException request = new ViewMalformedException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_ViewNotFoundException_succeeds() { + final ViewNotFoundException request = new ViewNotFoundException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + + + @Test + public void handle_ViewSchemaException_succeeds() { + final ViewSchemaException request = new ViewSchemaException("msg"); + + /* test */ + final ResponseEntity<ApiErrorDto> response = apiExceptionHandler.handle(request); + assertNotNull(response); + assertNotNull(request.getClass().getDeclaredAnnotation(ResponseStatus.class).code()); + final HttpStatus httpStatus = request.getClass().getDeclaredAnnotation(ResponseStatus.class).code(); + Assertions.assertNotEquals(httpStatus, HttpStatus.INTERNAL_SERVER_ERROR); + assertEquals(httpStatus, response.getStatusCode()); + assertNotNull(response.getBody()); + assertNotNull(response.getBody().getCode()); + assertEquals(httpStatus, response.getBody().getStatus()); + assertEquals("msg", response.getBody().getMessage()); + } + +} diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/mvc/PrometheusEndpointMvcTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/mvc/PrometheusEndpointMvcTest.java index 5898372633b0d63c5b256f6b567f8a8869583ab7..b331a03fa60915290380b5ff233fd51a0996ee36 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/mvc/PrometheusEndpointMvcTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/mvc/PrometheusEndpointMvcTest.java @@ -196,12 +196,7 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest { /* ignore */ } try { - tableEndpoint.exportData(DATABASE_1_ID, TABLE_1_ID, null, USER_1_PRINCIPAL); - } catch (Exception e) { - /* ignore */ - } - try { - tableEndpoint.exportData(DATABASE_1_ID, TABLE_1_ID, null, USER_1_PRINCIPAL); + tableEndpoint.exportDataset(DATABASE_1_ID, TABLE_1_ID, null, USER_1_PRINCIPAL); } catch (Exception e) { /* ignore */ } diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SubsetServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SubsetServiceIntegrationTest.java index aeaae0ecf2626ff88027a210bd8e24a5c66d4ede..b33a76506c15b77df3e0243754ca57b6dfcd9ed4 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SubsetServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SubsetServiceIntegrationTest.java @@ -11,9 +11,10 @@ import at.tuwien.exception.*; import at.tuwien.gateway.DataDatabaseSidecarGateway; import at.tuwien.gateway.MetadataServiceGateway; import at.tuwien.test.AbstractUnitTest; +import at.tuwien.utils.FileUtils; import com.google.common.hash.Hashing; import lombok.extern.log4j.Log4j2; -import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.RandomUtils; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; @@ -387,13 +388,13 @@ public class SubsetServiceIntegrationTest extends AbstractUnitTest { protected void export_generic() throws StorageUnavailableException, SQLException, QueryMalformedException, SidecarExportException, MetadataServiceException, RemoteUnavailableException, StorageNotFoundException, IOException, InterruptedException { - final String filename = "68b329da9893e34099c7d8ad5cb9c940"; + final String filename = RandomStringUtils.randomAlphanumeric(40).toLowerCase() + ".tmp"; + EXPORT_RESOURCE_DTO.setFilename(filename); /* pre-condition */ Thread.sleep(1000) /* wait for test container some more */; /* mock */ - FileUtils.deleteQuietly(new File(s3Config.getS3FilePath() + "/" + filename)); doNothing() .when(dataDatabaseSidecarGateway) .exportFile(anyString(), anyInt(), eq(filename)); diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java index e12b5bdc75962076ab52466b6c12493d109ccf64..4ebaba4931327a80ba319ae6407e3dc3547e1dc7 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java @@ -18,6 +18,8 @@ import at.tuwien.api.database.table.constraints.unique.UniqueDto; import at.tuwien.api.database.table.internal.TableCreateDto; import at.tuwien.config.MariaDbConfig; import at.tuwien.config.MariaDbContainerConfig; +import at.tuwien.config.QueryConfig; +import at.tuwien.config.S3Config; import at.tuwien.exception.*; import at.tuwien.gateway.DataDatabaseSidecarGateway; import at.tuwien.gateway.MetadataServiceGateway; @@ -43,6 +45,9 @@ import java.io.IOException; import java.io.InputStream; import java.math.BigDecimal; import java.math.BigInteger; +import java.nio.charset.Charset; +import java.nio.file.attribute.FileAttribute; +import java.nio.file.attribute.PosixFilePermissions; import java.sql.SQLException; import java.time.Instant; import java.util.*; @@ -63,6 +68,9 @@ public class TableServiceIntegrationTest extends AbstractUnitTest { @Autowired private TableService tableService; + @Autowired + private QueryConfig queryConfig; + @MockBean private MetadataServiceGateway metadataServiceGateway; @@ -86,7 +94,9 @@ public class TableServiceIntegrationTest extends AbstractUnitTest { /* metadata database */ MariaDbConfig.dropDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_INTERNALNAME); MariaDbConfig.dropDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_2_INTERNALNAME); + MariaDbConfig.dropDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_3_INTERNALNAME); MariaDbConfig.createInitDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_DTO); + MariaDbConfig.createInitDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_3_DTO); } @Test @@ -252,6 +262,35 @@ public class TableServiceIntegrationTest extends AbstractUnitTest { assertEquals("0.2", result.get(0).get("rainfall")); } + @Test + public void createTuple_autogeneratedBlob_succeeds() throws SQLException, RemoteUnavailableException, ContainerNotFoundException, + TableNotFoundException, TableMalformedException, QueryMalformedException, StorageUnavailableException, + StorageNotFoundException, MetadataServiceException { + final String s3key = "2eec905f-17ed-41de-b12f-283c0aa3e4f9"; + final byte[] s3data = new byte[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + /* add row with primary key */ + final TupleDto request = TupleDto.builder() + .data(new HashMap<>() {{ + put("value", "24.3"); + put("raw", s3key); + }}) + .build(); + + /* mock */ + when(metadataServiceGateway.getContainerById(CONTAINER_1_ID)) + .thenReturn(CONTAINER_1_PRIVILEGED_DTO); + when(storageService.getBytes(s3key)) + .thenReturn(s3data); + when(metadataServiceGateway.getTableById(DATABASE_3_ID, TABLE_8_ID)) + .thenReturn(TABLE_8_PRIVILEGED_DTO); + + /* test */ + tableService.createTuple(TABLE_8_PRIVILEGED_DTO, request); + final List<Map<String, byte[]>> result = MariaDbConfig.selectQueryByteArr(DATABASE_3_PRIVILEGED_DTO, "SELECT raw FROM mfcc WHERE raw IS NOT NULL", Set.of("raw")); + assertNotNull(result.get(0).get("raw")); + assertArrayEquals(s3data, result.get(0).get("raw")); + } + @Test public void createTuple_notInOrder_succeeds() throws SQLException, RemoteUnavailableException, ContainerNotFoundException, TableNotFoundException, TableMalformedException, QueryMalformedException, @@ -468,7 +507,16 @@ public class TableServiceIntegrationTest extends AbstractUnitTest { final TableDto response = tableService.createTable(DATABASE_1_PRIVILEGED_DTO, TABLE_4_CREATE_INTERNAL_DTO); assertEquals(TABLE_4_NAME, response.getName()); assertEquals(TABLE_4_INTERNALNAME, response.getInternalName()); - assertEquals(TABLE_4_COLUMNS.size(), response.getColumns().size()); + final List<ColumnDto> columns = response.getColumns(); + assertEquals(TABLE_4_COLUMNS.size(), columns.size()); + assertColumn(columns.get(0), null, null, DATABASE_1_ID, "timestamp", "timestamp", ColumnTypeDto.TIMESTAMP, null, null, false, queryConfig.getDefaultTimestampFormatId(), null); + assertColumn(columns.get(1), null, null, DATABASE_1_ID, "value", "value", ColumnTypeDto.DECIMAL, 10L, 10L, true, null, null); + final ConstraintsDto constraints = response.getConstraints(); + assertNotNull(constraints); + final Set<PrimaryKeyDto> primaryKey = constraints.getPrimaryKey(); + Assertions.assertEquals(1, primaryKey.size()); + final Set<String> checks = constraints.getChecks(); + Assertions.assertEquals(0, checks.size()); } @Test @@ -532,6 +580,66 @@ public class TableServiceIntegrationTest extends AbstractUnitTest { }); } + @Test + public void create_compositePrimaryKey_fails() throws TableNotFoundException, TableMalformedException, SQLException, + TableExistsException { + final at.tuwien.api.database.table.internal.TableCreateDto request = TableCreateDto.builder() + .name("composite_primary_key") + .columns(List.of(ColumnCreateDto.builder() + .name("name") + .type(ColumnTypeDto.VARCHAR) + .size(255L) + .nullAllowed(false) + .build(), + ColumnCreateDto.builder() + .name("lat") + .type(ColumnTypeDto.DECIMAL) + .size(10L) + .d(10L) + .nullAllowed(false) + .build(), + ColumnCreateDto.builder() + .name("lng") + .type(ColumnTypeDto.DECIMAL) + .size(10L) + .d(10L) + .nullAllowed(false) + .build())) + .constraints(ConstraintsCreateDto.builder() + .primaryKey(Set.of("lat", "lng")) + .foreignKeys(List.of()) + .checks(Set.of()) + .uniques(List.of()) + .build()) + .build(); + + /* test */ + final TableDto response = tableService.createTable(DATABASE_1_PRIVILEGED_DTO, request); + assertEquals("composite_primary_key", response.getName()); + assertEquals("composite_primary_key", response.getInternalName()); + final List<ColumnDto> columns = response.getColumns(); + assertEquals(3, columns.size()); + assertColumn(columns.get(0), null, null, DATABASE_1_ID, "name", "name", ColumnTypeDto.VARCHAR, 255L, null, false, null, null); + assertColumn(columns.get(1), null, null, DATABASE_1_ID, "lat", "lat", ColumnTypeDto.DECIMAL, 10L, 10L, false, null, null); + assertColumn(columns.get(2), null, null, DATABASE_1_ID, "lng", "lng", ColumnTypeDto.DECIMAL, 10L, 10L, false, null, null); + final ConstraintsDto constraints = response.getConstraints(); + assertNotNull(constraints); + final Set<String> checks = constraints.getChecks(); + assertNotNull(checks); + assertEquals(0, checks.size()); + final List<PrimaryKeyDto> primaryKeys = new LinkedList<>(constraints.getPrimaryKey()); + assertNotNull(primaryKeys); + assertEquals(2, primaryKeys.size()); + assertEquals("lat", primaryKeys.get(0).getColumn().getInternalName()); + assertEquals("lng", primaryKeys.get(1).getColumn().getInternalName()); + final List<ForeignKeyDto> foreignKeys = constraints.getForeignKeys(); + assertNotNull(foreignKeys); + assertEquals(0, foreignKeys.size()); + final List<UniqueDto> uniques = constraints.getUniques(); + assertNotNull(uniques); + assertEquals(0, uniques.size()); + } + @Test public void create_needSequence_succeeds() throws TableNotFoundException, TableMalformedException, SQLException, TableExistsException { @@ -672,7 +780,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest { /* mock */ final File source = new File("src/test/resources/csv/weather_aus.csv"); - final File target = new File("/tmp/weather_aus.csv"); + final File target = new File("/tmp/weather_aus.csv") /* must be /tmp */; log.trace("copy dataset from {} to {}", source.toPath().toAbsolutePath(), target.toPath().toAbsolutePath()); FileUtils.copyFile(source, target); doNothing() diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/utils/FileUtils.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/utils/FileUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..5746d8dfcfa1de0be7bd707e1c8b3cabf3e82d30 --- /dev/null +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/utils/FileUtils.java @@ -0,0 +1,14 @@ +package at.tuwien.utils; + +import java.io.File; +import java.io.IOException; + +public class FileUtils { + + public static void delete(File file) throws IOException { + if (file.exists()) { + org.apache.commons.io.FileUtils.forceDelete(file); + } + } + +} diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/utils/UserUtilTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/utils/UserUtilTest.java index 13806e93ddd1cbeb7a8e1c0ab4e0fe38db0830ad..13ddfce8d3c171b79096d2e0d1d05948848a8c86 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/utils/UserUtilTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/utils/UserUtilTest.java @@ -8,6 +8,13 @@ import static org.junit.jupiter.api.Assertions.*; public class UserUtilTest extends BaseTest { + @Test + public void constructor_succeeds() { + + /* test */ + new UserUtil(); + } + @Test public void hasRole_succeeds() { assertTrue(UserUtil.hasRole(USER_1_PRINCIPAL, "find-container")); diff --git a/dbrepo-data-service/rest-service/src/test/resources/init/musicology.sql b/dbrepo-data-service/rest-service/src/test/resources/init/musicology.sql index 4d2c8deb43ede5de84cd321a302e97ef84038508..a2fc3f2b313cdd536e8ccba075bf7353be2b1438 100644 --- a/dbrepo-data-service/rest-service/src/test/resources/init/musicology.sql +++ b/dbrepo-data-service/rest-service/src/test/resources/init/musicology.sql @@ -6,7 +6,8 @@ CREATE SEQUENCE seq_mfcc; CREATE TABLE mfcc ( id BIGINT PRIMARY KEY NOT NULL DEFAULT nextval(`seq_mfcc`), - value DECIMAL NOT NULL + value DECIMAL NOT NULL, + raw LONGBLOB NULL ) WITH SYSTEM VERSIONING; INSERT INTO `mfcc` (`value`) diff --git a/dbrepo-data-service/services/pom.xml b/dbrepo-data-service/services/pom.xml index 0b57ceef9d0e575cdedd03c769ecc24aacf682e5..ccb8ca4360458a9db0797a7f833703dc1d7dc4ca 100644 --- a/dbrepo-data-service/services/pom.xml +++ b/dbrepo-data-service/services/pom.xml @@ -6,12 +6,12 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-data-service</artifactId> - <version>1.4.5</version> + <version>1.4.6</version> </parent> <artifactId>services</artifactId> <name>dbrepo-data-service-services</name> - <version>1.4.5</version> + <version>1.4.6</version> <dependencies> <dependency> @@ -22,7 +22,7 @@ <dependency> <groupId>at.tuwien</groupId> <artifactId>dbrepo-data-service-querystore</artifactId> - <version>1.4.5</version> + <version>1.4.6</version> </dependency> </dependencies> diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/config/KeycloakConfig.java b/dbrepo-data-service/services/src/main/java/at/tuwien/config/KeycloakConfig.java index e0d7d0321513387f1e1c9c235c1c4b51e309be1d..cc6960ba39be294a61e059f3a3f45ecfc8e820fd 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/config/KeycloakConfig.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/config/KeycloakConfig.java @@ -1,12 +1,8 @@ package at.tuwien.config; -import at.tuwien.interceptor.KeycloakInterceptor; import lombok.Getter; import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.util.DefaultUriBuilderFactory; @Getter @Configuration @@ -26,13 +22,4 @@ public class KeycloakConfig { @Value("${dbrepo.keycloak.clientSecret}") private String keycloakClientSecret; - - @Bean("keycloakRestTemplate") - public RestTemplate brokerRestTemplate() { - final RestTemplate restTemplate = new RestTemplate(); - restTemplate.setUriTemplateHandler(new DefaultUriBuilderFactory(keycloakEndpoint)); - restTemplate.getInterceptors() - .add(new KeycloakInterceptor(keycloakUsername, keycloakPassword, keycloakEndpoint)); - return restTemplate; - } } diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/config/WebSecurityConfig.java b/dbrepo-data-service/services/src/main/java/at/tuwien/config/WebSecurityConfig.java index 1560c14b7aaa6272c76515a734a1ad99f7075222..e1f763b3b7924748fe80f4485bbef2d3b05cfa23 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/config/WebSecurityConfig.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/config/WebSecurityConfig.java @@ -54,7 +54,8 @@ public class WebSecurityConfig { ); final OrRequestMatcher publicEndpoints = new OrRequestMatcher( new AntPathRequestMatcher("/api/**", "GET"), - new AntPathRequestMatcher("/api/**", "HEAD") + new AntPathRequestMatcher("/api/**", "HEAD"), + new AntPathRequestMatcher("/api/database/**/subset", "POST") ); /* enable CORS and disable CSRF */ http = http.cors().and().csrf().disable(); diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/MetadataServiceGateway.java b/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/MetadataServiceGateway.java index d16c8c8eba81efd22a64757a6dd1eb51dc56318f..282e7d593feec58991dc9f4530e3314fa208eb29 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/MetadataServiceGateway.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/MetadataServiceGateway.java @@ -8,6 +8,7 @@ import at.tuwien.api.database.table.TableStatisticDto; import at.tuwien.api.database.table.internal.PrivilegedTableDto; import at.tuwien.api.identifier.IdentifierDto; import at.tuwien.api.user.PrivilegedUserDto; +import at.tuwien.api.user.UserBriefDto; import at.tuwien.api.user.UserDto; import at.tuwien.exception.*; import jakarta.validation.constraints.NotNull; @@ -22,9 +23,9 @@ public interface MetadataServiceGateway { * * @param containerId The container id * @return The container with privileged connection information, if successful. - * @throws ContainerNotFoundException The table was not found in the metadata service. + * @throws ContainerNotFoundException The table was not found in the metadata service. * @throws RemoteUnavailableException The remote service is not available. - * @throws MetadataServiceException The remote service returned invalid data. + * @throws MetadataServiceException The remote service returned invalid data. */ PrivilegedContainerDto getContainerById(Long containerId) throws RemoteUnavailableException, ContainerNotFoundException, MetadataServiceException; @@ -36,7 +37,7 @@ public interface MetadataServiceGateway { * @return The database, if successful. * @throws DatabaseNotFoundException The database was not found in the metadata service. * @throws RemoteUnavailableException The remote service is not available. - * @throws MetadataServiceException The remote service returned invalid data. + * @throws MetadataServiceException The remote service returned invalid data. */ PrivilegedDatabaseDto getDatabaseById(Long id) throws DatabaseNotFoundException, RemoteUnavailableException, MetadataServiceException; @@ -48,7 +49,7 @@ public interface MetadataServiceGateway { * @return The database, if successful. * @throws DatabaseNotFoundException The database was not found in the metadata service. * @throws RemoteUnavailableException The remote service is not available. - * @throws MetadataServiceException The remote service returned invalid data. + * @throws MetadataServiceException The remote service returned invalid data. */ PrivilegedDatabaseDto getDatabaseByInternalName(String internalName) throws DatabaseNotFoundException, RemoteUnavailableException, MetadataServiceException; @@ -61,19 +62,20 @@ public interface MetadataServiceGateway { * @return The table, if successful. * @throws TableNotFoundException The table was not found in the metadata service. * @throws RemoteUnavailableException The remote service is not available. - * @throws MetadataServiceException The remote service returned invalid data. + * @throws MetadataServiceException The remote service returned invalid data. */ PrivilegedTableDto getTableById(Long databaseId, Long id) throws TableNotFoundException, RemoteUnavailableException, MetadataServiceException; /** * Get a view with given database id and view id from the metadata service. + * * @param databaseId The database id. * @param id The view id. * @return The view, if successful. - * @throws ViewNotFoundException The view was not found in the metadata service. + * @throws ViewNotFoundException The view was not found in the metadata service. * @throws RemoteUnavailableException The remote service is not available. - * @throws MetadataServiceException The remote service returned invalid data. + * @throws MetadataServiceException The remote service returned invalid data. */ PrivilegedViewDto getViewById(Long databaseId, Long id) throws RemoteUnavailableException, ViewNotFoundException, MetadataServiceException; @@ -85,10 +87,21 @@ public interface MetadataServiceGateway { * @return The user, if successful. * @throws RemoteUnavailableException The remote service is not available and invalid data was returned. * @throws UserNotFoundException The user was not found in the metadata service. - * @throws MetadataServiceException The remote service returned invalid data. + * @throws MetadataServiceException The remote service returned invalid data. */ UserDto getUserById(UUID userId) throws RemoteUnavailableException, UserNotFoundException, MetadataServiceException; + /** + * Get a user with given username from the metadata service. + * + * @return The user, if successful. Otherwise empty list. + * @throws RemoteUnavailableException The remote service is not available and invalid data was returned. + * @throws UserNotFoundException The user was not found in the metadata service. + * @throws MetadataServiceException The remote service returned invalid data. + */ + UUID getSystemUserId() throws RemoteUnavailableException, UserNotFoundException, + MetadataServiceException; + /** * Get a user with given user id from the metadata service. * @@ -96,42 +109,45 @@ public interface MetadataServiceGateway { * @return The user, if successful. * @throws RemoteUnavailableException The remote service is not available and invalid data was returned. * @throws UserNotFoundException The user was not found in the metadata service. - * @throws MetadataServiceException The remote service returned invalid data. + * @throws MetadataServiceException The remote service returned invalid data. */ PrivilegedUserDto getPrivilegedUserById(UUID userId) throws RemoteUnavailableException, UserNotFoundException, MetadataServiceException; /** * Get database access for a given user and database id from the metadata service. + * * @param databaseId The database id. - * @param userId The user id. + * @param userId The user id. * @return The database access, if successful. * @throws RemoteUnavailableException The remote service is not available and invalid data was returned. - * @throws NotAllowedException The access to this database is denied for the given user. - * @throws MetadataServiceException The remote service returned invalid data. + * @throws NotAllowedException The access to this database is denied for the given user. + * @throws MetadataServiceException The remote service returned invalid data. */ DatabaseAccessDto getAccess(Long databaseId, UUID userId) throws RemoteUnavailableException, NotAllowedException, MetadataServiceException; /** * Get a list of identifiers for a given database id and optional subset id. + * * @param databaseId The database id. - * @param subsetId The subset id. Optional. + * @param subsetId The subset id. Optional. * @return The list of identifiers. * @throws RemoteUnavailableException The remote service is not available and invalid data was returned. - * @throws DatabaseNotFoundException The database was not found. - * @throws MetadataServiceException The remote service returned invalid data. + * @throws DatabaseNotFoundException The database was not found. + * @throws MetadataServiceException The remote service returned invalid data. */ List<IdentifierDto> getIdentifiers(@NotNull Long databaseId, Long subsetId) throws MetadataServiceException, RemoteUnavailableException, DatabaseNotFoundException; /** * Update the table statistics in the metadata service. + * * @param databaseId The database id. - * @param tableId The table id. + * @param tableId The table id. * @throws RemoteUnavailableException The remote service is not available and invalid data was returned. - * @throws TableNotFoundException The table was not found. - * @throws MetadataServiceException The remote service returned invalid data. + * @throws TableNotFoundException The table was not found. + * @throws MetadataServiceException The remote service returned invalid data. */ void updateTableStatistics(Long databaseId, Long tableId) throws TableNotFoundException, MetadataServiceException, RemoteUnavailableException; } diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/MetadataServiceGatewayImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/MetadataServiceGatewayImpl.java index b4cb2ff5043c46e1e5ece49a45690ef04782bd3c..640ef7172ac2b750815e17a0bdf11b02b5ed997b 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/MetadataServiceGatewayImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/MetadataServiceGatewayImpl.java @@ -10,7 +10,9 @@ import at.tuwien.api.database.table.TableDto; import at.tuwien.api.database.table.internal.PrivilegedTableDto; import at.tuwien.api.identifier.IdentifierDto; import at.tuwien.api.user.PrivilegedUserDto; +import at.tuwien.api.user.UserBriefDto; import at.tuwien.api.user.UserDto; +import at.tuwien.config.GatewayConfig; import at.tuwien.exception.*; import at.tuwien.gateway.MetadataServiceGateway; import at.tuwien.mapper.MetadataMapper; @@ -35,11 +37,14 @@ import java.util.UUID; public class MetadataServiceGatewayImpl implements MetadataServiceGateway { private final RestTemplate restTemplate; + private final GatewayConfig gatewayConfig; private final MetadataMapper metadataMapper; @Autowired - public MetadataServiceGatewayImpl(RestTemplate restTemplate, MetadataMapper metadataMapper) { + public MetadataServiceGatewayImpl(RestTemplate restTemplate, GatewayConfig gatewayConfig, + MetadataMapper metadataMapper) { this.restTemplate = restTemplate; + this.gatewayConfig = gatewayConfig; this.metadataMapper = metadataMapper; } @@ -226,6 +231,34 @@ public class MetadataServiceGatewayImpl implements MetadataServiceGateway { return response.getBody(); } + @Override + public UUID getSystemUserId() throws RemoteUnavailableException, UserNotFoundException, + MetadataServiceException { + final ResponseEntity<UserBriefDto[]> response; + try { + response = restTemplate.exchange("/api/user?username=" + gatewayConfig.getSystemUsername(), HttpMethod.GET, HttpEntity.EMPTY, UserBriefDto[].class); + } catch (ResourceAccessException | HttpServerErrorException e) { + log.error("Failed to find user with username {}: {}", gatewayConfig.getSystemUsername(), e.getMessage()); + throw new RemoteUnavailableException("Failed to find user with username " + gatewayConfig.getSystemUsername() + ": " + e.getMessage(), e); + } catch (HttpClientErrorException.NotFound e) { + log.error("Failed to find user with username {}: not found: {}", gatewayConfig.getSystemUsername(), e.getMessage()); + throw new UserNotFoundException("Failed to find user with username " + gatewayConfig.getSystemUsername() + ": " + e.getMessage(), e); + } + if (!response.getStatusCode().equals(HttpStatus.OK)) { + log.error("Failed to find user with username {}: service responded unsuccessful: {}", gatewayConfig.getSystemUsername(), response.getStatusCode()); + throw new MetadataServiceException("Failed to find user with username " + gatewayConfig.getSystemUsername() + ": service responded unsuccessful: " + response.getStatusCode()); + } + if (response.getBody() == null) { + log.error("Failed to find user with username {}: body is empty", gatewayConfig.getSystemUsername()); + throw new MetadataServiceException("Failed to find user with username " + gatewayConfig.getSystemUsername() + ": body is empty"); + } + if (response.getBody().length != 1) { + log.error("Failed to find system user: expected exactly one result but got {}", response.getBody().length); + throw new MetadataServiceException("Failed to find system user: expected exactly one result but got " + response.getBody().length); + } + return response.getBody()[0].getId(); + } + @Override public PrivilegedUserDto getPrivilegedUserById(UUID userId) throws RemoteUnavailableException, UserNotFoundException, MetadataServiceException { diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/interceptor/KeycloakInterceptor.java b/dbrepo-data-service/services/src/main/java/at/tuwien/interceptor/KeycloakInterceptor.java deleted file mode 100644 index 78fb5adc61fd2420cfc62e72cb4aa4c700c3b82b..0000000000000000000000000000000000000000 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/interceptor/KeycloakInterceptor.java +++ /dev/null @@ -1,55 +0,0 @@ -package at.tuwien.interceptor; - -import at.tuwien.api.keycloak.TokenDto; -import lombok.extern.log4j.Log4j2; -import org.springframework.http.*; -import org.springframework.http.client.ClientHttpRequestExecution; -import org.springframework.http.client.ClientHttpRequestInterceptor; -import org.springframework.http.client.ClientHttpResponse; -import org.springframework.util.LinkedMultiValueMap; -import org.springframework.util.MultiValueMap; -import org.springframework.web.client.HttpServerErrorException; -import org.springframework.web.client.ResourceAccessException; -import org.springframework.web.client.RestTemplate; - -import java.io.IOException; - -@Log4j2 -public class KeycloakInterceptor implements ClientHttpRequestInterceptor { - - private final String adminUsername; - private final String adminPassword; - private final String keycloakEndpoint; - - public KeycloakInterceptor(String adminUsername, String adminPassword, String keycloakEndpoint) { - this.adminUsername = adminUsername; - this.adminPassword = adminPassword; - this.keycloakEndpoint = keycloakEndpoint; - } - - @Override - public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) - throws IOException { - final RestTemplate restTemplate = new RestTemplate(); - final HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); - final MultiValueMap<String, String> payload = new LinkedMultiValueMap<>(); - payload.add("username", adminUsername); - payload.add("password", adminPassword); - payload.add("grant_type", "password"); - payload.add("client_id", "admin-cli"); - final ResponseEntity<TokenDto> response; - try { - response = restTemplate.exchange(keycloakEndpoint + "/realms/master/protocol/openid-connect/token", - HttpMethod.POST, new HttpEntity<>(payload, headers), TokenDto.class); - } catch (ResourceAccessException | HttpServerErrorException.ServiceUnavailable e) { - log.error("Failed to obtain admin token: {}", e.getMessage()); - return execution.execute(request, body); - } - if (response.getBody() == null) { - return execution.execute(request, body); - } - request.getHeaders().set("Authorization", "Bearer " + response.getBody().getAccessToken()); - return execution.execute(request, body); - } -} diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MariaDbMapper.java b/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MariaDbMapper.java index 3e0bb2f01838560a5c49d05e8137b565914fdf85..d870215771628283ddb9e115a755c176d7f69240 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MariaDbMapper.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MariaDbMapper.java @@ -293,6 +293,9 @@ public interface MariaDbMapper { .append(column.getInternalName()) .append("`) as std_dev FROM ") .append(table)); + if (statement.isEmpty()) { + return null; + } statement.append(";"); log.trace("mapped select column statistic statement: {}", statement); return statement.toString(); @@ -834,17 +837,8 @@ public interface MariaDbMapper { statement.setNull(idx, Types.BLOB); break; } - try { - final ByteArrayOutputStream boas = new ByteArrayOutputStream(); - try (ObjectOutputStream ois = new ObjectOutputStream(boas)) { - ois.writeObject(value); - statement.setBlob(idx, new ByteArrayInputStream(boas.toByteArray())); - } - - } catch (IOException e) { - log.error("Failed to set blob/tinyblob/mediumblob/longblob: {}", e.getMessage()); - throw new SQLException("Failed to set blob: " + e.getMessage(), e); - } + final byte[] data = (byte[]) value; + statement.setBlob(idx, new ByteArrayInputStream(data)); break; case TEXT, CHAR, VARCHAR, TINYTEXT, MEDIUMTEXT, LONGTEXT, ENUM, SET: if (value == null) { diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/StorageService.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/StorageService.java index e03878b8c19197e4347897c555a91d985c10fb72..c1f546ce4462d60eb08b1f34683efd7f05dca0f9 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/StorageService.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/StorageService.java @@ -15,6 +15,7 @@ public interface StorageService { * @param key The object key. * @return The input stream, if successful. * @throws StorageUnavailableException The object failed to be loaded from the Storage Service. + * @throws StorageNotFoundException The key was not found in the Storage Service. */ InputStream getObject(String bucket, String key) throws StorageUnavailableException, StorageNotFoundException; @@ -24,6 +25,7 @@ public interface StorageService { * @param key The object key. * @return The byte array. * @throws StorageUnavailableException The object failed to be loaded from the Storage Service. + * @throws StorageNotFoundException The key was not found in the Storage Service. */ byte[] getBytes(String key) throws StorageUnavailableException, StorageNotFoundException; @@ -34,6 +36,7 @@ public interface StorageService { * @param key The object key. * @return The byte array. * @throws StorageUnavailableException The object failed to be loaded from the Storage Service. + * @throws StorageNotFoundException The key was not found in the Storage Service. */ byte[] getBytes(String bucket, String key) throws StorageUnavailableException, StorageNotFoundException; @@ -43,6 +46,7 @@ public interface StorageService { * @param key The object key. * @return The export resource, if successful. * @throws StorageUnavailableException The object failed to be loaded from the Storage Service. + * @throws StorageNotFoundException The key was not found in the Storage Service. */ ExportResourceDto getResource(String key) throws StorageUnavailableException, StorageNotFoundException; @@ -53,6 +57,7 @@ public interface StorageService { * @param key The object key. * @return The export resource, if successful. * @throws StorageUnavailableException The object failed to be loaded from the Storage Service. + * @throws StorageNotFoundException The key was not found in the Storage Service. */ ExportResourceDto getResource(String bucket, String key) throws StorageUnavailableException, StorageNotFoundException; diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/SubsetService.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/SubsetService.java index 3c3ff101fead4b51caadc8c207848d2b962f98eb..56250a2917f2083d53bbeec51f6e3b1dae0e0cd1 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/SubsetService.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/SubsetService.java @@ -26,16 +26,60 @@ public interface SubsetService { void createQueryStore(PrivilegedContainerDto container, String databaseName) throws SQLException, QueryStoreCreateException; + /** + * Creates a subset from the given statement at given time in the given database. + * + * @param database The database. + * @param statement The subset statement. + * @param timestamp The timestamp as of which the data is queried. If smaller than <now>, historic data is queried. + * @param userId The user id of the creating user. + * @param page The page number. Optional but requires size to be set too. + * @param size The page size. Optional but requires page to be set too. + * @param sortDirection The sort direction. + * @param sortColumn The column that is sorted. + * @return The query result. + * @throws QueryStoreInsertException The query store refused to insert the query. + * @throws SQLException The connection to the database could not be established. + * @throws QueryNotFoundException The query was not found for re-execution. + * @throws TableMalformedException The table is malformed. + * @throws UserNotFoundException The user was not found. + * @throws NotAllowedException The operation is not allowed. + * @throws RemoteUnavailableException The privileged database information could not be found in the Metadata Service. + * @throws DatabaseNotFoundException The database was not found in the Metadata Service. + * @throws MetadataServiceException The Metadata Service responded unexpected. + */ QueryResultDto execute(PrivilegedDatabaseDto database, String statement, Instant timestamp, UUID userId, Long page, Long size, SortTypeDto sortDirection, String sortColumn) throws QueryStoreInsertException, SQLException, QueryNotFoundException, TableMalformedException, UserNotFoundException, NotAllowedException, RemoteUnavailableException, DatabaseNotFoundException, MetadataServiceException; + /** + * Re-executes the query of a given subset in the given database. + * + * @param database The database. + * @param query The subset. + * @param page The page number. Optional but requires size to be set too. + * @param size The page size. Optional but requires page to be set too. + * @param sortDirection The sort direction. + * @param sortColumn The column that is sorted. + * @return The query result. + * @throws TableMalformedException The table is malformed. + * @throws SQLException The connection to the database could not be established. + */ QueryResultDto reExecute(PrivilegedDatabaseDto database, QueryDto query, Long page, Long size, SortTypeDto sortDirection, String sortColumn) throws TableMalformedException, SQLException; + /** + * Counts the subset row count of a query of a given subset in the given database. + * + * @param database The database. + * @param query The subset. + * @return The row count. + * @throws TableMalformedException The table is malformed. + * @throws SQLException The connection to the database could not be established. + */ Long reExecuteCount(PrivilegedDatabaseDto database, QueryDto query) throws TableMalformedException, SQLException, QueryMalformedException; @@ -45,15 +89,45 @@ public interface SubsetService { * @param database The database. * @param filterPersisted Optional filter to only display persisted queries, or non-persisted queries. * @return The list of queries. + * @throws SQLException The connection to the database could not be established. + * @throws QueryNotFoundException The query was not found for re-execution. + * @throws RemoteUnavailableException The privileged database information could not be found in the Metadata Service. + * @throws DatabaseNotFoundException The database was not found in the Metadata Service. + * @throws MetadataServiceException The Metadata Service responded unexpected. */ List<QueryDto> findAll(PrivilegedDatabaseDto database, Boolean filterPersisted) throws SQLException, - QueryNotFoundException, NotAllowedException, RemoteUnavailableException, DatabaseNotFoundException, - MetadataServiceException; + QueryNotFoundException, RemoteUnavailableException, DatabaseNotFoundException, MetadataServiceException; + /** + * Exports a subset by re-executing the query in a given database with given timestamp to a given filename. + * + * @param database The database. + * @param query The query. + * @param timestamp The timestamp. + * @param filename The filename. + * @return The exported subset. + * @throws SQLException The connection to the database could not be established. + * @throws QueryMalformedException The mapped export query produced a database error. + * @throws SidecarExportException The sidecar of the given database failed to communicate. + * @throws StorageNotFoundException The exported subset was not found from the key provided by the sidecar in the Storage Service. + * @throws StorageUnavailableException The communication to the Storage Service failed. + * @throws RemoteUnavailableException The privileged database information could not be found in the Metadata Service. + */ ExportResourceDto export(PrivilegedDatabaseDto database, QueryDto query, Instant timestamp, String filename) throws SQLException, QueryMalformedException, SidecarExportException, StorageNotFoundException, - StorageUnavailableException, MetadataServiceException, RemoteUnavailableException; + StorageUnavailableException, RemoteUnavailableException; + /** + * Executes a subset query without saving it. + * + * @param database The database. + * @param statement The subset query. + * @param timestamp The timestamp. + * @return The row count. + * @throws SQLException The connection to the database could not be established. + * @throws QueryMalformedException The mapped query produced a database error. + * @throws TableMalformedException The database table is malformed. + */ Long executeCountNonPersistent(PrivilegedDatabaseDto database, String statement, Instant timestamp) throws SQLException, QueryMalformedException, TableMalformedException; @@ -63,11 +137,15 @@ public interface SubsetService { * @param database The database. * @param queryId The query id. * @return The query. - * @throws QueryNotFoundException The query store did not return a query + * @throws QueryNotFoundException The query store did not return a query. + * @throws SQLException The connection to the database could not be established. + * @throws RemoteUnavailableException The privileged database information could not be found in the Metadata Service. + * @throws UserNotFoundException The user that created the query was not found in the Metadata Service. + * @throws DatabaseNotFoundException The database metadata was not found in the Metadata Service. + * @throws MetadataServiceException Communication with the Metadata Service failed. */ QueryDto findById(PrivilegedDatabaseDto database, Long queryId) throws QueryNotFoundException, SQLException, - NotAllowedException, RemoteUnavailableException, UserNotFoundException, DatabaseNotFoundException, - MetadataServiceException; + RemoteUnavailableException, UserNotFoundException, DatabaseNotFoundException, MetadataServiceException; /** * Inserts a query and metadata to the query store of a given database id. @@ -75,7 +153,9 @@ public interface SubsetService { * @param database The database. * @param query The query statement. * @param userId The user id. - * @return The stored query on success + * @return The stored query id on success. + * @throws SQLException The connection to the database could not be established. + * @throws QueryStoreInsertException The query store failed to insert the query. */ Long storeQuery(PrivilegedDatabaseDto database, String query, Instant timestamp, UUID userId) throws SQLException, QueryStoreInsertException; @@ -83,15 +163,21 @@ public interface SubsetService { /** * Persists a query to be displayed in the frontend. * - * @param database The database id. + * @param database The database. * @param queryId The query id. * @param persist If true, the query is retained in the query store, ephemeral otherwise. + * @throws SQLException The connection to the database could not be established. + * @throws QueryStorePersistException The query store failed to persist/unpersist the query. */ void persist(PrivilegedDatabaseDto database, Long queryId, Boolean persist) throws SQLException, QueryStorePersistException; /** * Deletes the stale queries that have not been persisted within 24 hours. + * + * @param database The database. + * @throws SQLException The connection to the database could not be established. + * @throws QueryStoreGCException The query store failed to delete stale queries. */ void deleteStaleQueries(PrivilegedDatabaseDto database) throws SQLException, QueryStoreGCException; } diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SubsetServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SubsetServiceMariaDbImpl.java index 53d93d35dfaa11d4ec40ef5e00b73050ebea91c5..7ebd403b6903737c07f2197593ab6229851c32e3 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SubsetServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SubsetServiceMariaDbImpl.java @@ -28,7 +28,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; import java.sql.*; import java.time.Instant; import java.util.LinkedList; diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/TableServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/TableServiceMariaDbImpl.java index 97778e9e11679bc349ef6037fe8c7a9150cf530a..92e35125331236a8fdfb29cf79783b776f3c63bb 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/TableServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/TableServiceMariaDbImpl.java @@ -30,6 +30,8 @@ import java.sql.*; import java.time.Instant; import java.util.*; +import static org.apache.jena.sparql.util.QueryExecUtils.executeQuery; + @Log4j2 @Service public class TableServiceMariaDbImpl extends HibernateConnector implements TableService { @@ -96,15 +98,28 @@ public class TableServiceMariaDbImpl extends HibernateConnector implements Table try { /* obtain statistic */ final long start = System.currentTimeMillis(); - final ResultSet resultSet = connection.prepareStatement(mariaDbMapper.tableColumnStatisticsSelectRawQuery(table.getColumns(), table.getInternalName())) - .executeQuery(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); - statistic = dataMapper.resultSetToTableStatistic(resultSet); - final TableDto tmpTable = schemaService.inspectTable(table.getDatabase(), table.getInternalName()); - statistic.setAvgRowLength(tmpTable.getAvgRowLength()); - statistic.setDataLength(tmpTable.getDataLength()); - statistic.setMaxDataLength(tmpTable.getMaxDataLength()); - statistic.setRows(tmpTable.getNumRows()); + final String query = mariaDbMapper.tableColumnStatisticsSelectRawQuery(table.getColumns(), table.getInternalName()); + if (query == null) { + log.debug("table {}.{} does not have columns that can be analysed for statistical properties (i.e. no numeric columns)", table.getDatabase().getInternalName(), table.getInternalName()); + statistic = null; + } else { + final ResultSet resultSet = connection.prepareStatement(query) + .executeQuery(); + log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + statistic = dataMapper.resultSetToTableStatistic(resultSet); + final TableDto tmpTable = schemaService.inspectTable(table.getDatabase(), table.getInternalName()); + statistic.setAvgRowLength(tmpTable.getAvgRowLength()); + statistic.setDataLength(tmpTable.getDataLength()); + statistic.setMaxDataLength(tmpTable.getMaxDataLength()); + statistic.setRows(tmpTable.getNumRows()); + /* add to statistic dto */ + table.getColumns() + .stream() + .filter(column -> !MariaDbUtil.numericDataTypes.contains(column.getColumnType())) + .forEach(column -> statistic.getColumns().put(column.getInternalName(), new ColumnStatisticDto())); + log.info("Obtained statistics for the table and {} column(s)", statistic.getColumns().size()); + log.trace("obtained statistics: {}", statistic); + } } catch (SQLException e) { connection.rollback(); log.error("Failed to obtain column statistics: {}", e.getMessage()); @@ -112,12 +127,6 @@ public class TableServiceMariaDbImpl extends HibernateConnector implements Table } finally { dataSource.close(); } - table.getColumns() - .stream() - .filter(column -> !MariaDbUtil.numericDataTypes.contains(column.getColumnType())) - .forEach(column -> statistic.getColumns().put(column.getInternalName(), new ColumnStatisticDto())); - log.info("Obtained statistics for the table and {} column(s)", statistic.getColumns().size()); - log.trace("obtained statistics: {}", statistic); return statistic; } diff --git a/dbrepo-gateway-service/dbrepo.conf b/dbrepo-gateway-service/dbrepo.conf index de8eaa417bbe422999436e83dc24f8fb66f9b1d5..8ac239d464398ec381b98d71c91192ea6ba061ab 100644 --- a/dbrepo-gateway-service/dbrepo.conf +++ b/dbrepo-gateway-service/dbrepo.conf @@ -1,4 +1,4 @@ -client_max_body_size 2G; +client_max_body_size 20G; resolver 127.0.0.11 valid=30s; # docker dns diff --git a/dbrepo-metadata-db/1_setup-schema.sql b/dbrepo-metadata-db/1_setup-schema.sql index 62dc5c3095529d74349a88725724c02c95c15710..47ee3a95e2b88a62d4a2405f9c0f4d088167d748 100644 --- a/dbrepo-metadata-db/1_setup-schema.sql +++ b/dbrepo-metadata-db/1_setup-schema.sql @@ -27,10 +27,12 @@ CREATE TABLE IF NOT EXISTS `mdb_images` dialect character varying(255) NOT NULL, driver_class character varying(255) NOT NULL, jdbc_method character varying(255) NOT NULL, + is_default BOOLEAN NOT NULL DEFAULT FALSE, created timestamp NOT NULL DEFAULT NOW(), last_modified timestamp, PRIMARY KEY (id), - UNIQUE (name, version) + UNIQUE (name, version), + UNIQUE (is_default) ) WITH SYSTEM VERSIONING; CREATE TABLE IF NOT EXISTS `mdb_images_date` @@ -64,6 +66,7 @@ CREATE TABLE IF NOT EXISTS `mdb_containers` last_modified timestamp, privileged_username character varying(255) NOT NULL, privileged_password character varying(255) NOT NULL, + quota integer NOT NULL DEFAULT 50, PRIMARY KEY (id), FOREIGN KEY (image_id) REFERENCES mdb_images (id) ) WITH SYSTEM VERSIONING; diff --git a/dbrepo-metadata-db/2_setup-data.sql b/dbrepo-metadata-db/2_setup-data.sql index 24e587fc50cb9beb6363c6bc562c7120a9d9a714..e806e1e181dbdcc3f0e4e29f837bffac7123317c 100644 --- a/dbrepo-metadata-db/2_setup-data.sql +++ b/dbrepo-metadata-db/2_setup-data.sql @@ -2,7 +2,7 @@ BEGIN; INSERT INTO `mdb_containers` (name, internal_name, image_id, host, port, ui_host, ui_port, sidecar_host, sidecar_port, privileged_username, privileged_password) -VALUES ('MariaDB 11.1.3', 'mariadb_11_1_3', 1, 'data-db', 3306, 'localhost', 3306, 'data-db-sidecar', 8080, +VALUES ('mariadb:11.1.3-debian-11-r6', 'mariadb_11_1_3', 1, 'data-db', 3306, 'localhost', 3306, 'data-db-sidecar', 8080, 'root', 'dbrepo'); COMMIT; diff --git a/dbrepo-metadata-service/api/pom.xml b/dbrepo-metadata-service/api/pom.xml index b62bfdc94ad922ffa7b1c8f44e3f1e54d89a2d87..4722e9c3c91fbc07e86af58622d2e3d0cc53de0b 100644 --- a/dbrepo-metadata-service/api/pom.xml +++ b/dbrepo-metadata-service/api/pom.xml @@ -6,12 +6,12 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-metadata-service</artifactId> - <version>1.4.5</version> + <version>1.4.6</version> </parent> <artifactId>dbrepo-metadata-service-api</artifactId> <name>dbrepo-metadata-service-api</name> - <version>1.4.5</version> + <version>1.4.6</version> <dependencies/> diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerBriefDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerBriefDto.java index aa3b1ad91ff5fb8608885a2a41a3f2656969dd66..7acd4fc3ce7d225eb38de8a369dc34c60d185c49 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerBriefDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerBriefDto.java @@ -40,8 +40,12 @@ public class ContainerBriefDto { private ImageBriefDto image; @NotNull - @Schema(example = "true") - private Boolean running; + @Schema(example = "50") + private Integer quota; + + @NotNull + @Schema(example = "10") + private Integer count; @NotNull @Schema(example = "2021-03-12T15:26:21Z") diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerCreateDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerCreateDto.java index d5b8f827c2e95a531961f6e48a862e8457229795..7080d2b5d96e2763a8ebf750eea27f9b08fa4a50 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerCreateDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerCreateDto.java @@ -46,6 +46,10 @@ public class ContainerCreateDto { @JsonProperty("ui_port") private Integer uiPort; + @NotNull + @Schema(example = "50") + private Long quota; + @NotBlank @JsonProperty("privileged_username") @Schema(description = "Username of privileged user", example = "root") diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerDto.java index d7c6727be71331d51e967d04d008f7b7ba70ad99..7e46b80c1cfc745b158f6bffffd02bdd617a1987 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerDto.java @@ -54,6 +54,14 @@ public class ContainerDto { @NotNull private ImageDto image; + @NotNull + @Schema(example = "50") + private Long quota; + + @NotNull + @Schema(example = "10") + private Long count; + @NotNull @Schema(example = "2021-03-12T15:26:21Z") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/image/ImageBriefDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/image/ImageBriefDto.java index e336f3d47a9444aace3e2c66acffe825c1bae128..38adbd6f0d6592a0e802d2bf33147916bbd9f139 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/image/ImageBriefDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/image/ImageBriefDto.java @@ -32,4 +32,9 @@ public class ImageBriefDto { @Schema(example = "mariadb") private String jdbcMethod; + @NotNull + @JsonProperty("default") + @Schema(example = "false") + private Boolean isDefault; + } diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/image/ImageCreateDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/image/ImageCreateDto.java index 2031ee15aa6ed44d60682315604a726fe7af03c6..4e9fea5b7cbada74155ad2760ccdc99fb2e23490 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/image/ImageCreateDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/image/ImageCreateDto.java @@ -27,6 +27,11 @@ public class ImageCreateDto { @Schema(example = "mariadb") private String name; + @NotNull + @JsonProperty("is_default") + @Schema(example = "false") + private Boolean isDefault; + @NotBlank @Parameter(example = "10.5") private String version; diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/image/ImageDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/image/ImageDto.java index 3d766e3abae3379636e6c541d094a89f354dfce3..c0cf7f3bceebc8aefa73c267e422d0cb7e9fa3d0 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/image/ImageDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/image/ImageDto.java @@ -50,6 +50,11 @@ public class ImageDto { @Schema(example = "mariadb") private String jdbcMethod; + @NotNull + @JsonProperty("default") + @Schema(example = "false") + private Boolean isDefault; + @NotNull @JsonProperty("default_port") @Schema(example = "3306") diff --git a/dbrepo-metadata-service/entities/pom.xml b/dbrepo-metadata-service/entities/pom.xml index 2fb8efa9e9f07076e4891377c876658dbb04d146..5fc5626e5fb2b3edf42a1c17f1811454a2fc0fdf 100644 --- a/dbrepo-metadata-service/entities/pom.xml +++ b/dbrepo-metadata-service/entities/pom.xml @@ -6,12 +6,12 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-metadata-service</artifactId> - <version>1.4.5</version> + <version>1.4.6</version> </parent> <artifactId>dbrepo-metadata-service-entities</artifactId> <name>dbrepo-metadata-service-entity</name> - <version>1.4.5</version> + <version>1.4.6</version> <dependencies/> diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/Container.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/Container.java index 302046d035813aa42f43fe211bcafb6a4ca18eed..7545260ce1a83f2a39b7900e9b29de5e0a4bedde 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/Container.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/Container.java @@ -55,6 +55,9 @@ public class Container { @Column private Integer uiPort; + @Column(nullable = false, columnDefinition = "INT DEFAULT 50") + private Integer quota = 50; + @Column private String uiAdditionalFlags; diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/ContainerImage.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/ContainerImage.java index 568e16e4749c810ef8eae67872d4b2be9e29ddf3..8250b6ae4350c48eca7c5dc1d0ec0a08935e9196 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/ContainerImage.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/ContainerImage.java @@ -5,8 +5,6 @@ import com.fasterxml.jackson.annotation.JsonFormat; import jakarta.persistence.*; import lombok.*; import org.hibernate.annotations.GenericGenerator; -import org.hibernate.annotations.OnDelete; -import org.hibernate.annotations.OnDeleteAction; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; @@ -56,6 +54,9 @@ public class ContainerImage { @Column(nullable = false) private Integer defaultPort; + @Column(nullable = false, unique = true, columnDefinition = "BOOLEAN DEFAULT FALSE") + private Boolean isDefault = false; + @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL, CascadeType.PERSIST}, mappedBy = "image") private List<ContainerImageDate> dateFormats; diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/ViewColumn.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/ViewColumn.java index eb9b352095bfd1c875cde9fac6db5d45ad8d5e6d..ff18c0137d06964bcc49c02367f95eb49a3b4033 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/ViewColumn.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/ViewColumn.java @@ -15,9 +15,7 @@ import jakarta.persistence.*; @AllArgsConstructor @NoArgsConstructor @EntityListeners(AuditingEntityListener.class) -@jakarta.persistence.Table(name = "mdb_view_columns", uniqueConstraints = { - @UniqueConstraint(columnNames = {"view_id", "internalName"}) -}) +@jakarta.persistence.Table(name = "mdb_view_columns") public class ViewColumn implements Comparable<ViewColumn> { @Id diff --git a/dbrepo-metadata-service/oai/pom.xml b/dbrepo-metadata-service/oai/pom.xml index 5b37750134eb43f3c077ac3c719c94fcad8d6d77..c49ff844e9cb921e6eb861e6bfd10f4a25ed822b 100644 --- a/dbrepo-metadata-service/oai/pom.xml +++ b/dbrepo-metadata-service/oai/pom.xml @@ -6,12 +6,12 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-metadata-service</artifactId> - <version>1.4.5</version> + <version>1.4.6</version> </parent> <artifactId>dbrepo-metadata-service-oai</artifactId> <name>dbrepo-metadata-service-oai</name> - <version>1.4.5</version> + <version>1.4.6</version> <dependencies/> diff --git a/dbrepo-metadata-service/pom.xml b/dbrepo-metadata-service/pom.xml index 0fdc80b428c3120888362bed339edbd9097f0ac4..fd44e71dd94659ac965b5819202e7844ffb02291 100644 --- a/dbrepo-metadata-service/pom.xml +++ b/dbrepo-metadata-service/pom.xml @@ -11,7 +11,7 @@ <groupId>at.tuwien</groupId> <artifactId>dbrepo-metadata-service</artifactId> <name>dbrepo-metadata-service</name> - <version>1.4.5</version> + <version>1.4.6</version> <description>Service that manages the metadata</description> diff --git a/dbrepo-metadata-service/report/pom.xml b/dbrepo-metadata-service/report/pom.xml index 6a7874d4e9352a783ca03711ab1e8efe4eabadea..b1f3d406e814127927acf3ad675467d615bb453b 100644 --- a/dbrepo-metadata-service/report/pom.xml +++ b/dbrepo-metadata-service/report/pom.xml @@ -6,12 +6,12 @@ <parent> <artifactId>dbrepo-metadata-service</artifactId> <groupId>at.tuwien</groupId> - <version>1.4.5</version> + <version>1.4.6</version> </parent> <artifactId>dbrepo-metadata-service-report</artifactId> <name>dbrepo-metadata-service-report</name> - <version>1.4.5</version> + <version>1.4.6</version> <dependencies> <dependency> diff --git a/dbrepo-metadata-service/repositories/pom.xml b/dbrepo-metadata-service/repositories/pom.xml index b67917715a5c2e1200e3e14884e45cd1ff60c055..e80d722a109155e6e78cf4a9e222b11522cf1627 100644 --- a/dbrepo-metadata-service/repositories/pom.xml +++ b/dbrepo-metadata-service/repositories/pom.xml @@ -6,12 +6,12 @@ <parent> <artifactId>dbrepo-metadata-service</artifactId> <groupId>at.tuwien</groupId> - <version>1.4.5</version> + <version>1.4.6</version> </parent> <artifactId>dbrepo-metadata-service-repositories</artifactId> <name>dbrepo-metadata-service-repositories</name> - <version>1.4.5</version> + <version>1.4.6</version> <dependencies> <dependency> diff --git a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/exception/ContainerQuotaException.java b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/exception/ContainerQuotaException.java new file mode 100644 index 0000000000000000000000000000000000000000..6679775f00473632a2e2e28cd17f3d3303edd0a6 --- /dev/null +++ b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/exception/ContainerQuotaException.java @@ -0,0 +1,21 @@ +package at.tuwien.exception; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(code = HttpStatus.LOCKED, reason = "error.container.quota") +public class ContainerQuotaException extends Exception { + + public ContainerQuotaException(String message) { + super(message); + } + + public ContainerQuotaException(String message, Throwable thr) { + super(message, thr); + } + + public ContainerQuotaException(Throwable thr) { + super(thr); + } + +} diff --git a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/MetadataMapper.java b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/MetadataMapper.java index 557d1e49aba58b799f3dfa65fea8c4d0a8f7cf4c..a9b04058e2373f6cb98f8f9cbedb11ba980fdcfc 100644 --- a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/MetadataMapper.java +++ b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/MetadataMapper.java @@ -104,7 +104,8 @@ public interface MetadataMapper { ContainerDto containerToContainerDto(Container data); @Mappings({ - @Mapping(target = "id", source = "id") + @Mapping(target = "id", source = "id"), + @Mapping(target = "count", expression = "java(data.getDatabases().size())"), }) ContainerBriefDto containerToDatabaseContainerBriefDto(Container data); @@ -415,6 +416,9 @@ public interface MetadataMapper { }; } + @Mappings({ + @Mapping(target = "isDefault", source = "isDefault") + }) ContainerImage createImageDtoToContainerImage(ImageCreateDto data); ImageBriefDto containerImageToImageBriefDto(ContainerImage data); @@ -749,6 +753,8 @@ public interface MetadataMapper { }) UserDetailsDto userDtoToUserDetailsDto(UserDto data); + User userDtoToUser(at.tuwien.api.keycloak.UserDto data); + /* keep */ @Mappings({ @Mapping(target = "name", expression = "java(userToFullName(data))"), diff --git a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/repository/ImageRepository.java b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/repository/ImageRepository.java index 593a4727180d55b4bc0cb1971c0aecf49313f8cb..23fa40c5be1fd3a6e9e430fafcaccc896e37970d 100644 --- a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/repository/ImageRepository.java +++ b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/repository/ImageRepository.java @@ -10,8 +10,8 @@ import java.util.Optional; @Repository public interface ImageRepository extends JpaRepository<ContainerImage, Long> { - List<ContainerImage> findAll(); - Optional<ContainerImage> findByNameAndVersion(String name, String version); + Optional<ContainerImage> findByIsDefault(Boolean isDefault); + } diff --git a/dbrepo-metadata-service/rest-service/pom.xml b/dbrepo-metadata-service/rest-service/pom.xml index ab556f9c4521be25c046a5777200ce9ab59cfc6b..c06be275269fbedd04aeea33fe9926abaae09edb 100644 --- a/dbrepo-metadata-service/rest-service/pom.xml +++ b/dbrepo-metadata-service/rest-service/pom.xml @@ -6,12 +6,12 @@ <parent> <artifactId>dbrepo-metadata-service</artifactId> <groupId>at.tuwien</groupId> - <version>1.4.5</version> + <version>1.4.6</version> </parent> <artifactId>dbrepo-metadata-service-rest-service</artifactId> <name>dbrepo-metadata-service-rest</name> - <version>1.4.5</version> + <version>1.4.6</version> <dependencies> <dependency> diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ContainerEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ContainerEndpoint.java index 294d471e8fefe4ccafcf06f5aac47e23fce6f757..62319662e24b78f9e456d1d0cabd8fd79639c85f 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ContainerEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ContainerEndpoint.java @@ -27,7 +27,6 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.security.core.Authentication; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; @@ -66,11 +65,11 @@ public class ContainerEndpoint { }) public ResponseEntity<List<ContainerBriefDto>> findAll(@RequestParam(required = false) Integer limit) { log.debug("endpoint find all containers, limit={}", limit); - final List<Container> containers = containerService.getAll(limit); - final List<ContainerBriefDto> dtos = containers.stream() + final List<ContainerBriefDto> dtos = containerService.getAll(limit) + .stream() .map(metadataMapper::containerToDatabaseContainerBriefDto) .collect(Collectors.toList()); - log.trace("find all containers resulted in containers {}", dtos); + log.debug("find all containers resulted in {} container(s)", dtos.size()); return ResponseEntity.ok() .body(dtos); } diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java index 8be62ea5c400719b31764b0b931a329481b75018..e89a38b6f6fbc9a021bc62b5a31be44fa0d86040 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java @@ -2,6 +2,7 @@ package at.tuwien.endpoints; import at.tuwien.api.database.*; import at.tuwien.api.error.ApiErrorDto; +import at.tuwien.entities.container.Container; import at.tuwien.entities.database.Database; import at.tuwien.entities.database.DatabaseAccess; import at.tuwien.entities.user.User; @@ -45,15 +46,18 @@ public class DatabaseEndpoint { private final MetadataMapper databaseMapper; private final StorageService storageService; private final DatabaseService databaseService; + private final ContainerService containerService; @Autowired public DatabaseEndpoint(UserService userService, AccessService accessService, MetadataMapper databaseMapper, - StorageService storageService, DatabaseService databaseService) { + StorageService storageService, DatabaseService databaseService, + ContainerService containerService) { this.userService = userService; this.accessService = accessService; this.databaseMapper = databaseMapper; this.storageService = storageService; this.databaseService = databaseService; + this.containerService = containerService; } @RequestMapping(method = {RequestMethod.GET, RequestMethod.HEAD}) @@ -127,6 +131,11 @@ public class DatabaseEndpoint { content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "423", + description = "Database quota exceeded", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), @ApiResponse(responseCode = "502", description = "Connection to search service failed", content = {@Content( @@ -141,10 +150,15 @@ public class DatabaseEndpoint { public ResponseEntity<DatabaseDto> create(@Valid @RequestBody DatabaseCreateDto data, @NotNull Principal principal) throws DataServiceException, DataServiceConnectionException, UserNotFoundException, DatabaseNotFoundException, ContainerNotFoundException, - SearchServiceException, SearchServiceConnectionException { + SearchServiceException, SearchServiceConnectionException, ContainerQuotaException { log.debug("endpoint create database, data.name={}", data.getName()); + final Container container = containerService.find(data.getCid()); + if (container.getDatabases().size() + 1 > container.getQuota()) { + log.error("Failed to create database: quota of {} exceeded", container.getQuota()); + throw new ContainerQuotaException("Failed to create database: quota of " + container.getQuota() + " exceeded"); + } final User user = userService.findByUsername(principal.getName()); - final Database database = databaseService.create(data, user); + final Database database = databaseService.create(container, data, user); final DatabaseDto dto = databaseMapper.customDatabaseToDatabaseDto(database); return ResponseEntity.status(HttpStatus.CREATED) .body(dto); diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UserEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UserEndpoint.java index 4be54d5edd1ed39168b97a00177d87d09a7a87ee..b81a8142f727972c95ce0ea5573b99e3d1e59be9 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UserEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UserEndpoint.java @@ -68,13 +68,21 @@ public class UserEndpoint { mediaType = "application/json", array = @ArraySchema(schema = @Schema(implementation = UserBriefDto.class)))}), }) - public ResponseEntity<List<UserBriefDto>> findAll() { - log.debug("endpoint find all users"); - final List<UserBriefDto> users = userService.findAll() - .stream() - .map(userMapper::userToUserBriefDto) - .toList(); - return ResponseEntity.ok(users); + public ResponseEntity<List<UserBriefDto>> findAll(@RequestParam(required = false) String username) { + log.debug("endpoint find all users, username={}", username); + if (username == null) { + return ResponseEntity.ok(userService.findAll() + .stream() + .map(userMapper::userToUserBriefDto) + .toList()); + } + try { + log.trace("filter by username: {}", username); + return ResponseEntity.ok(List.of(userMapper.userToUserBriefDto(userService.findByUsername(username)))); + } catch (UserNotFoundException e) { + log.trace("filter by username {} failed: return empty list", username); + return ResponseEntity.ok(List.of()); + } } @PostMapping diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/handlers/ApiExceptionHandler.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/handlers/ApiExceptionHandler.java index f6764895556ac07fe0321ae3e4a580f17e873d54..bf655f071abee0fdd5fc390b76402e3165d04c37 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/handlers/ApiExceptionHandler.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/handlers/ApiExceptionHandler.java @@ -79,6 +79,13 @@ public class ApiExceptionHandler extends ResponseEntityExceptionHandler { return generic_handle(e.getClass(), e.getLocalizedMessage()); } + @Hidden + @ResponseStatus(code = HttpStatus.LOCKED) + @ExceptionHandler(ContainerQuotaException.class) + public ResponseEntity<ApiErrorDto> handle(ContainerQuotaException e) { + return generic_handle(e.getClass(), e.getLocalizedMessage()); + } + @Hidden @ResponseStatus(code = HttpStatus.FORBIDDEN) @ExceptionHandler(CredentialsInvalidException.class) diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/ContainerEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/ContainerEndpointUnitTest.java index 7706e185bd3721fdddec7daed15ce8df628b0bad..ab3f4485b2cf35134c2d0ee126ee30af04636165 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/ContainerEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/ContainerEndpointUnitTest.java @@ -8,6 +8,7 @@ import at.tuwien.entities.container.Container; import at.tuwien.exception.*; import at.tuwien.service.impl.ContainerServiceImpl; import lombok.extern.log4j.Log4j2; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -37,6 +38,11 @@ public class ContainerEndpointUnitTest extends AbstractUnitTest { @Autowired private ContainerEndpoint containerEndpoint; + @BeforeEach + public void beforeEach() { + genesis(); + } + @Test @WithAnonymousUser public void findById_anonymous_succeeds() throws ContainerNotFoundException { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/DatabaseEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/DatabaseEndpointUnitTest.java index 02ba52ecaa930f1747ee55f80cff2ea36379ffc1..8ffe328aa95342c6b8ce6fe93a910658ad2ab043 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/DatabaseEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/DatabaseEndpointUnitTest.java @@ -13,6 +13,7 @@ import at.tuwien.service.ContainerService; import at.tuwien.service.BrokerService; import at.tuwien.service.impl.DatabaseServiceImpl; import lombok.extern.log4j.Log4j2; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -62,6 +63,11 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { @Autowired private DatabaseEndpoint databaseEndpoint; + @BeforeEach + public void beforeEach() { + genesis(); + } + @Test @WithAnonymousUser public void create_anonymous_fails() { @@ -97,7 +103,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { public void create_succeeds() throws DataServiceException, DataServiceConnectionException, UserNotFoundException, DatabaseNotFoundException, ContainerNotFoundException, SearchServiceException, SearchServiceConnectionException, AuthServiceException, AuthServiceConnectionException, - CredentialsInvalidException, BrokerServiceException, BrokerServiceConnectionException { + CredentialsInvalidException, BrokerServiceException, BrokerServiceConnectionException, ContainerQuotaException { final DatabaseCreateDto request = DatabaseCreateDto.builder() .cid(CONTAINER_1_ID) .name(DATABASE_1_NAME) @@ -107,7 +113,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { /* mock */ when(containerService.find(CONTAINER_1_ID)) .thenReturn(CONTAINER_1); - when(databaseService.create(request, USER_1)) + when(databaseService.create(CONTAINER_1, request, USER_1)) .thenReturn(DATABASE_1); doNothing() .when(messageQueueService) @@ -433,7 +439,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { public void create_generic(DatabaseCreateDto data, Principal principal, User user) throws DataServiceException, DataServiceConnectionException, UserNotFoundException, DatabaseNotFoundException, ContainerNotFoundException, SearchServiceException, SearchServiceConnectionException, - BrokerServiceException, BrokerServiceConnectionException { + BrokerServiceException, BrokerServiceConnectionException, ContainerQuotaException { /* mock */ doNothing() diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/UserEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/UserEndpointUnitTest.java index f5e413e0e9de10192bca89d4fe823db02924712d..ad4cef5bbea6cb262607ebbad44f6ec8148b6f9b 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/UserEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/UserEndpointUnitTest.java @@ -45,18 +45,37 @@ public class UserEndpointUnitTest extends AbstractUnitTest { @Test @WithAnonymousUser - public void findAll_anonymous_succeeds() { + public void findAll_anonymous_succeeds() throws UserNotFoundException { /* test */ - findAll_generic(); + final List<UserBriefDto> response = findAll_generic(null, null); + assertEquals(2, response.size()); } @Test @WithMockUser(username = USER_1_USERNAME) - public void findAll_noRole_succeeds() { + public void findAll_noRole_succeeds() throws UserNotFoundException { /* test */ - findAll_generic(); + final List<UserBriefDto> response = findAll_generic(null, null); + assertEquals(2, response.size()); + } + + @Test + public void findAll_filterUsername_succeeds() throws UserNotFoundException { + + /* test */ + final List<UserBriefDto> response = findAll_generic(USER_2_USERNAME, USER_2); + assertEquals(1, response.size()); + assertEquals(USER_2_ID, response.get(0).getId()); + } + + @Test + public void findAll_filterUsername_fails() throws UserNotFoundException { + + /* test */ + final List<UserBriefDto> response = findAll_generic(USER_5_USERNAME, null); + assertEquals(0, response.size()); } @Test @@ -100,7 +119,7 @@ public class UserEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_1_USERNAME) - public void find_self_succeeds() throws NotAllowedException, UserNotFoundException{ + public void find_self_succeeds() throws NotAllowedException, UserNotFoundException { /* test */ find_generic(USER_1_ID, USER_1, USER_1_PRINCIPAL); @@ -231,18 +250,29 @@ public class UserEndpointUnitTest extends AbstractUnitTest { /* ## GENERIC TEST CASES ## */ /* ################################################################################################### */ - protected void findAll_generic() { + protected List<UserBriefDto> findAll_generic(String username, User user) throws UserNotFoundException { /* mock */ - when(userService.findAll()) - .thenReturn(List.of(USER_1, USER_2)); + if (username != null) { + if (user != null) { + when(userService.findByUsername(username)) + .thenReturn(user); + } else { + doThrow(UserNotFoundException.class) + .when(userService) + .findByUsername(username); + } + } else { + when(userService.findAll()) + .thenReturn(List.of(USER_1, USER_2)); + } /* test */ - final ResponseEntity<List<UserBriefDto>> response = userEndpoint.findAll(); + final ResponseEntity<List<UserBriefDto>> response = userEndpoint.findAll(username); assertEquals(HttpStatus.OK, response.getStatusCode()); final List<UserBriefDto> body = response.getBody(); assertNotNull(body); - assertEquals(2, body.size()); + return response.getBody(); } protected void create_generic(SignupRequestDto data, User user, at.tuwien.api.keycloak.UserDto userDto, UUID id) @@ -265,7 +295,7 @@ public class UserEndpointUnitTest extends AbstractUnitTest { } protected void find_generic(UUID id, User user, Principal principal) throws NotAllowedException, - UserNotFoundException{ + UserNotFoundException { /* mock */ if (user != null) { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/gateway/DataServiceGatewayUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/gateway/DataServiceGatewayUnitTest.java index 8183ea90808ea6c7e48e1530ea2a88a62a34df9b..698f7ed524c13bbb3d9fbe5fca37003419f51a4c 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/gateway/DataServiceGatewayUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/gateway/DataServiceGatewayUnitTest.java @@ -1103,7 +1103,7 @@ public class DataServiceGatewayUnitTest extends AbstractUnitTest { } @Test - public void getTableStatistics_emptyBody_fails() { + public void getTableStatistics_emptyBody_fails() throws TableNotFoundException, DataServiceException, DataServiceConnectionException { /* mock */ when(dataServiceRestTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(TableStatisticDto.class))) @@ -1111,9 +1111,7 @@ public class DataServiceGatewayUnitTest extends AbstractUnitTest { .build()); /* test */ - assertThrows(DataServiceException.class, () -> { - dataServiceGateway.getTableStatistics(DATABASE_3_ID, TABLE_8_ID); - }); + dataServiceGateway.getTableStatistics(DATABASE_3_ID, TABLE_8_ID); } } diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/AuthenticationPrivilegedIntegrationMvcTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/AuthenticationPrivilegedIntegrationMvcTest.java index 5b2e607ec1ba9c6fe33055d4533042da4e88b2f9..474db3910bef5233d676bf387edd63afcd4aa5c6 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/AuthenticationPrivilegedIntegrationMvcTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/AuthenticationPrivilegedIntegrationMvcTest.java @@ -81,8 +81,8 @@ public class AuthenticationPrivilegedIntegrationMvcTest extends AbstractUnitTest genesis(); /* metadata database */ licenseRepository.save(LICENSE_1); - containerRepository.save(CONTAINER_1); userRepository.saveAll(List.of(USER_1, USER_2, USER_3, USER_4)); + containerRepository.save(CONTAINER_1); databaseRepository.save(DATABASE_1); /* keycloak */ keycloakUtils.deleteUser(USER_1_USERNAME); diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/PrometheusEndpointMvcTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/PrometheusEndpointMvcTest.java index d3f75d70602ffb2dad2a6b2adc8797eb7636135c..0b804dbdeab1fe3777614fafc7e4b790249bf569 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/PrometheusEndpointMvcTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/PrometheusEndpointMvcTest.java @@ -566,7 +566,7 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest { /* mock */ try { - userEndpoint.findAll(); + userEndpoint.findAll(null); } catch (Exception e) { /* ignore */ } diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServicePersistenceTest.java index 0c0cf075c4d83645a7df6bae035cbae4d458ad1e..648bb6ab290b319a817aba31d49310d43416e4a3 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServicePersistenceTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServicePersistenceTest.java @@ -76,8 +76,8 @@ public class DataCiteIdentifierServicePersistenceTest extends AbstractUnitTest { genesis(); /* metadata database */ licenseRepository.save(LICENSE_1); - containerRepository.saveAll(List.of(CONTAINER_1, CONTAINER_2, CONTAINER_3, CONTAINER_4)); userRepository.saveAll(List.of(USER_1, USER_2, USER_3, USER_4, USER_5)); + containerRepository.saveAll(List.of(CONTAINER_1, CONTAINER_2, CONTAINER_3, CONTAINER_4)); databaseRepository.saveAll(List.of(DATABASE_1, DATABASE_2, DATABASE_3, DATABASE_4)); } diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServicePersistenceTest.java index 283450cc256197b1add589295304bd69fbe89dab..b4bd67f88d225a5cfc5398fac6c485b48c674ac2 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServicePersistenceTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServicePersistenceTest.java @@ -47,8 +47,8 @@ public class DatabaseServicePersistenceTest extends AbstractUnitTest { genesis(); /* metadata database */ licenseRepository.save(LICENSE_1); - containerRepository.saveAll(List.of(CONTAINER_1, CONTAINER_2, CONTAINER_3, CONTAINER_4)); userRepository.saveAll(List.of(USER_1, USER_2, USER_3, USER_4, USER_5)); + containerRepository.saveAll(List.of(CONTAINER_1, CONTAINER_2, CONTAINER_3, CONTAINER_4)); databaseRepository.saveAll(List.of(DATABASE_1, DATABASE_2, DATABASE_3, DATABASE_4)); } diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java index ea58ae16e4ac35931bb5f713b197bacdc37b6958..68d6e1a93d5fe594d207df5ae0edc9da1b5c80b3 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java @@ -1,7 +1,6 @@ package at.tuwien.service; import at.tuwien.test.AbstractUnitTest; -import at.tuwien.api.database.DatabaseCreateDto; import at.tuwien.api.database.DatabaseModifyVisibilityDto; import at.tuwien.api.database.internal.CreateDatabaseDto; import at.tuwien.entities.database.Database; @@ -43,9 +42,6 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest { @MockBean private DatabaseRepository databaseRepository; - @MockBean - private ContainerRepository containerRepository; - @Autowired private DatabaseService databaseService; @@ -92,23 +88,6 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest { }); } - @Test - public void create_notFound_fails() { - final DatabaseCreateDto request = DatabaseCreateDto.builder() - .cid(CONTAINER_1_ID) - .name(DATABASE_1_NAME) - .build(); - - /* mock */ - when(containerRepository.findById(CONTAINER_1_ID)) - .thenReturn(Optional.empty()); - - /* test */ - assertThrows(ContainerNotFoundException.class, () -> { - databaseService.create(request, USER_1); - }); - } - @Test public void find_succeeds() throws DatabaseNotFoundException { @@ -138,26 +117,11 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest { public void create_succeeds() throws Exception { /* mock */ - when(containerRepository.findById(DATABASE_1.getCid())) - .thenReturn(Optional.of(CONTAINER_1)); when(dataServiceGateway.createDatabase(any(CreateDatabaseDto.class))) .thenReturn(DATABASE_1_DTO); /* test */ - generic_create(DATABASE_1_CREATE, DATABASE_1); - } - - @Test - public void create_containerNotFound_fails() { - - /* mock */ - when(containerRepository.findById(anyLong())) - .thenReturn(Optional.empty()); - - /* test */ - assertThrows(ContainerNotFoundException.class, () -> { - generic_create(DATABASE_1_CREATE, DATABASE_1); - }); + generic_create(); } @Test @@ -165,15 +129,13 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest { DatabaseNotFoundException { /* mock */ - when(containerRepository.findById(DATABASE_1.getCid())) - .thenReturn(Optional.of(CONTAINER_1)); doThrow(DataServiceException.class) .when(dataServiceGateway) .createDatabase(any(CreateDatabaseDto.class)); /* test */ assertThrows(DataServiceException.class, () -> { - generic_create(DATABASE_1_CREATE, DATABASE_1); + generic_create(); }); } @@ -182,15 +144,13 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest { DatabaseNotFoundException { /* mock */ - when(containerRepository.findById(DATABASE_1.getCid())) - .thenReturn(Optional.of(CONTAINER_1)); doThrow(DataServiceConnectionException.class) .when(dataServiceGateway) .createDatabase(any(CreateDatabaseDto.class)); /* test */ assertThrows(DataServiceConnectionException.class, () -> { - generic_create(DATABASE_1_CREATE, DATABASE_1); + generic_create(); }); } @@ -304,7 +264,7 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest { /* ## GENERIC TEST CASES ## */ /* ################################################################################################### */ - protected Database generic_create(DatabaseCreateDto createDto, Database database) throws DataServiceException, + protected Database generic_create() throws DataServiceException, DataServiceConnectionException, UserNotFoundException, DatabaseNotFoundException, ContainerNotFoundException, SearchServiceException, SearchServiceConnectionException { @@ -312,13 +272,11 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest { when(searchServiceGateway.update(any(Database.class))) .thenReturn(DATABASE_1_DTO); when(databaseRepository.save(any(Database.class))) - .thenReturn(database); + .thenReturn(DATABASE_1); /* test */ - final Database response = databaseService.create(createDto, USER_1); - assertEquals(database.getName(), response.getName()); - assertEquals(database.getIsPublic(), response.getIsPublic()); - assertTrue(response.getInternalName().startsWith(database.getInternalName())); + final Database response = databaseService.create(CONTAINER_1, DATABASE_1_CREATE, USER_1); + assertTrue(response.getInternalName().startsWith(DATABASE_1_INTERNALNAME)); assertNotNull(response.getContainer()); assertNotNull(response.getTables()); assertNotNull(response.getViews()); @@ -332,7 +290,6 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest { assertNotNull(response.getOwner()); assertNull(response.getImage()); assertNotNull(response.getExchangeName()); - assertEquals(database.getIsPublic(), response.getIsPublic()); return response; } diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/IdentifierServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/IdentifierServicePersistenceTest.java index 6b3ff624b0e5ebf47757824f645e4a120e43b243..246ae7de1a4beb7a55f4cadf13f142b48ef995fd 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/IdentifierServicePersistenceTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/IdentifierServicePersistenceTest.java @@ -73,8 +73,8 @@ public class IdentifierServicePersistenceTest extends AbstractUnitTest { genesis(); /* metadata database */ licenseRepository.save(LICENSE_1); - containerRepository.saveAll(List.of(CONTAINER_1, CONTAINER_2, CONTAINER_3, CONTAINER_4)); userRepository.saveAll(List.of(USER_1, USER_2, USER_3, USER_4, USER_5)); + containerRepository.saveAll(List.of(CONTAINER_1, CONTAINER_2, CONTAINER_3, CONTAINER_4)); databaseRepository.saveAll(List.of(DATABASE_1, DATABASE_2, DATABASE_3, DATABASE_4)); } diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ImageServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ImageServicePersistenceTest.java index 50e0dc08f657fb5230838397c90a21a619d8bd8b..fb501cb28179e895dfcf4340afb7dc0cfee547fb 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ImageServicePersistenceTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ImageServicePersistenceTest.java @@ -1,12 +1,12 @@ package at.tuwien.service; +import at.tuwien.exception.ImageInvalidException; import at.tuwien.test.AbstractUnitTest; import at.tuwien.api.container.image.ImageCreateDto; import at.tuwien.exception.ImageAlreadyExistsException; import at.tuwien.repository.ContainerRepository; import at.tuwien.repository.ImageRepository; import lombok.extern.log4j.Log4j2; -import org.apache.http.auth.BasicUserPrincipal; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -15,8 +15,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit.jupiter.SpringExtension; -import java.security.Principal; - import static org.junit.jupiter.api.Assertions.*; @Log4j2 @@ -42,7 +40,7 @@ public class ImageServicePersistenceTest extends AbstractUnitTest { } @Test - public void create_succeeds() throws ImageAlreadyExistsException { + public void create_succeeds() throws ImageAlreadyExistsException, ImageInvalidException { final ImageCreateDto request = ImageCreateDto.builder() .name(IMAGE_1_NAME) .version("11.1.4") // new tag @@ -51,11 +49,11 @@ public class ImageServicePersistenceTest extends AbstractUnitTest { .dialect(IMAGE_1_DIALECT) .driverClass(IMAGE_1_DRIVER) .defaultPort(IMAGE_1_PORT) + .isDefault(false) .build(); - final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); /* test */ - imageService.create(request, principal); + imageService.create(request, USER_1_PRINCIPAL); } @Test @@ -67,12 +65,31 @@ public class ImageServicePersistenceTest extends AbstractUnitTest { .driverClass(IMAGE_1_DRIVER) .jdbcMethod(IMAGE_1_JDBC) .dialect(IMAGE_1_DIALECT) + .isDefault(IMAGE_1_IS_DEFAULT) .build(); - final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); /* test */ assertThrows(ImageAlreadyExistsException.class, () -> { - imageService.create(request, principal); + imageService.create(request, USER_1_PRINCIPAL); + }); + } + + @Test + public void create_multipleDefaultImages_fails() { + final ImageCreateDto request = ImageCreateDto.builder() + .name("mariadb") + .version("10.5") + .registry(IMAGE_1_REGISTRY) + .defaultPort(IMAGE_1_PORT) + .driverClass(IMAGE_1_DRIVER) + .jdbcMethod(IMAGE_1_JDBC) + .dialect(IMAGE_1_DIALECT) + .isDefault(true) // <<<< + .build(); + + /* test */ + assertThrows(ImageInvalidException.class, () -> { + imageService.create(request, USER_1_PRINCIPAL); }); } diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ImageServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ImageServiceUnitTest.java index bce3c7bc125636591d86a83311a4315ab677fba3..524c5715b4fd59e24c3f972a3acf2bd08453d99b 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ImageServiceUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ImageServiceUnitTest.java @@ -1,5 +1,6 @@ package at.tuwien.service; +import at.tuwien.exception.ImageInvalidException; import at.tuwien.exception.ImageNotFoundException; import at.tuwien.test.AbstractUnitTest; import at.tuwien.api.container.image.ImageChangeDto; @@ -82,8 +83,8 @@ public class ImageServiceUnitTest extends AbstractUnitTest { .build(); /* mock */ - when(imageRepository.save(any(ContainerImage.class))) - .thenThrow(ConstraintViolationException.class); + when(imageRepository.findByNameAndVersion(IMAGE_1_NAME, IMAGE_1_VERSION)) + .thenReturn(Optional.of(IMAGE_1)); /* test */ assertThrows(ImageAlreadyExistsException.class, () -> { @@ -91,6 +92,27 @@ public class ImageServiceUnitTest extends AbstractUnitTest { }); } + @Test + public void create_multipleDefaults_fails() { + final ImageCreateDto request = ImageCreateDto.builder() + .name(IMAGE_1_NAME) + .version("10.5") + .defaultPort(IMAGE_1_PORT) + .isDefault(true) + .build(); + + /* mock */ + when(imageRepository.findByNameAndVersion(IMAGE_1_NAME, IMAGE_1_VERSION)) + .thenReturn(Optional.empty()); + when(imageRepository.findByIsDefault(true)) + .thenReturn(Optional.of(IMAGE_1)); + + /* test */ + assertThrows(ImageInvalidException.class, () -> { + imageService.create(request, USER_1_PRINCIPAL); + }); + } + @Test public void update_succeeds() { final ImageServiceImpl mockImageService = mock(ImageServiceImpl.class); diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServicePersistenceTest.java index e66d35d8ea0d8b0f9aff850cf4baf880e4240c12..e2d7d33896f6c1b13d0ce9ab5af3262c8668f0bc 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServicePersistenceTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServicePersistenceTest.java @@ -71,8 +71,8 @@ public class TableServicePersistenceTest extends AbstractUnitTest { genesis(); /* metadata database */ licenseRepository.save(LICENSE_1); - containerRepository.save(CONTAINER_1); userRepository.saveAll(List.of(USER_1, USER_2, USER_3)); + containerRepository.save(CONTAINER_1); databaseRepository.saveAll(List.of(DATABASE_1)); } diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServicePersistenceTest.java index e23320017c54592662f42b24c3eb7039a3f1a540..3ed06bfd7c8ba6222bcbfbf45cfeb9a602e8fa91 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServicePersistenceTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServicePersistenceTest.java @@ -61,8 +61,8 @@ public class ViewServicePersistenceTest extends AbstractUnitTest { genesis(); /* metadata database */ licenseRepository.save(LICENSE_1); - containerRepository.save(CONTAINER_1); userRepository.saveAll(List.of(USER_1, USER_2, USER_3)); + containerRepository.save(CONTAINER_1); databaseRepository.save(DATABASE_1); } diff --git a/dbrepo-metadata-service/services/pom.xml b/dbrepo-metadata-service/services/pom.xml index bf2105f98da2ff1644bd94493f54f1b5929ea9ce..5f0bc0960c21eee8b171addb2bdd240a55b3faf7 100644 --- a/dbrepo-metadata-service/services/pom.xml +++ b/dbrepo-metadata-service/services/pom.xml @@ -6,12 +6,12 @@ <parent> <artifactId>dbrepo-metadata-service</artifactId> <groupId>at.tuwien</groupId> - <version>1.4.5</version> + <version>1.4.6</version> </parent> <artifactId>dbrepo-metadata-service-services</artifactId> <name>dbrepo-metadata-service-services</name> - <version>1.4.5</version> + <version>1.4.6</version> <dependencies> <dependency> diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/DataServiceGatewayImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/DataServiceGatewayImpl.java index 886911d9f4a770fe8c620d7cc882cd7b4da05c55..0c11de442957cbc6deee1d20d7f51b865017a90b 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/DataServiceGatewayImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/DataServiceGatewayImpl.java @@ -372,7 +372,8 @@ public class DataServiceGatewayImpl implements DataServiceGateway { } @Override - public TableStatisticDto getTableStatistics(Long databaseId, Long tableId) throws DataServiceConnectionException, DataServiceException, TableNotFoundException { + public TableStatisticDto getTableStatistics(Long databaseId, Long tableId) throws DataServiceConnectionException, + DataServiceException, TableNotFoundException { final ResponseEntity<TableStatisticDto> response; final String path = "/api/database/" + databaseId + "/table/" + tableId + "/statistic"; log.trace("get table statistics at endpoint {} with path {}", gatewayConfig.getDataEndpoint(), path); @@ -392,10 +393,6 @@ public class DataServiceGatewayImpl implements DataServiceGateway { log.error("Failed to analyse table statistic: wrong http code: {}", response.getStatusCode()); throw new DataServiceException("Failed to analyse table statistic: wrong http code: " + response.getStatusCode()); } - if (response.getBody() == null) { - log.error("Failed to analyse table statistic: empty body: {}", response.getStatusCode()); - throw new DataServiceException("Failed to analyse table statistic: empty body: " + response.getStatusCode()); - } return response.getBody(); } diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/DatabaseService.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/DatabaseService.java index aa25ee1362f825ddf060ce9c90dde9e4c965b6bf..d7c036049b84cfe9d028fa60fa532aa6ba00dc75 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/DatabaseService.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/DatabaseService.java @@ -2,6 +2,7 @@ package at.tuwien.service; import at.tuwien.api.database.DatabaseCreateDto; import at.tuwien.api.database.DatabaseModifyVisibilityDto; +import at.tuwien.entities.container.Container; import at.tuwien.entities.database.Database; import at.tuwien.entities.user.User; import at.tuwien.exception.*; @@ -47,15 +48,17 @@ public interface DatabaseService { /** * Creates a new database with minimal metadata in the metadata database and creates a new database on the container. * + * @param container The container. * @param createDto The metadata. * @param user The user. * @return The database, if successful. - * @throws UserNotFoundException If the container/user was not found in the metadata database. + * @throws UserNotFoundException If the container/user was not found in the metadata database. * @throws DataServiceException If the data service returned non-successfully. * @throws DataServiceConnectionException If failing to connect to the data service/search service. */ - Database create(DatabaseCreateDto createDto, User user) throws UserNotFoundException, ContainerNotFoundException, - DataServiceException, DataServiceConnectionException, DatabaseNotFoundException, SearchServiceException, SearchServiceConnectionException; + Database create(Container container, DatabaseCreateDto createDto, User user) throws UserNotFoundException, + ContainerNotFoundException, DataServiceException, DataServiceConnectionException, DatabaseNotFoundException, + SearchServiceException, SearchServiceConnectionException; /** * Updates the user's password. @@ -73,7 +76,7 @@ public interface DatabaseService { * @param database The database. * @param data The visibility * @return The database, if successful. - * @throws NotFoundException The database was not found in the metadata database. + * @throws NotFoundException The database was not found in the metadata database. * @throws DataServiceConnectionException If failing to connect to the search service. */ Database modifyVisibility(Database database, DatabaseModifyVisibilityDto data) throws DatabaseNotFoundException, SearchServiceException, SearchServiceConnectionException; diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/ImageService.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/ImageService.java index bb5134ebc4f1435f9db797f54b0128ab2cff9bbb..cc51082d65f1b72a066208b83276169fd36d8f5d 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/ImageService.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/ImageService.java @@ -4,6 +4,7 @@ import at.tuwien.api.container.image.ImageChangeDto; import at.tuwien.api.container.image.ImageCreateDto; import at.tuwien.entities.container.image.ContainerImage; import at.tuwien.exception.ImageAlreadyExistsException; +import at.tuwien.exception.ImageInvalidException; import at.tuwien.exception.ImageNotFoundException; import java.security.Principal; @@ -32,8 +33,11 @@ public interface ImageService { * @param createDto The new image. * @param principal The user principal. * @return The container image, if successful. + * @throws ImageAlreadyExistsException The image already exists. + * @throws ImageInvalidException The default image cannot be created as a default image already exists. */ - ContainerImage create(ImageCreateDto createDto, Principal principal) throws ImageAlreadyExistsException; + ContainerImage create(ImageCreateDto createDto, Principal principal) throws ImageAlreadyExistsException, + ImageInvalidException; /** * Updates a container image with given id in the metadata database. diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/UserService.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/UserService.java index 92e0bc37ee2b58eddc9faa86f08d4748caf662f5..8e7c715ad06d434bfdb947136546f686e91835ad 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/UserService.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/UserService.java @@ -76,4 +76,6 @@ public interface UserService { * @throws EmailExistsException The user with this email already exists. */ void validateEmailNotExists(String email) throws EmailExistsException; + + String getMariaDbPassword(String password); } diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java index 8c835864db5ed4bf69bd2bd6b29adfe4d409899d..1c91de7be10e544cfe9b9e5ce71c3af5c3f89e88 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java @@ -34,17 +34,14 @@ import java.util.*; public class DatabaseServiceImpl implements DatabaseService { private final MetadataMapper metadataMapper; - private final ContainerService containerService; private final DatabaseRepository databaseRepository; private final DataServiceGateway dataServiceGateway; private final SearchServiceGateway searchServiceGateway; @Autowired - public DatabaseServiceImpl(MetadataMapper metadataMapper, ContainerService containerService, - DatabaseRepository databaseRepository, DataServiceGateway dataServiceGateway, - SearchServiceGateway searchServiceGateway) { + public DatabaseServiceImpl(MetadataMapper metadataMapper, DatabaseRepository databaseRepository, + DataServiceGateway dataServiceGateway, SearchServiceGateway searchServiceGateway) { this.metadataMapper = metadataMapper; - this.containerService = containerService; this.databaseRepository = databaseRepository; this.dataServiceGateway = dataServiceGateway; this.searchServiceGateway = searchServiceGateway; @@ -84,10 +81,9 @@ public class DatabaseServiceImpl implements DatabaseService { @Override @Transactional - public Database create(DatabaseCreateDto data, User user) throws UserNotFoundException, + public Database create(Container container, DatabaseCreateDto data, User user) throws UserNotFoundException, ContainerNotFoundException, DataServiceException, DataServiceConnectionException, DatabaseNotFoundException, SearchServiceException, SearchServiceConnectionException { - final Container container = containerService.find(data.getCid()); Database database = Database.builder() .isPublic(data.getIsPublic()) .name(data.getName()) diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/ImageServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/ImageServiceImpl.java index 8e4decfc1724a010e4d62f38491ad3404d259b1d..84fdffcf43b1e6e6f110bf0acf72d4ca75a3a3cf 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/ImageServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/ImageServiceImpl.java @@ -4,6 +4,7 @@ import at.tuwien.api.container.image.ImageChangeDto; import at.tuwien.api.container.image.ImageCreateDto; import at.tuwien.entities.container.image.ContainerImage; import at.tuwien.exception.ImageAlreadyExistsException; +import at.tuwien.exception.ImageInvalidException; import at.tuwien.exception.ImageNotFoundException; import at.tuwien.mapper.MetadataMapper; import at.tuwien.repository.ImageRepository; @@ -51,13 +52,17 @@ public class ImageServiceImpl implements ImageService { @Override @Transactional - public ContainerImage create(ImageCreateDto createDto, Principal principal) throws ImageAlreadyExistsException { + public ContainerImage create(ImageCreateDto createDto, Principal principal) throws ImageAlreadyExistsException, + ImageInvalidException { final ContainerImage image = metadataMapper.createImageDtoToContainerImage(createDto); if (imageRepository.findByNameAndVersion(createDto.getName(), createDto.getVersion()).isPresent()) { - log.error("Failed to create image {}:{}: exists in the metadata database", - createDto.getName(), createDto.getVersion()); + log.error("Failed to create image {}:{}: exists in the metadata database", createDto.getName(), createDto.getVersion()); throw new ImageAlreadyExistsException("Failed to create image " + createDto.getName() + ":" + createDto.getVersion() + ": exists in the metadata database"); } + if (createDto.getIsDefault() && imageRepository.findByIsDefault(true).isPresent()) { + log.error("Failed to create image {}:{}: default image exists", createDto.getName(), createDto.getVersion()); + throw new ImageInvalidException("Failed to create image: default image exists"); + } final ContainerImage dto; try { dto = imageRepository.save(image); diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java index 7ca855974e86b23a5a2ec8abcbc124f97a0e8ab7..f88ba5c28f4d928757a501d8ed1a3f4effb018d8 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java @@ -270,6 +270,9 @@ public class TableServiceImpl implements TableService { DatabaseNotFoundException, SearchServiceConnectionException, MalformedException, TableNotFoundException, DataServiceException, DataServiceConnectionException { final TableStatisticDto statistic = dataServiceGateway.getTableStatistics(table.getTdbid(), table.getId()); + if (statistic == null) { + return; + } table.setNumRows(statistic.getRows()); table.setDataLength(statistic.getDataLength()); table.setAvgRowLength(statistic.getAvgRowLength()); diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/UserServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/UserServiceImpl.java index 547a01c2fab73cf410673778747f0545c40907de..7e07b68d1c965ed42261ab508273770be50a6454 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/UserServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/UserServiceImpl.java @@ -105,6 +105,7 @@ public class UserServiceImpl implements UserService { } } + @Override public String getMariaDbPassword(String password) { final byte[] utf8 = password.getBytes(StandardCharsets.UTF_8); return "*" + DigestUtils.sha1Hex(DigestUtils.sha1(utf8)).toUpperCase(); diff --git a/dbrepo-metadata-service/test/pom.xml b/dbrepo-metadata-service/test/pom.xml index 2c4091eace14d78e0a6323f8960be5ffa6f5cfb0..b7bed994e55bae1797efdd69602e415c275a5062 100644 --- a/dbrepo-metadata-service/test/pom.xml +++ b/dbrepo-metadata-service/test/pom.xml @@ -6,12 +6,12 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-metadata-service</artifactId> - <version>1.4.5</version> + <version>1.4.6</version> </parent> <artifactId>dbrepo-metadata-service-test</artifactId> <name>dbrepo-metadata-service-test</name> - <version>1.4.5</version> + <version>1.4.6</version> <dependencies> <dependency> diff --git a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/AbstractUnitTest.java b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/AbstractUnitTest.java index 156563a041c833376f850465032f28b69602e020..996dbb9a7d71b00c7988d9da4dc1ddeb3876245e 100644 --- a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/AbstractUnitTest.java +++ b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/AbstractUnitTest.java @@ -9,6 +9,8 @@ import java.util.List; public abstract class AbstractUnitTest extends BaseTest { public void genesis() { + CONTAINER_1.setDatabases(new LinkedList<>(List.of(DATABASE_1, DATABASE_2, DATABASE_3))); + CONTAINER_4.setDatabases(new LinkedList<>(List.of(DATABASE_4))); /* USER_1 */ USER_1.setAccesses(new LinkedList<>()); /* USER_2 */ @@ -83,6 +85,7 @@ public abstract class AbstractUnitTest extends BaseTest { TABLE_5.setColumns(new LinkedList<>(TABLE_5_COLUMNS)); TABLE_5.setConstraints(TABLE_5_CONSTRAINTS); TABLE_5_PRIVILEGED_DTO.setColumns(new LinkedList<>(TABLE_5_COLUMNS_DTO)); + TABLE_5_PRIVILEGED_DTO.setConstraints(TABLE_5_CONSTRAINTS_DTO); TABLE_5_PRIVILEGED_DTO.setDatabase(DATABASE_2_PRIVILEGED_DTO); TABLE_5_DTO.setColumns(TABLE_5_COLUMNS_DTO); TABLE_5_DTO.setConstraints(TABLE_5_CONSTRAINTS_DTO); @@ -113,6 +116,7 @@ public abstract class AbstractUnitTest extends BaseTest { TABLE_8_DTO.setConstraints(TABLE_8_CONSTRAINTS_DTO); TABLE_8_PRIVILEGED_DTO.setColumns(new LinkedList<>(TABLE_8_COLUMNS_DTO)); TABLE_8_PRIVILEGED_DTO.setConstraints(TABLE_8_CONSTRAINTS_DTO); + TABLE_8_PRIVILEGED_DTO.setDatabase(DATABASE_3_PRIVILEGED_DTO); VIEW_5.setDatabase(DATABASE_3); VIEW_5.setColumns(VIEW_5_COLUMNS); IDENTIFIER_6.setDatabase(DATABASE_3); diff --git a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java index 0341a7a5dfad8f3a218dd195631ff956289b6b15..6ade19c1ec0f6c742a97731d3a97482fea97923d 100644 --- a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java +++ b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java @@ -90,6 +90,8 @@ import java.math.BigInteger; import java.nio.charset.Charset; import java.security.Principal; import java.time.Instant; +import java.time.LocalDate; +import java.time.ZoneOffset; import java.util.*; import java.util.stream.Collectors; @@ -134,7 +136,7 @@ import static java.time.temporal.ChronoUnit.MINUTES; * <li>Identifier 6 (Title=en, Description=en, Query=3)</li> * </ul> * <p> - * Database 4 (Public, User 4) + * Database 4 (Public, User 4) -> Container 4 * <li>Identifier 7 (Database=4)</li> * <ul> * </ul> @@ -380,6 +382,7 @@ public abstract class BaseTest { public final static String USER_BROKER_USERNAME = "guest"; public final static String USER_BROKER_PASSWORD = "guest"; + public final static UUID USER_LOCAL_ADMIN_ID = UUID.fromString("a54dcb2e-a644-4e82-87e7-05a96413983d"); public final static String USER_LOCAL_ADMIN_USERNAME = "admin"; public final static String USER_LOCAL_ADMIN_PASSWORD = "admin"; @@ -896,13 +899,14 @@ public abstract class BaseTest { USER_6_PASSWORD, USER_6_DETAILS.getAuthorities()); public final static Long IMAGE_1_ID = 1L; - public final static String IMAGE_1_REGISTRY = "docker.io/library"; + public final static String IMAGE_1_REGISTRY = "docker.io"; public final static String IMAGE_1_NAME = "mariadb"; public final static String IMAGE_1_VERSION = "11.1.3"; public final static String IMAGE_1_DIALECT = "org.hibernate.dialect.MariaDBDialect"; public final static String IMAGE_1_DRIVER = "org.mariadb.jdbc.Driver"; public final static String IMAGE_1_JDBC = "mariadb"; public final static Integer IMAGE_1_PORT = 3306; + public final static Boolean IMAGE_1_IS_DEFAULT = true; public final static Long IMAGE_DATE_1_ID = 1L; public final static Long IMAGE_DATE_1_IMAGE_ID = IMAGE_1_ID; @@ -1023,6 +1027,7 @@ public abstract class BaseTest { .jdbcMethod(IMAGE_1_JDBC) .driverClass(IMAGE_1_DRIVER) .defaultPort(IMAGE_1_PORT) + .isDefault(IMAGE_1_IS_DEFAULT) .dateFormats(new LinkedList<>(List.of(IMAGE_DATE_1, IMAGE_DATE_2, IMAGE_DATE_3, IMAGE_DATE_4))) .build(); @@ -1035,6 +1040,7 @@ public abstract class BaseTest { .jdbcMethod(IMAGE_1_JDBC) .driverClass(IMAGE_1_DRIVER) .defaultPort(IMAGE_1_PORT) + .isDefault(IMAGE_1_IS_DEFAULT) .dateFormats(List.of(IMAGE_DATE_1_DTO, IMAGE_DATE_2_DTO, IMAGE_DATE_3_DTO)) .build(); @@ -1042,6 +1048,7 @@ public abstract class BaseTest { .id(IMAGE_1_ID) .name(IMAGE_1_NAME) .version(IMAGE_1_VERSION) + .isDefault(IMAGE_1_IS_DEFAULT) .build(); public final static Long CONTAINER_1_ID = 1L; @@ -1053,7 +1060,8 @@ public abstract class BaseTest { public final static String CONTAINER_1_UI_HOST = "localhost"; public final static Integer CONTAINER_1_UI_PORT = 3306; public final static String CONTAINER_1_UI_ADDITIONAL_FLAGS = "?sslMode=disable"; - public final static Boolean CONTAINER_1_RUNNING = true; + public final static Integer CONTAINER_1_QUOTA = 4; + public final static Integer CONTAINER_1_COUNT = 3; public final static String CONTAINER_1_HOST = "localhost"; public final static Integer CONTAINER_1_PORT = 3308; public final static String CONTAINER_1_SIDECAR_HOST = "localhost"; @@ -1072,6 +1080,7 @@ public abstract class BaseTest { .port(CONTAINER_1_PORT) .uiHost(CONTAINER_1_UI_HOST) .uiPort(CONTAINER_1_UI_PORT) + .quota(CONTAINER_1_QUOTA) .uiAdditionalFlags(CONTAINER_1_UI_ADDITIONAL_FLAGS) .privilegedUsername(CONTAINER_1_PRIVILEGED_USERNAME) .privilegedPassword(CONTAINER_1_PRIVILEGED_PASSWORD) @@ -1094,7 +1103,8 @@ public abstract class BaseTest { .name(CONTAINER_1_NAME) .internalName(CONTAINER_1_INTERNALNAME) .created(CONTAINER_1_CREATED) - .running(CONTAINER_1_RUNNING) + .quota(CONTAINER_1_QUOTA) + .count(CONTAINER_1_COUNT) .build(); public final static PrivilegedContainerDto CONTAINER_1_PRIVILEGED_DTO = PrivilegedContainerDto.builder() @@ -1121,7 +1131,8 @@ public abstract class BaseTest { public final static Integer CONTAINER_2_PORT = 3309; public final static String CONTAINER_2_SIDECAR_HOST = "localhost"; public final static Integer CONTAINER_2_SIDECAR_PORT = 33091; - public final static Boolean CONTAINER_2_RUNNING = true; + public final static Integer CONTAINER_2_QUOTA = 3; + public final static Integer CONTAINER_2_COUNT = 3; public final static String CONTAINER_2_PRIVILEGED_USERNAME = "root"; public final static String CONTAINER_2_PRIVILEGED_PASSWORD = "dbrepo"; public final static Instant CONTAINER_2_CREATED = Instant.ofEpochSecond(1677399655L) /* 2023-02-26 08:20:55 (UTC) */; @@ -1134,6 +1145,8 @@ public abstract class BaseTest { .created(CONTAINER_2_CREATED) .host(CONTAINER_2_HOST) .port(CONTAINER_2_PORT) + .quota(CONTAINER_2_QUOTA) + .databases(List.of()) .privilegedUsername(CONTAINER_2_PRIVILEGED_USERNAME) .privilegedPassword(CONTAINER_2_PRIVILEGED_PASSWORD) .build(); @@ -1153,7 +1166,7 @@ public abstract class BaseTest { .name(CONTAINER_2_NAME) .internalName(CONTAINER_2_INTERNALNAME) .created(CONTAINER_2_CREATED) - .running(CONTAINER_2_RUNNING) + .quota(CONTAINER_2_QUOTA) .build(); public final static Long CONTAINER_3_ID = 3L; @@ -1163,6 +1176,7 @@ public abstract class BaseTest { public final static String CONTAINER_3_IP = "172.30.0.7"; public final static String CONTAINER_3_HOST = "localhost"; public final static Integer CONTAINER_3_PORT = 3310; + public final static Integer CONTAINER_3_QUOTA = 20; public final static String CONTAINER_3_SIDECAR_HOST = "localhost"; public final static Integer CONTAINER_3_SIDECAR_PORT = 33101; public final static String CONTAINER_3_PRIVILEGED_USERNAME = "root"; @@ -1177,6 +1191,8 @@ public abstract class BaseTest { .created(CONTAINER_3_CREATED) .host(CONTAINER_3_HOST) .port(CONTAINER_3_PORT) + .quota(CONTAINER_3_QUOTA) + .databases(List.of()) .privilegedUsername(CONTAINER_3_PRIVILEGED_USERNAME) .privilegedPassword(CONTAINER_3_PRIVILEGED_PASSWORD) .build(); @@ -1188,6 +1204,7 @@ public abstract class BaseTest { public final static String CONTAINER_4_IP = "172.30.0.8"; public final static String CONTAINER_4_HOST = "localhost"; public final static Integer CONTAINER_4_PORT = 3311; + public final static Integer CONTAINER_4_QUOTA = 0; public final static String CONTAINER_4_SIDECAR_HOST = "localhost"; public final static Integer CONTAINER_4_SIDECAR_PORT = 33111; public final static String CONTAINER_4_PRIVILEGED_USERNAME = "root"; @@ -1202,6 +1219,7 @@ public abstract class BaseTest { .created(CONTAINER_4_CREATED) .host(CONTAINER_4_HOST) .port(CONTAINER_4_PORT) + .quota(CONTAINER_4_QUOTA) .privilegedUsername(CONTAINER_4_PRIVILEGED_USERNAME) .privilegedPassword(CONTAINER_4_PRIVILEGED_PASSWORD) .build(); @@ -1679,6 +1697,40 @@ public abstract class BaseTest { .owner(USER_1_BRIEF_DTO) .build(); + public final static Long TABLE_1_DATA_COUNT = 3L; + public final static QueryResultDto TABLE_1_DATA_DTO = QueryResultDto.builder() + .headers(new LinkedList<>(List.of(new HashMap<>() {{ + put("id", 0); + put("date", 1); + put("location", 2); + put("mintemp", 3); + put("rainfall", 4); + }}))) + .result(new LinkedList<>(List.of( + new HashMap<>() {{ + put("id", BigInteger.valueOf(1L)); + put("date", LocalDate.of(2008, 12, 1).atStartOfDay().toInstant(ZoneOffset.UTC)); + put("location", "Albury"); + put("mintemp", 13.4); + put("rainfall", 0.6); + }}, + new HashMap<>() {{ + put("id", BigInteger.valueOf(2L)); + put("date", LocalDate.of(2008, 12, 2).atStartOfDay().toInstant(ZoneOffset.UTC)); + put("location", "Albury"); + put("mintemp", 7.4); + put("rainfall", 0); + }}, + new HashMap<>() {{ + put("id", BigInteger.valueOf(3L)); + put("date", LocalDate.of(2008, 12, 3).atStartOfDay().toInstant(ZoneOffset.UTC)); + put("location", "Albury"); + put("mintemp", 12.9); + put("rainfall", 0); + }} + ))) + .build(); + public final static Long TABLE_2_ID = 2L; public final static String TABLE_2_NAME = "Weather Location"; public final static String TABLE_2_INTERNALNAME = "weather_location"; @@ -1846,6 +1898,8 @@ public abstract class BaseTest { .build(); public final static ConstraintsCreateDto TABLE_3_CONSTRAINTS_INVALID_CREATE_DTO = ConstraintsCreateDto.builder() + .checks(new LinkedHashSet<>()) + .primaryKey(new LinkedHashSet<>()) // <<<< .uniques(new LinkedList<>()) .foreignKeys(List.of(ForeignKeyCreateDto.builder() .referencedTable("weather_location") @@ -2132,8 +2186,12 @@ public abstract class BaseTest { .columnType(ColumnTypeDto.TIMESTAMP) .build(); + public final static Long COLUMN_4_1_ID = 44L; + + public final static Long COLUMN_4_2_ID = 45L; + public final static List<TableColumn> TABLE_4_COLUMNS = List.of(TableColumn.builder() - .id(44L) + .id(COLUMN_4_1_ID) .ordinalPosition(0) .table(TABLE_4) .name("Timestamp") @@ -2143,7 +2201,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), TableColumn.builder() - .id(45L) + .id(COLUMN_4_2_ID) .ordinalPosition(1) .table(TABLE_4) .name("Value") @@ -2169,7 +2227,7 @@ public abstract class BaseTest { public final static ConstraintsCreateDto TABLE_4_CONSTRAINTS_CREATE_DTO = ConstraintsCreateDto.builder() .checks(new LinkedHashSet<>()) - .primaryKey(new LinkedHashSet<>()) + .primaryKey(new LinkedHashSet<>(Set.of("Timestamp"))) .foreignKeys(new LinkedList<>()) .uniques(List.of(List.of("Timestamp"))) .build(); @@ -2189,7 +2247,7 @@ public abstract class BaseTest { .build(); public final static List<ColumnDto> TABLE_4_COLUMNS_DTO = List.of(ColumnDto.builder() - .id(44L) + .id(COLUMN_4_1_ID) .databaseId(DATABASE_1_ID) .tableId(TABLE_4_ID) .name("Timestamp") @@ -2200,7 +2258,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), ColumnDto.builder() - .id(45L) + .id(COLUMN_4_2_ID) .databaseId(DATABASE_1_ID) .tableId(TABLE_4_ID) .name("Value") @@ -2402,39 +2460,34 @@ public abstract class BaseTest { .sparqlEndpoint(ONTOLOGY_5_SPARQL_ENDPOINT) .build(); - public final static Long COLUMN_8_1_ID = 72L; + public final static Long COLUMN_8_1_ID = 75L; public final static Integer COLUMN_8_1_ORDINALPOS = 0; - public final static Boolean COLUMN_8_1_PRIMARY = true; public final static String COLUMN_8_1_NAME = "ID"; public final static String COLUMN_8_1_INTERNAL_NAME = "id"; public final static TableColumnType COLUMN_8_1_TYPE = TableColumnType.BIGINT; public final static ColumnTypeDto COLUMN_8_1_TYPE_DTO = ColumnTypeDto.BIGINT; - public final static Long COLUMN_8_1_DATE_FORMAT = null; public final static Boolean COLUMN_8_1_NULL = false; public final static Boolean COLUMN_8_1_AUTO_GENERATED = true; - public final static String COLUMN_8_1_FOREIGN_KEY = null; - public final static String COLUMN_8_1_CHECK = null; - public final static List<String> COLUMN_8_1_ENUM_VALUES = null; - public final static List<String> COLUMN_8_1_ENUM_VALUES_DTO = null; - public final static List<String> COLUMN_8_1_SET_VALUES = null; - public final static List<String> COLUMN_8_1_SET_VALUES_DTO = null; - - public final static Long COLUMN_8_2_ID = 73L; + + public final static Long COLUMN_8_2_ID = 76L; public final static Integer COLUMN_8_2_ORDINALPOS = 1; - public final static Boolean COLUMN_8_2_PRIMARY = true; public final static String COLUMN_8_2_NAME = "Value"; public final static String COLUMN_8_2_INTERNAL_NAME = "value"; - public final static TableColumnType COLUMN_8_2_TYPE = TableColumnType.INT; - public final static ColumnTypeDto COLUMN_8_2_TYPE_DTO = ColumnTypeDto.INT; - public final static Long COLUMN_8_2_DATE_FORMAT = null; - public final static Boolean COLUMN_8_2_NULL = true; + public final static TableColumnType COLUMN_8_2_TYPE = TableColumnType.DECIMAL; + public final static ColumnTypeDto COLUMN_8_2_TYPE_DTO = ColumnTypeDto.DECIMAL; + public final static Long COLUMN_8_2_SIZE = 10L; + public final static Long COLUMN_8_2_D = 10L; + public final static Boolean COLUMN_8_2_NULL = false; public final static Boolean COLUMN_8_2_AUTO_GENERATED = false; - public final static String COLUMN_8_2_FOREIGN_KEY = null; - public final static String COLUMN_8_2_CHECK = null; - public final static List<String> COLUMN_8_2_ENUM_VALUES = null; - public final static List<String> COLUMN_8_2_ENUM_VALUES_DTO = null; - public final static List<String> COLUMN_8_2_SET_VALUES = null; - public final static List<String> COLUMN_8_2_SET_VALUES_DTO = null; + + public final static Long COLUMN_8_3_ID = 77L; + public final static Integer COLUMN_8_3_ORDINALPOS = 2; + public final static String COLUMN_8_3_NAME = "raw"; + public final static String COLUMN_8_3_INTERNAL_NAME = "raw"; + public final static TableColumnType COLUMN_8_3_TYPE = TableColumnType.LONGBLOB; + public final static ColumnTypeDto COLUMN_8_3_TYPE_DTO = ColumnTypeDto.LONGBLOB; + public final static Boolean COLUMN_8_3_NULL = true; + public final static Boolean COLUMN_8_3_AUTO_GENERATED = false; public final static ColumnBriefDto TABLE_8_COLUMNS_BRIEF_0_DTO = ColumnBriefDto.builder() .id(COLUMN_8_1_ID) @@ -2462,6 +2515,18 @@ public abstract class BaseTest { .columnType(COLUMN_8_2_TYPE) .isNullAllowed(COLUMN_8_2_NULL) .autoGenerated(COLUMN_8_2_AUTO_GENERATED) + .size(COLUMN_8_2_SIZE) + .d(COLUMN_8_2_D) + .build(), + TableColumn.builder() + .id(COLUMN_8_3_ID) + .ordinalPosition(COLUMN_8_3_ORDINALPOS) + .table(TABLE_8) + .name(COLUMN_8_3_NAME) + .internalName(COLUMN_8_3_INTERNAL_NAME) + .columnType(COLUMN_8_3_TYPE) + .isNullAllowed(COLUMN_8_3_NULL) + .autoGenerated(COLUMN_8_3_AUTO_GENERATED) .build()); public final static List<ColumnDto> TABLE_8_COLUMNS_DTO = List.of(ColumnDto.builder() @@ -2483,6 +2548,16 @@ public abstract class BaseTest { .columnType(COLUMN_8_2_TYPE_DTO) .isNullAllowed(COLUMN_8_2_NULL) .autoGenerated(COLUMN_8_2_AUTO_GENERATED) + .build(), + ColumnDto.builder() + .id(COLUMN_8_3_ID) + .ordinalPosition(COLUMN_8_3_ORDINALPOS) + .table(TABLE_8_DTO) + .name(COLUMN_8_3_NAME) + .internalName(COLUMN_8_3_INTERNAL_NAME) + .columnType(COLUMN_8_3_TYPE_DTO) + .isNullAllowed(COLUMN_8_3_NULL) + .autoGenerated(COLUMN_8_3_AUTO_GENERATED) .build()); public final static Long TABLE_8_DATA_COUNT = 6L; @@ -2492,12 +2567,36 @@ public abstract class BaseTest { put(COLUMN_8_2_INTERNAL_NAME, 1); }}))) .result(new LinkedList<>(List.of( - Map.of(COLUMN_8_1_INTERNAL_NAME, BigInteger.valueOf(1L), COLUMN_8_2_INTERNAL_NAME, 11.2), - Map.of(COLUMN_8_1_INTERNAL_NAME, BigInteger.valueOf(2L), COLUMN_8_2_INTERNAL_NAME, 11.3), - Map.of(COLUMN_8_1_INTERNAL_NAME, BigInteger.valueOf(3L), COLUMN_8_2_INTERNAL_NAME, 11.4), - Map.of(COLUMN_8_1_INTERNAL_NAME, BigInteger.valueOf(4L), COLUMN_8_2_INTERNAL_NAME, 11.9), - Map.of(COLUMN_8_1_INTERNAL_NAME, BigInteger.valueOf(5L), COLUMN_8_2_INTERNAL_NAME, 12.3), - Map.of(COLUMN_8_1_INTERNAL_NAME, BigInteger.valueOf(6L), COLUMN_8_2_INTERNAL_NAME, 23.1) + new HashMap<>() {{ + put(COLUMN_8_1_INTERNAL_NAME, BigInteger.valueOf(1L)); + put(COLUMN_8_2_INTERNAL_NAME, 11.2); + put(COLUMN_8_3_INTERNAL_NAME, null); + }}, + new HashMap<>() {{ + put(COLUMN_8_1_INTERNAL_NAME, BigInteger.valueOf(2L)); + put(COLUMN_8_2_INTERNAL_NAME, 11.3); + put(COLUMN_8_3_INTERNAL_NAME, null); + }}, + new HashMap<>() {{ + put(COLUMN_8_1_INTERNAL_NAME, BigInteger.valueOf(3L)); + put(COLUMN_8_2_INTERNAL_NAME, 11.4); + put(COLUMN_8_3_INTERNAL_NAME, null); + }}, + new HashMap<>() {{ + put(COLUMN_8_1_INTERNAL_NAME, BigInteger.valueOf(4L)); + put(COLUMN_8_2_INTERNAL_NAME, 11.9); + put(COLUMN_8_3_INTERNAL_NAME, null); + }}, + new HashMap<>() {{ + put(COLUMN_8_1_INTERNAL_NAME, BigInteger.valueOf(5L)); + put(COLUMN_8_2_INTERNAL_NAME, 12.3); + put(COLUMN_8_3_INTERNAL_NAME, null); + }}, + new HashMap<>() {{ + put(COLUMN_8_1_INTERNAL_NAME, BigInteger.valueOf(6L)); + put(COLUMN_8_2_INTERNAL_NAME, 23.1); + put(COLUMN_8_3_INTERNAL_NAME, null); + }} ))) .build(); @@ -2558,8 +2657,6 @@ public abstract class BaseTest { public final static Long QUERY_2_ID = 2L; public final static String QUERY_2_STATEMENT = "SELECT `location` FROM `weather_aus`"; public final static String QUERY_2_QUERY_HASH = "a2d2dd94ebc7653bb5a3b55dd8ed5e91d3d13c225c6855a1eb4eb7ca14c36ced"; - public final static Long QUERY_2_CONTAINER_ID = CONTAINER_2_ID; - public final static Long QUERY_2_DATABASE_ID = DATABASE_2_ID; public final static Long QUERY_2_RESULT_NUMBER = 2L; public final static String QUERY_2_RESULT_HASH = "ff3f7cbe1b96d296957f6e39e55b8b1b577fa3d205d4795af99594cfd20cb80d"; public final static Instant QUERY_2_CREATED = Instant.now().minus(2, MINUTES); @@ -2571,7 +2668,7 @@ public abstract class BaseTest { public final static QueryDto QUERY_2_DTO = QueryDto.builder() .id(QUERY_2_ID) - .databaseId(QUERY_2_DATABASE_ID) + .databaseId(DATABASE_2_ID) .query(QUERY_2_STATEMENT) .queryNormalized(QUERY_2_STATEMENT) .resultNumber(QUERY_2_RESULT_NUMBER) @@ -2737,8 +2834,6 @@ public abstract class BaseTest { public final static Long QUERY_6_ID = 6L; public final static String QUERY_6_STATEMENT = "SELECT `location` FROM `weather_aus` WHERE `id` = 1"; public final static String QUERY_6_QUERY_HASH = "6d6dc48b12cdfd959d39a62887334a6bbd529b93eed4f211f3f671bd9e7d6225"; - public final static Long QUERY_6_CONTAINER_ID = CONTAINER_2_ID; - public final static Long QUERY_6_DATABASE_ID = DATABASE_2_ID; public final static String QUERY_6_RESULT_HASH = "ff5f7cbe1b96d596957f6e59e55b8b1b577fa5d505d5795af99595cfd50cb80d"; public final static Instant QUERY_6_CREATED = Instant.now().minus(5, MINUTES); public final static Instant QUERY_6_EXECUTION = Instant.now().minus(1, MINUTES); @@ -2750,7 +2845,7 @@ public abstract class BaseTest { public final static QueryDto QUERY_6_DTO = QueryDto.builder() .id(QUERY_6_ID) - .databaseId(QUERY_6_DATABASE_ID) + .databaseId(DATABASE_2_ID) .query(QUERY_6_STATEMENT) .queryNormalized(QUERY_6_STATEMENT) .resultNumber(QUERY_6_RESULT_NUMBER) @@ -2771,8 +2866,18 @@ public abstract class BaseTest { .columnType(ColumnTypeDto.BIGINT) .build(); + public final static Long COLUMN_1_1_ID = 1L; + + public final static Long COLUMN_1_2_ID = 2L; + + public final static Long COLUMN_1_3_ID = 3L; + + public final static Long COLUMN_1_4_ID = 4L; + + public final static Long COLUMN_1_5_ID = 5L; + public final static List<TableColumn> TABLE_1_COLUMNS = List.of(TableColumn.builder() - .id(1L) + .id(COLUMN_1_1_ID) .ordinalPosition(0) .table(TABLE_1) .name("id") @@ -2782,7 +2887,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), TableColumn.builder() - .id(2L) + .id(COLUMN_1_2_ID) .ordinalPosition(1) .table(TABLE_1) .name("Date") @@ -2793,7 +2898,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), TableColumn.builder() - .id(3L) + .id(COLUMN_1_3_ID) .ordinalPosition(2) .table(TABLE_1) .name("Location") @@ -2804,7 +2909,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), TableColumn.builder() - .id(4L) + .id(COLUMN_1_4_ID) .ordinalPosition(3) .table(TABLE_1) .name("MinTemp") @@ -2816,7 +2921,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), TableColumn.builder() - .id(5L) + .id(COLUMN_1_5_ID) .ordinalPosition(4) .table(TABLE_1) .name("Rainfall") @@ -2876,6 +2981,13 @@ public abstract class BaseTest { .uniques(List.of(List.of("date"))) .build(); + public final static ConstraintsCreateDto TABLE_1_CONSTRAINTS_CREATE_INVALID_DTO = ConstraintsCreateDto.builder() + .checks(new LinkedHashSet<>()) + .primaryKey(new LinkedHashSet<>()) + .foreignKeys(new LinkedList<>()) + .uniques(List.of(List.of("date"))) + .build(); + public final static TableCreateDto TABLE_1_CREATE_DTO = TableCreateDto.builder() .name(TABLE_1_NAME) .description(TABLE_1_DESCRIPTION) @@ -2890,8 +3002,21 @@ public abstract class BaseTest { .constraints(TABLE_1_CONSTRAINTS_CREATE_DTO) .build(); + public final static at.tuwien.api.database.table.internal.TableCreateDto TABLE_1_CREATE_INTERNAL_INVALID_DTO = at.tuwien.api.database.table.internal.TableCreateDto.builder() + .name(TABLE_1_NAME) + .description(TABLE_1_DESCRIPTION) + .columns(TABLE_1_COLUMNS_CREATE_DTO) + .constraints(TABLE_1_CONSTRAINTS_CREATE_INVALID_DTO) + .build(); + + public final static Long COLUMN_2_1_ID = 6L; + + public final static Long COLUMN_2_2_ID = 7L; + + public final static Long COLUMN_2_3_ID = 8L; + public final static List<TableColumn> TABLE_2_COLUMNS = List.of(TableColumn.builder() - .id(6L) + .id(COLUMN_2_1_ID) .ordinalPosition(0) .table(TABLE_2) .name("location") @@ -2905,7 +3030,7 @@ public abstract class BaseTest { .sets(null) .build(), TableColumn.builder() - .id(7L) + .id(COLUMN_2_2_ID) .ordinalPosition(1) .table(TABLE_2) .name("lat") @@ -2920,7 +3045,7 @@ public abstract class BaseTest { .sets(null) .build(), TableColumn.builder() - .id(8L) + .id(COLUMN_2_3_ID) .ordinalPosition(2) .table(TABLE_2) .name("lng") @@ -2936,21 +3061,21 @@ public abstract class BaseTest { .build()); public final static ColumnBriefDto TABLE_2_COLUMNS_BRIEF_0_DTO = ColumnBriefDto.builder() - .id(6L) + .id(COLUMN_2_1_ID) .name("location") .internalName("location") .columnType(ColumnTypeDto.VARCHAR) .build(); public final static ColumnBriefDto TABLE_2_COLUMNS_BRIEF_2_DTO = ColumnBriefDto.builder() - .id(8L) + .id(COLUMN_2_3_ID) .name("lng") .internalName("lng") .columnType(ColumnTypeDto.DECIMAL) .build(); public final static List<ColumnDto> TABLE_2_COLUMNS_DTO = List.of(ColumnDto.builder() - .id(6L) + .id(COLUMN_2_1_ID) .table(TABLE_2_DTO) .tableId(TABLE_2_ID) .databaseId(DATABASE_1_ID) @@ -2965,7 +3090,7 @@ public abstract class BaseTest { .sets(null) .build(), ColumnDto.builder() - .id(7L) + .id(COLUMN_2_2_ID) .table(TABLE_2_DTO) .tableId(TABLE_2_ID) .databaseId(DATABASE_1_ID) @@ -2980,7 +3105,7 @@ public abstract class BaseTest { .sets(null) .build(), ColumnDto.builder() - .id(8L) + .id(COLUMN_2_3_ID) .table(TABLE_2_DTO) .tableId(TABLE_2_ID) .databaseId(DATABASE_1_ID) @@ -2995,15 +3120,85 @@ public abstract class BaseTest { .sets(null) .build()); + public final static Long COLUMN_3_1_ID = 9L; + + public final static Long COLUMN_3_2_ID = 10L; + + public final static Long COLUMN_3_3_ID = 11L; + + public final static Long COLUMN_3_4_ID = 12L; + + public final static Long COLUMN_3_5_ID = 13L; + + public final static Long COLUMN_3_6_ID = 14L; + + public final static Long COLUMN_3_7_ID = 15L; + + public final static Long COLUMN_3_8_ID = 16L; + + public final static Long COLUMN_3_9_ID = 17L; + + public final static Long COLUMN_3_10_ID = 18L; + + public final static Long COLUMN_3_11_ID = 19L; + + public final static Long COLUMN_3_12_ID = 20L; + + public final static Long COLUMN_3_13_ID = 21L; + + public final static Long COLUMN_3_14_ID = 22L; + + public final static Long COLUMN_3_15_ID = 23L; + + public final static Long COLUMN_3_16_ID = 24L; + + public final static Long COLUMN_3_17_ID = 25L; + + public final static Long COLUMN_3_18_ID = 26L; + + public final static Long COLUMN_3_19_ID = 27L; + + public final static Long COLUMN_3_20_ID = 28L; + + public final static Long COLUMN_3_21_ID = 29L; + + public final static Long COLUMN_3_22_ID = 30L; + + public final static Long COLUMN_3_23_ID = 31L; + + public final static Long COLUMN_3_24_ID = 32L; + + public final static Long COLUMN_3_25_ID = 33L; + + public final static Long COLUMN_3_26_ID = 34L; + + public final static Long COLUMN_3_27_ID = 35L; + + public final static Long COLUMN_3_28_ID = 36L; + + public final static Long COLUMN_3_29_ID = 37L; + + public final static Long COLUMN_3_30_ID = 38L; + + public final static Long COLUMN_3_31_ID = 39L; + + public final static Long COLUMN_3_32_ID = 40L; + + public final static Long COLUMN_3_33_ID = 41L; + + public final static Long COLUMN_3_34_ID = 42L; + + public final static Long COLUMN_3_35_ID = 43L; + public final static ColumnBriefDto TABLE_3_COLUMNS_BRIEF_0_DTO = ColumnBriefDto.builder() - .id(9L) + .id(COLUMN_3_1_ID) .columnType(ColumnTypeDto.BIGINT) .name("id") .internalName("id") .build(); public final static List<TableColumn> TABLE_3_COLUMNS = List.of(TableColumn.builder() - .id(9L) + .id(COLUMN_3_1_ID) .table(TABLE_3) .ordinalPosition(0) .autoGenerated(true) @@ -3016,7 +3211,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), TableColumn.builder() - .id(10L) + .id(COLUMN_3_2_ID) .table(TABLE_3) .ordinalPosition(1) .autoGenerated(false) @@ -3029,7 +3224,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), TableColumn.builder() - .id(11L) + .id(COLUMN_3_3_ID) .table(TABLE_3) .ordinalPosition(2) .autoGenerated(false) @@ -3042,7 +3237,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), TableColumn.builder() - .id(12L) + .id(COLUMN_3_4_ID) .table(TABLE_3) .ordinalPosition(3) .autoGenerated(false) @@ -3054,7 +3249,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), TableColumn.builder() - .id(13L) + .id(COLUMN_3_5_ID) .table(TABLE_3) .ordinalPosition(4) .autoGenerated(false) @@ -3067,7 +3262,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), TableColumn.builder() - .id(14L) + .id(COLUMN_3_6_ID) .table(TABLE_3) .ordinalPosition(5) .autoGenerated(false) @@ -3080,7 +3275,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), TableColumn.builder() - .id(15L) + .id(COLUMN_3_7_ID) .table(TABLE_3) .ordinalPosition(6) .autoGenerated(false) @@ -3093,7 +3288,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), TableColumn.builder() - .id(16L) + .id(COLUMN_3_8_ID) .table(TABLE_3) .ordinalPosition(7) .autoGenerated(false) @@ -3106,7 +3301,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), TableColumn.builder() - .id(17L) + .id(COLUMN_3_9_ID) .table(TABLE_3) .ordinalPosition(8) .autoGenerated(false) @@ -3119,7 +3314,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), TableColumn.builder() - .id(18L) + .id(COLUMN_3_10_ID) .table(TABLE_3) .ordinalPosition(9) .autoGenerated(false) @@ -3132,7 +3327,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), TableColumn.builder() - .id(19L) + .id(COLUMN_3_11_ID) .table(TABLE_3) .ordinalPosition(10) .autoGenerated(false) @@ -3144,7 +3339,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), TableColumn.builder() - .id(20L) + .id(COLUMN_3_12_ID) .table(TABLE_3) .ordinalPosition(11) .autoGenerated(false) @@ -3157,7 +3352,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), TableColumn.builder() - .id(21L) + .id(COLUMN_3_13_ID) .table(TABLE_3) .ordinalPosition(12) .autoGenerated(false) @@ -3170,7 +3365,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), TableColumn.builder() - .id(22L) + .id(COLUMN_3_14_ID) .table(TABLE_3) .ordinalPosition(13) .autoGenerated(false) @@ -3183,7 +3378,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), TableColumn.builder() - .id(23L) + .id(COLUMN_3_15_ID) .table(TABLE_3) .ordinalPosition(14) .autoGenerated(false) @@ -3196,7 +3391,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), TableColumn.builder() - .id(24L) + .id(COLUMN_3_16_ID) .table(TABLE_3) .ordinalPosition(15) .autoGenerated(false) @@ -3209,7 +3404,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), TableColumn.builder() - .id(25L) + .id(COLUMN_3_17_ID) .table(TABLE_3) .ordinalPosition(16) .autoGenerated(false) @@ -3222,7 +3417,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), TableColumn.builder() - .id(26L) + .id(COLUMN_3_18_ID) .table(TABLE_3) .ordinalPosition(17) .autoGenerated(false) @@ -3235,7 +3430,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), TableColumn.builder() - .id(27L) + .id(COLUMN_3_19_ID) .table(TABLE_3) .ordinalPosition(18) .autoGenerated(false) @@ -3248,7 +3443,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), TableColumn.builder() - .id(28L) + .id(COLUMN_3_20_ID) .table(TABLE_3) .ordinalPosition(19) .autoGenerated(false) @@ -3260,7 +3455,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), TableColumn.builder() - .id(29L) + .id(COLUMN_3_21_ID) .table(TABLE_3) .ordinalPosition(20) .autoGenerated(false) @@ -3273,7 +3468,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), TableColumn.builder() - .id(30L) + .id(COLUMN_3_22_ID) .table(TABLE_3) .ordinalPosition(21) .autoGenerated(false) @@ -3286,7 +3481,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), TableColumn.builder() - .id(31L) + .id(COLUMN_3_23_ID) .table(TABLE_3) .ordinalPosition(22) .autoGenerated(false) @@ -3299,7 +3494,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), TableColumn.builder() - .id(32L) + .id(COLUMN_3_24_ID) .table(TABLE_3) .ordinalPosition(23) .autoGenerated(false) @@ -3312,7 +3507,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), TableColumn.builder() - .id(33L) + .id(COLUMN_3_25_ID) .table(TABLE_3) .ordinalPosition(24) .autoGenerated(false) @@ -3325,7 +3520,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), TableColumn.builder() - .id(34L) + .id(COLUMN_3_26_ID) .table(TABLE_3) .ordinalPosition(25) .autoGenerated(false) @@ -3338,7 +3533,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), TableColumn.builder() - .id(35L) + .id(COLUMN_3_27_ID) .table(TABLE_3) .ordinalPosition(26) .autoGenerated(false) @@ -3351,7 +3546,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), TableColumn.builder() - .id(36L) + .id(COLUMN_3_28_ID) .table(TABLE_3) .ordinalPosition(27) .autoGenerated(false) @@ -3364,7 +3559,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), TableColumn.builder() - .id(37L) + .id(COLUMN_3_29_ID) .table(TABLE_3) .ordinalPosition(28) .autoGenerated(false) @@ -3377,7 +3572,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), TableColumn.builder() - .id(38L) + .id(COLUMN_3_30_ID) .table(TABLE_3) .ordinalPosition(29) .autoGenerated(false) @@ -3390,7 +3585,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), TableColumn.builder() - .id(39L) + .id(COLUMN_3_31_ID) .table(TABLE_3) .ordinalPosition(30) .autoGenerated(false) @@ -3403,7 +3598,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), TableColumn.builder() - .id(40L) + .id(COLUMN_3_32_ID) .table(TABLE_3) .ordinalPosition(31) .autoGenerated(false) @@ -3416,7 +3611,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), TableColumn.builder() - .id(41L) + .id(COLUMN_3_33_ID) .table(TABLE_3) .ordinalPosition(32) .autoGenerated(false) @@ -3429,7 +3624,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), TableColumn.builder() - .id(42L) + .id(COLUMN_3_34_ID) .table(TABLE_3) .ordinalPosition(33) .autoGenerated(false) @@ -3442,7 +3637,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), TableColumn.builder() - .id(43L) + .id(COLUMN_3_35_ID) .table(TABLE_3) .ordinalPosition(34) .autoGenerated(false) @@ -3456,7 +3651,7 @@ public abstract class BaseTest { .build()); public final static List<ColumnDto> TABLE_3_COLUMNS_DTO = List.of(ColumnDto.builder() - .id(9L) + .id(COLUMN_3_1_ID) .tableId(TABLE_3_ID) .table(TABLE_3_DTO) .databaseId(DATABASE_1_ID) @@ -3470,7 +3665,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), ColumnDto.builder() - .id(10L) + .id(COLUMN_3_2_ID) .tableId(TABLE_3_ID) .table(TABLE_3_DTO) .databaseId(DATABASE_1_ID) @@ -3484,7 +3679,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), ColumnDto.builder() - .id(11L) + .id(COLUMN_3_3_ID) .tableId(TABLE_3_ID) .table(TABLE_3_DTO) .databaseId(DATABASE_1_ID) @@ -3498,7 +3693,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), ColumnDto.builder() - .id(12L) + .id(COLUMN_3_4_ID) .tableId(TABLE_3_ID) .table(TABLE_3_DTO) .databaseId(DATABASE_1_ID) @@ -3512,7 +3707,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), ColumnDto.builder() - .id(13L) + .id(COLUMN_3_5_ID) .tableId(TABLE_3_ID) .table(TABLE_3_DTO) .databaseId(DATABASE_1_ID) @@ -3526,7 +3721,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), ColumnDto.builder() - .id(14L) + .id(COLUMN_3_6_ID) .tableId(TABLE_3_ID) .table(TABLE_3_DTO) .databaseId(DATABASE_1_ID) @@ -3540,7 +3735,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), ColumnDto.builder() - .id(15L) + .id(COLUMN_3_7_ID) .tableId(TABLE_3_ID) .table(TABLE_3_DTO) .databaseId(DATABASE_1_ID) @@ -3554,7 +3749,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), ColumnDto.builder() - .id(16L) + .id(COLUMN_3_8_ID) .tableId(TABLE_3_ID) .table(TABLE_3_DTO) .databaseId(DATABASE_1_ID) @@ -3568,7 +3763,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), ColumnDto.builder() - .id(17L) + .id(COLUMN_3_9_ID) .tableId(TABLE_3_ID) .table(TABLE_3_DTO) .databaseId(DATABASE_1_ID) @@ -3582,7 +3777,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), ColumnDto.builder() - .id(18L) + .id(COLUMN_3_10_ID) .tableId(TABLE_3_ID) .table(TABLE_3_DTO) .databaseId(DATABASE_1_ID) @@ -3596,7 +3791,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), ColumnDto.builder() - .id(19L) + .id(COLUMN_3_11_ID) .tableId(TABLE_3_ID) .table(TABLE_3_DTO) .databaseId(DATABASE_1_ID) @@ -3610,7 +3805,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), ColumnDto.builder() - .id(20L) + .id(COLUMN_3_12_ID) .tableId(TABLE_3_ID) .table(TABLE_3_DTO) .databaseId(DATABASE_1_ID) @@ -3624,7 +3819,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), ColumnDto.builder() - .id(21L) + .id(COLUMN_3_13_ID) .tableId(TABLE_3_ID) .table(TABLE_3_DTO) .databaseId(DATABASE_1_ID) @@ -3638,7 +3833,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), ColumnDto.builder() - .id(22L) + .id(COLUMN_3_14_ID) .tableId(TABLE_3_ID) .table(TABLE_3_DTO) .databaseId(DATABASE_1_ID) @@ -3652,7 +3847,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), ColumnDto.builder() - .id(23L) + .id(COLUMN_3_15_ID) .tableId(TABLE_3_ID) .table(TABLE_3_DTO) .databaseId(DATABASE_1_ID) @@ -3666,7 +3861,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), ColumnDto.builder() - .id(24L) + .id(COLUMN_3_16_ID) .tableId(TABLE_3_ID) .table(TABLE_3_DTO) .databaseId(DATABASE_1_ID) @@ -3680,7 +3875,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), ColumnDto.builder() - .id(25L) + .id(COLUMN_3_17_ID) .tableId(TABLE_3_ID) .table(TABLE_3_DTO) .databaseId(DATABASE_1_ID) @@ -3694,7 +3889,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), ColumnDto.builder() - .id(26L) + .id(COLUMN_3_18_ID) .tableId(TABLE_3_ID) .table(TABLE_3_DTO) .databaseId(DATABASE_1_ID) @@ -3708,7 +3903,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), ColumnDto.builder() - .id(27L) + .id(COLUMN_3_19_ID) .tableId(TABLE_3_ID) .table(TABLE_3_DTO) .databaseId(DATABASE_1_ID) @@ -3722,7 +3917,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), ColumnDto.builder() - .id(28L) + .id(COLUMN_3_20_ID) .tableId(TABLE_3_ID) .table(TABLE_3_DTO) .databaseId(DATABASE_1_ID) @@ -3736,7 +3931,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), ColumnDto.builder() - .id(29L) + .id(COLUMN_3_21_ID) .tableId(TABLE_3_ID) .table(TABLE_3_DTO) .databaseId(DATABASE_1_ID) @@ -3750,7 +3945,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), ColumnDto.builder() - .id(30L) + .id(COLUMN_3_22_ID) .tableId(TABLE_3_ID) .table(TABLE_3_DTO) .databaseId(DATABASE_1_ID) @@ -3764,7 +3959,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), ColumnDto.builder() - .id(31L) + .id(COLUMN_3_23_ID) .tableId(TABLE_3_ID) .table(TABLE_3_DTO) .databaseId(DATABASE_1_ID) @@ -3778,7 +3973,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), ColumnDto.builder() - .id(32L) + .id(COLUMN_3_24_ID) .tableId(TABLE_3_ID) .table(TABLE_3_DTO) .databaseId(DATABASE_1_ID) @@ -3792,7 +3987,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), ColumnDto.builder() - .id(33L) + .id(COLUMN_3_25_ID) .tableId(TABLE_3_ID) .table(TABLE_3_DTO) .databaseId(DATABASE_1_ID) @@ -3806,7 +4001,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), ColumnDto.builder() - .id(34L) + .id(COLUMN_3_26_ID) .tableId(TABLE_3_ID) .table(TABLE_3_DTO) .databaseId(DATABASE_1_ID) @@ -3820,7 +4015,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), ColumnDto.builder() - .id(35L) + .id(COLUMN_3_27_ID) .tableId(TABLE_3_ID) .table(TABLE_3_DTO) .databaseId(DATABASE_1_ID) @@ -3834,7 +4029,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), ColumnDto.builder() - .id(36L) + .id(COLUMN_3_28_ID) .tableId(TABLE_3_ID) .table(TABLE_3_DTO) .databaseId(DATABASE_1_ID) @@ -3848,7 +4043,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), ColumnDto.builder() - .id(37L) + .id(COLUMN_3_29_ID) .tableId(TABLE_3_ID) .table(TABLE_3_DTO) .databaseId(DATABASE_1_ID) @@ -3862,7 +4057,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), ColumnDto.builder() - .id(38L) + .id(COLUMN_3_30_ID) .tableId(TABLE_3_ID) .table(TABLE_3_DTO) .databaseId(DATABASE_1_ID) @@ -3876,7 +4071,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), ColumnDto.builder() - .id(39L) + .id(COLUMN_3_31_ID) .tableId(TABLE_3_ID) .table(TABLE_3_DTO) .databaseId(DATABASE_1_ID) @@ -3890,7 +4085,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), ColumnDto.builder() - .id(40L) + .id(COLUMN_3_32_ID) .tableId(TABLE_3_ID) .table(TABLE_3_DTO) .databaseId(DATABASE_1_ID) @@ -3904,7 +4099,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), ColumnDto.builder() - .id(41L) + .id(COLUMN_3_33_ID) .tableId(TABLE_3_ID) .table(TABLE_3_DTO) .databaseId(DATABASE_1_ID) @@ -3918,7 +4113,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), ColumnDto.builder() - .id(42L) + .id(COLUMN_3_34_ID) .tableId(TABLE_3_ID) .table(TABLE_3_DTO) .databaseId(DATABASE_1_ID) @@ -3932,7 +4127,7 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build(), ColumnDto.builder() - .id(43L) + .id(COLUMN_3_35_ID) .tableId(TABLE_3_ID) .table(TABLE_3_DTO) .databaseId(DATABASE_1_ID) @@ -3946,15 +4141,57 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build()); + public final static Long COLUMN_5_1_ID = 46L; + + public final static Long COLUMN_5_2_ID = 47L; + + public final static Long COLUMN_5_3_ID = 48L; + + public final static Long COLUMN_5_4_ID = 49L; + + public final static Long COLUMN_5_5_ID = 50L; + + public final static Long COLUMN_5_6_ID = 51L; + + public final static Long COLUMN_5_7_ID = 52L; + + public final static Long COLUMN_5_8_ID = 53L; + + public final static Long COLUMN_5_9_ID = 54L; + + public final static Long COLUMN_5_10_ID = 55L; + + public final static Long COLUMN_5_11_ID = 56L; + + public final static Long COLUMN_5_12_ID = 57L; + + public final static Long COLUMN_5_13_ID = 58L; + + public final static Long COLUMN_5_14_ID = 59L; + + public final static Long COLUMN_5_15_ID = 60L; + + public final static Long COLUMN_5_16_ID = 61L; + + public final static Long COLUMN_5_17_ID = 62L; + + public final static Long COLUMN_5_18_ID = 63L; + + public final static Long COLUMN_5_19_ID = 64L; + + public final static Long COLUMN_5_20_ID = 65L; + + public final static Long COLUMN_5_21_ID = 66L; + public final static ColumnBriefDto TABLE_5_COLUMNS_BRIEF_0_DTO = ColumnBriefDto.builder() - .id(45L) + .id(COLUMN_5_1_ID) .name("id") .internalName("id") .columnType(ColumnTypeDto.BIGINT) .build(); public final static List<TableColumn> TABLE_5_COLUMNS = List.of(TableColumn.builder() - .id(45L) + .id(COLUMN_5_1_ID) .ordinalPosition(0) .table(TABLE_5) .name("id") @@ -3964,7 +4201,7 @@ public abstract class BaseTest { .autoGenerated(true) .build(), TableColumn.builder() - .id(46L) + .id(COLUMN_5_2_ID) .ordinalPosition(1) .table(TABLE_5) .name("Animal Name") @@ -3974,7 +4211,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), TableColumn.builder() - .id(47L) + .id(COLUMN_5_3_ID) .ordinalPosition(2) .table(TABLE_5) .name("Hair") @@ -3984,7 +4221,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), TableColumn.builder() - .id(48L) + .id(COLUMN_5_4_ID) .ordinalPosition(3) .table(TABLE_5) .name("Feathers") @@ -3994,7 +4231,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), TableColumn.builder() - .id(49L) + .id(COLUMN_5_5_ID) .ordinalPosition(4) .table(TABLE_5) .name("Bread") @@ -4004,7 +4241,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), TableColumn.builder() - .id(50L) + .id(COLUMN_5_6_ID) .ordinalPosition(5) .table(TABLE_5) .name("Eggs") @@ -4014,7 +4251,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), TableColumn.builder() - .id(51L) + .id(COLUMN_5_7_ID) .ordinalPosition(6) .table(TABLE_5) .name("Milk") @@ -4024,7 +4261,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), TableColumn.builder() - .id(52L) + .id(COLUMN_5_8_ID) .ordinalPosition(7) .table(TABLE_5) .name("Water") @@ -4034,7 +4271,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), TableColumn.builder() - .id(53L) + .id(COLUMN_5_9_ID) .ordinalPosition(8) .table(TABLE_5) .name("Airborne") @@ -4044,7 +4281,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), TableColumn.builder() - .id(54L) + .id(COLUMN_5_10_ID) .ordinalPosition(9) .table(TABLE_5) .name("Waterborne") @@ -4054,7 +4291,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), TableColumn.builder() - .id(55L) + .id(COLUMN_5_11_ID) .ordinalPosition(10) .table(TABLE_5) .name("Aquantic") @@ -4064,7 +4301,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), TableColumn.builder() - .id(56L) + .id(COLUMN_5_12_ID) .ordinalPosition(11) .table(TABLE_5) .name("Predator") @@ -4074,7 +4311,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), TableColumn.builder() - .id(57L) + .id(COLUMN_5_13_ID) .ordinalPosition(12) .table(TABLE_5) .name("Backbone") @@ -4084,7 +4321,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), TableColumn.builder() - .id(58L) + .id(COLUMN_5_14_ID) .ordinalPosition(13) .table(TABLE_5) .name("Breathes") @@ -4094,7 +4331,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), TableColumn.builder() - .id(59L) + .id(COLUMN_5_15_ID) .ordinalPosition(14) .table(TABLE_5) .name("Venomous") @@ -4104,7 +4341,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), TableColumn.builder() - .id(60L) + .id(COLUMN_5_16_ID) .ordinalPosition(15) .table(TABLE_5) .name("Fin") @@ -4114,7 +4351,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), TableColumn.builder() - .id(61L) + .id(COLUMN_5_17_ID) .ordinalPosition(16) .table(TABLE_5) .name("Legs") @@ -4124,7 +4361,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), TableColumn.builder() - .id(62L) + .id(COLUMN_5_18_ID) .ordinalPosition(17) .table(TABLE_5) .name("Tail") @@ -4134,7 +4371,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), TableColumn.builder() - .id(63L) + .id(COLUMN_5_19_ID) .ordinalPosition(18) .table(TABLE_5) .name("Domestic") @@ -4144,7 +4381,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), TableColumn.builder() - .id(64L) + .id(COLUMN_5_20_ID) .ordinalPosition(19) .table(TABLE_5) .name("Catsize") @@ -4154,7 +4391,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), TableColumn.builder() - .id(65L) + .id(COLUMN_5_21_ID) .ordinalPosition(20) .table(TABLE_5) .name("Class Type") @@ -4165,7 +4402,7 @@ public abstract class BaseTest { .build()); public final static List<ColumnDto> TABLE_5_COLUMNS_DTO = List.of(ColumnDto.builder() - .id(45L) + .id(COLUMN_5_1_ID) .ordinalPosition(0) .tableId(TABLE_5_ID) .table(TABLE_5_DTO) @@ -4176,7 +4413,7 @@ public abstract class BaseTest { .autoGenerated(true) .build(), ColumnDto.builder() - .id(46L) + .id(COLUMN_5_2_ID) .ordinalPosition(1) .tableId(TABLE_5_ID) .table(TABLE_5_DTO) @@ -4187,7 +4424,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), ColumnDto.builder() - .id(47L) + .id(COLUMN_5_3_ID) .ordinalPosition(2) .tableId(TABLE_5_ID) .table(TABLE_5_DTO) @@ -4198,7 +4435,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), ColumnDto.builder() - .id(48L) + .id(COLUMN_5_4_ID) .ordinalPosition(3) .tableId(TABLE_5_ID) .table(TABLE_5_DTO) @@ -4209,7 +4446,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), ColumnDto.builder() - .id(49L) + .id(COLUMN_5_5_ID) .ordinalPosition(4) .tableId(TABLE_5_ID) .table(TABLE_5_DTO) @@ -4220,7 +4457,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), ColumnDto.builder() - .id(50L) + .id(COLUMN_5_6_ID) .ordinalPosition(5) .tableId(TABLE_5_ID) .table(TABLE_5_DTO) @@ -4231,7 +4468,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), ColumnDto.builder() - .id(51L) + .id(COLUMN_5_7_ID) .ordinalPosition(6) .tableId(TABLE_5_ID) .table(TABLE_5_DTO) @@ -4242,7 +4479,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), ColumnDto.builder() - .id(52L) + .id(COLUMN_5_8_ID) .ordinalPosition(7) .tableId(TABLE_5_ID) .table(TABLE_5_DTO) @@ -4253,7 +4490,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), ColumnDto.builder() - .id(53L) + .id(COLUMN_5_9_ID) .ordinalPosition(8) .tableId(TABLE_5_ID) .table(TABLE_5_DTO) @@ -4264,7 +4501,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), ColumnDto.builder() - .id(54L) + .id(COLUMN_5_10_ID) .ordinalPosition(9) .tableId(TABLE_5_ID) .table(TABLE_5_DTO) @@ -4275,7 +4512,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), ColumnDto.builder() - .id(55L) + .id(COLUMN_5_11_ID) .ordinalPosition(10) .tableId(TABLE_5_ID) .table(TABLE_5_DTO) @@ -4286,7 +4523,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), ColumnDto.builder() - .id(56L) + .id(COLUMN_5_12_ID) .ordinalPosition(11) .tableId(TABLE_5_ID) .table(TABLE_5_DTO) @@ -4297,7 +4534,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), ColumnDto.builder() - .id(57L) + .id(COLUMN_5_13_ID) .ordinalPosition(12) .tableId(TABLE_5_ID) .table(TABLE_5_DTO) @@ -4308,7 +4545,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), ColumnDto.builder() - .id(58L) + .id(COLUMN_5_14_ID) .ordinalPosition(13) .tableId(TABLE_5_ID) .table(TABLE_5_DTO) @@ -4319,7 +4556,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), ColumnDto.builder() - .id(59L) + .id(COLUMN_5_15_ID) .ordinalPosition(14) .tableId(TABLE_5_ID) .table(TABLE_5_DTO) @@ -4330,7 +4567,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), ColumnDto.builder() - .id(60L) + .id(COLUMN_5_16_ID) .ordinalPosition(15) .tableId(TABLE_5_ID) .table(TABLE_5_DTO) @@ -4341,7 +4578,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), ColumnDto.builder() - .id(61L) + .id(COLUMN_5_17_ID) .ordinalPosition(16) .tableId(TABLE_5_ID) .table(TABLE_5_DTO) @@ -4352,7 +4589,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), ColumnDto.builder() - .id(62L) + .id(COLUMN_5_18_ID) .ordinalPosition(17) .tableId(TABLE_5_ID) .table(TABLE_5_DTO) @@ -4363,7 +4600,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), ColumnDto.builder() - .id(63L) + .id(COLUMN_5_19_ID) .ordinalPosition(18) .tableId(TABLE_5_ID) .table(TABLE_5_DTO) @@ -4374,7 +4611,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), ColumnDto.builder() - .id(64L) + .id(COLUMN_5_20_ID) .ordinalPosition(19) .tableId(TABLE_5_ID) .table(TABLE_5_DTO) @@ -4385,7 +4622,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), ColumnDto.builder() - .id(65L) + .id(COLUMN_5_21_ID) .ordinalPosition(20) .tableId(TABLE_5_ID) .table(TABLE_5_DTO) @@ -4596,7 +4833,7 @@ public abstract class BaseTest { .build()); public final static ColumnBriefDto TABLE_6_COLUMNS_BRIEF_0_DTO = ColumnBriefDto.builder() - .id(66L) + .id(67L) .name("id") .internalName("id") .columnType(ColumnTypeDto.BIGINT) @@ -4708,22 +4945,26 @@ public abstract class BaseTest { .constraints(TABLE_6_CONSTRAINTS_CREATE) .build(); + public final static Long COLUMN_7_1_ID = 73L; + + public final static Long COLUMN_7_2_ID = 74L; + public final static ColumnBriefDto TABLE_7_COLUMNS_BRIEF_0_DTO = ColumnBriefDto.builder() - .id(26L) + .id(COLUMN_7_1_ID) .name("name_id") .internalName("name_id") .columnType(ColumnTypeDto.BIGINT) .build(); public final static ColumnBriefDto TABLE_7_COLUMNS_BRIEF_1_DTO = ColumnBriefDto.builder() - .id(27L) + .id(COLUMN_7_2_ID) .name("zoo_id") .internalName("zoo_id") .columnType(ColumnTypeDto.BIGINT) .build(); public final static List<TableColumn> TABLE_7_COLUMNS = List.of(TableColumn.builder() - .id(74L) + .id(COLUMN_7_1_ID) .ordinalPosition(0) .table(TABLE_7) .name("name_id") @@ -4733,7 +4974,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), TableColumn.builder() - .id(75L) + .id(COLUMN_7_2_ID) .ordinalPosition(1) .table(TABLE_7) .name("zoo_id") @@ -4744,7 +4985,7 @@ public abstract class BaseTest { .build()); public final static List<ColumnDto> TABLE_7_COLUMNS_DTO = List.of(ColumnDto.builder() - .id(74L) + .id(COLUMN_7_1_ID) .ordinalPosition(0) .tableId(TABLE_7_ID) .table(TABLE_7_DTO) @@ -4755,7 +4996,7 @@ public abstract class BaseTest { .autoGenerated(false) .build(), ColumnDto.builder() - .id(75L) + .id(COLUMN_7_2_ID) .ordinalPosition(1) .tableId(TABLE_7_ID) .table(TABLE_7_DTO) @@ -4809,8 +5050,7 @@ public abstract class BaseTest { .size(22L) .isNullAllowed(true) .autoGenerated(false) - .build() - ); + .build() ); public final static View VIEW_1 = View.builder() .id(VIEW_1_ID) @@ -5105,6 +5345,8 @@ public abstract class BaseTest { public final static String VIEW_3_QUERY = "select w.`mintemp`, w.`rainfall`, w.`location`, m.`date` from `weather_aus` w join `junit2` m on m.`location` = w.`location` and m.`date` = w.`date`"; public final static String VIEW_3_QUERY_HASH = "bbbaa56a5206b3dc3e6cf9301b0db9344eb6f19b100c7b88550ffb597a0bd255"; + public final static Long VIEW_3_DATA_COUNT = 3L; + public final static List<ViewColumnDto> VIEW_3_COLUMNS_DTO = List.of( ViewColumnDto.builder() .id(8L) @@ -7118,6 +7360,13 @@ public abstract class BaseTest { .user(USER_2) .build(); + public final static DatabaseAccessDto DATABASE_1_USER_2_READ_ACCESS_DTO = DatabaseAccessDto.builder() + .type(AccessTypeDto.READ) + .hdbid(DATABASE_1_ID) + .huserid(USER_2_ID) + .user(USER_2_DTO) + .build(); + public final static DatabaseAccess DATABASE_1_USER_2_WRITE_OWN_ACCESS = DatabaseAccess.builder() .type(AccessType.WRITE_OWN) .hdbid(DATABASE_1_ID) @@ -7141,6 +7390,13 @@ public abstract class BaseTest { .user(USER_2) .build(); + public final static DatabaseAccessDto DATABASE_1_USER_2_WRITE_ALL_ACCESS_DTO = DatabaseAccessDto.builder() + .type(AccessTypeDto.WRITE_ALL) + .hdbid(DATABASE_1_ID) + .huserid(USER_2_ID) + .user(USER_2_DTO) + .build(); + public final static DatabaseAccess DATABASE_1_USER_3_READ_ACCESS = DatabaseAccess.builder() .type(AccessType.READ) .hdbid(DATABASE_1_ID) diff --git a/dbrepo-search-service/Pipfile b/dbrepo-search-service/Pipfile index 8d6cc6b220d0e6df9219aeca9b7d1ec571c2fde6..260236a6ec0d2f08ba3929a45f875dd9cd449e5f 100644 --- a/dbrepo-search-service/Pipfile +++ b/dbrepo-search-service/Pipfile @@ -18,7 +18,7 @@ jwt = "~=1.3" testcontainers-opensearch = "*" pytest = "*" rdflib = "*" -dbrepo = {path = "./lib/dbrepo-1.4.5.tar.gz"} +dbrepo = {path = "./lib/dbrepo-1.4.6.tar.gz"} gunicorn = "*" [dev-packages] diff --git a/dbrepo-search-service/Pipfile.lock b/dbrepo-search-service/Pipfile.lock index 8e2e1abc463a4f98a575e8acfe76194e74bbca74..c8e647e9d94833b85f72bb2dbdf0c6ab2f84db00 100644 --- a/dbrepo-search-service/Pipfile.lock +++ b/dbrepo-search-service/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "f4b77f12b6e64d95ba5e3df0cce6f3eeb8d9cb8e45a6a17b46088d7077d13595" + "sha256": "8f7de86e8c15ccfa38b73d7deeec2c48afa5dd59f14a2d61432f5e79989b53cd" }, "pipfile-spec": 6, "requires": { @@ -16,87 +16,110 @@ ] }, "default": { + "aiohappyeyeballs": { + "hashes": [ + "sha256:55a1714f084e63d49639800f95716da97a1f173d46a16dfcfda0016abb93b6b2", + "sha256:7ce92076e249169a13c2f49320d1967425eaf1f407522d707d59cac7628d62bd" + ], + "markers": "python_version >= '3.8'", + "version": "==2.4.0" + }, "aiohttp": { "hashes": [ - "sha256:0605cc2c0088fcaae79f01c913a38611ad09ba68ff482402d3410bf59039bfb8", - "sha256:0a158704edf0abcac8ac371fbb54044f3270bdbc93e254a82b6c82be1ef08f3c", - "sha256:0cbf56238f4bbf49dab8c2dc2e6b1b68502b1e88d335bea59b3f5b9f4c001475", - "sha256:1732102949ff6087589408d76cd6dea656b93c896b011ecafff418c9661dc4ed", - "sha256:18f634d540dd099c262e9f887c8bbacc959847cfe5da7a0e2e1cf3f14dbf2daf", - "sha256:239f975589a944eeb1bad26b8b140a59a3a320067fb3cd10b75c3092405a1372", - "sha256:2faa61a904b83142747fc6a6d7ad8fccff898c849123030f8e75d5d967fd4a81", - "sha256:320e8618eda64e19d11bdb3bd04ccc0a816c17eaecb7e4945d01deee2a22f95f", - "sha256:38d80498e2e169bc61418ff36170e0aad0cd268da8b38a17c4cf29d254a8b3f1", - "sha256:3916c8692dbd9d55c523374a3b8213e628424d19116ac4308e434dbf6d95bbdd", - "sha256:393c7aba2b55559ef7ab791c94b44f7482a07bf7640d17b341b79081f5e5cd1a", - "sha256:3b7b30258348082826d274504fbc7c849959f1989d86c29bc355107accec6cfb", - "sha256:3fcb4046d2904378e3aeea1df51f697b0467f2aac55d232c87ba162709478c46", - "sha256:4109adee842b90671f1b689901b948f347325045c15f46b39797ae1bf17019de", - "sha256:4558e5012ee03d2638c681e156461d37b7a113fe13970d438d95d10173d25f78", - "sha256:45731330e754f5811c314901cebdf19dd776a44b31927fa4b4dbecab9e457b0c", - "sha256:4715a9b778f4293b9f8ae7a0a7cef9829f02ff8d6277a39d7f40565c737d3771", - "sha256:471f0ef53ccedec9995287f02caf0c068732f026455f07db3f01a46e49d76bbb", - "sha256:4d3ebb9e1316ec74277d19c5f482f98cc65a73ccd5430540d6d11682cd857430", - "sha256:4ff550491f5492ab5ed3533e76b8567f4b37bd2995e780a1f46bca2024223233", - "sha256:52c27110f3862a1afbcb2af4281fc9fdc40327fa286c4625dfee247c3ba90156", - "sha256:55b39c8684a46e56ef8c8d24faf02de4a2b2ac60d26cee93bc595651ff545de9", - "sha256:5a7ee16aab26e76add4afc45e8f8206c95d1d75540f1039b84a03c3b3800dd59", - "sha256:5ca51eadbd67045396bc92a4345d1790b7301c14d1848feaac1d6a6c9289e888", - "sha256:5d6b3f1fabe465e819aed2c421a6743d8debbde79b6a8600739300630a01bf2c", - "sha256:60cdbd56f4cad9f69c35eaac0fbbdf1f77b0ff9456cebd4902f3dd1cf096464c", - "sha256:6380c039ec52866c06d69b5c7aad5478b24ed11696f0e72f6b807cfb261453da", - "sha256:639d0042b7670222f33b0028de6b4e2fad6451462ce7df2af8aee37dcac55424", - "sha256:66331d00fb28dc90aa606d9a54304af76b335ae204d1836f65797d6fe27f1ca2", - "sha256:67c3119f5ddc7261d47163ed86d760ddf0e625cd6246b4ed852e82159617b5fb", - "sha256:694d828b5c41255e54bc2dddb51a9f5150b4eefa9886e38b52605a05d96566e8", - "sha256:6ae79c1bc12c34082d92bf9422764f799aee4746fd7a392db46b7fd357d4a17a", - "sha256:702e2c7c187c1a498a4e2b03155d52658fdd6fda882d3d7fbb891a5cf108bb10", - "sha256:714d4e5231fed4ba2762ed489b4aec07b2b9953cf4ee31e9871caac895a839c0", - "sha256:7b179eea70833c8dee51ec42f3b4097bd6370892fa93f510f76762105568cf09", - "sha256:7f64cbd44443e80094309875d4f9c71d0401e966d191c3d469cde4642bc2e031", - "sha256:82a6a97d9771cb48ae16979c3a3a9a18b600a8505b1115cfe354dfb2054468b4", - "sha256:84dabd95154f43a2ea80deffec9cb44d2e301e38a0c9d331cc4aa0166fe28ae3", - "sha256:8676e8fd73141ded15ea586de0b7cda1542960a7b9ad89b2b06428e97125d4fa", - "sha256:88e311d98cc0bf45b62fc46c66753a83445f5ab20038bcc1b8a1cc05666f428a", - "sha256:8b4f72fbb66279624bfe83fd5eb6aea0022dad8eec62b71e7bf63ee1caadeafe", - "sha256:8c64a6dc3fe5db7b1b4d2b5cb84c4f677768bdc340611eca673afb7cf416ef5a", - "sha256:8cf142aa6c1a751fcb364158fd710b8a9be874b81889c2bd13aa8893197455e2", - "sha256:8d1964eb7617907c792ca00b341b5ec3e01ae8c280825deadbbd678447b127e1", - "sha256:93e22add827447d2e26d67c9ac0161756007f152fdc5210277d00a85f6c92323", - "sha256:9c69e77370cce2d6df5d12b4e12bdcca60c47ba13d1cbbc8645dd005a20b738b", - "sha256:9dbc053ac75ccc63dc3a3cc547b98c7258ec35a215a92bd9f983e0aac95d3d5b", - "sha256:9e3a1ae66e3d0c17cf65c08968a5ee3180c5a95920ec2731f53343fac9bad106", - "sha256:a6ea1a5b409a85477fd8e5ee6ad8f0e40bf2844c270955e09360418cfd09abac", - "sha256:a81b1143d42b66ffc40a441379387076243ef7b51019204fd3ec36b9f69e77d6", - "sha256:ad7f2919d7dac062f24d6f5fe95d401597fbb015a25771f85e692d043c9d7832", - "sha256:afc52b8d969eff14e069a710057d15ab9ac17cd4b6753042c407dcea0e40bf75", - "sha256:b3df71da99c98534be076196791adca8819761f0bf6e08e07fd7da25127150d6", - "sha256:c088c4d70d21f8ca5c0b8b5403fe84a7bc8e024161febdd4ef04575ef35d474d", - "sha256:c26959ca7b75ff768e2776d8055bf9582a6267e24556bb7f7bd29e677932be72", - "sha256:c413016880e03e69d166efb5a1a95d40f83d5a3a648d16486592c49ffb76d0db", - "sha256:c6021d296318cb6f9414b48e6a439a7f5d1f665464da507e8ff640848ee2a58a", - "sha256:c671dc117c2c21a1ca10c116cfcd6e3e44da7fcde37bf83b2be485ab377b25da", - "sha256:c7a4b7a6cf5b6eb11e109a9755fd4fda7d57395f8c575e166d363b9fc3ec4678", - "sha256:c8a02fbeca6f63cb1f0475c799679057fc9268b77075ab7cf3f1c600e81dd46b", - "sha256:cd2adf5c87ff6d8b277814a28a535b59e20bfea40a101db6b3bdca7e9926bc24", - "sha256:d1469f228cd9ffddd396d9948b8c9cd8022b6d1bf1e40c6f25b0fb90b4f893ed", - "sha256:d153f652a687a8e95ad367a86a61e8d53d528b0530ef382ec5aaf533140ed00f", - "sha256:d5ab8e1f6bee051a4bf6195e38a5c13e5e161cb7bad83d8854524798bd9fcd6e", - "sha256:da00da442a0e31f1c69d26d224e1efd3a1ca5bcbf210978a2ca7426dfcae9f58", - "sha256:da22dab31d7180f8c3ac7c7635f3bcd53808f374f6aa333fe0b0b9e14b01f91a", - "sha256:e0ae53e33ee7476dd3d1132f932eeb39bf6125083820049d06edcdca4381f342", - "sha256:e7a6a8354f1b62e15d48e04350f13e726fa08b62c3d7b8401c0a1314f02e3558", - "sha256:e9a3d838441bebcf5cf442700e3963f58b5c33f015341f9ea86dcd7d503c07e2", - "sha256:edea7d15772ceeb29db4aff55e482d4bcfb6ae160ce144f2682de02f6d693551", - "sha256:f22eb3a6c1080d862befa0a89c380b4dafce29dc6cd56083f630073d102eb595", - "sha256:f26383adb94da5e7fb388d441bf09c61e5e35f455a3217bfd790c6b6bc64b2ee", - "sha256:f3c2890ca8c59ee683fd09adf32321a40fe1cf164e3387799efb2acebf090c11", - "sha256:f64fd07515dad67f24b6ea4a66ae2876c01031de91c93075b8093f07c0a2d93d", - "sha256:fcde4c397f673fdec23e6b05ebf8d4751314fa7c24f93334bf1f1364c1c69ac7", - "sha256:ff84aeb864e0fac81f676be9f4685f0527b660f1efdc40dcede3c251ef1e867f" + "sha256:02594361128f780eecc2a29939d9dfc870e17b45178a867bf61a11b2a4367277", + "sha256:03f2645adbe17f274444953bdea69f8327e9d278d961d85657cb0d06864814c1", + "sha256:074d1bff0163e107e97bd48cad9f928fa5a3eb4b9d33366137ffce08a63e37fe", + "sha256:0912b8a8fadeb32ff67a3ed44249448c20148397c1ed905d5dac185b4ca547bb", + "sha256:0d277cfb304118079e7044aad0b76685d30ecb86f83a0711fc5fb257ffe832ca", + "sha256:0d93400c18596b7dc4794d48a63fb361b01a0d8eb39f28800dc900c8fbdaca91", + "sha256:123dd5b16b75b2962d0fff566effb7a065e33cd4538c1692fb31c3bda2bfb972", + "sha256:17e997105bd1a260850272bfb50e2a328e029c941c2708170d9d978d5a30ad9a", + "sha256:18a01eba2574fb9edd5f6e5fb25f66e6ce061da5dab5db75e13fe1558142e0a3", + "sha256:1923a5c44061bffd5eebeef58cecf68096e35003907d8201a4d0d6f6e387ccaa", + "sha256:1942244f00baaacaa8155eca94dbd9e8cc7017deb69b75ef67c78e89fdad3c77", + "sha256:1b2c16a919d936ca87a3c5f0e43af12a89a3ce7ccbce59a2d6784caba945b68b", + "sha256:1c19de68896747a2aa6257ae4cf6ef59d73917a36a35ee9d0a6f48cff0f94db8", + "sha256:1e72589da4c90337837fdfe2026ae1952c0f4a6e793adbbfbdd40efed7c63599", + "sha256:22c0a23a3b3138a6bf76fc553789cb1a703836da86b0f306b6f0dc1617398abc", + "sha256:2c634a3207a5445be65536d38c13791904fda0748b9eabf908d3fe86a52941cf", + "sha256:2d21ac12dc943c68135ff858c3a989f2194a709e6e10b4c8977d7fcd67dfd511", + "sha256:2f1f1c75c395991ce9c94d3e4aa96e5c59c8356a15b1c9231e783865e2772699", + "sha256:305be5ff2081fa1d283a76113b8df7a14c10d75602a38d9f012935df20731487", + "sha256:33e6bc4bab477c772a541f76cd91e11ccb6d2efa2b8d7d7883591dfb523e5987", + "sha256:349ef8a73a7c5665cca65c88ab24abe75447e28aa3bc4c93ea5093474dfdf0ff", + "sha256:380f926b51b92d02a34119d072f178d80bbda334d1a7e10fa22d467a66e494db", + "sha256:38172a70005252b6893088c0f5e8a47d173df7cc2b2bd88650957eb84fcf5022", + "sha256:391cc3a9c1527e424c6865e087897e766a917f15dddb360174a70467572ac6ce", + "sha256:3a1c32a19ee6bbde02f1cb189e13a71b321256cc1d431196a9f824050b160d5a", + "sha256:4120d7fefa1e2d8fb6f650b11489710091788de554e2b6f8347c7a20ceb003f5", + "sha256:424ae21498790e12eb759040bbb504e5e280cab64693d14775c54269fd1d2bb7", + "sha256:44b324a6b8376a23e6ba25d368726ee3bc281e6ab306db80b5819999c737d820", + "sha256:4790f0e15f00058f7599dab2b206d3049d7ac464dc2e5eae0e93fa18aee9e7bf", + "sha256:4aff049b5e629ef9b3e9e617fa6e2dfeda1bf87e01bcfecaf3949af9e210105e", + "sha256:4b38b1570242fbab8d86a84128fb5b5234a2f70c2e32f3070143a6d94bc854cf", + "sha256:4d46c7b4173415d8e583045fbc4daa48b40e31b19ce595b8d92cf639396c15d5", + "sha256:4f1c9866ccf48a6df2b06823e6ae80573529f2af3a0992ec4fe75b1a510df8a6", + "sha256:4f7acae3cf1a2a2361ec4c8e787eaaa86a94171d2417aae53c0cca6ca3118ff6", + "sha256:54d9ddea424cd19d3ff6128601a4a4d23d54a421f9b4c0fff740505813739a91", + "sha256:58718e181c56a3c02d25b09d4115eb02aafe1a732ce5714ab70326d9776457c3", + "sha256:5ede29d91a40ba22ac1b922ef510aab871652f6c88ef60b9dcdf773c6d32ad7a", + "sha256:61645818edd40cc6f455b851277a21bf420ce347baa0b86eaa41d51ef58ba23d", + "sha256:66bf9234e08fe561dccd62083bf67400bdbf1c67ba9efdc3dac03650e97c6088", + "sha256:673f988370f5954df96cc31fd99c7312a3af0a97f09e407399f61583f30da9bc", + "sha256:676f94c5480d8eefd97c0c7e3953315e4d8c2b71f3b49539beb2aa676c58272f", + "sha256:6c225286f2b13bab5987425558baa5cbdb2bc925b2998038fa028245ef421e75", + "sha256:7384d0b87d4635ec38db9263e6a3f1eb609e2e06087f0aa7f63b76833737b471", + "sha256:7e2fe37ac654032db1f3499fe56e77190282534810e2a8e833141a021faaab0e", + "sha256:7f2bfc0032a00405d4af2ba27f3c429e851d04fad1e5ceee4080a1c570476697", + "sha256:7f6b639c36734eaa80a6c152a238242bedcee9b953f23bb887e9102976343092", + "sha256:814375093edae5f1cb31e3407997cf3eacefb9010f96df10d64829362ae2df69", + "sha256:8224f98be68a84b19f48e0bdc14224b5a71339aff3a27df69989fa47d01296f3", + "sha256:898715cf566ec2869d5cb4d5fb4be408964704c46c96b4be267442d265390f32", + "sha256:8989f46f3d7ef79585e98fa991e6ded55d2f48ae56d2c9fa5e491a6e4effb589", + "sha256:8ba01ebc6175e1e6b7275c907a3a36be48a2d487549b656aa90c8a910d9f3178", + "sha256:8c5c6fa16412b35999320f5c9690c0f554392dc222c04e559217e0f9ae244b92", + "sha256:8c6a4e5e40156d72a40241a25cc226051c0a8d816610097a8e8f517aeacd59a2", + "sha256:8eaf44ccbc4e35762683078b72bf293f476561d8b68ec8a64f98cf32811c323e", + "sha256:8fb4fc029e135859f533025bc82047334e24b0d489e75513144f25408ecaf058", + "sha256:9093a81e18c45227eebe4c16124ebf3e0d893830c6aca7cc310bfca8fe59d857", + "sha256:94c4381ffba9cc508b37d2e536b418d5ea9cfdc2848b9a7fea6aebad4ec6aac1", + "sha256:94fac7c6e77ccb1ca91e9eb4cb0ac0270b9fb9b289738654120ba8cebb1189c6", + "sha256:95c4dc6f61d610bc0ee1edc6f29d993f10febfe5b76bb470b486d90bbece6b22", + "sha256:975218eee0e6d24eb336d0328c768ebc5d617609affaca5dbbd6dd1984f16ed0", + "sha256:ad146dae5977c4dd435eb31373b3fe9b0b1bf26858c6fc452bf6af394067e10b", + "sha256:afe16a84498441d05e9189a15900640a2d2b5e76cf4efe8cbb088ab4f112ee57", + "sha256:b1c43eb1ab7cbf411b8e387dc169acb31f0ca0d8c09ba63f9eac67829585b44f", + "sha256:b90078989ef3fc45cf9221d3859acd1108af7560c52397ff4ace8ad7052a132e", + "sha256:b98e698dc34966e5976e10bbca6d26d6724e6bdea853c7c10162a3235aba6e16", + "sha256:ba5a8b74c2a8af7d862399cdedce1533642fa727def0b8c3e3e02fcb52dca1b1", + "sha256:c31ad0c0c507894e3eaa843415841995bf8de4d6b2d24c6e33099f4bc9fc0d4f", + "sha256:c3b9162bab7e42f21243effc822652dc5bb5e8ff42a4eb62fe7782bcbcdfacf6", + "sha256:c58c6837a2c2a7cf3133983e64173aec11f9c2cd8e87ec2fdc16ce727bcf1a04", + "sha256:c83f7a107abb89a227d6c454c613e7606c12a42b9a4ca9c5d7dad25d47c776ae", + "sha256:cde98f323d6bf161041e7627a5fd763f9fd829bcfcd089804a5fdce7bb6e1b7d", + "sha256:ce91db90dbf37bb6fa0997f26574107e1b9d5ff939315247b7e615baa8ec313b", + "sha256:d00f3c5e0d764a5c9aa5a62d99728c56d455310bcc288a79cab10157b3af426f", + "sha256:d17920f18e6ee090bdd3d0bfffd769d9f2cb4c8ffde3eb203777a3895c128862", + "sha256:d55f011da0a843c3d3df2c2cf4e537b8070a419f891c930245f05d329c4b0689", + "sha256:d742c36ed44f2798c8d3f4bc511f479b9ceef2b93f348671184139e7d708042c", + "sha256:d9a487ef090aea982d748b1b0d74fe7c3950b109df967630a20584f9a99c0683", + "sha256:d9ef084e3dc690ad50137cc05831c52b6ca428096e6deb3c43e95827f531d5ef", + "sha256:da452c2c322e9ce0cfef392e469a26d63d42860f829026a63374fde6b5c5876f", + "sha256:dc4826823121783dccc0871e3f405417ac116055bf184ac04c36f98b75aacd12", + "sha256:de7a5299827253023c55ea549444e058c0eb496931fa05d693b95140a947cb73", + "sha256:e04a1f2a65ad2f93aa20f9ff9f1b672bf912413e5547f60749fa2ef8a644e061", + "sha256:e1ca1ef5ba129718a8fc827b0867f6aa4e893c56eb00003b7367f8a733a9b072", + "sha256:ee40b40aa753d844162dcc80d0fe256b87cba48ca0054f64e68000453caead11", + "sha256:f071854b47d39591ce9a17981c46790acb30518e2f83dfca8db2dfa091178691", + "sha256:f29930bc2921cef955ba39a3ff87d2c4398a0394ae217f41cb02d5c26c8b1b77", + "sha256:f489a2c9e6455d87eabf907ac0b7d230a9786be43fbe884ad184ddf9e9c1e385", + "sha256:f5bf3ead3cb66ab990ee2561373b009db5bc0e857549b6c9ba84b20bc462e172", + "sha256:f6f18898ace4bcd2d41a122916475344a87f1dfdec626ecde9ee802a711bc569", + "sha256:f8112fb501b1e0567a1251a2fd0747baae60a4ab325a871e975b7bb67e59221f", + "sha256:fd31f176429cecbc1ba499d4aba31aaccfea488f418d60376b911269d3b883c5" ], "markers": "python_version >= '3.8'", - "version": "==3.9.5" + "version": "==3.10.5" }, "aiosignal": { "hashes": [ @@ -116,11 +139,11 @@ }, "attrs": { "hashes": [ - "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", - "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1" + "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346", + "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2" ], "markers": "python_version >= '3.7'", - "version": "==23.2.0" + "version": "==24.2.0" }, "blinker": { "hashes": [ @@ -132,69 +155,84 @@ }, "certifi": { "hashes": [ - "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516", - "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56" + "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", + "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9" ], "markers": "python_version >= '3.6'", - "version": "==2024.6.2" + "version": "==2024.8.30" }, "cffi": { "hashes": [ - "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc", - "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a", - "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417", - "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab", - "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520", - "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36", - "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743", - "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8", - "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed", - "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684", - "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56", - "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324", - "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d", - "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235", - "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e", - "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088", - "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000", - "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7", - "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e", - "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673", - "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c", - "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe", - "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2", - "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098", - "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8", - "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a", - "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0", - "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b", - "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896", - "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e", - "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9", - "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2", - "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b", - "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6", - "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404", - "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f", - "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0", - "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4", - "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc", - "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936", - "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba", - "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872", - "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb", - "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614", - "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1", - "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d", - "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969", - "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b", - "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4", - "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627", - "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956", - "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357" + "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", + "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", + "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1", + "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", + "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", + "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", + "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8", + "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36", + "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17", + "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", + "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc", + "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", + "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", + "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", + "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", + "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", + "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", + "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6", + "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", + "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b", + "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", + "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", + "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c", + "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", + "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", + "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", + "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8", + "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1", + "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", + "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", + "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", + "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595", + "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0", + "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", + "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", + "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", + "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", + "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", + "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", + "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16", + "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", + "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e", + "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", + "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964", + "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", + "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576", + "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", + "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3", + "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662", + "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", + "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", + "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", + "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", + "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", + "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", + "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", + "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", + "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9", + "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7", + "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", + "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a", + "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", + "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", + "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", + "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", + "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87", + "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b" ], "markers": "platform_python_implementation != 'PyPy'", - "version": "==1.16.0" + "version": "==1.17.1" }, "charset-normalizer": { "hashes": [ @@ -302,50 +340,43 @@ }, "cryptography": { "hashes": [ - "sha256:013629ae70b40af70c9a7a5db40abe5d9054e6f4380e50ce769947b73bf3caad", - "sha256:2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583", - "sha256:2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b", - "sha256:2f88d197e66c65be5e42cd72e5c18afbfae3f741742070e3019ac8f4ac57262c", - "sha256:31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1", - "sha256:343728aac38decfdeecf55ecab3264b015be68fc2816ca800db649607aeee648", - "sha256:5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949", - "sha256:57080dee41209e556a9a4ce60d229244f7a66ef52750f813bfbe18959770cfba", - "sha256:5a94eccb2a81a309806027e1670a358b99b8fe8bfe9f8d329f27d72c094dde8c", - "sha256:6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9", - "sha256:7016f837e15b0a1c119d27ecd89b3515f01f90a8615ed5e9427e30d9cdbfed3d", - "sha256:81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c", - "sha256:81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e", - "sha256:8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2", - "sha256:961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d", - "sha256:9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7", - "sha256:a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70", - "sha256:a0c5b2b0585b6af82d7e385f55a8bc568abff8923af147ee3c07bd8b42cda8b2", - "sha256:ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7", - "sha256:b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14", - "sha256:ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe", - "sha256:c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e", - "sha256:c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71", - "sha256:cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961", - "sha256:d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7", - "sha256:dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c", - "sha256:dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28", - "sha256:dec9b018df185f08483f294cae6ccac29e7a6e0678996587363dc352dc65c842", - "sha256:e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902", - "sha256:e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801", - "sha256:fa76fbb7596cc5839320000cdd5d0955313696d9511debab7ee7278fc8b5c84a", - "sha256:fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e" + "sha256:014f58110f53237ace6a408b5beb6c427b64e084eb451ef25a28308270086494", + "sha256:1bbcce1a551e262dfbafb6e6252f1ae36a248e615ca44ba302df077a846a8806", + "sha256:203e92a75716d8cfb491dc47c79e17d0d9207ccffcbcb35f598fbe463ae3444d", + "sha256:27e613d7077ac613e399270253259d9d53872aaf657471473ebfc9a52935c062", + "sha256:2bd51274dcd59f09dd952afb696bf9c61a7a49dfc764c04dd33ef7a6b502a1e2", + "sha256:38926c50cff6f533f8a2dae3d7f19541432610d114a70808f0926d5aaa7121e4", + "sha256:511f4273808ab590912a93ddb4e3914dfd8a388fed883361b02dea3791f292e1", + "sha256:58d4e9129985185a06d849aa6df265bdd5a74ca6e1b736a77959b498e0505b85", + "sha256:5b43d1ea6b378b54a1dc99dd8a2b5be47658fe9a7ce0a58ff0b55f4b43ef2b84", + "sha256:61ec41068b7b74268fa86e3e9e12b9f0c21fcf65434571dbb13d954bceb08042", + "sha256:666ae11966643886c2987b3b721899d250855718d6d9ce41b521252a17985f4d", + "sha256:68aaecc4178e90719e95298515979814bda0cbada1256a4485414860bd7ab962", + "sha256:7c05650fe8023c5ed0d46793d4b7d7e6cd9c04e68eabe5b0aeea836e37bdcec2", + "sha256:80eda8b3e173f0f247f711eef62be51b599b5d425c429b5d4ca6a05e9e856baa", + "sha256:8385d98f6a3bf8bb2d65a73e17ed87a3ba84f6991c155691c51112075f9ffc5d", + "sha256:88cce104c36870d70c49c7c8fd22885875d950d9ee6ab54df2745f83ba0dc365", + "sha256:9d3cdb25fa98afdd3d0892d132b8d7139e2c087da1712041f6b762e4f807cc96", + "sha256:a575913fb06e05e6b4b814d7f7468c2c660e8bb16d8d5a1faf9b33ccc569dd47", + "sha256:ac119bb76b9faa00f48128b7f5679e1d8d437365c5d26f1c2c3f0da4ce1b553d", + "sha256:c1332724be35d23a854994ff0b66530119500b6053d0bd3363265f7e5e77288d", + "sha256:d03a475165f3134f773d1388aeb19c2d25ba88b6a9733c5c590b9ff7bbfa2e0c", + "sha256:d75601ad10b059ec832e78823b348bfa1a59f6b8d545db3a24fd44362a1564cb", + "sha256:de41fd81a41e53267cb020bb3a7212861da53a7d39f863585d13ea11049cf277", + "sha256:e710bf40870f4db63c3d7d929aa9e09e4e7ee219e703f949ec4073b4294f6172", + "sha256:ea25acb556320250756e53f9e20a4177515f012c9eaea17eb7587a8c4d8ae034", + "sha256:f98bf604c82c416bc829e490c700ca1553eafdf2912a91e23a79d97d9801372a", + "sha256:fba1007b3ef89946dbbb515aeeb41e30203b004f0b4b00e5e16078b518563289" ], "markers": "python_version >= '3.7'", - "version": "==42.0.8" + "version": "==43.0.1" }, "dbrepo": { "hashes": [ - "sha256:09a10584a44c952a7cf83852123c14bd2917ab009e50698c1f9d8c2690ec4bde", - "sha256:2bdb48c70b4c99b5044fbfc12aa653c1e9281ca8913a433cc08a1e14cb4bd2ef", - "sha256:dccfaec20a3972a578313206678a119db3d6f898604aab4b694aa2ac37a20629" + "sha256:b0e92f1a6130cd00924b3011c0e9029b292ee7c8faea3eca20f8af5ea9531c1b" ], - "path": "./lib/dbrepo-1.4.5.tar.gz", - "version": "==1.4.5" + "markers": "python_version >= '3.11'", + "path": "./lib/dbrepo-1.4.6.tar.gz" }, "docker": { "hashes": [ @@ -374,15 +405,16 @@ "sha256:f69fcd559dc907ed196ab9df0e48471709175e696d6e698dd4dbe940f96ce66b" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==2.3.3" }, "flask-cors": { "hashes": [ - "sha256:eeb69b342142fdbf4766ad99357a7f3876a2ceb77689dc10ff912aac06c389e4", - "sha256:f2a704e4458665580c074b714c4627dd5a306b333deb9074d0b1794dfa2fb677" + "sha256:38364faf1a7a5d0a55bd1d2e2f83ee9e359039182f5e6a029557e1f56d92c09a", + "sha256:493b98e2d1e2f1a4720a7af25693ef2fe32fbafec09a2f72c59f3e475eda61d2" ], "index": "pypi", - "version": "==4.0.1" + "version": "==4.0.2" }, "flask-httpauth": { "hashes": [ @@ -398,6 +430,7 @@ "sha256:9215d05a9413d3855764bcd67035e75819d23af2fafb6b55197eb5a3313fdfb2" ], "index": "pypi", + "markers": "python_version >= '3.7' and python_version < '4'", "version": "==4.6.0" }, "flask-sqlalchemy": { @@ -406,6 +439,7 @@ "sha256:e4b68bb881802dda1a7d878b2fc84c06d1ee57fb40b874d3dc97dabfa36b8312" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==3.1.1" }, "frozenlist": { @@ -493,83 +527,92 @@ }, "greenlet": { "hashes": [ - "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67", - "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6", - "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257", - "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4", - "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676", - "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61", - "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc", - "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca", - "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7", - "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728", - "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305", - "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6", - "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379", - "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414", - "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04", - "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a", - "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf", - "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491", - "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559", - "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e", - "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274", - "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb", - "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b", - "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9", - "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b", - "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be", - "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506", - "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405", - "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113", - "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f", - "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5", - "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230", - "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d", - "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f", - "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a", - "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e", - "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61", - "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6", - "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d", - "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71", - "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22", - "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2", - "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3", - "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067", - "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc", - "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881", - "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3", - "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e", - "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac", - "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53", - "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0", - "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b", - "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83", - "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41", - "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c", - "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf", - "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da", - "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33" + "sha256:01059afb9b178606b4b6e92c3e710ea1635597c3537e44da69f4531e111dd5e9", + "sha256:037d9ac99540ace9424cb9ea89f0accfaff4316f149520b4ae293eebc5bded17", + "sha256:0e49a65d25d7350cca2da15aac31b6f67a43d867448babf997fe83c7505f57bc", + "sha256:13ff8c8e54a10472ce3b2a2da007f915175192f18e6495bad50486e87c7f6637", + "sha256:1544b8dd090b494c55e60c4ff46e238be44fdc472d2589e943c241e0169bcea2", + "sha256:184258372ae9e1e9bddce6f187967f2e08ecd16906557c4320e3ba88a93438c3", + "sha256:1ddc7bcedeb47187be74208bc652d63d6b20cb24f4e596bd356092d8000da6d6", + "sha256:221169d31cada333a0c7fd087b957c8f431c1dba202c3a58cf5a3583ed973e9b", + "sha256:243a223c96a4246f8a30ea470c440fe9db1f5e444941ee3c3cd79df119b8eebf", + "sha256:24fc216ec7c8be9becba8b64a98a78f9cd057fd2dc75ae952ca94ed8a893bf27", + "sha256:2651dfb006f391bcb240635079a68a261b227a10a08af6349cba834a2141efa1", + "sha256:26811df4dc81271033a7836bc20d12cd30938e6bd2e9437f56fa03da81b0f8fc", + "sha256:26d9c1c4f1748ccac0bae1dbb465fb1a795a75aba8af8ca871503019f4285e2a", + "sha256:28fe80a3eb673b2d5cc3b12eea468a5e5f4603c26aa34d88bf61bba82ceb2f9b", + "sha256:2cd8518eade968bc52262d8c46727cfc0826ff4d552cf0430b8d65aaf50bb91d", + "sha256:2d004db911ed7b6218ec5c5bfe4cf70ae8aa2223dffbb5b3c69e342bb253cb28", + "sha256:3d07c28b85b350564bdff9f51c1c5007dfb2f389385d1bc23288de51134ca303", + "sha256:3e7e6ef1737a819819b1163116ad4b48d06cfdd40352d813bb14436024fcda99", + "sha256:44151d7b81b9391ed759a2f2865bbe623ef00d648fed59363be2bbbd5154656f", + "sha256:44cd313629ded43bb3b98737bba2f3e2c2c8679b55ea29ed73daea6b755fe8e7", + "sha256:4a3dae7492d16e85ea6045fd11cb8e782b63eac8c8d520c3a92c02ac4573b0a6", + "sha256:4b5ea3664eed571779403858d7cd0a9b0ebf50d57d2cdeafc7748e09ef8cd81a", + "sha256:4c3446937be153718250fe421da548f973124189f18fe4575a0510b5c928f0cc", + "sha256:5415b9494ff6240b09af06b91a375731febe0090218e2898d2b85f9b92abcda0", + "sha256:5fd6e94593f6f9714dbad1aaba734b5ec04593374fa6638df61592055868f8b8", + "sha256:619935a44f414274a2c08c9e74611965650b730eb4efe4b2270f91df5e4adf9a", + "sha256:655b21ffd37a96b1e78cc48bf254f5ea4b5b85efaf9e9e2a526b3c9309d660ca", + "sha256:665b21e95bc0fce5cab03b2e1d90ba9c66c510f1bb5fdc864f3a377d0f553f6b", + "sha256:6a4bf607f690f7987ab3291406e012cd8591a4f77aa54f29b890f9c331e84989", + "sha256:6cea1cca3be76c9483282dc7760ea1cc08a6ecec1f0b6ca0a94ea0d17432da19", + "sha256:713d450cf8e61854de9420fb7eea8ad228df4e27e7d4ed465de98c955d2b3fa6", + "sha256:726377bd60081172685c0ff46afbc600d064f01053190e4450857483c4d44484", + "sha256:76b3e3976d2a452cba7aa9e453498ac72240d43030fdc6d538a72b87eaff52fd", + "sha256:76dc19e660baea5c38e949455c1181bc018893f25372d10ffe24b3ed7341fb25", + "sha256:76e5064fd8e94c3f74d9fd69b02d99e3cdb8fc286ed49a1f10b256e59d0d3a0b", + "sha256:7f346d24d74c00b6730440f5eb8ec3fe5774ca8d1c9574e8e57c8671bb51b910", + "sha256:81eeec4403a7d7684b5812a8aaa626fa23b7d0848edb3a28d2eb3220daddcbd0", + "sha256:90b5bbf05fe3d3ef697103850c2ce3374558f6fe40fd57c9fac1bf14903f50a5", + "sha256:9730929375021ec90f6447bff4f7f5508faef1c02f399a1953870cdb78e0c345", + "sha256:9eb4a1d7399b9f3c7ac68ae6baa6be5f9195d1d08c9ddc45ad559aa6b556bce6", + "sha256:a0409bc18a9f85321399c29baf93545152d74a49d92f2f55302f122007cfda00", + "sha256:a22f4e26400f7f48faef2d69c20dc055a1f3043d330923f9abe08ea0aecc44df", + "sha256:a53dfe8f82b715319e9953330fa5c8708b610d48b5c59f1316337302af5c0811", + "sha256:a771dc64fa44ebe58d65768d869fcfb9060169d203446c1d446e844b62bdfdca", + "sha256:a814dc3100e8a046ff48faeaa909e80cdb358411a3d6dd5293158425c684eda8", + "sha256:a8870983af660798dc1b529e1fd6f1cefd94e45135a32e58bd70edd694540f33", + "sha256:ac0adfdb3a21dc2a24ed728b61e72440d297d0fd3a577389df566651fcd08f97", + "sha256:b395121e9bbe8d02a750886f108d540abe66075e61e22f7353d9acb0b81be0f0", + "sha256:b9505a0c8579899057cbefd4ec34d865ab99852baf1ff33a9481eb3924e2da0b", + "sha256:c0a5b1c22c82831f56f2f7ad9bbe4948879762fe0d59833a4a71f16e5fa0f682", + "sha256:c3967dcc1cd2ea61b08b0b276659242cbce5caca39e7cbc02408222fb9e6ff39", + "sha256:c6f4c2027689093775fd58ca2388d58789009116844432d920e9147f91acbe64", + "sha256:c9d86401550b09a55410f32ceb5fe7efcd998bd2dad9e82521713cb148a4a15f", + "sha256:cd468ec62257bb4544989402b19d795d2305eccb06cde5da0eb739b63dc04665", + "sha256:cfcfb73aed40f550a57ea904629bdaf2e562c68fa1164fa4588e752af6efdc3f", + "sha256:d0dd943282231480aad5f50f89bdf26690c995e8ff555f26d8a5b9887b559bcc", + "sha256:d3c59a06c2c28a81a026ff11fbf012081ea34fb9b7052f2ed0366e14896f0a1d", + "sha256:d45b75b0f3fd8d99f62eb7908cfa6d727b7ed190737dec7fe46d993da550b81a", + "sha256:d46d5069e2eeda111d6f71970e341f4bd9aeeee92074e649ae263b834286ecc0", + "sha256:d58ec349e0c2c0bc6669bf2cd4982d2f93bf067860d23a0ea1fe677b0f0b1e09", + "sha256:db1b3ccb93488328c74e97ff888604a8b95ae4f35f4f56677ca57a4fc3a4220b", + "sha256:dd65695a8df1233309b701dec2539cc4b11e97d4fcc0f4185b4a12ce54db0491", + "sha256:f9482c2ed414781c0af0b35d9d575226da6b728bd1a720668fa05837184965b7", + "sha256:f9671e7282d8c6fcabc32c0fb8d7c0ea8894ae85cee89c9aadc2d7129e1a9954", + "sha256:fad7a051e07f64e297e6e8399b4d6a3bdcad3d7297409e9a06ef8cbccff4f501", + "sha256:ffb08f2a1e59d38c7b8b9ac8083c9c8b9875f0955b1e9b9b9a965607a51f8e54" ], "markers": "python_version < '3.13' and platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32')))))", - "version": "==3.0.3" + "version": "==3.1.0" }, "gunicorn": { "hashes": [ - "sha256:350679f91b24062c86e386e198a15438d53a7a8207235a78ba1b53df4c4378d9", - "sha256:4a0b436239ff76fb33f11c07a16482c521a7e09c1ce3cc293c2330afe01bec63" + "sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d", + "sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec" ], "index": "pypi", - "version": "==22.0.0" + "markers": "python_version >= '3.7'", + "version": "==23.0.0" }, "idna": { "hashes": [ - "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", - "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0" + "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac", + "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603" ], - "markers": "python_version >= '3.5'", - "version": "==3.7" + "markers": "python_version >= '3.6'", + "version": "==3.8" }, "iniconfig": { "hashes": [ @@ -604,11 +647,11 @@ }, "jsonschema": { "hashes": [ - "sha256:5b22d434a45935119af990552c862e5d6d564e8f6601206b305a61fdf661a2b7", - "sha256:ff4cfd6b1367a40e7bc6411caec72effadd3db0bbe5017de188f2d6108335802" + "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4", + "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566" ], "markers": "python_version >= '3.8'", - "version": "==4.22.0" + "version": "==4.23.0" }, "jsonschema-specifications": { "hashes": [ @@ -623,6 +666,7 @@ "sha256:61c9170f92e736b530655e75374681d4fcca9cfa8763ab42be57353b2b203494" ], "index": "pypi", + "markers": "python_version >= '3.6'", "version": "==1.3.1" }, "markupsafe": { @@ -701,158 +745,169 @@ }, "multidict": { "hashes": [ - "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556", - "sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c", - "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29", - "sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b", - "sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8", - "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7", - "sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd", - "sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40", - "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6", - "sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3", - "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c", - "sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9", - "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5", - "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae", - "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442", - "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9", - "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc", - "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c", - "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea", - "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5", - "sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50", - "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182", - "sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453", - "sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e", - "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600", - "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733", - "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda", - "sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241", - "sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461", - "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e", - "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e", - "sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b", - "sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e", - "sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7", - "sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386", - "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd", - "sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9", - "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf", - "sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee", - "sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5", - "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a", - "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271", - "sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54", - "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4", - "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496", - "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb", - "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319", - "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3", - "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f", - "sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527", - "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed", - "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604", - "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef", - "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8", - "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5", - "sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5", - "sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626", - "sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c", - "sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d", - "sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c", - "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc", - "sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc", - "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b", - "sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38", - "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450", - "sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1", - "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f", - "sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3", - "sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755", - "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226", - "sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a", - "sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046", - "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf", - "sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479", - "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e", - "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1", - "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a", - "sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83", - "sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929", - "sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93", - "sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a", - "sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c", - "sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44", - "sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89", - "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba", - "sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e", - "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da", - "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24", - "sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423", - "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef" + "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f", + "sha256:06809f4f0f7ab7ea2cabf9caca7d79c22c0758b58a71f9d32943ae13c7ace056", + "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761", + "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3", + "sha256:0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b", + "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6", + "sha256:10524ebd769727ac77ef2278390fb0068d83f3acb7773792a5080f2b0abf7748", + "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966", + "sha256:16e5f4bf4e603eb1fdd5d8180f1a25f30056f22e55ce51fb3d6ad4ab29f7d96f", + "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1", + "sha256:189f652a87e876098bbc67b4da1049afb5f5dfbaa310dd67c594b01c10388db6", + "sha256:1ca0083e80e791cffc6efce7660ad24af66c8d4079d2a750b29001b53ff59ada", + "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305", + "sha256:2090f6a85cafc5b2db085124d752757c9d251548cedabe9bd31afe6363e0aff2", + "sha256:20b9b5fbe0b88d0bdef2012ef7dee867f874b72528cf1d08f1d59b0e3850129d", + "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a", + "sha256:22f3105d4fb15c8f57ff3959a58fcab6ce36814486500cd7485651230ad4d4ef", + "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c", + "sha256:27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb", + "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60", + "sha256:3702ea6872c5a2a4eeefa6ffd36b042e9773f05b1f37ae3ef7264b1163c2dcf6", + "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4", + "sha256:3914f5aaa0f36d5d60e8ece6a308ee1c9784cd75ec8151062614657a114c4478", + "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81", + "sha256:3c8b88a2ccf5493b6c8da9076fb151ba106960a2df90c2633f342f120751a9e7", + "sha256:3e97b5e938051226dc025ec80980c285b053ffb1e25a3db2a3aa3bc046bf7f56", + "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3", + "sha256:3efe2c2cb5763f2f1b275ad2bf7a287d3f7ebbef35648a9726e3b69284a4f3d6", + "sha256:483a6aea59cb89904e1ceabd2b47368b5600fb7de78a6e4a2c2987b2d256cf30", + "sha256:4867cafcbc6585e4b678876c489b9273b13e9fff9f6d6d66add5e15d11d926cb", + "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506", + "sha256:4a9cb68166a34117d6646c0023c7b759bf197bee5ad4272f420a0141d7eb03a0", + "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925", + "sha256:4e18b656c5e844539d506a0a06432274d7bd52a7487e6828c63a63d69185626c", + "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6", + "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e", + "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95", + "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2", + "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133", + "sha256:5845c1fd4866bb5dd3125d89b90e57ed3138241540897de748cdf19de8a2fca2", + "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa", + "sha256:5b48204e8d955c47c55b72779802b219a39acc3ee3d0116d5080c388970b76e3", + "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3", + "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436", + "sha256:682b987361e5fd7a139ed565e30d81fd81e9629acc7d925a205366877d8c8657", + "sha256:6b5d83030255983181005e6cfbac1617ce9746b219bc2aad52201ad121226581", + "sha256:6bb5992037f7a9eff7991ebe4273ea7f51f1c1c511e6a2ce511d0e7bdb754492", + "sha256:73eae06aa53af2ea5270cc066dcaf02cc60d2994bbb2c4ef5764949257d10f43", + "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2", + "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2", + "sha256:82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926", + "sha256:87701f25a2352e5bf7454caa64757642734da9f6b11384c1f9d1a8e699758057", + "sha256:9079dfc6a70abe341f521f78405b8949f96db48da98aeb43f9907f342f627cdc", + "sha256:90f8717cb649eea3504091e640a1b8568faad18bd4b9fcd692853a04475a4b80", + "sha256:957cf8e4b6e123a9eea554fa7ebc85674674b713551de587eb318a2df3e00255", + "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1", + "sha256:9f636b730f7e8cb19feb87094949ba54ee5357440b9658b2a32a5ce4bce53972", + "sha256:a114d03b938376557927ab23f1e950827c3b893ccb94b62fd95d430fd0e5cf53", + "sha256:a185f876e69897a6f3325c3f19f26a297fa058c5e456bfcff8015e9a27e83ae1", + "sha256:a7a9541cd308eed5e30318430a9c74d2132e9a8cb46b901326272d780bf2d423", + "sha256:aa466da5b15ccea564bdab9c89175c762bc12825f4659c11227f515cee76fa4a", + "sha256:aaed8b0562be4a0876ee3b6946f6869b7bcdb571a5d1496683505944e268b160", + "sha256:ab7c4ceb38d91570a650dba194e1ca87c2b543488fe9309b4212694174fd539c", + "sha256:ac10f4c2b9e770c4e393876e35a7046879d195cd123b4f116d299d442b335bcd", + "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa", + "sha256:b1c416351ee6271b2f49b56ad7f308072f6f44b37118d69c2cad94f3fa8a40d5", + "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b", + "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa", + "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef", + "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44", + "sha256:c08be4f460903e5a9d0f76818db3250f12e9c344e79314d1d570fc69d7f4eae4", + "sha256:c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156", + "sha256:c943a53e9186688b45b323602298ab727d8865d8c9ee0b17f8d62d14b56f0753", + "sha256:ce2186a7df133a9c895dea3331ddc5ddad42cdd0d1ea2f0a51e5d161e4762f28", + "sha256:d093be959277cb7dee84b801eb1af388b6ad3ca6a6b6bf1ed7585895789d027d", + "sha256:d094ddec350a2fb899fec68d8353c78233debde9b7d8b4beeafa70825f1c281a", + "sha256:d1a9dd711d0877a1ece3d2e4fea11a8e75741ca21954c919406b44e7cf971304", + "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008", + "sha256:d618649d4e70ac6efcbba75be98b26ef5078faad23592f9b51ca492953012429", + "sha256:d83a047959d38a7ff552ff94be767b7fd79b831ad1cd9920662db05fec24fe72", + "sha256:d8fff389528cad1618fb4b26b95550327495462cd745d879a8c7c2115248e399", + "sha256:da1758c76f50c39a2efd5e9859ce7d776317eb1dd34317c8152ac9251fc574a3", + "sha256:db7457bac39421addd0c8449933ac32d8042aae84a14911a757ae6ca3eef1392", + "sha256:e27bbb6d14416713a8bd7aaa1313c0fc8d44ee48d74497a0ff4c3a1b6ccb5167", + "sha256:e617fb6b0b6953fffd762669610c1c4ffd05632c138d61ac7e14ad187870669c", + "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774", + "sha256:ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351", + "sha256:f179dee3b863ab1c59580ff60f9d99f632f34ccb38bf67a33ec6b3ecadd0fd76", + "sha256:f4c035da3f544b1882bac24115f3e2e8760f10a0107614fc9839fd232200b875", + "sha256:f67f217af4b1ff66c68a87318012de788dd95fcfeb24cc889011f4e1c7454dfd", + "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28", + "sha256:ff3827aef427c89a25cc96ded1759271a93603aba9fb977a6d264648ebf989db" ], - "markers": "python_version >= '3.7'", - "version": "==6.0.5" + "markers": "python_version >= '3.8'", + "version": "==6.1.0" }, "numpy": { "hashes": [ - "sha256:04494f6ec467ccb5369d1808570ae55f6ed9b5809d7f035059000a37b8d7e86f", - "sha256:0a43f0974d501842866cc83471bdb0116ba0dffdbaac33ec05e6afed5b615238", - "sha256:0e50842b2295ba8414c8c1d9d957083d5dfe9e16828b37de883f51fc53c4016f", - "sha256:0ec84b9ba0654f3b962802edc91424331f423dcf5d5f926676e0150789cb3d95", - "sha256:17067d097ed036636fa79f6a869ac26df7db1ba22039d962422506640314933a", - "sha256:1cde1753efe513705a0c6d28f5884e22bdc30438bf0085c5c486cdaff40cd67a", - "sha256:1e72728e7501a450288fc8e1f9ebc73d90cfd4671ebbd631f3e7857c39bd16f2", - "sha256:2635dbd200c2d6faf2ef9a0d04f0ecc6b13b3cad54f7c67c61155138835515d2", - "sha256:2ce46fd0b8a0c947ae047d222f7136fc4d55538741373107574271bc00e20e8f", - "sha256:34f003cb88b1ba38cb9a9a4a3161c1604973d7f9d5552c38bc2f04f829536609", - "sha256:354f373279768fa5a584bac997de6a6c9bc535c482592d7a813bb0c09be6c76f", - "sha256:38ecb5b0582cd125f67a629072fed6f83562d9dd04d7e03256c9829bdec027ad", - "sha256:3e8e01233d57639b2e30966c63d36fcea099d17c53bf424d77f088b0f4babd86", - "sha256:3f6bed7f840d44c08ebdb73b1825282b801799e325bcbdfa6bc5c370e5aecc65", - "sha256:4554eb96f0fd263041baf16cf0881b3f5dafae7a59b1049acb9540c4d57bc8cb", - "sha256:46e161722e0f619749d1cd892167039015b2c2817296104487cd03ed4a955995", - "sha256:49d9f7d256fbc804391a7f72d4a617302b1afac1112fac19b6c6cec63fe7fe8a", - "sha256:4d2f62e55a4cd9c58c1d9a1c9edaedcd857a73cb6fda875bf79093f9d9086f85", - "sha256:5f64641b42b2429f56ee08b4f427a4d2daf916ec59686061de751a55aafa22e4", - "sha256:63b92c512d9dbcc37f9d81b123dec99fdb318ba38c8059afc78086fe73820275", - "sha256:6d7696c615765091cc5093f76fd1fa069870304beaccfd58b5dcc69e55ef49c1", - "sha256:79e843d186c8fb1b102bef3e2bc35ef81160ffef3194646a7fdd6a73c6b97196", - "sha256:821eedb7165ead9eebdb569986968b541f9908979c2da8a4967ecac4439bae3d", - "sha256:84554fc53daa8f6abf8e8a66e076aff6ece62de68523d9f665f32d2fc50fd66e", - "sha256:8d83bb187fb647643bd56e1ae43f273c7f4dbcdf94550d7938cfc32566756514", - "sha256:903703372d46bce88b6920a0cd86c3ad82dae2dbef157b5fc01b70ea1cfc430f", - "sha256:9416a5c2e92ace094e9f0082c5fd473502c91651fb896bc17690d6fc475128d6", - "sha256:9a1712c015831da583b21c5bfe15e8684137097969c6d22e8316ba66b5baabe4", - "sha256:9c27f0946a3536403efb0e1c28def1ae6730a72cd0d5878db38824855e3afc44", - "sha256:a356364941fb0593bb899a1076b92dfa2029f6f5b8ba88a14fd0984aaf76d0df", - "sha256:a7039a136017eaa92c1848152827e1424701532ca8e8967fe480fe1569dae581", - "sha256:acd3a644e4807e73b4e1867b769fbf1ce8c5d80e7caaef0d90dcdc640dfc9787", - "sha256:ad0c86f3455fbd0de6c31a3056eb822fc939f81b1618f10ff3406971893b62a5", - "sha256:b4c76e3d4c56f145d41b7b6751255feefae92edbc9a61e1758a98204200f30fc", - "sha256:b6f6a8f45d0313db07d6d1d37bd0b112f887e1369758a5419c0370ba915b3871", - "sha256:c5a59996dc61835133b56a32ebe4ef3740ea5bc19b3983ac60cc32be5a665d54", - "sha256:c73aafd1afca80afecb22718f8700b40ac7cab927b8abab3c3e337d70e10e5a2", - "sha256:cee6cc0584f71adefe2c908856ccc98702baf95ff80092e4ca46061538a2ba98", - "sha256:cef04d068f5fb0518a77857953193b6bb94809a806bd0a14983a8f12ada060c9", - "sha256:cf5d1c9e6837f8af9f92b6bd3e86d513cdc11f60fd62185cc49ec7d1aba34864", - "sha256:e61155fae27570692ad1d327e81c6cf27d535a5d7ef97648a17d922224b216de", - "sha256:e7f387600d424f91576af20518334df3d97bc76a300a755f9a8d6e4f5cadd289", - "sha256:ed08d2703b5972ec736451b818c2eb9da80d66c3e84aed1deeb0c345fefe461b", - "sha256:fbd6acc766814ea6443628f4e6751d0da6593dae29c08c0b2606164db026970c", - "sha256:feff59f27338135776f6d4e2ec7aeeac5d5f7a08a83e80869121ef8164b74af9" + "sha256:046356b19d7ad1890c751b99acad5e82dc4a02232013bd9a9a712fddf8eb60f5", + "sha256:0b8cc2715a84b7c3b161f9ebbd942740aaed913584cae9cdc7f8ad5ad41943d0", + "sha256:0d07841fd284718feffe7dd17a63a2e6c78679b2d386d3e82f44f0108c905550", + "sha256:13cc11c00000848702322af4de0147ced365c81d66053a67c2e962a485b3717c", + "sha256:13ce49a34c44b6de5241f0b38b07e44c1b2dcacd9e36c30f9c2fcb1bb5135db7", + "sha256:24c2ad697bd8593887b019817ddd9974a7f429c14a5469d7fad413f28340a6d2", + "sha256:251105b7c42abe40e3a689881e1793370cc9724ad50d64b30b358bbb3a97553b", + "sha256:2ca4b53e1e0b279142113b8c5eb7d7a877e967c306edc34f3b58e9be12fda8df", + "sha256:3269c9eb8745e8d975980b3a7411a98976824e1fdef11f0aacf76147f662b15f", + "sha256:397bc5ce62d3fb73f304bec332171535c187e0643e176a6e9421a6e3eacef06d", + "sha256:3fc5eabfc720db95d68e6646e88f8b399bfedd235994016351b1d9e062c4b270", + "sha256:50a95ca3560a6058d6ea91d4629a83a897ee27c00630aed9d933dff191f170cd", + "sha256:52ac2e48f5ad847cd43c4755520a2317f3380213493b9d8a4c5e37f3b87df504", + "sha256:53e27293b3a2b661c03f79aa51c3987492bd4641ef933e366e0f9f6c9bf257ec", + "sha256:57eb525e7c2a8fdee02d731f647146ff54ea8c973364f3b850069ffb42799647", + "sha256:5889dd24f03ca5a5b1e8a90a33b5a0846d8977565e4ae003a63d22ecddf6782f", + "sha256:59ca673ad11d4b84ceb385290ed0ebe60266e356641428c845b39cd9df6713ab", + "sha256:6435c48250c12f001920f0751fe50c0348f5f240852cfddc5e2f97e007544cbe", + "sha256:6e5a9cb2be39350ae6c8f79410744e80154df658d5bea06e06e0ac5bb75480d5", + "sha256:7be6a07520b88214ea85d8ac8b7d6d8a1839b0b5cb87412ac9f49fa934eb15d5", + "sha256:7c803b7934a7f59563db459292e6aa078bb38b7ab1446ca38dd138646a38203e", + "sha256:7dd86dfaf7c900c0bbdcb8b16e2f6ddf1eb1fe39c6c8cca6e94844ed3152a8fd", + "sha256:8661c94e3aad18e1ea17a11f60f843a4933ccaf1a25a7c6a9182af70610b2313", + "sha256:8ae0fd135e0b157365ac7cc31fff27f07a5572bdfc38f9c2d43b2aff416cc8b0", + "sha256:910b47a6d0635ec1bd53b88f86120a52bf56dcc27b51f18c7b4a2e2224c29f0f", + "sha256:913cc1d311060b1d409e609947fa1b9753701dac96e6581b58afc36b7ee35af6", + "sha256:920b0911bb2e4414c50e55bd658baeb78281a47feeb064ab40c2b66ecba85553", + "sha256:950802d17a33c07cba7fd7c3dcfa7d64705509206be1606f196d179e539111ed", + "sha256:981707f6b31b59c0c24bcda52e5605f9701cb46da4b86c2e8023656ad3e833cb", + "sha256:98ce7fb5b8063cfdd86596b9c762bf2b5e35a2cdd7e967494ab78a1fa7f8b86e", + "sha256:99f4a9ee60eed1385a86e82288971a51e71df052ed0b2900ed30bc840c0f2e39", + "sha256:9a8e06c7a980869ea67bbf551283bbed2856915f0a792dc32dd0f9dd2fb56728", + "sha256:ae8ce252404cdd4de56dcfce8b11eac3c594a9c16c231d081fb705cf23bd4d9e", + "sha256:afd9c680df4de71cd58582b51e88a61feed4abcc7530bcd3d48483f20fc76f2a", + "sha256:b49742cdb85f1f81e4dc1b39dcf328244f4d8d1ded95dea725b316bd2cf18c95", + "sha256:b5613cfeb1adfe791e8e681128f5f49f22f3fcaa942255a6124d58ca59d9528f", + "sha256:bab7c09454460a487e631ffc0c42057e3d8f2a9ddccd1e60c7bb8ed774992480", + "sha256:c8a0e34993b510fc19b9a2ce7f31cb8e94ecf6e924a40c0c9dd4f62d0aac47d9", + "sha256:caf5d284ddea7462c32b8d4a6b8af030b6c9fd5332afb70e7414d7fdded4bfd0", + "sha256:cea427d1350f3fd0d2818ce7350095c1a2ee33e30961d2f0fef48576ddbbe90f", + "sha256:d0cf7d55b1051387807405b3898efafa862997b4cba8aa5dbe657be794afeafd", + "sha256:d10c39947a2d351d6d466b4ae83dad4c37cd6c3cdd6d5d0fa797da56f710a6ae", + "sha256:d2b9cd92c8f8e7b313b80e93cedc12c0112088541dcedd9197b5dee3738c1201", + "sha256:d4c57b68c8ef5e1ebf47238e99bf27657511ec3f071c465f6b1bccbef12d4136", + "sha256:d51fc141ddbe3f919e91a096ec739f49d686df8af254b2053ba21a910ae518bf", + "sha256:e097507396c0be4e547ff15b13dc3866f45f3680f789c1a1301b07dadd3fbc78", + "sha256:e30356d530528a42eeba51420ae8bf6c6c09559051887196599d96ee5f536468", + "sha256:e8d5f8a8e3bc87334f025194c6193e408903d21ebaeb10952264943a985066ca", + "sha256:e8dfa9e94fc127c40979c3eacbae1e61fda4fe71d84869cc129e2721973231ef", + "sha256:f212d4f46b67ff604d11fff7cc62d36b3e8714edf68e44e9760e19be38c03eb0", + "sha256:f7506387e191fe8cdb267f912469a3cccc538ab108471291636a96a54e599556", + "sha256:fac6e277a41163d27dfab5f4ec1f7a83fac94e170665a4a50191b545721c6521", + "sha256:fcd8f556cdc8cfe35e70efb92463082b7f43dd7e547eb071ffc36abc0ca4699b" ], "markers": "python_version == '3.11'", - "version": "==2.0.0" + "version": "==2.1.1" }, "opensearch-py": { "hashes": [ - "sha256:0b7c27e8ed84c03c99558406927b6161f186a72502ca6d0325413d8e5523ba96", - "sha256:b6e78b685dd4e9c016d7a4299cf1de69e299c88322e3f81c716e6e23fe5683c1" + "sha256:5417650eba98a1c7648e502207cebf3a12beab623ffe0ebbf55f9b1b4b6e44e9", + "sha256:67ab76e9373669bc71da417096df59827c08369ac3795d5438c9a8be21cbd759" ], "index": "pypi", - "version": "==2.6.0" + "markers": "python_version >= '3.8' and python_version < '4'", + "version": "==2.7.1" }, "packaging": { "hashes": [ @@ -923,11 +978,11 @@ }, "prometheus-flask-exporter": { "hashes": [ - "sha256:7a026b4fdd54ebeddb77589333efe3a1ec43c7c717468825b0b3e9b6c33f7e9e", - "sha256:e4e6beb1b8e1e164da6d70fe1edefc95ef184f113b5047f66f4b7262233da9c0" + "sha256:587c770a1061e93d72c5cbcdefbd7b633fb764e39dffd7dd16932c9124559244", + "sha256:ab49b2c40b57cd35cd51e91e59b3c306b3754477095c4f3cf679034c5122398c" ], "index": "pypi", - "version": "==0.23.0" + "version": "==0.23.1" }, "pycparser": { "hashes": [ @@ -939,120 +994,131 @@ }, "pydantic": { "hashes": [ - "sha256:0c84efd9548d545f63ac0060c1e4d39bb9b14db8b3c0652338aecc07b5adec52", - "sha256:ee8538d41ccb9c0a9ad3e0e5f07bf15ed8015b481ced539a1759d8cc89ae90d0" + "sha256:1363c7d975c7036df0db2b4a61f2e062fbc0aa5ab5f2772e0ffc7191a4f4bce2", + "sha256:7aff4db5fdf3cf573d4b3c30926a510a10e19a0774d38fc4967f78beb6deb612" ], "markers": "python_version >= '3.8'", - "version": "==2.7.4" + "version": "==2.9.1" }, "pydantic-core": { "hashes": [ - "sha256:01dd777215e2aa86dfd664daed5957704b769e726626393438f9c87690ce78c3", - "sha256:0eb2a4f660fcd8e2b1c90ad566db2b98d7f3f4717c64fe0a83e0adb39766d5b8", - "sha256:0fbbdc827fe5e42e4d196c746b890b3d72876bdbf160b0eafe9f0334525119c8", - "sha256:123c3cec203e3f5ac7b000bd82235f1a3eced8665b63d18be751f115588fea30", - "sha256:14601cdb733d741b8958224030e2bfe21a4a881fb3dd6fbb21f071cabd48fa0a", - "sha256:18f469a3d2a2fdafe99296a87e8a4c37748b5080a26b806a707f25a902c040a8", - "sha256:19894b95aacfa98e7cb093cd7881a0c76f55731efad31073db4521e2b6ff5b7d", - "sha256:1b4de2e51bbcb61fdebd0ab86ef28062704f62c82bbf4addc4e37fa4b00b7cbc", - "sha256:1d886dc848e60cb7666f771e406acae54ab279b9f1e4143babc9c2258213daa2", - "sha256:1f4d26ceb5eb9eed4af91bebeae4b06c3fb28966ca3a8fb765208cf6b51102ab", - "sha256:21a5e440dbe315ab9825fcd459b8814bb92b27c974cbc23c3e8baa2b76890077", - "sha256:293afe532740370aba8c060882f7d26cfd00c94cae32fd2e212a3a6e3b7bc15e", - "sha256:2f5966897e5461f818e136b8451d0551a2e77259eb0f73a837027b47dc95dab9", - "sha256:2fd41f6eff4c20778d717af1cc50eca52f5afe7805ee530a4fbd0bae284f16e9", - "sha256:2fdf2156aa3d017fddf8aea5adfba9f777db1d6022d392b682d2a8329e087cef", - "sha256:3c40d4eaad41f78e3bbda31b89edc46a3f3dc6e171bf0ecf097ff7a0ffff7cb1", - "sha256:43d447dd2ae072a0065389092a231283f62d960030ecd27565672bd40746c507", - "sha256:44a688331d4a4e2129140a8118479443bd6f1905231138971372fcde37e43528", - "sha256:44c7486a4228413c317952e9d89598bcdfb06399735e49e0f8df643e1ccd0558", - "sha256:44cd83ab6a51da80fb5adbd9560e26018e2ac7826f9626bc06ca3dc074cd198b", - "sha256:46387e38bd641b3ee5ce247563b60c5ca098da9c56c75c157a05eaa0933ed154", - "sha256:4701b19f7e3a06ea655513f7938de6f108123bf7c86bbebb1196eb9bd35cf724", - "sha256:4748321b5078216070b151d5271ef3e7cc905ab170bbfd27d5c83ee3ec436695", - "sha256:4b06beb3b3f1479d32befd1f3079cc47b34fa2da62457cdf6c963393340b56e9", - "sha256:4d0dcc59664fcb8974b356fe0a18a672d6d7cf9f54746c05f43275fc48636851", - "sha256:4e99bc050fe65c450344421017f98298a97cefc18c53bb2f7b3531eb39bc7805", - "sha256:509daade3b8649f80d4e5ff21aa5673e4ebe58590b25fe42fac5f0f52c6f034a", - "sha256:51991a89639a912c17bef4b45c87bd83593aee0437d8102556af4885811d59f5", - "sha256:53db086f9f6ab2b4061958d9c276d1dbe3690e8dd727d6abf2321d6cce37fa94", - "sha256:564d7922e4b13a16b98772441879fcdcbe82ff50daa622d681dd682175ea918c", - "sha256:574d92eac874f7f4db0ca653514d823a0d22e2354359d0759e3f6a406db5d55d", - "sha256:578e24f761f3b425834f297b9935e1ce2e30f51400964ce4801002435a1b41ef", - "sha256:59ff3e89f4eaf14050c8022011862df275b552caef8082e37b542b066ce1ff26", - "sha256:5f09baa656c904807e832cf9cce799c6460c450c4ad80803517032da0cd062e2", - "sha256:6891a2ae0e8692679c07728819b6e2b822fb30ca7445f67bbf6509b25a96332c", - "sha256:6a750aec7bf431517a9fd78cb93c97b9b0c496090fee84a47a0d23668976b4b0", - "sha256:6f5c4d41b2771c730ea1c34e458e781b18cc668d194958e0112455fff4e402b2", - "sha256:77450e6d20016ec41f43ca4a6c63e9fdde03f0ae3fe90e7c27bdbeaece8b1ed4", - "sha256:81b5efb2f126454586d0f40c4d834010979cb80785173d1586df845a632e4e6d", - "sha256:823be1deb01793da05ecb0484d6c9e20baebb39bd42b5d72636ae9cf8350dbd2", - "sha256:834b5230b5dfc0c1ec37b2fda433b271cbbc0e507560b5d1588e2cc1148cf1ce", - "sha256:847a35c4d58721c5dc3dba599878ebbdfd96784f3fb8bb2c356e123bdcd73f34", - "sha256:86110d7e1907ab36691f80b33eb2da87d780f4739ae773e5fc83fb272f88825f", - "sha256:8951eee36c57cd128f779e641e21eb40bc5073eb28b2d23f33eb0ef14ffb3f5d", - "sha256:8a7164fe2005d03c64fd3b85649891cd4953a8de53107940bf272500ba8a788b", - "sha256:8b8bab4c97248095ae0c4455b5a1cd1cdd96e4e4769306ab19dda135ea4cdb07", - "sha256:90afc12421df2b1b4dcc975f814e21bc1754640d502a2fbcc6d41e77af5ec312", - "sha256:938cb21650855054dc54dfd9120a851c974f95450f00683399006aa6e8abb057", - "sha256:942ba11e7dfb66dc70f9ae66b33452f51ac7bb90676da39a7345e99ffb55402d", - "sha256:972658f4a72d02b8abfa2581d92d59f59897d2e9f7e708fdabe922f9087773af", - "sha256:97736815b9cc893b2b7f663628e63f436018b75f44854c8027040e05230eeddb", - "sha256:98906207f29bc2c459ff64fa007afd10a8c8ac080f7e4d5beff4c97086a3dabd", - "sha256:99457f184ad90235cfe8461c4d70ab7dd2680e28821c29eca00252ba90308c78", - "sha256:a0d829524aaefdebccb869eed855e2d04c21d2d7479b6cada7ace5448416597b", - "sha256:a2fdd81edd64342c85ac7cf2753ccae0b79bf2dfa063785503cb85a7d3593223", - "sha256:a55b5b16c839df1070bc113c1f7f94a0af4433fcfa1b41799ce7606e5c79ce0a", - "sha256:a642295cd0c8df1b86fc3dced1d067874c353a188dc8e0f744626d49e9aa51c4", - "sha256:ab86ce7c8f9bea87b9d12c7f0af71102acbf5ecbc66c17796cff45dae54ef9a5", - "sha256:abc267fa9837245cc28ea6929f19fa335f3dc330a35d2e45509b6566dc18be23", - "sha256:ae1d6df168efb88d7d522664693607b80b4080be6750c913eefb77e34c12c71a", - "sha256:b2ebef0e0b4454320274f5e83a41844c63438fdc874ea40a8b5b4ecb7693f1c4", - "sha256:b48ece5bde2e768197a2d0f6e925f9d7e3e826f0ad2271120f8144a9db18d5c8", - "sha256:b7cdf28938ac6b8b49ae5e92f2735056a7ba99c9b110a474473fd71185c1af5d", - "sha256:bb4462bd43c2460774914b8525f79b00f8f407c945d50881568f294c1d9b4443", - "sha256:bc4ff9805858bd54d1a20efff925ccd89c9d2e7cf4986144b30802bf78091c3e", - "sha256:c1322d7dd74713dcc157a2b7898a564ab091ca6c58302d5c7b4c07296e3fd00f", - "sha256:c67598100338d5d985db1b3d21f3619ef392e185e71b8d52bceacc4a7771ea7e", - "sha256:ca26a1e73c48cfc54c4a76ff78df3727b9d9f4ccc8dbee4ae3f73306a591676d", - "sha256:d323a01da91851a4f17bf592faf46149c9169d68430b3146dcba2bb5e5719abc", - "sha256:dc1803ac5c32ec324c5261c7209e8f8ce88e83254c4e1aebdc8b0a39f9ddb443", - "sha256:e00a3f196329e08e43d99b79b286d60ce46bed10f2280d25a1718399457e06be", - "sha256:e85637bc8fe81ddb73fda9e56bab24560bdddfa98aa64f87aaa4e4b6730c23d2", - "sha256:e858ac0a25074ba4bce653f9b5d0a85b7456eaddadc0ce82d3878c22489fa4ee", - "sha256:eae237477a873ab46e8dd748e515c72c0c804fb380fbe6c85533c7de51f23a8f", - "sha256:ebef0dd9bf9b812bf75bda96743f2a6c5734a02092ae7f721c048d156d5fabae", - "sha256:ec3beeada09ff865c344ff3bc2f427f5e6c26401cc6113d77e372c3fdac73864", - "sha256:f76d0ad001edd426b92233d45c746fd08f467d56100fd8f30e9ace4b005266e4", - "sha256:f85d05aa0918283cf29a30b547b4df2fbb56b45b135f9e35b6807cb28bc47951", - "sha256:f9899c94762343f2cc2fc64c13e7cae4c3cc65cdfc87dd810a31654c9b7358cc" + "sha256:01491d8b4d8db9f3391d93b0df60701e644ff0894352947f31fff3e52bd5c801", + "sha256:03667cec5daf43ac4995cefa8aaf58f99de036204a37b889c24a80927b629cec", + "sha256:03795b9e8a5d7fda05f3873efc3f59105e2dcff14231680296b87b80bb327295", + "sha256:047531242f8e9c2db733599f1c612925de095e93c9cc0e599e96cf536aaf56ba", + "sha256:04b07490bc2f6f2717b10c3969e1b830f5720b632f8ae2f3b8b1542394c47a8e", + "sha256:09e926397f392059ce0afdcac920df29d9c833256354d0c55f1584b0b70cf07e", + "sha256:0a0137ddf462575d9bce863c4c95bac3493ba8e22f8c28ca94634b4a1d3e2bb4", + "sha256:0dda0290a6f608504882d9f7650975b4651ff91c85673341789a476b1159f211", + "sha256:13dd45ba2561603681a2676ca56006d6dee94493f03d5cadc055d2055615c3ea", + "sha256:1c3980f2843de5184656aab58698011b42763ccba11c4a8c35936c8dd6c7068c", + "sha256:1eba2f7ce3e30ee2170410e2171867ea73dbd692433b81a93758ab2de6c64835", + "sha256:203171e48946c3164fe7691fc349c79241ff8f28306abd4cad5f4f75ed80bc8d", + "sha256:255ec6dcb899c115f1e2a64bc9ebc24cc0e3ab097775755244f77360d1f3c06c", + "sha256:2718443bc671c7ac331de4eef9b673063b10af32a0bb385019ad61dcf2cc8f6c", + "sha256:2b2b55b0448e9da68f56b696f313949cda1039e8ec7b5d294285335b53104b61", + "sha256:2b603cde285322758a0279995b5796d64b63060bfbe214b50a3ca23b5cee3e83", + "sha256:2b676583fc459c64146debea14ba3af54e540b61762dfc0613dc4e98c3f66eeb", + "sha256:37ba321ac2a46100c578a92e9a6aa33afe9ec99ffa084424291d84e456f490c1", + "sha256:3c09a7885dd33ee8c65266e5aa7fb7e2f23d49d8043f089989726391dd7350c5", + "sha256:3cb0f65d8b4121c1b015c60104a685feb929a29d7cf204387c7f2688c7974690", + "sha256:40b8441be16c1e940abebed83cd006ddb9e3737a279e339dbd6d31578b802f7b", + "sha256:40d9bd259538dba2f40963286009bf7caf18b5112b19d2b55b09c14dde6db6a7", + "sha256:4b259fd8409ab84b4041b7b3f24dcc41e4696f180b775961ca8142b5b21d0e70", + "sha256:4f62c1c953d7ee375df5eb2e44ad50ce2f5aff931723b398b8bc6f0ac159791a", + "sha256:50e4661f3337977740fdbfbae084ae5693e505ca2b3130a6d4eb0f2281dc43b8", + "sha256:510b7fb0a86dc8f10a8bb43bd2f97beb63cffad1203071dc434dac26453955cd", + "sha256:5499798317fff7f25dbef9347f4451b91ac2a4330c6669821c8202fd354c7bee", + "sha256:560e32f0df04ac69b3dd818f71339983f6d1f70eb99d4d1f8e9705fb6c34a5c1", + "sha256:59d52cf01854cb26c46958552a21acb10dd78a52aa34c86f284e66b209db8cab", + "sha256:5a8cd3074a98ee70173a8633ad3c10e00dcb991ecec57263aacb4095c5efb958", + "sha256:5b01a078dd4f9a52494370af21aa52964e0a96d4862ac64ff7cea06e0f12d2c5", + "sha256:6470b5a1ec4d1c2e9afe928c6cb37eb33381cab99292a708b8cb9aa89e62429b", + "sha256:65b6e5da855e9c55a0c67f4db8a492bf13d8d3316a59999cfbaf98cc6e401961", + "sha256:67a5def279309f2e23014b608c4150b0c2d323bd7bccd27ff07b001c12c2415c", + "sha256:68f4cf373f0de6abfe599a38307f4417c1c867ca381c03df27c873a9069cda25", + "sha256:6b5547d098c76e1694ba85f05b595720d7c60d342f24d5aad32c3049131fa5c4", + "sha256:6cb968da9a0746a0cf521b2b5ef25fc5a0bee9b9a1a8214e0a1cfaea5be7e8a4", + "sha256:6daaf5b1ba1369a22c8b050b643250e3e5efc6a78366d323294aee54953a4d5f", + "sha256:7200fd561fb3be06827340da066df4311d0b6b8eb0c2116a110be5245dceb326", + "sha256:748bdf985014c6dd3e1e4cc3db90f1c3ecc7246ff5a3cd4ddab20c768b2f1dab", + "sha256:76bdab0de4acb3f119c2a4bff740e0c7dc2e6de7692774620f7452ce11ca76c8", + "sha256:7e6f33503c5495059148cc486867e1d24ca35df5fc064686e631e314d959ad5b", + "sha256:7f10a5d1b9281392f1bf507d16ac720e78285dfd635b05737c3911637601bae6", + "sha256:82da2f4703894134a9f000e24965df73cc103e31e8c31906cc1ee89fde72cbd8", + "sha256:86fc6c762ca7ac8fbbdff80d61b2c59fb6b7d144aa46e2d54d9e1b7b0e780e01", + "sha256:87cfa0ed6b8c5bd6ae8b66de941cece179281239d482f363814d2b986b79cedc", + "sha256:89b731f25c80830c76fdb13705c68fef6a2b6dc494402987c7ea9584fe189f5d", + "sha256:8b2682038e255e94baf2c473dca914a7460069171ff5cdd4080be18ab8a7fd6e", + "sha256:8b5b3ed73abb147704a6e9f556d8c5cb078f8c095be4588e669d315e0d11893b", + "sha256:8e22b477bf90db71c156f89a55bfe4d25177b81fce4aa09294d9e805eec13855", + "sha256:9172d2088e27d9a185ea0a6c8cebe227a9139fd90295221d7d495944d2367700", + "sha256:94f85614f2cba13f62c3c6481716e4adeae48e1eaa7e8bac379b9d177d93947a", + "sha256:98ccd69edcf49f0875d86942f4418a4e83eb3047f20eb897bffa62a5d419c8fa", + "sha256:a0d90e08b2727c5d01af1b5ef4121d2f0c99fbee692c762f4d9d0409c9da6541", + "sha256:a3fc572d9b5b5cfe13f8e8a6e26271d5d13f80173724b738557a8c7f3a8a3791", + "sha256:a678c1ac5c5ec5685af0133262103defb427114e62eafeda12f1357a12140162", + "sha256:a7f7f72f721223f33d3dc98a791666ebc6a91fa023ce63733709f4894a7dc611", + "sha256:bb68b41c3fa64587412b104294b9cbb027509dc2f6958446c502638d481525ef", + "sha256:bbb5e45eab7624440516ee3722a3044b83fff4c0372efe183fd6ba678ff681fe", + "sha256:c24574c7e92e2c56379706b9a3f07c1e0c7f2f87a41b6ee86653100c4ce343e5", + "sha256:c483dab0f14b8d3f0df0c6c18d70b21b086f74c87ab03c59250dbf6d3c89baba", + "sha256:c6de1ec30c4bb94f3a69c9f5f2182baeda5b809f806676675e9ef6b8dc936f28", + "sha256:c744fa100fdea0d000d8bcddee95213d2de2e95b9c12be083370b2072333a0fa", + "sha256:c889fd87e1f1bbeb877c2ee56b63bb297de4636661cc9bbfcf4b34e5e925bc27", + "sha256:cbaaf2ef20d282659093913da9d402108203f7cb5955020bd8d1ae5a2325d1c4", + "sha256:ce3317d155628301d649fe5e16a99528d5680af4ec7aa70b90b8dacd2d725c9b", + "sha256:d015e63b985a78a3d4ccffd3bdf22b7c20b3bbd4b8227809b3e8e75bc37f9cb2", + "sha256:d063c6b9fed7d992bcbebfc9133f4c24b7a7f215d6b102f3e082b1117cddb72c", + "sha256:d965e8b325f443ed3196db890d85dfebbb09f7384486a77461347f4adb1fa7f8", + "sha256:db6e6afcb95edbe6b357786684b71008499836e91f2a4a1e55b840955b341dbb", + "sha256:dc1636770a809dee2bd44dd74b89cc80eb41172bcad8af75dd0bc182c2666d4c", + "sha256:dd9be0a42de08f4b58a3cc73a123f124f65c24698b95a54c1543065baca8cf0e", + "sha256:e0ec50663feedf64d21bad0809f5857bac1ce91deded203efc4a84b31b2e4305", + "sha256:e2c409ce1c219c091e47cb03feb3c4ed8c2b8e004efc940da0166aaee8f9d6c8", + "sha256:e61328920154b6a44d98cabcb709f10e8b74276bc709c9a513a8c37a18786cc4", + "sha256:e89513f014c6be0d17b00a9a7c81b1c426f4eb9224b15433f3d98c1a071f8433", + "sha256:ea85bda3189fb27503af4c45273735bcde3dd31c1ab17d11f37b04877859ef45", + "sha256:edbefe079a520c5984e30e1f1f29325054b59534729c25b874a16a5048028d16", + "sha256:f0cb80fd5c2df4898693aa841425ea1727b1b6d2167448253077d2a49003e0ed", + "sha256:f2b05e6ccbee333a8f4b8f4d7c244fdb7a979e90977ad9c51ea31261e2085ce0", + "sha256:f399e8657c67313476a121a6944311fab377085ca7f490648c9af97fc732732d", + "sha256:f4a57db8966b3a1d1a350012839c6a0099f0898c56512dfade8a1fe5fb278710", + "sha256:f56af3a420fb1ffaf43ece3ea09c2d27c444e7c40dcb7c6e7cf57aae764f2b48", + "sha256:f6bd91345b5163ee7448bee201ed7dd601ca24f43f439109b0212e296eb5b423", + "sha256:fb539d7e5dc4aac345846f290cf504d2fd3c1be26ac4e8b5e4c2b688069ff4cf", + "sha256:fbdce4b47592f9e296e19ac31667daed8753c8367ebb34b9a9bd89dacaa299c9", + "sha256:fc379c73fd66606628b866f661e8785088afe2adaba78e6bbe80796baf708a63", + "sha256:fc3cf31edf405a161a0adad83246568647c54404739b614b1ff43dad2b02e6d5", + "sha256:fcf31facf2796a2d3b7fe338fe8640aa0166e4e55b4cb108dbfd1058049bf4cb" ], "markers": "python_version >= '3.8'", - "version": "==2.18.4" + "version": "==2.23.3" }, "pyjwt": { "hashes": [ - "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de", - "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320" + "sha256:3b02fb0f44517787776cf48f2ae25d8e14f300e6d7545a4315cee571a415e850", + "sha256:7e1e5b56cc735432a7369cbfa0efe50fa113ebecdc04ae6922deba8b84582d0c" ], - "markers": "python_version >= '3.7'", - "version": "==2.8.0" + "markers": "python_version >= '3.8'", + "version": "==2.9.0" }, "pyparsing": { "hashes": [ - "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad", - "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742" + "sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c", + "sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032" ], "markers": "python_full_version >= '3.6.8'", - "version": "==3.1.2" + "version": "==3.1.4" }, "pytest": { "hashes": [ - "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343", - "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977" + "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181", + "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2" ], "index": "pypi", - "version": "==8.2.2" + "markers": "python_version >= '3.8'", + "version": "==8.3.3" }, "python-dateutil": { "hashes": [ @@ -1068,71 +1134,74 @@ "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==1.0.1" }, "pytz": { "hashes": [ - "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812", - "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319" + "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a", + "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725" ], - "version": "==2024.1" + "version": "==2024.2" }, "pyyaml": { "hashes": [ - "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5", - "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc", - "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df", - "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741", - "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206", - "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27", - "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595", - "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62", - "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98", - "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696", - "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290", - "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9", - "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d", - "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6", - "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867", - "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47", - "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486", - "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6", - "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3", - "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007", - "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938", - "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0", - "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c", - "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735", - "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d", - "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28", - "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4", - "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba", - "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8", - "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef", - "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5", - "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd", - "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3", - "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0", - "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515", - "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c", - "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c", - "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924", - "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34", - "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43", - "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859", - "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673", - "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54", - "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a", - "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b", - "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab", - "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa", - "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c", - "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585", - "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d", - "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f" + "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff", + "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", + "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", + "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e", + "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", + "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", + "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", + "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", + "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", + "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", + "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a", + "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", + "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", + "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8", + "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", + "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19", + "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", + "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a", + "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", + "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", + "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", + "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631", + "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d", + "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", + "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", + "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", + "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", + "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", + "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", + "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706", + "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", + "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", + "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", + "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083", + "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", + "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", + "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", + "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f", + "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725", + "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", + "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", + "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", + "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", + "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", + "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5", + "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d", + "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290", + "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", + "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", + "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", + "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", + "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12", + "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4" ], - "markers": "python_version >= '3.6'", - "version": "==6.0.1" + "markers": "python_version >= '3.8'", + "version": "==6.0.2" }, "rdflib": { "hashes": [ @@ -1140,6 +1209,7 @@ "sha256:9995eb8569428059b8c1affd26b25eac510d64f5043d9ce8c84e0d0036e995ae" ], "index": "pypi", + "markers": "python_full_version >= '3.8.1' and python_full_version < '4.0.0'", "version": "==7.0.0" }, "referencing": { @@ -1160,108 +1230,112 @@ }, "rpds-py": { "hashes": [ - "sha256:05f3d615099bd9b13ecf2fc9cf2d839ad3f20239c678f461c753e93755d629ee", - "sha256:06d218939e1bf2ca50e6b0ec700ffe755e5216a8230ab3e87c059ebb4ea06afc", - "sha256:07f2139741e5deb2c5154a7b9629bc5aa48c766b643c1a6750d16f865a82c5fc", - "sha256:08d74b184f9ab6289b87b19fe6a6d1a97fbfea84b8a3e745e87a5de3029bf944", - "sha256:0abeee75434e2ee2d142d650d1e54ac1f8b01e6e6abdde8ffd6eeac6e9c38e20", - "sha256:154bf5c93d79558b44e5b50cc354aa0459e518e83677791e6adb0b039b7aa6a7", - "sha256:17c6d2155e2423f7e79e3bb18151c686d40db42d8645e7977442170c360194d4", - "sha256:1805d5901779662d599d0e2e4159d8a82c0b05faa86ef9222bf974572286b2b6", - "sha256:19ba472b9606c36716062c023afa2484d1e4220548751bda14f725a7de17b4f6", - "sha256:19e515b78c3fc1039dd7da0a33c28c3154458f947f4dc198d3c72db2b6b5dc93", - "sha256:1d54f74f40b1f7aaa595a02ff42ef38ca654b1469bef7d52867da474243cc633", - "sha256:207c82978115baa1fd8d706d720b4a4d2b0913df1c78c85ba73fe6c5804505f0", - "sha256:2625f03b105328729f9450c8badda34d5243231eef6535f80064d57035738360", - "sha256:27bba383e8c5231cd559affe169ca0b96ec78d39909ffd817f28b166d7ddd4d8", - "sha256:2c3caec4ec5cd1d18e5dd6ae5194d24ed12785212a90b37f5f7f06b8bedd7139", - "sha256:2cc7c1a47f3a63282ab0f422d90ddac4aa3034e39fc66a559ab93041e6505da7", - "sha256:2fc24a329a717f9e2448f8cd1f960f9dac4e45b6224d60734edeb67499bab03a", - "sha256:312fe69b4fe1ffbe76520a7676b1e5ac06ddf7826d764cc10265c3b53f96dbe9", - "sha256:32b7daaa3e9389db3695964ce8e566e3413b0c43e3394c05e4b243a4cd7bef26", - "sha256:338dee44b0cef8b70fd2ef54b4e09bb1b97fc6c3a58fea5db6cc083fd9fc2724", - "sha256:352a88dc7892f1da66b6027af06a2e7e5d53fe05924cc2cfc56495b586a10b72", - "sha256:35b2b771b13eee8729a5049c976197ff58a27a3829c018a04341bcf1ae409b2b", - "sha256:38e14fb4e370885c4ecd734f093a2225ee52dc384b86fa55fe3f74638b2cfb09", - "sha256:3c20f05e8e3d4fc76875fc9cb8cf24b90a63f5a1b4c5b9273f0e8225e169b100", - "sha256:3dd3cd86e1db5aadd334e011eba4e29d37a104b403e8ca24dcd6703c68ca55b3", - "sha256:489bdfe1abd0406eba6b3bb4fdc87c7fa40f1031de073d0cfb744634cc8fa261", - "sha256:48c2faaa8adfacefcbfdb5f2e2e7bdad081e5ace8d182e5f4ade971f128e6bb3", - "sha256:4a98a1f0552b5f227a3d6422dbd61bc6f30db170939bd87ed14f3c339aa6c7c9", - "sha256:4adec039b8e2928983f885c53b7cc4cda8965b62b6596501a0308d2703f8af1b", - "sha256:4e0ee01ad8260184db21468a6e1c37afa0529acc12c3a697ee498d3c2c4dcaf3", - "sha256:51584acc5916212e1bf45edd17f3a6b05fe0cbb40482d25e619f824dccb679de", - "sha256:531796fb842b53f2695e94dc338929e9f9dbf473b64710c28af5a160b2a8927d", - "sha256:5463c47c08630007dc0fe99fb480ea4f34a89712410592380425a9b4e1611d8e", - "sha256:5c45a639e93a0c5d4b788b2613bd637468edd62f8f95ebc6fcc303d58ab3f0a8", - "sha256:6031b25fb1b06327b43d841f33842b383beba399884f8228a6bb3df3088485ff", - "sha256:607345bd5912aacc0c5a63d45a1f73fef29e697884f7e861094e443187c02be5", - "sha256:618916f5535784960f3ecf8111581f4ad31d347c3de66d02e728de460a46303c", - "sha256:636a15acc588f70fda1661234761f9ed9ad79ebed3f2125d44be0862708b666e", - "sha256:673fdbbf668dd958eff750e500495ef3f611e2ecc209464f661bc82e9838991e", - "sha256:6afd80f6c79893cfc0574956f78a0add8c76e3696f2d6a15bca2c66c415cf2d4", - "sha256:6b5ff7e1d63a8281654b5e2896d7f08799378e594f09cf3674e832ecaf396ce8", - "sha256:6c4c4c3f878df21faf5fac86eda32671c27889e13570645a9eea0a1abdd50922", - "sha256:6cd8098517c64a85e790657e7b1e509b9fe07487fd358e19431cb120f7d96338", - "sha256:6d1e42d2735d437e7e80bab4d78eb2e459af48c0a46e686ea35f690b93db792d", - "sha256:6e30ac5e329098903262dc5bdd7e2086e0256aa762cc8b744f9e7bf2a427d3f8", - "sha256:70a838f7754483bcdc830444952fd89645569e7452e3226de4a613a4c1793fb2", - "sha256:720edcb916df872d80f80a1cc5ea9058300b97721efda8651efcd938a9c70a72", - "sha256:732672fbc449bab754e0b15356c077cc31566df874964d4801ab14f71951ea80", - "sha256:740884bc62a5e2bbb31e584f5d23b32320fd75d79f916f15a788d527a5e83644", - "sha256:7700936ef9d006b7ef605dc53aa364da2de5a3aa65516a1f3ce73bf82ecfc7ae", - "sha256:7732770412bab81c5a9f6d20aeb60ae943a9b36dcd990d876a773526468e7163", - "sha256:7750569d9526199c5b97e5a9f8d96a13300950d910cf04a861d96f4273d5b104", - "sha256:7f1944ce16401aad1e3f7d312247b3d5de7981f634dc9dfe90da72b87d37887d", - "sha256:81c5196a790032e0fc2464c0b4ab95f8610f96f1f2fa3d4deacce6a79852da60", - "sha256:8352f48d511de5f973e4f2f9412736d7dea76c69faa6d36bcf885b50c758ab9a", - "sha256:8927638a4d4137a289e41d0fd631551e89fa346d6dbcfc31ad627557d03ceb6d", - "sha256:8c7672e9fba7425f79019db9945b16e308ed8bc89348c23d955c8c0540da0a07", - "sha256:8d2e182c9ee01135e11e9676e9a62dfad791a7a467738f06726872374a83db49", - "sha256:910e71711d1055b2768181efa0a17537b2622afeb0424116619817007f8a2b10", - "sha256:942695a206a58d2575033ff1e42b12b2aece98d6003c6bc739fbf33d1773b12f", - "sha256:9437ca26784120a279f3137ee080b0e717012c42921eb07861b412340f85bae2", - "sha256:967342e045564cef76dfcf1edb700b1e20838d83b1aa02ab313e6a497cf923b8", - "sha256:998125738de0158f088aef3cb264a34251908dd2e5d9966774fdab7402edfab7", - "sha256:9e6934d70dc50f9f8ea47081ceafdec09245fd9f6032669c3b45705dea096b88", - "sha256:a3d456ff2a6a4d2adcdf3c1c960a36f4fd2fec6e3b4902a42a384d17cf4e7a65", - "sha256:a7b28c5b066bca9a4eb4e2f2663012debe680f097979d880657f00e1c30875a0", - "sha256:a888e8bdb45916234b99da2d859566f1e8a1d2275a801bb8e4a9644e3c7e7909", - "sha256:aa3679e751408d75a0b4d8d26d6647b6d9326f5e35c00a7ccd82b78ef64f65f8", - "sha256:aaa71ee43a703c321906813bb252f69524f02aa05bf4eec85f0c41d5d62d0f4c", - "sha256:b646bf655b135ccf4522ed43d6902af37d3f5dbcf0da66c769a2b3938b9d8184", - "sha256:b906b5f58892813e5ba5c6056d6a5ad08f358ba49f046d910ad992196ea61397", - "sha256:b9bb1f182a97880f6078283b3505a707057c42bf55d8fca604f70dedfdc0772a", - "sha256:bd1105b50ede37461c1d51b9698c4f4be6e13e69a908ab7751e3807985fc0346", - "sha256:bf18932d0003c8c4d51a39f244231986ab23ee057d235a12b2684ea26a353590", - "sha256:c273e795e7a0f1fddd46e1e3cb8be15634c29ae8ff31c196debb620e1edb9333", - "sha256:c69882964516dc143083d3795cb508e806b09fc3800fd0d4cddc1df6c36e76bb", - "sha256:c827576e2fa017a081346dce87d532a5310241648eb3700af9a571a6e9fc7e74", - "sha256:cbfbea39ba64f5e53ae2915de36f130588bba71245b418060ec3330ebf85678e", - "sha256:ce0bb20e3a11bd04461324a6a798af34d503f8d6f1aa3d2aa8901ceaf039176d", - "sha256:d0cee71bc618cd93716f3c1bf56653740d2d13ddbd47673efa8bf41435a60daa", - "sha256:d21be4770ff4e08698e1e8e0bce06edb6ea0626e7c8f560bc08222880aca6a6f", - "sha256:d31dea506d718693b6b2cffc0648a8929bdc51c70a311b2770f09611caa10d53", - "sha256:d44607f98caa2961bab4fa3c4309724b185b464cdc3ba6f3d7340bac3ec97cc1", - "sha256:d58ad6317d188c43750cb76e9deacf6051d0f884d87dc6518e0280438648a9ac", - "sha256:d70129cef4a8d979caa37e7fe957202e7eee8ea02c5e16455bc9808a59c6b2f0", - "sha256:d85164315bd68c0806768dc6bb0429c6f95c354f87485ee3593c4f6b14def2bd", - "sha256:d960de62227635d2e61068f42a6cb6aae91a7fe00fca0e3aeed17667c8a34611", - "sha256:dc48b479d540770c811fbd1eb9ba2bb66951863e448efec2e2c102625328e92f", - "sha256:e1735502458621921cee039c47318cb90b51d532c2766593be6207eec53e5c4c", - "sha256:e2be6e9dd4111d5b31ba3b74d17da54a8319d8168890fbaea4b9e5c3de630ae5", - "sha256:e4c39ad2f512b4041343ea3c7894339e4ca7839ac38ca83d68a832fc8b3748ab", - "sha256:ed402d6153c5d519a0faf1bb69898e97fb31613b49da27a84a13935ea9164dfc", - "sha256:ee17cd26b97d537af8f33635ef38be873073d516fd425e80559f4585a7b90c43", - "sha256:f3027be483868c99b4985fda802a57a67fdf30c5d9a50338d9db646d590198da", - "sha256:f5bab211605d91db0e2995a17b5c6ee5edec1270e46223e513eaa20da20076ac", - "sha256:f6f8e3fecca256fefc91bb6765a693d96692459d7d4c644660a9fff32e517843", - "sha256:f7afbfee1157e0f9376c00bb232e80a60e59ed716e3211a80cb8506550671e6e", - "sha256:fa242ac1ff583e4ec7771141606aafc92b361cd90a05c30d93e343a0c2d82a89", - "sha256:fab6ce90574645a0d6c58890e9bcaac8d94dff54fb51c69e5522a7358b80ab64" + "sha256:06db23d43f26478303e954c34c75182356ca9aa7797d22c5345b16871ab9c45c", + "sha256:0e13e6952ef264c40587d510ad676a988df19adea20444c2b295e536457bc585", + "sha256:11ef6ce74616342888b69878d45e9f779b95d4bd48b382a229fe624a409b72c5", + "sha256:1259c7b3705ac0a0bd38197565a5d603218591d3f6cee6e614e380b6ba61c6f6", + "sha256:18d7585c463087bddcfa74c2ba267339f14f2515158ac4db30b1f9cbdb62c8ef", + "sha256:1e0f80b739e5a8f54837be5d5c924483996b603d5502bfff79bf33da06164ee2", + "sha256:1e5f3cd7397c8f86c8cc72d5a791071431c108edd79872cdd96e00abd8497d29", + "sha256:220002c1b846db9afd83371d08d239fdc865e8f8c5795bbaec20916a76db3318", + "sha256:22e6c9976e38f4d8c4a63bd8a8edac5307dffd3ee7e6026d97f3cc3a2dc02a0b", + "sha256:238a2d5b1cad28cdc6ed15faf93a998336eb041c4e440dd7f902528b8891b399", + "sha256:2580b0c34583b85efec8c5c5ec9edf2dfe817330cc882ee972ae650e7b5ef739", + "sha256:28527c685f237c05445efec62426d285e47a58fb05ba0090a4340b73ecda6dee", + "sha256:2cf126d33a91ee6eedc7f3197b53e87a2acdac63602c0f03a02dd69e4b138174", + "sha256:338ca4539aad4ce70a656e5187a3a31c5204f261aef9f6ab50e50bcdffaf050a", + "sha256:39ed0d010457a78f54090fafb5d108501b5aa5604cc22408fc1c0c77eac14344", + "sha256:3ad0fda1635f8439cde85c700f964b23ed5fc2d28016b32b9ee5fe30da5c84e2", + "sha256:3d2b1ad682a3dfda2a4e8ad8572f3100f95fad98cb99faf37ff0ddfe9cbf9d03", + "sha256:3d61339e9f84a3f0767b1995adfb171a0d00a1185192718a17af6e124728e0f5", + "sha256:3fde368e9140312b6e8b6c09fb9f8c8c2f00999d1823403ae90cc00480221b22", + "sha256:40ce74fc86ee4645d0a225498d091d8bc61f39b709ebef8204cb8b5a464d3c0e", + "sha256:49a8063ea4296b3a7e81a5dfb8f7b2d73f0b1c20c2af401fb0cdf22e14711a96", + "sha256:4a1f1d51eccb7e6c32ae89243cb352389228ea62f89cd80823ea7dd1b98e0b91", + "sha256:4b16aa0107ecb512b568244ef461f27697164d9a68d8b35090e9b0c1c8b27752", + "sha256:4f1ed4749a08379555cebf4650453f14452eaa9c43d0a95c49db50c18b7da075", + "sha256:4fe84294c7019456e56d93e8ababdad5a329cd25975be749c3f5f558abb48253", + "sha256:50eccbf054e62a7b2209b28dc7a22d6254860209d6753e6b78cfaeb0075d7bee", + "sha256:514b3293b64187172bc77c8fb0cdae26981618021053b30d8371c3a902d4d5ad", + "sha256:54b43a2b07db18314669092bb2de584524d1ef414588780261e31e85846c26a5", + "sha256:55fea87029cded5df854ca7e192ec7bdb7ecd1d9a3f63d5c4eb09148acf4a7ce", + "sha256:569b3ea770c2717b730b61998b6c54996adee3cef69fc28d444f3e7920313cf7", + "sha256:56e27147a5a4c2c21633ff8475d185734c0e4befd1c989b5b95a5d0db699b21b", + "sha256:57eb94a8c16ab08fef6404301c38318e2c5a32216bf5de453e2714c964c125c8", + "sha256:5a35df9f5548fd79cb2f52d27182108c3e6641a4feb0f39067911bf2adaa3e57", + "sha256:5a8c94dad2e45324fc74dce25e1645d4d14df9a4e54a30fa0ae8bad9a63928e3", + "sha256:5b4f105deeffa28bbcdff6c49b34e74903139afa690e35d2d9e3c2c2fba18cec", + "sha256:5c1dc0f53856b9cc9a0ccca0a7cc61d3d20a7088201c0937f3f4048c1718a209", + "sha256:614fdafe9f5f19c63ea02817fa4861c606a59a604a77c8cdef5aa01d28b97921", + "sha256:617c7357272c67696fd052811e352ac54ed1d9b49ab370261a80d3b6ce385045", + "sha256:65794e4048ee837494aea3c21a28ad5fc080994dfba5b036cf84de37f7ad5074", + "sha256:6632f2d04f15d1bd6fe0eedd3b86d9061b836ddca4c03d5cf5c7e9e6b7c14580", + "sha256:6c8ef2ebf76df43f5750b46851ed1cdf8f109d7787ca40035fe19fbdc1acc5a7", + "sha256:758406267907b3781beee0f0edfe4a179fbd97c0be2e9b1154d7f0a1279cf8e5", + "sha256:7e60cb630f674a31f0368ed32b2a6b4331b8350d67de53c0359992444b116dd3", + "sha256:89c19a494bf3ad08c1da49445cc5d13d8fefc265f48ee7e7556839acdacf69d0", + "sha256:8a86a9b96070674fc88b6f9f71a97d2c1d3e5165574615d1f9168ecba4cecb24", + "sha256:8bc7690f7caee50b04a79bf017a8d020c1f48c2a1077ffe172abec59870f1139", + "sha256:8d7919548df3f25374a1f5d01fbcd38dacab338ef5f33e044744b5c36729c8db", + "sha256:9426133526f69fcaba6e42146b4e12d6bc6c839b8b555097020e2b78ce908dcc", + "sha256:9824fb430c9cf9af743cf7aaf6707bf14323fb51ee74425c380f4c846ea70789", + "sha256:9bb4a0d90fdb03437c109a17eade42dfbf6190408f29b2744114d11586611d6f", + "sha256:9bc2d153989e3216b0559251b0c260cfd168ec78b1fac33dd485750a228db5a2", + "sha256:9d35cef91e59ebbeaa45214861874bc6f19eb35de96db73e467a8358d701a96c", + "sha256:a1862d2d7ce1674cffa6d186d53ca95c6e17ed2b06b3f4c476173565c862d232", + "sha256:a84ab91cbe7aab97f7446652d0ed37d35b68a465aeef8fc41932a9d7eee2c1a6", + "sha256:aa7f429242aae2947246587d2964fad750b79e8c233a2367f71b554e9447949c", + "sha256:aa9a0521aeca7d4941499a73ad7d4f8ffa3d1affc50b9ea11d992cd7eff18a29", + "sha256:ac2f4f7a98934c2ed6505aead07b979e6f999389f16b714448fb39bbaa86a489", + "sha256:ae94bd0b2f02c28e199e9bc51485d0c5601f58780636185660f86bf80c89af94", + "sha256:af0fc424a5842a11e28956e69395fbbeab2c97c42253169d87e90aac2886d751", + "sha256:b2a5db5397d82fa847e4c624b0c98fe59d2d9b7cf0ce6de09e4d2e80f8f5b3f2", + "sha256:b4c29cbbba378759ac5786730d1c3cb4ec6f8ababf5c42a9ce303dc4b3d08cda", + "sha256:b74b25f024b421d5859d156750ea9a65651793d51b76a2e9238c05c9d5f203a9", + "sha256:b7f19250ceef892adf27f0399b9e5afad019288e9be756d6919cb58892129f51", + "sha256:b80d4a7900cf6b66bb9cee5c352b2d708e29e5a37fe9bf784fa97fc11504bf6c", + "sha256:b8c00a3b1e70c1d3891f0db1b05292747f0dbcfb49c43f9244d04c70fbc40eb8", + "sha256:bb273176be34a746bdac0b0d7e4e2c467323d13640b736c4c477881a3220a989", + "sha256:c3c20f0ddeb6e29126d45f89206b8291352b8c5b44384e78a6499d68b52ae511", + "sha256:c3e130fd0ec56cb76eb49ef52faead8ff09d13f4527e9b0c400307ff72b408e1", + "sha256:c52d3f2f82b763a24ef52f5d24358553e8403ce05f893b5347098014f2d9eff2", + "sha256:c6377e647bbfd0a0b159fe557f2c6c602c159fc752fa316572f012fc0bf67150", + "sha256:c638144ce971df84650d3ed0096e2ae7af8e62ecbbb7b201c8935c370df00a2c", + "sha256:ce9845054c13696f7af7f2b353e6b4f676dab1b4b215d7fe5e05c6f8bb06f965", + "sha256:cf258ede5bc22a45c8e726b29835b9303c285ab46fc7c3a4cc770736b5304c9f", + "sha256:d0a26ffe9d4dd35e4dfdd1e71f46401cff0181c75ac174711ccff0459135fa58", + "sha256:d0b67d87bb45ed1cd020e8fbf2307d449b68abc45402fe1a4ac9e46c3c8b192b", + "sha256:d20277fd62e1b992a50c43f13fbe13277a31f8c9f70d59759c88f644d66c619f", + "sha256:d454b8749b4bd70dd0a79f428731ee263fa6995f83ccb8bada706e8d1d3ff89d", + "sha256:d4c7d1a051eeb39f5c9547e82ea27cbcc28338482242e3e0b7768033cb083821", + "sha256:d72278a30111e5b5525c1dd96120d9e958464316f55adb030433ea905866f4de", + "sha256:d72a210824facfdaf8768cf2d7ca25a042c30320b3020de2fa04640920d4e121", + "sha256:d807dc2051abe041b6649681dce568f8e10668e3c1c6543ebae58f2d7e617855", + "sha256:dbe982f38565bb50cb7fb061ebf762c2f254ca3d8c20d4006878766e84266272", + "sha256:dcedf0b42bcb4cfff4101d7771a10532415a6106062f005ab97d1d0ab5681c60", + "sha256:deb62214c42a261cb3eb04d474f7155279c1a8a8c30ac89b7dcb1721d92c3c02", + "sha256:def7400461c3a3f26e49078302e1c1b38f6752342c77e3cf72ce91ca69fb1bc1", + "sha256:df3de6b7726b52966edf29663e57306b23ef775faf0ac01a3e9f4012a24a4140", + "sha256:e1940dae14e715e2e02dfd5b0f64a52e8374a517a1e531ad9412319dc3ac7879", + "sha256:e4df1e3b3bec320790f699890d41c59d250f6beda159ea3c44c3f5bac1976940", + "sha256:e6900ecdd50ce0facf703f7a00df12374b74bbc8ad9fe0f6559947fb20f82364", + "sha256:ea438162a9fcbee3ecf36c23e6c68237479f89f962f82dae83dc15feeceb37e4", + "sha256:eb851b7df9dda52dc1415ebee12362047ce771fc36914586b2e9fcbd7d293b3e", + "sha256:ec31a99ca63bf3cd7f1a5ac9fe95c5e2d060d3c768a09bc1d16e235840861420", + "sha256:f0475242f447cc6cb8a9dd486d68b2ef7fbee84427124c232bff5f63b1fe11e5", + "sha256:f2fbf7db2012d4876fb0d66b5b9ba6591197b0f165db8d99371d976546472a24", + "sha256:f60012a73aa396be721558caa3a6fd49b3dd0033d1675c6d59c4502e870fcf0c", + "sha256:f8e604fe73ba048c06085beaf51147eaec7df856824bfe7b98657cf436623daf", + "sha256:f90a4cd061914a60bd51c68bcb4357086991bd0bb93d8aa66a6da7701370708f", + "sha256:f918a1a130a6dfe1d7fe0f105064141342e7dd1611f2e6a21cd2f5c8cb1cfb3e", + "sha256:fa518bcd7600c584bf42e6617ee8132869e877db2f76bcdc281ec6a4113a53ab", + "sha256:faefcc78f53a88f3076b7f8be0a8f8d35133a3ecf7f3770895c25f8813460f08", + "sha256:fcaeb7b57f1a1e071ebd748984359fef83ecb026325b9d4ca847c95bc7311c92", + "sha256:fd2d84f40633bc475ef2d5490b9c19543fbf18596dcb1b291e3a12ea5d722f7a", + "sha256:fdfc3a892927458d98f3d55428ae46b921d1f7543b89382fdb483f5640daaec8" ], "markers": "python_version >= '3.8'", - "version": "==0.18.1" + "version": "==0.20.0" }, "six": { "hashes": [ @@ -1273,58 +1347,58 @@ }, "sqlalchemy": { "hashes": [ - "sha256:0b0f658414ee4e4b8cbcd4a9bb0fd743c5eeb81fc858ca517217a8013d282c96", - "sha256:2196208432deebdfe3b22185d46b08f00ac9d7b01284e168c212919891289396", - "sha256:23b9fbb2f5dd9e630db70fbe47d963c7779e9c81830869bd7d137c2dc1ad05fb", - "sha256:26a6a9837589c42b16693cf7bf836f5d42218f44d198f9343dd71d3164ceeeac", - "sha256:2a21c97efcbb9f255d5c12a96ae14da873233597dfd00a3a0c4ce5b3e5e79704", - "sha256:2e2c38c2a4c5c634fe6c3c58a789712719fa1bf9b9d6ff5ebfce9a9e5b89c1ca", - "sha256:2fc47dc6185a83c8100b37acda27658fe4dbd33b7d5e7324111f6521008ab4fe", - "sha256:2fd17e3bb8058359fa61248c52c7b09a97cf3c820e54207a50af529876451808", - "sha256:352b2770097f41bff6029b280c0e03b217c2dcaddc40726f8f53ed58d8a85da4", - "sha256:3b74570d99126992d4b0f91fb87c586a574a5872651185de8297c6f90055ae42", - "sha256:3cb8a66b167b033ec72c3812ffc8441d4e9f5f78f5e31e54dcd4c90a4ca5bebc", - "sha256:3f9faef422cfbb8fd53716cd14ba95e2ef655400235c3dfad1b5f467ba179c8c", - "sha256:4b600e9a212ed59355813becbcf282cfda5c93678e15c25a0ef896b354423238", - "sha256:501ff052229cb79dd4c49c402f6cb03b5a40ae4771efc8bb2bfac9f6c3d3508f", - "sha256:56d51ae825d20d604583f82c9527d285e9e6d14f9a5516463d9705dab20c3740", - "sha256:597fec37c382a5442ffd471f66ce12d07d91b281fd474289356b1a0041bdf31d", - "sha256:5a48ac4d359f058474fadc2115f78a5cdac9988d4f99eae44917f36aa1476327", - "sha256:5b6cf796d9fcc9b37011d3f9936189b3c8074a02a4ed0c0fbbc126772c31a6d4", - "sha256:66f63278db425838b3c2b1c596654b31939427016ba030e951b292e32b99553e", - "sha256:69f3e3c08867a8e4856e92d7afb618b95cdee18e0bc1647b77599722c9a28911", - "sha256:6e2622844551945db81c26a02f27d94145b561f9d4b0c39ce7bfd2fda5776dac", - "sha256:6f77c4f042ad493cb8595e2f503c7a4fe44cd7bd59c7582fd6d78d7e7b8ec52c", - "sha256:74afabeeff415e35525bf7a4ecdab015f00e06456166a2eba7590e49f8db940e", - "sha256:750900a471d39a7eeba57580b11983030517a1f512c2cb287d5ad0fcf3aebd58", - "sha256:78fe11dbe37d92667c2c6e74379f75746dc947ee505555a0197cfba9a6d4f1a4", - "sha256:79a40771363c5e9f3a77f0e28b3302801db08040928146e6808b5b7a40749c88", - "sha256:7bd112be780928c7f493c1a192cd8c5fc2a2a7b52b790bc5a84203fb4381c6be", - "sha256:8a41514c1a779e2aa9a19f67aaadeb5cbddf0b2b508843fcd7bafdf4c6864005", - "sha256:9f2bee229715b6366f86a95d497c347c22ddffa2c7c96143b59a2aa5cc9eebbc", - "sha256:9fea3d0884e82d1e33226935dac990b967bef21315cbcc894605db3441347443", - "sha256:afb6dde6c11ea4525318e279cd93c8734b795ac8bb5dda0eedd9ebaca7fa23f1", - "sha256:b607489dd4a54de56984a0c7656247504bd5523d9d0ba799aef59d4add009484", - "sha256:b6e22630e89f0e8c12332b2b4c282cb01cf4da0d26795b7eae16702a608e7ca1", - "sha256:b9c01990d9015df2c6f818aa8f4297d42ee71c9502026bb074e713d496e26b67", - "sha256:bd15026f77420eb2b324dcb93551ad9c5f22fab2c150c286ef1dc1160f110203", - "sha256:c06fb43a51ccdff3b4006aafee9fcf15f63f23c580675f7734245ceb6b6a9e05", - "sha256:c76c81c52e1e08f12f4b6a07af2b96b9b15ea67ccdd40ae17019f1c373faa227", - "sha256:ccaf1b0c90435b6e430f5dd30a5aede4764942a695552eb3a4ab74ed63c5b8d3", - "sha256:cd1591329333daf94467e699e11015d9c944f44c94d2091f4ac493ced0119449", - "sha256:cd5b94d4819c0c89280b7c6109c7b788a576084bf0a480ae17c227b0bc41e109", - "sha256:d337bf94052856d1b330d5fcad44582a30c532a2463776e1651bd3294ee7e58b", - "sha256:dc251477eae03c20fae8db9c1c23ea2ebc47331bcd73927cdcaecd02af98d3c3", - "sha256:dc6d69f8829712a4fd799d2ac8d79bdeff651c2301b081fd5d3fe697bd5b4ab9", - "sha256:f2a213c1b699d3f5768a7272de720387ae0122f1becf0901ed6eaa1abd1baf6c", - "sha256:f3ad7f221d8a69d32d197e5968d798217a4feebe30144986af71ada8c548e9fa", - "sha256:f43e93057cf52a227eda401251c72b6fbe4756f35fa6bfebb5d73b86881e59b0", - "sha256:f68470edd70c3ac3b6cd5c2a22a8daf18415203ca1b036aaeb9b0fb6f54e8298", - "sha256:fa4b1af3e619b5b0b435e333f3967612db06351217c58bfb50cee5f003db2a5a", - "sha256:fc6b14e8602f59c6ba893980bea96571dd0ed83d8ebb9c4479d9ed5425d562e9" + "sha256:10d8f36990dd929690666679b0f42235c159a7051534adb135728ee52828dd22", + "sha256:13be2cc683b76977a700948411a94c67ad8faf542fa7da2a4b167f2244781cf3", + "sha256:165bbe0b376541092bf49542bd9827b048357f4623486096fc9aaa6d4e7c59a2", + "sha256:173f5f122d2e1bff8fbd9f7811b7942bead1f5e9f371cdf9e670b327e6703ebd", + "sha256:196958cde924a00488e3e83ff917be3b73cd4ed8352bbc0f2989333176d1c54d", + "sha256:203d46bddeaa7982f9c3cc693e5bc93db476ab5de9d4b4640d5c99ff219bee8c", + "sha256:220574e78ad986aea8e81ac68821e47ea9202b7e44f251b7ed8c66d9ae3f4278", + "sha256:243f92596f4fd4c8bd30ab8e8dd5965afe226363d75cab2468f2c707f64cd83b", + "sha256:24af3dc43568f3780b7e1e57c49b41d98b2d940c1fd2e62d65d3928b6f95f021", + "sha256:25691f4adfb9d5e796fd48bf1432272f95f4bbe5f89c475a788f31232ea6afba", + "sha256:2e6965346fc1491a566e019a4a1d3dfc081ce7ac1a736536367ca305da6472a8", + "sha256:3166dfff2d16fe9be3241ee60ece6fcb01cf8e74dd7c5e0b64f8e19fab44911b", + "sha256:413c85cd0177c23e32dee6898c67a5f49296640041d98fddb2c40888fe4daa2e", + "sha256:430093fce0efc7941d911d34f75a70084f12f6ca5c15d19595c18753edb7c33b", + "sha256:43f28005141165edd11fbbf1541c920bd29e167b8bbc1fb410d4fe2269c1667a", + "sha256:526ce723265643dbc4c7efb54f56648cc30e7abe20f387d763364b3ce7506c82", + "sha256:53e68b091492c8ed2bd0141e00ad3089bcc6bf0e6ec4142ad6505b4afe64163e", + "sha256:5bc08e75ed11693ecb648b7a0a4ed80da6d10845e44be0c98c03f2f880b68ff4", + "sha256:6831a78bbd3c40f909b3e5233f87341f12d0b34a58f14115c9e94b4cdaf726d3", + "sha256:6a1e03db964e9d32f112bae36f0cc1dcd1988d096cfd75d6a588a3c3def9ab2b", + "sha256:6daeb8382d0df526372abd9cb795c992e18eed25ef2c43afe518c73f8cccb721", + "sha256:6e7cde3a2221aa89247944cafb1b26616380e30c63e37ed19ff0bba5e968688d", + "sha256:707c8f44931a4facd4149b52b75b80544a8d824162602b8cd2fe788207307f9a", + "sha256:7286c353ee6475613d8beff83167374006c6b3e3f0e6491bfe8ca610eb1dec0f", + "sha256:79cb400c360c7c210097b147c16a9e4c14688a6402445ac848f296ade6283bbc", + "sha256:7cee4c6917857fd6121ed84f56d1dc78eb1d0e87f845ab5a568aba73e78adf83", + "sha256:80bd73ea335203b125cf1d8e50fef06be709619eb6ab9e7b891ea34b5baa2287", + "sha256:895184dfef8708e15f7516bd930bda7e50ead069280d2ce09ba11781b630a434", + "sha256:8fddde2368e777ea2a4891a3fb4341e910a056be0bb15303bf1b92f073b80c02", + "sha256:95d0b2cf8791ab5fb9e3aa3d9a79a0d5d51f55b6357eecf532a120ba3b5524db", + "sha256:9661268415f450c95f72f0ac1217cc6f10256f860eed85c2ae32e75b60278ad8", + "sha256:97b850f73f8abbffb66ccbab6e55a195a0eb655e5dc74624d15cff4bfb35bd74", + "sha256:9ea54f7300553af0a2a7235e9b85f4204e1fc21848f917a3213b0e0818de9a24", + "sha256:9ebc11c54c6ecdd07bb4efbfa1554538982f5432dfb8456958b6d46b9f834bb7", + "sha256:a17d8fac6df9835d8e2b4c5523666e7051d0897a93756518a1fe101c7f47f2f0", + "sha256:ae92bebca3b1e6bd203494e5ef919a60fb6dfe4d9a47ed2453211d3bd451b9f5", + "sha256:b68094b165a9e930aedef90725a8fcfafe9ef95370cbb54abc0464062dbf808f", + "sha256:b75b00083e7fe6621ce13cfce9d4469c4774e55e8e9d38c305b37f13cf1e874c", + "sha256:bcd18441a49499bf5528deaa9dee1f5c01ca491fc2791b13604e8f972877f812", + "sha256:bd90c221ed4e60ac9d476db967f436cfcecbd4ef744537c0f2d5291439848768", + "sha256:c29d03e0adf3cc1a8c3ec62d176824972ae29b67a66cbb18daff3062acc6faa8", + "sha256:c3330415cd387d2b88600e8e26b510d0370db9b7eaf984354a43e19c40df2e2b", + "sha256:c7db3db284a0edaebe87f8f6642c2b2c27ed85c3e70064b84d1c9e4ec06d5d84", + "sha256:ce119fc4ce0d64124d37f66a6f2a584fddc3c5001755f8a49f1ca0a177ef9796", + "sha256:dbcdf987f3aceef9763b6d7b1fd3e4ee210ddd26cac421d78b3c206d07b2700b", + "sha256:e54ef33ea80d464c3dcfe881eb00ad5921b60f8115ea1a30d781653edc2fd6a2", + "sha256:e60ed6ef0a35c6b76b7640fe452d0e47acc832ccbb8475de549a5cc5f90c2c06", + "sha256:fb1b30f31a36c7f3fee848391ff77eebdd3af5750bf95fbf9b8b5323edfdb4ec", + "sha256:fbb034f565ecbe6c530dff948239377ba859420d146d5f62f0271407ffb8c580" ], "markers": "python_version >= '3.7'", - "version": "==2.0.31" + "version": "==2.0.34" }, "sqlalchemy-utils": { "hashes": [ @@ -1332,6 +1406,7 @@ "sha256:bc599c8c3b3319e53ce6c5c3c471120bd325d0071fb6f38a10e924e3d07b9990" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==0.41.2" }, "testcontainers-core": { @@ -1346,6 +1421,7 @@ "sha256:0bdf270b5b7f53915832f7c31dd2bd3ffdc20b534ea6b32231cc7003049bd0e1" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==0.0.1rc1" }, "tinydb": { @@ -1382,19 +1458,19 @@ }, "urllib3": { "hashes": [ - "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472", - "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168" + "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", + "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9" ], "markers": "python_version >= '3.10'", - "version": "==2.2.2" + "version": "==2.2.3" }, "werkzeug": { "hashes": [ - "sha256:097e5bfda9f0aba8da6b8545146def481d06aa7d3266e7448e2cccf67dd8bd18", - "sha256:fc9645dc43e03e4d630d23143a04a7f947a9a3b5727cd535fdfe155a17cc48c8" + "sha256:02c9eb92b7d6c06f31a782811505d2157837cea66aaede3e217c7c27c039476c", + "sha256:34f2371506b250df4d4f84bfe7b0921e4762525762bbd936614909fe25cd7306" ], "markers": "python_version >= '3.8'", - "version": "==3.0.3" + "version": "==3.0.4" }, "wrapt": { "hashes": [ @@ -1474,159 +1550,182 @@ }, "yarl": { "hashes": [ - "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51", - "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce", - "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559", - "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0", - "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81", - "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc", - "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4", - "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c", - "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130", - "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136", - "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e", - "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec", - "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7", - "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1", - "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455", - "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099", - "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129", - "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10", - "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142", - "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98", - "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa", - "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7", - "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525", - "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c", - "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9", - "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c", - "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8", - "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b", - "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf", - "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23", - "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd", - "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27", - "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f", - "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece", - "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434", - "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec", - "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff", - "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78", - "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d", - "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863", - "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53", - "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31", - "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15", - "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5", - "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b", - "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57", - "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3", - "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1", - "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f", - "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad", - "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c", - "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7", - "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2", - "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b", - "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2", - "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b", - "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9", - "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be", - "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e", - "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984", - "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4", - "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074", - "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2", - "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392", - "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91", - "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541", - "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf", - "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572", - "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66", - "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575", - "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14", - "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5", - "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1", - "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e", - "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551", - "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17", - "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead", - "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0", - "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe", - "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234", - "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0", - "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7", - "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34", - "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42", - "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385", - "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78", - "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be", - "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958", - "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749", - "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec" + "sha256:01a8697ec24f17c349c4f655763c4db70eebc56a5f82995e5e26e837c6eb0e49", + "sha256:02da8759b47d964f9173c8675710720b468aa1c1693be0c9c64abb9d8d9a4867", + "sha256:04293941646647b3bfb1719d1d11ff1028e9c30199509a844da3c0f5919dc520", + "sha256:067b961853c8e62725ff2893226fef3d0da060656a9827f3f520fb1d19b2b68a", + "sha256:077da604852be488c9a05a524068cdae1e972b7dc02438161c32420fb4ec5e14", + "sha256:09696438cb43ea6f9492ef237761b043f9179f455f405279e609f2bc9100212a", + "sha256:0b8486f322d8f6a38539136a22c55f94d269addb24db5cb6f61adc61eabc9d93", + "sha256:0ea9682124fc062e3d931c6911934a678cb28453f957ddccf51f568c2f2b5e05", + "sha256:0f351fa31234699d6084ff98283cb1e852270fe9e250a3b3bf7804eb493bd937", + "sha256:14438dfc5015661f75f85bc5adad0743678eefee266ff0c9a8e32969d5d69f74", + "sha256:15061ce6584ece023457fb8b7a7a69ec40bf7114d781a8c4f5dcd68e28b5c53b", + "sha256:15439f3c5c72686b6c3ff235279630d08936ace67d0fe5c8d5bbc3ef06f5a420", + "sha256:17b5a386d0d36fb828e2fb3ef08c8829c1ebf977eef88e5367d1c8c94b454639", + "sha256:18ac56c9dd70941ecad42b5a906820824ca72ff84ad6fa18db33c2537ae2e089", + "sha256:1bb2d9e212fb7449b8fb73bc461b51eaa17cc8430b4a87d87be7b25052d92f53", + "sha256:1e969fa4c1e0b1a391f3fcbcb9ec31e84440253325b534519be0d28f4b6b533e", + "sha256:1fa2e7a406fbd45b61b4433e3aa254a2c3e14c4b3186f6e952d08a730807fa0c", + "sha256:2164cd9725092761fed26f299e3f276bb4b537ca58e6ff6b252eae9631b5c96e", + "sha256:21a7c12321436b066c11ec19c7e3cb9aec18884fe0d5b25d03d756a9e654edfe", + "sha256:238a21849dd7554cb4d25a14ffbfa0ef380bb7ba201f45b144a14454a72ffa5a", + "sha256:250e888fa62d73e721f3041e3a9abf427788a1934b426b45e1b92f62c1f68366", + "sha256:25861303e0be76b60fddc1250ec5986c42f0a5c0c50ff57cc30b1be199c00e63", + "sha256:267b24f891e74eccbdff42241c5fb4f974de2d6271dcc7d7e0c9ae1079a560d9", + "sha256:27fcb271a41b746bd0e2a92182df507e1c204759f460ff784ca614e12dd85145", + "sha256:2909fa3a7d249ef64eeb2faa04b7957e34fefb6ec9966506312349ed8a7e77bf", + "sha256:3257978c870728a52dcce8c2902bf01f6c53b65094b457bf87b2644ee6238ddc", + "sha256:327c724b01b8641a1bf1ab3b232fb638706e50f76c0b5bf16051ab65c868fac5", + "sha256:3de5292f9f0ee285e6bd168b2a77b2a00d74cbcfa420ed078456d3023d2f6dff", + "sha256:3fce4da3703ee6048ad4138fe74619c50874afe98b1ad87b2698ef95bf92c96d", + "sha256:3ff6b1617aa39279fe18a76c8d165469c48b159931d9b48239065767ee455b2b", + "sha256:400cd42185f92de559d29eeb529e71d80dfbd2f45c36844914a4a34297ca6f00", + "sha256:4179522dc0305c3fc9782549175c8e8849252fefeb077c92a73889ccbcd508ad", + "sha256:4307d9a3417eea87715c9736d050c83e8c1904e9b7aada6ce61b46361b733d92", + "sha256:476e20c433b356e16e9a141449f25161e6b69984fb4cdbd7cd4bd54c17844998", + "sha256:489fa8bde4f1244ad6c5f6d11bb33e09cf0d1d0367edb197619c3e3fc06f3d91", + "sha256:48a28bed68ab8fb7e380775f0029a079f08a17799cb3387a65d14ace16c12e2b", + "sha256:48dfd117ab93f0129084577a07287376cc69c08138694396f305636e229caa1a", + "sha256:4973eac1e2ff63cf187073cd4e1f1148dcd119314ab79b88e1b3fad74a18c9d5", + "sha256:498442e3af2a860a663baa14fbf23fb04b0dd758039c0e7c8f91cb9279799bff", + "sha256:501c503eed2bb306638ccb60c174f856cc3246c861829ff40eaa80e2f0330367", + "sha256:504cf0d4c5e4579a51261d6091267f9fd997ef58558c4ffa7a3e1460bd2336fa", + "sha256:61a5f2c14d0a1adfdd82258f756b23a550c13ba4c86c84106be4c111a3a4e413", + "sha256:637c7ddb585a62d4469f843dac221f23eec3cbad31693b23abbc2c366ad41ff4", + "sha256:66b63c504d2ca43bf7221a1f72fbe981ff56ecb39004c70a94485d13e37ebf45", + "sha256:67459cf8cf31da0e2cbdb4b040507e535d25cfbb1604ca76396a3a66b8ba37a6", + "sha256:688654f8507464745ab563b041d1fb7dab5d9912ca6b06e61d1c4708366832f5", + "sha256:6907daa4b9d7a688063ed098c472f96e8181733c525e03e866fb5db480a424df", + "sha256:69721b8effdb588cb055cc22f7c5105ca6fdaa5aeb3ea09021d517882c4a904c", + "sha256:6d23754b9939cbab02c63434776df1170e43b09c6a517585c7ce2b3d449b7318", + "sha256:7175a87ab8f7fbde37160a15e58e138ba3b2b0e05492d7351314a250d61b1591", + "sha256:72bf26f66456baa0584eff63e44545c9f0eaed9b73cb6601b647c91f14c11f38", + "sha256:74db2ef03b442276d25951749a803ddb6e270d02dda1d1c556f6ae595a0d76a8", + "sha256:750f656832d7d3cb0c76be137ee79405cc17e792f31e0a01eee390e383b2936e", + "sha256:75e0ae31fb5ccab6eda09ba1494e87eb226dcbd2372dae96b87800e1dcc98804", + "sha256:768ecc550096b028754ea28bf90fde071c379c62c43afa574edc6f33ee5daaec", + "sha256:7d51324a04fc4b0e097ff8a153e9276c2593106a811704025bbc1d6916f45ca6", + "sha256:7e975a2211952a8a083d1b9d9ba26472981ae338e720b419eb50535de3c02870", + "sha256:8215f6f21394d1f46e222abeb06316e77ef328d628f593502d8fc2a9117bde83", + "sha256:8258c86f47e080a258993eed877d579c71da7bda26af86ce6c2d2d072c11320d", + "sha256:8418c053aeb236b20b0ab8fa6bacfc2feaaf7d4683dd96528610989c99723d5f", + "sha256:87f020d010ba80a247c4abc335fc13421037800ca20b42af5ae40e5fd75e7909", + "sha256:884eab2ce97cbaf89f264372eae58388862c33c4f551c15680dd80f53c89a269", + "sha256:8a336eaa7ee7e87cdece3cedb395c9657d227bfceb6781295cf56abcd3386a26", + "sha256:8aef1b64da41d18026632d99a06b3fefe1d08e85dd81d849fa7c96301ed22f1b", + "sha256:8aef97ba1dd2138112890ef848e17d8526fe80b21f743b4ee65947ea184f07a2", + "sha256:8ed653638ef669e0efc6fe2acb792275cb419bf9cb5c5049399f3556995f23c7", + "sha256:9361628f28f48dcf8b2f528420d4d68102f593f9c2e592bfc842f5fb337e44fd", + "sha256:946eedc12895873891aaceb39bceb484b4977f70373e0122da483f6c38faaa68", + "sha256:94d0caaa912bfcdc702a4204cd5e2bb01eb917fc4f5ea2315aa23962549561b0", + "sha256:964a428132227edff96d6f3cf261573cb0f1a60c9a764ce28cda9525f18f7786", + "sha256:999bfee0a5b7385a0af5ffb606393509cfde70ecca4f01c36985be6d33e336da", + "sha256:a08ea567c16f140af8ddc7cb58e27e9138a1386e3e6e53982abaa6f2377b38cc", + "sha256:a28b70c9e2213de425d9cba5ab2e7f7a1c8ca23a99c4b5159bf77b9c31251447", + "sha256:a34e1e30f1774fa35d37202bbeae62423e9a79d78d0874e5556a593479fdf239", + "sha256:a4264515f9117be204935cd230fb2a052dd3792789cc94c101c535d349b3dab0", + "sha256:a7915ea49b0c113641dc4d9338efa9bd66b6a9a485ffe75b9907e8573ca94b84", + "sha256:aac44097d838dda26526cffb63bdd8737a2dbdf5f2c68efb72ad83aec6673c7e", + "sha256:b91044952da03b6f95fdba398d7993dd983b64d3c31c358a4c89e3c19b6f7aef", + "sha256:ba444bdd4caa2a94456ef67a2f383710928820dd0117aae6650a4d17029fa25e", + "sha256:c2dc4250fe94d8cd864d66018f8344d4af50e3758e9d725e94fecfa27588ff82", + "sha256:c35f493b867912f6fda721a59cc7c4766d382040bdf1ddaeeaa7fa4d072f4675", + "sha256:c92261eb2ad367629dc437536463dc934030c9e7caca861cc51990fe6c565f26", + "sha256:ce928c9c6409c79e10f39604a7e214b3cb69552952fbda8d836c052832e6a979", + "sha256:d95b52fbef190ca87d8c42f49e314eace4fc52070f3dfa5f87a6594b0c1c6e46", + "sha256:dae7bd0daeb33aa3e79e72877d3d51052e8b19c9025ecf0374f542ea8ec120e4", + "sha256:e286580b6511aac7c3268a78cdb861ec739d3e5a2a53b4809faef6b49778eaff", + "sha256:e4b53f73077e839b3f89c992223f15b1d2ab314bdbdf502afdc7bb18e95eae27", + "sha256:e8f63904df26d1a66aabc141bfd258bf738b9bc7bc6bdef22713b4f5ef789a4c", + "sha256:f3a6d90cab0bdf07df8f176eae3a07127daafcf7457b997b2bf46776da2c7eb7", + "sha256:f41fa79114a1d2eddb5eea7b912d6160508f57440bd302ce96eaa384914cd265", + "sha256:f46f81501160c28d0c0b7333b4f7be8983dbbc161983b6fb814024d1b4952f79", + "sha256:f61db3b7e870914dbd9434b560075e0366771eecbe6d2b5561f5bc7485f39efd" ], - "markers": "python_version >= '3.7'", - "version": "==1.9.4" + "markers": "python_version >= '3.8'", + "version": "==1.11.1" } }, "develop": { "coverage": { "hashes": [ - "sha256:018a12985185038a5b2bcafab04ab833a9a0f2c59995b3cec07e10074c78635f", - "sha256:02ff6e898197cc1e9fa375581382b72498eb2e6d5fc0b53f03e496cfee3fac6d", - "sha256:042183de01f8b6d531e10c197f7f0315a61e8d805ab29c5f7b51a01d62782747", - "sha256:1014fbf665fef86cdfd6cb5b7371496ce35e4d2a00cda501cf9f5b9e6fced69f", - "sha256:1137f46adb28e3813dec8c01fefadcb8c614f33576f672962e323b5128d9a68d", - "sha256:16852febd96acd953b0d55fc842ce2dac1710f26729b31c80b940b9afcd9896f", - "sha256:2174e7c23e0a454ffe12267a10732c273243b4f2d50d07544a91198f05c48f47", - "sha256:2214ee920787d85db1b6a0bd9da5f8503ccc8fcd5814d90796c2f2493a2f4d2e", - "sha256:3257fdd8e574805f27bb5342b77bc65578e98cbc004a92232106344053f319ba", - "sha256:3684bc2ff328f935981847082ba4fdc950d58906a40eafa93510d1b54c08a66c", - "sha256:3a6612c99081d8d6134005b1354191e103ec9705d7ba2754e848211ac8cacc6b", - "sha256:3d7564cc09dd91b5a6001754a5b3c6ecc4aba6323baf33a12bd751036c998be4", - "sha256:44da56a2589b684813f86d07597fdf8a9c6ce77f58976727329272f5a01f99f7", - "sha256:5013ed890dc917cef2c9f765c4c6a8ae9df983cd60dbb635df8ed9f4ebc9f555", - "sha256:54317c2b806354cbb2dc7ac27e2b93f97096912cc16b18289c5d4e44fc663233", - "sha256:56b4eafa21c6c175b3ede004ca12c653a88b6f922494b023aeb1e836df953ace", - "sha256:581ea96f92bf71a5ec0974001f900db495488434a6928a2ca7f01eee20c23805", - "sha256:5cd64adedf3be66f8ccee418473c2916492d53cbafbfcff851cbec5a8454b136", - "sha256:5df54843b88901fdc2f598ac06737f03d71168fd1175728054c8f5a2739ac3e4", - "sha256:65e528e2e921ba8fd67d9055e6b9f9e34b21ebd6768ae1c1723f4ea6ace1234d", - "sha256:6aae5cce399a0f065da65c7bb1e8abd5c7a3043da9dceb429ebe1b289bc07806", - "sha256:6cfb5a4f556bb51aba274588200a46e4dd6b505fb1a5f8c5ae408222eb416f99", - "sha256:7076b4b3a5f6d2b5d7f1185fde25b1e54eb66e647a1dfef0e2c2bfaf9b4c88c8", - "sha256:73ca8fbc5bc622e54627314c1a6f1dfdd8db69788f3443e752c215f29fa87a0b", - "sha256:79b356f3dd5b26f3ad23b35c75dbdaf1f9e2450b6bcefc6d0825ea0aa3f86ca5", - "sha256:7a892be37ca35eb5019ec85402c3371b0f7cda5ab5056023a7f13da0961e60da", - "sha256:8192794d120167e2a64721d88dbd688584675e86e15d0569599257566dec9bf0", - "sha256:820bc841faa502e727a48311948e0461132a9c8baa42f6b2b84a29ced24cc078", - "sha256:8f894208794b164e6bd4bba61fc98bf6b06be4d390cf2daacfa6eca0a6d2bb4f", - "sha256:a04e990a2a41740b02d6182b498ee9796cf60eefe40cf859b016650147908029", - "sha256:a44963520b069e12789d0faea4e9fdb1e410cdc4aab89d94f7f55cbb7fef0353", - "sha256:a6bb74ed465d5fb204b2ec41d79bcd28afccf817de721e8a807d5141c3426638", - "sha256:ab73b35e8d109bffbda9a3e91c64e29fe26e03e49addf5b43d85fc426dde11f9", - "sha256:aea072a941b033813f5e4814541fc265a5c12ed9720daef11ca516aeacd3bd7f", - "sha256:b1ccf5e728ccf83acd313c89f07c22d70d6c375a9c6f339233dcf792094bcbf7", - "sha256:b385d49609f8e9efc885790a5a0e89f2e3ae042cdf12958b6034cc442de428d3", - "sha256:b3d45ff86efb129c599a3b287ae2e44c1e281ae0f9a9bad0edc202179bcc3a2e", - "sha256:b4a474f799456e0eb46d78ab07303286a84a3140e9700b9e154cfebc8f527016", - "sha256:b95c3a8cb0463ba9f77383d0fa8c9194cf91f64445a63fc26fb2327e1e1eb088", - "sha256:c5986ee7ea0795a4095ac4d113cbb3448601efca7f158ec7f7087a6c705304e4", - "sha256:cdd31315fc20868c194130de9ee6bfd99755cc9565edff98ecc12585b90be882", - "sha256:cef4649ec906ea7ea5e9e796e68b987f83fa9a718514fe147f538cfeda76d7a7", - "sha256:d05c16cf4b4c2fc880cb12ba4c9b526e9e5d5bb1d81313d4d732a5b9fe2b9d53", - "sha256:d2e344d6adc8ef81c5a233d3a57b3c7d5181f40e79e05e1c143da143ccb6377d", - "sha256:d45d3cbd94159c468b9b8c5a556e3f6b81a8d1af2a92b77320e887c3e7a5d080", - "sha256:db14f552ac38f10758ad14dd7b983dbab424e731588d300c7db25b6f89e335b5", - "sha256:dbc5958cb471e5a5af41b0ddaea96a37e74ed289535e8deca404811f6cb0bc3d", - "sha256:ddbd2f9713a79e8e7242d7c51f1929611e991d855f414ca9996c20e44a895f7c", - "sha256:e16f3d6b491c48c5ae726308e6ab1e18ee830b4cdd6913f2d7f77354b33f91c8", - "sha256:e2afe743289273209c992075a5a4913e8d007d569a406ffed0bd080ea02b0633", - "sha256:e564c2cf45d2f44a9da56f4e3a26b2236504a496eb4cb0ca7221cd4cc7a9aca9", - "sha256:ed550e7442f278af76d9d65af48069f1fb84c9f745ae249c1a183c1e9d1b025c" + "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca", + "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d", + "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6", + "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989", + "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c", + "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b", + "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223", + "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f", + "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56", + "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3", + "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8", + "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb", + "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388", + "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0", + "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a", + "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8", + "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f", + "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a", + "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962", + "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8", + "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391", + "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc", + "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2", + "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155", + "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb", + "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0", + "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c", + "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a", + "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004", + "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060", + "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232", + "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93", + "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129", + "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163", + "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de", + "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6", + "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23", + "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569", + "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d", + "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778", + "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d", + "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36", + "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a", + "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6", + "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34", + "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704", + "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106", + "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9", + "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862", + "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b", + "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255", + "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16", + "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3", + "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133", + "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb", + "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657", + "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d", + "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca", + "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36", + "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c", + "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e", + "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff", + "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7", + "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5", + "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02", + "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c", + "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df", + "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3", + "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a", + "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959", + "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234", + "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc" ], "index": "pypi", - "version": "==7.5.4" + "markers": "python_version >= '3.8'", + "version": "==7.6.1" }, "iniconfig": { "hashes": [ @@ -1654,11 +1753,12 @@ }, "pytest": { "hashes": [ - "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343", - "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977" + "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181", + "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2" ], "index": "pypi", - "version": "==8.2.2" + "markers": "python_version >= '3.8'", + "version": "==8.3.3" } } } diff --git a/dbrepo-search-service/app.py b/dbrepo-search-service/app.py index f8d7856c9b7f7c60cf9769e3ade9f800640f0b9f..d668bfae419cfd43ea13a14987e116d99d54b592 100644 --- a/dbrepo-search-service/app.py +++ b/dbrepo-search-service/app.py @@ -165,7 +165,7 @@ template = { "info": { "title": "Database Repository Search Service API", "description": "Service that searches the search database", - "version": "1.4.5", + "version": "1.4.6", "contact": { "name": "Prof. Andreas Rauber", "email": "andreas.rauber@tuwien.ac.at" @@ -177,7 +177,7 @@ template = { }, "externalDocs": { "description": "Sourcecode Documentation", - "url": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.4.5/" + "url": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.4.6/" }, "servers": [ { diff --git a/dbrepo-search-service/init/Pipfile.lock b/dbrepo-search-service/init/Pipfile.lock index 3053d901cd7867d75f24a1012a84942e21e3ebcd..4a66b436f87c23063efdb7e386eda07a9a7c83f9 100644 --- a/dbrepo-search-service/init/Pipfile.lock +++ b/dbrepo-search-service/init/Pipfile.lock @@ -16,87 +16,110 @@ ] }, "default": { + "aiohappyeyeballs": { + "hashes": [ + "sha256:55a1714f084e63d49639800f95716da97a1f173d46a16dfcfda0016abb93b6b2", + "sha256:7ce92076e249169a13c2f49320d1967425eaf1f407522d707d59cac7628d62bd" + ], + "markers": "python_version >= '3.8'", + "version": "==2.4.0" + }, "aiohttp": { "hashes": [ - "sha256:0605cc2c0088fcaae79f01c913a38611ad09ba68ff482402d3410bf59039bfb8", - "sha256:0a158704edf0abcac8ac371fbb54044f3270bdbc93e254a82b6c82be1ef08f3c", - "sha256:0cbf56238f4bbf49dab8c2dc2e6b1b68502b1e88d335bea59b3f5b9f4c001475", - "sha256:1732102949ff6087589408d76cd6dea656b93c896b011ecafff418c9661dc4ed", - "sha256:18f634d540dd099c262e9f887c8bbacc959847cfe5da7a0e2e1cf3f14dbf2daf", - "sha256:239f975589a944eeb1bad26b8b140a59a3a320067fb3cd10b75c3092405a1372", - "sha256:2faa61a904b83142747fc6a6d7ad8fccff898c849123030f8e75d5d967fd4a81", - "sha256:320e8618eda64e19d11bdb3bd04ccc0a816c17eaecb7e4945d01deee2a22f95f", - "sha256:38d80498e2e169bc61418ff36170e0aad0cd268da8b38a17c4cf29d254a8b3f1", - "sha256:3916c8692dbd9d55c523374a3b8213e628424d19116ac4308e434dbf6d95bbdd", - "sha256:393c7aba2b55559ef7ab791c94b44f7482a07bf7640d17b341b79081f5e5cd1a", - "sha256:3b7b30258348082826d274504fbc7c849959f1989d86c29bc355107accec6cfb", - "sha256:3fcb4046d2904378e3aeea1df51f697b0467f2aac55d232c87ba162709478c46", - "sha256:4109adee842b90671f1b689901b948f347325045c15f46b39797ae1bf17019de", - "sha256:4558e5012ee03d2638c681e156461d37b7a113fe13970d438d95d10173d25f78", - "sha256:45731330e754f5811c314901cebdf19dd776a44b31927fa4b4dbecab9e457b0c", - "sha256:4715a9b778f4293b9f8ae7a0a7cef9829f02ff8d6277a39d7f40565c737d3771", - "sha256:471f0ef53ccedec9995287f02caf0c068732f026455f07db3f01a46e49d76bbb", - "sha256:4d3ebb9e1316ec74277d19c5f482f98cc65a73ccd5430540d6d11682cd857430", - "sha256:4ff550491f5492ab5ed3533e76b8567f4b37bd2995e780a1f46bca2024223233", - "sha256:52c27110f3862a1afbcb2af4281fc9fdc40327fa286c4625dfee247c3ba90156", - "sha256:55b39c8684a46e56ef8c8d24faf02de4a2b2ac60d26cee93bc595651ff545de9", - "sha256:5a7ee16aab26e76add4afc45e8f8206c95d1d75540f1039b84a03c3b3800dd59", - "sha256:5ca51eadbd67045396bc92a4345d1790b7301c14d1848feaac1d6a6c9289e888", - "sha256:5d6b3f1fabe465e819aed2c421a6743d8debbde79b6a8600739300630a01bf2c", - "sha256:60cdbd56f4cad9f69c35eaac0fbbdf1f77b0ff9456cebd4902f3dd1cf096464c", - "sha256:6380c039ec52866c06d69b5c7aad5478b24ed11696f0e72f6b807cfb261453da", - "sha256:639d0042b7670222f33b0028de6b4e2fad6451462ce7df2af8aee37dcac55424", - "sha256:66331d00fb28dc90aa606d9a54304af76b335ae204d1836f65797d6fe27f1ca2", - "sha256:67c3119f5ddc7261d47163ed86d760ddf0e625cd6246b4ed852e82159617b5fb", - "sha256:694d828b5c41255e54bc2dddb51a9f5150b4eefa9886e38b52605a05d96566e8", - "sha256:6ae79c1bc12c34082d92bf9422764f799aee4746fd7a392db46b7fd357d4a17a", - "sha256:702e2c7c187c1a498a4e2b03155d52658fdd6fda882d3d7fbb891a5cf108bb10", - "sha256:714d4e5231fed4ba2762ed489b4aec07b2b9953cf4ee31e9871caac895a839c0", - "sha256:7b179eea70833c8dee51ec42f3b4097bd6370892fa93f510f76762105568cf09", - "sha256:7f64cbd44443e80094309875d4f9c71d0401e966d191c3d469cde4642bc2e031", - "sha256:82a6a97d9771cb48ae16979c3a3a9a18b600a8505b1115cfe354dfb2054468b4", - "sha256:84dabd95154f43a2ea80deffec9cb44d2e301e38a0c9d331cc4aa0166fe28ae3", - "sha256:8676e8fd73141ded15ea586de0b7cda1542960a7b9ad89b2b06428e97125d4fa", - "sha256:88e311d98cc0bf45b62fc46c66753a83445f5ab20038bcc1b8a1cc05666f428a", - "sha256:8b4f72fbb66279624bfe83fd5eb6aea0022dad8eec62b71e7bf63ee1caadeafe", - "sha256:8c64a6dc3fe5db7b1b4d2b5cb84c4f677768bdc340611eca673afb7cf416ef5a", - "sha256:8cf142aa6c1a751fcb364158fd710b8a9be874b81889c2bd13aa8893197455e2", - "sha256:8d1964eb7617907c792ca00b341b5ec3e01ae8c280825deadbbd678447b127e1", - "sha256:93e22add827447d2e26d67c9ac0161756007f152fdc5210277d00a85f6c92323", - "sha256:9c69e77370cce2d6df5d12b4e12bdcca60c47ba13d1cbbc8645dd005a20b738b", - "sha256:9dbc053ac75ccc63dc3a3cc547b98c7258ec35a215a92bd9f983e0aac95d3d5b", - "sha256:9e3a1ae66e3d0c17cf65c08968a5ee3180c5a95920ec2731f53343fac9bad106", - "sha256:a6ea1a5b409a85477fd8e5ee6ad8f0e40bf2844c270955e09360418cfd09abac", - "sha256:a81b1143d42b66ffc40a441379387076243ef7b51019204fd3ec36b9f69e77d6", - "sha256:ad7f2919d7dac062f24d6f5fe95d401597fbb015a25771f85e692d043c9d7832", - "sha256:afc52b8d969eff14e069a710057d15ab9ac17cd4b6753042c407dcea0e40bf75", - "sha256:b3df71da99c98534be076196791adca8819761f0bf6e08e07fd7da25127150d6", - "sha256:c088c4d70d21f8ca5c0b8b5403fe84a7bc8e024161febdd4ef04575ef35d474d", - "sha256:c26959ca7b75ff768e2776d8055bf9582a6267e24556bb7f7bd29e677932be72", - "sha256:c413016880e03e69d166efb5a1a95d40f83d5a3a648d16486592c49ffb76d0db", - "sha256:c6021d296318cb6f9414b48e6a439a7f5d1f665464da507e8ff640848ee2a58a", - "sha256:c671dc117c2c21a1ca10c116cfcd6e3e44da7fcde37bf83b2be485ab377b25da", - "sha256:c7a4b7a6cf5b6eb11e109a9755fd4fda7d57395f8c575e166d363b9fc3ec4678", - "sha256:c8a02fbeca6f63cb1f0475c799679057fc9268b77075ab7cf3f1c600e81dd46b", - "sha256:cd2adf5c87ff6d8b277814a28a535b59e20bfea40a101db6b3bdca7e9926bc24", - "sha256:d1469f228cd9ffddd396d9948b8c9cd8022b6d1bf1e40c6f25b0fb90b4f893ed", - "sha256:d153f652a687a8e95ad367a86a61e8d53d528b0530ef382ec5aaf533140ed00f", - "sha256:d5ab8e1f6bee051a4bf6195e38a5c13e5e161cb7bad83d8854524798bd9fcd6e", - "sha256:da00da442a0e31f1c69d26d224e1efd3a1ca5bcbf210978a2ca7426dfcae9f58", - "sha256:da22dab31d7180f8c3ac7c7635f3bcd53808f374f6aa333fe0b0b9e14b01f91a", - "sha256:e0ae53e33ee7476dd3d1132f932eeb39bf6125083820049d06edcdca4381f342", - "sha256:e7a6a8354f1b62e15d48e04350f13e726fa08b62c3d7b8401c0a1314f02e3558", - "sha256:e9a3d838441bebcf5cf442700e3963f58b5c33f015341f9ea86dcd7d503c07e2", - "sha256:edea7d15772ceeb29db4aff55e482d4bcfb6ae160ce144f2682de02f6d693551", - "sha256:f22eb3a6c1080d862befa0a89c380b4dafce29dc6cd56083f630073d102eb595", - "sha256:f26383adb94da5e7fb388d441bf09c61e5e35f455a3217bfd790c6b6bc64b2ee", - "sha256:f3c2890ca8c59ee683fd09adf32321a40fe1cf164e3387799efb2acebf090c11", - "sha256:f64fd07515dad67f24b6ea4a66ae2876c01031de91c93075b8093f07c0a2d93d", - "sha256:fcde4c397f673fdec23e6b05ebf8d4751314fa7c24f93334bf1f1364c1c69ac7", - "sha256:ff84aeb864e0fac81f676be9f4685f0527b660f1efdc40dcede3c251ef1e867f" + "sha256:02594361128f780eecc2a29939d9dfc870e17b45178a867bf61a11b2a4367277", + "sha256:03f2645adbe17f274444953bdea69f8327e9d278d961d85657cb0d06864814c1", + "sha256:074d1bff0163e107e97bd48cad9f928fa5a3eb4b9d33366137ffce08a63e37fe", + "sha256:0912b8a8fadeb32ff67a3ed44249448c20148397c1ed905d5dac185b4ca547bb", + "sha256:0d277cfb304118079e7044aad0b76685d30ecb86f83a0711fc5fb257ffe832ca", + "sha256:0d93400c18596b7dc4794d48a63fb361b01a0d8eb39f28800dc900c8fbdaca91", + "sha256:123dd5b16b75b2962d0fff566effb7a065e33cd4538c1692fb31c3bda2bfb972", + "sha256:17e997105bd1a260850272bfb50e2a328e029c941c2708170d9d978d5a30ad9a", + "sha256:18a01eba2574fb9edd5f6e5fb25f66e6ce061da5dab5db75e13fe1558142e0a3", + "sha256:1923a5c44061bffd5eebeef58cecf68096e35003907d8201a4d0d6f6e387ccaa", + "sha256:1942244f00baaacaa8155eca94dbd9e8cc7017deb69b75ef67c78e89fdad3c77", + "sha256:1b2c16a919d936ca87a3c5f0e43af12a89a3ce7ccbce59a2d6784caba945b68b", + "sha256:1c19de68896747a2aa6257ae4cf6ef59d73917a36a35ee9d0a6f48cff0f94db8", + "sha256:1e72589da4c90337837fdfe2026ae1952c0f4a6e793adbbfbdd40efed7c63599", + "sha256:22c0a23a3b3138a6bf76fc553789cb1a703836da86b0f306b6f0dc1617398abc", + "sha256:2c634a3207a5445be65536d38c13791904fda0748b9eabf908d3fe86a52941cf", + "sha256:2d21ac12dc943c68135ff858c3a989f2194a709e6e10b4c8977d7fcd67dfd511", + "sha256:2f1f1c75c395991ce9c94d3e4aa96e5c59c8356a15b1c9231e783865e2772699", + "sha256:305be5ff2081fa1d283a76113b8df7a14c10d75602a38d9f012935df20731487", + "sha256:33e6bc4bab477c772a541f76cd91e11ccb6d2efa2b8d7d7883591dfb523e5987", + "sha256:349ef8a73a7c5665cca65c88ab24abe75447e28aa3bc4c93ea5093474dfdf0ff", + "sha256:380f926b51b92d02a34119d072f178d80bbda334d1a7e10fa22d467a66e494db", + "sha256:38172a70005252b6893088c0f5e8a47d173df7cc2b2bd88650957eb84fcf5022", + "sha256:391cc3a9c1527e424c6865e087897e766a917f15dddb360174a70467572ac6ce", + "sha256:3a1c32a19ee6bbde02f1cb189e13a71b321256cc1d431196a9f824050b160d5a", + "sha256:4120d7fefa1e2d8fb6f650b11489710091788de554e2b6f8347c7a20ceb003f5", + "sha256:424ae21498790e12eb759040bbb504e5e280cab64693d14775c54269fd1d2bb7", + "sha256:44b324a6b8376a23e6ba25d368726ee3bc281e6ab306db80b5819999c737d820", + "sha256:4790f0e15f00058f7599dab2b206d3049d7ac464dc2e5eae0e93fa18aee9e7bf", + "sha256:4aff049b5e629ef9b3e9e617fa6e2dfeda1bf87e01bcfecaf3949af9e210105e", + "sha256:4b38b1570242fbab8d86a84128fb5b5234a2f70c2e32f3070143a6d94bc854cf", + "sha256:4d46c7b4173415d8e583045fbc4daa48b40e31b19ce595b8d92cf639396c15d5", + "sha256:4f1c9866ccf48a6df2b06823e6ae80573529f2af3a0992ec4fe75b1a510df8a6", + "sha256:4f7acae3cf1a2a2361ec4c8e787eaaa86a94171d2417aae53c0cca6ca3118ff6", + "sha256:54d9ddea424cd19d3ff6128601a4a4d23d54a421f9b4c0fff740505813739a91", + "sha256:58718e181c56a3c02d25b09d4115eb02aafe1a732ce5714ab70326d9776457c3", + "sha256:5ede29d91a40ba22ac1b922ef510aab871652f6c88ef60b9dcdf773c6d32ad7a", + "sha256:61645818edd40cc6f455b851277a21bf420ce347baa0b86eaa41d51ef58ba23d", + "sha256:66bf9234e08fe561dccd62083bf67400bdbf1c67ba9efdc3dac03650e97c6088", + "sha256:673f988370f5954df96cc31fd99c7312a3af0a97f09e407399f61583f30da9bc", + "sha256:676f94c5480d8eefd97c0c7e3953315e4d8c2b71f3b49539beb2aa676c58272f", + "sha256:6c225286f2b13bab5987425558baa5cbdb2bc925b2998038fa028245ef421e75", + "sha256:7384d0b87d4635ec38db9263e6a3f1eb609e2e06087f0aa7f63b76833737b471", + "sha256:7e2fe37ac654032db1f3499fe56e77190282534810e2a8e833141a021faaab0e", + "sha256:7f2bfc0032a00405d4af2ba27f3c429e851d04fad1e5ceee4080a1c570476697", + "sha256:7f6b639c36734eaa80a6c152a238242bedcee9b953f23bb887e9102976343092", + "sha256:814375093edae5f1cb31e3407997cf3eacefb9010f96df10d64829362ae2df69", + "sha256:8224f98be68a84b19f48e0bdc14224b5a71339aff3a27df69989fa47d01296f3", + "sha256:898715cf566ec2869d5cb4d5fb4be408964704c46c96b4be267442d265390f32", + "sha256:8989f46f3d7ef79585e98fa991e6ded55d2f48ae56d2c9fa5e491a6e4effb589", + "sha256:8ba01ebc6175e1e6b7275c907a3a36be48a2d487549b656aa90c8a910d9f3178", + "sha256:8c5c6fa16412b35999320f5c9690c0f554392dc222c04e559217e0f9ae244b92", + "sha256:8c6a4e5e40156d72a40241a25cc226051c0a8d816610097a8e8f517aeacd59a2", + "sha256:8eaf44ccbc4e35762683078b72bf293f476561d8b68ec8a64f98cf32811c323e", + "sha256:8fb4fc029e135859f533025bc82047334e24b0d489e75513144f25408ecaf058", + "sha256:9093a81e18c45227eebe4c16124ebf3e0d893830c6aca7cc310bfca8fe59d857", + "sha256:94c4381ffba9cc508b37d2e536b418d5ea9cfdc2848b9a7fea6aebad4ec6aac1", + "sha256:94fac7c6e77ccb1ca91e9eb4cb0ac0270b9fb9b289738654120ba8cebb1189c6", + "sha256:95c4dc6f61d610bc0ee1edc6f29d993f10febfe5b76bb470b486d90bbece6b22", + "sha256:975218eee0e6d24eb336d0328c768ebc5d617609affaca5dbbd6dd1984f16ed0", + "sha256:ad146dae5977c4dd435eb31373b3fe9b0b1bf26858c6fc452bf6af394067e10b", + "sha256:afe16a84498441d05e9189a15900640a2d2b5e76cf4efe8cbb088ab4f112ee57", + "sha256:b1c43eb1ab7cbf411b8e387dc169acb31f0ca0d8c09ba63f9eac67829585b44f", + "sha256:b90078989ef3fc45cf9221d3859acd1108af7560c52397ff4ace8ad7052a132e", + "sha256:b98e698dc34966e5976e10bbca6d26d6724e6bdea853c7c10162a3235aba6e16", + "sha256:ba5a8b74c2a8af7d862399cdedce1533642fa727def0b8c3e3e02fcb52dca1b1", + "sha256:c31ad0c0c507894e3eaa843415841995bf8de4d6b2d24c6e33099f4bc9fc0d4f", + "sha256:c3b9162bab7e42f21243effc822652dc5bb5e8ff42a4eb62fe7782bcbcdfacf6", + "sha256:c58c6837a2c2a7cf3133983e64173aec11f9c2cd8e87ec2fdc16ce727bcf1a04", + "sha256:c83f7a107abb89a227d6c454c613e7606c12a42b9a4ca9c5d7dad25d47c776ae", + "sha256:cde98f323d6bf161041e7627a5fd763f9fd829bcfcd089804a5fdce7bb6e1b7d", + "sha256:ce91db90dbf37bb6fa0997f26574107e1b9d5ff939315247b7e615baa8ec313b", + "sha256:d00f3c5e0d764a5c9aa5a62d99728c56d455310bcc288a79cab10157b3af426f", + "sha256:d17920f18e6ee090bdd3d0bfffd769d9f2cb4c8ffde3eb203777a3895c128862", + "sha256:d55f011da0a843c3d3df2c2cf4e537b8070a419f891c930245f05d329c4b0689", + "sha256:d742c36ed44f2798c8d3f4bc511f479b9ceef2b93f348671184139e7d708042c", + "sha256:d9a487ef090aea982d748b1b0d74fe7c3950b109df967630a20584f9a99c0683", + "sha256:d9ef084e3dc690ad50137cc05831c52b6ca428096e6deb3c43e95827f531d5ef", + "sha256:da452c2c322e9ce0cfef392e469a26d63d42860f829026a63374fde6b5c5876f", + "sha256:dc4826823121783dccc0871e3f405417ac116055bf184ac04c36f98b75aacd12", + "sha256:de7a5299827253023c55ea549444e058c0eb496931fa05d693b95140a947cb73", + "sha256:e04a1f2a65ad2f93aa20f9ff9f1b672bf912413e5547f60749fa2ef8a644e061", + "sha256:e1ca1ef5ba129718a8fc827b0867f6aa4e893c56eb00003b7367f8a733a9b072", + "sha256:ee40b40aa753d844162dcc80d0fe256b87cba48ca0054f64e68000453caead11", + "sha256:f071854b47d39591ce9a17981c46790acb30518e2f83dfca8db2dfa091178691", + "sha256:f29930bc2921cef955ba39a3ff87d2c4398a0394ae217f41cb02d5c26c8b1b77", + "sha256:f489a2c9e6455d87eabf907ac0b7d230a9786be43fbe884ad184ddf9e9c1e385", + "sha256:f5bf3ead3cb66ab990ee2561373b009db5bc0e857549b6c9ba84b20bc462e172", + "sha256:f6f18898ace4bcd2d41a122916475344a87f1dfdec626ecde9ee802a711bc569", + "sha256:f8112fb501b1e0567a1251a2fd0747baae60a4ab325a871e975b7bb67e59221f", + "sha256:fd31f176429cecbc1ba499d4aba31aaccfea488f418d60376b911269d3b883c5" ], "markers": "python_version >= '3.8'", - "version": "==3.9.5" + "version": "==3.10.5" }, "aiosignal": { "hashes": [ @@ -116,11 +139,11 @@ }, "attrs": { "hashes": [ - "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", - "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1" + "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346", + "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2" ], "markers": "python_version >= '3.7'", - "version": "==23.2.0" + "version": "==24.2.0" }, "blinker": { "hashes": [ @@ -132,11 +155,11 @@ }, "certifi": { "hashes": [ - "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516", - "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56" + "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", + "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9" ], "markers": "python_version >= '3.6'", - "version": "==2024.6.2" + "version": "==2024.8.30" }, "charset-normalizer": { "hashes": [ @@ -244,10 +267,11 @@ }, "dbrepo": { "hashes": [ - "sha256:d445f1c5a361eae8f3538a395828a297dd999ab36e5bbca0ad1cca9d093b8030" + "sha256:79923866808a359ff9baa38c3370544b384eff1ff75fe0b245177be3ea3a48d5", + "sha256:d7c3b1b3d6e8ca5d094a98ad716420f1c7d09ac6e197c93a0acce18f77cbda3e" ], - "path": "./lib/dbrepo-1.4.4.tar.gz", - "version": "==1.4.4" + "markers": "python_version >= '3.11'", + "path": "./lib/dbrepo-1.4.4.tar.gz" }, "docker": { "hashes": [ @@ -269,6 +293,7 @@ "sha256:f69fcd559dc907ed196ab9df0e48471709175e696d6e698dd4dbe940f96ce66b" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==2.3.3" }, "frozenlist": { @@ -356,11 +381,11 @@ }, "idna": { "hashes": [ - "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", - "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0" + "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac", + "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603" ], - "markers": "python_version >= '3.5'", - "version": "==3.7" + "markers": "python_version >= '3.6'", + "version": "==3.8" }, "iniconfig": { "hashes": [ @@ -550,62 +575,71 @@ }, "numpy": { "hashes": [ - "sha256:04494f6ec467ccb5369d1808570ae55f6ed9b5809d7f035059000a37b8d7e86f", - "sha256:0a43f0974d501842866cc83471bdb0116ba0dffdbaac33ec05e6afed5b615238", - "sha256:0e50842b2295ba8414c8c1d9d957083d5dfe9e16828b37de883f51fc53c4016f", - "sha256:0ec84b9ba0654f3b962802edc91424331f423dcf5d5f926676e0150789cb3d95", - "sha256:17067d097ed036636fa79f6a869ac26df7db1ba22039d962422506640314933a", - "sha256:1cde1753efe513705a0c6d28f5884e22bdc30438bf0085c5c486cdaff40cd67a", - "sha256:1e72728e7501a450288fc8e1f9ebc73d90cfd4671ebbd631f3e7857c39bd16f2", - "sha256:2635dbd200c2d6faf2ef9a0d04f0ecc6b13b3cad54f7c67c61155138835515d2", - "sha256:2ce46fd0b8a0c947ae047d222f7136fc4d55538741373107574271bc00e20e8f", - "sha256:34f003cb88b1ba38cb9a9a4a3161c1604973d7f9d5552c38bc2f04f829536609", - "sha256:354f373279768fa5a584bac997de6a6c9bc535c482592d7a813bb0c09be6c76f", - "sha256:38ecb5b0582cd125f67a629072fed6f83562d9dd04d7e03256c9829bdec027ad", - "sha256:3e8e01233d57639b2e30966c63d36fcea099d17c53bf424d77f088b0f4babd86", - "sha256:3f6bed7f840d44c08ebdb73b1825282b801799e325bcbdfa6bc5c370e5aecc65", - "sha256:4554eb96f0fd263041baf16cf0881b3f5dafae7a59b1049acb9540c4d57bc8cb", - "sha256:46e161722e0f619749d1cd892167039015b2c2817296104487cd03ed4a955995", - "sha256:49d9f7d256fbc804391a7f72d4a617302b1afac1112fac19b6c6cec63fe7fe8a", - "sha256:4d2f62e55a4cd9c58c1d9a1c9edaedcd857a73cb6fda875bf79093f9d9086f85", - "sha256:5f64641b42b2429f56ee08b4f427a4d2daf916ec59686061de751a55aafa22e4", - "sha256:63b92c512d9dbcc37f9d81b123dec99fdb318ba38c8059afc78086fe73820275", - "sha256:6d7696c615765091cc5093f76fd1fa069870304beaccfd58b5dcc69e55ef49c1", - "sha256:79e843d186c8fb1b102bef3e2bc35ef81160ffef3194646a7fdd6a73c6b97196", - "sha256:821eedb7165ead9eebdb569986968b541f9908979c2da8a4967ecac4439bae3d", - "sha256:84554fc53daa8f6abf8e8a66e076aff6ece62de68523d9f665f32d2fc50fd66e", - "sha256:8d83bb187fb647643bd56e1ae43f273c7f4dbcdf94550d7938cfc32566756514", - "sha256:903703372d46bce88b6920a0cd86c3ad82dae2dbef157b5fc01b70ea1cfc430f", - "sha256:9416a5c2e92ace094e9f0082c5fd473502c91651fb896bc17690d6fc475128d6", - "sha256:9a1712c015831da583b21c5bfe15e8684137097969c6d22e8316ba66b5baabe4", - "sha256:9c27f0946a3536403efb0e1c28def1ae6730a72cd0d5878db38824855e3afc44", - "sha256:a356364941fb0593bb899a1076b92dfa2029f6f5b8ba88a14fd0984aaf76d0df", - "sha256:a7039a136017eaa92c1848152827e1424701532ca8e8967fe480fe1569dae581", - "sha256:acd3a644e4807e73b4e1867b769fbf1ce8c5d80e7caaef0d90dcdc640dfc9787", - "sha256:ad0c86f3455fbd0de6c31a3056eb822fc939f81b1618f10ff3406971893b62a5", - "sha256:b4c76e3d4c56f145d41b7b6751255feefae92edbc9a61e1758a98204200f30fc", - "sha256:b6f6a8f45d0313db07d6d1d37bd0b112f887e1369758a5419c0370ba915b3871", - "sha256:c5a59996dc61835133b56a32ebe4ef3740ea5bc19b3983ac60cc32be5a665d54", - "sha256:c73aafd1afca80afecb22718f8700b40ac7cab927b8abab3c3e337d70e10e5a2", - "sha256:cee6cc0584f71adefe2c908856ccc98702baf95ff80092e4ca46061538a2ba98", - "sha256:cef04d068f5fb0518a77857953193b6bb94809a806bd0a14983a8f12ada060c9", - "sha256:cf5d1c9e6837f8af9f92b6bd3e86d513cdc11f60fd62185cc49ec7d1aba34864", - "sha256:e61155fae27570692ad1d327e81c6cf27d535a5d7ef97648a17d922224b216de", - "sha256:e7f387600d424f91576af20518334df3d97bc76a300a755f9a8d6e4f5cadd289", - "sha256:ed08d2703b5972ec736451b818c2eb9da80d66c3e84aed1deeb0c345fefe461b", - "sha256:fbd6acc766814ea6443628f4e6751d0da6593dae29c08c0b2606164db026970c", - "sha256:feff59f27338135776f6d4e2ec7aeeac5d5f7a08a83e80869121ef8164b74af9" + "sha256:046356b19d7ad1890c751b99acad5e82dc4a02232013bd9a9a712fddf8eb60f5", + "sha256:0b8cc2715a84b7c3b161f9ebbd942740aaed913584cae9cdc7f8ad5ad41943d0", + "sha256:0d07841fd284718feffe7dd17a63a2e6c78679b2d386d3e82f44f0108c905550", + "sha256:13cc11c00000848702322af4de0147ced365c81d66053a67c2e962a485b3717c", + "sha256:13ce49a34c44b6de5241f0b38b07e44c1b2dcacd9e36c30f9c2fcb1bb5135db7", + "sha256:24c2ad697bd8593887b019817ddd9974a7f429c14a5469d7fad413f28340a6d2", + "sha256:251105b7c42abe40e3a689881e1793370cc9724ad50d64b30b358bbb3a97553b", + "sha256:2ca4b53e1e0b279142113b8c5eb7d7a877e967c306edc34f3b58e9be12fda8df", + "sha256:3269c9eb8745e8d975980b3a7411a98976824e1fdef11f0aacf76147f662b15f", + "sha256:397bc5ce62d3fb73f304bec332171535c187e0643e176a6e9421a6e3eacef06d", + "sha256:3fc5eabfc720db95d68e6646e88f8b399bfedd235994016351b1d9e062c4b270", + "sha256:50a95ca3560a6058d6ea91d4629a83a897ee27c00630aed9d933dff191f170cd", + "sha256:52ac2e48f5ad847cd43c4755520a2317f3380213493b9d8a4c5e37f3b87df504", + "sha256:53e27293b3a2b661c03f79aa51c3987492bd4641ef933e366e0f9f6c9bf257ec", + "sha256:57eb525e7c2a8fdee02d731f647146ff54ea8c973364f3b850069ffb42799647", + "sha256:5889dd24f03ca5a5b1e8a90a33b5a0846d8977565e4ae003a63d22ecddf6782f", + "sha256:59ca673ad11d4b84ceb385290ed0ebe60266e356641428c845b39cd9df6713ab", + "sha256:6435c48250c12f001920f0751fe50c0348f5f240852cfddc5e2f97e007544cbe", + "sha256:6e5a9cb2be39350ae6c8f79410744e80154df658d5bea06e06e0ac5bb75480d5", + "sha256:7be6a07520b88214ea85d8ac8b7d6d8a1839b0b5cb87412ac9f49fa934eb15d5", + "sha256:7c803b7934a7f59563db459292e6aa078bb38b7ab1446ca38dd138646a38203e", + "sha256:7dd86dfaf7c900c0bbdcb8b16e2f6ddf1eb1fe39c6c8cca6e94844ed3152a8fd", + "sha256:8661c94e3aad18e1ea17a11f60f843a4933ccaf1a25a7c6a9182af70610b2313", + "sha256:8ae0fd135e0b157365ac7cc31fff27f07a5572bdfc38f9c2d43b2aff416cc8b0", + "sha256:910b47a6d0635ec1bd53b88f86120a52bf56dcc27b51f18c7b4a2e2224c29f0f", + "sha256:913cc1d311060b1d409e609947fa1b9753701dac96e6581b58afc36b7ee35af6", + "sha256:920b0911bb2e4414c50e55bd658baeb78281a47feeb064ab40c2b66ecba85553", + "sha256:950802d17a33c07cba7fd7c3dcfa7d64705509206be1606f196d179e539111ed", + "sha256:981707f6b31b59c0c24bcda52e5605f9701cb46da4b86c2e8023656ad3e833cb", + "sha256:98ce7fb5b8063cfdd86596b9c762bf2b5e35a2cdd7e967494ab78a1fa7f8b86e", + "sha256:99f4a9ee60eed1385a86e82288971a51e71df052ed0b2900ed30bc840c0f2e39", + "sha256:9a8e06c7a980869ea67bbf551283bbed2856915f0a792dc32dd0f9dd2fb56728", + "sha256:ae8ce252404cdd4de56dcfce8b11eac3c594a9c16c231d081fb705cf23bd4d9e", + "sha256:afd9c680df4de71cd58582b51e88a61feed4abcc7530bcd3d48483f20fc76f2a", + "sha256:b49742cdb85f1f81e4dc1b39dcf328244f4d8d1ded95dea725b316bd2cf18c95", + "sha256:b5613cfeb1adfe791e8e681128f5f49f22f3fcaa942255a6124d58ca59d9528f", + "sha256:bab7c09454460a487e631ffc0c42057e3d8f2a9ddccd1e60c7bb8ed774992480", + "sha256:c8a0e34993b510fc19b9a2ce7f31cb8e94ecf6e924a40c0c9dd4f62d0aac47d9", + "sha256:caf5d284ddea7462c32b8d4a6b8af030b6c9fd5332afb70e7414d7fdded4bfd0", + "sha256:cea427d1350f3fd0d2818ce7350095c1a2ee33e30961d2f0fef48576ddbbe90f", + "sha256:d0cf7d55b1051387807405b3898efafa862997b4cba8aa5dbe657be794afeafd", + "sha256:d10c39947a2d351d6d466b4ae83dad4c37cd6c3cdd6d5d0fa797da56f710a6ae", + "sha256:d2b9cd92c8f8e7b313b80e93cedc12c0112088541dcedd9197b5dee3738c1201", + "sha256:d4c57b68c8ef5e1ebf47238e99bf27657511ec3f071c465f6b1bccbef12d4136", + "sha256:d51fc141ddbe3f919e91a096ec739f49d686df8af254b2053ba21a910ae518bf", + "sha256:e097507396c0be4e547ff15b13dc3866f45f3680f789c1a1301b07dadd3fbc78", + "sha256:e30356d530528a42eeba51420ae8bf6c6c09559051887196599d96ee5f536468", + "sha256:e8d5f8a8e3bc87334f025194c6193e408903d21ebaeb10952264943a985066ca", + "sha256:e8dfa9e94fc127c40979c3eacbae1e61fda4fe71d84869cc129e2721973231ef", + "sha256:f212d4f46b67ff604d11fff7cc62d36b3e8714edf68e44e9760e19be38c03eb0", + "sha256:f7506387e191fe8cdb267f912469a3cccc538ab108471291636a96a54e599556", + "sha256:fac6e277a41163d27dfab5f4ec1f7a83fac94e170665a4a50191b545721c6521", + "sha256:fcd8f556cdc8cfe35e70efb92463082b7f43dd7e547eb071ffc36abc0ca4699b" ], "markers": "python_version == '3.11'", - "version": "==2.0.0" + "version": "==2.1.1" }, "opensearch-py": { "hashes": [ - "sha256:0b7c27e8ed84c03c99558406927b6161f186a72502ca6d0325413d8e5523ba96", - "sha256:b6e78b685dd4e9c016d7a4299cf1de69e299c88322e3f81c716e6e23fe5683c1" + "sha256:5417650eba98a1c7648e502207cebf3a12beab623ffe0ebbf55f9b1b4b6e44e9", + "sha256:67ab76e9373669bc71da417096df59827c08369ac3795d5438c9a8be21cbd759" ], "index": "pypi", - "version": "==2.6.0" + "markers": "python_version >= '3.8' and python_version < '4'", + "version": "==2.7.1" }, "packaging": { "hashes": [ @@ -668,104 +702,115 @@ }, "pydantic": { "hashes": [ - "sha256:0c84efd9548d545f63ac0060c1e4d39bb9b14db8b3c0652338aecc07b5adec52", - "sha256:ee8538d41ccb9c0a9ad3e0e5f07bf15ed8015b481ced539a1759d8cc89ae90d0" + "sha256:c7a8a9fdf7d100afa49647eae340e2d23efa382466a8d177efcd1381e9be5598", + "sha256:f66a7073abd93214a20c5f7b32d56843137a7a2e70d02111f3be287035c45370" ], "markers": "python_version >= '3.8'", - "version": "==2.7.4" + "version": "==2.9.0" }, "pydantic-core": { "hashes": [ - "sha256:01dd777215e2aa86dfd664daed5957704b769e726626393438f9c87690ce78c3", - "sha256:0eb2a4f660fcd8e2b1c90ad566db2b98d7f3f4717c64fe0a83e0adb39766d5b8", - "sha256:0fbbdc827fe5e42e4d196c746b890b3d72876bdbf160b0eafe9f0334525119c8", - "sha256:123c3cec203e3f5ac7b000bd82235f1a3eced8665b63d18be751f115588fea30", - "sha256:14601cdb733d741b8958224030e2bfe21a4a881fb3dd6fbb21f071cabd48fa0a", - "sha256:18f469a3d2a2fdafe99296a87e8a4c37748b5080a26b806a707f25a902c040a8", - "sha256:19894b95aacfa98e7cb093cd7881a0c76f55731efad31073db4521e2b6ff5b7d", - "sha256:1b4de2e51bbcb61fdebd0ab86ef28062704f62c82bbf4addc4e37fa4b00b7cbc", - "sha256:1d886dc848e60cb7666f771e406acae54ab279b9f1e4143babc9c2258213daa2", - "sha256:1f4d26ceb5eb9eed4af91bebeae4b06c3fb28966ca3a8fb765208cf6b51102ab", - "sha256:21a5e440dbe315ab9825fcd459b8814bb92b27c974cbc23c3e8baa2b76890077", - "sha256:293afe532740370aba8c060882f7d26cfd00c94cae32fd2e212a3a6e3b7bc15e", - "sha256:2f5966897e5461f818e136b8451d0551a2e77259eb0f73a837027b47dc95dab9", - "sha256:2fd41f6eff4c20778d717af1cc50eca52f5afe7805ee530a4fbd0bae284f16e9", - "sha256:2fdf2156aa3d017fddf8aea5adfba9f777db1d6022d392b682d2a8329e087cef", - "sha256:3c40d4eaad41f78e3bbda31b89edc46a3f3dc6e171bf0ecf097ff7a0ffff7cb1", - "sha256:43d447dd2ae072a0065389092a231283f62d960030ecd27565672bd40746c507", - "sha256:44a688331d4a4e2129140a8118479443bd6f1905231138971372fcde37e43528", - "sha256:44c7486a4228413c317952e9d89598bcdfb06399735e49e0f8df643e1ccd0558", - "sha256:44cd83ab6a51da80fb5adbd9560e26018e2ac7826f9626bc06ca3dc074cd198b", - "sha256:46387e38bd641b3ee5ce247563b60c5ca098da9c56c75c157a05eaa0933ed154", - "sha256:4701b19f7e3a06ea655513f7938de6f108123bf7c86bbebb1196eb9bd35cf724", - "sha256:4748321b5078216070b151d5271ef3e7cc905ab170bbfd27d5c83ee3ec436695", - "sha256:4b06beb3b3f1479d32befd1f3079cc47b34fa2da62457cdf6c963393340b56e9", - "sha256:4d0dcc59664fcb8974b356fe0a18a672d6d7cf9f54746c05f43275fc48636851", - "sha256:4e99bc050fe65c450344421017f98298a97cefc18c53bb2f7b3531eb39bc7805", - "sha256:509daade3b8649f80d4e5ff21aa5673e4ebe58590b25fe42fac5f0f52c6f034a", - "sha256:51991a89639a912c17bef4b45c87bd83593aee0437d8102556af4885811d59f5", - "sha256:53db086f9f6ab2b4061958d9c276d1dbe3690e8dd727d6abf2321d6cce37fa94", - "sha256:564d7922e4b13a16b98772441879fcdcbe82ff50daa622d681dd682175ea918c", - "sha256:574d92eac874f7f4db0ca653514d823a0d22e2354359d0759e3f6a406db5d55d", - "sha256:578e24f761f3b425834f297b9935e1ce2e30f51400964ce4801002435a1b41ef", - "sha256:59ff3e89f4eaf14050c8022011862df275b552caef8082e37b542b066ce1ff26", - "sha256:5f09baa656c904807e832cf9cce799c6460c450c4ad80803517032da0cd062e2", - "sha256:6891a2ae0e8692679c07728819b6e2b822fb30ca7445f67bbf6509b25a96332c", - "sha256:6a750aec7bf431517a9fd78cb93c97b9b0c496090fee84a47a0d23668976b4b0", - "sha256:6f5c4d41b2771c730ea1c34e458e781b18cc668d194958e0112455fff4e402b2", - "sha256:77450e6d20016ec41f43ca4a6c63e9fdde03f0ae3fe90e7c27bdbeaece8b1ed4", - "sha256:81b5efb2f126454586d0f40c4d834010979cb80785173d1586df845a632e4e6d", - "sha256:823be1deb01793da05ecb0484d6c9e20baebb39bd42b5d72636ae9cf8350dbd2", - "sha256:834b5230b5dfc0c1ec37b2fda433b271cbbc0e507560b5d1588e2cc1148cf1ce", - "sha256:847a35c4d58721c5dc3dba599878ebbdfd96784f3fb8bb2c356e123bdcd73f34", - "sha256:86110d7e1907ab36691f80b33eb2da87d780f4739ae773e5fc83fb272f88825f", - "sha256:8951eee36c57cd128f779e641e21eb40bc5073eb28b2d23f33eb0ef14ffb3f5d", - "sha256:8a7164fe2005d03c64fd3b85649891cd4953a8de53107940bf272500ba8a788b", - "sha256:8b8bab4c97248095ae0c4455b5a1cd1cdd96e4e4769306ab19dda135ea4cdb07", - "sha256:90afc12421df2b1b4dcc975f814e21bc1754640d502a2fbcc6d41e77af5ec312", - "sha256:938cb21650855054dc54dfd9120a851c974f95450f00683399006aa6e8abb057", - "sha256:942ba11e7dfb66dc70f9ae66b33452f51ac7bb90676da39a7345e99ffb55402d", - "sha256:972658f4a72d02b8abfa2581d92d59f59897d2e9f7e708fdabe922f9087773af", - "sha256:97736815b9cc893b2b7f663628e63f436018b75f44854c8027040e05230eeddb", - "sha256:98906207f29bc2c459ff64fa007afd10a8c8ac080f7e4d5beff4c97086a3dabd", - "sha256:99457f184ad90235cfe8461c4d70ab7dd2680e28821c29eca00252ba90308c78", - "sha256:a0d829524aaefdebccb869eed855e2d04c21d2d7479b6cada7ace5448416597b", - "sha256:a2fdd81edd64342c85ac7cf2753ccae0b79bf2dfa063785503cb85a7d3593223", - "sha256:a55b5b16c839df1070bc113c1f7f94a0af4433fcfa1b41799ce7606e5c79ce0a", - "sha256:a642295cd0c8df1b86fc3dced1d067874c353a188dc8e0f744626d49e9aa51c4", - "sha256:ab86ce7c8f9bea87b9d12c7f0af71102acbf5ecbc66c17796cff45dae54ef9a5", - "sha256:abc267fa9837245cc28ea6929f19fa335f3dc330a35d2e45509b6566dc18be23", - "sha256:ae1d6df168efb88d7d522664693607b80b4080be6750c913eefb77e34c12c71a", - "sha256:b2ebef0e0b4454320274f5e83a41844c63438fdc874ea40a8b5b4ecb7693f1c4", - "sha256:b48ece5bde2e768197a2d0f6e925f9d7e3e826f0ad2271120f8144a9db18d5c8", - "sha256:b7cdf28938ac6b8b49ae5e92f2735056a7ba99c9b110a474473fd71185c1af5d", - "sha256:bb4462bd43c2460774914b8525f79b00f8f407c945d50881568f294c1d9b4443", - "sha256:bc4ff9805858bd54d1a20efff925ccd89c9d2e7cf4986144b30802bf78091c3e", - "sha256:c1322d7dd74713dcc157a2b7898a564ab091ca6c58302d5c7b4c07296e3fd00f", - "sha256:c67598100338d5d985db1b3d21f3619ef392e185e71b8d52bceacc4a7771ea7e", - "sha256:ca26a1e73c48cfc54c4a76ff78df3727b9d9f4ccc8dbee4ae3f73306a591676d", - "sha256:d323a01da91851a4f17bf592faf46149c9169d68430b3146dcba2bb5e5719abc", - "sha256:dc1803ac5c32ec324c5261c7209e8f8ce88e83254c4e1aebdc8b0a39f9ddb443", - "sha256:e00a3f196329e08e43d99b79b286d60ce46bed10f2280d25a1718399457e06be", - "sha256:e85637bc8fe81ddb73fda9e56bab24560bdddfa98aa64f87aaa4e4b6730c23d2", - "sha256:e858ac0a25074ba4bce653f9b5d0a85b7456eaddadc0ce82d3878c22489fa4ee", - "sha256:eae237477a873ab46e8dd748e515c72c0c804fb380fbe6c85533c7de51f23a8f", - "sha256:ebef0dd9bf9b812bf75bda96743f2a6c5734a02092ae7f721c048d156d5fabae", - "sha256:ec3beeada09ff865c344ff3bc2f427f5e6c26401cc6113d77e372c3fdac73864", - "sha256:f76d0ad001edd426b92233d45c746fd08f467d56100fd8f30e9ace4b005266e4", - "sha256:f85d05aa0918283cf29a30b547b4df2fbb56b45b135f9e35b6807cb28bc47951", - "sha256:f9899c94762343f2cc2fc64c13e7cae4c3cc65cdfc87dd810a31654c9b7358cc" + "sha256:0102e49ac7d2df3379ef8d658d3bc59d3d769b0bdb17da189b75efa861fc07b4", + "sha256:0123655fedacf035ab10c23450163c2f65a4174f2bb034b188240a6cf06bb123", + "sha256:043ef8469f72609c4c3a5e06a07a1f713d53df4d53112c6d49207c0bd3c3bd9b", + "sha256:0448b81c3dfcde439551bb04a9f41d7627f676b12701865c8a2574bcea034437", + "sha256:05b366fb8fe3d8683b11ac35fa08947d7b92be78ec64e3277d03bd7f9b7cda79", + "sha256:07049ec9306ec64e955b2e7c40c8d77dd78ea89adb97a2013d0b6e055c5ee4c5", + "sha256:084414ffe9a85a52940b49631321d636dadf3576c30259607b75516d131fecd0", + "sha256:086c5db95157dc84c63ff9d96ebb8856f47ce113c86b61065a066f8efbe80acf", + "sha256:12625e69b1199e94b0ae1c9a95d000484ce9f0182f9965a26572f054b1537e44", + "sha256:16b25a4a120a2bb7dab51b81e3d9f3cde4f9a4456566c403ed29ac81bf49744f", + "sha256:19f1352fe4b248cae22a89268720fc74e83f008057a652894f08fa931e77dced", + "sha256:1a2ab4f410f4b886de53b6bddf5dd6f337915a29dd9f22f20f3099659536b2f6", + "sha256:1c7b81beaf7c7ebde978377dc53679c6cba0e946426fc7ade54251dfe24a7604", + "sha256:1cf842265a3a820ebc6388b963ead065f5ce8f2068ac4e1c713ef77a67b71f7c", + "sha256:1eb37f7d6a8001c0f86dc8ff2ee8d08291a536d76e49e78cda8587bb54d8b329", + "sha256:23af245b8f2f4ee9e2c99cb3f93d0e22fb5c16df3f2f643f5a8da5caff12a653", + "sha256:257d6a410a0d8aeb50b4283dea39bb79b14303e0fab0f2b9d617701331ed1515", + "sha256:276ae78153a94b664e700ac362587c73b84399bd1145e135287513442e7dfbc7", + "sha256:2b1a195efd347ede8bcf723e932300292eb13a9d2a3c1f84eb8f37cbbc905b7f", + "sha256:329a721253c7e4cbd7aad4a377745fbcc0607f9d72a3cc2102dd40519be75ed2", + "sha256:358331e21a897151e54d58e08d0219acf98ebb14c567267a87e971f3d2a3be59", + "sha256:3649bd3ae6a8ebea7dc381afb7f3c6db237fc7cebd05c8ac36ca8a4187b03b30", + "sha256:3713dc093d5048bfaedbba7a8dbc53e74c44a140d45ede020dc347dda18daf3f", + "sha256:3ef71ec876fcc4d3bbf2ae81961959e8d62f8d74a83d116668409c224012e3af", + "sha256:41ae8537ad371ec018e3c5da0eb3f3e40ee1011eb9be1da7f965357c4623c501", + "sha256:4a801c5e1e13272e0909c520708122496647d1279d252c9e6e07dac216accc41", + "sha256:4c83c64d05ffbbe12d4e8498ab72bdb05bcc1026340a4a597dc647a13c1605ec", + "sha256:4cebb9794f67266d65e7e4cbe5dcf063e29fc7b81c79dc9475bd476d9534150e", + "sha256:5668b3173bb0b2e65020b60d83f5910a7224027232c9f5dc05a71a1deac9f960", + "sha256:56e6a12ec8d7679f41b3750ffa426d22b44ef97be226a9bab00a03365f217b2b", + "sha256:582871902e1902b3c8e9b2c347f32a792a07094110c1bca6c2ea89b90150caac", + "sha256:5c8aa40f6ca803f95b1c1c5aeaee6237b9e879e4dfb46ad713229a63651a95fb", + "sha256:5d813fd871b3d5c3005157622ee102e8908ad6011ec915a18bd8fde673c4360e", + "sha256:5dd0ec5f514ed40e49bf961d49cf1bc2c72e9b50f29a163b2cc9030c6742aa73", + "sha256:5f3cf3721eaf8741cffaf092487f1ca80831202ce91672776b02b875580e174a", + "sha256:6294907eaaccf71c076abdd1c7954e272efa39bb043161b4b8aa1cd76a16ce43", + "sha256:64d094ea1aa97c6ded4748d40886076a931a8bf6f61b6e43e4a1041769c39dd2", + "sha256:6650a7bbe17a2717167e3e23c186849bae5cef35d38949549f1c116031b2b3aa", + "sha256:67b6655311b00581914aba481729971b88bb8bc7996206590700a3ac85e457b8", + "sha256:6b06c5d4e8701ac2ba99a2ef835e4e1b187d41095a9c619c5b185c9068ed2a49", + "sha256:6ce883906810b4c3bd90e0ada1f9e808d9ecf1c5f0b60c6b8831d6100bcc7dd6", + "sha256:6db09153d8438425e98cdc9a289c5fade04a5d2128faff8f227c459da21b9703", + "sha256:6f80fba4af0cb1d2344869d56430e304a51396b70d46b91a55ed4959993c0589", + "sha256:743e5811b0c377eb830150d675b0847a74a44d4ad5ab8845923d5b3a756d8100", + "sha256:753294d42fb072aa1775bfe1a2ba1012427376718fa4c72de52005a3d2a22178", + "sha256:7568f682c06f10f30ef643a1e8eec4afeecdafde5c4af1b574c6df079e96f96c", + "sha256:7706e15cdbf42f8fab1e6425247dfa98f4a6f8c63746c995d6a2017f78e619ae", + "sha256:785e7f517ebb9890813d31cb5d328fa5eda825bb205065cde760b3150e4de1f7", + "sha256:7a05c0240f6c711eb381ac392de987ee974fa9336071fb697768dfdb151345ce", + "sha256:7ce7eaf9a98680b4312b7cebcdd9352531c43db00fca586115845df388f3c465", + "sha256:7ce8e26b86a91e305858e018afc7a6e932f17428b1eaa60154bd1f7ee888b5f8", + "sha256:7d0324a35ab436c9d768753cbc3c47a865a2cbc0757066cb864747baa61f6ece", + "sha256:7e9b24cca4037a561422bf5dc52b38d390fb61f7bfff64053ce1b72f6938e6b2", + "sha256:810ca06cca91de9107718dc83d9ac4d2e86efd6c02cba49a190abcaf33fb0472", + "sha256:820f6ee5c06bc868335e3b6e42d7ef41f50dfb3ea32fbd523ab679d10d8741c0", + "sha256:82764c0bd697159fe9947ad59b6db6d7329e88505c8f98990eb07e84cc0a5d81", + "sha256:8ae65fdfb8a841556b52935dfd4c3f79132dc5253b12c0061b96415208f4d622", + "sha256:8d5b0ff3218858859910295df6953d7bafac3a48d5cd18f4e3ed9999efd2245f", + "sha256:95d6bf449a1ac81de562d65d180af5d8c19672793c81877a2eda8fde5d08f2fd", + "sha256:964c7aa318da542cdcc60d4a648377ffe1a2ef0eb1e996026c7f74507b720a78", + "sha256:96ef39add33ff58cd4c112cbac076726b96b98bb8f1e7f7595288dcfb2f10b57", + "sha256:a6612c2a844043e4d10a8324c54cdff0042c558eef30bd705770793d70b224aa", + "sha256:a8031074a397a5925d06b590121f8339d34a5a74cfe6970f8a1124eb8b83f4ac", + "sha256:aab9e522efff3993a9e98ab14263d4e20211e62da088298089a03056980a3e69", + "sha256:ae579143826c6f05a361d9546446c432a165ecf1c0b720bbfd81152645cb897d", + "sha256:ae90b9e50fe1bd115b24785e962b51130340408156d34d67b5f8f3fa6540938e", + "sha256:b18cf68255a476b927910c6873d9ed00da692bb293c5b10b282bd48a0afe3ae2", + "sha256:b7efb12e5071ad8d5b547487bdad489fbd4a5a35a0fc36a1941517a6ad7f23e0", + "sha256:c4d9f15ffe68bcd3898b0ad7233af01b15c57d91cd1667f8d868e0eacbfe3f87", + "sha256:c53100c8ee5a1e102766abde2158077d8c374bee0639201f11d3032e3555dfbc", + "sha256:c57e493a0faea1e4c38f860d6862ba6832723396c884fbf938ff5e9b224200e2", + "sha256:c8319e0bd6a7b45ad76166cc3d5d6a36c97d0c82a196f478c3ee5346566eebfd", + "sha256:caffda619099cfd4f63d48462f6aadbecee3ad9603b4b88b60cb821c1b258576", + "sha256:cc0c316fba3ce72ac3ab7902a888b9dc4979162d320823679da270c2d9ad0cad", + "sha256:cdd02a08205dc90238669f082747612cb3c82bd2c717adc60f9b9ecadb540f80", + "sha256:d50ac34835c6a4a0d456b5db559b82047403c4317b3bc73b3455fefdbdc54b0a", + "sha256:d6b9dd6aa03c812017411734e496c44fef29b43dba1e3dd1fa7361bbacfc1354", + "sha256:da3131ef2b940b99106f29dfbc30d9505643f766704e14c5d5e504e6a480c35e", + "sha256:da43cbe593e3c87d07108d0ebd73771dc414488f1f91ed2e204b0370b94b37ac", + "sha256:dd59638025160056687d598b054b64a79183f8065eae0d3f5ca523cde9943940", + "sha256:e1895e949f8849bc2757c0dbac28422a04be031204df46a56ab34bcf98507342", + "sha256:e1a79ad49f346aa1a2921f31e8dbbab4d64484823e813a002679eaa46cba39e1", + "sha256:e460475719721d59cd54a350c1f71c797c763212c836bf48585478c5514d2854", + "sha256:e64ffaf8f6e17ca15eb48344d86a7a741454526f3a3fa56bc493ad9d7ec63936", + "sha256:e6e3ccebdbd6e53474b0bb7ab8b88e83c0cfe91484b25e058e581348ee5a01a5", + "sha256:e758d271ed0286d146cf7c04c539a5169a888dd0b57026be621547e756af55bc", + "sha256:f087879f1ffde024dd2788a30d55acd67959dcf6c431e9d3682d1c491a0eb474", + "sha256:f477d26183e94eaafc60b983ab25af2a809a1b48ce4debb57b343f671b7a90b6", + "sha256:fc535cb898ef88333cf317777ecdfe0faac1c2a3187ef7eb061b6f7ecf7e6bae" ], "markers": "python_version >= '3.8'", - "version": "==2.18.4" + "version": "==2.23.2" }, "pytest": { "hashes": [ - "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343", - "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977" + "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5", + "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce" ], "index": "pypi", - "version": "==8.2.2" + "markers": "python_version >= '3.8'", + "version": "==8.3.2" }, "python-dateutil": { "hashes": [ @@ -781,6 +826,7 @@ "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==1.0.1" }, "pytz": { @@ -818,6 +864,7 @@ "sha256:0bdf270b5b7f53915832f7c31dd2bd3ffdc20b534ea6b32231cc7003049bd0e1" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==0.0.1rc1" }, "tinydb": { @@ -841,7 +888,7 @@ "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" ], - "markers": "python_version >= '3.8'", + "markers": "python_version < '3.13'", "version": "==4.12.2" }, "tzdata": { @@ -862,11 +909,11 @@ }, "werkzeug": { "hashes": [ - "sha256:097e5bfda9f0aba8da6b8545146def481d06aa7d3266e7448e2cccf67dd8bd18", - "sha256:fc9645dc43e03e4d630d23143a04a7f947a9a3b5727cd535fdfe155a17cc48c8" + "sha256:02c9eb92b7d6c06f31a782811505d2157837cea66aaede3e217c7c27c039476c", + "sha256:34f2371506b250df4d4f84bfe7b0921e4762525762bbd936614909fe25cd7306" ], "markers": "python_version >= '3.8'", - "version": "==3.0.3" + "version": "==3.0.4" }, "wrapt": { "hashes": [ @@ -946,159 +993,182 @@ }, "yarl": { "hashes": [ - "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51", - "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce", - "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559", - "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0", - "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81", - "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc", - "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4", - "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c", - "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130", - "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136", - "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e", - "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec", - "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7", - "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1", - "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455", - "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099", - "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129", - "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10", - "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142", - "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98", - "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa", - "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7", - "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525", - "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c", - "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9", - "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c", - "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8", - "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b", - "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf", - "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23", - "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd", - "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27", - "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f", - "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece", - "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434", - "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec", - "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff", - "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78", - "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d", - "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863", - "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53", - "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31", - "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15", - "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5", - "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b", - "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57", - "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3", - "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1", - "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f", - "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad", - "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c", - "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7", - "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2", - "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b", - "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2", - "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b", - "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9", - "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be", - "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e", - "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984", - "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4", - "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074", - "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2", - "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392", - "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91", - "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541", - "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf", - "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572", - "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66", - "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575", - "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14", - "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5", - "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1", - "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e", - "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551", - "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17", - "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead", - "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0", - "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe", - "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234", - "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0", - "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7", - "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34", - "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42", - "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385", - "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78", - "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be", - "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958", - "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749", - "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec" + "sha256:012c506b2c23be4500fb97509aa7e6a575996fb317b80667fa26899d456e2aaf", + "sha256:030d41d48217b180c5a176e59c49d212d54d89f6f53640fa4c1a1766492aec27", + "sha256:044b76d069e69c6b0246f071ebac0576f89c772f806d66ef51e662bd015d03c7", + "sha256:05b07e6e0f715eaae9d927a302d9220724392f3c0b4e7f8dfa174bf2e1b8433e", + "sha256:0b3bf343b4ef9ec600d75363eb9b48ab3bd53b53d4e1c5a9fbf0cfe7ba73a47f", + "sha256:0e0aea8319fdc1ac340236e58b0b7dc763621bce6ce98124a9d58104cafd0aaa", + "sha256:11f7f8a72b3e26c533fa7ffa7a8068f4e3aad7b67c5cf7b17ea8c79fc81d9830", + "sha256:1718c0bca5a61edac7a57dcc11856cb01bde13a9360a3cb6baf384b89cfc0b40", + "sha256:179b1df5e9cd99234ea65e63d5bfc6dd524b2c3b6cf68a14b94ccbe01ab37ddd", + "sha256:1824bfb932d8100e5c94f4f98c078f23ebc6f6fa93acc3d95408762089c54a06", + "sha256:183136dc5d5411872e7529c924189a2e26fac5a7f9769cf13ef854d1d653ad36", + "sha256:183dd37bb5471e8017ab8a998c1ea070b4a0b08a97a7c4e20e0c7ccbe8ebb999", + "sha256:18b7ce6d8c35da8e16dcc8de124a80e250fc8c73f8c02663acf2485c874f1972", + "sha256:18bc4600eed1907762c1816bb16ac63bc52912e53b5e9a353eb0935a78e95496", + "sha256:190e70d2f9f16f1c9d666c103d635c9ed4bf8de7803e9fa0495eec405a3e96a8", + "sha256:1ea30675fbf0ad6795c100da677ef6a8960a7db05ac5293f02a23c2230203c89", + "sha256:1eafa7317063de4bc310716cdd9026c13f00b1629e649079a6908c3aafdf5046", + "sha256:23057a004bc9735008eb2a04b6ce94c6c06219cdf2b193997fd3ae6039eb3196", + "sha256:273baee8a8af5989d5aab51c740e65bc2b1fc6619b9dd192cd16a3fae51100be", + "sha256:293f7c2b30d015de3f1441c4ee764963b86636fde881b4d6093498d1e8711f69", + "sha256:2b922c32a1cff62bc43d408d1a8745abeed0a705793f2253c622bf3521922198", + "sha256:308d1cce071b5b500e3d95636bbf15dfdb8e87ed081b893555658a7f9869a156", + "sha256:30dde3a8b88c80a4f049eb4dd240d2a02e89174da6be2525541f949bf9fa38ab", + "sha256:315e8853d0ea46aabdce01f1f248fff7b9743de89b555c5f0487f54ac84beae8", + "sha256:32d2e46848dea122484317485129f080220aa84aeb6a9572ad9015107cebeb07", + "sha256:32e79d5ae975f7c2cc29f7104691fc9be5ee3724f24e1a7254d72f6219672108", + "sha256:3352c69dc235850d6bf8ddad915931f00dcab208ac4248b9af46175204c2f5f9", + "sha256:347011ad09a8f9be3d41fe2d7d611c3a4de4d49aa77bcb9a8c03c7a82fc45248", + "sha256:348ad53acd41caa489df7db352d620c982ab069855d9635dda73d685bbbc3636", + "sha256:3576ed2c51f8525d4ff5c3279247aacff9540bb43b292c4a37a8e6c6e1691adb", + "sha256:36d12d78b8b0d46099d413c8689b5510ad9ce5e443363d1c37b6ac5b3d7cbdfb", + "sha256:3bf10a395adac62177ba8ea738617e8de6cbb1cea6aa5d5dd2accde704fc8195", + "sha256:48a48261f8d610b0e15fed033e74798763bc2f8f2c0d769a2a0732511af71f1e", + "sha256:493ad061ee025c5ed3a60893cd70204eead1b3f60ccc90682e752f95b845bd46", + "sha256:4c46454fafa31f7241083a0dd21814f63e0fcb4ae49662dc7e286fd6a5160ea1", + "sha256:4cca9ba00be4bb8a051c4007b60fc91d6c9728c8b70c86cee4c24be9d641002f", + "sha256:4f6ac063a4e9bbd4f6cc88cc621516a44d6aec66862ea8399ba063374e4b12c7", + "sha256:52d1ae09b0764017e330bb5bf9af760c0168c564225085bb806f687bccffda8a", + "sha256:534b8bc181dca1691cf491c263e084af678a8fb6b6181687c788027d8c317026", + "sha256:54a4b5e6a060d46cad6a3cf340f4cb268e6fbc89c589d82a2da58f7db47c47c8", + "sha256:5b46c603bee1f2dd407b8358c2afc9b0472a22ccca528f114e1f4cd30dfecd22", + "sha256:5cece693380c1c4a606cdcaa0c54eda8f72cfe1ba83f5149b9023bb955e8fa8e", + "sha256:5d0c9e1dcc92d46ca89608fe4763fc2362f1e81c19a922c67dbc0f20951466e4", + "sha256:5f3372f9ae1d1f001826b77d0b29d4220e84f6c5f53915e71a825cdd02600065", + "sha256:5f769c2708c31227c5349c3e4c668c8b4b2e25af3e7263723f2ef33e8e3906a0", + "sha256:6026a6ef14d038a38ca9d81422db4b6bb7d5da94f9d08f21e0ad9ebd9c4bc3bb", + "sha256:637dd0f55d1781d4634c23994101c509e455b5ab61af9086b5763b7eca9359aa", + "sha256:687131ee4d045f3d58128ca28f5047ec902f7760545c39bbe003cc737c5a02b5", + "sha256:6bc602c7413e1b5223bc988947125998cb54d6184de45a871985daacc23e6c8c", + "sha256:6e91ed5f6818e1e3806eaeb7b14d9e17b90340f23089451ea59a89a29499d760", + "sha256:6eec21d8c3aa932c5a89480b58fa877e9c48092ab838ccc76788cbc917ceec0d", + "sha256:6f4f43ba30d604ba391bc7fe2dd104d6b87b62b0de4bbde79e362524b8a1eb75", + "sha256:6f64f8681671624f539eea5564518bc924524c25eb90ab24a7eddc2d872e668e", + "sha256:762a196612c2aba4197cd271da65fe08308f7ddf130dc63842c7a76d774b6a2c", + "sha256:88173836a25b7e5dce989eeee3b92d8ef5cdf512830d4155c6212de98e616f70", + "sha256:8c6214071f653d21bb7b43f7ee519afcbf7084263bb43408f4939d14558290db", + "sha256:8d7bd531d7eec4aa7ef8a99fef91962eeea5158a53af0ec507c476ddf8ebc29c", + "sha256:8e69b55965a47dd6c79e578abd7d85637b1bb4a7565436630826bdb28aa9b7ad", + "sha256:90fd64ce00f594db02f603efa502521c440fa1afcf6266be82eb31f19d2d9561", + "sha256:96422a3322b4d954f4c52403a2fc129ad118c151ee60a717847fb46a8480d1e1", + "sha256:99e7459ee86a3b81e57777afd3825b8b1acaac8a99f9c0bd02415d80eb3c371b", + "sha256:99eaa7d53f509ba1c2fea8fdfec15ba3cd36caca31d57ec6665073b148b5f260", + "sha256:9a8d6a0e2b5617b5c15c59db25f20ba429f1fea810f2c09fbf93067cb21ab085", + "sha256:9b6d0d7522b514f054b359409817af4c5ed76fa4fe42d8bd1ed12956804cf595", + "sha256:9ef7ce61958b3c7b2e2e0927c52d35cf367c5ee410e06e1337ecc83a90c23b95", + "sha256:a162cf04fd1e8d81025ec651d14cac4f6e0ca73a3c0a9482de8691b944e3098a", + "sha256:a80cdb3c15c15b33ecdb080546dcb022789b0084ca66ad41ffa0fe09857fca11", + "sha256:a9d8c4be5658834dc688072239d220631ad4b71ff79a5f3d17fb653f16d10759", + "sha256:aa1aeb99408be0ca774c5126977eb085fedda6dd7d9198ce4ceb2d06a44325c7", + "sha256:af5b52bfbbd5eb208cf1afe23c5ada443929e9b9d79e9fbc66cacc07e4e39748", + "sha256:b453b3dbc1ed4c2907632d05b378123f3fb411cad05d8d96de7d95104ef11c70", + "sha256:b80246bdee036381636e73ef0f19b032912064622b0e5ee44f6960fd11df12aa", + "sha256:bc544248b5263e1c0f61332ccf35e37404b54213f77ed17457f857f40af51452", + "sha256:bc66927f6362ed613a483c22618f88f014994ccbd0b7a25ec1ebc8c472d4b40a", + "sha256:be199fed28861d72df917e355287ad6835555d8210e7f8203060561f24d7d842", + "sha256:beda87b63c08fb4df8cc5353eeefe68efe12aa4f5284958bd1466b14c85e508e", + "sha256:bf733c835ebbd52bd78a52b919205e0f06d8571f71976a0259e5bcc20d0a2f44", + "sha256:c1bf63ba496cd4f12d30e916d9a52daa6c91433fedd9cd0d99fef3e13232836f", + "sha256:c382e189af10070bcb39caa9406b9cc47b26c1d2257979f11fe03a38be09fea9", + "sha256:c4d13071c5b99974cfe2f94c749ecc4baf882f7c4b6e4c40ca3d15d1b7e81f24", + "sha256:c5527d32506c11150ca87f33820057dc284e2a01a87f0238555cada247a8b278", + "sha256:c77a3c10af4aaf8891578fe492ef0990c65cf7005dd371f5ea8007b420958bf6", + "sha256:ca42a9281807fdf8fba86e671d8fdd76f92e9302a6d332957f2bae51c774f8a7", + "sha256:cd65588273d19f8483bc8f32a6fcf602e94a9a7ba287a1725977bd9527cd6c0c", + "sha256:d2366e2f987f69752f0588d2035321aaf24272693d75f7f6bb7e8a0f48f7ccdd", + "sha256:dff84623e7098cf9bfbb5187f9883051af652b0ce08b9f7084cc8630b87b6457", + "sha256:e4657fd290d556a5f3018d07c7b7deadcb622760c0125277d10a11471c340054", + "sha256:e8da33665ecc64cd3e593098adb449f9c65b4e3bc6338e75ad592da15453d898", + "sha256:eeb6a40c5ae2616fd38c1e039c6dd50031bbfbc2acacfd7b70a5d64fafc70901", + "sha256:f8e24b9a4afdffab399191a9f0b0e80eabc7b7fdb9f2dbccdeb8e4d28e5c57bb", + "sha256:ff45a655ca51e1cb778abbb586083fddb7d896332f47bb3b03bc75e30c25649f", + "sha256:ff8e803d8ca170e632fb3b4df1bfd29ba29be8edc3e9306c5ffa5fadea234a4f" ], - "markers": "python_version >= '3.7'", - "version": "==1.9.4" + "markers": "python_version >= '3.8'", + "version": "==1.10.0" } }, "develop": { "coverage": { "hashes": [ - "sha256:018a12985185038a5b2bcafab04ab833a9a0f2c59995b3cec07e10074c78635f", - "sha256:02ff6e898197cc1e9fa375581382b72498eb2e6d5fc0b53f03e496cfee3fac6d", - "sha256:042183de01f8b6d531e10c197f7f0315a61e8d805ab29c5f7b51a01d62782747", - "sha256:1014fbf665fef86cdfd6cb5b7371496ce35e4d2a00cda501cf9f5b9e6fced69f", - "sha256:1137f46adb28e3813dec8c01fefadcb8c614f33576f672962e323b5128d9a68d", - "sha256:16852febd96acd953b0d55fc842ce2dac1710f26729b31c80b940b9afcd9896f", - "sha256:2174e7c23e0a454ffe12267a10732c273243b4f2d50d07544a91198f05c48f47", - "sha256:2214ee920787d85db1b6a0bd9da5f8503ccc8fcd5814d90796c2f2493a2f4d2e", - "sha256:3257fdd8e574805f27bb5342b77bc65578e98cbc004a92232106344053f319ba", - "sha256:3684bc2ff328f935981847082ba4fdc950d58906a40eafa93510d1b54c08a66c", - "sha256:3a6612c99081d8d6134005b1354191e103ec9705d7ba2754e848211ac8cacc6b", - "sha256:3d7564cc09dd91b5a6001754a5b3c6ecc4aba6323baf33a12bd751036c998be4", - "sha256:44da56a2589b684813f86d07597fdf8a9c6ce77f58976727329272f5a01f99f7", - "sha256:5013ed890dc917cef2c9f765c4c6a8ae9df983cd60dbb635df8ed9f4ebc9f555", - "sha256:54317c2b806354cbb2dc7ac27e2b93f97096912cc16b18289c5d4e44fc663233", - "sha256:56b4eafa21c6c175b3ede004ca12c653a88b6f922494b023aeb1e836df953ace", - "sha256:581ea96f92bf71a5ec0974001f900db495488434a6928a2ca7f01eee20c23805", - "sha256:5cd64adedf3be66f8ccee418473c2916492d53cbafbfcff851cbec5a8454b136", - "sha256:5df54843b88901fdc2f598ac06737f03d71168fd1175728054c8f5a2739ac3e4", - "sha256:65e528e2e921ba8fd67d9055e6b9f9e34b21ebd6768ae1c1723f4ea6ace1234d", - "sha256:6aae5cce399a0f065da65c7bb1e8abd5c7a3043da9dceb429ebe1b289bc07806", - "sha256:6cfb5a4f556bb51aba274588200a46e4dd6b505fb1a5f8c5ae408222eb416f99", - "sha256:7076b4b3a5f6d2b5d7f1185fde25b1e54eb66e647a1dfef0e2c2bfaf9b4c88c8", - "sha256:73ca8fbc5bc622e54627314c1a6f1dfdd8db69788f3443e752c215f29fa87a0b", - "sha256:79b356f3dd5b26f3ad23b35c75dbdaf1f9e2450b6bcefc6d0825ea0aa3f86ca5", - "sha256:7a892be37ca35eb5019ec85402c3371b0f7cda5ab5056023a7f13da0961e60da", - "sha256:8192794d120167e2a64721d88dbd688584675e86e15d0569599257566dec9bf0", - "sha256:820bc841faa502e727a48311948e0461132a9c8baa42f6b2b84a29ced24cc078", - "sha256:8f894208794b164e6bd4bba61fc98bf6b06be4d390cf2daacfa6eca0a6d2bb4f", - "sha256:a04e990a2a41740b02d6182b498ee9796cf60eefe40cf859b016650147908029", - "sha256:a44963520b069e12789d0faea4e9fdb1e410cdc4aab89d94f7f55cbb7fef0353", - "sha256:a6bb74ed465d5fb204b2ec41d79bcd28afccf817de721e8a807d5141c3426638", - "sha256:ab73b35e8d109bffbda9a3e91c64e29fe26e03e49addf5b43d85fc426dde11f9", - "sha256:aea072a941b033813f5e4814541fc265a5c12ed9720daef11ca516aeacd3bd7f", - "sha256:b1ccf5e728ccf83acd313c89f07c22d70d6c375a9c6f339233dcf792094bcbf7", - "sha256:b385d49609f8e9efc885790a5a0e89f2e3ae042cdf12958b6034cc442de428d3", - "sha256:b3d45ff86efb129c599a3b287ae2e44c1e281ae0f9a9bad0edc202179bcc3a2e", - "sha256:b4a474f799456e0eb46d78ab07303286a84a3140e9700b9e154cfebc8f527016", - "sha256:b95c3a8cb0463ba9f77383d0fa8c9194cf91f64445a63fc26fb2327e1e1eb088", - "sha256:c5986ee7ea0795a4095ac4d113cbb3448601efca7f158ec7f7087a6c705304e4", - "sha256:cdd31315fc20868c194130de9ee6bfd99755cc9565edff98ecc12585b90be882", - "sha256:cef4649ec906ea7ea5e9e796e68b987f83fa9a718514fe147f538cfeda76d7a7", - "sha256:d05c16cf4b4c2fc880cb12ba4c9b526e9e5d5bb1d81313d4d732a5b9fe2b9d53", - "sha256:d2e344d6adc8ef81c5a233d3a57b3c7d5181f40e79e05e1c143da143ccb6377d", - "sha256:d45d3cbd94159c468b9b8c5a556e3f6b81a8d1af2a92b77320e887c3e7a5d080", - "sha256:db14f552ac38f10758ad14dd7b983dbab424e731588d300c7db25b6f89e335b5", - "sha256:dbc5958cb471e5a5af41b0ddaea96a37e74ed289535e8deca404811f6cb0bc3d", - "sha256:ddbd2f9713a79e8e7242d7c51f1929611e991d855f414ca9996c20e44a895f7c", - "sha256:e16f3d6b491c48c5ae726308e6ab1e18ee830b4cdd6913f2d7f77354b33f91c8", - "sha256:e2afe743289273209c992075a5a4913e8d007d569a406ffed0bd080ea02b0633", - "sha256:e564c2cf45d2f44a9da56f4e3a26b2236504a496eb4cb0ca7221cd4cc7a9aca9", - "sha256:ed550e7442f278af76d9d65af48069f1fb84c9f745ae249c1a183c1e9d1b025c" + "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca", + "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d", + "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6", + "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989", + "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c", + "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b", + "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223", + "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f", + "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56", + "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3", + "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8", + "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb", + "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388", + "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0", + "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a", + "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8", + "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f", + "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a", + "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962", + "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8", + "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391", + "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc", + "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2", + "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155", + "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb", + "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0", + "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c", + "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a", + "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004", + "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060", + "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232", + "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93", + "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129", + "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163", + "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de", + "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6", + "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23", + "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569", + "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d", + "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778", + "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d", + "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36", + "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a", + "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6", + "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34", + "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704", + "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106", + "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9", + "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862", + "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b", + "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255", + "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16", + "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3", + "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133", + "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb", + "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657", + "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d", + "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca", + "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36", + "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c", + "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e", + "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff", + "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7", + "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5", + "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02", + "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c", + "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df", + "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3", + "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a", + "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959", + "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234", + "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc" ], "index": "pypi", - "version": "==7.5.4" + "markers": "python_version >= '3.8'", + "version": "==7.6.1" }, "iniconfig": { "hashes": [ @@ -1126,11 +1196,12 @@ }, "pytest": { "hashes": [ - "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343", - "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977" + "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5", + "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce" ], "index": "pypi", - "version": "==8.2.2" + "markers": "python_version >= '3.8'", + "version": "==8.3.2" } } } diff --git a/dbrepo-search-service/init/app.py b/dbrepo-search-service/init/app.py index fccbd92feaf8f9e3e904ca245e485ff4b8f8aa8e..450575ba090c445e030c60464a68f820f79b173b 100644 --- a/dbrepo-search-service/init/app.py +++ b/dbrepo-search-service/init/app.py @@ -6,6 +6,7 @@ from typing import List import opensearchpy.exceptions from dbrepo.RestClient import RestClient from logging.config import dictConfig +from pathlib import Path from dbrepo.api.dto import Database from opensearchpy import OpenSearch @@ -48,11 +49,11 @@ class App: search_instance: OpenSearch = None def __init__(self): - self.metadata_service_endpoint = os.getenv("METADATA_SERVICE_ENDPOINT") - self.search_host = os.getenv("OPENSEARCH_HOST") - self.search_port = int(os.getenv("OPENSEARCH_PORT")) - self.search_username = os.getenv("OPENSEARCH_USERNAME") - self.search_password = os.getenv("OPENSEARCH_PASSWORD") + self.metadata_service_endpoint = os.getenv("METADATA_SERVICE_ENDPOINT", "http://metadata-service:8080") + self.search_host = os.getenv("OPENSEARCH_HOST", "search-db") + self.search_port = int(os.getenv("OPENSEARCH_PORT", "9200")) + self.search_username = os.getenv("OPENSEARCH_USERNAME", "admin") + self.search_password = os.getenv("OPENSEARCH_PASSWORD", "admin") def _instance(self) -> OpenSearch: """ @@ -101,16 +102,17 @@ class App: return True def fetch_databases(self) -> List[Database]: + logging.debug(f"fetching database from endpoint: {self.metadata_service_endpoint}") client = RestClient(endpoint=self.metadata_service_endpoint) databases = [] - for database in client.get_databases(): + for database, index in client.get_databases(): + logging.debug(f"fetching database {index}/{len(databases)} details for database id: {database.id}") databases.append(client.get_database(database_id=database.id)) logging.debug(f"fetched {len(databases)} database(s)") return databases def save_databases(self, databases: List[Database]): - logging.debug( - f"save {len(databases)} database(s)") + logging.debug(f"save {len(databases)} database(s)") for doc in databases: doc: Database = doc try: diff --git a/dbrepo-search-service/init/lib/dbrepo-1.4.6.tar.gz b/dbrepo-search-service/init/lib/dbrepo-1.4.6.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..958287917e7f2b38a0286c3e91c2d471462bceee Binary files /dev/null and b/dbrepo-search-service/init/lib/dbrepo-1.4.6.tar.gz differ diff --git a/dbrepo-search-service/init/lib/dbrepo-1.4.6rc1-py3-none-any.whl b/dbrepo-search-service/init/lib/dbrepo-1.4.6rc1-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..83944ce88d8aec5a3b767aa09caf9a8700323104 Binary files /dev/null and b/dbrepo-search-service/init/lib/dbrepo-1.4.6rc1-py3-none-any.whl differ diff --git a/dbrepo-search-service/init/lib/dbrepo-1.4.6rc1.tar.gz b/dbrepo-search-service/init/lib/dbrepo-1.4.6rc1.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..a0c8432134f3c21359cd7fb8ee1a341812a6c034 Binary files /dev/null and b/dbrepo-search-service/init/lib/dbrepo-1.4.6rc1.tar.gz differ diff --git a/dbrepo-search-service/lib/dbrepo-1.4.6.tar.gz b/dbrepo-search-service/lib/dbrepo-1.4.6.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..958287917e7f2b38a0286c3e91c2d471462bceee Binary files /dev/null and b/dbrepo-search-service/lib/dbrepo-1.4.6.tar.gz differ diff --git a/dbrepo-search-service/lib/dbrepo-1.4.6rc1-py3-none-any.whl b/dbrepo-search-service/lib/dbrepo-1.4.6rc1-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..83944ce88d8aec5a3b767aa09caf9a8700323104 Binary files /dev/null and b/dbrepo-search-service/lib/dbrepo-1.4.6rc1-py3-none-any.whl differ diff --git a/dbrepo-search-service/lib/dbrepo-1.4.6rc1.tar.gz b/dbrepo-search-service/lib/dbrepo-1.4.6rc1.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..a0c8432134f3c21359cd7fb8ee1a341812a6c034 Binary files /dev/null and b/dbrepo-search-service/lib/dbrepo-1.4.6rc1.tar.gz differ diff --git a/dbrepo-ui/components/container/ContainerCard.vue b/dbrepo-ui/components/container/ContainerCard.vue new file mode 100644 index 0000000000000000000000000000000000000000..b2937cf6b4fb7f1a243056ea52ccd4649e205772 --- /dev/null +++ b/dbrepo-ui/components/container/ContainerCard.vue @@ -0,0 +1,53 @@ +<template> + <v-card + v-if="container" + variant="flat" + rounded="0"> + <v-divider class="mx-4" /> + <v-card-title + v-text="container.name" /> + <v-card-subtitle v-text="$t('pages.container.subtitle.text')" /> + <v-card-text> + <v-progress-linear + v-model="utilization" + :color="colorVariant" + height="20" + class="font-small"> + <template v-slot:default> + {{ container.count }} / {{ container.quota }} + </template> + </v-progress-linear> + </v-card-text> + </v-card> +</template> + +<script> +export default { + data() { + return { + loading: false + } + }, + props: { + container: { + default: () => { + return null + } + } + }, + computed: { + utilization () { + return this.container.count * 100.0 / this.container.quota + }, + colorVariant () { + return this.isContrastTheme ? '' : (this.isDarkTheme ? 'tertiary' : 'secondary') + }, + isContrastTheme () { + return this.$vuetify.theme.global.name.toLowerCase().endsWith('contrast') + }, + isDarkTheme () { + return this.$vuetify.theme.global.name.toLowerCase().startsWith('dark') + } + } +} +</script> diff --git a/dbrepo-ui/components/container/ContainerList.vue b/dbrepo-ui/components/container/ContainerList.vue new file mode 100644 index 0000000000000000000000000000000000000000..567ee4eec4fdb361157a8dd8d7d0d3e0f6e77d7b --- /dev/null +++ b/dbrepo-ui/components/container/ContainerList.vue @@ -0,0 +1,42 @@ +<template> + <div> + <v-card + variant="flat" + rounded="0"> + <v-list-item + v-if="loading" + lines="two"> + <Loading /> + </v-list-item> + </v-card> + <ContainerCard + v-for="(container, idx) in containers" + :container="container" + :key="idx"/> + </div> +</template> + +<script> +import ContainerCard from '@/components/container/ContainerCard.vue' + +export default { + components: { + ContainerCard + }, + props: { + containers: { + type: Array, + default: () => { + return [] + } + }, + loading: { + type: Boolean, + default: () => { + return true + } + } + } +} +</script> + diff --git a/dbrepo-ui/components/database/DatabaseCreate.vue b/dbrepo-ui/components/database/DatabaseCreate.vue index 275b7198311f6edc62aeefb07311e2d01fea771c..8d909b4da350c1cbc10dfad7d595799aa3adee4e 100644 --- a/dbrepo-ui/components/database/DatabaseCreate.vue +++ b/dbrepo-ui/components/database/DatabaseCreate.vue @@ -40,7 +40,17 @@ item-value="id" :rules="[v => !!v || $t('validation.required')]" return-object - required /> + required> + <template + v-slot:selection> + <span>{{ engine.name }}</span> + </template> + <template + v-if="engine" + v-slot:details> + {{ $t('pages.database.subpages.create.utilization.label') }} {{ engine.count }}/{{ engine.quota }} + </template> + </v-select> </v-col> </v-row> </v-card-text> @@ -106,7 +116,13 @@ export default { this.loadingContainers = true containerService.findAll() .then((containers) => { - this.engines = containers + const freeContainers = containers.filter(c => c.count < c.quota) + const defaultContainers = freeContainers.filter(c => c.image.default) + defaultContainers.sort(this.compareContainerUtilization) + this.engines = defaultContainers + const other = freeContainers.filter(c => !c.image.default) + other.sort(this.compareContainerUtilization) + other.forEach(c => this.engines.push(c)) if (this.engines.length > 0) { this.engine = this.engines[0] } @@ -139,6 +155,9 @@ export default { toast.error(this.$t(code)) }) }, + compareContainerUtilization (container, other) { + return Math.round(container.count / container.quota) < Math.round(other.count / other.quota) + }, notEmpty } } diff --git a/dbrepo-ui/components/database/DatabaseToolbar.vue b/dbrepo-ui/components/database/DatabaseToolbar.vue index 0c87e5599c688b3c4feebfbadb09a8868071d54d..741252475c31ef841260266d3d4fcb459b35cd64 100644 --- a/dbrepo-ui/components/database/DatabaseToolbar.vue +++ b/dbrepo-ui/components/database/DatabaseToolbar.vue @@ -135,6 +135,12 @@ export default { } return this.access.type === 'write_all' || this.access.type === 'write_own' }, + hasReadAccess () { + if (!this.access) { + return false + } + return this.access.type === 'read' || this.access.type === 'write_all' || this.access.type === 'write_own' + }, canImportCsv () { if (!this.user || !this.hasWriteAccess) { return false @@ -142,10 +148,13 @@ export default { return this.roles.includes('insert-table-data') }, canCreateSubset () { - if (!this.user) { + if (!this.database) { return false } - return this.roles.includes('execute-query') + if (this.database.is_public) { + return true + } + return this.hasReadAccess }, canCreateView () { if (!this.user || !this.isOwner) { diff --git a/dbrepo-ui/components/table/TableImport.vue b/dbrepo-ui/components/table/TableImport.vue index 2451a7c3acb18722e8e4b0ebdb9fe10effcd554d..e55db4130e893810d22bf93ea4308c6e97a2b060 100644 --- a/dbrepo-ui/components/table/TableImport.vue +++ b/dbrepo-ui/components/table/TableImport.vue @@ -149,7 +149,8 @@ <v-row v-if="step > 1 && suggestedAnalyseSeparator && providedSeparator !== analysedSeparator" dense> - <v-col> + <v-col + md="8"> <v-alert border="start" color="warning"> @@ -164,7 +165,8 @@ <v-row v-if="step > 1 && suggestedAnalyseLineTerminator && providedTerminator !== analysedTerminator" dense> - <v-col> + <v-col + md="8"> <v-alert border="start" color="warning"> @@ -261,23 +263,20 @@ direction="vertical"> <v-container> <v-row - v-if="rowCount" dense> <v-col md="8"> <v-alert border="start" color="success"> - <span v-text="$t(`pages.table.subpages.import.summary.prefix`)"/> - <strong> {{ rowCount }} </strong> - <span v-text="$t('pages.table.subpages.import.summary.suffix')"/> + <span v-text="$t(`pages.table.subpages.import.summary.text`)"/> </v-alert> </v-col> </v-row> <v-row> <v-col> <v-btn - v-if="rowCount !== null" + v-if="step === 3" color="secondary" :disabled="step !== 3 || disabled" size="small" @@ -457,10 +456,6 @@ export default { const toast = useToastInstance() toast.success(this.$t('success.import.dataset')) this.cacheStore.reloadDatabase() - tableService.getCount(this.$route.params.database_id, this.tableId, null) - .then((rowCount) => { - this.rowCount = rowCount - }) this.step = 3 this.validStep3 = true this.loadingImport = false @@ -542,7 +537,7 @@ export default { this.$emit('analyse', { columns: this.columns, filename, - line_termination, + line_termination: line_termination === '\\n' ? '\n' : JSON.stringify(line_termination).replaceAll('"', ''), separator: this.tableImport.separator, skip_lines: this.tableImport.skip_lines, quote: this.tableImport.quote, diff --git a/dbrepo-ui/components/table/TableSchema.vue b/dbrepo-ui/components/table/TableSchema.vue index 25c4f66cb55993ff6e5f482b4bf63749021ec155..da30905fa30a9327ca90266bd2ee4088fab46c70 100644 --- a/dbrepo-ui/components/table/TableSchema.vue +++ b/dbrepo-ui/components/table/TableSchema.vue @@ -176,7 +176,7 @@ variant="flat" size="small" :loading="loading" - :disabled="disabled || !valid || this.columns.length === 0" + :disabled="disabled || !valid || showPrimaryKeyWarning || this.columns.length === 0" :text="submitText" @click="submit" /> </v-col> diff --git a/dbrepo-ui/composables/query-service.ts b/dbrepo-ui/composables/query-service.ts index abcd928b66d0350fd855ae380b959a33818b8f3d..f5d805b958f27676f7f1031bfe56af16721b4378 100644 --- a/dbrepo-ui/composables/query-service.ts +++ b/dbrepo-ui/composables/query-service.ts @@ -206,15 +206,15 @@ export const useQueryService = (): any => { {value: 'char', text: 'CHAR(size)', defaultSize: 1, defaultD: null, quoted: true, isBuildable: true}, {value: 'date', text: 'DATE', defaultSize: null, defaultD: null, quoted: true, isBuildable: true}, {value: 'datetime', text: 'DATETIME(fsp)', defaultSize: null, defaultD: null, quoted: true, isBuildable: true}, - {value: 'decimal', text: 'DECIMAL(size, d)', defaultSize: 10, defaultD: 4, quoted: false, isBuildable: true}, - {value: 'double', text: 'DOUBLE(size, d)', defaultSize: 25, defaultD: 4, quoted: false, isBuildable: true}, + {value: 'decimal', text: 'DECIMAL(size, d)', defaultSize: 40, defaultD: 10, quoted: false, isBuildable: true}, + {value: 'double', text: 'DOUBLE(size, d)', defaultSize: 40, defaultD: 10, quoted: false, isBuildable: true}, {value: 'enum', text: 'ENUM(val1,val2,...)', defaultSize: null, defaultD: null, quoted: true, isBuildable: true}, {value: 'float', text: 'FLOAT(p)', defaultSize: 24, defaultD: null, quoted: false, isBuildable: true}, {value: 'int', text: 'INT(size)', defaultSize: 255, defaultD: null, quoted: false, isBuildable: true}, {value: 'longblob', text: 'LONGBLOB', defaultSize: null, defaultD: null, quoted: false, isBuildable: false}, {value: 'longtext', text: 'LONGTEXT', defaultSize: null, defaultD: null, quoted: true, isBuildable: true}, {value: 'mediumblob', text: 'MEDIUMBLOB', defaultSize: null, defaultD: null, quoted: false, isBuildable: false}, - {value: 'mediumint', text: 'MEDIUMINT(size)', defaultSize: 10, defaultD: null, quoted: false, isBuildable: true}, + {value: 'mediumint', text: 'MEDIUMINT(size)', defaultSize: 40, defaultD: null, quoted: false, isBuildable: true}, {value: 'mediumtext', text: 'MEDIUMTEXT', defaultSize: null, defaultD: null, quoted: true, isBuildable: true}, {value: 'set', text: 'SET(val1,val2,...)', defaultSize: null, defaultD: null, quoted: true, isBuildable: true}, {value: 'smallint', text: 'SMALLINT(size)', defaultSize: 10, defaultD: null, quoted: false, isBuildable: true}, diff --git a/dbrepo-ui/layouts/default.vue b/dbrepo-ui/layouts/default.vue index 41620761c58257affb380be4be741489c8f77ce8..fef6700c4f95024619ae0563533a9a42fd3425a7 100644 --- a/dbrepo-ui/layouts/default.vue +++ b/dbrepo-ui/layouts/default.vue @@ -35,6 +35,11 @@ to="/semantic" prepend-icon="mdi-share-variant" :title="$t('navigation.semantics')" /> + <v-list-item + v-if="canListContainers" + to="/container" + prepend-icon="mdi-database-settings" + :title="$t('navigation.container')" /> </v-list> <template v-slot:append> <v-alert @@ -216,6 +221,12 @@ export default { } return this.roles.includes('list-ontologies') }, + canListContainers () { + if (!this.roles) { + return false + } + return this.roles.includes('list-containers') + }, logo () { return this.$config.public.logo }, @@ -225,25 +236,21 @@ export default { }, }, watch: { - '$route.params.database_id': { - handler (newId, oldId) { - if (newId === oldId) { + '$route.params': { + handler (newObj, oldObj) { + if (!newObj.database_id) { return } - this.cacheStore.setRouteDatabase(newId) + /* load database and optional access */ + this.cacheStore.setRouteDatabase(newObj.database_id) if (this.user) { - this.userStore.setRouteAccess(newId) + this.userStore.setRouteAccess(newObj.database_id) } - }, - deep: true, - immediate: true - }, - '$route.params.table_id': { - handler (newId, oldId) { - if (newId === oldId) { + if (!newObj.table_id) { return } - this.cacheStore.setRouteTable(this.$route.params.database_id, newId) + /* load table */ + this.cacheStore.setRouteTable(newObj.database_id, newObj.table_id) }, deep: true, immediate: true diff --git a/dbrepo-ui/locales/en-US.json b/dbrepo-ui/locales/en-US.json index be8ddfcc2317d441d3a8b6edacd4b3f5a663c6af..6abf715bc0ea6b7e8756acb78141672758ef9b54 100644 --- a/dbrepo-ui/locales/en-US.json +++ b/dbrepo-ui/locales/en-US.json @@ -2,6 +2,7 @@ "navigation": { "information": "Information", "search": "Search", + "container": "Engines", "ontologies": "Ontologies", "logout": "Logout", "login": "Login", @@ -332,7 +333,7 @@ "title": "Dataset Structure", "text": "the table schema manually.", "primary": { - "warn": "No primary key column(s) selected. Please select a column that uniquely identifies data entries." + "warn": "No primary key column(s) selected. Please select one or more column(s) that uniquely identify data entries." } }, "dataset": { @@ -403,8 +404,7 @@ }, "summary": { "title": "Summary", - "prefix": "Imported", - "suffix": "rows from dataset" + "text": "Successfully imported dataset" }, "analyse": { "text": "Upload & Analyse" @@ -448,7 +448,7 @@ } }, "schema": { - "title": "System Versioned", + "title": "Schema", "subtitle": "Table Constraints", "bullet": "●", "assign": "Assign", @@ -642,6 +642,9 @@ }, "submit": { "text": "Create" + }, + "utilization": { + "label": "Utilization" } }, "tables": { @@ -1034,10 +1037,13 @@ } }, "container": { - "title": "Container", + "title": "Engines", "name": { "title": "Name" }, + "subtitle": { + "text": "Engine" + }, "internal-name": { "title": "Internal Name" }, @@ -1076,7 +1082,8 @@ }, "container": { "exists": "Container already exists in metadata database", - "missing": "Failed to find container in metadata database" + "missing": "Failed to find container in metadata database", + "quota": "Database quota exceeded in engine" }, "data": { "connection": "Failed to contact data service", diff --git a/dbrepo-ui/nuxt.config.ts b/dbrepo-ui/nuxt.config.ts index 454cadf9090d23f92198c63e033ba7061221a29c..dc65c7ac3aca83cc1493bf69d20447273219c677 100644 --- a/dbrepo-ui/nuxt.config.ts +++ b/dbrepo-ui/nuxt.config.ts @@ -2,6 +2,7 @@ import { transformAssetUrls } from 'vite-plugin-vuetify' const proxy : any = {} +/* proxies the backend calls, >>NOT<< the frontend calls (clicking) */ if (process.env.NODE_ENV === 'development') { const api = 'http://localhost' proxy['/api'] = api @@ -12,7 +13,7 @@ if (process.env.NODE_ENV === 'development') { '^/pid': '/pid' } } - process.env.NUXT_PUBLIC_API_SERVER = 'http://localhost' + process.env.NUXT_PUBLIC_API_SERVER = api } /** diff --git a/dbrepo-ui/pages/container/index.vue b/dbrepo-ui/pages/container/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..360ce1543fdf086d60d568ed066ccca1f7c04537 --- /dev/null +++ b/dbrepo-ui/pages/container/index.vue @@ -0,0 +1,43 @@ +<template> + <div> + <v-toolbar + flat + :title="$t('pages.container.title')"> + </v-toolbar> + <ContainerList + v-cloak + :loading="loading" + :containers="containers" /> + </div> +</template> + +<script> +import ContainerList from '@/components/container/ContainerList.vue' + +export default { + components: { + ContainerList + }, + data () { + return { + loading: true, + dialog: null, + containers: [] + } + }, + computed: { + roles () { + return this.userStore.getRoles + }, + }, + mounted () { + this.loading = true + const containerService = useContainerService(); + containerService.findAll() + .then((containers) => { + this.containers = containers + this.loading = false + }) + } +} +</script> diff --git a/dbrepo-ui/pages/database/[database_id]/subset/create.vue b/dbrepo-ui/pages/database/[database_id]/subset/create.vue index 62241db5050a1aebe1924cf6154d585fb1eb85e9..5202bc633626e135e263056fa39b5022676c1575 100644 --- a/dbrepo-ui/pages/database/[database_id]/subset/create.vue +++ b/dbrepo-ui/pages/database/[database_id]/subset/create.vue @@ -1,5 +1,5 @@ <template> - <div v-if="canExecuteQuery"> + <div v-if="canCreateSubset"> <Builder /> <v-breadcrumbs :items="items" class="pa-0 mt-2" /> </div> @@ -8,6 +8,7 @@ <script> import { useUserStore } from '@/stores/user' import Builder from '@/components/subset/Builder.vue' +import {useCacheStore} from "~/stores/cache.js"; export default { components: { @@ -34,6 +35,7 @@ export default { disabled: true } ], + cacheStore: useCacheStore(), userStore: useUserStore() } }, @@ -44,14 +46,26 @@ export default { roles () { return this.userStore.getRoles }, + database () { + return this.cacheStore.getDatabase + }, access () { return this.userStore.getAccess }, - canExecuteQuery () { - if (!this.roles) { + hasReadAccess () { + if (!this.access) { return false } - return this.roles.includes('execute-query') + return this.access.type === 'read' || this.access.type === 'write_all' || this.access.type === 'write_own' + }, + canCreateSubset () { + if (!this.database) { + return false + } + if (this.database.is_public) { + return true + } + return this.hasReadAccess } } } diff --git a/dbrepo-ui/pages/database/[database_id]/table/create/schema.vue b/dbrepo-ui/pages/database/[database_id]/table/create/schema.vue index b60de5df3045d3f51bcbb2c203afdff18be87699..6642e89bf41e31326a42b5bae1e1100e0f04f5fb 100644 --- a/dbrepo-ui/pages/database/[database_id]/table/create/schema.vue +++ b/dbrepo-ui/pages/database/[database_id]/table/create/schema.vue @@ -20,6 +20,7 @@ <v-stepper-header> <v-stepper-item :title="$t('pages.table.subpages.create.information.title')" + :complete="valid" :value="1" /> </v-stepper-header> <v-stepper-window diff --git a/dbrepo-ui/stores/cache.js b/dbrepo-ui/stores/cache.js index c733e8d48a4a3d77f4fce9eb9b1558db59d0306e..5004b1beb0170862f5062627656fcf6e8844dd7a 100644 --- a/dbrepo-ui/stores/cache.js +++ b/dbrepo-ui/stores/cache.js @@ -78,6 +78,7 @@ export const useCacheStore = defineStore('cache', { setRouteTable (databaseId, tableId) { if (!databaseId || !tableId) { this.table = null + console.error('Cannot set route table: missing database id', databaseId, 'or table id', tableId) return } const tableService = useTableService() diff --git a/docker-compose.yml b/docker-compose.yml index 6408cec90431dde9cf7ed97d57d6b30040d9cbf0..3fc6b972b1a8c556cf3ec79922b5a6595e0a99d9 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -312,6 +312,7 @@ services: network: host environment: NUXT_PUBLIC_API_CLIENT: "${BASE_URL:-http://localhost}" + NUXT_PUBLIC_API_SERVER: "${BASE_URL:-http://localhost}" NUXT_PUBLIC_UPLOAD_CLIENT: "${BASE_URL:-http://localhost}/api/upload/files" depends_on: dbrepo-search-service: @@ -409,6 +410,8 @@ services: depends_on: dbrepo-search-db: condition: service_healthy + dbrepo-metadata-service: + condition: service_healthy logging: driver: json-file @@ -460,8 +463,8 @@ services: - "-s3-endpoint=${STORAGE_ENDPOINT:-http://storage-service:9000}" - "-s3-bucket=dbrepo" environment: - AWS_ACCESS_KEY_ID: "${STORAGE_USERNAME:-seaweedfsadmin}" - AWS_SECRET_ACCESS_KEY: "${STORAGE_PASSWORD:-seaweedfsadmin}" + AWS_ACCESS_KEY_ID: "${S3_ACCESS_KEY_ID:-seaweedfsadmin}" + AWS_SECRET_ACCESS_KEY: "${S3_SECRET_ACCESS_KEY:-seaweedfsadmin}" AWS_REGION: "${STORAGE_REGION_NAME:-default}" depends_on: dbrepo-storage-service: @@ -487,22 +490,22 @@ services: volumes: - "${SHARED_VOLUME:-/tmp}:/tmp" environment: - AUTH_SERVICE_ADMIN: ${AUTH_SERVICE_ADMIN:-admin} - AUTH_SERVICE_ADMIN_PASSWORD: ${AUTH_SERVICE_ADMIN_PASSWORD:-admin} - AUTH_SERVICE_CLIENT: ${AUTH_SERVICE_CLIENT:-dbrepo-client} - AUTH_SERVICE_CLIENT_SECRET: ${AUTH_SERVICE_CLIENT:-MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG} - AUTH_SERVICE_ENDPOINT: ${AUTH_SERVICE_ENDPOINT:-http://auth-service:8080} - BROKER_EXCHANGE_NAME: ${BROKER_EXCHANGE_NAME:-dbrepo} - BROKER_QUEUE_NAME: ${BROKER_QUEUE_NAME:-dbrepo} + AUTH_SERVICE_ADMIN: "${AUTH_SERVICE_ADMIN:-admin}" + AUTH_SERVICE_ADMIN_PASSWORD: "${AUTH_SERVICE_ADMIN_PASSWORD:-admin}" + AUTH_SERVICE_CLIENT: "${AUTH_SERVICE_CLIENT:-dbrepo-client}" + AUTH_SERVICE_CLIENT_SECRET: "${AUTH_SERVICE_CLIENT:-MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG}" + AUTH_SERVICE_ENDPOINT: "${AUTH_SERVICE_ENDPOINT:-http://auth-service:8080}" + BROKER_EXCHANGE_NAME: "${BROKER_EXCHANGE_NAME:-dbrepo}" + BROKER_QUEUE_NAME: "${BROKER_QUEUE_NAME:-dbrepo}" BROKER_HOST: "${BROKER_ENDPOINT:-broker-service}" BROKER_PASSWORD: "${SYSTEM_PASSWORD:-admin}" BROKER_PORT: ${BROKER_PORT:-5672} - BROKER_SERVICE_ENDPOINT: ${BROKER_SERVICE_ENDPOINT:-http://gateway-service/admin/broker} + BROKER_SERVICE_ENDPOINT: "${BROKER_SERVICE_ENDPOINT:-http://gateway-service/admin/broker}" BROKER_USERNAME: "${SYSTEM_USERNAME:-admin}" BROKER_VIRTUALHOST: "${BROKER_VIRTUALHOST:-dbrepo}" CONNECTION_TIMEOUT: ${CONNECTION_TIMEOUT:-60000} - EXCHANGE_NAME: ${EXCHANGE_NAME:-dbrepo} - METADATA_SERVICE_ENDPOINT: ${METADATA_SERVICE_ENDPOINT:-http://metadata-service:8080} + EXCHANGE_NAME: "${EXCHANGE_NAME:-dbrepo}" + METADATA_SERVICE_ENDPOINT: "${METADATA_SERVICE_ENDPOINT:-http://metadata-service:8080}" GRANT_DEFAULT_READ: "${GRANT_DEFAULT_READ:-SELECT}" GRANT_DEFAULT_WRITE: "${GRANT_DEFAULT_WRITE:-SELECT, CREATE, CREATE VIEW, CREATE ROUTINE, CREATE TEMPORARY TABLES, LOCK TABLES, INDEX, TRIGGER, INSERT, UPDATE, DELETE}" JWT_PUBKEY: "${JWT_PUBKEY:-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqqnHQ2BWWW9vDNLRCcxD++xZg/16oqMo/c1l+lcFEjjAIJjJp/HqrPYU/U9GvquGE6PbVFtTzW1KcKawOW+FJNOA3CGo8Q1TFEfz43B8rZpKsFbJKvQGVv1Z4HaKPvLUm7iMm8Hv91cLduuoWx6Q3DPe2vg13GKKEZe7UFghF+0T9u8EKzA/XqQ0OiICmsmYPbwvf9N3bCKsB/Y10EYmZRb8IhCoV9mmO5TxgWgiuNeCTtNCv2ePYqL/U0WvyGFW0reasIK8eg3KrAUj8DpyOgPOVBn3lBGf+3KFSYi+0bwZbJZWqbC/Xlk20Go1YfeJPRIt7ImxD27R/lNjgDO/MwIDAQAB}" diff --git a/helm/dbrepo-mariadb-galera/.gitignore b/helm/dbrepo-mariadb-galera/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..613d851d27fbfa390c201b7ed8591da3e04bec35 --- /dev/null +++ b/helm/dbrepo-mariadb-galera/.gitignore @@ -0,0 +1,6 @@ +# generated +*.crt +*.key +*.srl +*.csr +build/* \ No newline at end of file diff --git a/helm/dbrepo-mariadb-galera/.helmignore b/helm/dbrepo-mariadb-galera/.helmignore new file mode 100644 index 0000000000000000000000000000000000000000..b9029e8dea3ccab2aabc5c3a8d9226e9bb9ac827 --- /dev/null +++ b/helm/dbrepo-mariadb-galera/.helmignore @@ -0,0 +1,30 @@ +# Dev +values.dev.yaml +Chart.tpl.yaml +hack/ +# MacOS +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Generated +build/ +artifacthub-repo.yml +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ +# Make +Makefile diff --git a/helm/dbrepo-mariadb-galera/Chart.lock b/helm/dbrepo-mariadb-galera/Chart.lock new file mode 100644 index 0000000000000000000000000000000000000000..fb510b79ee5efe30a1091eb91b09a163f7e6c4e9 --- /dev/null +++ b/helm/dbrepo-mariadb-galera/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: mariadb-galera + repository: https://charts.bitnami.com/bitnami + version: 10.1.3 +digest: sha256:ec9ea7a577993779d520b0c93990fb04847f96e41f2bd503141ba66338340985 +generated: "2024-09-14T01:42:48.297778184+04:00" diff --git a/helm/dbrepo-mariadb-galera/Chart.yaml b/helm/dbrepo-mariadb-galera/Chart.yaml new file mode 100644 index 0000000000000000000000000000000000000000..4be4337885fe446add1835f3a5296bc2a42f9583 --- /dev/null +++ b/helm/dbrepo-mariadb-galera/Chart.yaml @@ -0,0 +1,23 @@ +annotations: + licenses: Apache-2.0 +apiVersion: v2 +name: dbrepo-mariadb-galera +description: Helm Chart for installing DBRepo Data Database +sources: + - https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services +type: application +version: "1.4.6" +appVersion: "1.4.6" +keywords: + - dbrepo +maintainers: + - name: Martin Weise + email: martin.weise@tuwien.ac.at +home: https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/ +icon: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/master/dbrepo-ui/public/favicon.png +dependencies: + - name: mariadb-galera + alias: database + version: 10.1.3 # app version: 11.1.3 + repository: https://charts.bitnami.com/bitnami + condition: database.enabled \ No newline at end of file diff --git a/helm/dbrepo-mariadb-galera/README.md b/helm/dbrepo-mariadb-galera/README.md new file mode 100644 index 0000000000000000000000000000000000000000..c5aa55100a7959b5a7bc888519e4d7ccbdaefb5e --- /dev/null +++ b/helm/dbrepo-mariadb-galera/README.md @@ -0,0 +1,6 @@ +# DBRepo MariaDB Helm chart + +tbd + +## Parameters + diff --git a/helm/dbrepo-mariadb-galera/charts/mariadb-galera-10.1.3.tgz b/helm/dbrepo-mariadb-galera/charts/mariadb-galera-10.1.3.tgz new file mode 100644 index 0000000000000000000000000000000000000000..c906aaf7634b20f0eaf9358b435b01086bdc4f55 Binary files /dev/null and b/helm/dbrepo-mariadb-galera/charts/mariadb-galera-10.1.3.tgz differ diff --git a/helm/dbrepo-mariadb-galera/templates/_compatibility.tpl b/helm/dbrepo-mariadb-galera/templates/_compatibility.tpl new file mode 100644 index 0000000000000000000000000000000000000000..6fc2aa8fa45e3bf7a8cfdb5312515aa2c27a0491 --- /dev/null +++ b/helm/dbrepo-mariadb-galera/templates/_compatibility.tpl @@ -0,0 +1,42 @@ +{{/* +Copyright Broadcom, Inc. All Rights Reserved. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{/* vim: set filetype=mustache: */}} + +{{/* +Return true if the detected platform is Openshift +Usage: +{{- include "common.compatibility.isOpenshift" . -}} +*/}} +{{- define "common.compatibility.isOpenshift" -}} +{{- if .Capabilities.APIVersions.Has "security.openshift.io/v1" -}} +{{- true -}} +{{- end -}} +{{- end -}} + +{{/* +Render a compatible securityContext depending on the platform. By default it is maintained as it is. In other platforms like Openshift we remove default user/group values that do not work out of the box with the restricted-v1 SCC +Usage: +{{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.containerSecurityContext "context" $) -}} +*/}} +{{- define "common.compatibility.renderSecurityContext" -}} +{{- $adaptedContext := .secContext -}} + +{{- if (((.context.Values.global).compatibility).openshift) -}} + {{- if or (eq .context.Values.global.compatibility.openshift.adaptSecurityContext "force") (and (eq .context.Values.global.compatibility.openshift.adaptSecurityContext "auto") (include "common.compatibility.isOpenshift" .context)) -}} + {{/* Remove incompatible user/group values that do not work in Openshift out of the box */}} + {{- $adaptedContext = omit $adaptedContext "fsGroup" "runAsUser" "runAsGroup" -}} + {{- if not .secContext.seLinuxOptions -}} + {{/* If it is an empty object, we remove it from the resulting context because it causes validation issues */}} + {{- $adaptedContext = omit $adaptedContext "seLinuxOptions" -}} + {{- end -}} + {{- end -}} +{{- end -}} +{{/* Remove fields that are disregarded when running the container in privileged mode */}} +{{- if $adaptedContext.privileged -}} + {{- $adaptedContext = omit $adaptedContext "capabilities" "seLinuxOptions" -}} +{{- end -}} +{{- omit $adaptedContext "enabled" | toYaml -}} +{{- end -}} \ No newline at end of file diff --git a/helm/dbrepo-mariadb-galera/templates/_helpers.tpl b/helm/dbrepo-mariadb-galera/templates/_helpers.tpl new file mode 100644 index 0000000000000000000000000000000000000000..b17e44d2dfa6f6e7a09c3ab58b35794c46791c71 --- /dev/null +++ b/helm/dbrepo-mariadb-galera/templates/_helpers.tpl @@ -0,0 +1,62 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "kubernetes.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "kubernetes.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "kubernetes.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "kubernetes.labels" -}} +helm.sh/chart: {{ include "kubernetes.chart" . }} +{{ include "kubernetes.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "kubernetes.selectorLabels" -}} +app.kubernetes.io/name: {{ include "kubernetes.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Create the name of the service account to use +*/}} +{{- define "kubernetes.serviceAccountName" -}} +{{- if .Values.serviceAccount.create }} +{{- default (include "kubernetes.fullname" .) .Values.serviceAccount.name }} +{{- else }} +{{- default "default" .Values.serviceAccount.name }} +{{- end }} +{{- end }} diff --git a/helm/dbrepo-mariadb-galera/templates/configmap.yaml b/helm/dbrepo-mariadb-galera/templates/configmap.yaml new file mode 100644 index 0000000000000000000000000000000000000000..066a0d1afbbc5d46cd00a1f5315195365aef0c66 --- /dev/null +++ b/helm/dbrepo-mariadb-galera/templates/configmap.yaml @@ -0,0 +1,580 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: database-setup + namespace: {{ .Values.namespace }} +data: + {{- with .Values.database.extraInitDbScripts }} + {{ toYaml . | nindent 2 }} + {{- end }} + 02-setup-data.sql: | + BEGIN; + INSERT INTO `mdb_containers` (name, internal_name, image_id, host, port, sidecar_host, sidecar_port, privileged_username, privileged_password) + VALUES ('MariaDB 11.1.3', 'mariadb_11_1_3', 1, 'data-db', 3306, 'data-db', 8080, 'root', 'dbrepo'); + COMMIT; + 01-setup-schema.sql: | + BEGIN; + + CREATE TABLE IF NOT EXISTS `mdb_users` + ( + id character varying(36) NOT NULL, + username character varying(255) NOT NULL, + firstname character varying(255), + lastname character varying(255), + email character varying(255) NOT NULL, + orcid character varying(255), + affiliation character varying(255), + mariadb_password character varying(255) NOT NULL, + theme character varying(255) NOT NULL default ('light'), + language character varying(3) NOT NULL default ('en'), + PRIMARY KEY (id), + UNIQUE (username), + UNIQUE (email) + ) WITH SYSTEM VERSIONING; + + CREATE TABLE IF NOT EXISTS `mdb_images` + ( + id bigint NOT NULL AUTO_INCREMENT, + registry character varying(255) NOT NULL DEFAULT 'docker.io', + name character varying(255) NOT NULL, + version character varying(255) NOT NULL, + default_port integer NOT NULL, + dialect character varying(255) NOT NULL, + driver_class character varying(255) NOT NULL, + jdbc_method character varying(255) NOT NULL, + is_default BOOLEAN NOT NULL DEFAULT FALSE, + created timestamp NOT NULL DEFAULT NOW(), + last_modified timestamp, + PRIMARY KEY (id), + UNIQUE (name, version), + UNIQUE (is_default) + ) WITH SYSTEM VERSIONING; + + CREATE TABLE IF NOT EXISTS `mdb_images_date` + ( + id bigint NOT NULL AUTO_INCREMENT, + iid bigint NOT NULL, + database_format character varying(255) NOT NULL, + unix_format character varying(255) NOT NULL, + example character varying(255) NOT NULL, + has_time boolean NOT NULL, + created_at timestamp NOT NULL DEFAULT NOW(), + PRIMARY KEY (id), + FOREIGN KEY (iid) REFERENCES mdb_images (id), + UNIQUE (database_format, unix_format, example) + ) WITH SYSTEM VERSIONING; + + CREATE TABLE IF NOT EXISTS `mdb_containers` + ( + id bigint NOT NULL AUTO_INCREMENT, + internal_name character varying(255) NOT NULL, + name character varying(255) NOT NULL, + host character varying(255) NOT NULL, + port integer NOT NULL default 3306, + ui_host character varying(255) NOT NULL default host, + ui_port integer NOT NULL default port, + ui_additional_flags text, + sidecar_host character varying(255), + sidecar_port integer, + image_id bigint NOT NULL, + created timestamp NOT NULL DEFAULT NOW(), + last_modified timestamp, + privileged_username character varying(255) NOT NULL, + privileged_password character varying(255) NOT NULL, + quota integer NOT NULL DEFAULT 50, + PRIMARY KEY (id), + FOREIGN KEY (image_id) REFERENCES mdb_images (id) + ) WITH SYSTEM VERSIONING; + + CREATE TABLE IF NOT EXISTS `mdb_data` + ( + ID bigint NOT NULL AUTO_INCREMENT, + PROVENANCE text, + FileEncoding text, + FileType character varying(100), + Version text, + Seperator text, + PRIMARY KEY (ID) + ) WITH SYSTEM VERSIONING; + + CREATE TABLE IF NOT EXISTS `mdb_licenses` + ( + identifier character varying(255) NOT NULL, + uri text NOT NULL, + description text NOT NULL, + PRIMARY KEY (identifier), + UNIQUE (uri(200)) + ) WITH SYSTEM VERSIONING; + + CREATE TABLE IF NOT EXISTS `mdb_databases` + ( + id bigint NOT NULL AUTO_INCREMENT, + cid bigint NOT NULL, + name character varying(255) NOT NULL, + internal_name character varying(255) NOT NULL, + exchange_name character varying(255) NOT NULL, + description text, + engine character varying(20), + is_public boolean NOT NULL DEFAULT TRUE, + image longblob, + created_by character varying(36), + owned_by character varying(36), + contact_person character varying(36), + created timestamp NOT NULL DEFAULT NOW(), + last_modified timestamp, + PRIMARY KEY (id), + FOREIGN KEY (cid) REFERENCES mdb_containers (id) /* currently we only support one-to-one */, + FOREIGN KEY (created_by) REFERENCES mdb_users (id), + FOREIGN KEY (owned_by) REFERENCES mdb_users (id), + FOREIGN KEY (contact_person) REFERENCES mdb_users (id) + ) WITH SYSTEM VERSIONING; + + CREATE TABLE IF NOT EXISTS `mdb_databases_subjects` + ( + dbid BIGINT NOT NULL, + subjects character varying(255) NOT NULL, + PRIMARY KEY (dbid, subjects) + ) WITH SYSTEM VERSIONING; + + CREATE TABLE IF NOT EXISTS `mdb_tables` + ( + ID bigint NOT NULL AUTO_INCREMENT, + tDBID bigint NOT NULL, + tName VARCHAR(64) NOT NULL, + internal_name VARCHAR(64) NOT NULL, + queue_name VARCHAR(255) NOT NULL, + routing_key VARCHAR(255), + tDescription VARCHAR(2048), + num_rows BIGINT, + data_length BIGINT, + max_data_length BIGINT, + avg_row_length BIGINT, + `separator` CHAR(1), + quote CHAR(1), + element_null VARCHAR(50), + skip_lines BIGINT, + element_true VARCHAR(50), + element_false VARCHAR(50), + Version TEXT, + created timestamp NOT NULL DEFAULT NOW(), + versioned boolean not null default true, + created_by character varying(36) NOT NULL, + owned_by character varying(36) NOT NULL, + last_modified timestamp, + PRIMARY KEY (ID), + UNIQUE (tDBID, internal_name), + FOREIGN KEY (tDBID) REFERENCES mdb_databases (id), + FOREIGN KEY (created_by) REFERENCES mdb_users (id), + FOREIGN KEY (owned_by) REFERENCES mdb_users (id) + ) WITH SYSTEM VERSIONING; + + CREATE TABLE IF NOT EXISTS `mdb_columns` + ( + ID BIGINT NOT NULL AUTO_INCREMENT, + tID BIGINT NOT NULL, + dfID BIGINT, + cName VARCHAR(64), + internal_name VARCHAR(64) NOT NULL, + Datatype ENUM ('CHAR','VARCHAR','BINARY','VARBINARY','TINYBLOB','TINYTEXT','TEXT','BLOB','MEDIUMTEXT','MEDIUMBLOB','LONGTEXT','LONGBLOB','ENUM','SET','BIT','TINYINT','BOOL','SMALLINT','MEDIUMINT','INT','BIGINT','FLOAT','DOUBLE','DECIMAL','DATE','DATETIME','TIMESTAMP','TIME','YEAR'), + length BIGINT NULL, + ordinal_position INTEGER NOT NULL, + index_length BIGINT NULL, + description VARCHAR(2048), + size BIGINT, + d BIGINT, + auto_generated BOOLEAN DEFAULT false, + is_null_allowed BOOLEAN NOT NULL DEFAULT true, + val_min NUMERIC NULL, + val_max NUMERIC NULL, + mean NUMERIC NULL, + median NUMERIC NULL, + std_dev Numeric NULL, + created timestamp NOT NULL DEFAULT NOW(), + last_modified timestamp, + FOREIGN KEY (tID) REFERENCES mdb_tables (ID) ON DELETE CASCADE, + PRIMARY KEY (ID) + ) WITH SYSTEM VERSIONING; + + CREATE TABLE IF NOT EXISTS `mdb_columns_enums` + ( + id bigint NOT NULL AUTO_INCREMENT, + column_id bigint NOT NULL, + value CHARACTER VARYING(255) NOT NULL, + FOREIGN KEY (column_id) REFERENCES mdb_columns (ID) ON DELETE CASCADE, + PRIMARY KEY (id) + ) WITH SYSTEM VERSIONING; + + CREATE TABLE IF NOT EXISTS `mdb_columns_sets` + ( + id bigint NOT NULL AUTO_INCREMENT, + column_id bigint NOT NULL, + value CHARACTER VARYING(255) NOT NULL, + FOREIGN KEY (column_id) REFERENCES mdb_columns (ID) ON DELETE CASCADE, + PRIMARY KEY (id) + ) WITH SYSTEM VERSIONING; + + CREATE TABLE IF NOT EXISTS `mdb_columns_nom` + ( + tID bigint, + cID bigint, + maxlength INTEGER, + last_modified timestamp, + created timestamp NOT NULL DEFAULT NOW(), + FOREIGN KEY (tID, cID) REFERENCES mdb_columns (tID, ID), + PRIMARY KEY (tID, cID) + ) WITH SYSTEM VERSIONING; + + CREATE TABLE IF NOT EXISTS `mdb_columns_cat` + ( + tID bigint, + cID bigint, + num_cat INTEGER, + -- cat_array TEXT[], + last_modified timestamp, + created timestamp NOT NULL DEFAULT NOW(), + FOREIGN KEY (tID, cID) REFERENCES mdb_columns (tID, ID), + PRIMARY KEY (tID, cID) + ) WITH SYSTEM VERSIONING; + + CREATE TABLE IF NOT EXISTS `mdb_constraints_foreign_key` + ( + fkid BIGINT NOT NULL AUTO_INCREMENT, + tid BIGINT NOT NULL, + rtid BIGINT NOT NULL, + name VARCHAR(255) NOT NULL, + on_update VARCHAR(50) NULL, + on_delete VARCHAR(50) NULL, + position INT NULL, + PRIMARY KEY (fkid), + FOREIGN KEY (tid) REFERENCES mdb_tables (id) ON DELETE CASCADE, + FOREIGN KEY (rtid) REFERENCES mdb_tables (id) + ) WITH SYSTEM VERSIONING; + + CREATE TABLE IF NOT EXISTS `mdb_constraints_primary_key` + ( + pkid BIGINT NOT NULL AUTO_INCREMENT, + tID BIGINT NOT NULL, + cid BIGINT NOT NULL, + PRIMARY KEY (pkid), + FOREIGN KEY (tID) REFERENCES mdb_tables (id) ON DELETE CASCADE, + FOREIGN KEY (cid) REFERENCES mdb_columns (id) ON DELETE CASCADE + ) WITH SYSTEM VERSIONING; + + CREATE TABLE IF NOT EXISTS `mdb_constraints_foreign_key_reference` + ( + id BIGINT NOT NULL AUTO_INCREMENT, + fkid BIGINT NOT NULL, + cid BIGINT NOT NULL, + rcid BIGINT NOT NULL, + PRIMARY KEY (id), + UNIQUE (fkid, cid, rcid), + FOREIGN KEY (fkid) REFERENCES mdb_constraints_foreign_key (fkid) ON UPDATE CASCADE, + FOREIGN KEY (cid) REFERENCES mdb_columns (id), + FOREIGN KEY (rcid) REFERENCES mdb_columns (id) + ) WITH SYSTEM VERSIONING; + + CREATE TABLE IF NOT EXISTS `mdb_constraints_unique` + ( + uid BIGINT NOT NULL AUTO_INCREMENT, + name VARCHAR(255) NOT NULL, + tid BIGINT NOT NULL, + position INT NULL, + PRIMARY KEY (uid), + FOREIGN KEY (tid) REFERENCES mdb_tables (id) ON DELETE CASCADE + ); + + CREATE TABLE IF NOT EXISTS `mdb_constraints_unique_columns` + ( + id BIGINT NOT NULL AUTO_INCREMENT, + uid BIGINT NOT NULL, + cid BIGINT NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY (uid) REFERENCES mdb_constraints_unique (uid), + FOREIGN KEY (cid) REFERENCES mdb_columns (id) ON DELETE CASCADE + ) WITH SYSTEM VERSIONING; + + CREATE TABLE IF NOT EXISTS `mdb_constraints_checks` + ( + id BIGINT NOT NULL AUTO_INCREMENT, + tid BIGINT NOT NULL, + checks VARCHAR(255) NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY (tid) REFERENCES mdb_tables (id) ON DELETE CASCADE + ) WITH SYSTEM VERSIONING; + + + CREATE TABLE IF NOT EXISTS `mdb_concepts` + ( + id bigint NOT NULL AUTO_INCREMENT, + uri text not null, + name VARCHAR(255) null, + description TEXT null, + created timestamp NOT NULL DEFAULT NOW(), + PRIMARY KEY (id), + UNIQUE (uri(200)) + ) WITH SYSTEM VERSIONING; + + CREATE TABLE IF NOT EXISTS `mdb_units` + ( + id bigint NOT NULL AUTO_INCREMENT, + uri text not null, + name VARCHAR(255) null, + description TEXT null, + created timestamp NOT NULL DEFAULT NOW(), + PRIMARY KEY (id), + UNIQUE (uri(200)) + ) WITH SYSTEM VERSIONING; + + CREATE TABLE IF NOT EXISTS `mdb_columns_concepts` + ( + id bigint NOT NULL, + cID bigint NOT NULL, + created timestamp NOT NULL DEFAULT NOW(), + PRIMARY KEY (id, cid), + FOREIGN KEY (cID) REFERENCES mdb_columns (ID) + ) WITH SYSTEM VERSIONING; + + CREATE TABLE IF NOT EXISTS `mdb_columns_units` + ( + id bigint NOT NULL, + cID bigint NOT NULL, + created timestamp NOT NULL DEFAULT NOW(), + PRIMARY KEY (id, cID), + FOREIGN KEY (cID) REFERENCES mdb_columns (ID) + ) WITH SYSTEM VERSIONING; + + CREATE TABLE IF NOT EXISTS `mdb_view` + ( + id bigint NOT NULL AUTO_INCREMENT, + vdbid bigint NOT NULL, + vName VARCHAR(64) NOT NULL, + internal_name VARCHAR(64) NOT NULL, + Query TEXT NOT NULL, + query_hash VARCHAR(255) NOT NULL, + Public BOOLEAN NOT NULL, + InitialView BOOLEAN NOT NULL, + created timestamp NOT NULL DEFAULT NOW(), + last_modified timestamp, + created_by character varying(36) NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY (vdbid) REFERENCES mdb_databases (id), + FOREIGN KEY (created_by) REFERENCES mdb_users (id) + ) WITH SYSTEM VERSIONING; + + CREATE TABLE IF NOT EXISTS `mdb_banner_messages` + ( + id bigint NOT NULL AUTO_INCREMENT, + type ENUM ('ERROR', 'WARNING', 'INFO') NOT NULL default 'INFO', + message TEXT NOT NULL, + link TEXT NULL, + link_text VARCHAR(255) NULL, + display_start timestamp NULL, + display_end timestamp NULL, + PRIMARY KEY (id) + ) WITH SYSTEM VERSIONING; + + CREATE TABLE IF NOT EXISTS `mdb_ontologies` + ( + id bigint NOT NULL AUTO_INCREMENT, + prefix VARCHAR(8) NOT NULL, + uri TEXT NOT NULL, + uri_pattern TEXT, + sparql_endpoint TEXT NULL, + rdf_path TEXT NULL, + last_modified timestamp, + created timestamp NOT NULL DEFAULT NOW(), + UNIQUE (prefix), + UNIQUE (uri(200)), + PRIMARY KEY (id) + ) WITH SYSTEM VERSIONING; + + CREATE TABLE IF NOT EXISTS `mdb_view_columns` + ( + id BIGINT NOT NULL AUTO_INCREMENT, + view_id BIGINT NOT NULL, + dfID BIGINT, + name VARCHAR(64), + internal_name VARCHAR(64) NOT NULL, + column_type ENUM ('CHAR','VARCHAR','BINARY','VARBINARY','TINYBLOB','TINYTEXT','TEXT','BLOB','MEDIUMTEXT','MEDIUMBLOB','LONGTEXT','LONGBLOB','ENUM','SET','BIT','TINYINT','BOOL','SMALLINT','MEDIUMINT','INT','BIGINT','FLOAT','DOUBLE','DECIMAL','DATE','DATETIME','TIMESTAMP','TIME','YEAR'), + ordinal_position INTEGER NOT NULL, + size BIGINT, + d BIGINT, + auto_generated BOOLEAN DEFAULT false, + is_null_allowed BOOLEAN NOT NULL DEFAULT true, + PRIMARY KEY (id), + FOREIGN KEY (view_id) REFERENCES mdb_view (id) + ) WITH SYSTEM VERSIONING; + + CREATE TABLE IF NOT EXISTS `mdb_identifiers` + ( + id BIGINT NOT NULL AUTO_INCREMENT, + dbid BIGINT NOT NULL, + qid BIGINT, + vid BIGINT, + tid BIGINT, + publisher VARCHAR(255) NOT NULL, + language VARCHAR(2), + publication_year INTEGER NOT NULL, + publication_month INTEGER, + publication_day INTEGER, + identifier_type ENUM ('DATABASE', 'SUBSET', 'VIEW', 'TABLE') NOT NULL, + status ENUM ('DRAFT', 'PUBLISHED') NOT NULL DEFAULT ('PUBLISHED'), + query TEXT, + query_normalized TEXT, + query_hash VARCHAR(255), + execution TIMESTAMP, + result_hash VARCHAR(255), + result_number BIGINT, + doi VARCHAR(255), + created TIMESTAMP NOT NULL DEFAULT NOW(), + created_by VARCHAR(36) NOT NULL, + last_modified TIMESTAMP, + PRIMARY KEY (id), /* must be a single id from persistent identifier concept */ + FOREIGN KEY (dbid) REFERENCES mdb_databases (id), + FOREIGN KEY (created_by) REFERENCES mdb_users (id) + ) WITH SYSTEM VERSIONING; + + CREATE TABLE IF NOT EXISTS `mdb_identifier_licenses` + ( + pid bigint NOT NULL, + license_id VARCHAR(255) NOT NULL, + PRIMARY KEY (pid, license_id), + FOREIGN KEY (pid) REFERENCES mdb_identifiers (id), + FOREIGN KEY (license_id) REFERENCES mdb_licenses (identifier) + ) WITH SYSTEM VERSIONING; + + CREATE TABLE IF NOT EXISTS `mdb_identifier_titles` + ( + id bigint NOT NULL AUTO_INCREMENT, + pid bigint NOT NULL, + title text NOT NULL, + title_type ENUM ('ALTERNATIVE_TITLE', 'SUBTITLE', 'TRANSLATED_TITLE', 'OTHER'), + language VARCHAR(2), + PRIMARY KEY (id), + FOREIGN KEY (pid) REFERENCES mdb_identifiers (id) + ) WITH SYSTEM VERSIONING; + + CREATE TABLE IF NOT EXISTS `mdb_identifier_funders` + ( + id bigint NOT NULL AUTO_INCREMENT, + pid bigint NOT NULL, + funder_name VARCHAR(255) NOT NULL, + funder_identifier TEXT, + funder_identifier_type ENUM ('CROSSREF_FUNDER_ID', 'GRID', 'ISNI', 'ROR', 'OTHER'), + scheme_uri text, + award_number VARCHAR(255), + award_title text, + language VARCHAR(255), + PRIMARY KEY (id), + FOREIGN KEY (pid) REFERENCES mdb_identifiers (id) + ) WITH SYSTEM VERSIONING; + + CREATE TABLE IF NOT EXISTS `mdb_identifier_descriptions` + ( + id bigint NOT NULL AUTO_INCREMENT, + pid bigint NOT NULL, + description text NOT NULL, + description_type ENUM ('ABSTRACT', 'METHODS', 'SERIES_INFORMATION', 'TABLE_OF_CONTENTS', 'TECHNICAL_INFO', 'OTHER'), + language VARCHAR(2), + PRIMARY KEY (id), + FOREIGN KEY (pid) REFERENCES mdb_identifiers (id) + ) WITH SYSTEM VERSIONING; + + CREATE TABLE IF NOT EXISTS `mdb_related_identifiers` + ( + id bigint NOT NULL AUTO_INCREMENT, + pid bigint NOT NULL, + value varchar(255) NOT NULL, + type varchar(255) NOT NULL, + relation varchar(255) NOT NULL, + PRIMARY KEY (id), /* must be a single id from persistent identifier concept */ + FOREIGN KEY (pid) REFERENCES mdb_identifiers (id), + UNIQUE (pid, value) + ) WITH SYSTEM VERSIONING; + + CREATE TABLE IF NOT EXISTS `mdb_identifier_creators` + ( + id bigint NOT NULL AUTO_INCREMENT, + pid bigint NOT NULL, + given_names text, + family_name text, + creator_name VARCHAR(255) NOT NULL, + name_type ENUM ('PERSONAL', 'ORGANIZATIONAL') default 'PERSONAL', + name_identifier text, + name_identifier_scheme ENUM ('ROR', 'GRID', 'ISNI', 'ORCID'), + name_identifier_scheme_uri text, + affiliation VARCHAR(255), + affiliation_identifier text, + affiliation_identifier_scheme ENUM ('ROR', 'GRID', 'ISNI'), + affiliation_identifier_scheme_uri text, + PRIMARY KEY (id), + FOREIGN KEY (pid) REFERENCES mdb_identifiers (id) + ) WITH SYSTEM VERSIONING; + + CREATE TABLE IF NOT EXISTS `mdb_update` + ( + uUserID character varying(255) NOT NULL, + uDBID bigint NOT NULL, + created timestamp NOT NULL DEFAULT NOW(), + PRIMARY KEY (uUserID, uDBID), + FOREIGN KEY (uDBID) REFERENCES mdb_databases (id) + ) WITH SYSTEM VERSIONING; + + CREATE TABLE IF NOT EXISTS `mdb_access` + ( + aUserID character varying(255) NOT NULL, + aDBID bigint REFERENCES mdb_databases (id), + attime TIMESTAMP, + download BOOLEAN, + created timestamp NOT NULL DEFAULT NOW(), + PRIMARY KEY (aUserID, aDBID) + ) WITH SYSTEM VERSIONING; + + CREATE TABLE IF NOT EXISTS `mdb_have_access` + ( + user_id character varying(36) NOT NULL, + database_id bigint REFERENCES mdb_databases (id), + access_type ENUM ('READ', 'WRITE_OWN', 'WRITE_ALL') NOT NULL, + created timestamp NOT NULL DEFAULT NOW(), + PRIMARY KEY (user_id, database_id), + FOREIGN KEY (user_id) REFERENCES mdb_users (id) + ) WITH SYSTEM VERSIONING; + + COMMIT; + BEGIN; + + INSERT INTO `mdb_licenses` (identifier, uri, description) + VALUES ('CC0-1.0', 'https://creativecommons.org/publicdomain/zero/1.0/legalcode', + 'CC0 waives copyright interest in a work you''ve created and dedicates it to the world-wide public domain. Use CC0 to opt out of copyright entirely and ensure your work has the widest reach.'), + ('CC-BY-4.0', 'https://creativecommons.org/licenses/by/4.0/legalcode', + 'The Creative Commons Attribution license allows re-distribution and re-use of a licensed work on the condition that the creator is appropriately credited.'); + + INSERT INTO `mdb_images` (name, registry, version, default_port, dialect, driver_class, jdbc_method) + VALUES ('mariadb', 'docker.io', '11.1.3', 3306, 'org.hibernate.dialect.MariaDBDialect', 'org.mariadb.jdbc.Driver', + 'mariadb'); + + INSERT INTO `mdb_images_date` (iid, database_format, unix_format, example, has_time) + VALUES (1, '%Y-%c-%d %H:%i:%S.%f', 'yyyy-MM-dd HH:mm:ss.SSSSSS', '2022-01-30 13:44:25.499', true), + (1, '%Y-%c-%d %H:%i:%S', 'yyyy-MM-dd HH:mm:ss', '2022-01-30 13:44:25', true), + (1, '%Y-%c-%d', 'yyyy-MM-dd', '2022-01-30', false), + (1, '%H:%i:%S', 'HH:mm:ss', '13:44:25', true), + (1, '%d.%c.%Y', 'dd.MM.yyyy', '30.01.2022', false); + + INSERT INTO `mdb_ontologies` (prefix, uri, uri_pattern, sparql_endpoint, rdf_path) + VALUES ('om', 'http://www.ontology-of-units-of-measure.org/resource/om-2/', + 'http://www.ontology-of-units-of-measure.org/resource/om-2/.*', null, 'rdf/om-2.0.rdf'), + ('wd', 'http://www.wikidata.org/', 'http://www.wikidata.org/entity/.*', 'https://query.wikidata.org/sparql', + null), + ('mo', 'http://purl.org/ontology/mo/', 'http://purl.org/ontology/mo/.*', null, null), + ('dc', 'http://purl.org/dc/elements/1.1/', null, null, null), + ('xsd', 'http://www.w3.org/2001/XMLSchema#', null, null, null), + ('tl', 'http://purl.org/NET/c4dm/timeline.owl#', null, null, null), + ('foaf', 'http://xmlns.com/foaf/0.1/', null, null, null), + ('schema', 'http://schema.org/', null, null, null), + ('rdf', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', null, null, null), + ('rdfs', 'http://www.w3.org/2000/01/rdf-schema#', null, null, null), + ('owl', 'http://www.w3.org/2002/07/owl#', null, null, null), + ('prov', 'http://www.w3.org/ns/prov#', null, null, null), + ('db', 'http://dbpedia.org', 'http://dbpedia.org/ontology/.*', 'http://dbpedia.org/sparql', null); + COMMIT; + diff --git a/helm/dbrepo-mariadb-galera/templates/secret.yaml b/helm/dbrepo-mariadb-galera/templates/secret.yaml new file mode 100644 index 0000000000000000000000000000000000000000..fc5a2a7c5ddaa757c9fc29dc75b24d787a3c0656 --- /dev/null +++ b/helm/dbrepo-mariadb-galera/templates/secret.yaml @@ -0,0 +1,9 @@ +apiVersion: v1 +kind: Secret +metadata: + name: sidecar-secret + namespace: {{ .Values.namespace }} +stringData: + S3_ACCESS_KEY_ID: "{{ .Values.s3.auth.adminAccessKeyId }}" + S3_SECRET_ACCESS_KEY: "{{ .Values.s3.auth.adminSecretAccessKey }}" + S3_STORAGE_ENDPOINT: "{{ .Values.s3.endpoint }}" diff --git a/helm/dbrepo-mariadb-galera/values.schema.json b/helm/dbrepo-mariadb-galera/values.schema.json new file mode 100644 index 0000000000000000000000000000000000000000..9dbb1f01336e3ee40f404473191855d06a992c48 --- /dev/null +++ b/helm/dbrepo-mariadb-galera/values.schema.json @@ -0,0 +1,304 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "properties": { + "database": { + "properties": { + "db": { + "properties": { + "name": { + "type": "string" + } + }, + "type": "object" + }, + "enabled": { + "type": "boolean" + }, + "extraInitDbScripts": { + "properties": {}, + "type": "object" + }, + "extraVolumeMounts": { + "items": { + "properties": { + "mountPath": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "extraVolumes": { + "items": { + "properties": { + "emptyDir": { + "properties": {}, + "type": "object" + }, + "name": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "fullnameOverride": { + "type": "string" + }, + "galera": { + "properties": { + "mariabackup": { + "properties": { + "password": { + "type": "string" + }, + "user": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "host": { + "type": "string" + }, + "initdbScriptsConfigMap": { + "type": "string" + }, + "jdbcExtraArgs": { + "type": "string" + }, + "metrics": { + "properties": { + "enabled": { + "type": "boolean" + } + }, + "type": "object" + }, + "persistence": { + "properties": { + "enabled": { + "type": "boolean" + } + }, + "type": "object" + }, + "replicaCount": { + "type": "integer" + }, + "rootUser": { + "properties": { + "password": { + "type": "string" + }, + "user": { + "type": "string" + } + }, + "type": "object" + }, + "service": { + "properties": { + "extraPorts": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "port": { + "type": "integer" + }, + "protocol": { + "type": "string" + }, + "targetPort": { + "type": "integer" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "sidecars": { + "items": { + "properties": { + "envFrom": { + "items": { + "properties": { + "secretRef": { + "properties": { + "name": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "type": "array" + }, + "image": { + "type": "string" + }, + "imagePullPolicy": { + "type": "string" + }, + "livenessProbe": { + "properties": { + "exec": { + "properties": { + "command": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "initialDelaySeconds": { + "type": "integer" + }, + "periodSeconds": { + "type": "integer" + } + }, + "type": "object" + }, + "name": { + "type": "string" + }, + "ports": { + "items": { + "properties": { + "containerPort": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "protocol": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "readinessProbe": { + "properties": { + "exec": { + "properties": { + "command": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "initialDelaySeconds": { + "type": "integer" + }, + "periodSeconds": { + "type": "integer" + } + }, + "type": "object" + }, + "securityContext": { + "properties": { + "allowPrivilegeEscalation": { + "type": "boolean" + }, + "capabilities": { + "properties": { + "drop": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "runAsGroup": { + "type": "integer" + }, + "runAsNonRoot": { + "type": "boolean" + }, + "runAsUser": { + "type": "integer" + }, + "seccompProfile": { + "properties": { + "type": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "volumeMounts": { + "items": { + "properties": { + "mountPath": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "namespace": { + "type": "string" + }, + "s3": { + "properties": { + "auth": { + "properties": { + "adminAccessKeyId": { + "type": "string" + }, + "adminSecretAccessKey": { + "type": "string" + } + }, + "type": "object" + }, + "endpoint": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" +} diff --git a/helm/dbrepo-mariadb-galera/values.yaml b/helm/dbrepo-mariadb-galera/values.yaml new file mode 100644 index 0000000000000000000000000000000000000000..2e8e94c72e593c0d2da52cf0fd35d3cb4277a703 --- /dev/null +++ b/helm/dbrepo-mariadb-galera/values.yaml @@ -0,0 +1,108 @@ +# Copyright the DBRepo developers +# SPDX-License-Identifier: APACHE-2.0 + +## @param namespace The namespace to install the chart +namespace: dbrepo + +s3: + endpoint: http://storage-service-s3:8333 + auth: + adminAccessKeyId: seaweedfsadmin + adminSecretAccessKey: seaweedfsadmin + +database: + ## @param database.enabled Enable the Metadata Database. + enabled: true + ## @skip database.fullnameOverride + fullnameOverride: data-db + ## @param database.host The hostname for the microservices. + host: data-db + rootUser: + ## @param database.rootUser.user The root username. + user: root + ## @param database.rootUser.password The root user password. + password: dbrepo + db: + ## @param database.db.name The database name. + name: dbrepo + galera: + mariabackup: + ## @param database.galera.mariabackup.user The database backup username. + user: backup + ## @param database.galera.mariabackup.password The database backup user password + password: backup + ## @param database.jdbcExtraArgs The extra arguments for JDBC connections in the microservices. + jdbcExtraArgs: "" + metrics: + ## @skip database.metrics.enabled The Prometheus settings. + enabled: false + ## @skip database.initdbScriptsConfigMap The initial database scripts. + initdbScriptsConfigMap: database-setup + ## @param database.extraInitDbScripts Additional init.db scripts that are executed on the first start. + extraInitDbScripts: { } + # 03-additional-data.sql: | + # BEGIN; + # INSERT INTO `mdb_containers` (name, internal_name, image_id, host, port, sidecar_host, sidecar_port, privileged_username, privileged_password) + # VALUES ('MariaDB Galera TEST', 'mariadb_11_1_3', 1, 'data-db', 3306, 'data-db', 80, 'root', 'dbrepo'); + # COMMIT; + ## @param database.replicaCount The number of cluster nodes, should be uneven i.e. 2n+1 + replicaCount: 3 + persistence: + ## @param database.persistence.enabled Enable persistent storage. + enabled: true + ## @skip database.service + service: + extraPorts: + - name: "sidecar" + port: 8080 + targetPort: 8080 + protocol: TCP + ## @skip database.sidecars + sidecars: + - name: sidecar + image: registry.datalab.tuwien.ac.at/dbrepo/data-db-sidecar:1.4.5 + imagePullPolicy: Always + securityContext: + runAsUser: 1001 + runAsGroup: 0 + runAsNonRoot: true + allowPrivilegeEscalation: false + seccompProfile: + type: RuntimeDefault + capabilities: + drop: + - ALL + ports: + - name: "sidecar" + containerPort: 8080 + protocol: TCP + envFrom: + - secretRef: + name: data-service-secret + livenessProbe: + exec: + command: + - /bin/bash + - -ec + - "curl -sSL localhost:8080/health | grep 'UP' || exit 1" + initialDelaySeconds: 120 + periodSeconds: 30 + readinessProbe: + exec: + command: + - /bin/bash + - -ec + - "curl -sSL localhost:8080/health | grep 'UP' || exit 1" + initialDelaySeconds: 30 + periodSeconds: 30 + volumeMounts: + - name: s3 + mountPath: /s3 + ## @skip database.extraVolumeMounts + extraVolumeMounts: + - name: s3 + mountPath: /s3 + ## @skip database.extraVolumes + extraVolumes: + - name: s3 + emptyDir: { } diff --git a/helm/dbrepo/Chart.lock b/helm/dbrepo/Chart.lock index 45878cdfc0597e70b690912b03e500643e617367..21f0b9d1972b91ad04e2ce681c8f97ca0ec18476 100644 --- a/helm/dbrepo/Chart.lock +++ b/helm/dbrepo/Chart.lock @@ -5,9 +5,9 @@ dependencies: - name: keycloak repository: https://charts.bitnami.com/bitnami version: 21.6.1 -- name: mariadb - repository: https://charts.bitnami.com/bitnami - version: 14.1.4 +- name: dbrepo-mariadb-galera + repository: file://../dbrepo-mariadb-galera + version: 1.4.6 - name: mariadb-galera repository: https://charts.bitnami.com/bitnami version: 10.1.3 @@ -23,5 +23,5 @@ dependencies: - name: openldap-stack-ha repository: https://jp-gouin.github.io/helm-openldap/ version: 4.2.5 -digest: sha256:bc81f32931159cbea98f6da5f58ff3425a5cd03183506ab218120be136486468 -generated: "2024-07-12T06:33:37.323435643+02:00" +digest: sha256:b25413b979bd026412ed188968db993c958bc71175b379315d5e24d373f8065f +generated: "2024-09-14T01:52:39.203839653+04:00" diff --git a/helm/dbrepo/Chart.yaml b/helm/dbrepo/Chart.yaml index f32287b93cd1ba982cef7af817c95a70f0af7604..517d649b8a023c2a232ca15e0d4cabdbf0ed3347 100644 --- a/helm/dbrepo/Chart.yaml +++ b/helm/dbrepo/Chart.yaml @@ -6,8 +6,8 @@ description: Helm Chart for installing DBRepo sources: - https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services type: application -version: "1.4.5" -appVersion: "1.4.5" +version: "1.4.6" +appVersion: "1.4.6" keywords: - dbrepo maintainers: @@ -26,10 +26,10 @@ dependencies: version: 21.6.1 # app version: 24.0.5 repository: https://charts.bitnami.com/bitnami condition: authservice.enabled - - name: mariadb + - name: dbrepo-mariadb-galera alias: datadb - version: 14.1.4 # app version: 11.1.3 - repository: https://charts.bitnami.com/bitnami + version: 1.4.6 + repository: file://../dbrepo-mariadb-galera condition: datadb.enabled - name: mariadb-galera alias: metadatadb diff --git a/helm/dbrepo/README.md b/helm/dbrepo/README.md index 294fda6477f278e1cc6bf71e0002ca7cfbfc9916..53d920f47e1462e5203dc56222b25263bc928f8c 100644 --- a/helm/dbrepo/README.md +++ b/helm/dbrepo/README.md @@ -74,7 +74,7 @@ The command removes all the Kubernetes components associated with the chart and | `metadatadb.galera.mariabackup.user` | The database backup username. | `backup` | | `metadatadb.galera.mariabackup.password` | The database backup user password | `backup` | | `metadatadb.jdbcExtraArgs` | The extra arguments for JDBC connections in the microservices. | `""` | -| `metadatadb.initdbScripts` | Additional init.db scripts that are executed on the first start. | `{}` | +| `metadatadb.extraInitDbScripts` | Additional init.db scripts that are executed on the first start. | `{}` | | `metadatadb.replicaCount` | The number of cluster nodes, should be uneven i.e. 2n+1 | `3` | | `metadatadb.persistence.enabled` | Enable persistent storage. | `true` | @@ -85,8 +85,6 @@ The command removes all the Kubernetes components associated with the chart and | `authservice.enabled` | Enable the Auth Service. | `true` | | `authservice.image.debug` | Set the logging level to `trace`. Otherwise, set to `info`. | `false` | | `authservice.endpoint` | The hostname for the microservices. | `http://auth-service` | -| `authservice.auth.adminUser` | The admin username. | `fda` | -| `authservice.auth.adminPassword` | The admin user password. | `fda` | | `authservice.jwt.pubkey` | The JWT public key from the `dbrepo-client`. | `MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqqnHQ2BWWW9vDNLRCcxD++xZg/16oqMo/c1l+lcFEjjAIJjJp/HqrPYU/U9GvquGE6PbVFtTzW1KcKawOW+FJNOA3CGo8Q1TFEfz43B8rZpKsFbJKvQGVv1Z4HaKPvLUm7iMm8Hv91cLduuoWx6Q3DPe2vg13GKKEZe7UFghF+0T9u8EKzA/XqQ0OiICmsmYPbwvf9N3bCKsB/Y10EYmZRb8IhCoV9mmO5TxgWgiuNeCTtNCv2ePYqL/U0WvyGFW0reasIK8eg3KrAUj8DpyOgPOVBn3lBGf+3KFSYi+0bwZbJZWqbC/Xlk20Go1YfeJPRIt7ImxD27R/lNjgDO/MwIDAQAB` | | `authservice.tls.enabled` | Enable TLS/SSL communication. Required for HTTPS. | `true` | | `authservice.tls.existingSecret` | The secret containing the `tls.crt`, `tls.key` and `ca.crt`. | `ingress-cert` | @@ -137,7 +135,7 @@ The command removes all the Kubernetes components associated with the chart and | `brokerservice.ldap.binddn` | The domain name the broker service should bind to. In many cases this is the admin user from `identityservice.global.adminUser`. | `cn=admin,dc=dbrepo,dc=at` | | `brokerservice.ldap.bindpw` | The password to bind on the identity service. In many cases this value is equal to `identityservice.global.adminPassword`. | `admin` | | `brokerservice.ldap.uidField` | The field containing the user id. | `uid` | -| `brokerservice.ldap.basedn` | The base domain name containing the users. | `ou=users,dc=dbrepo,dc=at` | +| `brokerservice.ldap.basedn` | The base domain name containing the users. | `dc=dbrepo,dc=at` | | `brokerservice.ldap.userDnPattern` | The pattern to determine the user. | `${username}` | | `brokerservice.extraPlugins` | The list of plugins to be activated. | `rabbitmq_prometheus rabbitmq_auth_backend_ldap rabbitmq_auth_mechanism_ssl` | | `brokerservice.persistence.enabled` | If set to true, a PVC will be created. | `false` | @@ -178,7 +176,7 @@ The command removes all the Kubernetes components associated with the chart and | `metadataservice.podSecurityContext.sysctls` | Set kernel settings using the sysctl interface | `[]` | | `metadataservice.podSecurityContext.supplementalGroups` | Set filesystem extra groups | `[]` | | `metadataservice.podSecurityContext.fsGroup` | Set RabbitMQ pod's Security Context fsGroup | `1001` | -| `metadataservice.containerSecurityContext.enabled` | Enabled containers' Security Context | `true` | +| `metadataservice.containerSecurityContext.enabled` | Enable containers' Security Context | `true` | | `metadataservice.containerSecurityContext.seLinuxOptions` | Set SELinux options in container | `{}` | | `metadataservice.containerSecurityContext.runAsUser` | Set RabbitMQ containers' Security Context runAsUser | `1001` | | `metadataservice.containerSecurityContext.runAsGroup` | Set RabbitMQ containers' Security Context runAsGroup | `1001` | @@ -271,6 +269,7 @@ The command removes all the Kubernetes components associated with the chart and | Name | Description | Value | | --------------------------------------------- | -------------------------------------------------------------------------------------- | ---------------- | | `storageservice.enabled` | Enable the Storage Service. | `true` | +| `storageservice.mariadb.auth.rootPassword` | The user password for the root user. | `seaweedfsdb` | | `storageservice.filer.enabled` | Enable the storage service filer which is required for S3. | `true` | | `storageservice.s3.replicaCount` | The number of replicas. | `2` | | `storageservice.s3.bucket` | The S3-bucket name. | `dbrepo` | @@ -321,10 +320,10 @@ The command removes all the Kubernetes components associated with the chart and | `ui.public.icon` | The user interface icon. | `/favicon.ico` | | `ui.public.touch` | The user interface apple touch icon. | `/apple-touch-icon.png` | | `ui.public.broker.host` | The displayed broker hostname. | `example.com` | -| `ui.public.broker.port.5671` | Enable display of the broker 5671 port and mark it as secure (SSL/TLS). | `true` | -| `ui.public.broker.port.5672` | Enable display of the broker 5672 port and mark it as insecure (no SSL/TLS). | `false` | +| `ui.public.broker.port.5671` | Enable display of the broker 5671 port and mark it as secure (SSL/TLS). | `false` | +| `ui.public.broker.port.5672` | Enable display of the broker 5672 port and mark it as insecure (no SSL/TLS). | `true` | | `ui.public.broker.extra` | Extra metadata displayed. | `""` | -| `ui.public.database.extra` | Extra metadata displayed. | `128.130.0.0/15` | +| `ui.public.database.extra` | Extra metadata displayed. | `""` | | `ui.public.pid.default.publisher` | The default dataset publisher for persisted identifiers. | `Example University` | | `ui.public.doi.enabled` | Enable the display that DOIs are minted. | `false` | | `ui.public.doi.endpoint` | The DOI proxy. | `https://doi.org` | diff --git a/helm/dbrepo/charts/dbrepo-mariadb-galera-1.4.6.tgz b/helm/dbrepo/charts/dbrepo-mariadb-galera-1.4.6.tgz new file mode 100644 index 0000000000000000000000000000000000000000..6729ba0a6c32d47f6710c8e81915c8726f4c3bde Binary files /dev/null and b/helm/dbrepo/charts/dbrepo-mariadb-galera-1.4.6.tgz differ diff --git a/helm/dbrepo/charts/mariadb-14.1.4.tgz b/helm/dbrepo/charts/mariadb-14.1.4.tgz deleted file mode 100644 index 83f470bdcade4fdfc13b0d1f4f46095b877e3bcd..0000000000000000000000000000000000000000 Binary files a/helm/dbrepo/charts/mariadb-14.1.4.tgz and /dev/null differ diff --git a/helm/dbrepo/templates/auth-configmap.yaml b/helm/dbrepo/templates/auth-configmap.yaml index 269d18c99d7800101afc8ac1c3528104fad7243c..948b31e77d83cf289162f3dad5401b374f2e589a 100644 --- a/helm/dbrepo/templates/auth-configmap.yaml +++ b/helm/dbrepo/templates/auth-configmap.yaml @@ -540,7 +540,7 @@ data: "description" : "${default-container-handling}", "composite" : true, "composites" : { - "realm" : [ "find-container", "list-containers" ] + "realm" : [ "find-container" ] }, "clientRole" : false, "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", @@ -2153,7 +2153,7 @@ data: "subType" : "anonymous", "subComponents" : { }, "config" : { - "allowed-protocol-mapper-types" : [ "oidc-full-name-mapper", "saml-user-attribute-mapper", "saml-user-property-mapper", "saml-role-list-mapper", "oidc-usermodel-attribute-mapper", "oidc-usermodel-property-mapper", "oidc-address-mapper", "oidc-sha256-pairwise-sub-mapper" ] + "allowed-protocol-mapper-types" : [ "saml-user-attribute-mapper", "oidc-full-name-mapper", "oidc-sha256-pairwise-sub-mapper", "oidc-address-mapper", "saml-user-property-mapper", "oidc-usermodel-property-mapper", "oidc-usermodel-attribute-mapper", "saml-role-list-mapper" ] } }, { "id" : "1849e52a-b8c9-44a8-af3d-ee19376a1ed1", @@ -2179,7 +2179,7 @@ data: "subType" : "authenticated", "subComponents" : { }, "config" : { - "allowed-protocol-mapper-types" : [ "saml-user-property-mapper", "oidc-usermodel-property-mapper", "saml-role-list-mapper", "oidc-address-mapper", "saml-user-attribute-mapper", "oidc-full-name-mapper", "oidc-sha256-pairwise-sub-mapper", "oidc-usermodel-attribute-mapper" ] + "allowed-protocol-mapper-types" : [ "saml-role-list-mapper", "oidc-sha256-pairwise-sub-mapper", "oidc-full-name-mapper", "oidc-usermodel-property-mapper", "oidc-usermodel-attribute-mapper", "saml-user-property-mapper", "saml-user-attribute-mapper", "oidc-address-mapper" ] } } ], "org.keycloak.storage.UserStorageProvider" : [ { @@ -2195,8 +2195,8 @@ data: "config" : { "ldap.attribute" : [ "createTimestamp" ], "is.mandatory.in.ldap" : [ "false" ], - "always.read.value.from.ldap" : [ "true" ], "read.only" : [ "true" ], + "always.read.value.from.ldap" : [ "true" ], "user.model.attribute" : [ "createTimestamp" ] } }, { @@ -2219,8 +2219,8 @@ data: "config" : { "ldap.attribute" : [ "cn" ], "is.mandatory.in.ldap" : [ "true" ], - "read.only" : [ "false" ], "always.read.value.from.ldap" : [ "true" ], + "read.only" : [ "false" ], "user.model.attribute" : [ "firstName" ] } }, { @@ -2231,8 +2231,8 @@ data: "config" : { "ldap.attribute" : [ "mail" ], "is.mandatory.in.ldap" : [ "false" ], - "read.only" : [ "false" ], "always.read.value.from.ldap" : [ "false" ], + "read.only" : [ "false" ], "user.model.attribute" : [ "email" ] } }, { @@ -2245,13 +2245,13 @@ data: "group.name.ldap.attribute" : [ "cn" ], "preserve.group.inheritance" : [ "false" ], "membership.user.ldap.attribute" : [ "uid" ], - "groups.dn" : [ "ou=users,{{ .Values.identityservice.global.ldapDomain }}" ], + "groups.dn" : [ "ou=users,dc=dbrepo,dc=at" ], "mode" : [ "LDAP_ONLY" ], "user.roles.retrieve.strategy" : [ "LOAD_GROUPS_BY_MEMBER_ATTRIBUTE" ], - "membership.ldap.attribute" : [ "member" ], "ignore.missing.groups" : [ "false" ], - "group.object.classes" : [ "groupOfNames" ], + "membership.ldap.attribute" : [ "member" ], "memberof.ldap.attribute" : [ "memberOf" ], + "group.object.classes" : [ "groupOfNames" ], "groups.path" : [ "/" ], "drop.non.existing.groups.during.sync" : [ "false" ] } @@ -2263,8 +2263,8 @@ data: "config" : { "ldap.attribute" : [ "modifyTimestamp" ], "is.mandatory.in.ldap" : [ "false" ], - "always.read.value.from.ldap" : [ "true" ], "read.only" : [ "true" ], + "always.read.value.from.ldap" : [ "true" ], "user.model.attribute" : [ "modifyTimestamp" ] } }, { @@ -2277,15 +2277,15 @@ data: "is.mandatory.in.ldap" : [ "true" ], "attribute.force.default" : [ "false" ], "is.binary.attribute" : [ "false" ], - "always.read.value.from.ldap" : [ "false" ], "read.only" : [ "false" ], + "always.read.value.from.ldap" : [ "false" ], "user.model.attribute" : [ "username" ] } } ] }, "config" : { - "pagination" : [ "false" ], "fullSyncPeriod" : [ "-1" ], + "pagination" : [ "false" ], "startTls" : [ "false" ], "usersDn" : [ "ou=users,dc=dbrepo,dc=at" ], "connectionPooling" : [ "true" ], @@ -2293,14 +2293,14 @@ data: "useKerberosForPasswordAuthentication" : [ "false" ], "importEnabled" : [ "true" ], "enabled" : [ "true" ], + "bindDn" : [ "cn=admin,dc=dbrepo,dc=at" ], + "bindCredential" : [ "admin" ], "usernameLDAPAttribute" : [ "uid" ], - "bindCredential" : [ "{{ .Values.identityservice.global.adminPassword }}" ], - "bindDn" : [ "cn={{ .Values.identityservice.global.adminUser }},{{ .Values.identityservice.global.ldapDomain }}" ], "changedSyncPeriod" : [ "-1" ], "lastSync" : [ "1719252666" ], "vendor" : [ "other" ], "uuidLDAPAttribute" : [ "entryUUID" ], - "connectionUrl" : [ "ldap://identity-service:389" ], + "connectionUrl" : [ "ldap://identity-service:1389" ], "allowKerberosAuthentication" : [ "false" ], "syncRegistrations" : [ "true" ], "authType" : [ "simple" ], diff --git a/helm/dbrepo/values.schema.json b/helm/dbrepo/values.schema.json index 843f7e799100a7b8a5041c96b8914275326ea2b7..3e4c87a1ad78fe527c5321c03aec155f4df3c090 100644 --- a/helm/dbrepo/values.schema.json +++ b/helm/dbrepo/values.schema.json @@ -132,17 +132,6 @@ }, "authservice": { "properties": { - "auth": { - "properties": { - "adminPassword": { - "type": "string" - }, - "adminUser": { - "type": "string" - } - }, - "type": "object" - }, "client": { "properties": { "id": { @@ -445,217 +434,6 @@ }, "type": "object" }, - "primary": { - "properties": { - "extraVolumeMounts": { - "items": { - "properties": { - "mountPath": { - "type": "string" - }, - "name": { - "type": "string" - } - }, - "type": "object" - }, - "type": "array" - }, - "extraVolumes": { - "items": { - "properties": { - "emptyDir": { - "properties": {}, - "type": "object" - }, - "name": { - "type": "string" - } - }, - "type": "object" - }, - "type": "array" - }, - "persistence": { - "properties": { - "enabled": { - "type": "boolean" - } - }, - "type": "object" - }, - "service": { - "properties": { - "extraPorts": { - "items": { - "properties": { - "name": { - "type": "string" - }, - "port": { - "type": "integer" - }, - "protocol": { - "type": "string" - }, - "targetPort": { - "type": "integer" - } - }, - "type": "object" - }, - "type": "array" - } - }, - "type": "object" - }, - "sidecars": { - "items": { - "properties": { - "envFrom": { - "items": { - "properties": { - "secretRef": { - "properties": { - "name": { - "type": "string" - } - }, - "type": "object" - } - }, - "type": "object" - }, - "type": "array" - }, - "image": { - "type": "string" - }, - "imagePullPolicy": { - "type": "string" - }, - "livenessProbe": { - "properties": { - "exec": { - "properties": { - "command": { - "items": { - "type": "string" - }, - "type": "array" - } - }, - "type": "object" - }, - "initialDelaySeconds": { - "type": "integer" - }, - "periodSeconds": { - "type": "integer" - } - }, - "type": "object" - }, - "name": { - "type": "string" - }, - "ports": { - "items": { - "properties": { - "containerPort": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "protocol": { - "type": "string" - } - }, - "type": "object" - }, - "type": "array" - }, - "readinessProbe": { - "properties": { - "exec": { - "properties": { - "command": { - "items": { - "type": "string" - }, - "type": "array" - } - }, - "type": "object" - }, - "initialDelaySeconds": { - "type": "integer" - }, - "periodSeconds": { - "type": "integer" - } - }, - "type": "object" - }, - "securityContext": { - "properties": { - "allowPrivilegeEscalation": { - "type": "boolean" - }, - "capabilities": { - "properties": { - "drop": { - "items": { - "type": "string" - }, - "type": "array" - } - }, - "type": "object" - }, - "runAsGroup": { - "type": "integer" - }, - "runAsNonRoot": { - "type": "boolean" - }, - "runAsUser": { - "type": "integer" - }, - "seccompProfile": { - "properties": { - "type": { - "type": "string" - } - }, - "type": "object" - } - }, - "type": "object" - }, - "volumeMounts": { - "items": { - "properties": { - "mountPath": { - "type": "string" - }, - "name": { - "type": "string" - } - }, - "type": "object" - }, - "type": "array" - } - }, - "type": "object" - }, - "type": "array" - } - }, - "type": "object" - }, "secondary": { "properties": { "replicaCount": { @@ -1042,6 +820,10 @@ "enabled": { "type": "boolean" }, + "extraInitDbScripts": { + "properties": {}, + "type": "object" + }, "fullnameOverride": { "type": "string" }, @@ -1064,10 +846,6 @@ "host": { "type": "string" }, - "initdbScripts": { - "properties": {}, - "type": "object" - }, "initdbScriptsConfigMap": { "type": "string" }, @@ -1333,12 +1111,6 @@ }, "security": { "properties": { - "adminPassword": { - "type": "string" - }, - "adminUsername": { - "type": "string" - }, "enabled": { "type": "boolean" } @@ -1517,6 +1289,14 @@ }, "mariadb": { "properties": { + "auth": { + "properties": { + "rootPassword": { + "type": "string" + } + }, + "type": "object" + }, "enabled": { "type": "boolean" }, diff --git a/helm/dbrepo/values.yaml b/helm/dbrepo/values.yaml index af810436af63b6ca3b87a08c767a28959852ec35..ad50a24f0fea69b98addca6c5ba1535ec46a4e55 100644 --- a/helm/dbrepo/values.yaml +++ b/helm/dbrepo/values.yaml @@ -141,62 +141,6 @@ datadb: metrics: ## @skip datadb.metrics.enabled enabled: true - ## @skip datadb.primary - primary: - service: - extraPorts: - - name: "sidecar" - port: 8080 - targetPort: 8080 - protocol: TCP - sidecars: - - name: sidecar - image: registry.datalab.tuwien.ac.at/dbrepo/data-db-sidecar:1.4.5 - imagePullPolicy: Always - securityContext: - runAsUser: 1001 - runAsGroup: 0 - runAsNonRoot: true - allowPrivilegeEscalation: false - seccompProfile: - type: RuntimeDefault - capabilities: - drop: - - ALL - ports: - - name: "sidecar" - containerPort: 8080 - protocol: TCP - envFrom: - - secretRef: - name: data-service-secret - livenessProbe: - exec: - command: - - /bin/bash - - -ec - - "curl -sSL localhost:8080/health | grep 'UP' || exit 1" - initialDelaySeconds: 120 - periodSeconds: 30 - readinessProbe: - exec: - command: - - /bin/bash - - -ec - - "curl -sSL localhost:8080/health | grep 'UP' || exit 1" - initialDelaySeconds: 30 - periodSeconds: 30 - volumeMounts: - - name: s3 - mountPath: /s3 - extraVolumeMounts: - - name: s3 - mountPath: /s3 - extraVolumes: - - name: s3 - emptyDir: { } - persistence: - enabled: true ## @skip datadb.secondary secondary: replicaCount: 2 @@ -335,7 +279,7 @@ analyseservice: enabled: true image: ## @skip analyseservice.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.4.5 + name: registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.4.6 ## @skip analyseservice.image.pullPolicy pullPolicy: Always ## @param analyseservice.image.debug Set the logging level to `trace`. Otherwise, set to `info`. @@ -397,7 +341,7 @@ metadataservice: enabled: true image: ## @skip metadataservice.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.4.5 + name: registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.4.6 ## @skip metadataservice.image.pullPolicy pullPolicy: Always ## @param metadataservice.image.debug Set the logging level to `trace`. Otherwise, set to `info`. @@ -496,7 +440,7 @@ dataservice: endpoint: http://data-service image: ## @skip dataservice.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/data-service:1.4.5 + name: registry.datalab.tuwien.ac.at/dbrepo/data-service:1.4.6 ## @skip dataservice.image.pullPolicy pullPolicy: Always ## @param dataservice.image.debug Set the logging level to `trace`. Otherwise, set to `info`. @@ -583,7 +527,7 @@ searchservice: endpoint: http://search-service image: ## @skip searchservice.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/search-service:1.4.5 + name: registry.datalab.tuwien.ac.at/dbrepo/search-service:1.4.6 ## @skip searchservice.image.pullPolicy pullPolicy: Always ## @param searchservice.image.debug Set the logging level to `trace`. Otherwise, set to `info`. @@ -632,7 +576,7 @@ searchservice: ## @skip searchservice.init init: image: - name: registry.datalab.tuwien.ac.at/dbrepo/search-service-init:1.4.5 + name: registry.datalab.tuwien.ac.at/dbrepo/search-service-init:1.4.6 pullPolicy: Always ## @param searchservice.replicaCount The number of replicas. replicaCount: 2 @@ -649,6 +593,9 @@ storageservice: fullnameOverride: storage-service-db ## @skip storageservice.mariadb.enabled enabled: true + auth: + ## @param storageservice.mariadb.auth.rootPassword The user password for the root user. + rootPassword: seaweedfsdb master: ## @skip storageservice.master.enabled enabled: true @@ -674,7 +621,7 @@ storageservice: adminSecretAccessKey: seaweedfsadmin ## @skip storageservice.init init: - image: registry.datalab.tuwien.ac.at/dbrepo/storage-service-init:1.4.5 + image: registry.datalab.tuwien.ac.at/dbrepo/storage-service-init:1.4.6 pullPolicy: Always ## @section Identity Service @@ -737,7 +684,7 @@ ui: enabled: true image: ## @skip ui.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/ui:1.4.5 + name: registry.datalab.tuwien.ac.at/dbrepo/ui:1.4.6 ## @skip ui.image.pullPolicy pullPolicy: Always ## @param ui.image.debug Set the logging level to `trace`. Otherwise, set to `info`. diff --git a/install.sh b/install.sh index 5e367f4d53fefc633fb3131dad7360569ea971ac..aec9f270bc4b7d2311b93371973dc05aa33ba51c 100644 --- a/install.sh +++ b/install.sh @@ -1,7 +1,7 @@ #!/bin/bash # preset -VERSION="1.4.5" +VERSION="1.4.6" MIN_CPU=8 MIN_RAM=8 MIN_MAP_COUNT=262144 diff --git a/lib/python/README.md b/lib/python/README.md index 96166554a7f5cf5a1c3cb1d3fa76650f970eb8bf..d3db052010c3088ee203159f840c01cee6041cff 100644 --- a/lib/python/README.md +++ b/lib/python/README.md @@ -48,17 +48,17 @@ client.import_table_data(database_id=7, table_id=13, file_name_or_data_frame=df) ## Supported Features & Best-Practices - Manage user - account ([docs](https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.4.5/api/#create-user-account)) + account ([docs](https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.4.6/api/#create-user-account)) - Manage databases ([docs](https://www.ifs.tuwien.ac.at/infrastructures/dbrepo//usage-overview/#create-database)) - Manage database access & - visibility ([docs](https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.4.5/api/#create-database)) + visibility ([docs](https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.4.6/api/#create-database)) - Import - dataset ([docs](https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.4.5/api/#import-dataset)) + dataset ([docs](https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.4.6/api/#import-dataset)) - Create persistent - identifiers ([docs](https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.4.5/api/#assign-database-pid)) + identifiers ([docs](https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.4.6/api/#assign-database-pid)) - Execute - queries ([docs](https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.4.5/api/#export-subset)) + queries ([docs](https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.4.6/api/#export-subset)) - Get data from tables/views/subsets ## Configure diff --git a/lib/python/dbrepo/AmqpClient.py b/lib/python/dbrepo/AmqpClient.py index 1cc0e0319c03e46935a5ea9a21a963b609242726..27f7fc4f0fd702e7f40135102f844bb8108971d2 100644 --- a/lib/python/dbrepo/AmqpClient.py +++ b/lib/python/dbrepo/AmqpClient.py @@ -1,13 +1,11 @@ -import dataclasses import os import pika import sys import json import logging -from dbrepo.api.dto import CreateData - -logger = logging.getLogger("AmqpClient") +logging.basicConfig(format='%(asctime)s %(name)-12s %(levelname)-6s %(message)s', level=logging.INFO, + stream=sys.stdout) class AmqpClient: @@ -34,8 +32,6 @@ class AmqpClient: broker_virtual_host: str = '/', username: str = None, password: str = None) -> None: - logging.basicConfig(format='%(asctime)s %(name)-12s %(levelname)-6s %(message)s', level=logging.DEBUG, - stream=sys.stdout) self.broker_host = os.environ.get('AMQP_API_HOST', broker_host) self.broker_port = os.environ.get('AMQP_API_PORT', broker_port) if os.environ.get('AMQP_API_VIRTUAL_HOST') is not None: @@ -59,6 +55,5 @@ class AmqpClient: self.password)) connection = pika.BlockingConnection(parameters) channel = connection.channel() - channel.basic_publish(exchange=exchange, routing_key=routing_key, - body=json.dumps(data)) + channel.basic_publish(exchange=exchange, routing_key=routing_key, body=json.dumps(data)) connection.close() diff --git a/lib/python/dbrepo/RestClient.py b/lib/python/dbrepo/RestClient.py index 6be85146a97763e32b95a6272c9758dff46d4d77..38f18bd84cf52545c81701ede97e2cda5ca9f230 100644 --- a/lib/python/dbrepo/RestClient.py +++ b/lib/python/dbrepo/RestClient.py @@ -14,7 +14,8 @@ from dbrepo.api.exceptions import ResponseCodeError, UsernameExistsError, EmailE ForbiddenError, MalformedError, NameExistsError, QueryStoreError, ExternalSystemError, \ AuthenticationError, UploadError, FormatNotAvailable, RequestError, ServiceError, ServiceConnectionError -logger = logging.getLogger("RestClient") +logging.basicConfig(format='%(asctime)s %(name)-12s %(levelname)-6s %(message)s', level=logging.INFO, + stream=sys.stdout) class RestClient: @@ -39,8 +40,6 @@ class RestClient: username: str = None, password: str = None, secure: bool = True) -> None: - logging.basicConfig(format='%(asctime)s %(name)-12s %(levelname)-6s %(message)s', level=logging.DEBUG, - stream=sys.stdout) self.endpoint = os.environ.get('REST_API_ENDPOINT', endpoint) self.username = os.environ.get('REST_API_USERNAME', username) self.password = os.environ.get('REST_API_PASSWORD', password) @@ -48,7 +47,7 @@ class RestClient: self.secure = os.environ.get('REST_API_SECURE') == 'True' else: self.secure = secure - logger.debug( + logging.debug( f'initialized rest client with endpoint={self.endpoint}, username={username}, verify_ssl={secure}') def _wrapper(self, method: str, url: str, params: [(str,)] = None, payload=None, headers: dict = None, @@ -56,27 +55,27 @@ class RestClient: if force_auth and (self.username is None and self.password is None): raise AuthenticationError(f"Failed to perform request: authentication required") url = f'{self.endpoint}{url}' - logger.debug(f'method: {method}') - logger.debug(f'url: {url}') + logging.debug(f'method: {method}') + logging.debug(f'url: {url}') if params is not None: - logger.debug(f'params: {params}') + logging.debug(f'params: {params}') if stream is not None: - logger.debug(f'stream: {stream}') - logger.debug(f'secure: {self.secure}') + logging.debug(f'stream: {stream}') + logging.debug(f'secure: {self.secure}') if headers is not None: - logger.debug(f'headers: {headers}') + logging.debug(f'headers: {headers}') else: headers = dict() - logger.debug(f'no headers set') + logging.debug(f'no headers set') if payload is not None: payload = payload.model_dump() auth = None if self.username is None and self.password is not None: headers["Authorization"] = f"Bearer {self.password}" - logger.debug(f'configured for oidc/bearer auth') + logging.debug(f'configured for oidc/bearer auth') elif self.username is not None and self.password is not None: auth = (self.username, self.password) - logger.debug(f'configured for basic auth: username={self.username}, password=(hidden)') + logging.debug(f'configured for basic auth: username={self.username}, password=(hidden)') return requests.request(method=method, url=url, auth=auth, verify=self.secure, json=payload, headers=headers, params=params, stream=stream) @@ -1556,7 +1555,7 @@ class RestClient: f'201 (CREATED): {response.text}') def create_subset(self, database_id: int, query: str, page: int = 0, size: int = 10, - df: bool = False) -> Result | DataFrame: + timestamp: datetime.datetime = None, df: bool = False) -> Result | DataFrame: """ Executes a SQL query in a database where the current user has at least read access with given database id. The result set can be paginated with setting page and size (both). Historic data can be queried by setting @@ -1566,6 +1565,7 @@ class RestClient: :param query: The query statement. :param page: The result pagination number. Optional. Default: 0. :param size: The result pagination size. Optional. Default: 10. + :param timestamp: The timestamp at which the data validity is set. Optional. Default: <current timestamp>. :param df: If true, the result is returned as Pandas DataFrame. Optional. Default: False. :returns: The result set, if successful. @@ -1581,7 +1581,12 @@ class RestClient: url = f'/api/database/{database_id}/subset' if page is not None and size is not None: url += f'?page={page}&size={size}' - response = self._wrapper(method="post", url=url, force_auth=True, headers={"Accept": "application/json"}, + if timestamp is not None: + url += f'×tamp={timestamp.strftime("%Y-%m-%dT%H:%M:%SZ")}' + else: + if timestamp is not None: + url += f'?timestamp={timestamp.strftime("%Y-%m-%dT%H:%M:%SZ")}' + response = self._wrapper(method="post", url=url, headers={"Accept": "application/json"}, payload=ExecuteQuery(statement=query)) if response.status_code == 201: body = response.json() diff --git a/lib/python/dbrepo/UploadClient.py b/lib/python/dbrepo/UploadClient.py index 05fa133d64b2be902deb81423fef9bdc07e8c66d..1c0b8cf88a3af9b64a47e37d510da6b0a4877d6d 100644 --- a/lib/python/dbrepo/UploadClient.py +++ b/lib/python/dbrepo/UploadClient.py @@ -4,7 +4,8 @@ import re import sys from tusclient import client -logger = logging.getLogger("UploadClient") +logging.basicConfig(format='%(asctime)s %(name)-12s %(levelname)-6s %(message)s', level=logging.INFO, + stream=sys.stdout) class UploadClient: @@ -18,8 +19,6 @@ class UploadClient: endpoint: str = None def __init__(self, endpoint: str = 'http://gateway-service/api/upload/files') -> None: - logging.basicConfig(format='%(asctime)s %(name)-12s %(levelname)-6s %(message)s', level=logging.DEBUG, - stream=sys.stdout) self.endpoint = os.environ.get('REST_UPLOAD_ENDPOINT', endpoint) def upload(self, file_path: str) -> str: @@ -35,5 +34,5 @@ class UploadClient: uploader.upload() m = re.search('\\/([a-f0-9]+)\\+', uploader.url) filename = m.group(0)[1:-1] - logger.debug(f'uploaded file {file_path} to storage service with key: {filename}') + logging.info(f'Uploaded file {file_path} to storage service with key: {filename}') return filename diff --git a/lib/python/docs/index.rst b/lib/python/docs/index.rst index 688a62683170012b263ffc1df234c881323ab9fb..6348ed12d3f7de6514621cf6e9add754204690fc 100644 --- a/lib/python/docs/index.rst +++ b/lib/python/docs/index.rst @@ -12,7 +12,7 @@ Quickstart ---------- Find numerous quickstart examples on -the `DBRepo website <https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.4.5/api/>`_. +the `DBRepo website <https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.4.6/api/>`_. AMQP API Client ----------- diff --git a/lib/python/setup.py b/lib/python/setup.py index 34c44d115b6169e64f356b8d9593a65b59ab2bb1..b92f73d34f8384aa9bc5bcac4ef5387f9261fa0e 100644 --- a/lib/python/setup.py +++ b/lib/python/setup.py @@ -4,7 +4,7 @@ from distutils.core import setup setup(name="dbrepo", version="1.4.6", description="A library for communicating with DBRepo", - url="https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.4.5/", + url="https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.4.6/", author="Martin Weise", license="Apache-2.0", author_email="martin.weise@tuwien.ac.at", diff --git a/lib/python/tests/test_unit_query.py b/lib/python/tests/test_unit_query.py index d2de6f8278bc33a123cf38525493ec93532ce87a..e1b326fa576b86519e6c059abd73f66dacbda2e5 100644 --- a/lib/python/tests/test_unit_query.py +++ b/lib/python/tests/test_unit_query.py @@ -1,6 +1,4 @@ import unittest -from json import dumps -from typing import Any import requests_mock import datetime @@ -64,16 +62,19 @@ class QueryUnitTest(unittest.TestCase): except NotExistsError: pass - def test_create_subset_not_auth_fails(self): + def test_create_subset_not_auth_succeeds(self): with requests_mock.Mocker() as mock: + exp = Result(result=[{'id': 1, 'username': 'foo'}, {'id': 2, 'username': 'bar'}], + headers=[{'id': 0, 'username': 1}], + id=None) # mock - mock.post('/api/database/1/subset', status_code=417) + mock.post('/api/database/1/subset', json=exp.model_dump(), status_code=201) # test - try: - response = RestClient().create_subset(database_id=1, - query="SELECT id, username FROM some_table WHERE id IN (1,2)") - except AuthenticationError: - pass + + client = RestClient() + response = client.create_subset(database_id=1, page=0, size=10, + query="SELECT id, username FROM some_table WHERE id IN (1,2)") + self.assertEqual(exp, response) def test_find_query_succeeds(self): with requests_mock.Mocker() as mock: diff --git a/make/build.mk b/make/build.mk index c2851c3a74e3fd8f56d175061f78a6cff0e8fb47..861226251224ec7432d77d9bb1b7fa9fb33d0fe9 100644 --- a/make/build.mk +++ b/make/build.mk @@ -22,7 +22,18 @@ build-ui: ## Build the UI. build-lib: ## Build the Python Library. python3 -m build --sdist ./lib/python python3 -m build --wheel ./lib/python + cp ./lib/python/dist/dbrepo-${APP_VERSION}.tar.gz ./dbrepo-analyse-service/lib/dbrepo-${APP_VERSION}.tar.gz + (cd ./dbrepo-analyse-service && PIPENV_IGNORE_VIRTUALENVS=1 pipenv install) + cp ./lib/python/dist/dbrepo-${APP_VERSION}.tar.gz ./dbrepo-search-service/lib/dbrepo-${APP_VERSION}.tar.gz + (cd ./dbrepo-search-service && PIPENV_IGNORE_VIRTUALENVS=1 pipenv install) + cp ./lib/python/dist/dbrepo-${APP_VERSION}.tar.gz ./dbrepo-search-service/init/lib/dbrepo-${APP_VERSION}.tar.gz + (cd ./dbrepo-search-service/init && PIPENV_IGNORE_VIRTUALENVS=1 pipenv install) .PHONY: build-helm -build-helm: ## Build the Helm Chart. +build-helm: ## Build the DBRepo and DBRepo MariaDB Galera Helm Charts. + ./.scripts/check-helm.sh + helm package ./helm/dbrepo-mariadb-galera --destination ./build + helm schema -input ./helm/dbrepo-mariadb-galera/values.yaml -output ./helm/dbrepo-mariadb-galera/values.schema.json + helm dependency update ./helm/dbrepo helm package ./helm/dbrepo --destination ./build + helm schema -input ./helm/dbrepo/values.yaml -output ./helm/dbrepo/values.schema.json diff --git a/make/gen.mk b/make/gen.mk index b81d504213bdee6cae172d1edfc18db82f2ef65a..322bc6625941b33eb72912212f3034e6cf259dd4 100644 --- a/make/gen.mk +++ b/make/gen.mk @@ -9,7 +9,6 @@ gen-swagger-doc: build-images ## Generate Swagger documentation and fetch. .PHONY: gen-helm-doc gen-helm-doc: build-helm ## Generate Helm documentation and schema - helm schema -input ./helm/dbrepo/values.yaml -output ./helm/dbrepo/values.schema.json readme-generator-for-helm --readme ./helm/dbrepo/README.md --values ./helm/dbrepo/values.yaml .PHONY: gen-dbrepo-doc diff --git a/make/rel.mk b/make/rel.mk index 97aeca4e161ada3786dab0b3ecfca1fc2c3c5a62..1f8b5a1cc56c5d6fe7164ebfa4c9007363a4ddbc 100644 --- a/make/rel.mk +++ b/make/rel.mk @@ -25,3 +25,8 @@ release-images: tag-images ## Release the docker images. docker push "${REPOSITORY_URL}/search-service:${APP_VERSION}" docker push "${REPOSITORY_URL}/search-service-init:${APP_VERSION}" docker push "${REPOSITORY_URL}/storage-service-init:${APP_VERSION}" + +.PHONY: release-helm +release-helm: gen-helm-doc ## Release the DBRepo and DBRepo MariaDB Galera Helm charts. + helm push ./build/dbrepo-${CHART_VERSION}.tgz oci://registry.datalab.tuwien.ac.at/dbrepo/dbrepo/helm + helm push ./build/dbrepo-mariadb-galera-${CHART_VERSION}.tgz oci://registry.datalab.tuwien.ac.at/dbrepo/dbrepo/helm \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index 5285953568a544a7589bb091e82c13138f6b84cb..b2314f2cf019d791d10d81e3891b6efbeb75ee50 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,5 +1,5 @@ site_name: Database Repository -site_url: https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.4.5/ +site_url: https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.4.6/ repo_url: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services repo_name: fda-services site_author: Research Unit Data Science, Technische Universität Wien @@ -118,7 +118,7 @@ markdown_extensions: extra: homepage: https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/ version: - default: 1.4.3 + default: 1.4.6 provider: mike social: - icon: simple/artifacthub diff --git a/versions.json b/versions.json index b17c2c59962f34c3f0fc4693ae0c6088212f6eb6..dc4adc279a0ddb9514930e5087fc04a3cf31b8da 100644 --- a/versions.json +++ b/versions.json @@ -1,8 +1,13 @@ [ + { + "version": "1.4.6", + "title": "1.4.6", + "aliases": ["latest"] + }, { "version": "1.4.5", "title": "1.4.5", - "aliases": ["latest"] + "aliases": [] }, { "version": "1.4.4",